● SIDE PROJECT · 04
MatchYard
Status · Pre-launch · App Store–ready
Year
2026
Role
Solo build
Focus
- Full-stack
- Native iOS
- Geospatial
(01) Context
MatchYard is the app I wanted to exist: open it, see people nearby who want to play the same sport at your level, and message them. I designed the product and brand, then built all of it — a native SwiftUI client, a TypeScript backend, and the infrastructure under both — and deliberately moved it off hosted BaaS onto a first-party stack I actually control.
The problem
A find-people-near-you app lives or dies on two things most weekend projects skip: location queries that are fast and safe, and an auth system you'd actually trust with strangers meeting in person. Both had to be production-grade before a single user signed up.
(02) Approach
- 01
Native client, stateless backend
SwiftUI on iOS 17 (MVVM, 18 service layers, async/await throughout) against a stateless Express/TypeScript API. PostgreSQL 16 + PostGIS holds the spatial data, Redis backs rate limiting, and the schema evolves through a custom versioned migration runner.
- 02
Auth from scratch
First-party JWT auth — access plus rotating refresh tokens, bcrypt, Sign in with Apple over ES256/JWKS, email and SMS OTP — replacing the third-party dependency it started on. Device tokens live only in the Keychain, and a single-flight refresh coalesces parallel 401s into one request so concurrent calls can't race.
- 03
Geospatial discovery, safety-aware
Nearby-post queries run on PostGIS with keyset pagination instead of offset scans, and they exclude blocked users in both directions, your own posts, and closed posts — safety baked into the query, not bolted on after.
- 04
Graceful AI matchmaking
The Claude API scores candidate matches 0–100, but a deterministic heuristic — sport overlap, skill, distance, availability — keeps matching working if the model is ever unavailable. No hard dependency on the LLM.
- 05
Owned the whole pipeline
Multi-stage Docker and docker-compose (Postgres/PostGIS, Redis, API) with healthchecks, GitHub Actions running integration tests against real services rather than mocks, and a Fastlane → TestFlight pipeline. Redis-backed tiered rate limiting, Zod validation, IDOR ownership checks, content moderation, and an audit-logged admin panel round out the hardening.
(03) Outcome
A pre-launch, App Store–ready product — legal, privacy labels, account deletion, and TestFlight pipeline all in place — backed by 529 tests that run against real Postgres and Redis on every push.
~38K
lines, app + backend
529
automated tests
App Store
submission-ready
Next case
Even G2 Glasses →