Saachi K. Gupta

Building a Seattle Swim Finder for Claude Code

2026-05-07

I like to swim at Seattle's public pools, which are genuinely great — affordable, well-kept, spread around the city — but the schedules are all over the place. Each pool runs different lap swim windows, they shift week to week, special events knock out sessions without much warning, and the city's online calendar is slow and confusing to navigate. I kept opening a bunch of tabs just to figure out where I could actually get in the water on a given morning, and I wanted something that would just tell me the answer when I asked.

So I built a Claude Code skill for it — a small package of files that teaches Claude a new command. When I type /swim Thursday between 10am and 1pm, it returns a clean list of pools with sessions that fit that window, including nearby options if nothing lines up perfectly. The longer idea was to hook this into my calendar so it could cross-reference when I'm actually free, which is still in progress, but the core of it works and I use it regularly.

Not everything needs to be AI

There's a saying about not using a sledgehammer to crack a nut, and building this was a good reminder of what that means in practice. The part where AI actually helps is the conversational layer — understanding what "next Thursday morning" means, filtering the schedule down to what fits, and formatting something readable. But pulling the pool schedule from the city's website is a completely deterministic problem where the answer is always the same regardless of how you ask for it, so running a language model on that part would just be adding complexity for no reason.

Instead I split the work: a Python script scrapes the Seattle Parks calendar on a weekly schedule and saves the results to a local file, and Claude reads from that file when I ask a question. The only AI in this project is in the one place it was actually useful.

Why scraping was annoying

The Seattle Parks calendar loads everything through JavaScript, which means a standard scrape just returns an empty page with none of the actual schedule data in it. I ended up using Playwright, which opens an invisible browser in the background and lets you interact with the page the same way a real user would — clicking buttons, waiting for things to load, and pulling out the rendered content once it's there. The script clicks into a print/list view of the calendar, intercepts the print dialog before it causes problems, and then parses the HTML output with BeautifulSoup. The whole thing runs in under a minute and is set to auto-refresh every Monday.

The full skill is on GitHub with setup instructions, and it covers six pools: Ballard, Evans at Green Lake, Helene Madison, Meadowbrook, Rainier Beach, and Southwest.