- A world you can walk around in, right in your browser. It keeps running after you log off.
- Sign in with Discord, or jump straight in as a guest without making an account.
- Fight monsters, take what they drop, and level up.
- Zones built with an in-game editor
- Chat to people, party up with them, and travel from the world map.
What works, what is next, and what is honestly broken
Lumoria is built by one person. This page is an honest account of where the game stands, and it is updated every time something new goes live.
Three honest columns
- The seven orders. Pick a god at level 10 and their whole class tree opens up to you.
- Artwork for every class is finished and is being added to the game.
- Oath quests at each order’s hall in town
- The bestiary families and named bosses
- The Emberforge crafting system
- Balance. Every number in the game is a placeholder right now, and all of them will move.
- Second Oath fusions for late-game characters
- Any kind of player-versus-player fighting
- Phones. It runs on them, but it is not designed for them yet.
- Real music, and sound effects worth turning up
Under the hoodevery system already built, with the code file that proves it
One server runs the whole world, measures its own speed, and only sends you what is happening near you.
| System | What it does | Where it lives |
|---|---|---|
| Authoritative simulation | The server owns the world. Movement, combat and loot all resolve there, so nothing is decided by your client and nothing is decided by trust. | server/src/WorldRoom.ts |
| Area-of-interest networking | You are only sent entities relevant to where you are standing. It is the difference between a town that holds people and a town that stutters. | server/src/aoi-relevance.ts · aoi-view.ts · spatial/SpatialGrid.ts |
| Interpolation buffering | Other players arrive on a short delay and are drawn along the path they took, so movement is smooth instead of teleporting. | client/src/game/InterpolationBuffer.ts |
| Tick profiling | Every server tick is measured. When something gets slow there is a number saying which part. | server/src/TickProfiler.ts |
| Seeded procedural dungeons | Dungeon layouts generate from a seeded stream, so a run can be reproduced exactly, which is what makes them debuggable instead of mysterious. | server/src/procgen/dungeon.ts · rng-streams.ts |
| Instanced stages and boss rooms | Stage rooms and boss encounters run as their own instances with their own lifecycle. | server/src/rooms/StageRoom.ts · BossEncounter.ts |
| Postgres persistence with migrations | Characters, equipment instances, stages and souls all persist, with a migration path and a proof-of-save test. | server/src/db.ts · migrate.ts · prove-save-migration-postgres.ts |
Cast bars, swings that wind up, hits that land on time, and a camera that reacts.
| System | What it does | Where it lives |
|---|---|---|
| Cast-time combat | Skills have cast time and a cast bar. Movement, interruption and latency are all handled explicitly rather than hidden. | shared/src/combat-cast.ts · client/src/game/CombatCastController.ts |
| Swing anticipation and impact sync | The animation leads the hit and the impact lands on the frame it should, so a swing feels connected rather than approximate. | client/src/game/BasicSwingAnticipation.ts · attackImpactSync.ts |
| Combat feel | Hit pause, camera kick, and feedback presentation are separate tunable systems, not side effects. | client/src/game/combatFeel.ts · combatCameraKick.ts · CombatFeedbackPresenter.ts |
| Status effects and elements | A real status-effect layer and an elemental table underneath the numbers. | content/status-effects · shared/src/elements.ts |
| Monster mechanics | Monsters carry authored mechanics packages rather than a single attack loop. | content/monster-mechanics · server/src/monster-content-runtime.ts |
| Kill chains and rewards | Credit, experience and reward presentation resolve through their own path so group play pays correctly. | shared/src/kill-chain.ts · server/src/monster-xp.ts |
Every item is its own object, with set bonuses, extra stats and upgrades, the parts an MMO lives or dies on.
| System | What it does | Where it lives |
|---|---|---|
| Equipment instances | Items are instances with their own state and their own persistence, not stack counts. That is what makes an individual piece yours. | server/src/equipment-instance-runtime.ts · equipment-instance-persistence.ts |
| Stat scaling | Gear scales through a real stat pipeline rather than flat numbers stapled to a name. | server/src/equipment-stat-scaling.ts · shared/src/attributes.ts |
| Affixes and item budget | Ten affix families, and an item budget system so a piece cannot quietly out-scale its tier. | content/affixes · shared/src/item-budget.ts · server/src/item-budget-outcomes.ts |
| Item sets and bonuses | Eight authored sets with real set bonuses. | content/item-sets · shared/src/item-set-bonuses.ts |
| Enhancement | Push a weapon one level higher. It can fail, and at the top end it can break, so the odds are shown before you commit. | server/src/systems/EnhancementSystem.ts |
| Crafting and recipes | A crafting system with authored recipes behind it. | server/src/systems/CraftingSystem.ts · content/recipes |
| Class advancement | The class tree is code, not a diagram: advancement and progression are separate services with their own rules. | server/src/class-advancement.ts · class-progression.ts |
| Professions | Mining levels on its own track alongside your class, so time in a mine is never time away from progress. | server/src/profession-progression.ts |
| Essences | An essence layer for character customisation beyond gear. | server/src/essences.ts · content/essences |
Collections, deeds, hunts, leaderboards, monster souls.
| System | What it does | Where it lives |
|---|---|---|
| MVP bosses | Four named world bosses on real respawn windows, the kind you camp, race for, and lose. Coralsting Cactuscorpion, Pearlthrone Clamdragon, Sevenhorn Waywarden, Starcap Triune. | server/src/mvp-respawn-policy.ts · content/monsters/monster_mvp_*.json |
| Collections | Thirty collection cards across seven sets, with their own drop-rate system. | server/src/systems/CollectionSystem.ts · collection-drop-rate.ts · content/collection-cards |
| Monster souls | Some monsters leave a soul behind. Socket it and it pays a stat, so the bestiary is something you fill, not just read. | server/src/monster-soul-catalog.ts · monster-soul-persistence.ts |
| Deeds | Achievements with their own system and their own storage. | server/src/deeds.ts · systems/DeedSystem.ts |
| The hunt board | Fourteen hunts on a board. Take one, run it in an evening, get paid in Oathtokens and spend them at the hunt shop. | server/src/systems/HuntBoardSystem.ts · hunt-week-ledger.ts · HuntShopSystem.ts |
| Leaderboards and lifetime stats | Two boards, fastest stage clear and the level race, plus a lifetime tally for your character. | server/src/systems/LeaderboardService.ts · lifetime-stats.ts |
| Loot | Forty-two loot tables and a projection system so drops can be reasoned about before they ship. | server/src/systems/LootSystem.ts · shared/src/loot-projection.ts |
| Chests and interactables | Chests worth opening, and objects worth walking over to: levers, shrines, and the things a quest sends you to touch. | server/src/systems/ChestSystem.ts · InteractableSystem.ts |
Parties, chat, travel, a day/night clock, and events on a schedule.
| System | What it does | Where it lives |
|---|---|---|
| Parties with ready checks | Party chat and a ready-check flow, because the coordination is the content. | server/src/party-chat-hub.ts · party-ready-check.ts |
| Chat | Global chat, party chat and whispers, all through the server. | server/src/chat.ts |
| World map and travel | Thirteen maps joined by eleven portals, and a world map you travel from, so you are never walking the whole way back. | server/src/world-map-travel-policy.ts · content/maps · content/portals |
| Day and night | The sun goes round every sixteen minutes and it rains sometimes. Same sky for everyone on the server. | client/src/hud/DayNightClock.ts · server/src/world-environment.ts |
| Scheduled events | Five events with a scheduler and a calendar, so the world has dates in it. | server/src/systems/EventScheduler.ts · EventService.ts · visit-calendar.ts |
| Quests and dialogue | Fifty-two quests and twenty NPCs, driven by a dialogue service. | server/src/systems/DialogueService.ts · content/quests · content/npcs |
| Send another player a letter with coin or items attached. They collect it next time they log in. | server/src/systems/MailService.ts | |
| Guided first hour | A prologue, a tutorial system, coach marks and a first-hour guide, the part most solo projects skip. | server/src/systems/IntroTutorialSystem.ts · client/src/hud/firstHourGuide.ts · coachMarks.ts |
The tools around the game, which is the part that makes one person able to make an MMO at all.
| System | What it does | Where it lives |
|---|---|---|
| An in-game zone editor | Zones are laid out inside the running game, place, collide, undo, batch, apply, with durable history. Not config files. | client/src/editor/EmbeddedEditorController.ts and 15 sibling modules |
| GM commands and a bot harness | A GM command service plus an orchestrator that drives bots through the world to find bugs. | server/src/gm-commands.ts · systems/GmBotOrchestrator.ts |
| In-game bug reporting | Players report bugs from inside the game and the reports are stored server-side. | server/src/bug-report.ts · bug-report-storage.ts |
| Headless capture | The game renders zones headlessly, so the way it looks can be reviewed without a human opening it. | pnpm capture:zone |
| An asset pipeline | An asset bank with semantic metadata, promotion gates and automated checks over every image that ships. | content/asset-bank · content/asset-semantic-metadata.json |
| 277 build and check scripts | Validation, fixtures, audits and proofs, run as one battery. | package.json |
The order of arrivalthe order the seven arrive in
Launch is the seven Lv 10 lines. Branch jobs land per order, in updates, in this sequence. The seven annual festivals (Oathstone Day, Naming Nights, the Overgrowth Fair, First Flame, the Quiet Feast, Sparkfair, Packmoot) are the recurring layer over the top of it. The whole spine is seven trees and roughly 450 to 550 beats: a multi-year build, said out loud.
- the Wallsworn: Aegemar builds walls to shelter what is inside them, and stands outside all of them.
- the Dawnflame: Aurelith is the dawn that was never allowed to end.
- the Emberforge: Ignivar says every mortal talent is one of his escaped sparks.
- the Wildhunt: Sylvara hunts a wild that obeys nobody, herself included.
- the Starspire: Caelendra wrote the world in one night of falling stars and has regretted exactly one word of it since.
- the Packsworn: Fenriel the Packmother gives the bond between a soul and a wild thing.
- the Moonveil: Vesperine offers quiet endings and keeps the name the others struck.
What changed, and why
All seven class trees now have their art
Every class in all seven trees is drawn now. Each tree is one girl and one boy who keep the same face the whole way up, so climbing into your next class gets you new armour, not a new person.
Read the entry →The gods got rebuilt from scratch
Eight gods, one sealed. Seven orders, one class tree each, Ragnarok-style branching. The old pantheon was too generic to keep.
Read the entry →Tanks could not taunt until level 70
A balance pass found that no class had a taunt below level 70 — the tank could not hold anything off the healer. Five classes gained real threat tools.
Read the entry →The world editor got good enough to build with
Zones are now laid out in-game rather than in config files. Seamless ground, vector roads, and props placed by hand.
Read the entry →