Development All guides ▾
How to run BoothWall from source and work on it.
Getting started
Follow Try it in the README. You don’t need a Fire TV or a Cloudflare account: the Vega Virtual Device runs on a Mac, and the web wall runs in any browser. pnpm demo runs everything on your machine; set demo: true in packages/shared/src/config/boothwall.config.ts (or add ?demo in the browser) to run the wall on the bundled photos with no API at all.
Commands
| Command | What it does |
|---|---|
pnpm demo |
The API and the web app locally, with demo photos and the passcode printed (see below) |
pnpm web:dev |
The web app: the wall at /, the upload page at /snap, the Control panel at /control |
pnpm api:dev |
The API on your machine, no Cloudflare account needed (see below) |
pnpm tv:build:debug / tv:build:release |
Build the TV app, one .vpkg per architecture |
pnpm tv:vvd:start:1080 / tv:vvd:restart:1080 |
Start or restart the Virtual Device at 1080p (restart also relaunches the app) |
pnpm tv:run:vvd |
Install and launch the debug build on the Virtual Device |
pnpm remote |
A laptop remote for the TV at http://localhost:4400 |
pnpm boothwall setup |
One-time Cloudflare setup and first deploy |
pnpm boothwall deploy |
Apply migrations, then redeploy the API and the web app |
pnpm boothwall example [name] |
List the examples, or apply one’s config and artwork |
Running the API locally
No Cloudflare account needed. cf dev simulates D1, R2 and the Durable Object, and keeps their data in apps/api/.cloudflare/state.
The quick way is pnpm demo. It writes a passcode to apps/api/.dev.vars if there isn’t one, applies the migrations, starts the API and the web app (each on the first free port from 8787 and 5173), points the web app and the wall at the local API with VITE_API_URL, and on a fresh database adds twelve approved demo photos with automated review disabled. Then it prints the addresses and the passcode. Locally the API accepts any localhost port, so a second dev server on another port works too.
By hand:
cp apps/api/.dev.vars.example apps/api/.dev.vars # set ADMIN_TOKEN and a separate random CLIENT_FINGERPRINT_KEY
pnpm --filter @boothwall/api db:migrate:local # create the local database
pnpm api:dev # serves the API on the URL it printsControl panel routes take the token as Authorization: Bearer <ADMIN_TOKEN>. To use the upload page and the Control panel against it, run VITE_API_URL=<the printed URL> pnpm --filter @boothwall/web exec vite and open / for the display, /snap for guests or /control for hosts. The wall in the browser follows VITE_API_URL too. The TV app has no environment variables, so to point it at your local API, change urls.api in the config for the session and don’t commit it. Run the migrate step again after pulling new migrations. The standalone API has no automated review provider; see older review settings when upgrading saved local data.
Changing the database
Edit apps/api/src/db/schema.ts, run pnpm --filter @boothwall/api db:generate, then apply the new migration with pnpm --filter @boothwall/api db:migrate:local (and pnpm boothwall deploy for your Cloudflare account).