Make the plan, get everyone there, run it back
SquadSync
A coordination system for gaming friend groups, spanning squads, sessions, expiring invites, ready checks, chat, presence, reminders, recaps, and a one-tap rematch path.
- Clients
- SwiftUI app, widget, Live Activity, Watch, App Clip, and Messages
- API
- Python 3.11 and FastAPI
- Data
- PostgreSQL with Alembic migrations and Redis-backed realtime state
- Hosting
- Containerized backend on Google Cloud Run
The project
What it does
SquadSync replaces the fragile group-chat plan with a structured session that knows who is invited, who is ready, when people are running late, and whether the group wants to play again. Invite codes expire, archived squads revoke outstanding access, and Run It Back turns a finished session into a new one without rebuilding the roster by hand.
The product reaches beyond the main iPhone app. Widgets and Live Activities expose the next session, the Watch can show the plan and send a running-late update, an App Clip previews an invite, and the Messages extension shares squads and sessions. All of those clients converge on the same versioned FastAPI contract.
Built around
Product principles
A session, not a chat promise
Time, roster, readiness, attendance, lateness, chat, and outcome live on one durable object.
Invites with a lifecycle
Codes can expire, cap their use, be revoked, and disappear when the squad is archived.
Realtime where it matters
WebSockets, presence, typing state, voice rooms, push, widgets, and Live Activities keep the plan current.
Run It Back
Completed sessions can become a rematch with the prior group and context already attached.
System architecture
How the system moves
A family of Apple clients shares one API contract. FastAPI services enforce squad, invite, chat, and session lifecycles over PostgreSQL, while Redis and WebSockets handle short-lived presence and realtime coordination.
Invite to after-action recap
-
01 · Surfaces
App, Watch, widget, Clip
Each surface presents a focused slice of the same squad and session model.
-
02 · Client
Swift models and services
Typed requests, auth state, deep links, notifications, and shared extension data meet here.
-
03 · API
FastAPI route contract
Versioned endpoints coordinate users, squads, sessions, messages, voice, safety, and invites.
-
04 · Domain
Lifecycle services
Business rules enforce membership, readiness, expiry, rematches, reports, and account deletion.
-
05 · State
PostgreSQL and Redis
Durable records use migrated relational data; presence and realtime coordination use bounded fast state.
-
06 · Delivery
WebSockets, APNs, Live Activity
Updates return to the group on the screen and device surface that needs them.
Extensions do not invent parallel state. They read shared, scoped projections of the backend session model so a widget, Watch, and phone do not disagree about the plan.
Keep exploring