Or Building a nationwide fishing research platform, one stubborn problem at a time
I have a habit of turning a simple question into a full-blown project. I don’t mean that in the inspirational LinkedIn sense where everything becomes a tidy leadership lesson. I mean I wonder where I should go fishing this weekend and, a few days later, I am staring at millions of geographic records, a growing MySQL database, and a command line that is calmly processing the water network of the entire United States.
That is how Let’s Fish started.

The original idea was straightforward. I needed a tool that helps answer a practical question. Given a location, a target species, current conditions, and a reasonable driving distance, where is the best place to fishing? The problem is that the answer is not sitting in one clean data source waiting to be downloaded. It is scattered across maps, stocking reports, weather services, river gauges, reservoir records, access information, regulations, and a lot of imperfect and sometimes bad government data.
So this project has become less about making a fishing map and more about building a research and decision-support system for water. That distinction mattered to me. A map can tell you that a lake exists. A useful system should eventually tell you whether the lake is accessible, what species are likely present, whether the water level is favorable, what the weather has been doing, and whether today is actually a good day to go.
What I’ve built so far
The project now has a national geographic foundation. It contains millions of water features and is actively loading the river and stream network that connects them. It can track long-running data imports, resume safely after a stop, report its progress, and preserve the history of what was loaded and when.

That may sound like basic plumbing, but boring plumbing is what makes ambitious systems possible. The glamorous part is a future screen that says, ‘Try this stretch of river for white bass tomorrow morning.’ The unglamorous part is making sure a process can move through tens of millions of records without corrupting the database, losing its place, or quietly putting coordinates on the wrong side of the planet.
A few of the wins have been significant:
- A nationwide waterbody foundation with more than seven million geographic features.
- A resumable ingestion system that can stop, restart, and continue from the last committed checkpoint.
- A growing flowline network representing rivers, streams, creeks, canals, and the connections between water features.
- A search layer that can already find nearby waterbodies by location and distance.
- A structure for fish species and stocking information that can expand beyond one state and one source.
- Operational statistics that show what’s in the database, what’s still running, and how far the work has progressed.
- A test suite that has grown alongside the project instead of being bolted on after everything breaks.
Failures were not optional
This hasn’t been a clean march from idea to success. It’s been a series of wrong assumptions getting exposed by reality, which is usually how worthwhile work goes.
The geographic data was especially good at humbling me. A coordinate can look perfectly reasonable while being interpreted in the wrong axis order. A line can be valid in one system and rejected by another. A source can claim to contain one kind of geometry and quietly hand you something more complicated. A warning can be harmless noise, or it can be the only clue that millions of records are about to be wrong.
I also underestimated how quickly a ‘simple’ fishing database turns into a problem involving data governance, source quality, provenance, time, and meaning. A raw water feature is not automatically a fishing destination. A river segment is not automatically accessible. A nearby gauge does not automatically represent the same hydrologic conditions. The system has to know the difference between data that exists and data that is useful.
Some specific failures and corrections included:
- Spatial-coordinate handling that initially required correction before the geometry could be trusted.
- Source warnings and geometry variations that had to be separated into expected behavior versus actual defects.
- Early assumptions that raw water records could directly become user-facing fishing locations.
- Import workflows that needed explicit safety limits, checkpointing, and clear status reporting before they were ready to scale.
- Configuration and operational issues that reinforced a basic lesson: a system is not finished just because the code works on the happy path.
None of that work was wasted. Every failure narrowed the gap between a demo and something that could eventually be trusted. That’s the part people tend to skip when they tell the story after the fact. The breakthrough usually looks obvious once somebody has already fought through all the stupid little reasons it didn’t work.
Where it’s going
The next major evolution is time.
Right now the geographic foundation can tell the platform what exists and where it exists. The future system needs to understand what is happening now, what happened recently, and how conditions are changing. That means preserving time-series observations instead of overwriting a single ‘current’ value.
For lakes and reservoirs, that includes water elevation, storage, inflow, outflow, and temperature. For rivers and streams, it includes discharge, gauge height, flow trends, temperature, and safety conditions. Weather also needs history, not just a forecast. Rain that fell upstream two days ago may matter more than the weather directly over a fishing location today.
The aspiration is a time-aware hydrology and fishing decision system. It should eventually combine location, species, season, water conditions, recent weather, forecast weather, stocking history, public access, regulations, and safety into recommendations that are useful and explainable.
I’m intentionally avoiding the trap of pretending a single score can magically understand every lake and river in the country. The first versions use transparent rules and show their reasoning. A location may look favorable because flows are stable, water temperature is in range, recent rain was moderate, public access is confirmed, and the target species is seasonally active. It may be downgraded because the river is rising too quickly, a reservoir is far below normal pool, or the available data is stale.

Over time, the system can learn from historical conditions and outcomes. It can identify which flow ranges tend to be productive for a particular species, how lake levels affect access and habitat, and how weather changes alter the quality of a fishing window. The underlying framework is reusable: collect evidence, normalize it, preserve its history, build features, score decisions, test the result, and learn from what happened.
Why I’m keeping at it
Part of this is obviously about fishing. I like being outside, I like exploring, and I like the idea of using data to find places I would otherwise miss.
The bigger reason is that this project sits at the intersection of almost everything I enjoy: research, databases, risk thinking, scoring systems, maps, weather, public data, and building something practical from a pile of messy information. It is the same instinct behind a lot of my projects. I see a problem, assume there should be a better tool, discover there isn’t one, and then make my life dramatically more complicated by trying to build it.
There is something incredibly satisfying about making a system that respects uncertainty. The platform shouldn’t pretend it knows more than it does. It should show confidence, source age, missing information, and the reasons behind a recommendation. That is how I have always approached risk and analytics professionally, and it applies just as well to choosing a river as it does to making a financial decision.
The project is still early. The data foundation is huge, but the actual decision layer is only beginning. There are millions of records left to process, access questions to solve, observation sources to integrate, and a whole lot of edge cases waiting to ruin my life.
That’s fine though. Interesting projects are rarely finished when they first become useful
Where I’m going with this
I want Let’s Fish to become a tool that helps someone make a better outdoor decision without requiring them to become a hydrologist, meteorologist, fisheries biologist, GIS analyst, and amateur detective first.

You should be able to ask where to fish within a reasonable drive, select a species, choose a time window, and get a ranked set of locations with honest explanations. Not hype. Not a vague heat map. Not a black-box score that claims the universe has spoken. Just the best available evidence, organized well enough to be useful.
That’s the aspiration. For now, the database is still chewing through rivers and streams while I watch checkpoints advance and storage usage climb. It’s not glamorous, but it is real progress.
And honestly, watching a ridiculous idea slowly turn into a working system is half the fun.
<End Trans>


Leave a Reply