Writing
Essays on building with AI agents and shipping design.
Writing
Essays on building with AI agents and shipping design.
Two Claude sessions, one Notion board, 114 PRs in 11 days
Notion holds the project board. One Claude session ships PRs. Another reviews and merges. They hand off through the board, never to each other. I have not opened the Notion UI in 11 days.
OTP flows that don’t lock people out
Five small decisions that turn the loneliest screen in your product from a wall into a window. Lessons from four years of identity verification UX.
Where the LLM’s authority should end
A user paid two credits for a cover letter. The LLM summarised it. The fix isn’t a prompt, it’s cutting the model out of the delivery path.
Three shapes of a voice bot
Voicemail to SMS, realtime WebRTC, chat with voice notes. Three projects, three latency budgets, three trust models. The channel decides almost everything.
Designing for AI uncertainty
The same AI response, three ways. Confident, calibrated, hedged. Why the framing is the product, and the five signals that carry weight.
Skeleton states that know what’s coming
Generic, layout-matched, and optimistic loading for the same card. The skeleton is a contract with the user and what breaks when you get it wrong.
Drag and drop that doesn’t feel cheap
A pointer-events reorder list with lift, make-room, settle, and full keyboard support. Why the HTML5 drag API is a trap.
Empty states as a design problem
First-time, sparse, populated. The empty state is the most important screen in the app. How to design backward from zero.
Tables at 10,000 rows, where performance is UX
A live virtualized table with 10k rows. Filter, sort, scroll, all under one frame. Why naive tables die at scale and what virtualization unlocks.
What a streaming response feels like
Three live AI-response modes side by side: all-at-once, chunked by sentence, token by token. Same text, same delay, completely different products.
Designing animated charts
Three live chart demos and the design thinking behind each: when the data is live, when it’s historical, and when the context itself changes.
Designing charts that work when colour fails
Animated demos of colour-vision deficiency and stacked visual channels. How I argued for accessibility as the design system default at Peak.
Building a WhatsApp chat demo for a site that lives in WhatsApp
Six design-engineer decisions for recreating WhatsApp’s chat feel: exact palette, bubble tails, typing rhythm, pacing as script, cards-in-bubbles, loop.
I’m a designer who ships with AI agents. Here’s how.
My workflow for going from Figma to production using Windsurf, Claude Code, and context engineering.
How I set up a SECURITY.md when building with AI agents
A template for keeping AI-assisted codebases safe by default.
OpenWatch: building an AI-powered security intelligence platform for Nigeria
Real-time incident extraction, semantic deduplication, and daily intelligence briefs. From raw news to actionable signal.
The biggest UX win on Filmflux wasn’t UI. It was caching.
How a three-layer cache turned a database-heavy app into something that just feels fast.
I assumed users would search for movie titles. I was wrong.
How I built a hybrid search system that understands intent, not just keywords.