Methodology

How the fishing-day score works

What goes into each score, where the data comes from, and what we deliberately don’t do.

Every location–species page computes a 0–100 score that answers one question: given today’s live conditions, how good is this place for targeting this fish? The score starts from a neutral baseline (60) and adds or subtracts points based on twelve factor groups — eleven environmental, plus a recency check against the current state fishing report. An “ideal” day scores 85+; a “skip” day scores under 35. Not every factor applies everywhere: river flow only scores flow-sensitive species, and wave height only coastal and bay locations with a nearby buoy.

The factors the score considers, roughly in order of impact:

  • Water temperature vs species preference — every species has a preferred range and an ideal point. Inside ideal ±3°F is a big positive (+18); outside the active range is a big negative (-30 to -35).
  • Weather — thunderstorms, high winds, active NWS alerts — these are safety-first factors and drive the score down hard (thunder -45, wind ≥25 mph -35, alert -25).
  • Solunar window — a small corroboration only. A feeding window adds a minor nudge (+4) just when it overlaps a tide or moon signal that already favors the species, and nothing on its own. We no longer display the windows or let them drive a verdict (see the note below).
  • Tide phase vs species preference — striped bass and white perch prefer an incoming tide; yellow perch work the slack. A match is +10; a mismatch is -6.
  • Wind speed — a light chop (5–15 mph) is a positive (+8) for many species because it oxygenates the surface and activates baitfish. Calm water and heavy wind both pull scores down.
  • Barometer — fish feed ahead of a falling barometer and slow after a post-front rise. Where a location has a nearby NDBC buoy we use its observed absolute pressure and 3-hour tendency: a sharp recent drop (≤ -1.5 hPa/3h) is a strong positive (+14), a gentler fall +10, a sharp rise -10. Inland, with no buoy, we fall back to the NWS gridpoint hourly pressure forecast as a 6-hour rising/falling/steady trend (+10 / -5).
  • River flow — for flow-sensitive species (trout, river smallmouth, salmon and steelhead), a sharp 24-hour rise means high, muddy, often unsafe water and hurts (blown-out -18, rising -8), while a settled or gently dropping level fishes best (+6 / +4). Driven by the USGS gauge’s discharge trend; inland rivers only.
  • Wave height — at coastal and bay locations with a nearby NDBC buoy: light chop breaks up the surface and helps (+4), building seas hurt (-8), and heavy seas (≥6 ft) make small boats unsafe (-20). Mirrors the wind logic for open water.
  • Moon phase — some species feed harder under a full moon; others go nocturnal and shy during peak brightness. Worth ±8 where the species record specifies a preference.
  • Rain probability — heavy rain (≥70%) is mildly negative; thunderstorms in the forecast are heavily negative.
  • Water-quality advisory — an active MDE or analogue advisory pulls down the score by 10.
  • Recent local report — when the current state fishing report mentions this species near this location, that’s a real “being caught here now” signal and adds +12. It only counts while the report is fresh (the data layer ignores any report more than two weeks old), so it rewards genuine recency, never a stale page. Active wherever a state publishes a parseable report: the Maryland DNR weekly report (region by region), plus the state-level agency reports for Delaware, Indiana, New York, Oklahoma, Oregon, and South Carolina. States whose reports are PDF-only, app-rendered, or absent are linked on-page instead (see below).

The score is a measure of environmental conditions, not a legal go-ahead. Each page also computes whether today is inside an open harvest season for the species–location’s jurisdiction. If harvest is closed, you’ll see a prominent banner and an explicit note that catch-and-release may still be permitted, depending on the specific regulation. Always check the regulations block on the page before keeping any fish.

Closed-to-harvest periods come in three flavors that the page treats distinctly: catch-and-release (you can fish, but can’t keep), no-targeting (you can’t legally fish for the species at all — for example, the MD striped bass August closure, which exists to reduce thermal-stress mortality), and closed (no defined open window covers today under the current rules). Pages display distinct banners so the legal framing is unambiguous.

Most fishing apps put solunar “major/minor” feeding windows front and center. We used to as well, then looked at the evidence. The specific claim — that fish feed predictably in ~2-hour windows when the moon is overhead or underfoot — does not hold up. A peer-reviewed study testing popular solunar tables against recreational catch-per-effort found no significant relationship with any solunar value, lunar phase, or illumination; plain air temperature predicted success better. Studies of largemouth bass have likewise found catch roughly constant across the lunar cycle.

What does have support is narrower: tides are real physics and we score them directly, and lunar phase shows modest, species- and season-dependent effects (most measurable in some saltwater and large-bodied fish). So we dropped the standalone solunar windows from the page and reduced solunar to a tiny tie-breaker that only counts when the tide or moon already points the same way. We’d rather show you fewer, better-grounded signals than a confident-looking table the literature doesn’t back.

  • Inland barometer is forecast, not observed. At coastal and bay locations with a nearby NDBC buoy we use the buoy’s real observed pressure and 3-hour tendency. Inland — with no buoy — the trend comes from NWS gridpoint hourly pressure forecasts (a 6-hour delta classifying rising/falling/steady), which is a model forecast rather than a real-time gauge reading.
  • Report ingestion is limited to parseable feeds. The score rewards a species the current fishing report mentions (+12, freshness-gated). That requires a report we can fetch and parse: Maryland (region by region) plus six states at state level (DE, IN, NY, OK, OR, SC). The remaining states publish their reports as PDFs, JavaScript apps, or bot-blocked pages with no stable machine-readable structure — we link the official report on those pages but don’t parse it into the score. We don’t fold in user-submitted catches at all.
  • Regulation freshness: auto-flagged but not real-time. Every regulation carries a lastVerifiedISO date. A verification script (npm run verify:regs) flags source-page drift; a stale-banner on each page auto-alerts users when regs are > 7 days old. Assume the ground truth is always the state agency.
  • Location-specific rules aren’t fully encoded. Some MD trout waters are catch-and-return by specific water; some VA bass waters have per-river slot limits. The current model treats rules as “per species per jurisdiction per waterbody class” — that covers most but not all cases. Notes fields carry water-specific caveats.
esc