Side project
Product Designer · 2026 · Scenra

Planning the drive that's worth taking

Google Maps optimises for speed. Scenra optimises for what's worth seeing between A and B — an AI-native scenic road-trip planner for iOS.

Download on theApp Store
At a glance

2:24 median from install to a finished trip

A creative tool that hands you a complete, verified drive inside 150 seconds of a cold install.

72% of installs complete onboarding

No tutorial, no account required before the first result.

37% go on to generate a trip

More than a third of cold installs reach a produced artefact — the bar the design was aimed at.

#1 in the UK App Store

For "scenic road trip", after rebuilding the listing on measured competition.

01, The Trip
The trip

A drive we couldn't plan with the tools built for planning

We drove London to the Lake District and couldn't plan a scenic route with any tool we tried: Claude, Gemini, and ChatGPT gave partial answers, and Maps couldn't hold a plan. Nothing stitched AI knowledge to real coordinates, hours, and fuel stops — so we built the loop ourselves.

Last week of December 2025, we drove from London up to the Lake District — friends, and Nala the dog. The drive itself was the point. We wanted scenic, not motorway-fastest: where to stop and when, where to refuel, where to grab a coffee, which areas were dog-friendly, where Nala could pop out for a break. We wanted to know what was worth seeing between A and B.

We tried to plan it with the tools you'd reach for in 2025: Claude, Gemini, ChatGPT. Each gave a partial, plausible answer. None gave a complete plan. We went back and forth across three chat windows, sent screenshots into the group chat, jumped out to Google Maps to check what places actually looked like and how close they sat, then back to the chats to refine. The output was a fragmented list, not a route.

The friction wasn't AI being bad at travel. It was that no surface stitched the AI's knowledge to real coordinates, real photos, real opening hours, real distances, real ferry crossings, real fuel stops — and back to the AI when we wanted to swap something. Every product we touched did one of those things well. None of them did the loop.

The trigger

By the time we were back, the decision had made itself: build the loop ourselves. The problem wasn't worth waiting for someone else to solve, and we'd just spent a weekend specifying the requirements as customers.

02, The Build
The build

Doc-driven discipline, with Claude Code as the engineering partner

One living document, SCENRA_PRD.md, is the source of truth any Claude session can read and ship against. Fourteen RW-prefixed primitives build every screen; we direct product and architecture while Claude Code implements, and corrections are written back into the PRD so sessions compound.

The build is as much of the story as any screen. Moyin leads the engineering with Claude Code as a genuine partner — not a code completer — while product and design decisions take shape between us. Three things hold it together: the documentation, the design system, and the working pattern with Claude.

Documentation

A single living document as the source of truth

Every feature, decision, bug, and ID routes through SCENRA_PRD.md — 366 KB, treated as authoritative. Backlog rows mirror to memory caches for Claude session continuity, and the interactive Kanban board regenerates from the PRD, never the other way around. Conflicts always resolve in the PRD's favour.

Why it matters at this scale: documentation isn't ceremony, it's how Claude sessions stay consistent across days, branches, and contexts. A new session, in a new chat, with zero memory of yesterday's work, can read the PRD and the playbook and ship correctly. The PRD is the org chart.

FileRole
SCENRA_PRD.md Single source of truth. Every implementation, decision, backlog row, changelog entry.
PROJECT_SYNC.md Playbook for any Claude session. Ship-implementation, decision-capture, backlog-add recipes.
BACKLOG_SYNC.md The four-way sync between PRD, memory caches, the HTML board, and browser localStorage.
backlog_board.html Interactive Kanban, regenerated from the PRD. Drag-drop state lives in localStorage.
Design system

Fourteen primitives, and no bespoke widgets

Fourteen reusable components, all RW-prefixed: buttons, cards, chips, text fields, step indicators, floating sheets, a segmented control, shimmer, a looping video player, tight-line-height text, word-reveal text for onboarding. Every screen is built from these. If a new pattern is needed, it earns a primitive first.

Tokens live in one theme file: cream background, dark brown text, olive-green CTA, off-white cards, with Google Sans Flex as a variable font tuned for roundness. Six nature-type colour pairs — sky, sage, coral, lavender, sand, amber — keep the scenery badges distinct without breaking the warm palette.

