- Docker 100%
cellar #
one Fly machine that serves the backends of small AT Protocol apps: a zeldi host with a tenant per app, each app's Jetstream collector, and a front process that routes public requests by host. apps write from the browser straight to their users' PDSes; cellar only indexes and reads. feed generators are cells that hold their own Jetstream connection. each app's cells and collector are built from the commit of its repository that cellar pins.
live: api.pollz.waow.tech for pollz, api.status.zzstoatzz.io for status, and feed.zzstoatzz.io for the feeds.
deploy #
needs node 22, zig 0.17, just and flyctl. a deploy stops and restarts every app on the machine.
just build # bundle each app at its pinned commit for linux
just deploy # build the bundle/image and replace the machine
just status # inspect the Fly app
node build.mjs --status ../status (or --pollz, --feeds) builds from a local checkout instead of
the pin. zeldi recovers each tenant's state from R2 on start, using the
bucket-scoped token in the app's Fly secrets.
To release a backend, push its application commit, update that application's
full commit SHA in pins.json, then commit and push this repository before
running just deploy. All applications must use the same zeldi dependency
revision. Deployment uses the pins, not the current heads of sibling checkouts.
Status's frontend deploys separately with just deploy-web in its repository.
Its just deploy-backend /path/to/cellar target delegates here. A frontend-only
Status release does not change the pins or require restarting this machine.
There is no deployment CI configured here yet. just deploy is the entry point
for future CI after checks on a reviewed pin change; it owns the shared backend
release, while each application's frontend CI can deploy independently.
test #
npm install # playwright, for screenshots
node --no-warnings test/status-contract.mjs ../status exports/status-export.json # status's index against its baseline
ORIGIN=https://status.zzstoatzz.io node --no-warnings test/status-contract.mjs ../status exports/status-export.json
node baseline/screenshots.mjs <dir> # both apps at phone and desktop widths
the baselines record how status and pollz answered before they moved here, as the contract a change must keep. status's contract replays against hatk's final export, which holds per-account preferences and is kept out of the repository.