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

Travel Guide Chat Walkthrough


🧪 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!