# lost-property A museum of lost things. Someone describes something they lost, at `/`; the museum accessions it — a catalogue number (`LP 2026.0003`), a vitrine, a plaque written in the flat voice of a museum label — and gives it a case at `/items/:id`. Other visitors can leave a note on any case: that they saw one like it, or that they have the other half. A catalogue number and a condition line are derived from the item's id; a vitrine is chosen by matching a handful of keywords in the description against a fixed list of themes (glasses go to *Spectacles and Lenses*, keys to *Keys and Fastenings*, anything unmatched to *Miscellanea*). That's the whole curator: no image recognition, no AI, no human judgement — a small deterministic table in `src/museum.ts`, so the same item always reads the same way and it's easy to see exactly what it will say before you submit it. This is an app: the forge runs it. Production follows the default branch; every open pull gets a preview at its own address with its own copy of the data. Everything the app keeps lives under `FORGE_APP_DATA`, which is what makes "production data" and "preview data" two different things. ```sh PORT=8080 FORGE_APP_DATA=./data bun run src/server.ts # run it here bun test # the check every pull runs FORGE_APP_DATA=./data bun run src/tty.ts # the terminal interface ``` It also has a terminal: the exact command is in `FORGE_APP_SSH` when the app runs (`ssh -p 2222 @` — the app is the login name, the forge is the host; `--@` for a preview's). It opens `src/tty.ts` on a real pty over the same data. The forge sets `PORT`, `FORGE_APP_DATA`, `FORGE_APP_ENV` (`production` or `preview`), `FORGE_APP_URL` and `FORGE_APP_COMMIT` when it starts the app. `forge.json` says how.