A browser-based multiplayer pixel-art RPG, live at nangijala.online — and the experiment behind it: the game, and every graphic, sound, and word in it, is produced almost entirely by autonomous AI agents working in this one repo. Named for the afterworld in Astrid Lindgren's The Brothers Lionheart.
Each domain below is a self-contained top-level directory owned by its own AI
agent, with its own pipeline, config, and viewer. Agents generate art on
PixelLab and audio on ElevenLabs, commit the results,
and push straight to main — the pipelines touch disjoint paths, so their
concurrent pushes rebase cleanly. They coordinate through message boards in
coordination/ (PROTOCOL.md is the contract).
The maintainer keeps no clone and works from a phone: he plays the deployed
game, and reviews, rates, and tunes everything from the in-game wiki —
whose verdicts flow back to the agents as files in live/. The game
is simultaneously the product and the communication channel.
| Domain | What it makes | Docs |
|---|---|---|
characters2/ |
The two player heroes + every NPC-tagged PixelLab character, mirrored with full 8-direction animation sets |
characters2/README.md |
tiles2/ |
Tiles 2.0 — the live, shipping tile/material library (iso terrain + transitions) | tiles2/README.md |
tiles/ |
Tiles 3.0 — next-gen isometric ground tiles, built alongside tiles2 until coverage is complete (name reused from the retired first generation) | tiles/README.md |
maps2/ |
Worlds — worlds/<name>/world.json grids the game loads |
maps2/README.md |
scenery/ |
Freely placeable, optionally animated set dressing (trees, graves, lamps) — off the tile grid, can animate | scenery/README.md |
sounds/ |
Game sound effects (UI, items, tools, movement, combat) — ElevenLabs SFX, lossless 48 kHz, mastered | sounds/README.md |
music/ |
Background score — ElevenLabs Music; every track ships beat-grid/section/key metadata so the game can sync SFX to it | music/README.md |
items/ |
Items — everything with an item-type tag on PixelLab (MISC, SOUL, CONSUMABLE, SWORD, BOW, WAND, ARMOR), with game metadata per item |
items/README.md |
lore/ |
The story — the GM-facing "red line" backbone, player chapters, and per-entity lore for every other domain, published as lore/lore.json |
lore/README.md |
monsters/ |
Monsters — everything tagged MONSTER on PixelLab, with canonical idle/walk/angry/attack/die states |
monsters/README.md |
games2/ |
The game itself — Colyseus server + Phaser client, consumer of all art domains (two agents: gameplay and UI) | games2/README.md |
wiki/ |
The in-game wiki — browse every asset, rate/approve/tune (maintainer's control room) | wiki/README.md |
live/ |
The live-update channel — tuning + feedback files the running game server reads straight from main, no redeploy |
live/README.md |
Shared conventions: lossless WebP for all game art, API keys in a
gitignored .env (never committed), resumable loops that derive the next unit
from the filesystem, one commit + push per unit, phone-friendly viewers. The
full shared law is in CLAUDE.md.
Almost every scenery piece is drawn facing SOUTH only, and a south-facing
sprite is still itself when mirrored — so the game must place scenery with a
random horizontal flip (~50%), doubling every south-only group's visual
variety at zero generation cost. Each piece carries the flag in its manifest
and in scenery/viewer_data.json:
"must_be_imbplemented_with_random_hflip": true // sic — the SHIPPED key name; do not "fix" the spellingHonour the flag, do not assume it. It is false on the pieces that carry
facings — the windows (south-east / south / south-west) and the legacy
8-direction pieces — where a flip would put the art on the wrong wall.
games2/Dockerfile builds one image (client + art + Colyseus WebSocket
server) from the repo root; the root .dockerignore is the allowlist of
which domains reach that image. .github/workflows/nangijala-deploy.yml
tests, builds, and deploys it to Cloud Run with keyless auth (Workload
Identity Federation — no stored secrets). Changes to live/** skip the
deploy entirely: the running server picks them up from GitHub within seconds.
A weekly git archive backup goes to GCS (.github/BACKUP.md).