Article October 16, 2026 Vibe Coding Leaflet · Capacitor · Android

An LLM-Built, Offline-First Iceland Companion — and an Android App

Ten days, ~2,310 km around Route 1, spotty cell coverage, a drone I wanted to fly legally, and a spreadsheet full of reservations. Instead of stitching together five apps, I had an LLM build a bespoke one: a single offline-first HTML file with 76 itinerary stops, 405 curated points of interest, drone no-fly zones, and live conditions, shipped to my phone as a signed Android APK.

Single-file web app · ~350 KB Capacitor 7 → signed APK Leaflet + OpenStreetMap 10 days · 76 stops 405 curated POIs · 20 layers 32 drone no-fly zones Offline tile cache Firestore REST sync
The Iceland Ring Road 2026 app: full-country map with the route, itinerary sidebar, weather strip, layer legend, and 76 stops
Cover. The whole trip on one screen: the Ring Road traced across a dark basemap, 76 itinerary stops, drive-time badges between days, live weather and aurora KP along the top, and a 20-layer legend on the right.

For a 10-day Iceland Ring Road trip this summer, I needed an itinerary, a map, a budget tracker, a packing list, drone airspace rules, fuel planning, and emergency info. Every existing tool covers one slice of that and assumes connectivity, something rural Iceland does not guarantee. So I had an LLM build Iceland Ring Road 2026: a single self-contained HTML file (~350 KB, no build step, no backend) that became the trip's operating system, and which I wrapped with Capacitor and installed on my Android phone as a signed APK.

The app encodes the entire trip: 76 timed stops across 10 days, 405 hand-curated POIs on 20 toggleable layers, offline-cached map tiles, live weather, wind, aurora and fuel prices, a GPS trail recorder, an expense tracker, and a drone safety system with 32 no-fly zones and an automated pre-flight check against my specific drone's limits. This post is about what it does, how it was built through conversation, and what it was like to actually depend on it for ten days.

~2,310
km around Route 1, planned & audited day by day
76
timed itinerary stops across 10 days, 9 nights
405
hand-curated POIs: fuel, food, restrooms, parking…
32
drone no-fly zones with severity & rules text
1
HTML file → signed Android APK via Capacitor
0
servers, frameworks, or build steps in the web app

01 / The premiseWhy build an app for one trip

The planning corpus was already an app-shaped pile of data: a spreadsheet itinerary, a folder of hotel booking screenshots, activity confirmations, and a browser full of tabs about Icelandic drone law. The normal answer is a travel folder and a prayer: Google Maps lists that won't load beyond cell coverage, reservation PDFs you scroll through at a fuel pump, a notes app with the budget, and drone rules you swear you read.

Iceland specifically punishes that approach. Cell coverage vanishes for long stretches outside the southwest. Fuel gaps on the ring road are real: a handful of >200 km legs between reliable pumps. This was a trip where I wanted the logistics to disappear entirely. A bespoke app that already knows where tonight's hotel is, where the nearest restroom is, whether I can legally launch the drone here, and how much has been spent so far is not a luxury; it's the difference between managing a trip and taking one.

The catch, of course, is that nobody writes a polished app for a single 10-day vacation. Or nobody used to.

02 / The processBuilt through conversation

The app was built the way the rest of my recent projects have been: by describing what I wanted to an LLM coding agent and iterating. The output is a single HTML file, plain JavaScript, no framework, with Leaflet.js for mapping against OpenStreetMap/CARTO tiles. Everything lives in the file: the itinerary, the POI database, the drone zones, the day-by-day driving audit, the warning text. About 6,000 lines, roughly 350 KB, and it opens from file:// with no server.

The interesting part of the workflow is what the LLM couldn't do. The code was the easy half; the durable half was data curation, and that needed a human in the loop. Every hotel pin was verified against actual booking confirmations, the drone rules were sanity-checked against Icelandic and European aviation and conservation authorities, and the drive-time plan came from the spreadsheet rather than the model's guesses.

From there the loop was mechanical: describe a feature, reload the file, correct it. When the web app felt done, the same conversation produced a Capacitor project, a signing keystore, and ./gradlew assembleRelease. The signed APK installed over USB, and the trip app sat on my home screen next to apps from real companies.

03 / ItineraryThe map and the plan

The spine of the app is the timeline: 76 timed entries across 10 days, each with coordinates, cost, and notes. A scrollable day-by-day feed sits beside the map; tapping any item flies the map to it. A built-in feasibility audit lays out each day's distance and wheel time with plain-language risk notes, and each day carries its own contextual warnings — fuel deserts, weather, road etiquette. Every map popup is one tap from Google Maps, Waze, or Apple Maps, and a persistent bar keeps road.is, SafeTravel, and 112 one tap away.

On top of the data, the LLM added the kind of polish a personal project never gets: search across all locations, timeline filters, deep-linkable stops, and a "Fly the route" tour that cinematically flies the camera down the entire ten-day route.

04 / The POI database405 curated points on 20 layers