Working pattern

What "AI as engineering partner" actually means

Vibe-coding stories in 2026 all read the same: "I built this with AI." The specifics are the whole point. We direct the architecture; the AI fills the implementation. When it suggests something we disagree with — a different state model, a wrong abstraction, feature creep — we override and write the spec correction back into the PRD, so the next session inherits the corrected understanding. The AI compounds across sessions because the documentation does.

I · Intent Spec before code
II · Structure Direction before build
III · Execution Worktree per feature
IV · Feedback Documentation discipline
Us · 01 Ideation Jobs-to-be-done. What problem, for whom, why now.
Us · 02 PRD-first Spec, edge cases, open questions — written before any code.
Claude · 03 Read & challenge Push back on gaps in the spec before writing any code.
Us · 04 Design & architecture Data model, API boundary, design-system primitives.
Claude · 05 Implementation Code against the architecture, in an isolated worktree per feature.
Claude · 06 Changelog entry Conventional commit plus a written record back into the PRD.
Us · 07 Sim + review iOS Simulator pass, code review, override the AI where needed.
Us · 08 Real-world trip Cheddar Gorge · Edinburgh · Lake District. Where the real bugs surface.
Us Claude Code The changelog loop, back into the PRD
03, How It Works
How it works

Two screens of input, one review step, then the trip reveals itself

Two input screens and a review step. The AI plans the route, verifies every stop against Google Places, and reveals a timeline with per-leg drive times.

Two screens of input cover trip details and scenery preferences. A review step lets you tweak anything before tapping Generate. Behind the scenes: AI route plan, Google Places verification on every stop, polyline routing, per-leg drive times — all surfaced as a progressively revealed timeline.

Scenra trip-details screen: a one-way / return toggle above fields for departure, destination, date, and departure time, with a Continue button.
01

Trip details

One-way or return. Departure, destination, date, and time.

Scenra preferences screen with a grid of selectable scenery cards: Mountains, Forests, Coastal, Lakes, Countryside, Historic Towns.
02

Preferences

Scenery, number of stops, and service stops on the route.

Scenra review screen with editable summary rows for departure, destination, dates, and departure time, and a Generate Route button.
03

Review and edit

Confirm or tweak any input before tapping Generate.

Scenra generated route screen, London to Edinburgh, with a map showing the full route and stop pins plus total distance and drive time.
04

Your route

The AI plans the route and reveals it on the map with total distance and drive time.

Scenra route detail screen: a scrollable list of scenic and service stops with per-leg drive times and scenery tags between cards.
05

The stops

Scenic and service stops down the route, each with per-leg drive times, verified against Google Places.

04, Design Decisions
Design decisions

Four problems where the choice mattered more than the feature

Four choices did the load-bearing work: full flexibility over the AI's first answer, dragging service stops between segments (the hardest problem in the build, with ten documented dead-ends behind it), a corridor-scaled fuel pipeline where every stop is real, and visits that mark themselves by geofence while the trip's past turns read-only.

Thirteen features ship; four design choices did the load-bearing work. Each one is a problem, a choice, what we rejected, and the detail nobody sees.

Decision 01

Full flexibility over the AI's first answer

The AI generates a reasonable trip; the person taking it has context the AI doesn't. The product fails if the first answer is also the final answer. Three gestures, one principle: do whatever you want, instantly, no rigid timeline. No edit-mode, no save button. Every modification triggers a real-time polyline and drive-time recalculation.

Add a stop. Natural language — "Lake District," "near Bath" — slotted into the route at the right point, no backtracking. The same input targets fuel, EV, or coffee via the service-mode toggle.
Replace a stop. Swipe to reveal; the sheet opens with up to 15 alternatives already filtered by scenery preference — no re-asking what kind of trip this is.
Delete a stop. Swipe, then a quick confirm — intentional friction for the one destructive action. Removed stops are kept for second thoughts.

What we rejected

Edit-mode toggles that lock the timeline until exited
A "save changes" button
Universal confirm dialogs on every modification — only Delete keeps one, because only Delete is destructive
The detail nobody sees

The recalculation isn't free: route fetching, drive-time computation, and polyline redraw all run on every modification. SwiftUI's diffing animates only the changed cards, polyline geometry is reused where the change doesn't cross a segment boundary, and the Replace sheet's alternatives are pre-cached so it opens with content already loaded.

