
Padel Play — Court System & Website for Padel Atelier
( Role )
Full-stack, firmware & hardware developer
( Scope )
- System architecture
- The NestJS API
- Database and real-time layer
- The staff dashboard
- Court screen and phone setup flow
- The Playtomic integration
- The Vega OS TV app
- The Raspberry Pi buzzer bridge
- ESP32-S3 firmware and the two-board PCB in KiCad
- The test suites and the setup guides for the venue
- The club's website
( Stack )
- NestJS
- Prisma
- PostgreSQL
- Socket.IO
- Next.js 16
- Playtomic API
- React Native (Vega OS)
- Python (Raspberry Pi)
- ESP32-S3 · PlatformIO
- KiCad
- Playwright




( Brief )
Padel Atelier is an indoor padel club in Lauenburg/Elbe with three doubles courts and one singles court. Matches used to be scored by hand and courts run from a tablet. I built Padel Play to take that over: a NestJS API with PostgreSQL and Socket.IO at the centre, a Next.js dashboard for staff, a court screen for every court, a phone flow for players, and the buzzers that score the points. I also built the club's public website, atelierpadel.de — it closes this page.
( Approach )
An idle court shows a QR code on its TV. A player scans it, adds names, drags them onto the court, picks the format — sets, golden point or advantage, super tiebreak, first serve — and starts; the court screen takes over the score. Points come from a buzzer on the court: an off-the-shelf USB buzzer through a Python bridge on a Raspberry Pi, or my own ESP32-S3 hub, where holding a zone 2–5 seconds scores and longer undoes. Court screens run on Fire TV Sticks with Vega OS, so I wrote a small React Native app that locks the TV to its court page, recovers it after failures, and keeps the screen awake. Bookings come from Playtomic, so the screen can count a booking down.
Staff get one colour per job: courts, Court Health, history, players and court management. Court Health judges every court from evidence — is the player QR live, is the court linked to Playtomic, is its screen online and showing its own court, is the Pi reporting, is the buzzer connected and are its four keys mapped — and has the tools to pair and test each piece before opening.



( Challenge )
Everything at a court has to recover on its own — nobody is there to press a remote. Devices are scoped to their own court by token, so a buzzer or screen can never touch another court; the TV app reloads its page after failures and holds off the screensaver; matches left running are closed by the next booking's players; and the same score must reach the TV, the dashboard and the phone at once. It is held together by hundreds of automated tests: backend unit and end-to-end suites, dashboard unit tests and more than 400 Playwright tests across the dashboard, court screen and phone.
( Responsibilities )
System architecture, the NestJS API, database and real-time layer, the staff dashboard, court screen and phone setup flow, the Playtomic integration, the Vega OS TV app, the Raspberry Pi buzzer bridge, ESP32-S3 firmware and the two-board PCB in KiCad, the test suites and the setup guides for the venue, and the club's website.

( The club website )
Padel Atelier's four indoor courts in Lauenburg/Elbe are found and booked at atelierpadel.de. The German site is built around the club's own look — the court blue, OPTI Copperplate and a thin grid running through every page — and its home page does the main job: the Playtomic booking calendar, with the cheaper weekday hours from 07:00 to 16:00 shown at a glance.
( What’s in it )
Around it: a Gutschein shop for vouchers of 10, 30 or 50 € or any amount up to 500 €, paid through Stripe and sent as a code by e-mail; Events & Feiern with a request form for company parties, team events and birthdays; partner pages for Epassi, Wellpass and Wellhub and the club's own membership; directions from the surrounding towns; a magazine; a newsletter with double opt-in through Brevo; and the German legal pages. GSAP and Lenis carry the motion.
Role: Designer & Frontend Developer. Stack: Next.js 16, GSAP, Lenis, TanStack Query, Stripe, Brevo, Playtomic.





