01 · Plan
Plan it before the chat gets noisy.
Venue search, date and time, courts, capacity, booking, and readiness.
Create a game
Set the plan. Share the link.
Full-stack software developer
Full-stack web product · Social sports
Relay gives recreational pickleball groups one place to plan a session, invite players, split court costs, manage rotations, score matches, and save a recap.
Product showcase
Selected product surfaces from the live experience, presented without simulated chrome or scroll-driven effects.




Recreational pickleball groups coordinate the plan, roster, venue cost, court order, and scores across group chats, spreadsheets, and whoever happens to remember what comes next.
A host creates one session and shares a public link. The same workspace holds the plan, roster, venue costs, court queue, match scores, chat, and recap, so the group does not need to reconstruct the night across separate tools.
Product journey · 7 connected features
Relay replaces the scattered chat, spreadsheet, scorekeeper, and payment follow-up with one continuous product flow.
01 · Plan
Venue search, date and time, courts, capacity, booking, and readiness.
Set the plan. Share the link.
02 · Invite
Guest RSVP, host approval, capacity, and an automatic waitlist. Guests do not need an account.
03 · Organize
Roster controls, recurring groups, calendar, global search, and Play Again.
Roster · 8 going · 1 waitlisted Add player
04 · Play
Five play formats, paddle stack, fixed pairs, multi-court scoring, and standings.
05 · Repay
GCash, Maya, bank or cash, proof review, exclusions, and adjusted shares.
06 · Stay in sync
Realtime chat, photos, reactions, system updates, and useful notifications.
Parking is open beside Court 2.
Perfect. I’ll bring the extra balls.
Court 1 match started07 · Remember
Seven portrait recaps, chosen backgrounds, standings, photos, and shared memories.
#2 · +12
wins together
1 Van 3–1
2 AJ 2–2
3 Mika
01 / 07
Next.js Server Components load the initial session state. Server actions and queries enforce authorization and product rules, while small client components handle RSVP, scoring, forms, and live court updates.
Session, roster, payment, match, queue, group, and notification code is organized with its schemas, actions, queries, and interface components.
Mutations validate the signed-in user, session role, lifecycle state, and Zod input before changing data.
Drizzle and PostgreSQL model sessions, players, courts, matches, queues, expenses, chat, and memories with explicit constraints.
Public RSVP, progressive forms, court controls, scoring, and realtime reconciliation run on the client. The rest of the page remains server-rendered.
These decisions affect what users can do, where product rules live, and how the system handles failure or change.
The session owns the plan, roster, expenses, courts, queue, matches, chat, and recap. Users can move through one game without learning separate management areas.
Invitees can check the time, venue, capacity, estimated cost, and booking status, then RSVP by name without creating an account.
Large score controls, deterministic rotations, visible queue state, and focused live views prioritize fast one-handed decisions beside the court.
The live product and public repository provide concrete evidence of the implemented features, architecture, tests, and documentation.