Project · live on iPhone and web

Feral Travels

A road-trip planner for people who travel in their vehicle. You describe the trip in a sentence; Penny plans every day's drive, and Finn places fuel stops so you never run dry.

Penny chat with a trip requestThe planned itinerary, day by day, with a fuel stopMap of the planned route
Two weeks in Spain's national parks, planned from one message.
3,000+unit and component tests, plus 70 guard tests that make specific bugs impossible to bring back
97 + 44Playwright tests against each PR's own preview + Maestro flows on an iOS simulator
142recorded decisions, each mapped to the test that enforces it, or flagged if none does
829commits in 6½ months, one engineer

The engineering

Built like a team of one that can't afford a bad deploy

  1. 1

    Merging is the deploy, so the gate has to be right

    Every PR gets its own Neon branch of production, rehearses its migrations there, and is tested on its own preview. The production deploy re-checks that this exact PR's CI was green before any migration runs: the worst case is a stale production, never a half-migrated one.

  2. 2

    Incidents become guards, not memories

    Each production incident ends in a structural guard that makes that class of bug impossible to reintroduce, mutation-checked by putting the bug back and watching the guard fail.

  3. 3

    End-to-end tests with no backdoor

    Every Playwright spec mints its own user and signs in through the real emailed-code flow; no session bypass exists. One spec sends a real email and asserts SPF and DMARC pass, so a broken DNS record fails CI before sign-in mail lands in spam.

  4. 4

    An LLM that converts, never authors

    Penny runs on Claude Haiku with 21 tools and only turns a sentence into typed calls. Coordinates come from place resolution, dates from the legs, and fuel stops only from Finn, a deterministic engine that never routes a dry stretch past the vehicle's range.

In the app

One message to a 14-day plan

Stack

Next.jsExpo / React NativeTypeScriptNeon PostgresDrizzleClaude tool useGoogle Maps PlatformRevenueCatVitestPlaywrightMaestroGitHub ActionsVercel