Consumer Mobile / Web
Swipe Match Pal
A full-stack group decision-making app that helps groups make shared decisions more fairly by hiding option ownership until voting is complete.
Swipe Match Pal is a full-stack group decision-making app that helps groups make shared decisions faster and more fairly by hiding option ownership until voting is complete.
Problem
Group decisions in chats are slow, biased, and often influenced by who suggested each option. Swipe Match Pal turns the decision into a private board where participants add or receive options, swipe privately, and reveal results after voting closes.
Users
Board creators and invited participants deciding where to eat, travel, meet, or choose among shared options.
My Role
Prajesh designed and built the Django REST Framework backend for board lifecycle, participants, options, swipes, results, authentication, invite links, device sessions, and AI-generated options. He also built the Flutter client across iOS, Android, and Web, integrated deep links, and deployed the product to a VPS.
Architecture
The client is a single Flutter codebase shipped to iOS, Android, and Web, talking to a Django REST Framework API backed by PostgreSQL. Authentication is passwordless — a magic-link / OTP flow issuing JWT access and refresh tokens per device. Boards use a secret-token plus short-code invite model so participants can join without an account lookup. Option generation can be assisted by OpenRouter, and uploaded media persists in Azure Blob Storage. The backend deploys to a self-managed VPS behind nginx and Gunicorn, supervised by systemd, with GitHub Actions handling the deployment workflow.
Key Features
- Private board creation with short code and secret token
- Participant joining through invite links
- Blind swipe voting on option cards
- Participant and AI-assisted option submission with quotas
- Server-computed results after close
- Attribution reveal only after voting closes
- Passwordless magic-link / OTP authentication
- JWT access and refresh sessions
- Device-level session listing and revocation
- iOS Universal Links and Android App Links
- Open Graph invite preview cards
Technical Decisions
- Used PostgreSQL constraints to enforce one swipe per participant/option and one participant per session
- Used transaction.atomic and update_or_create for race-safe AI quota increments and swipe upserts
- Used select_related, prefetch_related, and annotate to reduce N+1 query patterns on hot paths
- Chose polling instead of WebSockets as an intentional MVP tradeoff
- Used Flutter Dismissible to build a custom swipe interaction instead of relying on a third-party swipe package
- Used deterministic AI fallback behavior for local/offline tests
Tradeoffs
- Polling was chosen over WebSockets to reduce MVP complexity and keep the product easier to ship and maintain initially
- The deployment workflow automated release steps but did not gate deployment on the full test suite yet
- Push notification infrastructure was not shipped; board notification data exists but push sending remains a future improvement
- The first version prioritized secure private-board workflows and result correctness over advanced social features
Security, Reliability & Testing
- Secret-token plus short-code invite flow to reduce enumeration risk
- Scoped DRF throttling for login, join, and AI-generation endpoints
- Server-enforced hidden attribution until reveal
- JWT access/refresh tokens with per-device session tracking and revocation
- PostgreSQL UniqueConstraints for voting and participation correctness
- transaction.atomic for race-sensitive quota and swipe logic
- 2,300+ lines of DRF APITestCase coverage for participant limits, join security, swipe idempotency, hidden/revealed results, and quota race conditions
Deployment
- Deployed Django backend to a self-managed VPS
- Used Gunicorn, nginx, and systemd
- Used GitHub Actions for SSH-based deployment
- Built Flutter web in the deployment workflow
- Used Azure Blob Storage for media persistence where evidenced
- Important caveat: tests exist but deployment is not yet CI test-gated
Outcome / Current Status
Swipe Match Pal was shipped as a production product across iOS, Android, and Web, demonstrating end-to-end product ownership across backend architecture, mobile/web client delivery, authentication, AI integration, deep linking, deployment, and product correctness.
What I'd Improve Next
- Gate deployment on the automated test suite before release
- Add stronger observability and error tracking
- Consider WebSockets or server-driven updates only if real-time collaboration becomes necessary
- Improve onboarding analytics around invite conversion
- Expand notification behavior carefully without overcomplicating the MVP
- Add richer admin/reporting tools for board activity