Skip to content
Toothhound

Methodology

How the Hunt Score is calculated.

The Hunt Score is a 0–100 forecast of how productive a tooth-hunting beach is likely to be on a given day. It is not a guarantee — it is a calibrated heuristic built from public, auditable data sources.

Inputs

  • NOAA CO-OPS — predicted tide extremes (high/low) and harmonic curves for the nearest tidal station.
  • Open-Meteo — hourly wind speed, gust, and bearing for the site coordinates.
  • SunCalc — sunrise, sunset, and lunar phase derived from the date and lat/lon.
  • NDBC buoys (where available) — significant wave height for storm exposure.
  • Site dossier — score model (tidal-beach, river-low-water, spoil-pile, inland-creek), good wind direction, and access type.

Components (tidal-beach model)

Each row below is an additive component of the daily score, with its exact maximum in points. The sum is then multiplied by a storm modifier (1.00–1.30×) and an event boost is added on top, then the result is clamped to 0–100. Every per-day score on a location page exposes the same numbers in the “Show the math” toggle so you can verify by hand.

Tide range

0–50 pts
Day’s max-high minus min-low. Linear ramp from 0 ft (0 pts) to 6 ft (50 pts), saturated above 6 ft.

Spring-tide proximity

0–15 pts
Exponential decay from the nearest new or full moon, half-life 3.5 days. Within ±2 days of syzygy you get nearly the full 15 pts.

Daylight window

0–15 pts
Smooth Gaussian curve centred on golden hour (~1.5h after sunrise). Daylight floor 0.4 × max so a noon low still scores well; night lows still get a small floor (1.5 pts) because some hunters use lights.

Recent stir

0–10 pts
Past-72h average onshore wind speed, projected onto the site’s good-wind direction. Only counts hours that actually happened — forecasts of past wind are ignored.

Wind setup at low

−10 to +10 pts
Forecast wind during the ±4h low-tide window. Offshore wind drains water (more beach, +pts); onshore piles it up (less beach, −pts). The vertical setup is approximated as ~0.04 ft per mph of sustained wind, clamped at ±2 ft.

Surf bonus

0–5 pts
Recent significant wave height. 1–4 ft = clean sorting (3–5 pts); >7 ft = unfishable (0 pts).

Recent rainfall

0–3 pts
Past-48h precipitation. Heavy rains flush creek and inlet material onto the strand. ≥0.1\" = +1, ≥0.25\" = +2, ≥0.5\" = +3. Smaller weighting than cliff-beach, where clay slumps drive output (max +12).

Storm multiplier

×1.00–1.30
Multiplicative on the component sum. Triggered by peak gust thresholds: >25 mph = 1.15×, >35 mph = 1.30×. Reflects the post-storm churn that uncovers buried material.

Event boost

+0 to +25
Hand-curated events plus auto-generated signals (drought, flood watch, dredge cycle). Capped at +25 and, for cliff-beach sites, scaled down on drowned-beach days so a manually curated +15 doesn’t override the wind telling us nobody can hunt.

Other site models

  • river-low-water — gauge level + recent rainfall instead of tide. Best when water is dropping and gravel bars emerge.
  • spoil-pile — dredge or quarry sites. Tide-independent. Penalizes high-wind dust days, slight bonus after heavy rain rinses fresh material.
  • inland-creek — small drainages where exposure depends almost entirely on recent storm flows. Bumps after rain, fades with drought.

What the colors mean

85+
Prime window
70–84
Strong
55–69
Workable
< 55
Off-day

Reliability tiers

Each site advertises how trustworthy its live score is:

  • full — NOAA tide station + Open-Meteo, all model inputs available.
  • partial — model runs but one input is approximated (e.g. nearest buoy > 50 km away).
  • dossier-only — global heritage / inland sites with no live oceanographic data. The dossier is real; the daily score is a baseline placeholder.

Not currently in the model

Transparency goes both ways — here is what we deliberately don’t use today, and why:

  • Hunt pressure (info-only). The number of hunts logged at a site in the past 7 days is shown as a chip on each location page, but does not change the score yet. We need more volume per location before a penalty would be statistically meaningful.
  • Wave period and swell direction. We use significant wave height only. Open-Meteo doesn’t expose period reliably for most sites.
  • Barometric pressure trend. A falling barometer is an early storm signal, but our existing wind-based stir already captures the same effect once the wind arrives.
  • Water temperature, clarity, salinity. Affect comfort and snorkel visibility, not (directly) what teeth wash up on the beach.
  • Weekday vs weekend. A 70 on Tuesday is often better in practice than a 70 on Saturday because of crowds, but we don’t adjust for that.
  • Beach renourishment. Fresh sand buries everything. Captured only when an admin logs a manual event — there’s no auto-detection from satellite imagery yet.

Open source & auditable

The full scoring implementation lives in src/lib/huntScore.ts in our public repository. If you spot an error or have a calibration suggestion, file an issue.

Calibration is ongoing. We compare predicted scores against logbook outcomes (when users opt in) and adjust weights quarterly.

Last reviewed: April 2026