In progress

Padel Cup

Real-time tournament management for padel clubs

Tech stack

Next.jsTypescriptPostgreSQLSupabaseTailwindCSS

What is it

PadelCup is a lightweight web app for running a padel tournament on the day. It's built around two roles, players and admins, with no sign-up required for either.

Players open the app, type a short code, and see everything they need: their next match, the court, who they're facing, their current standing, and the full schedule. Admins log in separately to enter results and advance the bracket. No spreadsheets, no WhatsApp threads, no manual tallying of points.

The app was built for the Padel Cup at my club, a one-day, 120+ player tournament across 9 courts and 8 categories, but the structure is general enough that most padel clubs could adapt it for their own event.

How it works

Player view

Players get a personal code at registration (two initials + a two-digit number, e.g. JG07). They enter it on arrival and land on their dashboard: next match with court and time, current position in their group, points, game difference, and a progress indicator showing how many matches they've played. A calendar below lists all their matches, past results and upcoming fixtures, across every category they're entered in. There's also a read-only finals bracket updated in real time as semis and finals play out.

Admin view

Admins use a shared login to access a separate interface. From there, they can enter match scores (with a confirm step before saving), reset a result if something was entered incorrectly, and advance the bracket through three phases: compute group standings and confirm qualifiers → run semis and confirm finalists → run finals. Each phase can be reset independently.

A few decisions worth explaining

Code-based login. Players don't create accounts. A short code is enough to identify them and show them the right data. It removes all friction at the moment when friction hurts most, players arriving at a tournament just want to know which court they're on. No email, no password reset, no "check your inbox."

Admin/player separation. Results are entered by tournament staff, not by the players themselves. That keeps standings trustworthy, no disputes, no accidental edits. The admin interface is a different route with proper session auth, completely separate from the player experience.

Supabase as the backend. It handles the Postgres database and real-time subscriptions in one place, with a straightforward API. For a project at this scale, it's the right tradeoff: no infrastructure to manage, first-class TypeScript support through Drizzle ORM, and a free tier that covers the full tournament day comfortably.

Tech stack

  • Framework: Next.js 16 (App Router, Turbopack)
  • Language: TypeScript (strict mode)
  • Database: Supabase (Postgres + Realtime)
  • ORM: Drizzle ORM
  • Auth: better-auth (admin sessions — players use a code)
  • Styling: Tailwind CSS v4 + shadcn/ui
  • Validation: Zod v4 + react-hook-form

What's next

The current version is built around one tournament's specific rules — 8 categories, each with their own group sizes, qualification logic, and match durations. The next step is making those configurable. Any club should be able to set up a tournament by filling in courts, categories, group sizes, and point rules, without touching the code. That's the version worth releasing publicly.