BetPulse

Live

Watches two bookmakers side by side and surfaces the price gaps while they still exist.

Stack
Go, Redis, PostgreSQL, Next.js, TypeScript, Docker
Role
Zero to production — backend, dashboard, browser extension

Bookmakers price the same match differently. When the gap between them is wide enough, you can back both sides and keep the difference whoever wins. BetPulse finds those gaps automatically and puts them on a live board before they close.

How it works

Four stages, all automatic:

  1. Watch — every fixture at both books is re-read on a fixed cycle; games already in play are checked more often.
  2. Match — the same game is spelled differently at every bookmaker, so team pairs are resolved once and cached permanently.
  3. Compare — odds across matched markets are checked for a gap worth taking.
  4. Publish — hits land on a live board, stream to the browser extension, and are kept in history.

Architecture

Two Go binaries that share nothing but Redis. The monitor scrapes, matches and computes — it has no HTTP surface at all. The server is read-only: API, auth, admin, and a server-sent-events stream. Redis holds the hot state with TTLs so stale opportunities expire on their own; Postgres keeps the team-pair identity cache and the permanent opportunity history.

The split means the scraper can be restarted, rate-limited or taken out of hours without touching the thing users are looking at.

The extension

A Chrome MV3 extension consumes the same event stream and places the bets — driving the UI on one book and calling the API directly on the other. Every selection carries a reference that has to survive the whole pipeline, from parser to outcome to bet leg, or the extension has nothing to click.

Operating notes

The monitor is gated by operating hours: outside them every scraper goroutine is cancelled and the pool empties, so zero opportunities is the correct answer, not an outage. Proxy lists reload on a signal, without a restart.

© 2026 Karol Welc. All rights reserved.