/LAB/MATCHYARDPORTFOLIO ↗

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