Rally
Ahnaf An Nafee / June 20, 2026
react-native
expo
typescript
supabase
postgresql
serverless
python
A mobile, gamified, crowdsourced map of 1,450,000+ courts and fields across nine sports worldwide, with live free, busy, or full status verified by the players who actually show up. Built on Expo, Supabase, and Cloudflare.

Overview
Rally turns finding a place to play into a game of its own. More than 1,450,000 courts, pitches, fields, and grounds sit on one live map across nine sports, anywhere in the world, and the answer to "is it free, busy, or full right now" comes from the players standing on the court, verified by GPS. Log a check-in, add a court that is missing, or confirm someone else's, and you earn XP, a currency called Aces, levels, streaks, badges, and a spot on the seasonal leaderboard.
What I Built
Rally is a mobile-only app backed by a swappable, self-hostable stack:
- Expo and React Native app for iOS and Android, with a MapLibre map, drag-to-place court creation, a fullscreen picker, and every user-facing string behind typed i18n keys.
- Supabase backend on Postgres and PostGIS: the spatial schema, RPCs, the XP and Aces economy, crowdsourcing with proof-of-presence, rate limits, and row-level security on every table, all covered by a green test suite.
- Cloudflare Workers as the
rally-apiproxy the app always talks to, so the backend can be swapped without an app rebuild, with D1 serving the static court catalog from the edge and R2 holding photos and nightly backups. - A worldwide data pipeline in Python that merges OpenStreetMap (whole planet via QLever), Overture Places, and official open-data censuses into one cleaned, deduplicated seed.
Highlights
- Nine sports on one map, tennis, pickleball, soccer, basketball, baseball, football, volleyball, badminton, and cricket, each with sport-aware attributes.
- Live free, busy, or full status with surface, lights, price, and hours, plus filters for free-now, lights, indoor, and surface type.
- Crowdsourced court adds that publish only once two nearby players confirm on-site, so no photo spam.
- Proof-of-presence check-ins by GPS or a court QR code keep the map honest.
- A full gamification layer: XP, Aces, levels, streaks, earned badges, quests, and Local, Friends, and Global leaderboards.
- Games and groups that auto-fill open slots with nearby players, plus push notifications and deep links.
- A Follow tab with live scores, results, a majors calendar, and per-sport news.
Full Write-Up
I broke down the data model, the proof-of-presence design, and the anti-gaming rules in a dedicated post: Building Rally: A Live, Crowdsourced Court Map That Stays Honest.
Screenshots






See it at rally.ahnafnafee.dev.