Active product

Convoy

Realtime iOS group navigation

Private group sessions with shared map state, route and ETA context, press-to-talk voice, and clear stop-sharing controls. Create a convoy, join by code, coordinate on a live map, and end the session so sharing stops. Stay close, even apart.

Convoy architecture diagram showing iPhone client, session backend, realtime state, MapKit guidance, LiveKit Talk, and privacy guardrails.

What Convoy does

Convoy proves realtime mobile range: private group sessions, shared map state, route and ETA context, and press-and-hold Talk for people driving together without turning the app into public tracking.

How it's built

The system combines a SwiftUI iPhone app, MapKit/Core Location, Supabase session and realtime boundaries, LiveKit voice rooms, privacy-first permission timing, and explicit runtime validation gates.

Tech stack

SwiftUI MapKit Core Location Supabase LiveKit APNs

Case Study

Realtime coordination without always-on tracking

Product problem

Friends driving separately often coordinate through scattered texts, calls, screenshots, and navigation apps. Convoy narrows the problem: a private group deliberately starts a session, shares only the state needed for that drive, and has one obvious way to stop sharing.

Realtime/mobile workflow

  1. Create: start a private convoy session from the app.
  2. Join: enter a short code or open a shareable deep link.
  3. Coordinate: show cars on a shared map with freshness and accuracy state.
  4. Navigate: set an optional destination with route, ETA, and next maneuver context.
  5. Talk and end: use active in-app press-and-hold Talk, then end the convoy to stop sharing.

Architecture

Convoy is structured as a thin native iOS client over managed realtime services. SwiftUI owns the app shell and convoy UI, MapKit/Core Location owns map and location behavior, Supabase owns auth, session state, RLS-protected membership, Edge Functions, Broadcast, and Presence, and LiveKit owns active convoy voice rooms.

Tech stack detail

SwiftUI native iPhone app MapKit overlays & ETA Core Location Supabase Auth Postgres & RLS Edge Functions Broadcast & Presence LiveKit Talk Apple Maps fallback APNs (deferred)

State/API overview

The public-safe model is category-level: convoy sessions, membership, join codes, same-convoy access boundaries, latest member state, optional shared destination, route/ETA context, realtime Broadcast and Presence, user display names, nicknames, car colors, LiveKit room identity, short-lived token issuance, and end-convoy stop-sharing behavior. Raw endpoint specs, table definitions, policies, and source code stay private.

What I built

I shaped the MVP around a deliberately started private convoy, built the deterministic prototype loop, modeled create/join/session state, mapped member identity to car markers, and kept privacy/app review constraints visible while service-backed runtime paths were staged.

Verification

Verification includes prototype journey checks, static milestone scripts, Swift/XCTest source coverage, RLS test outlines, copy and privacy reviews, and explicit blockers for Mac/Xcode, Supabase, and LiveKit runtime validation.

Evidence model

Public proof comes from architecture diagrams, state/API category summaries, prototype walkthrough notes, verification summaries, and interview walkthroughs rather than public source code.

Trade-offs

  • MapKit plus Apple Maps fallback keeps scope smaller than full embedded navigation.
  • Active in-app Talk is simpler and safer than background or lock-screen walkie-talkie behavior.
  • Supabase state and LiveKit voice split realtime coordination from audio transport.
  • No location history by default reduces privacy risk but limits playback/debugging.

Current rough edges

  • Runtime validation still needs Mac/Xcode, Supabase, LiveKit, and device or simulator access.
  • Supabase Broadcast/Presence, LiveKit audio, and Sign in with Apple need full integration testing.
  • Public demo media uses synthetic sessions and map states to avoid sensitive location or identity data.

Roadmap

  1. Wire Sign in with Apple into the beta auth flow.
  2. Connect create/join state to Supabase realtime with same-convoy authorization.
  3. Validate two-device map, destination, route, and end-convoy flows.
  4. Validate LiveKit room join, press/release mute behavior, and convoy-end disconnect.
  5. Finish hosted privacy/deletion URLs and private beta readiness checks.

Media

Product Demo

This product trailer shows the privacy-first realtime coordination loop: create/join, live map state, destination/route context, Town Hall destination, route intelligence, press-to-talk, and end-convoy cleanup.

Demo with synthetic data.