Otto

Travel and documents

Trips assembled from booking mail, timezone-correct segments, cancellation deadlines, and the days-in-country ledger.

Live.

A trip assembles itself

Booking confirmations arrive in fragments: the flight from one airline, the return from another, the hotel a week later. The trip object parses each one and merges fragments into a single trip keyed by date range, so you stop forwarding yourself bookings and hunting for a confirmation code at a counter.

Parsed out of the mail: PNR, flight numbers, times with their timezone, hotel address, check-in and check-out.

Timezones are the whole point

A flight time without a zone is a bug, not a rounding error. Segment times carry their zone, and where the zone cannot be determined the trip reports the problem rather than guessing.

There is no built-in airport-to-timezone table. It is a data file, empty by default, and an unknown airport produces a zoneless time that is explicitly reported as a problem. The alternative was shipping a guessed table, which would produce confidently wrong departure times.

Cancellation deadlines

Free-cancellation dates are extracted at parse time. The intended use is one one-shot reminder twenty-four hours before the deadline lapses, asking whether you are still going, with keep and cancel buttons. Cheap, and it pays for itself the first time a speculative booking gets dropped in time.

Days in country

Presence per country is derived from trip segments, giving a rolling count against the thresholds that actually matter: 183-day tax residency, permit re-entry windows, tourist caps.

It stays silent until a threshold is within reach, or until a booking you are about to make would cross one.

Not built yet

These do not exist. The substrate each one reads is live, so every item below is a self-contained piece of work rather than a rewrite. The button copies a prompt that builds it in your own checkout.

#117Trip-mode brief sectionmedium

While a trip is active or within five days, the brief drops the Mac-state section and swaps in next segment with countdown, local time versus Italy and Brazil, hotel address, check-in status and today's events re-anchored to destination time; every trigger then fires with travel context instead of desk context.

#119Free-cancellation deadline guardsmall

Extract the free-cancel-by date at booking-parse time and arm a one-shot 24h before it lapses — "last day to cancel the Milano hotel free — still going?" with [keep / cancel it]; cheap, and it pays for itself the first time a speculative booking gets dropped in time.

#120Geofence arrival eventssmall

Home, office, gym, airport and consulate geofences — via Telegram live-location shares or an iOS Shortcuts automation — POST arrival and departure to the webhook, giving "you're at the airport and check-in isn't done" and a home/away flag that shortens replies and prefers voice when they're out; real position with no new app or tracking daemon.

#121In-flight hold and landing digestmedium

The trip object tells the channel they're airborne so the hold engine engages by itself with no snooze, voice replies are suppressed, and everything queued arrives as one "while you were in the air" digest at wheels-down — plus a pre-takeoff warning about anything needing them mid-flight, like a connecting check-in that opens at 35,000 feet.

#122Arrival briefmedium

Fired by landing time or a geofence: one message with local time, three-day weather, today's calendar re-anchored locally, airport-to-hotel transport with current cost, and the day's EUR/local rate — then silence, the opposite of a travel app.

#123Flight-day ops watcherlarge

From T−12h a sidecar polls flight status every 15 minutes and pushes only changes — delay, gate, terminal, cancellation — as urgent webhook events, cross-checks a delay against the day's calendar ("the 19:00 dinner is now tight — [move it]"), and sends exactly one "leave in 20" computed from the bag-drop cutoff plus live travel time.

#124Check-in window watcherlarge

Store each carrier's check-in opening rule, arm a one-shot at the open, and offer [check me in] that drives agent-browser with PNR and surname, stops before any paid upsell, and returns the boarding pass as an image with an Add-to-Wallet link — falling back to a deep link naming the exact field it stalled on rather than failing silently; long-haul check-in otherwise happens at 3am or not at all.

#130Trip expense roll-upmedium

Receipt photos and booking mail attach to the active trip, each converted at that day's FX rate rather than today's and totalled by category, ending in one short summary plus a CSV; "what did Brazil cost me" without a spreadsheet.

#200Long-haul media packmedium

Seeing an IT↔BR flight, the evening before offers one tap to prep — podcast episodes downloaded, the playlist made available offline, saved articles bundled into one offline file; eleven hours of no signal is the one moment hoarded media actually gets consumed.

On this page