100 Table of Contents/Projects.md → Tools & Software
project
architecture
go
htmx
basketball
team
showcase
0.55
false
d0b4eefd4b16
2026-10-27
project
basketball
showcase
Go web service
HTMX
Python data tooling
GraphQL API reverse engineering
WhatsApp automation
Caddy reverse proxy and basic auth
systemd user services
n8n scheduling and alerting
Apprise notifications
Go 1.26
HTMX 2
Python 3
Node.js
Baileys
Caddy
PlayHQ API
n8n
Apprise
ntfy
Basketball Team Manager — Overview
💡 What is this project?
A parent volunteers to run the score sheet roster for an under-18 basketball team. Eight families take turns. One parent fills in the paper score sheet at each game.
This project does the bookkeeping. It keeps the season fixtures, works out whose turn it is, and writes the messages for the team WhatsApp group. A small private website shows the same information, so any parent can check the roster from a phone.
The club publishes no usable fixture feed for parents. PlayHQ holds the data, so the project reads the PlayHQ API and fills in the time, venue and opponent. The volunteer types nothing twice.
🌟 Key Highlights (Portfolio & Employment)
Concept: A small service that turns a weekly volunteer chore into an automatic roster, a web page and group messages.
Tools & Skills Showcase: One Go binary with HTMX, no build step. Python owns the rules and Go only renders, so the site, the CSV and the messages cannot disagree. The PlayHQ GraphQL endpoint was found by reading the public site bundle and needed a tenant header. WhatsApp posting uses a linked-device client behind a small HTTP bridge. n8n runs the weekly schedule and alerts by email and phone through Apprise when a run fails.
Practical value: The volunteer records one line after a game. The roster, the weekly messages and the alerts follow. Swaps between parents correct themselves.
📐 Architecture & Flow
flowchart LR
Phone[Parent on phone] --> Caddy[Caddy .35 - basic auth]
Caddy --> Site[Go + HTMX site .13:8420]
Site --> Plan[tools/plan.py]
Plan --> Data[(data JSON files)]
Site -->|record result| Data
Site -->|POST /send| Bridge[wa-bridge .13:8421]
Bridge --> Group[WhatsApp group CW U18 B10]
N8N[n8n on .13] --> Site
N8N -->|failure alert| Apprise[Apprise .35:8210]
Apprise --> Email[samuelrolfe@gmail.com]
Apprise --> Ntfy[ntfy topic btm-alerts]
PlayHQ[PlayHQ API] --> Fetch[tools/fetch_fixtures.py]
Fetch --> Data
EDJBA[EDJBA season dates] --> Data
🗓 The week
When
What
Thursday 3pm
Training reminder. Names the next game's timekeeper so parents can swap.
Friday 9am
Refresh fixtures from PlayHQ.
Friday 9:05am
Game details with map link, arrival time and scorer.
Friday 4pm
Post again only if the message changed.
Holiday Thursday
"No training tonight", with the date training resumes.
Friday, no game
"No game this weekend", with the next round named.
Training is Thursday 7:45pm to 8:45pm at Bundha Sports Centre, 111 Queens Parade, Fitzroy North. No training in school holidays.