
For years, the Kensington & Chelsea FC 5-a-side group had been managing their weekly football matches using a simple spreadsheet. Every week, two captains would pick teams of 5 players each, play their match, and then manually update the spreadsheet with scores and points. With around 20+ players rotating throughout the season (from September to April), the spreadsheet was becoming increasingly difficult to manage.
The problem
The group needed a better way to:
- Track match results and player statistics automatically
- Keep a historical record of multiple seasons
- Make it easy to submit results after each match
- Display standings in a proper league table format
- Add personality and fun to their weekly football tradition
Most importantly, they wanted a solution that was free, required zero maintenance, and could be updated by anyone in the group with just a simple login.
What I built
I created a modern, mobile-friendly web application that transforms their chaotic spreadsheet into a professional-looking football league management system.
For Players (Public View)
The League Table - The heart of the app displays player standings just like a real football league, with color-coded zones showing who's leading (in orange), who's in the top 4 (in blue), and who needs to step up their game (in red). Every player can see their complete stats: games played, wins, draws, losses, goals scored and conceded, current form streak, and total points.
Match Results - A beautiful results page shows every match that's been played, with teams displayed side-by-side in black and white (their actual team colors), complete with scores, dates, and even notes about memorable moments from each game.
Season History - Players can browse through past seasons to relive glory days or settle debates about who really was the best that year.
For Admins (Admin Features)
Easy Result Submission - After each match, an admin simply logs in and fills out one clean form: pick the date, select 5 players for each team (black and white), mark who was captain, note if anyone was late, enter the scores, and hit submit. The table updates instantly.
Player Management - New friends joining the group? Add them with one click. The system automatically creates their player profile and they start appearing in team selection for the next match.
Friendly Matches - Sometimes the group plays just for fun, not for points. I added a "Friendly Match" toggle so these games get recorded (for bragging rights) but don't affect the official standings.
Season Management - When April rolls around and it's time to crown a champion, admins can officially end the season with one click. This freezes the final standings forever in history, and they can start fresh with a new season whenever they're ready.
The little details that matter
Smart Rules Built In - The app knows the scoring rules: 3 points for a win, 1 point for a draw, 0 for a loss, and a -1 penalty for being late. Goal difference and head-to-head records are automatically calculated. Even the late-night messages to tardy players feel more official now.
Mobile-First Design - Everyone checks the table on their phones while heading to the pitch or riding home after the match. The app works perfectly on any screen size, with a hamburger menu and swipe-friendly layout.
Football Authenticity - I used proper football terminology throughout: "Pos" instead of "Rank", "GD" for goal difference, displaying current form with W2 or L3 streaks. Even the color scheme matches KCFC's official blue and orange.
Captain Indicators - Each week's captains are marked with a red © symbol (because leading the team matters), making it easy to see who's been stepping up to organize matches.
Banter-Ready - The app includes rotating footer messages with inside jokes and friendly jabs that capture the group's personality. After all, football is serious business, but it's also meant to be fun.
How it works
The app runs entirely in the cloud, meaning there's nothing to install or maintain. It's accessible from any device with a web browser - whether you're checking standings on your phone during lunch or submitting results from your laptop after the match.
Behind the scenes, it uses a database to keep everything organized: player profiles, match history, season records, and all the statistics. The clever part is that everything calculates automatically using proper football formulas, so there's no manual math or risk of spreadsheet errors. When an admin submits a result, the app instantly updates the league table, recalculates goal differences, updates form streaks, and adjusts everyone's standings.
Best of all, it's completely free to run. No subscriptions, no hosting fees, no hidden costs. Just a permanent home for the league that works 24/7.
The transformation
What started as a messy spreadsheet shared via WhatsApp is now a proper web application that:
- Updates instantly after every match
- Shows accurate, automatically-calculated statistics
- Looks professional on desktop, tablet, and mobile
- Preserves history for years to come
- Adds legitimacy and excitement to their weekly tradition
- Requires zero ongoing maintenance or cost
- Can be accessed by anyone, anytime, from anywhere
The group now has a permanent home for their football tradition - one that respects their history while making it easy to look forward to next week's match. Instead of arguing over who has the most points or whether someone calculated goal difference correctly, they can just check the app and let the numbers speak for themselves.
Most importantly, it captures the spirit of their weekly games: competitive but fun, organized but casual, serious about football but not taking themselves too seriously. It's not just an app - it's their league's digital home.
What I learnt
Build for the reality, not the ideal. The spreadsheet used to take a couple of days to get updated because everyone has day jobs and other commitments. I knew this from group chat history, so I built features that removed friction rather than assuming people would suddenly have more time. The captain indicator and friendly match toggle came from understanding those past conversations, not waiting for someone to request them.
Ship in hours, iterate on feedback. I built the MVP in a couple of hours and got it in the group's hands immediately. The feedback came in quickly: make the results view tidier, tweak a few other bits. Those refinements turned it from "this works" to "this feels right for us."
Solve friction you've already seen. I didn't guess at features. The captain tracking, the friendly match toggle, the rotating footer messages - all of these came from real patterns in our group chat over the years. When you know the problem well, the solution writes itself.
Good enough beats perfect. The first version wasn't polished, but it was live. That immediacy mattered more than another week of tweaking. The app exists because I stopped planning and started shipping.
Technical bits
Built with modern web technologies for a fast, reliable, and maintainable application:
- Next.js 15 - Modern React framework with App Router for server and client components
- TypeScript - Type-safe development to catch errors before they happen
- PostgreSQL (Neon) - Serverless database with generous free tier
- Drizzle ORM - Type-safe database operations with intuitive syntax
- NextAuth.js - Simple and secure authentication for admin access
- Tailwind CSS - Custom styling with KCFC brand colors (blue and orange)
- Vercel - Zero-config deployment and hosting (free tier)
The database schema is designed to handle everything the league needs: player profiles, match results, team lineups, season management, and automatic statistics calculations. Special features include friendly match tracking (games that don't affect standings), late penalty enforcement, captain tracking, and season archiving for historical records.
Live app: https://kcfc.vercel.app/
"In the game of football, either you win or you learn. But mostly you just argue about who was late." - Ancient KCFC Proverb