Product & software builds

A statewide discovery app that gamifies 16,000 landmarks.

A cross-platform mobile app turning a 16,000-point historical-marker dataset into a GPS check-in game: PostGIS, badges, streaks.

discovery app
Sector
Consumer / civic mobile
Engagement
Product build
Stack
Expo · React Native · Node · PostGIS
Status
Built · app-store-ready

Context

A statewide dataset of more than 16,000 historical markers existed as a static list: accurate, complete, and inert. There was no way to explore it in the field, no reason to go visit, and no record of who had been where.

What we built

We built a cross-platform mobile app (iOS, Android, and web from one Expo/React Native codebase) that turns the dataset into a location-based game. A PostGIS-backed Node/Express API runs radius queries against the 16,000+ points; the app verifies GPS check-ins and awards points, badges, and streaks over an interactive map. A Next.js admin dashboard manages content, and the whole thing ships through an EAS build and a Docker/Coolify pipeline.

The value

  • Turns an inert reference list into a reason to go outside. A static dataset became an explorable, gamified experience with GPS-verified visits.
  • One codebase serves iOS, Android, and web, so the whole audience is reachable without maintaining three separate builds.
  • The PostGIS backend makes “what’s near me” instant across 16,000+ points, real geospatial querying, not a filtered list.
  • Points, badges, and streaks give people a reason to return and to go further, engagement designed in, not bolted on.
16,000+

landmarks, one geospatial dataset

iOS·Android·web

one Expo codebase

Near-me

instant location search + GPS check-in

Badges + streaks

gamified reason to return

Client name and identifying details withheld by design. Every figure here is drawn from the system we actually delivered.

Your work would get the same discretion.

Tell us what's breaking. We'll tell you whether we've solved something like it. And if we take it on, your name stays yours.

Start with a diagnostic