🌐 Live app → https://travel-concierge-pi.vercel.app
🤖 Telegram bot → https://t.me/wayzyy_goa_bot
No sign-up needed — there's a guest mode. Open it on a phone if you can, it's built handset-first.
A booking ends at checkout. The trip doesn't.
An AI trip concierge for Goa — it plans the days, books the table, and then stays with you on Telegram for the whole trip.
Built for Geeks2Code 2026 · Wayzyy special track · Team AlphaForge
Every travel app in India stops working the moment you've paid. You land in Goa with a hotel confirmation and a group chat, and everything that actually makes the trip good — where to eat tonight, whether the waterfall is worth the two-hour drive, what to do now that it's raining — is back to being your problem.
TravelBuddy covers the part after checkout. It learns what you like by watching you swipe, builds a costed day-by-day plan you can edit, books you into a partner network, and then follows you into Telegram so the plan is a message away for the rest of the trip.
Every surface is themed through design tokens, contrast-checked by measurement rather than by eye, and follows the system setting unless you override it in your profile.
Message @wayzyy_goa_bot, or link it from the app to bind it to your trip.
| Command | What it does |
|---|---|
/start |
Link a trip using the code from the app |
/today |
Everything happening today, with times and costs |
/next |
Just the next stop |
/plan |
The full itinerary, day by day |
/budget |
What's been spent against what you set |
/mute · /unmute |
Pause or resume nudges |
/help |
The list above |
| anything else | Free-text question, answered against your actual plan |
Ask it "is Dudhsagar worth it on day 3?" or "cheap dinner near Anjuna" and it answers from your itinerary and the partner network — not from generic internet knowledge about Goa.
flowchart TB
subgraph client["Browser / PWA / Android TWA"]
UI["Next.js 15 App Router<br/>React 19 · Tailwind v4"]
LS[("localStorage<br/>trip · planner · history")]
UI <--> LS
end
subgraph edge["Vercel serverless"]
API["/api routes"]
ASSIST["lib/assistant.ts<br/>one prompt, two surfaces"]
TG["/api/telegram<br/>webhook"]
CRON["/api/cron/notify<br/>45-min lookahead"]
API --> ASSIST
TG --> ASSIST
end
subgraph store["State the bot needs"]
KV[("Upstash Redis<br/>snapshots · tokens · chat links")]
end
subgraph ext["External"]
GROQ["Groq<br/>gpt-oss-120b"]
HF["Hugging Face<br/>gemma-3-4b-it vision"]
OSM["OpenStreetMap<br/>Nominatim · tiles"]
TOMTOM["TomTom routing"]
TGAPI["Telegram Bot API"]
end
UI -->|"plan, chat, photo"| API
UI -->|"link trip"| API
API --> KV
TG --> KV
CRON --> KV
ASSIST --> GROQ
API --> HF
UI --> OSM
API --> TOMTOM
TG <--> TGAPI
CRON --> TGAPI
GHA["GitHub Actions<br/>every 10 min"] --> CRON
Three things worth knowing:
- Trip state lives in the browser. There is no user database. The app
persists to
localStorageper signed-in email, so a trip belongs to a device until you link it out. - One assistant, two surfaces.
src/lib/assistant.tsholds the Groq call and the prompt. The in-app support chat and the Telegram bot both callask(), so the itinerary changes once and every surface sees it. - Transport is an interface.
Notifierinsrc/lib/telegram.tsabstracts the channel — WhatsApp drops in as a second adapter without touching the assistant.
| Layer | Choice | Why |
|---|---|---|
| Framework | Next.js 15 (App Router), React 19 | One deployable for UI and API |
| Styling | Tailwind CSS v4, CSS modules | Token-driven theming, full dark mode |
| Motion | Framer Motion | Swipe physics and screen transitions |
| LLM | Groq · openai/gpt-oss-120b |
Fast enough to feel like a chat, not a form |
| Vision | Hugging Face · google/gemma-3-4b-it |
Photo → preference tags |
| Store | Upstash Redis (REST) | Serverless-safe, no TCP pooling |
| Auth | NextAuth v5 · Google OAuth | Nothing to remember |
| Maps | OpenStreetMap, Nominatim, TomTom | No billing key needed to demo |
| Messaging | Telegram Bot API | Free, instant, no business verification |
| Hosting | Vercel + GitHub Actions cron | Hobby tier only allows daily crons |
.
├── .github/workflows/
│ └── trip-notifications.yml # 10-min sweep → /api/cron/notify
└── travelbuddy/
├── travel-buddy/ # the Next.js app — everything live
│ ├── src/app/ # routes + API handlers
│ ├── src/components/ # travel/, itinerary/, onboarding/, auth/
│ ├── src/lib/ # assistant, telegram, store, pricing, schedule
│ ├── src/data/ # vendors, sponsors, Goa knowledge base
│ ├── public/goa/ # 55 photographs
│ └── SKILL.md # working notes, read this before contributing
└── server/ # Node/Express + Gemini agent — NOT deployed
git clone https://github.com/raunak23427/travel-concierge.git
cd travel-concierge/travelbuddy/travel-buddy
npm install
cp .env.example .env.local # then fill it in, see below
npm run devOpen http://localhost:3000. The app works with no keys at all — it falls back to a local Goa knowledge base — but the assistant, photo analysis and Telegram bot need theirs.
npm run typecheck # tsc --noEmit
npm run build # production build
npm run test:travel # Playwright| Variable | Needed for | Without it |
|---|---|---|
GROQ_API_KEY |
Assistant + Telegram Q&A | Chat returns a 503 |
HF_TOKEN |
Photo → preferences | Camera step offers Skip |
TELEGRAM_BOT_TOKEN |
The bot | Telegram features hidden |
TELEGRAM_WEBHOOK_SECRET |
Webhook auth | Webhook accepts anything |
NEXT_PUBLIC_TELEGRAM_BOT |
Deep link in the UI | Link button shows setup help |
UPSTASH_REDIS_REST_URL |
Bot state | Falls back to in-memory; links die between lambdas |
UPSTASH_REDIS_REST_TOKEN |
″ | ″ |
CRON_SECRET |
Protecting the notify sweep | Endpoint is open |
AUTH_SECRET |
NextAuth session signing | Sign-in fails |
AUTH_URL |
OAuth callback | Redirects to the wrong host |
GOOGLE_CLIENT_ID |
Google sign-in | Sign-in button fails |
GOOGLE_CLIENT_SECRET |
″ | ″ |
TOMTOM_API_KEY |
Drive times | Falls back to OSRM |
This is a hackathon prototype, and the README should say which parts are real:
- ✅ Real: the full plan → swipe → itinerary → confirm flow, the Telegram bot end to end, the Groq assistant, photo analysis, dark mode, PDF export, Google sign-in, durable bot state on Upstash.
⚠️ Sample data: the 18 partner vendors are real Goa venues with realistic prices, but the phone numbers are placeholders and no partner agreement exists. Nothing here is a live booking network.- ❌ Not deployed:
travelbuddy/server/— the Node/Express agent. The web app falls back to its local knowledge base and does not call it.
AlphaForge — Geeks2Code 2026, Wayzyy special track.
| M Rayhan Khan | @mrayhankhan |
| Raunak Kumar Giri | @raunak23427 |
| Dhruv Malhan | @dhruv23203 |