1.8 KiB
1.8 KiB
KITCHEN 484 · Solarpunk Summit
Festival kitchen site: browse the food schedule, place a free pre-order, and watch it flip to READY the moment the kitchen fires it — with the stand to pick it up from.
What it is
index.html— customer PWA (schedule, cart, pickup codes, live status)server/server.js— zero-dependency Node backend: order store, pickup codes (K484-XXXX), SSE live status, static hostingserver/staff.html— staff order board at/staff(passcode-gated: mark orders READY / COLLECTED / CANCELLED, filter by stand)home.html— K484 association page (separate, untouched)
Payments were removed (Sep 2026): pre-orders are free reservations;
people pay at the stand. The old BTCPay proxy lives in git history
(commit 601c85f) if it's ever needed again.
Run
cd server
cp .env.example .env # set STAFF_PASSCODE (openssl rand -hex 4)
node server.js # http://localhost:8787
Orders persist to server/.data/orders.json (gitignored).
Test
cd server && npm run test:e2e # 14 checks: order loop, auth, SSE, restart persistence
Open it on your phone
Same Wi-Fi (if the network allows device-to-device):
http://<laptop-ip>:8787 # laptop IP from: ip -4 addr | grep 10.
http://<laptop-ip>:8787/staff # staff board (passcode from server/.env)
If the phone can't connect (some Wi-Fi networks isolate devices — this happens on ours), use a tunnel instead:
~/.local/bin/cloudflared tunnel --url http://localhost:8787
# prints https://<random>.trycloudflare.com — open that on the phone
# (URL changes on every tunnel restart)
Typing the long URL fails often (browser eats it as a search). QR to the rescue:
qrencode -s 12 -m 2 -o /tmp/k484-qr.png "https://<your-url>" # then scan it