Commands

The handful of commands this repo actually uses. Copy, paste, done.

Serve it locally

a preview, not hosting — Cloudflare Pages does that

The 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 8791
http://hermes:8791/          # Ben, from the laptop / PC / phone
http://localhost:8791/       # anyone, on the machine running it

Add or change a game

rule (k): a game is a folder with a manifest

Copy 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.js

It 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 moves

Everything 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.py

c · 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/*.html

d · 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.md

Edit 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" move
python3 dashboard/games-gen.py && python3 dashboard/charter-gen.py

Ship it

the deploy is the commit

Push 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 own
The charter What those rules actually are — generated from clubhouse/RULES.md.