βββ ββββββ βββ βββββββββββ βββ βββββββ βββββββ βββ βββββββ
βββ βββββββββββ ββββββββββββ βββ βββββββββββββββββ βββββββββββ
βββ βββββββββββββββ ββββββ βββ βββ ββββββ ββββββββββ
βββ βββββββββββββββ ββββββ βββ βββ ββββββ βββββββββ
βββββββββββ ββββββ βββββββββββ βββββββββββββββββββββββββββββββββββββ
βββββββββββ ββββββ βββββββββββ ββββββββ βββββββ βββββββ βββ βββββββ
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
><(((ΒΊ> Minnesota Fisheries Intel <Β°)))><
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
"The difference between a fisherman and a fish whisperer is data." β Some guy who limits out every Sunday
LakeLogic is a locally-run web app that arms you with real Minnesota DNR fisheries data β fish stocking records, population surveys, lake depth maps, and species searches β all from the comfort of your browser before you even back the boat in.
No internet on the water? No problem. LakeLogic caches everything locally so you can scout lakes offline from your cabin, your truck, or your buddy's couch at 2 AM before a big trip.
[MN DNR Servers] [Your Machine]
| |
| -- npm run download --> |
| Fish stocking records |
| Lake survey data ======> | [data/] folder
| Lake metadata |
| |
| [server.js]
| Node.js + Express
| Port 3000
| |
| [Browser]
| http://localhost:3000
| YOU, sipping coffee,
| picking your honey hole
LakeLogic has two modes:
- π¦ Local Mode (preferred): All data is pre-downloaded and served from disk. Instant results, works offline.
- π Live Mode (fallback): If no local data exists, it goes out and scrapes the DNR directly. Slower, but always fresh.
npm installThis is the one-time setup that pulls all the Minnesota fishing data to your machine:
npm run downloadβ Go grab a coffee. This downloads stocking records, survey data, and metadata for thousands of Minnesota lakes. It's a big haul.
You can also grab just the lake index if you're impatient:
npm run download:lakesOr pull a specific year's stocking data:
npm run download:year -- --year=2023npm startThen open your browser to http://localhost:3000 and you're fishing. π
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LakeLogic Features β
ββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ€
β π Find a Lake β Search by name, click the map, β
β β or drop a pin near your cabin β
ββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββ€
β π Species Hunt β "Show me every lake with β
β β Walleye within 30 miles of me" β
ββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββ€
β π§Ί Stocking Data β See exactly when fish were β
β β stocked β how many, what size β
ββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββ€
β π Survey Data β DNR survey reports: CPUE scores, β
β β average weights, size ranges β
ββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββ€
β π Lake Info β Depth, acreage, water clarity, β
β β littoral zone, nearest town β
ββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββ
LakeLogic recognizes 40+ Minnesota fish species, including all the classics:
><(((ΒΊ> Walleye ><(((ΒΊ> Northern Pike
><(((ΒΊ> Muskellunge ><(((ΒΊ> Tiger Muskie
><(((ΒΊ> Largemouth Bass ><(((ΒΊ> Smallmouth Bass
><(((ΒΊ> Bluegill Sunfish ><(((ΒΊ> Black Crappie
><(((ΒΊ> Yellow Perch ><(((ΒΊ> Lake Trout
><(((ΒΊ> Rainbow Trout ><(((ΒΊ> Brown Trout
><(((ΒΊ> Brook Trout ><(((ΒΊ> Channel Catfish
><(((ΒΊ> Lake Sturgeon ><(((ΒΊ> Burbot
... and many more
For the tinkerers who want to build their own tools on top of this:
| Endpoint | What it does |
|---|---|
GET /api/lake-by-id?id=XXXXXXXX |
Full lake profile by DOW ID |
GET /api/lakes-by-point?lat=&lon=&radius= |
All lakes within a radius (meters) |
GET /api/lake-search?name= |
Search lakes by name |
GET /api/fish-stocking?id= |
Stocking history for a specific lake |
GET /api/fish-stocking-history?id= |
Detailed year-by-year stocking breakdown |
GET /api/fish-survey?id= |
DNR survey data with CPUE & size stats |
GET /api/species-search?species=&sort= |
Find lakes with a specific species |
GET /api/species-list |
All known species in the local dataset |
GET /api/geocode?address= |
Street address β lat/lon (Nominatim) |
GET /api/data-status |
How much local data you have cached |
sort=recent β Most recently surveyed or stocked
sort=cpue β Catch-Per-Unit-Effort (higher = more bites)
sort=survey_count β Total fish counted in surveys
sort=largest β Biggest fish recorded (by length)
sort=recent_stocked β Most recently stocked lakes first
sort=quantity β Most fish ever stocked
sort=area β Biggest lakes first
sort=name β Alphabetical
lakefinder/
β
βββ server.js # The whole backend β Express API + scrapers
βββ package.json # Node dependencies & npm scripts
β
βββ public/ # Frontend (served at localhost:3000)
β βββ index.html # Main app shell
β βββ app.js # All the UI logic
β βββ style.css # Looks pretty
β
βββ scripts/
β βββ download.js # One-time MN DNR data downloader
β
βββ data/ # Local data cache (built by download.js)
β βββ lakes.json # Metadata for all MN lakes
β βββ stocking/ # Per-lake stocking JSON files
β βββ surveys/ # Per-lake DNR survey JSON files
β
βββ Launcher.cs # GUI launcher source (C#)
βββ launcher_ui.ps1 # PowerShell GUI launcher alternative
Don't want to mess with a terminal? There's a GUI launcher:
LakeLogic Launcher.batβ Double-click this to start the server and open the app in your browser automatically.launcher_ui.ps1β Full PowerShell GUI with Start/Stop buttons and live status.
ββββββββββββββββββββββββββββββββ
β π£ LakeLogic Launcher β
β βββββββββββββββββββββββββββββββ£
β Status: β Running β
β http://localhost:3000 β
β βββββββββββββββββββββββββββββββ£
β [ START ] [ STOP ] β
ββββββββββββββββββββββββββββββββ
LakeLogic can be deployed to Google Cloud Run using the provided Dockerfile. It uses Google Cloud Storage (GCS) to store and serve the lake data.
After running a local download or refresh, sync your data to GCS:
npm run uploadTo update the server logic or force a fresh data load on the cloud instance:
gcloud run deploy lakelogic --source . --region us-central1 SATURDAY NIGHT, 10:30 PM
βββββββββββββββββββββββββ
1. Double-click LakeLogic Launcher .............. β
2. Search "Walleye" within 40 miles of [your spot] β
3. Sort by CPUE β find the honey holes .......... β
4. Check stocking history β was this lake stocked
recently, or is it all wild fish? ............. β
5. Look at survey data β avg weight 2.1 lbs? Nice. β
6. Set alarm for 4:45 AM ........................ π΄
7. Limit out by 8 AM ............................ πππ
All data comes from the Minnesota DNR's public API and website. As this application is a derivative work, we acknowledge the MNDNR as the owner and primary contributor of the data and software used. Your fishing secrets stay yours.
Data source: Minnesota DNR LakeFinder
"No local data found" at startup?
β Run npm run download first. That's 99% of issues.
Server won't start on port 3000?
β Something else is using that port. Stop it, or change PORT in server.js.
Stocking data looks wrong?
β The DNR recently changed their website layout, which we've now fixed in the latest version. As of April 2026, we have performed a full historical refresh (2000β2025). If you see missing data for a new year, run npm run download:year -- --year=<year>.
Species showing up with weird codes like WAE or BCS?
β These are DNR shorthand codes. LakeLogic translates them automatically. Here's the full cheat sheet:
-- Game Fish ---------------------------
WAE β Walleye NOP β Northern Pike
MUE β Muskellunge SXS β Saugeye
SAR β Sauger WON β White Bass
-- Bass & Panfish ----------------------
LMB β Largemouth Bass SMB β Smallmouth Bass
BLG β Bluegill Sunfish BOG β Bluegill Sunfish
BLC β Black Crappie BCS β Black Crappie
WHC β White Crappie RKB β Rock Bass
YEP β Yellow Perch PKS β Pumpkinseed Sunfish
PMK β Pumpkinseed Sunfish HSF β Hybrid Sunfish
GSF β Green Sunfish
-- Trout & Salmon ----------------------
BKT β Brook Trout BNT β Brown Trout
RBT β Rainbow Trout LKT β Lake Trout
LAT β Lake Trout SPK β Splake
TLC β Tullibee (Cisco)
-- Catfish & Bullheads -----------------
CCF β Channel Catfish FHC β Flathead Catfish
BRB β Brown Bullhead BKB β Black Bullhead
BLB β Black Bullhead YEB β Yellow Bullhead
-- Other Sportfish ---------------------
LKS β Lake Sturgeon PSH β Paddlefish
BUR β Burbot BOF β Bowfin (Dogfish)
-- Rough Fish & Carp -------------------
COC β Common Carp CAP β Common Carp
GZS β Gizzard Shad QIL β Quillback
WTS β White Sucker WHS β White Sucker
-- Minnows, Shiners & Darters ----------
FHM β Fathead Minnow GOS β Golden Shiner
BNM β Bluntnose Minnow CSH β Common Shiner
BNS β Blacknose Shiner SPO β Spottail Shiner
SFS β Spotfin Shiner BKS β Blackchin Shiner
PGS β Pugnose Shiner FTD β Finescale Dace
BND β Blacknose Dace LND β Longnose Dace
CRC β Creek Chub CNM β Central Mudminnow
JND β Johnny Darter IOD β Iowa Darter
LED β Least Darter TPM β Tadpole Madtom
BST β Brook Stickleback
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
><(((ΒΊ> Good luck out there! <Β°)))><
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
"Give a man a fish and you feed him for a day.
Give a man LakeLogic and he comes home with
a cooler full every single weekend."
Built for Minnesota anglers, by a Minnesota angler. π£