The scale of the problem
80% rarely or never used. My eight half-built features weren’t the exception — they were the rule. Source: Pendo, 2019 Feature Adoption Report — usage measured across 615 products.
When generation is free, intention is the only thing left to optimise for.
By Furquan Ahmad · Product Designer at Scale
The most valuable work is often the work nobody sees.
80% rarely or never used. My eight half-built features weren’t the exception — they were the rule. Source: Pendo, 2019 Feature Adoption Report — usage measured across 615 products.
When generation becomes cheap, craft and judgement become the only real moat.
So what’s the point of building fast if it solves a problem for no one?
Vibe-coding feels productive, but the rush comes from the next prompt, not the shipped product. Here’s why the loop is so hard to leave.
The hit is in walking to the freezer, not the ice cream — in the next prompt, not the shipped product. Each prompt is mechanically a slot lever, and intermittent good output keeps you pulling.
Every prompt fires back something that looks like work, so you feel productive even when nothing real has shipped. The stream of output is the reward, and it keeps you in the loop.
AI inflates the output, not the judgement. A manager can’t tell judgement applied from judgement skipped — both produce the same-shaped artifact, so pseudo-productivity wins even harder.
Newport’s answer: do fewer things · work at a natural pace · obsess over quality.
⠐⡀⢂⠐⠠⠐⡀⢀⠀⡀⢀⠀⡀⠀⡀⢀⠀⢀⠀⡀⢀⠀⢀⠀⡀⠀⡀⢀⠀⢀⠀⡀⢀⠀⢀⠀⡀⠀⡀⢀⠀⢀⠀⡀⢀⠀⢀⠀⡀⠀⡀⢀⠀⢀⠀⡀⠀⡀⢀⠀⡀⠀⡀⢀⠀⡀⠀ ⠐⡀⠂⠌⠠⠁⡀⠂⢀⠐⠀⡀⠀⡁⢀⠀⢈⠀⡀⠄⠀⡈⢀⠀⡀⠁⡀⢀⠈⠀⡀⠄⠀⡈⢀⠀⡀⠁⡀⢀⠈⠀⡀⠄⠀⡈⢀⠀⡀⠁⡀⢀⠈⢀⠀⡀⠁⢀⠠⠀⢀⠁⡀⠠⠐⠀⡀ ⠐⠠⢁⠂⠄⠡⢀⠂⠄⠐⢀⠀⡁⠠⠀⢈⠀⠠⠀⠄⠁⠠⠀⡀⠄⠂⠀⠄⠠⠁⠀⠄⠁⠀⠄⠀⠄⠂⠀⠄⠠⠁⠀⠄⠁⠀⠄⠀⠄⠂⠀⠄⠐⠀⠠⠀⠌⠀⠠⠈⠀⠠⠀⠐⢀⠂⠀ ⠈⡐⠠⠈⠠⠁⡀⠂⠠⢈⠀⠄⠐⠀⠂⠠⠈⢀⠐⠠⠈⠠⠐⠀⡐⠠⠁⡀⠂⠄⠁⡐⠈⠠⠈⢀⠐⠠⠁⡀⠂⠄⠁⡐⠈⠠⠈⢀⠐⠈⡀⠂⠈⠄⠁⡐⠠⠈⢀⠂⠁⠄⠁⠂⠠⠐⠀ ⢀⠐⡀⠂⢁⠀⡐⠠⠁⠠⢀⠐⠈⡀⠌⢀⠂⠠⠐⠀⠂⢁⠐⠀⠄⡐⠀⠐⠠⠐⠀⠄⠂⠁⡐⠀⡐⠀⠂⠠⠐⠀⠂⠄⠂⠁⡐⠀⠠⠁⡀⠄⠡⠐⠀⠄⡀⠂⠄⠐⠈⡀⠂⠁⡐⠠⠀ ⠀⢂⠠⠐⠠⠀⠄⠂⠈⠄⠠⠀⡁⠠⠀⠄⠠⠁⠠⠁⢈⠀⠄⠈⡀⠄⠈⠄⢁⠠⠈⡀⠂⢁⠠⠐⠀⠌⠀⡁⠄⠡⠀⠂⠈⠄⠠⠈⠠⠐⠀⠠⠐⢀⠈⠀⠄⠐⠈⠠⠐⠀⠌⢀⠐⠀⡀ ⠀⢂⠀⠂⡁⠄⠠⠁⡈⠐⢀⠂⠐⡀⠁⡐⠀⠂⢁⠐⠀⢂⠈⡀⠄⠂⡐⠈⡀⢀⠂⠄⠂⠠⢀⠂⠈⠄⠂⡀⠐⢀⠂⠁⠂⡀⢁⠐⠀⠂⠁⡐⠀⠄⠠⠁⡀⠂⢁⠐⠀⡁⠄⠂⡀⠂⠀ ⠐⠠⠈⠐⢀⠐⠀⡁⠠⢈⠀⠄⠂⢀⠂⠠⠈⠐⠀⠂⢈⠀⠠⠀⡐⠀⠄⠐⠀⠄⢀⠂⠄⠁⠠⠐⠀⠂⠄⠐⠈⢀⠠⠁⢂⠀⠄⠠⠁⠈⠄⠀⠄⠂⢀⠐⠀⠐⠠⠀⠂⡀⠄⠂⠐⠀⠁ ⠀⢁⠀⠁⠆⠀⠆⡀⠁⢀⠀⠆⠈⠀⡀⠁⠰⠈⢀⠁⠀⡈⠀⠁⠀⠆⠈⠀⢁⠈⠀⡀⠆⠁⠰⢀⠁⠈⠀⡈⠰⠀⡀⠆⢀⠀⡈⠀⡀⠁⠀⠆⢀⠰⠀⢀⠈⠀⢁⠀⠆⢀⠀⡈⠰⠈⠀ ⠐⡀⢈⠐⠠⠈⢀⠐⠈⡀⠄⠂⠈⠄⠀⠄⠁⠠⠀⠠⠁⠠⠐⠈⢀⠂⠌⠐⠀⡀⠂⠄⠠⠈⠄⠠⠀⡁⠂⢀⠐⠀⠠⠐⠀⠠⠀⠂⠀⠄⠁⢠⡶⠶⣾⡦⠀⢈⠀⠄⠐⡀⠄⠀⡐⠠⠀ ⠀⡐⠠⠐⠀⠂⠠⠈⠐⠀⠄⢈⠠⠀⢁⠠⠈⠀⠌⠀⠄⠁⠠⠈⠀⠄⡀⠌⠀⠄⠐⡀⠁⠄⠐⠠⠐⠀⡐⠀⠌⠀⡁⠄⠈⡀⠄⠁⡀⠂⣨⠟⠀⣸⣿⠃⡀⠂⠠⠈⠀⠄⡀⠁⠠⠀⠄ ⠠⠐⢀⠈⠄⢁⠠⠈⡐⠈⠀⠄⢀⠂⠄⠐⠀⡁⠠⠈⢀⠈⡀⠄⠁⠠⠀⠠⠈⢀⠐⠀⠂⢈⠀⠂⠠⠁⠀⢂⠀⡁⠀⠄⠂⠀⠄⠂⠀⣴⠏⠀⢀⣿⡟⠀⢀⠐⠀⠂⢁⠀⠄⠂⢁⠠⠀ ⠀⠌⡀⠐⠈⡀⢀⠂⠀⠌⢀⠈⠀⡀⢄⣂⣄⡀⠄⠁⡀⠂⠄⡀⠌⠀⠄⠁⠐⠀⠠⠈⠀⠄⠂⠁⡐⠈⠀⠄⠂⠀⡐⠀⠠⠁⢀⠐⣼⠃⠀⠀⣸⣿⠃⢀⠠⠀⢈⠐⠀⠄⠂⠐⢀⠠⠀ ⠀⠂⠄⠁⢂⠠⠀⠄⠡⠀⠂⠀⠁⠺⢿⣏⠉⠛⠲⢦⣀⡠⠀⠀⠄⠁⠂⡈⠄⢈⠀⡁⠈⡀⠄⠁⡀⠄⠁⠂⢀⠁⠀⣸⣷⡞⠲⣾⠃⠀⠀⢠⣿⡿⣆⠀⢀⠐⠀⠠⠈⠀⠄⠁⠠⠀⡀ ⠈⡐⠈⢀⠂⠀⠄⡈⠠⠀⡁⠈⠀⠌⠈⠻⣷⣆⡀⠀⠈⠙⠳⠮⣤⣐⠀⢀⠐⠀⠂⢀⠐⠀⡀⠁⣀⣀⣂⣌⣤⣶⡴⠴⠿⠟⠻⠷⢶⣿⣫⣽⠿⠶⠿⢤⣤⣀⡈⠀⠄⠁⠂⠈⡐⠀⠀ ⠀⡐⠈⢀⠐⠈⢀⠐⠀⢂⠀⠄⠁⠠⠈⢀⠘⢿⣿⣦⡀⠀⠀⠀⠀⠉⠛⠶⣤⣆⣬⡤⠶⠶⡞⠻⠛⠉⠉⡃⣁⡈⣼⣆⠀⠀⠀⠀⠛⣿⣿⡿⢷⣶⣶⣤⣤⣉⣽⣷⠶⠀⠈⠄⠠⠈⠀ ⠀⠐⠠⠀⠌⠀⠄⠠⠁⢀⠀⠂⠈⢀⠐⢀⣀⣀⣙⣿⣿⡶⠴⠶⠒⠛⠛⠋⠉⠁⠀⢀⠀⣄⡂⣷⣰⣷⡼⣿⣻⣿⠻⠿⠀⢀⣠⣶⡿⠟⠋⠀⠀⠀⠀⠉⠉⠉⠁⠀⢀⠠⠁⢀⠂⢈⠀ ⠀⠡⢀⠈⡀⠂⠈⢀⠂⠀⠄⢈⣤⠶⠛⠋⠉⠉⠉⠀⢀⠀⢀⠆⢀⣂⣀⣧⡀⣾⡦⢾⣿⢿⡧⣳⣿⣻⣇⣉⠀⣠⣤⡴⣿⡿⠛⠉⠀⠀⠐⠀⡁⠈⠐⡀⠂⡀⠂⢁⠠⠀⠂⡀⠐⠀⡀ ⠀⠐⡀⠐⠀⠠⠁⡀⠠⢈⣴⣏⡁⠀⡀⠀⠀⠀⠀⠀⠸⣿⣿⣷⡀⠿⠏⢻⣗⣽⣿⣼⠿⠟⠛⠉⠉⠀⠈⠉⠛⠷⢷⣞⡁⠀⠄⠐⠀⠡⠀⠂⠀⡁⠄⠀⠁⡀⠌⠀⠠⠀⢁⠀⠌⠀⠀ ⠀⠐⠀⠄⠁⠄⠐⢀⣴⡟⠛⠿⠿⠽⠿⠀⠀⠀⠀⠀⠀⢿⣿⣿⣇⠀⠀⠘⠿⣿⣿⣿⣶⣦⣤⣀⡀⠀⠀⠐⠀⠀⠀⠈⠙⠓⠶⣄⣈⠀⠄⠁⠂⢀⠠⠁⠂⢀⠐⠈⠀⠡⠀⡀⢂⠈⠀ ⠀⠈⠄⠈⡀⠄⢸⣿⣻⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⠟⣣⣄⣲⣶⣵⠿⠿⠛⣹⣿⣿⣿⣿⣿⣶⣦⣤⣀⣀⠀⠀⠀⠀⠀⠉⠙⠶⢦⣌⣀⠀⠐⠈⠀⠐⠈⡀⠐⡀⠠⠀⡐⠀ ⠀⢈⠀⠂⡀⠠⠈⠻⣿⣿⣇⡤⣦⣤⣤⣤⣶⣴⣶⣾⣿⠬⠿⠞⠛⠉⠉⠀⠀⠀⢀⠠⣿⣷⣿⣿⣿⡟⠙⢛⣿⠿⠿⣿⣶⣶⣤⣄⡀⠀⠀⠀⠈⠉⠛⠶⣤⣁⡀⠂⠀⢁⠠⠐⠀⠠⠀ ⠀⢀⠂⠐⠀⡐⠀⡀⠀⠈⠉⠉⠛⠛⠛⠋⠉⠉⠉⠀⠀⡀⠠⠀⠠⠐⠀⡁⢈⠠⠀⢀⠙⢿⣾⣿⣿⠷⠖⠋⠁⠀⡀⠀⠈⠉⠛⠛⠿⢿⣷⣶⣤⣄⣀⠀⣀⣩⡿⠗⠈⠀⠠⠐⠈⠀⠄ ⠀⠠⠀⢁⠂⢀⠐⠀⡁⠐⢀⠂⠀⠄⠀⡐⠀⢂⠠⠁⡐⠀⠄⠁⡀⠂⠁⡀⠠⢀⠐⠀⠠⠀⠁⠀⠀⠀⡀⠄⢈⠀⡀⠁⠂⠁⠠⢀⠀⡀⠀⠈⠉⠙⠛⠉⠉⠀⡀⠄⠁⡈⠀⠄⡁⠈⠀ ⠀⠂⢁⠀⢂⠀⠐⠠⠀⠌⠀⠠⠁⠈⠄⠐⠈⠀⠄⠂⠀⠌⠠⠐⠀⠄⠁⠠⠐⠀⠠⠈⠄⠐⠈⠀⠂⠁⢀⠀⠂⠠⠀⠁⠂⠌⠀⠄⠠⠀⠂⠁⡐⠀⠂⠐⠈⠀⠄⠀⠂⢀⠁⠠⠐⠀⠁ ⠀⢁⠀⠰⢀⠀⠈⠰⢀⠈⢀⠰⠀⠁⠀⠆⠈⢀⠰⠈⠀⠰⢀⠀⠆⡀⠈⢀⠰⠈⠀⠁⢀⠈⠀⠁⢀⠁⠀⠰⠈⠀⠈⡀⠁⢀⠈⠀⠆⠁⡀⠁⢀⠰⠈⠀⠁⠈⢀⠈⠰⢀⠀⠁⡀⠈⠀ ⢀⠂⠈⠄⠠⠐⠈⡀⠄⠐⠀⡀⠂⠁⠄⠈⠠⠀⠠⠐⠈⠀⠄⠀⠂⠠⠐⠀⠠⠀⠌⠀⠄⠠⠈⠠⠀⠄⠂⠁⢀⠈⢀⠀⠐⠀⠠⠈⢀⠐⠀⠌⠀⠠⠀⠡⠈⢀⠂⠠⠀⠄⠐⠀⡐⠀⠂ ⠀⠄⠡⠀⠡⠀⠂⠄⠐⢈⠠⠀⠌⠀⠌⢀⠁⠌⠀⠂⢁⠈⠠⠁⠈⠄⠠⠁⠄⠁⠠⠁⡀⠂⠁⠄⡐⠠⠀⠡⢀⠈⡀⠌⠐⠈⡀⠐⡀⠄⠂⠠⠈⡀⠄⠁⠠⠀⠄⡐⠠⠈⡀⢁⠠⠐⠀ ⠈⡀⢂⠈⠄⡀⠡⠈⠐⡀⢀⠂⠠⠁⠂⡀⠂⠐⠈⡐⠀⡈⢀⠂⢁⠐⠀⢂⠈⢀⠁⡐⠀⠄⡁⠠⢀⠐⡀⠁⠠⠐⠀⠄⠂⢁⠀⢂⠀⡐⠀⡁⠐⢀⠐⠈⡀⠂⡐⠀⠐⡀⠐⡀⠠⠐⠀ ⢀⠐⡀⠐⡀⠠⢀⠁⢂⠠⠀⠄⠁⡐⠠⠐⠈⢀⠁⠠⠐⠀⠄⠀⠂⠠⠁⢀⠂⠄⠐⡀⠄⠂⠠⠐⠀⠄⠠⠈⠄⠐⠀⠂⠄⠂⢈⠀⠄⠀⠂⠠⠈⠀⠄⠁⠠⠐⢀⠈⠄⠐⡀⠄⠐⠠⠀ ⠀⢂⠀⡁⠄⠠⠀⠂⠄⠐⠈⢀⠂⠄⠠⢀⠡⠀⡈⠄⢀⠡⠈⢀⠁⠂⢈⠀⠄⠈⡀⠄⡀⠌⠀⠄⠁⠂⠄⠁⡐⠈⠠⠁⠠⢈⠀⠄⢈⠠⠁⠄⢁⠈⠠⠈⠄⠐⠠⢀⠈⠄⠀⠄⠡⠀⡀ ⠀⠂⠄⡀⠂⠄⢁⠈⠠⢈⠐⢀⠀⢂⠐⠀⡀⢂⠀⡐⠀⡀⢂⠀⠂⡁⠀⢂⠈⡀⠄⠐⠀⡐⠈⡀⠌⠐⠀⢂⠀⠂⠁⠄⡁⠀⢂⠈⠀⠄⠂⠐⡀⠂⡀⢁⠐⠈⠠⠀⢂⠀⡁⠂⠐⢀⠀ ⢀⠁⠂⠐⠠⠐⢀⠈⠄⠠⠀⠂⡀⠂⢀⠂⠄⠠⠀⠄⠂⠠⢀⠐⠠⠀⢁⠠⠀⠄⠠⠁⠂⠠⠐⠀⠄⠂⠁⡀⠂⠌⠀⠂⡀⠌⠀⡐⠈⢀⠂⠐⢀⠐⠀⠄⠂⢈⠐⠠⠀⠂⠠⠀⠡⠀⠀ ⠄⠌⠰⠁⠆⠄⠂⠠⠈⠀⠄⠁⢀⠐⠀⠠⠐⠀⠁⡀⠂⠁⡀⠀⠂⠁⡀⠠⠈⢀⠐⠀⠁⡀⠂⠈⠀⠂⠁⢀⠐⠀⠁⠠⠀⠐⠀⡀⠌⠀⡀⠁⠠⠀⢈⠀⠐⠀⡀⠂⢀⠁⡀⠁⠐⠈⠀
When generation is free, intention is the only thing left to optimise for.
Pilots run the pre-flight checklist. Not to fly slowly. To reach the destination they intended, in a plane that works.
15 minutes of clarity saves 15 hours of rework.
We lead with prototypes, not mocks and docs. Hold many ideas loosely, stay anchored on the problem, not your first solution, and prune toward the one that works.
Can today’s tech even do this?
Will it consistently meet expectations?
Fast enough for real use? Kill the idea if any answer is no.
Craft isn’t a choice. It’s about being intentional about it.
Like the sushi chef refining one knife for a decade, or the maker who knows wood. The skill is not producing. It is judging, reinterpreting, challenging what the tool gives back.
Intuition is compressed experience. AI simulates output. It cannot simulate the years that tell you this output is wrong even when it looks right.
Live the problem, every single day.
I built traintimesuk for my own commute. Wrong platforms, departures that wouldn’t load, API errors. I hit every one myself, day after day, until I knew the product in my bones.
Getting comfortable living the problem is how you build with intention.
TypeScript, Tailwind and shadcn/ui. TanStack Query for live data, React Router for the 2,600 pages.
Postgres, edge functions and pg-cron. Caches the boards, runs the warmers, tracks API quota.
Static build plus one serverless proxy that fronts the edge function and keeps keys server-side.
Every fetch logs latency, cache tier and errors. Playwright guards the regressions.
No team, no microservices. A Vite app on Vercel, a Supabase backend, and the whole product hanging on two train-data APIs.
Times, status, destinations and most platforms. Sanctioned, effectively unmetered, ~1.7s. This is the board.
Exact platforms, calling points, live movement. But rate-limited to 9,000 calls a day, and slow: one call per train, 6–19s for a busy board.
The intention wasn’t piling on features. It was launching something stable first — a board that always loads beats a richer one that stalls.
Instead of four half-built features at 80%, I went deep on a few. Removed the bugs. Focused on craft.
Two lines moving in opposite directions. That is what shipping a real product looks like.
of live departure fetches errored over 30 days — mostly timeouts and “all data sources unavailable” on the slow live path.
The live data path (RealTimeTrains enrichment) was the tail: cache 0.6s, Darwin 1.7s, RTT 6–19s. PostHog, departures_fetch_metrics, last 30 days.
Peak 4.1% the week of May 10. Two weeks after the platform and warming fixes merged, it hit 0.6%. The craft is ongoing — it now hovers near 2%, and the next target is the latency tail. PostHog.
Two changes did most of the work: a circuit-breaker on the rationed RealTimeTrains quota, and pre-warmed caches so the board loads before anyone asks.
Errors 4.1% → 0.6%. Uptime climbed and held.
// keep the live board honest const RTT_BUDGET = 9000 // calls/day · hard cap if (rtt.used >= RTT_BUDGET) // circuit-breaker return darwin() ?? cache // fall back, never blank cron("*/5 * * * *", warmHotBoards) // pre-warm top stations board = staticCache ?? supabaseCache // 4-layer cascade ?? darwin ?? rtt // ~95% never hit live
Use your own product daily and live every flaw. Watch PostHog session replays. The reps compound into instinct.
Scrape Reddit, X and LinkedIn for real complaints. Go deeper with NotebookLM. Talk to real customers, not just friends.
Use the psychology — Hick’s Law, social proof. Julie Zhuo: the eye over the hand. Saarinen: craft is intentional.
Ship in preview like Anthropic. Set expectations and learn in public.
AI cannot decide what to build. That is your job.
At night he carried sacks of flour through Madinah to the widows and the poor, his face covered. For years. Nobody knew it was him.
When he died, they found dark marks across his back from the sacks. That night, over a hundred households found no food had come. That is when the city learned what he had been doing all along.
Build with intention.
Find me after.
Furquan Ahmad · Product Designer at Scale
traintimesuk.co.uk/designing-with-intention-build/deck
The hadith of intention (Bukhari 1) anchors the close. The rest? Find me after.
Your first idea becomes the bar. You ask ‘better than mine?’ and stop asking ‘is mine even right?’
The signal that supports your idea is remembered. The one that contradicts it gets explained away.
Every prompt and prototype you commit makes the idea harder to abandon.
“The MOT doesn’t test for this. Half the cars you list don’t have the engines you claim. Stop lying to promote your bullshit AI app.”
“MOT pass rate is an incredibly poor indicator of reliability — it says more about the people who own the cars than the cars themselves.”
“ChatGPT analysed 33 million MOT tests, you mean.”
“Claude’s done a good job on this one.” — it was not a compliment.
Posted to r/CarTalkUK the week we shipped. Comments unedited.
I posted on Reddit. Over a thousand people pulled the site apart in 24 hours. Every comment and DM got triaged into the fixes that shaped the product.
Banned from several car subs for looking AI-built. The criticism was often right — nothing surfaced bugs faster.
Built v1 on static CSV dumps. When DVSA API access came through, I rewrote the whole reliability engine.
Shipped a servicing tab in a day. Wrong from the start. Shipping fast only works if you’ll throw v1 away.
Today a user finds a bug, I route it to Claude, the fix lands. Next: Claude finds the issues itself.
I never let the model recall facts from memory. Before it writes a word it gets eight feeds of verified, source-tagged data — real prices, official spec, known faults, recalls, MOT history, market context.
The craft isn’t the prompt. It’s the data you refuse to let it guess.
I run the same anchored prompt across three models on every car — measuring latency, UK-specificity, and whether they stay inside the data I gave them.
Best UK-specific trim framing. Cites the Takata recall by name. Stays inside the price anchor.
A near-tie with Gemini on quality, at a fraction of the cost per call. Clean JSON first try, no repair step.
Fastest end-to-end, but stays generic and skips per-trim detail. Good for long-tail cars.
Anchored prompts matter more than model choice. Fast-and-grounded beats slow-and-clever.