A flat table looked like the obvious way to publish a How to Fish fish list. It also became annoying almost immediately.
The game has ordinary catches, bosses, quest triggers, five progression stages, several lure tiers, and two rods in the early data. A player usually arrives with one narrow question. Which bait catches Pike? What can the Scientific Lure pull? Is Tuna a normal catch or part of a boss chain?
Scrolling through a long article makes each of those questions slower than it needs to be. I built a browser-side lookup instead.
The data model follows player questions
Each creature record uses a small set of fields.
type Creature = {
name: string;
island: string;
type: "Regular" | "Boss";
rod: string;
bait: string[];
note?: string;
};
The field named island needs a careful definition. For regular catches, it represents the stage where the relevant lure tier first appears. It does not claim that every creature is physically locked to one island. Bosses still need the correct encounter area and trigger.
That distinction belongs in the interface because it changes how a player reads the result.
One record can answer several searches
Pike is associated with the forest progression stage, the Fishing Rod, and both the Free Lure and Beginner Lure. A search index can combine those values into one lowercase string.
const searchable = [
creature.name,
creature.island,
creature.rod,
...creature.bait,
].join(" ").toLowerCase();
The same record now responds to pike, forest, fishing rod, free lure, and beginner lure.
Filters handle the questions that should remain explicit. Island stage, bait, and a bosses-only toggle are easier to understand as controls than as query syntax. The implementation stays small enough to run without a backend.
Bosses should stay in the same index
I considered making a separate creature list for bosses. That would hide useful relationships.
Tuna is caught with the Professional Boss Lure and then used to trigger the Albatross. The Bowhead Whale comes from the Fish Bucket and later triggers the Mutated Bowhead Whale. A player searching either item should see the whole chain even if its records have different types.
Keeping everything in one dataset also makes reverse lookups possible. A lure page can group all creatures that include the same bait value. The fish finder and lure lookup become two views of the same source.
Empty states matter in small tools
A no-result screen should help the player recover. No matches is technically correct and practically weak.
The tool suggests clearing the island or bait filter because filter combinations are the common source of an empty result. It also keeps boss searching opt-in. A player looking for an ordinary fish should not have ten encounters mixed into the list by default.
The current searchable How to Fish fish list contains 34 documented creatures and encounters. It can be filtered by progression stage and bait, with bosses available as a separate view.
Static delivery fits the job
The data changes with game patches, but the query itself does not need a server. Astro generates the page, a short script filters the rendered rows, and every lookup stays in the browser.
That choice gives the page useful HTML before JavaScript runs. Search engines can read the creature names and relationships, while players still get instant filtering. It also avoids turning a small reference tool into an account product.
The difficult part was the wording
Code can filter incorrect data perfectly. The harder work was deciding what each field promised.
I compared the official Steam material with multiple published catch lists, kept patch-sensitive notes beside the affected records, and avoided inventing drop rates that the sources did not support. The interface says Lure or trigger because a Carrot and a Scientific Lure do different jobs even though both occupy the bait field.
Small reference tools earn trust through those distinctions. A fast wrong answer still wastes a cast.
How to Fish.ing is an independent fan project with no affiliation to Dazed Games or Valve. The dataset described here was checked for Patch 1.0.9 on August 25, 2026.
Top comments (0)