2025 · Solo · PWA
Field Journal
An offline-first notebook for hike photos, notes, and where they were taken.
- PWA
- IndexedDB
- Leaflet
- TypeScript
The problem
When I hike, my phone ends up full of photos I never look at again, and the small things I noticed — a heron on the Rum River, the way frost sat on the prairie grass — disappear by the time I get home. Most journaling apps need a signal, and the places I like best usually don't have one.
What I built
Field Journal is a progressive web app that works entirely offline. You add a photo, write a few lines, and it reads the photo's EXIF data to place the entry on a small map and record the time.
Everything lives in IndexedDB on the device. When I'm back on Wi-Fi, I can export a trip as a single JSON file or a printable page. There's no server, which also means there's nothing to leak.
- Service worker caches the app shell and map tiles for areas I've saved ahead of time
- EXIF GPS parsing in the browser, with a manual pin when a photo has no location
- Images are resized on-device before storing, keeping a whole summer under 200 MB
- Works as an installed app on my phone with no app store involved
Tech stack
- Service WorkersOffline shell and pre-cached map tiles
- IndexedDBEntries and resized photos stored locally via a thin wrapper
- LeafletLightweight map that behaves well without a network
- TypeScriptVanilla TS with Vite, no framework, to keep it small
What I learned
Offline-first changed how I think about state. Instead of asking the server what's true, the device is the source of truth, and syncing becomes an export problem rather than a conflict problem. That felt like a small idea until I tried to build it the other way first.
I also found that browser storage limits vary more than documentation suggests, so I test on real devices now instead of trusting desktop Chrome.