Growth engineer at @supabase. Making small apps on nights and weekends.

San Francisco, CA
Joined January 2007
✨ Introducing Audioflare ✨ The ultimate open source playground to master @Cloudflare AI Workers. Audioflare transcribes, summarizes, analyzes, and translates 30-second audio clips into 9 languages. #buildinpublic
12
34
3
189
48,698
I cut the clutter from my trip planner's day view. The header is one line now. A travel line shows only when a gap is tight, long, or already planned. Photos sit behind a camera count on each stop. Most stops had a Google place photo, so hiding them also stopped one billed Google lookup per stop.
55
Sudoclue, my Sudoku app, can now fill in your lone notes. Narrow a cell to one note, and if its row, column, and box rule out the rest, it fills itself. I picked this over a mark on each proven note and a key that counted them. Both showed singles you hadn't found yet. Turn it on in Settings. Play with it yourself at sudoclue.app
1
94
My address book app Sealed now prints each envelope in its country's own order. Friends add their own addresses, and I send holiday cards. A China address starts with the postcode and ends with the name. A type-to-filter country box failed code review four rounds in a row: it picked countries people hadn't chosen. A plain dropdown replaced it.
1
1
93
Bay Ballot now lets you plan your vote. Start your ballot and each contest page gets a Your vote box. Picks stay on your device and never count in the tallies. San Francisco's list has 52 contests, including all 5 supervisor districts, and a voter has one at most. So the sheet counts your picks with no total.
1
94
My trip planner now has a Budget tab that totals prices per currency. Typing prices offline failed three AI review rounds in a row, each on the previous fix: - Drafts kept in memory were lost on reload. - A leave-page prompt never fires on iOS. - Drafts saved on the device could overwrite newer prices. So I made prices read-only offline.
1
144
My trip planner's day view lost its status chips and per-stop Map links. A stop that still needs booking gets an amber dot. Everything else moved into the card a tap opens. Code review found that dropping the Map links left view-only and keyboard users without directions, so each stop got a Directions link that shows on tap or Tab.
1
1
151
Every UI change in my trip planner now starts with three mocks on one page. Each is drawn in the app's real look with real trip data, and each lays out the screen a different way. For showing one day at a time, I picked A, the date strip.
3
232
Sean Oliver retweeted
Today we announce 1Password for Agents platform, building with companies @Muse, SpaceX Super Intelligence Grok @Bot, @AnthropicAI’s @Claudeai, @OpenAI, @TownAI, @Browserbase, @Browser_use, @heydana_ai, Instinct, @usekernel, @Perplexity_ai, @tryramp, @Tomo, and @wajo_ai, with more integrations on the way. 🎉 We've heard from so many of our customers who want to use these new personal AI agents to help them get more done, but want more control over what the agent can access with the same trust and ease of use they get when using 1Password directly. 1Password for Agents gives your agents access without giving up your passwords. When an agent reaches a sign-in form, it requests a credential from your vault. If you approve the request, 1Password directly auto-fills the credential in the destination site so the agent can’t see or take possession of the credentials. The agent gets the task done, but it doesn’t get your passwords.. You stay in control. 1Password for Agents free and optional for personal and family accounts. Unless you opt-in to an agent connector, agents cannot touch your vault. ➡️Learn more: bit.ly/487da6J
645
1,092
894
10,586
1,825,866
Playwright's toContainText retries until it passes, so my e2e tests never saw the flash. A MutationObserver test that records the row when edit mode ends catches it: it fails on the old code with "London" and passes with the fix.
39
In Next 16.2, a server action's promise resolves before its refreshed page data renders. So state you set after `await action()` renders first, with the old props. In Sealed, my address book app, a saved row flashed its old city before showing the new one.
2
2
273
Next calls resolve() on the action promise, then applies the new router state in a transition. My setState after the await is an urgent update, so React commits it first.
1
55
The fix keeps the saved values on screen until the rows prop changes. The overlay remembers which rows array it was saved against, so the first refresh switches it off with no cleanup code.
1
33
Bay Ballot had 5,317 visitors in its very first week. It puts 119 Bay Area voter guides' endorsements side by side. People write in to say it's useful. One local political club emailed asking me to add an endorsement missing from its own website. It's rewarding to put something out there and have people pick it up and thank you for it. Try it at bayballot.com
95
Bay Ballot no longer colors candidates blue and pink. It puts 118 Bay Area voter guides side by side. A reader emailed that pink read as Republican, so Democrats Scott Wiener and Connie Chan looked like a D vs R race. The colors only meant endorsement rank. Candidates are now violet, amber, teal, and slate.
1
1
166
Code review caught that teal and slate looked almost the same to red-green colorblind readers, so slate is now much darker than teal in light mode and much lighter in dark mode. A test fails if a candidate color ever turns blue or red.
1
45
Solstice now warns you the week before a time zone changes its clocks. The browser's Intl API already knows every zone's rules, so Solstice checks each zone's UTC offset a day at a time and binary-searches to the minute. solstice.seanoliver.dev
87
Sudoclue, my Sudoku app, now lets you share a solve map of each finished puzzle. Each open cell is shaded by when you filled it: light for early, dark for late. Starting numbers are dots, and no digits appear, so it spoils nothing. Two people who solve the same daily usually get different maps. sudoclue.app
2
3
246