Methodology
How the fishing-day score works
What goes into each score, where the data comes from, and what we deliberately don’t do.
The score, in plain English
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).
Season status (in-season vs closed)
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.
Why we don’t lead with solunar tables
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.
Limitations
- 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
lastVerifiedISOdate. 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.