Frustration
Every trip lived scattered across a confirmation email, a boarding pass screenshot, a camera roll, and an airline app's delay alert. Nowhere did a flight become a record.
Book itFly itKeep it
The home of your life in the air.
A booking platform with real commercial logic on one side, and a mobile app that turns every flight taken into a personal aviation history on the other.
Year
2026
Role
Sole builder — product design, commercial model, frontend, backend, mobile app
Status
Live · Shipped
Stack
Next.js · Supabase · Flutter · Duffel API · AirLabs API · Google Places
The gap
Every trip lived scattered across a confirmation email, a boarding pass screenshot, a camera roll, and an airline app's delay alert. Nowhere did a flight become a record.
I genuinely enjoy the record-keeping side of travel — airports, routes, aircraft, distance actually covered. No booking app is built to care about that.
Duffel offers real inventory with payments built in, and nobody was pairing that booking capability with a genuine diary product on the other side.
Most apps pick a lane — book travel, or log travel. SkyLog's premise is that those are the same story told from two ends.
What I built
Departure · The website
A Duffel-powered booking platform for flights, stays, and rental cars, plus trip management, account tools, and support — all under one clear-pricing commercial model.
Arrival · The mobile app
Home, Flights, Insights, and Profile wrapped around one idea: every flight should become part of a travel story instead of disappearing into an inbox or a camera roll.
The journey
Flights, stays, and rental cars sourced through Duffel, with service margin built into the displayed price rather than added after commitment.
Flights arrive from four sources — SkyLog bookings, manual logs, forwarded email confirmations, and boarding-pass scans — and resolve into one vault.
Anything SkyLog discovers on the traveler's behalf lands as a pending suggestion. Nothing enters the record without explicit approval.
Insights turns the vault into a personal aviation history: route maps, total distance flown, top airports, cabin patterns, and milestones.
Inside the app
Eight surfaces, all feeding or reading the same travel record.
One vault for bookings, manual logs, imports, and scans
Files, barcodes, screenshots, or links — parsed
Confirmations become suggestions, never entries
Route maps, distance, top airports, milestones
Destination discovery via Google Places
What a trip actually cost, per flight
The world you've covered, mapped
Subscription tier for the deeper version
The commercial model
Margin flexes by cabin class, by domestic versus international routing, and slightly for nonstop or one-way itineraries — with rates authorized admins can adjust live. The traveler never sees any of that. They see one price.
Earn sustainably on every successful booking while remaining transparent about what the traveler will pay.
Base fare
62%
Sourced live through Duffel
Service margin
22%
Flexes by cabin, route, and itinerary
Processing recovery
9%
Card costs absorbed, not passed on late
FX buffer
7%
Currency movement can't erode the margin
Illustrative shares · no surprise fees after commitment
The hardest problem
Ticket IT and FactsDeck were mine to fully control. SkyLog's core booking capability depended on a third party whose responsiveness and access tiers I had no leverage over — so I scoped around what each tier actually allowed, and built everything that didn't depend on Duffel to stand on its own.
Duffel's support queue moved in weeks and months rather than days, and several capabilities SkyLog needed sat behind account tiers requiring a formally registered business — an awkward fit for a deliberately low-commitment solo build. No amount of engineering shortens a vendor's support queue or a verification requirement.
A booking, a manual entry, an approved email import, and a captured boarding pass all describe the same flight. Making them resolve into a single record — rather than four near-duplicates — was the core data problem behind the vault.
The document vault accepts a file, a barcode scan, a screenshot, or a link, then surfaces route, seat, gate, and boarding group. Every format the traveler already has on their phone had to be a valid way in.
A Next.js and Supabase website and a Flutter app share no framework conventions. Consistency in language, visual identity, and the traveler's journey had to be enforced deliberately, because nothing in either stack does it for you.
Design principles
A booking, a manual log, an approved import, and a captured pass resolve into the same travel record — not four silos.
Nothing SkyLog discovers enters a record without explicit approval. Trust was a design constraint, not a legal afterthought.
Logging a flight takes four fields. Photos, notes, ratings, and expenses layer on when the traveler wants them.
Next.js and Flutter share no conventions, so shared language and identity had to be enforced deliberately.
Product views
Screenshot slots ready for web and app captures.
Takeaways
Some of the hardest constraints on a solo build are organizational — a support queue, an access tier, a business-verification requirement. The move isn't to fight the constraint; it's to design the rest of the product so it isn't hostage to it.
Designing margin logic that is cabin-aware, route-aware, and FX-aware while still resolving into one honest number forced me to think like an owner with a business to sustain, not only an engineer shipping features.
"Nothing enters your record without approval" could have been a privacy-policy line. Instead it's a UI state — a pending suggestion waiting for the traveler to act. Travelers feel the interaction, not the terms.