Skip to content
All projects
In developmentMar 2026 – Present

Local Events & Specials App

A mobile app for finding restaurant and bar events and daily specials in the Okanagan Valley, filtered by type, such as karaoke, trivia, or live music, and by day.

The app and its code are private while it is in development.

My role

Independent product. Solo build of the mobile app, backend, admin panel, and data pipeline.

Stack

  • React Native
  • Expo
  • Node.js
  • Next.js
  • Overture Maps (Places)
  • OpenAI API (ChatGPT)
  • Web scraping

Architecture

Ingestion
  1. Overture Maps places data finds venues by city section
  2. Scrape each venue website
  3. ChatGPT extracts specials and events
  4. Structured listings
Freshness
  1. Save each venue's events page
  2. Re-scrape every few days
  3. Updated listings
Apps
  1. Expo mobile app and Next.js admin
  2. Node backend
  3. Listings

Hardest problem: Getting the data in

The app is only useful if it knows about tonight's trivia night and this week's wing special, and no single source lists those. Venues post them on their own websites, in free-form text, with no shared format.

I built an automated pipeline in four steps. Overture Maps places data seeds geographic sections of a city to discover restaurants and bars. A scraper fetches each venue website. ChatGPT extracts specials and upcoming events into structured records. The pipeline saves the page where each venue lists its events and re-scrapes it every few days, so listings stay current without rediscovering the whole city.

Splitting discovery, scraping, and extraction into separate steps means each can be re-run on its own, and an extraction change can be tested against pages that were already saved.

That separation paid off when I changed the venue source. The first version discovered venues with the Google Places API, but its licensing terms and pricing were a poor fit for this app, so I moved discovery to Overture Maps, an open places dataset.

What I'd do next

Tests
Use saved venue pages as fixtures so changes to the extraction prompt can be checked against known-good output before they reach real listings.
Launch
Finish the remaining screens and ship a beta through TestFlight and Google Play internal testing.
Open source the pipeline
Publish the ingestion pipeline as a standalone repository with a diagram, sample output, and the re-scrape schedule.

Links

The app and its code are private while it is in development.

Next case studyBubbas Closet