All work

PWA — Local Directory

On Island

Mobile-first PWA local business directory for St. Thomas, USVI.

On Island preview

The problem

Generic directories (Yelp, Google) aren't tuned to a single island. A cruise visitor in port for the day, a snowbird who lives there half the year, a villa renter for a week, and a year-round local all want different things from the same map — and they care about signals the big platforms ignore: which cruise ships are in port, what the beach conditions actually look like, what's still open after 8pm in the off-season.

The solution

A mobile-first PWA that recognizes who you are — traveller, local, villa owner, or snowbird — and reorders the home screen, category grid, and emergency strip to match. A daily Island Brief bakes cruise-crowd data, weather, and beach conditions into the front page. Business owners self-serve their listings; admins moderate from a parallel portal. Supabase handles auth, storage, realtime, and row-level security as the single source of truth.

Highlights

  • Four distinct user types — traveller, local, villa owner, snowbird — each with a personalized home, category order, and emergency strip
  • Mobile-first PWA — installs in two taps from the browser, no app-store gate for one-week visitors
  • Daily Island Brief — cruise crowds + weather + beach conditions, refreshed on a cron
  • Full-text menu search across uploaded PDFs and images — PDF text layer first, Google Vision OCR fallback, indexed in Postgres
  • PostGIS-backed Mapbox map — business pins, service-area polygons, admin-curated beaches and emergency stops
  • Stripe subscriptions + premium emergency-strip slot bookings with seasonal pricing and a 90-day founding-member trial
  • Three auth realms (user / business / admin) with role injected into the JWT via a custom Supabase access-token hook — RLS is the primary permission layer

Stack

Next.jsReact NativePostgreSQLPostGISSupabase

Integrations

MapboxStripeResend

Need something like this?

I'm taking on a small number of new projects each quarter. Let's talk about what you're building.

Start the conversation