projects/cantrip
$ cat projects/cantrip/README.md

CanTrip

Drop in your booking receipts, get a day-by-day itinerary, and see what's still missing before you fly.

status
beta
url
cantrip.cloud ↗
started
10/2026
stack
Go · Hotwire · SQLite/Turso · OpenRouter
CanTrip homepage
fig.1 — a trip's itinerary, worked out from its receipts

## why

When I plan a trip, sometimes I can be a little bit obsessed with getting everything well-planned. Maybe it’s the OCD in me, but travel still feels like a luxury, and when I spend on a luxury, I want to do it right.

I’m not really into minute-by-minute details of the whole trip, but it’s very important to me to see the shape of the daily itinerary: what to do, how to get there (especially since we mostly use public transport), and what to eat around there (specifically because we have dietary restrictions).

I’ve tried a lot of travel planner apps out there, but none of them really offers what I want. Some of them are built around giving you recommendations in the hope that you’ll buy/book stuff through their affiliate links. Nothing wrong with that business model, it’s just not how I usually plan a trip. So I always end up falling back on good ol’ Excel files and spreadsheets. They work, but operating them feels like a second job, and that’s why I came up with CanTrip.

The idea is simple: with CanTrip, I can just drop in my bookings, usually flight & hotel first, and it will generate the itinerary board for me to fill in the blanks, either by booking other activities or by dropping Map links of places I want to visit or food that I’ve confirmed I can have.

No recommendations I didn’t ask for, and no spreadsheet to babysit. Just my trip, taking shape one day at a time.

Fun fact: the name CanTrip is a double entendre. First, it’s a play on the Singlish phrase “Can trip?”, which is the question the app tries to answer (and also a nod to Singapore, where the app was conceived). Second, it’s borrowed from cantrip in D&D, a type of magic that’s cheap to cast and available to almost all classes.

## how it works

  1. The Bookings tab of the Japan Spring trip, with the box to drop receipts in above the flights and stays sorted from them2 views
    01 drop in your receipts Upload PDFs, screenshots or photos, or paste a confirmation email. Each one is read in the background and sorted into flights, stays, activities, food, transport, and rentals. Every detail says whether it came from the receipt or was a guess, and a booking that's seen twice is merged, not added again.
  2. The week calendar of the Japan Spring trip, days across and hours down, with stays in a lane on top and plans in a column beside it2 views
    02 see the itinerary Bookings become a day-by-day list on the phone and a week calendar on desktop. Each day is drawn in its own local time, so a flight from Singapore lands at the Japan time it really lands.
  3. A pop-up over the calendar with the ways to get to dinner in Gion, a subway, a bus and a train with their fares, a taxi and a walk2 views
    03 sort what's missing CanTrip points out the gaps nobody booked for, like nights without a bed, a change of city with no ride, two places too far apart to walk. Tap a gap to see transit routes with the fare, a taxi time and a walk, timed to arrive before the next thing starts.
  4. The Plans tab, with places not on a day yet beside those on one, and Ichiran Ramen marked closed on Wednesdays2 views
    04 plan the rest Paste Google Maps links for places to eat or things to do. They come with opening hours, warn you when a place is closed on the day you picked, and can be dragged onto the calendar. Once one is reserved, its receipt turns it into a booking.

## stack

Go net/http + html/template// backend
The simple Go server renders every page as plain HTML, and the itinerary is worked out fresh on each load.
SQLite / Turso// database
SQLite for fast iteration in development; Turso, a hosted SQLite, in production.
OpenRouter// ai
Reads the receipts. A digital PDF's text is extracted on the server and scrubbed of emails, phone numbers and card digits before it's sent; only scans and photos go to the vision model.
Google Maps + HERE// maps
Google Maps for places, opening hours and routes. HERE fills in public transport where Google has none, like Japan.
Turbo + Stimulus// frontend
Pages swap in place and the calendar's pop-ups stay put, with no build step, and every page still works with JavaScript off.
Google Drive / S3// storage
Receipts go to a CanTrip folder in your own Google Drive, filed by trip and kind, or to an S3 bucket if you'd rather not connect it.
Fly.io// infra
Cheap, and friendly to both users and agents.

$ git log --oneline

  1. HEAD → main2026-10-14

    Export the itinerary as calendar feed

    The itinerary now can have be exported as `.ics` feed, and can be subscribed from Calendar apps.

  2. 2026-10-10

    Export the itinerary as a PDF or an Excel sheet

    The calendar or the day-by-day list, downloaded or saved straight into the trip's Google Drive folder.

  3. 2026-10-10

    Placeholder flights for tickets not bought yet

    Add a flight by its number and day; check-in and the rides around it are worked out as if it were booked, and the real ticket replaces it once its receipt comes in.

  4. 2026-10-09

    Plans on a day their place is closed are flagged

    Opening hours from Google Maps turn "closed on Wednesdays" into a gap to sort, warned of the moment the plan is put there.

  5. 2026-10-08

    Pages swap in place with Turbo; the JavaScript is split into Stimulus controllers

    Makes the app more interactive and snappier.

  6. 2026-10-06

    A ride can go through a stop you pick

    The quickest way isn't always the easiest, so a ride can be asked to pass the station with the express train.

  7. 2026-10-04

    Rides between places, check-in times and layovers

    Gaps between bookings get transit routes from the map providers, and flights get a check-in and a ride to the airport.

  8. 2026-10-03

    Plans from Google Maps links

    Things you don't book, with their opening hours, dragged onto a day on the calendar.

  9. 2026-10-02 · initial commit

    Receipts in, day-by-day itinerary out

    The first MVP: receipts read into bookings, the travellers named on them, and a week calendar on desktop.