Home
Research
Blog
Portfolio
Resume
software

Rally

Ahnaf An Nafee

Ahnaf An Nafee / June 20, 2026

Play StoreWebsite

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.

Rally project cover

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.

Play Rally

Free on Android.

Google PlayWebsite

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-api proxy 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

The Rally map screen showing nearby court markers with open-court counts, a sport selector, and filter chips for free now, lights, and surfaceTapping a court on the Rally map to see its live card with address, court count, lights, and free status before heading overA Rally pickup game with an open slot, a share invite link, and a GPS check-in button that verifies attendance and pays out pointsA Rally player profile showing rank progress from Rookie to Scout, a live season tally of Aces and streak, a badge pin board, and saved courtsRally's Follow tab showing a happening-now tournament, an upcoming league, recent match results, and the latest headlines for the selected sportThe Rally sport picker listing tennis, pickleball, soccer, basketball, baseball, and football with the number of courts and fields mapped for each

See it at rally.ahnafnafee.dev.

Edit on GitHub

ME

HomeResearchBlogPortfolioResume

SITE

AboutContactPrivacy PolicySecurity Policy

SOCIALS

connect with me:EmailLinkedInGitHubGoogle ScholarORCIDItch.ioArtStationBehanceFacebookInstagram

© 2026 - All Rights Reserved