Concepts
Skins
A Skin is how the signed-in app looks for one Player: one of five built-in pixel-art worlds, a pixel world a Player uploaded, or Classic, a plain chat app. A Skin changes the look, never the words or what a Player can do — CONTEXT.md's vocabulary is the same in all of them: the task board is still Tasks, an NPC is never a Villager.
The pixel worlds
Farm is what a new Player sees, and what an existing Player who has never chosen sees too, unless they hid Farm: then it is Classic. In every pixel world the dashboard is a map with a place for each part of the app, NPCs wander it on their own, an NPC's reply renders as a dialog box beside its portrait, a Tool call shows a hammer, a finished Task gets stamped, and the Tools page lays grants out as items. Each world dresses the same fifty characters its own way, so an NPC is the same person in the office and in the caves. Message text stays the same readable font in every Skin — Geist — and keeps its contrast; the pixel font is for chrome (headings, buttons, labels) only.
Classic is the plain chat app, unchanged.
Uploaded Skins
Any Player can add a Skin for the whole Village by uploading a Skin pack: a
folder of PNGs and a skin.json laid out like a built-in Skin's art, based on
one of the five. Anything the pack leaves out comes from that Skin, so a pack
can be a recolour, one new person or a whole world. The upload checks every
file's size and every text colour's contrast, and names each problem at once.
See Making a Skin pack.
The Skins page (from the Skin menu's Manage Skins... or the Village's Skins place) lists every Skin. Any Player can hide any Skin but Classic from their own list, and bring it back, except the Skin they are wearing. Only the Operator can delete an uploaded Skin; Players wearing it go back to Farm, or to Classic if they hid Farm.
The Village
In a pixel Skin the dashboard is the Village itself, filling the page under the header. You walk it as your Villager.
- Move: the arrow keys or WASD, or click the ground to walk there. The camera follows you.
- Use: press E beside an NPC to open it, or beside a place (the NPCs house, the Docs, the notice board) to go there. Docs opens in a new tab.
- Keys only steer while the Village has focus. They do nothing while you type in a field, while a dialog is open, or with Ctrl, Alt or Meta held.
- The Village board holds what the dashboard list used to: counts, ongoing Tasks, recent conversations and your NPCs. Open it from the notice board or the Village board button. An NPC with a Task in progress shows "...".
- Your Villager: the Your Villager button lets you choose which of the fifty people you walk as. It is saved with your Skin, so it follows you between browsers.
- Without the keyboard game: every NPC and place is also a button, so you can Tab to it and press Enter.
Classic keeps the list dashboard, with the same board as the page. Reduced motion stops the wandering, smoke, water and critters.
Switching
The header carries a Skin button: a game-pad icon in a pixel world, a list icon in Classic. It opens a menu of every Skin you have not hidden, and a Manage Skins... link.
Follows the Player, not the browser
A Skin is stored on the Player, not in the browser: choosing one on a laptop carries it to a phone, a second browser, or the desktop app the next time you sign in there. There is no separate setting to sync — one Player, one Skin, wherever they are signed in. See Operator and Player.
Light, dark and motion
Each pixel world is always light or always dark, as the table says, so the light/dark control leaves the header while one is shown. Your own light/dark choice still applies in Classic and in these docs. Sprite animation — NPCs walking, a Task stamping down — respects your system's reduced-motion setting; with it on, nothing moves.
The public pages
The landing page, the download page and the sign-in and sign-up screens wear your Skin too, before you have an account. Your browser remembers the choice (Farm until you pick one), and the page is dressed before it first paints, so there is no flash of another look. Visitors choose among the built-in Skins only: Classic and the five pixel worlds, never an uploaded one.
In a pixel Skin the landing page's hero is a live Village you can walk, with example NPCs and a figure you steer (not a Villager: only Players have one); it never takes the keyboard until you click it, and talking to an NPC opens sign-up. Every section sits on a panel. In Classic the page is unchanged, with a screenshot in place of the Village.
When you are signed in, choosing a Skin in the app updates what your browser remembers (an uploaded Skin is remembered as the built-in Skin it is based on), so after you sign out the public pages wear the last Skin you chose.
The docs you are reading are always Classic, so they stay easy to read.
Changing the art
For a built-in Skin, every sprite is a PNG under apps/web/art, one file per tile, building,
person and frame. Edit it in any pixel editor, then run
pnpm --filter web sprites:draw and commit the result. The rules and the
size of every file are in apps/web/art/README.md.
For an uploaded Skin, make a Skin pack instead; no script or commit is needed.
Fonts
A Font is separate from a Skin. The Operator picks a Village font in Settings, and each Player can pick their own on the Skins page, or choose "Village font" to go back to the Operator's. With neither, every Skin wears its own fonts: Classic's Geist and the pixel Skins' Pixelify Sans.
A picked Font replaces a pixel Skin's headings and buttons as well, so the whole interface wears it. Code keeps its monospace font. The landing page and these docs wear the Font of the last Player who signed in on that browser.
Next
- Achievements and Rank — the pixel worlds also show what a Player has earned.
- ADR 0031 and ADR 0033
- ADR 0039 — why the public pages wear the visitor's Skin.
- ADR 0038 — why uploaded Skins live in the database.