CASE STUDY

Tennis & padel platform

My own product: a player app, a club-manager app and the real-time API behind both — designed and built solo, to find out whether I could carry a whole product alone.

ROLE
Product, design, frontend, backend
YEAR
2026
STACK
React · TypeScript · Node / Express · WebSockets
LIVE
WORKING PROTOTYPE
Tennis app home with the action sheet open on find a match or reserve a court
Home resolves to two intents: find a match, or book a court.
01THE PROBLEM

Finding a compatible opponent and an available court in Belgrade is spread across phone calls, group chats and separate club systems. Players and clubs need the same information about the same courts, and neither side has it.

02WHAT I DID

Two sides, one state

Both apps share one backend, so a booking made by a player appears in the club’s schedule and drops that court’s availability through the same real-time event stream.

Built solo

I designed and built both frontends and the shared Node API: court booking with multi-slot selection and a running total, matchmaking by rating band and time, and club group chat over REST and WebSockets.

Honest scope

The booking, availability and messaging layer runs. Tournaments, club profiles and parts of matchmaking are high-fidelity prototype UI on mock data, and the player-side confirm is not yet wired to persistence.

03EVIDENCE
Aggregated court availability per hour
Availability aggregated across the club’s courts, served by the shared backend.
Club group chat thread with an admin announcement
Club group chat over REST and WebSockets, with admin announcements.
Club manager schedule showing the booking arriving as confirmed
The same booking arriving in the club manager’s schedule, live.
04WHERE IT LANDED

A working prototype rather than a launched product, built in fifteen days to see whether product, design, frontend and backend could sit with one person. I came back to it later with AI agents to pressure-test the market and monetisation before deciding what to build next.

NEXT CASEPansuara →