Tournament info site for the 1st Chess League
SSZ Cebularz Lublin chess community
We play chess online. Informally. On Discord. No clocks, no arbiter, no good reason — pure hobby.
Someone still had to figure out who hasn't played whom yet, who's in the lead, and whether anything is even happening. A Google Sheet would require clicking. So obviously: we built a separate website.
Because why not.
The organiser draws up pairings. Players arrange a time among themselves and play on chess.com. Weekly deadlines — loosely enforced. This is a chess community, not a disciplinary one.
Supported formats:
- Round-robin — everyone plays everyone, in any order within the deadline
- Swiss — fixed rounds, pairings generated after each round
- Optional split into two groups from the same player pool (for fun, because we like rankings)
A results page for a casual online chess club. No backend. No database. No login. No runtime API calls. Static HTML generated from JSON files — because why keep it simple when you can achieve the same thing with 400 lines of TypeScript, GitHub Actions, and Cloudflare Pages.
| Layer | Choice | Reason |
|---|---|---|
| Framework | Astro + TypeScript | SSG, zero JS by default, still feels modern |
| Data | JSON in data/ |
Git as both database and audit log |
| Hosting | Cloudflare Pages | Free tier, deploy hooks, global CDN |
| Pipeline | GitHub Actions | Cron every few hours, smart diff, zero manual steps |
data/
players.json # players: discordNick, chesscomNick, rating, group
tournament.json # games: who–who, result, when
Everything lives in the repo. Every refresh is a timestamped commit. Git history = tournament history. Completely unnecessary, completely satisfying.
Every few hours GitHub Actions runs scripts that query the chess.com API for new games. If nothing changed — no commit, no deploy, no Cloudflare build burned. If something changed — commit, push, Cloudflare builds the site in a few seconds.
pnpm run fetch # queries chess.com, updates the JSON files
pnpm run build # Astro generates static HTML
Change detection works via git diff --staged --quiet — empty diff means no commit. Simple and effective.
/— main view, tournament progress/wyniki— standings table split by group/gracze— player list with links to profiles/players/[id]— player profile: completed matches with scores, individual game pills, list of remaining opponents
A few dozen people playing chess on Discord who want to know if Marek has already played Piotr and what the result was. The technology is slightly oversized for the job. But at least it works.
Cebularz is a traditional Lublin flatbread topped with onion and poppy seeds. Chess is a board game. The connection is obvious.
