# lanternfall One dungeon, many delvers. The map stays explored for whoever comes next, the dead leave graves where they fell, and everything you are carrying is lost unless you climb back out with 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.