Decision 02

Drag service stops between segments

Service stops — fuel, EV, coffee — are placed by an algorithm that maximises drive-time efficiency. But you might want fuel before the long stretch, not after. Long-press and drag, segment-aware drop, route recalculates. SwiftUI-native in the end, with everything around it doing the work. The hardest single design problem in the build.

Drag a fuel stop between segments. Ten documented dead-ends sit behind the version that shipped.

What we rejected — 3 of 10 documented dead-ends

A custom long-press-then-drag gesture, the textbook SwiftUI answer: cancels mid-flight on parent re-render, especially fragile next to a heavy Map sibling
A UIKit drag-interaction bridge: SwiftUI intercepts touches on its own managed views, so UIKit's long-press recognizer never fires
A separate window for the drag overlay: the window rendered fine (we tinted it to check), so the gesture path was the failure, not the rendering
The detail nobody sees

SwiftUI's own "which stop is being dragged" state is unreliable — it's cleared 500ms into the drag by the framework's snapshot lifecycle. Any display logic gating on it works for half a second, then fails silently. The fix was a separate drag-source ID the lifecycle doesn't touch. That single discovery accounts for about half the feature's commit history.

Decision 03

Smart fuel-stop placement — every stop is real

"Add a fuel stop" sounds simple. The optimal point in the drive doesn't always have a station. The route includes a ferry. The AI returns a "petrol station" that's a closed forecourt. Generic distance-based placement fails on every one of these. The pipeline that shipped: a distance-proportional corridor, a 5-point fan-out search, a fuel verification gate, and segment-bound exclusion.

The fuel-stop pipeline. The corridor scales with trip length, then a 5-point search, a verification gate, and segment exclusion.

What we rejected

Single-point search at the midpoint — missed valid stations near segment edges, at 132% verification overhead in early testing
Pure distance scoring with no quality gate — surfaced fuzzy matches as fuel stations, breaking the every-stop-is-real promise
A hard-coded 50km radius — turned a 100km trip into a 50km detour
The detail nobody sees

The corridor isn't a circle. It's a swept area along the polyline with proportional padding, matched against actual segment projection rather than vertices only. Switching from vertex-only to segment-projection matching dropped verification overhead from 132% to 16% — the difference between fuel placement that ships and fuel placement that times out.

Decision 04

Visits that mark themselves

Marking a stop as visited shouldn't be a chore you have to remember. With Always-location granted, Scenra drops a geofence around each stop and watches for the round trip: you arrive, and the moment you cross back out, that's a confirmed visit. A push fires right then — "How was your stop at [stop name]?" — and one tap drops you onto that stop to add the photos you just took and mark it done.

From there it propagates everywhere: the timeline card shifts to past tense, the map pin gets a green check, and the web page a friend opened without the app updates too. Less a checkbox, more a quiet live activity following the trip as it happens. No Always permission? A time-based ETA gate stands in, so it still works, just without the geofence.

06 · mark-visited-memories Screen recording: a stop marked as visited (card desaturates, green pin-check appears), then the Memories tab — photo grid grouped by month — into a trip-scoped photo viewer. Portrait phone screen recording.
Visited stops and the Memories tab. The planner becomes a record of the trip you actually took.

What we rejected

A manual "visited" checkbox — making the user remember to tap is the build that fails on the actual drive. The app should notice
A permission grab at install — "Allow Always Location" before you've even planned a trip earns a no. It's asked just-in-time, on departure day
Trusting a single GPS ping — a confirmed visit is the round trip, not one coordinate that might be a red light next to the place
The detail nobody sees

Once a stop is visited, every stop before it is in the past — and the past is read-only. You can't drag, replace, or insert before a stop you've already driven past, because editing a trip you're halfway through is incoherent. The one exception is delete, a quiet "I skipped this" cleanup. The trip stops being editable the moment it starts being real.

05, Product Arc
Product arc

Plan, then companion, then memory

Plan, Companion, and Memory have all shipped — the app plans the trip, rides along, and keeps it. The roadmap is four bets deep, led by vehicle-aware routing.

