Give a character a personality, what they can do, and what they must never do. From there they notice, remember, plan and act on their own.

The brain runs in your build: no latency, no cloud calls, no LLM. Everything you need to put one in your game is on this page.

Three speeds, one character

Every character runs on three tiers at once. You author three things; everything else is computed.

Reflexes local · ~1 ms

A trained head reads what the character sees each tick and picks a verb: greet, serve, warn, flee, confront, call for help. Masked by the manifest before it is scored, so a character can never reach for a verb they don't have.

Plans hosted · on a wake · no LLM

When something that matters happens, a deliberator wakes, composes a campaign from the character's admissible operators and ranks it against the situation: report it, refuse service, confront, watch, avoid. It is a trained model, not a language model. Then the plan runs locally, step by step, as a bookmark that survives interruptions.

Memory local · yours

A first-person journal per character, on the player's disk. Every event is read for meaning and stamped with a class and a weight. Three small slights add up. An apology stands a plan down, aloud.

The manifest is the contract

Per level: the verbs your engine executes, the places by type, and per character a narrowing can and a set of never rules. Checked before you ship, not hoped for at runtime.

// lw.manifest.json { "verbs": [ { "name": "report", "engine": "navigate-to", "speaks": true }, … ], "places": { "temple": { "loctypes": ["temple"] }, "street": { "default": true } }, "events": { "ambient": ["the forge test-fires"], "importance": { "weapon": 0 } }, "never": [ { "verb": "confront", "when": "target.isChild" }, { "verb": "draw", "when": "place.temple" } ], "characters": { "Hulda": { "can": ["greet","serve","report","refuse_service","watch"] } } }

Nothing is silent

Every decision writes a receipt: what she believed, what the head proposed, what served, and why. Errors have a grammar: a fault, · a refusal, a character who wanted something and never got to do it.

$ lw why hulda hulda · 14:02:11 · served by: the plan believed armed_close 0 · in_my_place 1 · dist_n 0.3 open report → guard · "the newcomer took a coin purse right off me" chose report (the plan) confidence 0.91 — above gate 0.85 plan step 1/4 · report → refuse-service → confront → watch-them because woke on theft → intention in 41 ms ranker chose report → … because: first offense

Five minutes, no engine required

A mock town ships with the CLI. Fire a real event through the same door your game uses and watch the chain.

$ pipx install https://canonopy.com/dl/canonopy-0.1.5-py3-none-any.whl $ lw init && lw dev --mock session mock-town broker ws://localhost:8765 embedder :8098 (one model, shared by the gate, recall and the ranker) student reflex head + local deliberator mock skyrim_mock.py — a named town, no engine needed $ lw trigger theft --char hulda --value 40 → journal hulda 'the newcomer took a purse of 40 septims right off me' gate theft importance 9 provenance: observed wake YES (class theft, 41 ms) compose report → refuse-service → confront → watch-them ranker report → refuse-service → confront → watch-them because: first offense step 1 report → guard $ lw watch CHARACTER RUNG DOING INTENT STATE hulda intent report → guard theft(player) 4 steps step 1/4 adrianne routine go_station — routine guard idle watch — calm no warnings

Type your own sentence with lw trigger --raw. The gate reads meaning, not keywords — a theft phrased with none of our words is still a theft.

What runs in your build, and what we host

The split is the deliberator's own. Your players' data stays on their disk; the wake service keeps nothing between calls.

PieceWhereWhat that means for you
The brain — reflexes, perception, memory, acting on a planLocal, in your buildWorks offline. No latency, no cloud calls. Weights are versioned and fetched on activation. Yours to ship.
Planning — the trained modelHostedOne small request when a character has something worth planning about, never per tick. No player identity, nothing kept between calls.
The flywheelHosted, includedThree lanes: reflexes, perception, planning. The moments the brain was unsure are captured (features and choices, never your world's text); raw sentences go up only when you say so. Retrains return weights (local pieces) or a better service (hosted pieces), always with certification receipts.
Journals, receipts, manifestLocal, yoursFiles you can grep, diff and version. Their text never leaves without lw sync.

If a licence lapses, your characters lose the ability to plan and to be emergent. Reflexes keep running, so nothing bricks.

Pricing

One flat price. Never per call, never per player, never per character. Cancel any time.

Trial

7 days, free
  • Everything on: hosted wakes, the flywheel, every lane
  • The mock town, the CLI, the API, the MCP server
  • No card to start · your key is issued on the signup page

Licence

$20 / month
  • Unlimited wakes, players, characters and builds
  • Hosted deliberator + the flywheel, included
  • New verbs on request, certified, with receipts
  • Retrains for reflexes and perception, weights back to you
  • Seats for your team
Subscribe or lw licence subscribe

Questions devs have

Does a shipped game phone home?

For wakes, and for nothing else. The request is the event, the recent journal and the tick's context; the service keeps no state between calls. Reflexes, orders, scenes and memory run locally and offline, with nothing on the tick waiting on a network.

Is there an LLM in the loop?

No. The brain is a research method we developed and a trained model. No prompts, no tokens, nothing to wait on.

What happens if our subscription lapses?

Your characters lose the ability to plan and to be emergent. Reflexes keep running, so the game does not break.

Does our play train the shared brain?

Yes, by default, and never with text. The moments the brain was unsure (features, candidates, hashed names) improve your own weights on request and, pooled with every other licence's, the base every new studio starts from. Verbs we build for one studio land in that base for everyone. That pooling is part of the terms you accept when you take a trial key. Raw sentences only ever leave with lw sync --include-unclassified.

Can a character do something we didn't allow?

No. A verb absent from a character's set is impossible: the manifest masks the reflex head before it is scored, bounds the planner's operators, gates scene casts, and a backstop in the one funnel every command leaves through catches anything else. Rules are checked at load, not hoped for at play.

Do we have to train anything?

No. Training is a request, not a job you run: describe the verb or ask for a retrain, and weights or an improved service come back with certification receipts. You never see or maintain a training pipeline.

Which engines?

Any engine that can send a state feed and execute verbs over a websocket. The reference adapter is Skyrim; the mock town needs no engine at all. The manifest export is plain JSON for C# and GDScript adapters.

Questions or suggestions?

Send a message in the Discord.

Join the Discord