Rallymate
An iPhone app where friends log padel doubles set by set and get a league table nobody can argue with.
- Status
- In development · TestFlight soon
- Role
- Solo — product, design, iOS and backend
- Period
- Oct 2026 – now
- Platform
- iPhone · iOS 26
- Stack
- SwiftUI · Liquid Glass · MVVM · Swift Concurrency · Supabase · Postgres
Problem
When I play padel with friends, results get lost. Nobody remembers who won what, and a league table kept from memory is always up for debate.
Rallymate gives a group of friends one place to log doubles matches. An opponent confirms each match, or it confirms itself after three days, so the table only counts results both sides accept. It's also my way into iOS: a real app for the App Store, on a fixed eight-week plan.
What I built
- Groups with an invite code, each with its own league table. A player can be in several groups.
- Doubles matches logged set by set, with guests who don't have an account, as long as each side has one registered player.
- Confirm or dispute: the opponents get the match to review; a scheduled job confirms it after three days.
- Player profiles with stats across groups: win rate, current streak, best partner.
- Account deletion that anonymises the player and keeps their matches valid for everyone else.
Decisions
The app never writes a match or a group membership directly.
Every change goes through a Postgres function that checks the rules (create, confirm, dispute, join with a code), and row-level security shows each player only their own groups. A modified client can't confirm its own match or join a group without the code.
League tables and stats are computed in SQL, never stored.
Rankings come from views and functions over confirmed matches. When a match is edited, deleted or disputed there is no stored total to fix, and the ranking rules live in one place, covered by pgTAP tests.
Moderation ships in the first release, for App Store guideline 1.2.
The app has user-generated names and photos, so it needs a way to report them and act fast. Players accept zero-tolerance terms at onboarding and can report a groupmate; a database trigger calls an Edge Function that emails me. I designed it with the first schema instead of adding it before submission.
Quality
- 172pgTAP assertions on the database rules, in 14 suites
- 57Swift tests on view models, scoring and photo cropping
- 0write policies on matches and groups — the client can only call functions
How I worked
Spec → tickets → coding agents, every decision reviewed and owned by me. 25 tickets in an 8-week plan where the date is fixed and the scope adapts.
Status and links
- StatusIn development · TestFlight soon
- CodeOn request · public repo soon
- TestFlightSoon