The pin moves from 6890a74 (1.17.0) to 69998ec (1.19.0, website#224), past 1.18.0 (website#223). Both are the public demo (DEMO_MODE.md §10 step 3). The chapters were read again for both versions: - Chapter 2: a new section on a public demo site, covering demoLocks in module.json, ctx.demoMode and api.onDemoSeed (1.18.0). The call count becomes twenty. - Chapter 5: a paragraph on an event action's demoRefuses (1.19.0), and a line in the action listing. The one other core change in the window (website#221) is a wording fix on core's Teams panel and nothing a module sees. The template declares none of the new members, so template/module.json's coreApi becomes ^1.19.0 for the equality check only. Checks run at the new pin: - checkCoreApi, links, rename sites and chapter paths all pass, and so do the script tests (10 and 11). - The template's imports, build, externals and swagger checks pass. - Tests pass: server 82, client 20. - The template was loaded as `examplegame` into a real core at this ref through core's own loader, with DEMO_MODE unset and with it true, and it registered both times. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
The book
Five chapters, in the order the work happens. The first four are the job; the fifth is optional and comes after you have one.
Read the dry run before any of them — a complete module designed on paper for a second game, and the shortest honest picture of the whole job.
| # | Chapter | What it covers |
|---|---|---|
| 1 | Your first module in twenty minutes | Copy the template, rename it, build it, install it, see a page. No theory. |
| 2 | The website module | The bulk of the work: module.json, register(ctx, api), the schema fragment, the client chunk, packaging, and what a module must never do. |
| 3 | The sidecar | Why the website never talks to a game server, what "persist before you forward" means, and what a thin sidecar is. |
| 4 | The game-side plugin | The least code and the highest stakes: never block the game thread. |
| 5 | Making your module event-capable | Optional, and the first thing here that can do damage: letting a scheduled event on the website change your live world, and get it back. |
Chapters 1, 2 and 5 quote template/, which CI builds against a pinned core, so
their code is a tree that is proved rather than prose that looks like one. Chapters
3 and 4 cite uo-link and servuo-plugins by file and identifier rather than by
line, on purpose: those repositories move for their own reasons and a line number in
a book is wrong the moment they do.
Chapter 5 is the one you can stop before. Chapters 1 to 4 get a game onto the platform and everything in them moves one way — out of the game and onto a page. Chapter 5 is the other direction, and a deployment that never reads it still has a working event engine over core's own verbs. Chapters 3 and 4 each carry one section that only matters if you are going there (§2a and "A command that changes the world runs at most once"); both say so at the top.
What is normative, and what is here
Nothing in these chapters is. Where a chapter and one of these disagree, the document is right and the chapter has a bug — say so:
| Authority | For |
|---|---|
MODULE_API.md |
Everything a module may do. |
MODULE_SYSTEM.md |
Why the module system is shaped this way, and how a module is installed and removed. |
link/PLAN.md + INTEGRATION.md |
The game↔sidecar wire protocol, as one real sidecar implements it. |
EVENTS.md |
The event system: what an event is, what a module declares, and what core owns. |
The chapters teach: the order to do things in, the reasoning, and the mistakes that cost this project time.