How I Built a Travel Assistant Chat App Using GPT and Jetpack Compose
In a world where AI is changing the way we plan and explore, I wanted to create something fun and practical — a mobile travel assistant powered by an LLM that helps you plan your next trip through natural conversation.
This is how I built Travel Guide Chat, a Jetpack Compose Android app that lets users chat with an LLM about travel plans, save conversations, and revisit them later.
🧠 Why I Built It
I’m passionate about combining AI, mobile UX, and real-world use cases. Travel Guide Chat is my attempt to blend these into one product:
- A sleek, real-time chat interface
- OpenRouter-powered LLM for smart responses
- Persistent chat session history
- Auto-generated chat titles based on content
- Markdown rendering for clean, readable answers
🔧 The Tech Stack
Layer | Stack |
---|---|
UI | Jetpack Compose |
State Mgmt | ViewModel + StateFlow |
API | OpenRouter (ChatGPT-compatible) |
Networking | Ktor |
Storage | JSON File (simple local persistence) |
Jetpack Compose gave me the flexibility to rapidly build a clean UI, while OpenRouter’s LLM API gave me access to powerful GPT-style responses.
💬 Key Features
✈️ Chat with an AI Travel Assistant
Users can ask about destinations, get itinerary suggestions, or plan a day trip — all via natural conversation.
📚 Chat History
Each session is stored locally with an auto-generated title (like “Weekend in Tokyo”) and can be reloaded later.
🔁 Rename, Re-engage, Repeat
Long press to rename chats, tap to resume any past session, and continue where you left off.
📝 Markdown Rendering
LLM responses are rendered in Markdown for clean formatting — helpful for lists, bolded places, etc.
💡 Challenges & Solutions
1. Persisting Chat State
I needed a lightweight solution, so I used JSON file storage rather than Room DB. This kept things fast and simple.
2. Auto-Titling
Instead of hardcoding titles, I generated them using the first user message and LLM response heuristics — giving each session a meaningful identity.
3. Compose UI Bugs
Some scroll issues popped up in the chat window, but were solved with LazyColumn
+ LaunchedEffect(scrollState)
to keep the view anchored at the bottom.
📸 Screenshots
🧪 What’s Next
I plan to extend this with:
- RAG (Retrieval-Augmented Generation) using Pinecone
- Searchable conversations
- Cloud sync so chats persist across devices
- UI improvements like avatars, emojis, etc.
✍️ Final Thoughts
This project helped me level up my Compose skills, explore LLM integration, and think more deeply about UX in AI apps. I built something I’d actually use — and that’s what makes coding exciting.
You can check out the repo here:
👉 github.com/kevinhui98/travel-guide-chat
Follow me for more projects on GitHub!