doruk.ch
· 5 min read

how a side project about table tennis won a startup award

I wanted better stats for Swiss table tennis. So I built TTStats — tracking 5,500+ players and 69,000+ matches. Then it won 2nd place at a startup award.

startupkotlinnextjssportsopensource

TTStats

i host table tennis trainings. i play competitively in the Swiss league. and for years, i was frustrated by the same thing: the data existed, but you couldn't do anything useful with it.

the problem

the Swiss table tennis federation tracks everything — match results, player rankings, club standings, tournament brackets. thousands of data points generated every season.

but the data was buried in websites that looked like they were designed in 2005. slow, clunky, impossible to navigate on mobile. want to check your ranking? five clicks. compare yourself to your last opponent? good luck. see your win rate trend over a season? not a chance.

the data was there. the tools to use it weren't.

building TTStats

so i built TTStats.

the concept is simple: take the publicly available Swiss table tennis data, structure it properly, and build a modern interface that lets players actually use it.

the numbers today:

  • 5,500+ players tracked
  • 69,000+ matches indexed
  • 249 clubs across Switzerland
  • 1,200+ monthly active users

what you can do:

  • look up any player in Switzerland and see their full match history
  • compare head-to-head records between any two players
  • track ranking progression over time with charts
  • browse club rosters and team standings
  • search and filter across the entire dataset

the tech journey

the project started as a web app and grew from there.

v1 — next.js web app. the first version was a straightforward next.js application. server-side rendering for fast initial loads, client-side interactivity for searching and filtering. this is still the primary platform at ttstats.ch.

v2 — native mobile apps. players kept asking for a mobile app. checking stats at tournaments is a mobile-first activity — you're standing by a table, your next opponent just got announced, and you want to see their match history right now.

i built native iOS and Android apps using Kotlin Multiplatform. shared business logic across both platforms, native UI for each. one codebase for the core, platform-specific code only where it matters (UI, navigation, platform APIs).

the apps are live on the App Store and Play Store.

API analytics. i run a public Grafana dashboard for API analytics. request rates, response times, error rates, usage patterns. it's useful for monitoring and also for showing potential partners that the platform is real and actively used.

the startup award

here's where it gets interesting.

i entered TTStats in a Swiss startup competition, mostly to force myself to write a proper pitch and business plan. i didn't expect much — it's a niche product for a niche sport in a small country.

it won 2nd place.

the judges liked that it solved a real problem for a real community, had organic traction (1,200+ monthly users with zero marketing budget), and demonstrated a clear technical path from web to native. the fact that it grew entirely through word of mouth at tournaments was, apparently, a strong signal.

growing through community

TTStats never had a marketing budget. no ads, no influencer partnerships, no growth hacks. it grew the old-fashioned way: someone used it at a tournament, showed it to their opponent, and that person showed it to their club.

this is the advantage of building for a community you're part of. i'm at tournaments. i'm at training sessions. people see me using the app, ask what it is, and try it themselves. if it's useful, they keep using it. if it's not, they tell me why.

the feedback loop is incredibly tight. someone says "i wish i could see my win rate against left-handers" at practice on tuesday, and by friday there's a filter for it. try getting that turnaround time from a product team at a big company.

the key insight

the best products come from being a member of the community you're building for.

i didn't build TTStats because i saw a market opportunity. i built it because i wanted better stats for my own matches. every feature started as something i personally wanted. the product-market fit was automatic because i am the market.

this isn't a new insight — it's the classic "scratch your own itch" philosophy. but it's true in a way that's hard to appreciate until you experience it. when you use your own product every day, you can't ignore the rough edges. when your users are your training partners, you can't hide behind metrics — they'll tell you to your face if something sucks.

what's next

TTStats keeps growing. more features, better data coverage, tighter integration with official federation systems. the mobile apps are getting regular updates based on tournament-season feedback.

the long-term vision is to make TTStats the default way Swiss table tennis players interact with their stats. not by being the biggest or the most well-funded, but by being the most useful.

1,200+ monthly users. 69,000+ matches. 2nd place at a startup award. and it all started because i wanted to check my ranking without clicking through five pages.


ttstats.ch | App Store | Play Store

On this page