#9: Trip Atlas
Description:
Trip Atlas web-based app was created based on the real life scenario of an individual photographer researching photographic locations for an upcoming trip to several international cities. I conceived, ideated and built the app to provide locations, descriptions, sample photos, geo-related data, access information, equipment recommendations, and places to eat nearby.
Trip Atlas demonstrates the viability of AI-assisted development for building production-ready web applications, with iterative refinement guided by continuous testing and user feedback.
URL: https://www.tripatlas.app
AI Tools:
• Claude Sonnet 4.6
• GitHub CoPilot
• v0 by Vercel
• Loveable
Early Ideation
The initial concept for Trip Atlas began in Claude Code, where the foundational architecture and feature set were defined through conversational AI development. The codebase was then ported into Vercel's v0 platform to leverage its UI generation capabilities and seamless deployment pipeline.
Core Screens Identified:
Landing page (logged-out state with Sign In / Create Account options)
Account creation via email authentication
Trip management page (list of user's trips)
Trip spots page (photography locations within each city)
Individual spots (details about each location, access requirements/hours, recommended equipment)
Key Design Decisions:
No AI-generated imagery - All sample images sourced from real photography APIs to maintain authenticity
Photographer attribution - Every image displays proper credit to respect intellectual property
Image sourcing evaluation - Compared Flickr API (requires commercial agreement, variable licensing) versus Google Places Photos API (pay-per-request at $7/1,000, location-specific results); selected Google Places for superior location relevance
POI identification accuracy - Implemented validation to ensure photography spots return actual, visitable locations with correct coordinates and addresses
UI Bake-off: Loveable vs v0
To evaluate the best tool for rapid UI prototyping, parallel designs were created in both v0 and Loveable. This comparison focused on visual fidelity, component quality, and alignment with the dark-themed photography aesthetic required for Trip Atlas.
The bake-off specifically examined the hero image header treatment, with Loveable proposing a full-bleed background image approach. While visually striking, this approach was ultimately evaluated against v0's component-based design system for long-term maintainability and responsive behavior.
Loveable concept
UI Revisions and Functionality Iterations
Development progressed through multiple revision cycles, each informed by hands-on testing and design refinement.
Footer addition
Added persistent footer with copyright, version badge, and About drawer
Provide app information and professional polish
Archived badge positioning
Moved from overlapping 3-dot menu to left-aligned on trip cards,
Prevent UI element collision
Privacy messaging
Added "You will not be spammed" text to auth screens
Build user trust during account creation
Spot page loading state
Replaced "Location not found" flash with skeleton loader
Improve perceived performance
Button text clarity
Changed "Add Spot" to "Add a custom spot"
Clarify user action intent
“About” drawer interaction
UAT Process
A structured User Acceptance Testing (UAT) process was established to validate changes before deployment. This included systematic verification across affected screens and explicit rollback procedures when implementations didn't meet requirement
Troubleshooting with the Agent
UAT Protocol established:
- Agent performs UAT verification after each implementation
- Multi-location changes verified across all affected screens
- Explicit confirmation required before PR merge
Reported bugs and issues were identified and fixed, with explanations for each
GitHub Integration
Connecting the v0 project to GitHub required learning the workflow for exporting a v0-created project into a version-controlled repository. This enabled proper pull request workflows and collaborative development practices.
Process
Create repository in GitHub (v0-photography-spots-research)
Connect v0 project to repository via Settings panel
Changes in v0 automatically push to a feature branch
Pull request created for review before merging to main
Branch naming convention: v0/[username]-[id]
This integration established a professional development workflow, allowing changes to be reviewed, tested, and merged systematically rather than deploying directly from the v0 environment.
A/B Comparison: Tab vs List Approach
Tab approach
Cities displayed as horizontal tabs
Spots shown in grid below selected city tab
Compact, app-like navigation feel
Better for users with few cities per trip
A toggle-based tool for comparison was implemented to evaluate two different information architecture approaches for displaying trip content. The Tab approach, originating from the Loveable design exploration, was compared against a traditional List approach.
Ultimately, the Tab approach was selected for the current implementation, providing a cleaner mobile experience while maintaining desktop usability.
List approach
Cities displayed as expandable sections
All content visible through vertical scrolling
More traditional web pattern
Better for users wanting full trip overview
Solving the Image Expiration Problem
During beta testing, a critical issue emerged: spot images stopped loading after 24-48 hours. Investigation revealed that Google Places Photo API returns temporary URL references that expire quickly, rendering stored image URLs useless.
Problem discovery
Trip created in March showed broken images weeks later
Database contained valid-looking URLs, but Google had expired the references
This affected all spots across all cities
Option 1: Refresh on view
Approach: Fetch new URL each time a spot is viewed
Trade off: Ongoing API costs; added latency
Option 2: Vercel Blob storage
Approach: Download and store actual images permanently
Trade off: One-time implementation, minimal ongoing cost
Option 3: Do nothing
Approach: Accept broken images
Trade off: Poor user experience
Implementation
Vercel Blob was selected for permanent image storage. The /api/flickr-images route was updated to download images from Google Places and upload them to Vercel Blob, returning permanent URLs. A migration script refreshed all 40 existing spots of the test trip: Edinburgh, Amsterdam, Barcelona and Dublin
Cost analysis
Storage: ~$0.02-0.25/month depending on scale
No ongoing API calls for image retrieval
Images never expire
Future roadmap
Trip Atlas is currently in beta with several planned enhancements to expand functionality and improve user experience.
Route Planning & Optimization
The most ambitious planned feature enables users to build an optimal route for visiting photography spots within a city. Users select their starting location (hotel or accommodation), choose which spots to visit, and pick a transport mode (walk, drive, or public transit). The app then calculates the most efficient path between spots, factoring in travel time and optimal photography conditions like golden hour and blue hour. Start time recommendations help photographers arrive at each location when lighting conditions are ideal.
Offline/PWA Mode
A Progressive Web App implementation using Serwist (service worker) and IndexedDB will enable users to access their trip data without internet connectivity. This is particularly valuable for travelers accessing their itinerary in areas with limited connectivity.
Print & Download Itinerary
Users will be able to print or download their trip itinerary as a clean, ink-friendly PDF. The output will include trip name, dates, cities, and for each spot: name, address, description, recommended times, and equipment suggestions.
Image Loading Optimization
Currently, each spot fetches 2 images from Google Places API. A "Load more photos" button will allow users to request additional images on demand, balancing visual richness against API costs ($7 per 1,000 requests).
Nearby Spots Discovery
While viewing an individual spot, users can optionally see additional photo-worthy locations within a configurable radius that didn't make the curated list. This feature is controlled by a user preference toggle, keeping the UI clean by default while giving photographers the option to discover bonus opportunities.
Trip Atlas screens
Trip screen
Spot screen
Was this a successful experiment?
While this goes beyond the established experiment scope, it was a successful AI-assisted development of a production-ready web app. I was able to use this throughout my travels as a way to plan, find and manage my daily shots.
What surprised me?
The relative speed of the UI design from v0 as well as some of the pattern suggestions it put forward during the iterations.
What did I not expect?
The amount of time I spent troubleshooting was a painful. I did not expect to spend so much time (and token resources) on bugs. Ultimately I learned how to better interact with the agent in order to generate a more successful, positive output. I also learned that persistent UAT is necessary to avoid larger issues later.
What would I have done differently?
Since this was my first vibe coded app, there are many things I would have done differently, starting with how I had the agent approach the work. I would have broken it down more and started the UAT process at the beginning. Ultimately, I’ve got a better handle on the process and steps required to build and produce.