Skip to content

Runbook

For: the person who operates this product. That means running it on a laptop, putting it on staging, putting it in front of players, and finding out what went wrong when it misbehaves.

One person holds every one of those roles here. The pages below are written so that none of them needs a second person, a remembered detail, or a search through source to get through a job.

The pages

PageAnswers
Run it locallyWhat to install once, what to run every time, which ports come up, and how to stop cleanly.
CloudflareWhat exists in the Cloudflare account, which binding is which, and where to click for logs, storage and domains.
Deploy to stagingThe command, the preconditions, what to check afterwards, and how to reset the environment.
Deploy to productionThe same, plus what is irreversible and what a rollback costs.
Data and storesWhere the game state actually lives, how to read it, how to change it, and how to get a copy out.
Credentials and accessEvery login, key and token this product needs, where each is obtained, and which one a given job wants.
iOSWhat exists for iOS today, and the route from this repository to a device and to the App Store.
AndroidThe same for Android and Google Play.
DesktopThe desktop shell: building it, smoke-testing it, and shipping it.
DebuggingReading logs, reproducing a report, and the failures that have already cost time once.

The rule these pages follow

No page here contains a credential value. Every page names the credential it needs, states where that credential is obtained, and stops. Credentials and access is the index of those names, and it holds no values either.

Where the tooling cannot do something, the page says so instead of describing the thing it cannot do. A runbook that describes an imagined procedure is worse than one with a gap in it, because the gap is visible and the imagined procedure is not.

Before anything else

Three facts decide most of what follows.

The product runs in three environments — dev, staging and production — from one build with environment-selected configuration and three separate stores. Production is never wiped; staging is reset freely; dev is disposable.

The gate is the arbiter of whether a change may ship. npm run check runs it, locally and in continuous integration alike. A red gate is a stop, not a warning.

The server is a Cloudflare Worker with a Durable Object holding the universe. The game state is therefore not in a database you can open with a client: it lives inside a running object. Data and stores is the page that explains how to reach it.