Nolan Idle

Skip to content
Back to projects

2026 · Solo · design & full-stack

Trailhead

Trail conditions and sunrise times for Three Rivers parks, on one quiet page.

  • Next.js
  • TypeScript
  • Postgres
  • Prisma

The problem

Most Saturday mornings start the same way for me: five browser tabs open, trying to figure out whether the trails at Elm Creek are muddy, whether the ski trails are groomed yet, and what time the sun actually comes up. The information exists, but it's scattered across park district posts, weather sites, and a Facebook group.

I wanted one page that answered the only question I really had: is it worth going out this morning, and where?

What I built

Trailhead pulls condition updates from Three Rivers Park District pages on a schedule, normalizes them into a small Postgres database, and pairs each park with sunrise, sunset, and golden-hour times calculated for its coordinates.

The front end is intentionally plain: a list of nearby parks sorted by how recently their conditions were updated, with a short status line for each. No accounts, no feed, no notifications. You open it, you read it, you close it.

  • A scheduled job scrapes and diffs condition pages so only real changes are stored
  • Solar times computed locally from latitude and longitude instead of an external API
  • Server components render everything; the page ships almost no client JavaScript
  • A "last verified" timestamp on every trail, because stale data is worse than none

Tech stack

  • Next.jsApp Router with server components, so pages are mostly static HTML
  • PostgresStores parks, trail segments, and a history of condition changes
  • PrismaTyped queries and migrations while the schema kept changing
  • TypeScriptKept the scraper and the UI speaking the same shapes

What I learned

Scraping is fragile in a way I didn't respect at first. The park district redesigned one page in March and my parser silently returned nothing for a week. I added checks that fail loudly now, and I think more about what my code does when the world changes under it.

I also learned that the hardest design decision was what to leave out. I had a map view half built before I admitted I never wanted it.