← Back to Tomorrow’s Bet

How the call gets made

One spot. One window.
One number.

Every night the app makes one call for tomorrow morning. This page is the shape of that call, the discipline behind the number, and what you can expect from it on a cold Tuesday in October.

Instead of five tabs

Everything worth reading, read for you.

Charts, tide, temperature, what the water is doing, what the fleet is doing, what you did last September — every variable a captain normally juggles in his head. Most mornings a captain opens five tabs and squints.

The app opens all of them before you wake up, weighs them against each other, and compresses the answer into one line on the Bet card. You’re not losing information. You’re losing the hour before sunrise spent chasing it.

Not a dashboard. Not a feed. A synthesis.

The old morning

  • 04:12 — open Navionics, scroll to last week’s ledge
  • 04:17 — check tide chart, do the math
  • 04:21 — pull up SST, look for breaks
  • 04:28 — scan marine traffic, guess at the fleet
  • 04:35 — weather, wind, swell
  • 04:42 — shrug, pick a spot, hope

The new morning

  • 04:12 — open app
  • 04:12 — engine on

The shape of the call

Four lines on one card.

The Bet card is the product. Everything upstream of it is our problem, not yours. What you get is four lines, in this order, every morning.

A strong call

Jeffreys Ledge SW · 72% · 5:45 – 8:15 AM · 58m

  • The spot. Named piece of water. Not a bounding box. Not a heat map. Somewhere you can point the bow at.
  • The number. A calibrated confidence. 70% means captains who followed calls of that strength came home with fish seven times out of ten. Recalibrated weekly against your own log so it doesn’t drift.
  • The window. When to be on the spot. Tied to light, tide, and the hour the bite has historically moved.
  • The depth. Because you asked before you asked.

The five factors

The fleet’s been telling you for years.

Each factor returns a 0–1 score for every hexagon on the chart. We blend them with these weights. No black box — just the five things we weigh, where they come from, and why we trust them in that order.

01

Pro activity

40%

Whale-watch captains, charter fleets, spotter pilots — the people who earn their living reading bait. Where their AIS and ADS-B tracks loiter at slow speed is where the fish are. Dwell time in each hex over the last 72 hours becomes the heat under tomorrow's call.

Source: AIS stream (Fly.io worker, 24/7) · ADS-B polling (Vercel cron, every 2 min)

02

Structure

20%

Bathymetric contours and ledge edges. Bait piles where the floor rises. Pipes, wrecks, and bottom type stay put — they're the one factor that doesn't change overnight.

Source: NOAA ENC charts (PMTiles, offline-cached) · GEBCO 2024 bathymetry (30 arc-second)

03

Environment

20%

Tide stage and current direction at your port. Sea-surface temperature breaks and fronts. Wind and swell direction. Water clarity proxied from cloud-free SST pixels.

Source: NOAA CO-OPS tides (30 min refresh) · NOAA MUR SST (12 h) · VIIRS chlorophyll-a (daily)

04

Your history

15%

Every trip you log sharpens the next one. By October the app knows what was working for you in May, which is more than most notebooks do. Fully private — your trip log never leaves your squad.

Source: Your trip log · IndexedDB (offline) + Postgres (synced when signal returns)

05

Squad history

5%

What your squad caught, corrected, and where they parked. Opt-in, tight-loop, no outside visibility. Small weight because a squad of four is four data points — important to you, statistically humble.

Source: Squad broadcasts + shared pins (expires on 5-min TTL or user-set)

Confidence — what the number means

70% means 70%.

The percentage on the Bet card is a calibrated score: 70% means that across the last 1,000 calls of that strength, roughly 700 captains logged a catch. We recalibrate weekly against your trip log so the number doesn’t drift. If we don’t have enough signal to clear 55%, the card tells you so — we’d rather be honest than cheerful.

The pipeline

Signal in. Number out. Every night.

  1. Step 1

    Ingest

    AIS vessel positions stream 24/7 from AISStream.io into a dedicated worker on Fly.io (Portland region). ADS-B aircraft positions poll every 2 minutes from adsb.lol via a Vercel cron. Both filter to the Gulf of Maine bbox before a single row touches Postgres.

  2. Step 2

    Aggregate

    A nightly Postgres job rolls positions into H3 hex aggregates (resolution 7, ~1.2 km edges) with dwell-time, speed distribution, and species tags for known pros. The hex grid is the instrument — not the individual tracks.

  3. Step 3

    Score

    At 22:00 local, the engine scores every active hex across the five factors. Weights, the confidence calibrator, and a personalization shrinkage factor run server-side; the raw inputs stay on your device for privacy.

  4. Step 4

    Serve

    The map and Bet card fetch from /api/map/assets and /api/predictions. Realtime updates for live vessels and hex scores ride Supabase channels. Dock Sync pre-caches everything you need for tomorrow before you lose signal at the breakwater.

The stack

Picked for the captain, not the conference.

Every piece is here because it earns the cabin space. Boring choices where boring is right; specialised pieces (PMTiles, H3, PostGIS) where the marine-data shape demands it.

LayerChoice
FrontendNext.js 16 · React · MapLibre GL
StateZustand + Dexie (IndexedDB)
OfflineWorkbox service worker · PMTiles
DBPostgres 16 · PostGIS · H3
RealtimeSupabase Realtime · pg_cron
AIS workerNode 22 · tsx · Fly.io (PDX)
HostingVercel · GitHub Actions
AuthSupabase magic link · allowlist

The discipline

We’d rather be honest than cheerful.

When the app has enough conviction to stake a number, it does. When it doesn’t, it says so — plainly, with no hedging and no filler. An empty answer is still an answer.

Every trip you log tightens the call for you personally. The season compounds. Your October call is not your May call, and both are sharper than they were a week before.

Nothing the app shows you is invented. Every number has a receipt. If you ever want to see what went into a specific call, the “Show me why” panel on the Bet card breaks it down inside the app.

When the bars drop

Offshore is just the next tab.

One tap before you leave the dock — Dock Sync — and everything you need for the day rides along with you. The map stays sharp, trip logging keeps working, the number at the top of the Bet card is the same one you saw at the dock.

When bars come back, everything syncs in the background. No conflicts. No lost entries. No “please refresh.”

What it isn’t

Three things we don’t do.

  • It’s not a navigation app. Cross-reference NOAA ENC charts and weather services before heading offshore. Always.
  • It’s not a social feed. Your trips, your squad, your data. No outside eyes, no rankings, no posting.
  • It’s not a guarantee. We don’t fill the cooler. We narrow the morning.