The feedback was brutal, and mostly fair.




Posted to r/CarTalkUK the week we shipped. Comments unedited.
You can ship anything now. The hard part is shipping the right thing.
By Furquan Ahmad · Product Designer at Scale
The most valuable work is often the work nobody sees.




Posted to r/CarTalkUK the week we shipped. Comments unedited.
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. It is in the next prompt, not the shipped product. Each prompt is a slot lever, and intermittent good output keeps you pulling.
Every prompt fires back something that looks like work, so you feel productive. But are you going the right way at all, building something people actually want?
Each new feature is more long-term tech debt than you realise, and someone has to keep it alive. Are you even watching feature usage and adoption, or just shipping more?
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.
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.
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.
⠐⡀⢂⠐⠠⠐⡀⢀⠀⡀⢀⠀⡀⠀⡀⢀⠀⢀⠀⡀⢀⠀⢀⠀⡀⠀⡀⢀⠀⢀⠀⡀⢀⠀⢀⠀⡀⠀⡀⢀⠀⢀⠀⡀⢀⠀⢀⠀⡀⠀⡀⢀⠀⢀⠀⡀⠀⡀⢀⠀⡀⠀⡀⢀⠀⡀⠀ ⠐⡀⠂⠌⠠⠁⡀⠂⢀⠐⠀⡀⠀⡁⢀⠀⢈⠀⡀⠄⠀⡈⢀⠀⡀⠁⡀⢀⠈⠀⡀⠄⠀⡈⢀⠀⡀⠁⡀⢀⠈⠀⡀⠄⠀⡈⢀⠀⡀⠁⡀⢀⠈⢀⠀⡀⠁⢀⠠⠀⢀⠁⡀⠠⠐⠀⡀ ⠐⠠⢁⠂⠄⠡⢀⠂⠄⠐⢀⠀⡁⠠⠀⢈⠀⠠⠀⠄⠁⠠⠀⡀⠄⠂⠀⠄⠠⠁⠀⠄⠁⠀⠄⠀⠄⠂⠀⠄⠠⠁⠀⠄⠁⠀⠄⠀⠄⠂⠀⠄⠐⠀⠠⠀⠌⠀⠠⠈⠀⠠⠀⠐⢀⠂⠀ ⠈⡐⠠⠈⠠⠁⡀⠂⠠⢈⠀⠄⠐⠀⠂⠠⠈⢀⠐⠠⠈⠠⠐⠀⡐⠠⠁⡀⠂⠄⠁⡐⠈⠠⠈⢀⠐⠠⠁⡀⠂⠄⠁⡐⠈⠠⠈⢀⠐⠈⡀⠂⠈⠄⠁⡐⠠⠈⢀⠂⠁⠄⠁⠂⠠⠐⠀ ⢀⠐⡀⠂⢁⠀⡐⠠⠁⠠⢀⠐⠈⡀⠌⢀⠂⠠⠐⠀⠂⢁⠐⠀⠄⡐⠀⠐⠠⠐⠀⠄⠂⠁⡐⠀⡐⠀⠂⠠⠐⠀⠂⠄⠂⠁⡐⠀⠠⠁⡀⠄⠡⠐⠀⠄⡀⠂⠄⠐⠈⡀⠂⠁⡐⠠⠀ ⠀⢂⠠⠐⠠⠀⠄⠂⠈⠄⠠⠀⡁⠠⠀⠄⠠⠁⠠⠁⢈⠀⠄⠈⡀⠄⠈⠄⢁⠠⠈⡀⠂⢁⠠⠐⠀⠌⠀⡁⠄⠡⠀⠂⠈⠄⠠⠈⠠⠐⠀⠠⠐⢀⠈⠀⠄⠐⠈⠠⠐⠀⠌⢀⠐⠀⡀ ⠀⢂⠀⠂⡁⠄⠠⠁⡈⠐⢀⠂⠐⡀⠁⡐⠀⠂⢁⠐⠀⢂⠈⡀⠄⠂⡐⠈⡀⢀⠂⠄⠂⠠⢀⠂⠈⠄⠂⡀⠐⢀⠂⠁⠂⡀⢁⠐⠀⠂⠁⡐⠀⠄⠠⠁⡀⠂⢁⠐⠀⡁⠄⠂⡀⠂⠀ ⠐⠠⠈⠐⢀⠐⠀⡁⠠⢈⠀⠄⠂⢀⠂⠠⠈⠐⠀⠂⢈⠀⠠⠀⡐⠀⠄⠐⠀⠄⢀⠂⠄⠁⠠⠐⠀⠂⠄⠐⠈⢀⠠⠁⢂⠀⠄⠠⠁⠈⠄⠀⠄⠂⢀⠐⠀⠐⠠⠀⠂⡀⠄⠂⠐⠀⠁ ⠀⢁⠀⠁⠆⠀⠆⡀⠁⢀⠀⠆⠈⠀⡀⠁⠰⠈⢀⠁⠀⡈⠀⠁⠀⠆⠈⠀⢁⠈⠀⡀⠆⠁⠰⢀⠁⠈⠀⡈⠰⠀⡀⠆⢀⠀⡈⠀⡀⠁⠀⠆⢀⠰⠀⢀⠈⠀⢁⠀⠆⢀⠀⡈⠰⠈⠀ ⠐⡀⢈⠐⠠⠈⢀⠐⠈⡀⠄⠂⠈⠄⠀⠄⠁⠠⠀⠠⠁⠠⠐⠈⢀⠂⠌⠐⠀⡀⠂⠄⠠⠈⠄⠠⠀⡁⠂⢀⠐⠀⠠⠐⠀⠠⠀⠂⠀⠄⠁⢠⡶⠶⣾⡦⠀⢈⠀⠄⠐⡀⠄⠀⡐⠠⠀ ⠀⡐⠠⠐⠀⠂⠠⠈⠐⠀⠄⢈⠠⠀⢁⠠⠈⠀⠌⠀⠄⠁⠠⠈⠀⠄⡀⠌⠀⠄⠐⡀⠁⠄⠐⠠⠐⠀⡐⠀⠌⠀⡁⠄⠈⡀⠄⠁⡀⠂⣨⠟⠀⣸⣿⠃⡀⠂⠠⠈⠀⠄⡀⠁⠠⠀⠄ ⠠⠐⢀⠈⠄⢁⠠⠈⡐⠈⠀⠄⢀⠂⠄⠐⠀⡁⠠⠈⢀⠈⡀⠄⠁⠠⠀⠠⠈⢀⠐⠀⠂⢈⠀⠂⠠⠁⠀⢂⠀⡁⠀⠄⠂⠀⠄⠂⠀⣴⠏⠀⢀⣿⡟⠀⢀⠐⠀⠂⢁⠀⠄⠂⢁⠠⠀ ⠀⠌⡀⠐⠈⡀⢀⠂⠀⠌⢀⠈⠀⡀⢄⣂⣄⡀⠄⠁⡀⠂⠄⡀⠌⠀⠄⠁⠐⠀⠠⠈⠀⠄⠂⠁⡐⠈⠀⠄⠂⠀⡐⠀⠠⠁⢀⠐⣼⠃⠀⠀⣸⣿⠃⢀⠠⠀⢈⠐⠀⠄⠂⠐⢀⠠⠀ ⠀⠂⠄⠁⢂⠠⠀⠄⠡⠀⠂⠀⠁⠺⢿⣏⠉⠛⠲⢦⣀⡠⠀⠀⠄⠁⠂⡈⠄⢈⠀⡁⠈⡀⠄⠁⡀⠄⠁⠂⢀⠁⠀⣸⣷⡞⠲⣾⠃⠀⠀⢠⣿⡿⣆⠀⢀⠐⠀⠠⠈⠀⠄⠁⠠⠀⡀ ⠈⡐⠈⢀⠂⠀⠄⡈⠠⠀⡁⠈⠀⠌⠈⠻⣷⣆⡀⠀⠈⠙⠳⠮⣤⣐⠀⢀⠐⠀⠂⢀⠐⠀⡀⠁⣀⣀⣂⣌⣤⣶⡴⠴⠿⠟⠻⠷⢶⣿⣫⣽⠿⠶⠿⢤⣤⣀⡈⠀⠄⠁⠂⠈⡐⠀⠀ ⠀⡐⠈⢀⠐⠈⢀⠐⠀⢂⠀⠄⠁⠠⠈⢀⠘⢿⣿⣦⡀⠀⠀⠀⠀⠉⠛⠶⣤⣆⣬⡤⠶⠶⡞⠻⠛⠉⠉⡃⣁⡈⣼⣆⠀⠀⠀⠀⠛⣿⣿⡿⢷⣶⣶⣤⣤⣉⣽⣷⠶⠀⠈⠄⠠⠈⠀ ⠀⠐⠠⠀⠌⠀⠄⠠⠁⢀⠀⠂⠈⢀⠐⢀⣀⣀⣙⣿⣿⡶⠴⠶⠒⠛⠛⠋⠉⠁⠀⢀⠀⣄⡂⣷⣰⣷⡼⣿⣻⣿⠻⠿⠀⢀⣠⣶⡿⠟⠋⠀⠀⠀⠀⠉⠉⠉⠁⠀⢀⠠⠁⢀⠂⢈⠀ ⠀⠡⢀⠈⡀⠂⠈⢀⠂⠀⠄⢈⣤⠶⠛⠋⠉⠉⠉⠀⢀⠀⢀⠆⢀⣂⣀⣧⡀⣾⡦⢾⣿⢿⡧⣳⣿⣻⣇⣉⠀⣠⣤⡴⣿⡿⠛⠉⠀⠀⠐⠀⡁⠈⠐⡀⠂⡀⠂⢁⠠⠀⠂⡀⠐⠀⡀ ⠀⠐⡀⠐⠀⠠⠁⡀⠠⢈⣴⣏⡁⠀⡀⠀⠀⠀⠀⠀⠸⣿⣿⣷⡀⠿⠏⢻⣗⣽⣿⣼⠿⠟⠛⠉⠉⠀⠈⠉⠛⠷⢷⣞⡁⠀⠄⠐⠀⠡⠀⠂⠀⡁⠄⠀⠁⡀⠌⠀⠠⠀⢁⠀⠌⠀⠀ ⠀⠐⠀⠄⠁⠄⠐⢀⣴⡟⠛⠿⠿⠽⠿⠀⠀⠀⠀⠀⠀⢿⣿⣿⣇⠀⠀⠘⠿⣿⣿⣿⣶⣦⣤⣀⡀⠀⠀⠐⠀⠀⠀⠈⠙⠓⠶⣄⣈⠀⠄⠁⠂⢀⠠⠁⠂⢀⠐⠈⠀⠡⠀⡀⢂⠈⠀ ⠀⠈⠄⠈⡀⠄⢸⣿⣻⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⠟⣣⣄⣲⣶⣵⠿⠿⠛⣹⣿⣿⣿⣿⣿⣶⣦⣤⣀⣀⠀⠀⠀⠀⠀⠉⠙⠶⢦⣌⣀⠀⠐⠈⠀⠐⠈⡀⠐⡀⠠⠀⡐⠀ ⠀⢈⠀⠂⡀⠠⠈⠻⣿⣿⣇⡤⣦⣤⣤⣤⣶⣴⣶⣾⣿⠬⠿⠞⠛⠉⠉⠀⠀⠀⢀⠠⣿⣷⣿⣿⣿⡟⠙⢛⣿⠿⠿⣿⣶⣶⣤⣄⡀⠀⠀⠀⠈⠉⠛⠶⣤⣁⡀⠂⠀⢁⠠⠐⠀⠠⠀ ⠀⢀⠂⠐⠀⡐⠀⡀⠀⠈⠉⠉⠛⠛⠛⠋⠉⠉⠉⠀⠀⡀⠠⠀⠠⠐⠀⡁⢈⠠⠀⢀⠙⢿⣾⣿⣿⠷⠖⠋⠁⠀⡀⠀⠈⠉⠛⠛⠿⢿⣷⣶⣤⣄⣀⠀⣀⣩⡿⠗⠈⠀⠠⠐⠈⠀⠄ ⠀⠠⠀⢁⠂⢀⠐⠀⡁⠐⢀⠂⠀⠄⠀⡐⠀⢂⠠⠁⡐⠀⠄⠁⡀⠂⠁⡀⠠⢀⠐⠀⠠⠀⠁⠀⠀⠀⡀⠄⢈⠀⡀⠁⠂⠁⠠⢀⠀⡀⠀⠈⠉⠙⠛⠉⠉⠀⡀⠄⠁⡈⠀⠄⡁⠈⠀ ⠀⠂⢁⠀⢂⠀⠐⠠⠀⠌⠀⠠⠁⠈⠄⠐⠈⠀⠄⠂⠀⠌⠠⠐⠀⠄⠁⠠⠐⠀⠠⠈⠄⠐⠈⠀⠂⠁⢀⠀⠂⠠⠀⠁⠂⠌⠀⠄⠠⠀⠂⠁⡐⠀⠂⠐⠈⠀⠄⠀⠂⢀⠁⠠⠐⠀⠁ ⠀⢁⠀⠰⢀⠀⠈⠰⢀⠈⢀⠰⠀⠁⠀⠆⠈⢀⠰⠈⠀⠰⢀⠀⠆⡀⠈⢀⠰⠈⠀⠁⢀⠈⠀⠁⢀⠁⠀⠰⠈⠀⠈⡀⠁⢀⠈⠀⠆⠁⡀⠁⢀⠰⠈⠀⠁⠈⢀⠈⠰⢀⠀⠁⡀⠈⠀ ⢀⠂⠈⠄⠠⠐⠈⡀⠄⠐⠀⡀⠂⠁⠄⠈⠠⠀⠠⠐⠈⠀⠄⠀⠂⠠⠐⠀⠠⠀⠌⠀⠄⠠⠈⠠⠀⠄⠂⠁⢀⠈⢀⠀⠐⠀⠠⠈⢀⠐⠀⠌⠀⠠⠀⠡⠈⢀⠂⠠⠀⠄⠐⠀⡐⠀⠂ ⠀⠄⠡⠀⠡⠀⠂⠄⠐⢈⠠⠀⠌⠀⠌⢀⠁⠌⠀⠂⢁⠈⠠⠁⠈⠄⠠⠁⠄⠁⠠⠁⡀⠂⠁⠄⡐⠠⠀⠡⢀⠈⡀⠌⠐⠈⡀⠐⡀⠄⠂⠠⠈⡀⠄⠁⠠⠀⠄⡐⠠⠈⡀⢁⠠⠐⠀ ⠈⡀⢂⠈⠄⡀⠡⠈⠐⡀⢀⠂⠠⠁⠂⡀⠂⠐⠈⡐⠀⡈⢀⠂⢁⠐⠀⢂⠈⢀⠁⡐⠀⠄⡁⠠⢀⠐⡀⠁⠠⠐⠀⠄⠂⢁⠀⢂⠀⡐⠀⡁⠐⢀⠐⠈⡀⠂⡐⠀⠐⡀⠐⡀⠠⠐⠀ ⢀⠐⡀⠐⡀⠠⢀⠁⢂⠠⠀⠄⠁⡐⠠⠐⠈⢀⠁⠠⠐⠀⠄⠀⠂⠠⠁⢀⠂⠄⠐⡀⠄⠂⠠⠐⠀⠄⠠⠈⠄⠐⠀⠂⠄⠂⢈⠀⠄⠀⠂⠠⠈⠀⠄⠁⠠⠐⢀⠈⠄⠐⡀⠄⠐⠠⠀ ⠀⢂⠀⡁⠄⠠⠀⠂⠄⠐⠈⢀⠂⠄⠠⢀⠡⠀⡈⠄⢀⠡⠈⢀⠁⠂⢈⠀⠄⠈⡀⠄⡀⠌⠀⠄⠁⠂⠄⠁⡐⠈⠠⠁⠠⢈⠀⠄⢈⠠⠁⠄⢁⠈⠠⠈⠄⠐⠠⢀⠈⠄⠀⠄⠡⠀⡀ ⠀⠂⠄⡀⠂⠄⢁⠈⠠⢈⠐⢀⠀⢂⠐⠀⡀⢂⠀⡐⠀⡀⢂⠀⠂⡁⠀⢂⠈⡀⠄⠐⠀⡐⠈⡀⠌⠐⠀⢂⠀⠂⠁⠄⡁⠀⢂⠈⠀⠄⠂⠐⡀⠂⡀⢁⠐⠈⠠⠀⢂⠀⡁⠂⠐⢀⠀ ⢀⠁⠂⠐⠠⠐⢀⠈⠄⠠⠀⠂⡀⠂⢀⠂⠄⠠⠀⠄⠂⠠⢀⠐⠠⠀⢁⠠⠀⠄⠠⠁⠂⠠⠐⠀⠄⠂⠁⡀⠂⠌⠀⠂⡀⠌⠀⡐⠈⢀⠂⠐⢀⠐⠀⠄⠂⢈⠐⠠⠀⠂⠠⠀⠡⠀⠀ ⠄⠌⠰⠁⠆⠄⠂⠠⠈⠀⠄⠁⢀⠐⠀⠠⠐⠀⠁⡀⠂⠁⡀⠀⠂⠁⡀⠠⠈⢀⠐⠀⠁⡀⠂⠈⠀⠂⠁⢀⠐⠀⠁⠠⠀⠐⠀⡀⠌⠀⡀⠁⠠⠀⢈⠀⠐⠀⡀⠂⢀⠁⡀⠁⠐⠈⠀
Intention starts with finding the right direction.
We don’t anchor on the first idea and just make subtle changes from there. Find the right direction first, then build toward it.
Pilots run the pre-flight checklist. Not to fly slowly. To reach the destination they intended, in a plane that works.
Live the problem, every single day.
I took my lessons from AutoScout and the early versions of traintimesuk and started being intentional about what I built: fewer features, with far more focus.
I built traintimesuk for my own commute, and hit every wrong platform and failed load myself, day after day, until I knew it in my bones.
This is traintimesuk.
The board I check every morning. Live departures, platforms and disruptions for any UK station, built to be glanced at in seconds.
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.