The itinerary covers where we meant to be. The other 405 points cover where we'd actually need to go: twenty toggleable layers spanning groceries, fuel, restrooms, parking, restaurants and cafes, hot springs, lava-viewing points, and volcanoes — each curated for this route rather than scraped from a generic POI dump.

The Layers tab of the app showing all 20 toggleable layers, with a red drone no-fly circle drawn over the Vatnajökull region on a satellite basemap
Fig 1. The Layers tab with all 20 toggles, over a satellite basemap zoomed to the Vatnajökull outlet glaciers. The red circle is a drone no-fly zone; drive-time badges mark the route between stops.

Fuel planning gets special treatment, because range anxiety is real on this route: a fuel-range layer shows how far the rental's tank reaches, long gaps between reliable pumps are flagged in the day warnings, and gas-station popups show live pump prices converted at the current exchange rate, with fallback prices when offline.

05 / AirspaceDrone safety as a first-class layer

Iceland's drone rules have tightened considerably in recent years, and much of the route falls inside overlapping restrictions: airport exclusion zones, national-park closures, site-specific bans, and seasonal bird-nesting rules. Rather than trust memory, the app embeds 32 no-fly zones drawn on the map — each tagged by severity with a plain-language rules block — warns when GPS shows you're approaching one, and includes a one-tap pre-flight panel that checks current weather against the drone's operating limits and returns a verdict, not just data.

A standing disclaimer, encoded in the app itself

The zone database is a researched snapshot, not an authoritative source; in a country where an eruption can redraw airspace overnight, the app is the first check, never the last.

06 / Connectivity strategyLive data, offline first

The design rule was simple: everything needed to survive a dead zone; live data was a bonus on top. All 481 points and all rules text are embedded in the file, and viewed map tiles are cached to IndexedDB — a prefetch button bulk-caches the entire route corridor before departure. In ten days of driving through coverage gaps, the map never once failed to render.

When connectivity exists, the app surfaces live weather, wind, aurora, and fuel prices, and an animated wind-streamline overlay shows particle flow across the map — the single most decision-relevant weather variable in Iceland. A small set of field instruments rounds it out: GPS trail recording with GPX/CSV export, an expense tracker with categories and a budget, a per-day packing checklist, and cross-device sync over the Firestore REST API.

07 / ShippingFrom browser file to Android app

The web app works anywhere, but a trip app belongs on the phone. The Capacitor wrap was the least dramatic part of the project: capacitor.config.json points at the same HTML file, four native plugins get added (Filesystem, Share, StatusBar, SplashScreen), Gradle produces a signed release APK plus a Play-Store-ready AAB. Sideloaded, it behaves like a real app: splash screen, own icon, status bar theming, native HTTP for the fuel feed. The same file also ships a PWA manifest and service worker, so a hosted copy is installable straight from the browser.

The discipline the LLM enforced on itself is worth noting: the repo README insists the standalone HTML and the Android www/index.html stay byte-identical, with every edit applied to both before rebuilding. One source of truth, two distribution channels.

08 / In the fieldThe trip in photos

And it worked. Ten days around Route 1. A few frames from the trip the app shepherded:

09 / RetrospectiveHonest assessment

What earned its place: the offline tile cache, used constantly through the coverage gaps; the restroom and grocery layers, unglamorous and consulted daily; the one-tap navigate links, which turned each stop into a zero-friction hand-off to Google Maps; and the drone warnings, which flagged restricted sites before we reached the trailhead.

Where the caveats live. The drone database is a snapshot of a fast-moving regulatory landscape, encoded as of June 2026; the app says so itself. Live features degrade silently by design, which is right for availability but means a stale fuel price and a live one look the same unless you check the timestamp. GPS trail recording costs battery on a day when the phone is also the camera. And a single-file app has no update channel: the fix for anything was my laptop and a new APK, which is fine for a personal trip and would not be fine for anything shared.

One honest framing note: this is a demonstration of what LLM-assisted personal software can do, not a validated product. The drone zones and POI coordinates are a hand-checked dataset for one route on one set of dates, not an authoritative feed.

10 / TakeawayThe bigger picture

There's a category of software that has always been theoretically possible and practically absurd: an application built for an audience of one, with a shelf life of ten days. The economics never worked. Now the economics are an afternoon of conversation plus a Gradle build, and the only scarce input left is knowing what you want.

What surprised me is that the code is the disposable part. The asset that actually mattered was the curated data: which restroom is free, which fuel gap is real, which waterfall can't be filmed from the air anymore. An LLM can draft that dataset instantly, but it took a human with booking confirmations and regulation PDFs to make it trustworthy. That division of labor, the model writing the instrument and the human calibrating it, is the same pattern I keep seeing from wind tunnels to CFD studies to home automation. It works just as well at 64°N.

"The most useful travel app is the one that already knows your trip." — the working theory, confirmed somewhere on Route 1

If you found this interesting, you may also enjoy Building the Earth Intelligence Tool with Vibe Coding, AeroFlow NS, an LLM-written fluid solver in a single HTML file, and the Home Assistant overhaul driven from a Telegram chat.