The first three decisions live in Plan; the fourth — marking and memories — is Companion. Both phases have shipped, so the app now plans the trip, rides along, and keeps it.

PhaseWhat it doesStatus
Plan AI-generated scenic routes, verified stops, full editing (add, replace, delete, drag), return trips, sharing. Shipped
Companion During-trip. Mark stops as visited, capture photo memories, pre-trip and end-of-trip reminders. Shipped
Memory The Memories tab: a photo grid of where you went, grouped by month, with a per-trip viewer. Shipped

With the lifecycle shipped, the roadmap is about depth, not phases. Four bets, in priority order.

FeatureWhat it doesStatus
Vehicle-aware routing Add your car, and Scenra plans fuel or EV-charging stops around its real range, with a cost estimate for the whole trip. Next up · flagship
Smart scenery Scenra reads the route and pre-picks the scenery that actually fits the drive ahead. In design
Group trips Invite friends into a trip and build it together: add, swap, and vote on stops without anyone leaving the app. Next major bet
Overnight stays On longer drives, where to break for the night and where to stay, based on the route and when you want to stop. In design
06, What Shipped
What happened when it shipped

Four problems the data found, and what we did about each

A cold install reaches a finished trip in a median of 2 minutes 24 seconds; 72% finish onboarding and 37% generate a trip. The paywall wasn't broken, the price was: repricing ended a 34-day run of zero purchases. A vague complaint became a measured 10km corridor constraint, and a ranking collapse turned out to be the launch boost expiring — the rebuilt listing reached #1 in the UK App Store for "scenic road trip".

Shipping is where the design work starts being answerable. Every figure on this page is measured, not estimated: RevenueCat for anything involving money, PostHog for product analytics, App Store Connect for discovery.

Finding 01

Time to first value

The whole promise is a complete drive in seconds, so the number that matters is how long a stranger takes to get one. From a cold install, through onboarding, destination search, scenery selection, and AI generation, the median is 2 minutes 24 seconds — a creative tool that hands you a finished artefact inside 150 seconds.

72% of installs finish onboarding and 37% go on to generate a trip. No tutorial, no account required before the first result. For a cold-start generative tool, getting more than a third of installs to a produced artefact was the bar we designed against.

Finding 02

The paywall was not the problem

Purchases were failing at Apple's payment sheet: 22 consecutive attempts, zero completions. The obvious move is to redesign the paywall. The data said not to — 40% of paywall viewers were tapping a plan, so intent was healthy and the design was doing its job.

So we ruled things out in order. Every purchase attempt resolved cleanly, so it wasn't a technical fault. We reproduced the gate by hand on a clean install to see it. Then we benchmarked the category and found the actual answer: competitors sat at $14–$60 per year against our $120–$207 annualised. The problem was price. Weekly pricing was cut and shipped, and purchases began converting the day the new price went live — ending a 34-day run of none.

The judgement

The expensive mistake would have been a paywall redesign: weeks of work aimed at a step that was already converting. The data was pointing at the step after the one everybody blames. Ruling out the obvious cause is worth more than a fast fix.

Finding 03

Turning a vague complaint into a measured threshold

"The stops are too far off my route" is a real complaint and a useless bug report. So we built a six-corridor benchmark to put a number on it. Four of six corridors were shipping stops 13.9km to 35.8km off route.

With the problem quantified, the fix could be specific: a 10km corridor constraint applied at a single chokepoint rather than patched across the pipeline. Re-running the benchmark afterwards returned zero stops beyond 10km off route. The threshold is now the definition of correct — which means the next regression is catchable.

Finding 04

Discovery collapsed, and the obvious diagnosis was wrong

Organic search ranking fell away. The intuitive read is keyword decay: the terms stopped working, so rewrite them. Comparing four rank snapshots against the dates metadata had actually changed showed the ranks died inside a week with no metadata change at all. That's not decay — that's the new-app launch boost expiring on schedule.

Knowing the real cause changed the fix. Instead of rewriting keywords on instinct, we rebuilt the listing on measured competition: targeting search terms where competing apps held single-digit review counts, and avoiding the ones defended by apps with 10,000+. Scenra reached #1 in the UK App Store for "scenic road trip".

07, Not Building
What we're not building

The decline list

No turn-by-turn navigation, no live trip tracking yet, no deeper monetisation. What a small project says no to is half the design work.