Live disruptions and how each station was running, at a glance.
Real-time position of the train along its route, updating as it moved.
Future departures with date and time pickers, not just “now”.
All useful. None of it mattered while the board itself wasn’t reliable.
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.
At first I relied on RealTimeTrains alone. It rate-limited me, the agent quietly hammered the quota, and the board went down. The model never warned me. I found out the hard way. Now Darwin is the always-on backbone, and RTT only enriches behind a circuit-breaker.
I stopped asking the model to infer product truth from memory. Before it suggested a fix, I gave it the evidence: API limits, latency traces, cache paths, error rates, station edge cases, session replays and failing tests.
The craft isn’t the prompt. It’s the evidence you refuse to let it guess.
The prompt became the interface between my judgement and the machine.
For the hard fixes, I run the same anchored prompt across frontier models, measuring whether they respect the data, spot edge cases, and produce a patch I can actually verify.
Strongest at connecting RTT quota burn, cache paths, timeout spikes and the circuit-breaker design.
Cleanest surgical diffs when the prompt includes PostHog traces, failing tests and exact files to touch.
Useful for summarising logs, drafting test cases and checking copy, weaker on architectural tradeoffs.
Anchored prompts matter more than model choice. Fast-and-grounded beats clever-and-loose.
PostHog changed how I saw the product.
For the first time I could watch how people actually used the site, where they tapped, where they gave up, which stations they searched again and again.
And it showed me what was breaking: the failed fetches, the slow live path, the rage clicks. I stopped guessing and started fixing what the data pointed at.
of live departure fetches errored over 30 days, mostly timeouts on the slow live path.
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.
Load-more breaks. Platforms don’t display. On the genuinely hard problems, the LLM stalls.
In plan mode it tells me the fix has landed. The next morning, the bug is still there.
For a train app, reliability is the whole point. Vibe coding quietly trades it away. You can’t be fully reliant on the model.
So you dogfood it yourself. The last 10%, the reliability, is the hardest to close, and where I spend the most time. It’s also what makes the app good.
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.
Build with intention.
Find me after.
Furquan Ahmad · Product Designer at Scale

traintimesuk.co.uk/designing-with-intention-build/deck