Case / hyperlocal data hub

Kommunfotbollen

Next.js / Claude API / Supabase

Kommunfotbollen aggregates standings, matches, goal scorers, and news for the ten football teams in Västervik municipality in one place. Everything updates automatically every evening, without anyone entering data by hand.

Problem

Local football coverage was scattered across an external sports data source and several local newspapers. No single place aggregated leagues, matches, and goal scorers, and match reports existed only as unstructured free text.

Solution

I built a Next.js app with a source-agnostic ingest architecture that pulls five leagues from Everysport, and an AI pipeline where Claude reads local newspaper articles, judges whether they are relevant to a given team, and extracts goal scorers from match reports. The home page features the match of the week, and every team has its own page with the next match, a table excerpt, results with scorers, and the latest news.

Technical decisions
Source-agnostic ingest architecture (MatchSource) so more data sources can be added without rewriting the rest of the app.Claude handles two separate AI tasks: news relevance filtering and goal-scorer extraction from match reports.Goal scorers are only stored when both the result and both team names in the report match a played match, so the AI never guesses a link.Articles are found through the newspapers' sitemaps and football pages, since a sitemap can lag a day behind. Automated robot match reports are filtered out of the news list.The app schedules its own jobs: news at 22:00 and team data at 23:00, after the evening's matches. A tiny health endpoint keeps the service awake without touching the database.Built for free-tier limits: team photos are pre-scaled to WebP before upload so the server never has to process images, and the database pool stays under Supabase's 15-connection cap.Zod validation of external data to keep the data model reliable despite sources of varying quality.
What it shows

The site runs around the clock and fills itself up every evening. The project shows that I can build integrations against multiple external data sources, use AI for structured extraction from text, and make deliberate architecture choices to keep operating costs down.

Tech
Next.js 16TypeScriptDrizzle ORMSupabaseZodTailwind v4Anthropic SDKsharpRender