- Platforms
- Data & Research
One continent, one board — a pan-African chess league played on Lichess and settled on one table.
- Role
- Founder & builder
- Year
- 2026
- Status
- Live

Hover to scroll the page
Registered players
African federations
Games recorded
Countries in one event
Figures from data.afcl.africa, September 2026.
01The problem
Cross-border chess in Africa depends on travel, funding, venues and coordination that most players and clubs cannot easily access. Online play exists, but nothing gave African clubs a shared competition, a shared table and a shared record.
African players are separated by borders: competing across them usually means travel, funding and venues most clubs cannot reach. AFCL makes the continent a single league, with the research built into it.
02What I built
- 01A league whose matchdays are Lichess team-battle arenas: every club enters the same tournament, and club points accumulate across the season.
- 02A separate API service (Fastify, MongoDB) that owns competition structure, scoring and derived standings, with a worker that syncs results from Lichess and flags drift between the two.
- 03A connected ecosystem around the league: rated puzzle ladders that score speed and accuracy, live FIDE ratings for every rated African player, and an open statistics portal.
- 04A news pipeline that scrapes African chess federations and media twice a day into MongoDB, taking only what is new.
- 05An admin portal for seasons, clubs, recruiting and sync logs — and a season calendar generated from four answers rather than typed by hand.
- 06Research into participation and cross-border reach, published as two preprints, so evidence guides how the league grows.
03In the wild



04Decisions that shaped it
Lichess plays the chess. AFCL keeps the score.
Identity, gameplay and fair play stay on Lichess. AFCL owns the competition model — structures, scoring rules, standings and public reporting — and checks its derived scores against Lichess’s own.
A matchday is one arena everybody plays in
No fixtures and no pairings: a season is a calendar, not a draw. Nobody wins a matchday; a club’s score is the sum of what its members scored, and the table is those sums over the season.
The frontend holds no database
Every byte the site renders comes over HTTPS from the API. Sessions are httpOnly cookies set cross-origin, so CORS names each origin explicitly instead of using a wildcard.
The calendar is generated, not typed
Organisers give the opening day, playing times, length and number of matchdays; the dates are derived. Asking for weekday slots had once put the arithmetic on people, and a season finished months late.
05Stack
- Next.js
- TypeScript
- Tailwind CSS
- Framer Motion
- Lottie
- Fastify
- MongoDB
- Mongoose
- Lichess API
- chess.js
- Python
- GitHub Actions
- Render
- Vercel
Research behind it



