app/__pycache__/app.cpython-313.pyc was committed and went stale the moment app.py changed. It was inert because the image runs 3.12 and the bytecode was 3.13, but a stale .pyc that happened to match the interpreter would be a very quiet way to run the wrong code. Also ignores service_account.json, which is bind-mounted in at runtime and has no business being committable.
scout-website
Public recruiting site for Cub Scout Pack 73 and Scouts BSA Troop 73 (Zieglerville / Green Lane, PA).
Live at https://greenlanescouts73.org (NPM proxy → scout-website container, port 8132 on arrstack).
Replaces the scoutpoc proof of concept (claude-workspace/stacks/scoutpoc).
Updating the calendar (the part you'll actually do)
All dates on the site (home "Next up," both program pages, the Calendar page) render from one JSON file, read fresh on every request:
/srv/scout-website/data/events.json ← the LIVE file. Edit this.
app/events.json ← seed only; copied to /data on first boot.
Edit the live file on the host (or ask Claude), save, refresh the site. No rebuild, no redeploy.
Event format (one object per event):
{"date": "2026-10-17", "end": "2026-10-18", "time": "from 4:00 PM",
"title": "Fall Campout", "location": "Green Lane Park",
"unit": "both", "badge": "OVERNIGHT"}
daterequired (YYYY-MM-DD).endonly for multi-day events.unit:"pack","troop", or"both"(default pack). Drives the Pack/Troop calendar filter and each page's "Next up."badge: optional shouty label (FALL OPEN HOUSE,OVERNIGHT,THE BIG ONE).- Past events are hidden from "Next up" automatically; keep or prune them in the file, your call.
- TeamSnap (team 8198615) stays the source of truth; this file is the public snapshot.
To change the seed for future rebuilds too, edit app/events.json here in Gitea and redeploy the stack.
Layout
app/app.py— FastAPI app, all five pages server-rendered (Home, /cubs, /troop, /calendar?unit=, /join)./contact301s to/join.app/events.json— calendar seed (see above).docker-compose.yml— Portainer Repository stack definition (port 8131).- Images: not in the repo. Bind-mounted read-only from
/srv/scout-website-assets/img. Source photos live on the NAS (Scouting-Recruitment-Images,scouting-comms/pack-73/assets/social); web-sized copies inScouting-Recruitment-Images/_web.
Leads
/srv/scout-website/data/leads.jsonl — one JSON line per interest-form submission, plus an ntfy push per lead.
Lead pipeline (self-contained)
/join submissions write directly to the shared Google Sheet (SHEET_ID stack env, creds bind-mounted from /srv/scout-website/secrets/service_account.json) and push to the shared ntfy scouting topic (NTFY_BASE/NTFY_TOPIC/NTFY_TOKEN). The extra comments box lands in a new 8th sheet column, Comments. Every submission also appends to /data/leads.jsonl; if both sheet and push fail, a warning push goes to the fallback NTFY_URL topic. No dependency on the scoutpoc or scouting73-form containers: both can be decommissioned without breaking this site. (The flyer QR domain scouting73.thewichersfamily.com should be repointed here before its container is retired.)