Adjacent
A trip planner that puts your next stop on the home screen





01 The story
A Flutter travel app for iOS and Android. It keeps a trip's itinerary on a map, finds nearby places with Google Places, drafts itineraries with Gemini and stores booking confirmations in a wallet. Home-screen widgets and an iOS Live Activity show what's next.
Adjacent started in May 2025 as a one-page Iceland trip planner: a Google Map with driving directions between stops, a day-by-day itinerary saved to Firestore, custom icons for waterfalls, volcanoes and hot springs, and a Gemini button for suggestions. That page is still online. Two months later I rebuilt it as a Flutter app, and by August 2025 it handled any trip.
The app holds a trip in trip, day and map views, with flights, hotels and activities as typed items and their confirmations attached. A Discover feed pulls nearby places from Google Places, with a 'Spin' that picks one at random. The home dashboard shows destination weather, sunrise, local time and the exchange rate, and Gemini drafts an itinerary from a form or a chat. I tried a React Native port in February 2026, set it aside and redesigned the Flutter app instead.
The biggest push was outside the app. Android gets seven Kotlin widget providers, including today's plan, a countdown, weather, a swipeable smart stack and a photographic 'Around You' map that refreshes live Places results in place. iOS gets a WidgetKit extension with interactive iOS 17 widgets and a Live Activity that tracks a flight from departure to arrival. Flutter feeds all of them through home_widget with debounced syncs, and every widget deep-links to the right tab.
In May 2026 a refactor renamed it Wayfare, then Adjacent, and I ran a fake-data audit. The sunrise card had been quietly showing Paris times whenever no trip was selected. Placeholder content that looked real was replaced with honest empty states, HTTP timeouts and tests, and places search moved to the new Google Places API.
Development has been paused since May 2026. The app runs on Android and iOS from source but isn't in either store.
02 What it does
- 01
Itinerary in trip, day and map views, with flights, hotels and activities as typed items and confirmations attached
- 02
AI trip builder: a guided form or a chat that drafts an itinerary for any destination with Gemini
- 03
Discover: nearby places from Google Places, category filters, place details, saved places and a random 'Spin'
- 04
Home dashboard with destination weather, sunrise and sunset, local time and a live USD exchange rate
- 05
Wallet of bookings with real QR codes and native document opening
- 06
Android widgets (today, countdown, weather, nearby, smart stack, Around You map), iOS widgets and a flight Live Activity
- 07
Itinerary reminders, dark mode, six color palettes, haptics and pull-to-refresh
- 08
Conversion tools for currency, fuel price, distance, volume and temperature
03 How it's built
No backend of its own. The app stores trips on the device and calls Google, Gemini and the weather and currency APIs directly. The 2025 web planner synced its itinerary to Firestore.
All 5 connections, as text
- Flutter app (Riverpod) → On-device storage: trips, places, documents
- Flutter app (Riverpod) → Home-screen widgets + Live Activity: home_widget sync, deep links back
- Flutter app (Riverpod) → Google Maps / Places APIs: search, nearby, photos, maps
- Flutter app (Riverpod) → Gemini (itinerary drafts): generate itinerary
- Flutter app (Riverpod) → Weather, currency, sun times: destination data
04 Engineering notes
Native widgets on both platforms: seven Kotlin AppWidgetProviders (one a RemoteViews smart-stack service) and a SwiftUI WidgetKit extension with Live Activities, fed from Flutter through home_widget with debounced syncs
Deep links from every widget and item into the matching tab and detail screen
Riverpod with shared location state, so the dashboard tile and the Around You widget refresh in place with an 'Updated X ago' label
Google Places API (New) for text search, nearby search, details and photos; Static Maps for widget backgrounds; Time Zone and Geocoding APIs
Fake-data audit: honest models, Paris fallbacks removed, typed item forms, HTTP timeouts and 650+ lines of widget tests
The 2025 web version: one HTML page with Google Maps Directions and Places, Firestore sync under anonymous auth, and Gemini suggestions
05 By the numbers
- 7
- Android widget providers, plus an iOS WidgetKit extension with a Live Activity
- 6
- Color palettes: Coral, Aurora, Volcano, Glacier, Moss, Midnight
06 Stack
App
- Flutter
- Dart
- Riverpod
- google_maps_flutter
- home_widget
- live_activities
- flutter_local_notifications
- qr_flutter
- SwiftUI WidgetKit
- Kotlin AppWidgets
Backend
- Gemini 2.5 Flash
- Google Places API (New)
- Google Maps Static / Geocoding / Time Zone APIs
- OpenWeather
- open.er-api.com exchange rates
- sunrise-sunset.org
Data
- shared_preferences (trips, saved places, documents)
- Firestore (web planner)
Infrastructure
- Firebase Hosting (web planner)
- GitHub Actions Firebase deploy (web planner)
Tooling
- flutter_test
- flutter_launcher_icons
- flutter_dotenv
Lines of code (approx.)
- Dart17,948
- Swift1,636
- HTML/JS (web planner)1,209
- Kotlin945
- Android XML (widgets)833
≈ 22,571 lines
Repositories
- iceland-flutterprivate
- iceland-tripprivate
Two repos: iceland-trip (5 commits, 2025-05-29 to 2025-05-30, the web page) and iceland-flutter (114 commits across master, refactor-itinerary-explorer and an SSD snapshot branch, from 2025-07-19). The last real development commit is 2026-05-11; the 2026-11-09 commit only saved a small uncommitted build.gradle change found on the SSD.