A small team ships when scope discipline is brutal. What a project says no to is half the design work. Below: what Scenra doesn't do today, why each is a deliberate no, and what would change our minds.

FeatureWhy notStatus
Native turn-by-turn navigation Apple, Google, and Waze each spend thousands of engineering-years on real-time traffic, lane guidance, and offline tiles. We don't compete with that. Scenra plans the trip; your preferred maps app drives it. Not building
Live trip tracking In-app navigation during the drive is the natural extension of Companion. The open question is strategic, not technical: does Scenra navigate, or keep handing off? Better answered from real mid-trip usage than guessed. Future
Deeper monetisation Feature gates, affiliate revenue from fuel and EV stops, partnerships — all post-PMF questions. Charging early users more distorts the signal we need. Future
Why decline-list discipline matters here

A small build can't afford the wrong yes. The velocity comes from the named no's as much as the yes's: every feature deliberately left out is time spent shipping the ones that are in.

08, Field Notes
Field notes

Real trips with the real app

Cheddar Gorge stranded us at a hallucinated fuel stop — and built the verification pipeline; every stop is now checked against Google Places. Edinburgh ran a multi-day return with every stop real, and each trip ends as a fix list for the next build.

Field Notes is the proof. After the Lake District trip seeded the build, we used each beta on real drives, capturing what worked, what didn't, and what shipped after each return. Two test trips, in order — the first is the one that changed how the AI works.

Trip 01

Cheddar Gorge: the trip that built the hallucination pipeline

The shortest meaningful test: London to Cheddar Gorge in a day. The scenic stops were real and beautiful. We were happy. Then we hit the service stop.

Claude had confidently named a fuel station, with coordinates and everything. It didn't exist. The AI had hallucinated a petrol station and dropped us in the middle of nowhere. We hadn't eaten, hadn't drunk, hadn't let Nala out — all of that was saved for the service stop. The stop was a lie.

That's not a UX bug, that's a trust loss. If someone's first real trip with Scenra ends with a hallucinated fuel stop leaving them in a lay-by, they don't come back. A real product can't ship that.

Cheddar Gorge is what built the verification pipeline. Every stop — scenic or service — is now checked against Google Places before it lands in the timeline, and unverified fuzzy matches are rejected outright. The four-step fuel pipeline in Decision 03 is that same discipline applied to service stops.

07 · field-notes-cheddar-gorge Gallery for the Cheddar Gorge day trip: the scenic stops that worked, plus the lay-by where the hallucinated fuel stop was supposed to be — the empty middle-of-nowhere makes the story land. Full content width.
Cheddar Gorge day trip. The hallucinated fuel stop in the middle of nowhere built the verification pipeline.
Trip 02

Edinburgh: multi-day return, all real stops

The first long beta after the verification pipeline shipped: London to Edinburgh and back, with separate scenic routes for each leg. It tested return-trip generation, the Heads Up sheet on actual ferry-flagged routes, and offline mode through rural patches. Every stop on both legs was real. The pipeline held.

Each trip ends with a list of fixes that lands in the next build. Drag-to-reposition, the Heads Up sheet redesign, the fuel-verification quality gate, the hallucination pipeline itself — all of it came from a real trip surfacing a real gap.

08 · field-notes-edinburgh Gallery for the Edinburgh trip: stops along both legs, landscape and portrait variety, captionable later. Full content width.
Edinburgh trip. Multi-day return after the pipeline. Every stop verified, every stop real.
Ely Cathedral, photographed on a test trip
Ely Cathedral
Seven Sisters cliffs, photographed on a test trip
Seven Sisters
Pulled over at the roadside, fixing a bug mid-trip
Pulled over to fix a bug, mid-trip
Lullingstone Castle, photographed on a test trip
Lullingstone Castle
Box Hill, photographed on a test trip
Box Hill
The Angel of the North, photographed on a test trip
The Angel of the North

Scenra is a two-person project: designed together, with Moyinoluwa Olufisayo leading the engineering and Claude Code as the working partner. This page tells the story from where I sit — the trip, the product, the design decisions. Moyin's deep-dive at fisayo.me/work/scenra tells the build from the inside: the PRD discipline, the dead-ends, the commit history.