Skip to content
Odd Hours Labs markOdd Hours Labs
← All work
GolfLive

Foresome

Eight booking sites, one search. Every tee time near you, plus partners who fit your game.

  • Next.js
  • TypeScript
  • Prisma
  • Postgres
  • NextAuth
  • Puppeteer
  • Cheerio
Visit Foresome ↗
booking platforms searched in parallel
8
partner compatibility score
0–100
friends + handicap, from one line of feedback to production
Same day
The problem

Tee times are scattered across a handful of booking platforms that don't talk to each other, so finding a round means checking each one. Foresome searches all of them at once, merges the results into one list, and links straight to the source to book. A partner finder and a handicap tracker turn it from a search box into somewhere golfers come back to.

What got built
  • 01Parallel scrapers for 8 platforms, merged and de-duplicated by normalized course name and location
  • 02Partner finder with compatibility scoring, a swipe deck, distance filters, matching and in-app messages
  • 03Friends, hole-by-hole round logging, career stats and an unofficial WHS handicap after 3 rounds
  • 04Email verification, password reset, Google sign-in, and a warm custom identity instead of a template
The hard part

Booking platforms without public APIs

Most tee-time platforms have no public API. Each source got its own scraper: headless Chrome where the page needs JavaScript, plain HTTP and HTML parsing where it doesn't, and Club Prophet's booking API reverse-engineered from scratch to add Seattle, Vancouver, Calgary and Niagara coverage. Every scraper runs at once and failures are isolated, so one slow site never blanks the results.

Not on Google Play yet. Get an email when it is

 

Not on the App Store yet. Get an email when it is

 

Follow the build

Get an email when something ships

A new product, a big feature, a launch date. Nothing else, and you can ask to be taken off any time. Or read the build log (there’s an RSS feed too).

 

Next projectEmmarv →One photo a day with your friend group, ranked head-to-head instead of liked.