How we work

← home

No dark patterns. No secret prompts. No fake features.

Our promises

1. What's free stays free. Screenshot this page. If we ever move a currently-free feature behind a paywall, you can cite us.
2. Every button works. If we render "Save", it saves. If we render "Share", it shares. No empty lambdas.
3. Real offline. Airplane mode is a first-class test. Not a paywall promise we don't ship.
4. Real delete. One click removes your data. Confirmation email. Audit log. GDPR + CCPA compliant.
5. Cancel in one click. On the pricing page. No hidden retention flow.
6. No auto-renew. Ever. The trip-planning space is full of "canceled" trials that keep charging users for months. Our subscriptions require explicit opt-in every year. Missed the reminder? Your account pauses — you can renew any time, no data loss. We will never charge you for something you didn't renew.
7. Buy the city — no subscription needed. Every curated city is €4.99 one-time, lifetime access, no account required. If you never want to see a "subscription" in your inbox, you don't have to.

Our AI prompt (verbatim)

Every AI trip planner sends users to closed restaurants because their prompts allow hallucination. Here's ours, published so you can audit it:

Place extraction (used by /api/import)

Extract every real-world place, venue, restaurant, city, landmark, museum, or point of interest mentioned in this travel content. Return STRICT JSON array of objects with keys: name (string), city_hint (string or null), country_hint (string or null), category (restaurant | cafe | museum | attraction | hotel | park | beach | landmark | shop | other), snippet (short quote). Return ONLY the JSON array, no prose.

Content:
<caption text + OG description + user text>

Itinerary generation (used by /api/itinerary — Sprint 2)

Grounded on our 10 curated city catalogs. The model receives ONLY places that exist in our catalog with verified hours. It cannot invent restaurants. Prompt:

You are a trip planner. Build a day-by-day itinerary using EXCLUSIVELY the places listed below. Do not invent or suggest venues that are not in the list. If a suggested place is closed on the visit day per its opening_hours field, choose a different place from the list.

Places available (JSON):
<curated list from our catalog with opening_hours>

User preferences:
<style, pace, days, dietary, kids, mobility>

Return JSON: { days: [ { day: 1, morning: [place_id], lunch: place_id, afternoon: [place_id], dinner: place_id, note: "..." } ] }

Race-day pacing (used by /api/pacing)

You are a race-day pacing coach. Write a concrete 3-paragraph strategy note (Markdown, max 300 words) for this runner. Be specific about pace, HR, fuel timing.

Race: <name, km, elevation gain, activity_type>
Target finish: <HH:MM:SS>
Runner: <weight, heat tolerance, caffeine, gut>
Weather forecast: <text or 'unknown'>
Recent fitness: <text or 'unknown'>

Structure:
**Start (0-20%):** how to open without blowing up.
**Cruise (20-70%):** target pace + fuel timing + HR discipline.
**Push (70-100%):** decision rule for when to attack.

What we intentionally DON'T do

Tech stack (public)

We're a two-person team. Our stack is FastAPI on Fly.io + Next.js on Vercel + Postgres on Neon + Gemini 2.0 Flash for AI + OpenStreetMap for maps + Chirp 3 HD for audio guides.

Full architecture at /system. Full pricing at /pricing.

Questions? alexkitpl@gmail.com