DWG RG-005 · SIDE PROJECT · LIVE

Busch
Fishing

A fishing cheat sheet for Busch Conservation Area that says what's biting, which lake to try and what to throw, based on today's weather.

STATUS: LIVE · BUILT 2026 · VISIT FISHING.RICKGUYTON.DEV ↗

DETAIL B — SHOWN IN THE PROJECT'S OWN FINISH

fishing.rickguyton.dev
Busch Fishing
  • Cloudflare Worker
  • Static assets
  • Vanilla JS
  • Leaflet
  • Open-Meteo
  • OpenStreetMap
  • No API keys
Busch Fishing runtime A Cloudflare Worker serves static files to the visitor's phone. The page then fetches weather from Open-Meteo, lake outlines from Overpass, map tiles from OpenStreetMap, species photos from the state field guide, and fonts from Google Fonts. Lake geometry is cached in the browser for 30 days. CLOUDFLARE EDGE VISITOR'S PHONE FREE · NO API KEY Worker static assets only, no script fishing.rickguyton.dev custom domain: DNS + cert automatic /index.html 80 KB · HTML, CSS, JS, data /vendor/leaflet/ map library, vendored, no CDN /og.png link-preview card, rendered offline every branch gets its own preview link Link-preview crawlers Slack, iMessage, X GET /og.png index.html in the browser vanilla JS, no framework, no build step Today's Game Plan Can't Decide? (lake picker) The Lay of the Land (map) I'm at lake… / Species Guide Rules · lure sheet · glossary species, lure + rig data hard-coded from the state's annual fishing report, refreshed each spring Leaflet map lake outlines + numbered pins, rings stitched from OSM segments localStorage processed lake geometry, 30-day TTL skips Overpass on repeat visits GET / Open-Meteo temp, wind, sky, sunrise / sunset Overpass API ×3 lake outlines (OSM) 15 s timeout, fail over OpenStreetMap tiles base map images State field guide species photos, lazy-loaded, hidden if they fail Google Fonts Archivo, IBM Plex Sans on load cache miss tiles <img> CSS
The Worker only hands over files. The browser calls every outside service itself, so nothing is proxied and there are no keys to leak. Orange arrows carry the live data that drives the page.

SECTION C–C · SCOPE

Busch Conservation Area has dozens of numbered lakes, and the state's annual fishing report covers which species are in which lake. Standing at the water with a tackle box, though, the question is simpler: what should we throw, and where?

The page answers that in plain English. It starts with a seasonal guess from the month and the time of day, then refines it with live weather. Each species has a hand-written rule for when it bites, and each lake is scored by how many good-biting species it holds. "Can't decide?" picks a lake near the top of that list and drops a pin on the map.

There's no build step and no framework. The species data, rules, styles and map code all live in one 80 KB HTML file. Merging to main is the deploy, and every branch gets its own preview link to check on a phone.

DESIGN DECISIONS

  1. ZERO LINES OF SERVER CODE

    The Worker serves one HTML file, a vendored map library and a preview image. Weather and lake outlines come straight from free public APIs, called from the browser.

  2. BUILT FOR ONE BAR OF SIGNAL

    It gets used at the lake. Every outside call has a fallback, and none of them blanks the page. If the weather call fails, tapping a condition chip still re-scores everything, offline.

  3. THREE MAP MIRRORS, NO GUESSING

    Lake outlines come from three Overpass mirrors tried in order, each with a 15-second timeout. If all three fail, the page shows the plain map and a link to the official one, never invented coordinates.

  4. CACHE THE SLOW PART

    Processed lake geometry is kept in the browser for 30 days, so repeat visits skip the slowest call entirely.

  5. ONE STATE OBJECT DRIVES EVERYTHING

    Sky, wind, temperature and time of day live in one small object. Every section re-renders from it, so the game plan, bite badges, lake panel and lake pick always agree.

  6. PREVIEW CARD MADE OFFLINE

    Rendering the link-preview image live would blow far past the free plan's 10 ms CPU budget, and a crawler could cache a failed render. It's rendered once and committed instead.

FULL SIZE · DRAG TO PAN