Know what to throw, where to cast it, and how to fish it.
Offline-first fishing decision support that teaches the reasoning behind every recommendation.
Current Cast is a mobile-first, installable web app for anglers who can see the water but do not always know what the conditions mean. It turns a few practical observations into a complete field plan: exact tackle, compatible rod and line, rigging, cast target, retrieve depth and cadence, bite detection, hookset, snag risk, and a clear decision about when to adjust or move.
The engine is deterministic and inspectable. It needs no account, makes no AI call, keeps personal records in the browser, and still produces useful advice when weather or water-data services are unavailable.
What you can observe Rules you can inspect A practical field plan
water · cover · wind → compatibility + scoring → lure · rig · cast · retrieve
bottom · weeds · time safety gates + confidence adjust · switch · move
- Quick Recommendation asks eight large, field-friendly questions and takes about 45 seconds. Every question has an unknown choice.
- Advanced Conditions adds access, depth, fronts, fishing pressure, weather, level/turbidity trends, cover severity, observed forage/activity, safety, exact-water legality, and measured or estimated water temperature.
- Freshwater Waters & Access maps and filters verified public waters, kayak and electric-jon launches, docks, parking, and sourced regulations in the 100-mile coverage area around 19317. OpenRouteService road matrices sort and filter by driving distance from the ZIP center or a user-approved phone location, and each access site opens one-tap Google Maps directions; the underlying directory works offline after its first sync.
- Trip Planner saves a water shortlist, compares road time and documented access, builds shore/kayak/electric-jon plans, and prints or downloads a one-page offline trip card. Reviewed float routes keep put-in, take-out, shuttle drive, river mileage, gauge guidance, and hazards distinct.
- On-water mode turns bites, follows, weeds, forage, wind, and no-activity observations into a deterministic one-variable-at-a-time adjustment ladder; unsafe conditions stop the ladder immediately.
- Best Move Right Now returns one primary move, two alternatives, confidence, scored reasons, rig and cast-target diagrams, and choices to avoid.
- Execution plans explain where to stand or position a kayak, the casting angle, splashdown target, lure depth, retrieve rhythm, fair test window, and when to change speed, depth, lure, or location.
- Field learning includes six guided beginner paths for first setup, rods and reels, line, lure families, recurring questions, and a reviewed freshwater buyer guide, plus month-by-month behavior, shore/dock/kayak strategy, plain-language concepts, and illustrated knot steps.
- Your gear, your answer means rods and tackle are editable, hard weight and compatibility limits are enforced, and optional coverage gaps never become a sales pitch.
| Decision | What Current Cast explains |
|---|---|
| Tackle | Exact lure or bait, size, weight, color, hook or jighead, rod, line, and leader |
| Rig | A plain-language setup plus an SVG diagram of the actual connection order |
| Cast | Shore/dock/kayak positioning, target, angle, distance band, and cast order |
| Depth | Where the lure should travel and how to keep it in that zone |
| Retrieve | Speed, cadence, pauses, contact cues, and what a bite may feel or look like |
| Decision point | What to adjust after a fair test, when to switch, and when to move |
| Teaching | Why the move fits the visible conditions and why other options score lower |
Hard gates prevent a high preference score from overriding equipment, legality,
ownership, or fish and angler safety. The engine ranks a complete rig—not a
loose lure—and can return safety-block, legal-unknown, or gear-gap instead
of a misleading normal result. For example, an overweight topwater cannot be
assigned to an ultralight rod, a light-wire finesse hook cannot silently inherit
a heavy-cover system, and a measured trout temperature of 68°F or above stops
intentional trout recommendations. Estimated water temperature is always
labeled as an estimate and only acts as a risk indicator.
- Installable Android PWA with mobile bottom navigation
- High-contrast light and dark themes designed for outdoor readability
- Large touch targets, keyboard navigation, visible focus, semantic labels, and reduced-motion support
- Autosaved quick and advanced condition drafts with minimal typing
- Offline water/access directory, saved waters, trip cards, water profiles, adjustment mode, rules, gear, tackle, presets, trip history, seasonal guide, knots, and education library
- Local IndexedDB storage; no account, analytics, ads, or upload endpoint
Requirements: Node.js 24.18 or newer in the Node 24 line and npm 11.16. Exact
versions are recorded in .nvmrc and package.json.
git clone https://github.com/ngk0/current-cast.git
cd current-cast
nvm use
npm ci --ignore-scripts
npm run devOpen http://localhost:3000. No environment file is required. Public source and
history intentionally contain no .env* file. Optional deployment values are
documented as a table in the deployment guide and should
be supplied only through your host or secret manager.
For a production-mode local run:
npm run build
npm run start:standaloneOr run the hardened container, which binds to loopback by default. Its small runtime gateway rejects protocol upgrades and oversized request bodies before forwarding ordinary HTTP to Next.js on an internal loopback port:
docker compose up --build -d
curl --fail http://127.0.0.1:3000/healthSee docs/deployment.md for reverse-proxy, tunnel, runtime, and optional regional configuration guidance.
Serve a production build over HTTPS, open it in Chrome on Android, and use the in-app Install app action or Chrome's Install app / Add to Home screen menu. Visit the important guides once while online so the service worker can cache the current build. Geolocation is optional and requires permission; manual location and weather entry remain available.
The service worker uses network-first navigation with cached fallback and cache-first versioned assets. Its runtime caches have explicit age and entry ceilings, and it never caches API requests. Failed live-data calls use a bounded browser stale value or become an explicit offline state—not a blocked recommendation.
flowchart LR
input[Quick, advanced, or preset conditions] --> engine[Typed deterministic engine]
gear[(IndexedDB gear and tackle)] --> engine
engine --> plan[Recommendation and field plan]
plan --> ui[Results, SVG diagrams, and teaching]
weather[Open-Meteo adapter] -. optional .-> engine
usgs[USGS water-data adapter] -. optional .-> engine
routes[OpenRouteService adapter] -. optional .-> waters
waters --> tripPlans[(Saved waters and local trip plans)]
plan --> adjustments[On-water adjustment ladder]
trips[(Local trips and catches)] --> insights[Descriptive personal insights]
The client-heavy Next.js application has three narrowly scoped server adapters. There is no application database, authentication service, AI provider, or retailer request in the runtime path. Coordinates are reduced to three decimal places and sent to the same origin in POST bodies, never API query strings. Read ARCHITECTURE.md for the decision pipeline, trust boundaries, persistence model, and extension rules.
src/data/tackle.ts— seed inventory, compatibility, retrieve depth, buoyancy, and condition metadatasrc/data/gear.ts— rods, reel type, line, leader, and lure-weight limitssrc/data/rigs.ts— complete component weights, actual hooks, retrieve modes, legal attributes, and gear requirementssrc/data/learning-paths.ts— supplied-source research trail, guided curricula, questions, and buyer guidancesrc/data/methods.ts— rig, cast, retrieve, bite, hookset, snag, and no-bite method cardssrc/data/execution-rules.ts— splashdown, depth, cadence, distance, and fair-test rulessrc/data/rules.ts— contextual scoring weights and bonuses or penaltiessrc/lib/engine/recommend.ts— hard gates, scoring, alternatives, confidence, and avoid reasonssrc/lib/engine/field-plan.ts— access-aware position, cast order, retrieve, knots, adjustments, and move decisionssrc/lib/engine/water-temperature.ts— estimate labeling and configurable trout policysrc/data/seasonal-guide.ts— monthly fish activity, spawning, weather response, and shore/dock/kayak strategy
Unknown answers are neutral rather than disqualifying and lower confidence. Scores and explanations are produced together so tests can catch contradictory advice.
No paid provider is required:
- Weather uses the Open-Meteo Forecast API.
- Recent measured stream temperature uses the official USGS Water Data
APIs and parameter
00010. - Optional driving-distance sorting uses the free OpenRouteService Standard plan through a server-only API key. The checked-in directory remains usable when routing is unavailable.
The hierarchy is manual measurement, a suitable recent nearby USGS reading for moving water, a broad weather-based estimate, then unavailable. Every record includes kind, source, timestamp, confidence, and uncertainty. A nearby stream sensor is never presented as a pond or lake measurement. Adapter details and fallback behavior are in docs/data-sources.md.
Live-data traffic is bounded with per-client rate limits, global and provider-specific concurrency/queue ceilings, circuit breakers, fixed HTTPS hosts, one-megabyte streamed response limits, and runtime schemas. The engine does not depend on any provider succeeding.
npm run verify:public
npm run verify:history
npm run licenses:check
npm run format:check
npm run lint
npm run typecheck
npm run test:coverage
npm run build
npx playwright install chromium
npm run test:e2e
docker build --tag current-cast:local .verify:public rejects all .env* paths, forbidden deployment/backup paths,
private media overlays, third-party retailer photos, and standard
credential-shaped values. verify:history scans all reachable Git history and
runs in primary CI; verify:release additionally requires a clean, full main
checkout and the canonical MIT/SPDX gate. Private operator-specific denylist
terms belong in a trusted private workflow, not this public scanner. CI also
smoke-tests the resource-limited container, emits a CycloneDX SBOM, verifies
registry signatures and dependency licenses, and runs CodeQL.
Seeded baits and lures include a Bass Pro Shops product URL, factual SKU and
variant, an original paraphrased description, and a dated reference price.
Prices and availability can change. The public source does not redistribute
retailer or manufacturer photographs; it uses project-owned SVG illustrations
and links to the official product page. A private operator with suitable rights
can use the ignored overlay described in
public/media/bass-pro/README.md.
Bass Pro Shops and product or manufacturer names are trademarks of their respective owners. Current Cast is independent and is not affiliated with or endorsed by Bass Pro Shops.
Gear, tackle, saved waters, trip plans, trips, optional photos, and custom presets remain in browser-local IndexedDB. There is no upload or account path. Read PRIVACY.md for the data map and docs/threat-model.md for security boundaries.
Contributions are welcome under the MIT License and require a Developer Certificate of Origin sign-off. Start with CONTRIBUTING.md, follow the Code of Conduct, report vulnerabilities through the private process in SECURITY.md, and use SUPPORT.md for help.
Current Cast is released under the MIT License. Commercial and noncommercial use are permitted under its terms, including preservation of the copyright and permission notice. See ATTRIBUTION.md for a plain-language attribution note and THIRD_PARTY_NOTICES.md for dependency and trademark boundaries.
Fishing recommendations are educational starting points, not guarantees. Always follow current regulations, posted access rules, severe-weather guidance, and water-safety practices.

