From Kos to Competition Management — The Catch-Up Post

Share
From Kos to Competition Management — The Catch-Up Post

by the_chandi_man | 14 Jun 2026


I've been quiet on here. Life happened — in the best possible way.

A week in Kos with the family. A week of beach, pool, too much food, and the kind of quality time that reminds you what you're actually building this for. And yes, a laptop that somehow ended up open on a sun bed more than once.

This is the catch-up post.


Kos — The Golf App Holiday

First things first. Kos has no golf courses.

I found out before we left and I was not happy about it. That's despite knowing full well this was a family holiday and there would be no time for golf. There's just something about knowing a golf course exists nearby that makes me happy — I start daydreaming about the layout, how I'd play each hole, what the greens would be like.

Despite there being no course in sight, I did what I always do — found a way to practice my questionable swing. Whether it's a frying pan in the kitchen at home or an invisible club on the beach, by the pool, or anywhere there's a bit of space, the swing practice never stops. People were probably watching and thinking — what on earth is that guy doing.

I also played padel and tennis a few times, which was genuinely fun. But not quite the same.

What I did find was that the gaps between family time — the hour after the kids went to bed, the quiet poolside moment before everyone was up — were perfect for getting some building done.


Building From a Sun Bed

The first Kos coding session happened poolside. Laptop on my knees, kids splashing in the background.

I got the scoring working properly. Not in theory — actually working. You search for a course, set up a round, add your playing partners, start scoring hole by hole. Birdie goes green. Bogey goes amber. The running total updates as you go. When you finish the 18th, the round complete screen shows your gross, net, Stableford, and vs par — all calculated correctly.

I tested it by scoring par on every hole of a par 70 course. The gross came back 70. Which sounds obvious but there had been a bug where it was showing 72 — the app was using a fallback hole template instead of the real course data. Found it. Fixed it. 70.

The second session happened in the hotel lobby. Taxi to the airport in 20 minutes. Bag by the door. Laptop open on a table, red code on the screen, bottle of water number three of the day.

Authentication was building. By the time I landed back in England, the login and registration flow was working.


The Family Behind the App

I want to share one of these photos properly because it's the real reason any of this matters.

That's us on the beach in Kos. My wife, my daughter, my son, and me — who had spent at least some portion of this holiday writing code about golf instead of being fully present. They are very patient people.

Building this app around a full time job and a family is genuinely hard. Not in a dramatic way — in the normal, unglamorous way that most worthwhile things are hard. There are sessions that don't happen because the kids need you. There are evenings where you open the laptop and close it again without writing a line. There are moments where you wonder if this is actually going anywhere.

And then there are moments where you score par on every hole and the app tells you 70 and you think — yes, this is going somewhere.


What Got Built

Here's the honest summary of everything since the last post.

Scoring — complete. The full round flow works end to end. Start a round, score every hole, finish, see your results. Round data saves to the API when you're connected.

Authentication — working. You log in, get a secure token, and that token is attached to every API request automatically. Register, login, stay logged in. The basics that everything else depends on.

Competition management — the big one.

This is the feature I'm most excited about. The full competition flow now works through the API:

  • Create a friend group
  • Create a competition
  • Add players with starting handicaps
  • Create a round — define the format (Stableford, American Stableford, Medal), how many holes, the entry fee
  • Submit scores — front 9, back 9, whether someone played a section only
  • The API calculates positions, points, and prize money automatically
  • Round leaderboard and season leaderboard both return correct data

I tested it. One player, 33 Stableford points, £3 entry fee. The API returned: position 1, 1 point, £1 prize money. Which is exactly right — £3 divided by 3 prize pots.


The Bug That Took an Afternoon

There's always one.

Four of the API controllers were looking for player records in the wrong database. The app has two databases — SQLite on the device for offline scoring, and SQL Server on the backend. When authentication was added, player accounts started being created in SQL Server. But the controllers were still looking in SQLite.

So you'd log in successfully, get a player ID back, try to do anything with it — and get "Player not found." The player existed. Just not where the code was looking.

Found it. Fixed all four controllers. Moved on.


Where We Are

✅ End to end scoring
✅ Authentication  
✅ Competition management
✅ Round complete screen
✅ Data saving to API
⏳ Web admin interface (Blazor)
⏳ Social feed
⏳ Android device test

The next big piece is the Blazor web interface — the tool for competition admins. The thing that lets you sit at a laptop after a round, enter everyone's scores (including the ones on paper scorecards), confirm the handicap adjustments, and post the results to the group.

That's what makes this genuinely useful for groups like ours.


No Golf in Kos. Plenty of Progress.

I came back from Kos without a round of golf played. My swing is no better. The padel was good though.

I came back with a working scoring app, working authentication, working competition management, and a clearer sense of what needs to be built next.

That's a decent week.

For the love of the game. 🏌️☀️


Follow the journey: Blog: thechandiman.com Instagram: @the_chandi_man Threads: @the_chandi_man X: @thechandiman1