tripBuddy

A collaborative group trip planner. Friends shape one itinerary together in a shared chat, vote on ideas, and get real walking and Uber times, directions, expenses and a printable plan. A home-lab engine does the thinking; the LLMs suggest, and code decides.

Systems

📱
Members' phones
installable web app
⇄
🔥
Firebase
Hosting · Auth · Firestore
Spark plan · $0
⇄
🖥️
tripBuddy engine
Mac mini · FastAPI
listeners · jobs · PDF
↙
↓
↘
⚡
PazLabs edge router
Jetson · local first
🟠 Ollama qwen2.5 (Mac mini)🔵 Gemini — capped🟡 Grok — capped
🗺️
Google Maps Platform
Places · Routes · Maps JS
daily quotas · free tier
☁️
Cloudflare Tunnel
calendar feed (read-only)
+ National Weather Service

From a chat message to the plan

1

Members sign in at tripbuddy.pazlabs.io

A Next.js app, statically exported to Firebase Hosting and installable on a phone. Google sign-in through Firebase Auth; members join a trip with an invite link. Security rules in Firestore decide who can read and change what.

2

Everything lives in Firestore, live

The itinerary, votes, Plan chat, flights, lodging, expenses and the Bring list are Firestore documents. Every phone listens live, so a change on one shows up on the others in about a second. No server sits between the app and its data.

3

The home-lab engine watches for work

A FastAPI service on a Mac mini keeps Firestore listeners open. A chat message, a new item, a vote that closes, or a PDF request becomes a queued job, processed in order. It writes results back to Firestore, and the apps update on their own.

4

Plan chat goes through the edge router

“Move the Alamo to Saturday morning” is sent with the trip's context to the PazLabs edge router on the Jetson. It routes local first: qwen2.5:7b on Ollama, escalating to Gemini or Grok only when needed, under daily caps. The model returns edit operations, never a whole plan.

5a

Guardrails run in code, after the model

The engine applies each edit itself: anchors and locked items never move, check-in and checkout times hold, flights limit who can be there, and walking stays under the day's limit. Refused edits are explained in the reply; the rest apply as a new plan version that anyone can undo.

5b

Some messages never reach a model

“Optimize Saturday”, “I'll bring the speaker” and expense messages like “Victor paid $48 for Uber” are recognized in code and handled locally. Expense text is never sent to a cloud model.

6

Places, routes and maps come from Google Maps Platform

Every venue is matched to a Google place. Ratings and hours are fetched live when someone taps, and only the place ID and coordinates are stored. Walking and driving paths are cached for 30 days; miles are measured in code along them. Hard daily quotas keep it inside the free tier.

7

Outputs: a calendar feed and a PDF

Each member gets a private calendar link, served read-only from the Mac mini through a Cloudflare Tunnel. The Trip Itinerary PDF is rendered on the engine from the live itinerary and returned through Firestore, so no file storage is needed.

Built to run for free: Firebase's Spark plan with no Cloud Functions or Storage, home-lab compute, a free Cloudflare Tunnel, Google Maps Platform held inside its free monthly usage by hard daily quotas, the free National Weather Service, and local models first. Photos live in a shared album, linked rather than stored.

Next.jsFirebase HostingFirestoreFirebase AuthFastAPIPythonMac miniOllamaNVIDIA Jetson Orin NanoGemini APIGrok APIGoogle Places APIGoogle Routes APIMaps JavaScript APICloudflare TunnelReportLabiCalendarPlaywright
⚡ How the edge router routes