Serve it locally
a preview, not hosting — Cloudflare Pages does thatThe repo is static files, so there is nothing to build. Run this from the repo root and
open the URL it prints. Ben reaches his from any device on his tailnet; Will opens
localhost on his own machine.
cd ~/git/games/maple-frag-fest
python3 -m http.server 8791http://hermes:8791/ # Ben, from the laptop / PC / phone
http://localhost:8791/ # anyone, on the machine running itAdd or change a game
rule (k): a game is a folder with a manifestCopy a sample folder, rewrite its manifest.json, then run the indexer. The
indexer is the one that decides what the front door shows — nobody edits a list by hand.
cp -R chicken-peckers my-new-game # start from a working shape
vim my-new-game/manifest.json # id must equal the folder name
python3 dashboard/games-gen.py # rewrites dashboard/data/games.jsIt refuses the bad ones and names the folder: a missing entry, no
assets/card.png, players outside 2–4, minutes over 15, a duplicate id, or an
id that does not match its folder. Nothing is written if anything fails.
Update the dashboard
three different jobs, three different movesEverything the front door shows about a game is read from that game's folder — there is no list to edit. What you changed decides which of these you need; they are not three ways to do one thing.
a · your card art
Drop the new file in, then re-run the indexer. The second line is the point: the card's URL carries the file's timestamp, so without it the browser keeps showing the old picture.
cp ~/Desktop/my-art.png my-game/assets/card.png # 3:2, ≥600×400, PNG, <150 KB
python3 dashboard/games-gen.py # re-stamps ?v= from the file's mtime⚠️ 3:2 landscape · subject in the middle square (it centre-crops on a phone) ·
no lettering (the page prints the title, tagline and author) · dark enough for a black page ·
under ~150 KB. Full spec: how-to/card-art.md.
b · your listing
Title, tagline, shape, minutes, author — edit the manifest and run the same indexer.
id must stay equal to the folder name.
vim my-game/manifest.json
python3 dashboard/games-gen.pyc · the page itself — CSS and dashboard JS
A different job, and it needs a step the generators do not do for you: those files load behind a cache stamp. Bump it in all three pages or the browser serves the old file and you will swear your edit did nothing.
vim dashboard/css/style.css
stamp=$(date +%Y%m%d%H%M%S)
sed -i '' "s/style\.css?v=[0-9a-z]*/style.css?v=$stamp/" dashboard/*.htmld · nothing to run at all
⭐ The header sayings and the mock presence live in dashboard/data/mock.js.
Edit that file, refresh the page. No regenerate, no stamp.
Change a rule
the charter page is generated from RULES.mdEdit clubhouse/RULES.md §3, then regenerate. A rule that moves or changes
shape makes the generator exit 2 and name the section, so the page cannot drift quietly.
vim clubhouse/RULES.md # §3 is the rules list
python3 dashboard/charter-gen.py # rewrites dashboard/data/charter.js⚠️ Do not add - bullets to §3 — every one is parsed as a rule. Prose, bold
and tables are fine there.
Both generators at once
the usual "I changed everything" movepython3 dashboard/games-gen.py && python3 dashboard/charter-gen.pyShip it
the deploy is the commitPush to main and Cloudflare Pages redeploys by itself — no release step, nothing to
upload. There are no feature branches right now, so stage by path: never git add -A,
or the other writer's half-finished work rides along.
git status # read it before you stage
git add dashboard/ chicken-peckers/ # the paths YOU touched
git commit -m "what changed, imperative"
git push # Pages deploys on its ownclubhouse/RULES.md.