Travel Planning in Obsidian with Claude Code and a Shared Calendar
I plan family trips inside Obsidian. Each trip is a project file — one markdown document that accumulates everything from flight confirmations to walking tour itineraries. By the time we travel, the file is the only thing I need open on my phone.
The problem was always the last mile: getting departure times, confirmation codes, and check-in details onto the shared family calendar where everyone can see alerts on their phone. I’d end up manually creating calendar events, copying details from the project file, and inevitably missing something. Claude Code now handles that entire handoff.
The System
Three layers:
- Obsidian project file — the source of truth. Every booking, itinerary, and logistics detail lives here in a structured format.
- Travel planner prompt — a reusable prompt file that tells Claude how to research destinations, format bookings, propose itineraries, and offer calendar integration.
icalCLI — a macOS command-line tool that creates, updates, and deletes events on Apple Calendar. Claude calls it directly to push bookings to the shared family calendar.
The Project File
Each trip starts as a project file with a cost summary at the top and booking blocks below. The format is consistent enough that Claude can read any trip file and immediately offer to push events to the calendar.
Booking Blocks
Every transport, flight, or accommodation block follows a pattern: emoji header with date link, then structured details.
Bus / train:
### 🚌 [2026-04-10](/obsidian/2026-04-10/): Valencia → Madrid Airport (ALSA)
- **Route:** Valencia Bus Station → Madrid Barajas Airport (Terminal 1)
- **Departure:** 06:30 Thu [2026-04-10](/obsidian/2026-04-10/) → **Arrival:** 10:45 Thu [2026-04-10](/obsidian/2026-04-10/) (4h 15m, 1 stop)
- **Pickup:** Estación de Autobuses, Av. Menéndez Pidal 13, Valencia
- **Dropoff:** Terminal 1, Aeropuerto Adolfo Suárez Madrid-Barajas
- **Booking Reference:** 2k78m3p
- **Seats:** 22 (A), 23 (B), 24 (C)
- **Cost:** 18.50€ per person × 3 = **55.50€ total** (VAT included)
- **Baggage:** 25kg total (max 2 items) per person
- **Notes:** No need to print — show on mobile. May be asked to show ID.Flight:
### ✈️ [2026-04-10](/obsidian/2026-04-10/): Madrid (MAD) to Rome Fiumicino (FCO)
- **Airline:** Iberia IB3210
- **Departure:** Madrid 13:45 Thu [2026-04-10](/obsidian/2026-04-10/) → **Arrival:** Rome (FCO) 16:15 Thu [2026-04-10](/obsidian/2026-04-10/) (2h 30m)
- **Passengers:** A. Smith (Basic), B. Smith (Basic)
- **Confirmation:** XK4MNP
- **Cost:** 485.00 EUR total
- **Baggage:** 1 underseat cabin bag (Max 40x30x20 cm) per passenger.
- **Notes:** Online check-in opens 24 hours before flight.Accommodation:
### 🏨 [2026-04-10](/obsidian/2026-04-10/) - [2026-04-16](/obsidian/2026-04-16/): Rome - Airbnb ($980)
- **Stay:** 6 nights, "Bright Studio Near Trastevere"
- **Address:** Via della Lungaretta 42, Rome 00153, Italy
- **Host:** Marco (Co-host: Elena)
- **Confirmation:** HMKR7YZ4QQ
- **Guests:** 2 adults, 1 child
- **Check-in/Check-out:** 3:00 PM Thu [2026-04-10](/obsidian/2026-04-10/) / 11:00 AM Wed [2026-04-16](/obsidian/2026-04-16/)
- **Check-in method:** Lockbox (instructions available 24h before)
- **Cancellation Policy:** Free cancellation before 3:00 PM on [2026-04-09](/obsidian/2026-04-09/).
- **House Rules:** Self check-in with Lockbox, 4 guests max, no petsItineraries
Once bookings are locked, the travel planner prompt drives itinerary research. Claude proposes time-blocked days based on arrival/departure constraints, proximity between sites, and opening hours for specific travel dates.
### 📍 Suggested Itinerary for [2026-04-11](/obsidian/2026-04-11/)
**Morning: Colosseum & Forum** (3 hours)
- Arrive by 8:30 AM when it opens — lines build fast after 10
- [Book skip-the-line tickets](https://example.com) (€16 per adult, free under 18)
- Enter through the Forum side entrance — shorter queue
**Lunch: Monti neighborhood**
- 15 min walk from the Forum
- Street food around Via del Boschetto
**Afternoon Options:**
- **Palatine Hill** (included with Colosseum ticket, 1.5h) — shade and views
- **Capitoline Museums** (€15) — if energy holds up
- **Gelato walk through Centro Storico** — if it doesn't
**Evening:**
- Walk to Trastevere (30 min or bus H from Termini)
- Dinner in the piazzas — avoid anything with photos on the menuThe itinerary section grows organically. Some trips get detailed day-by-day plans; others stay loose with just bookings and a few landmarks. The project file accommodates both.
Transit Logistics
For cities with complex transit, a reference section covers routes, costs, and practical tips:
### 🚇 Transfer: Apartment → Airport
**Route:** Metro Line B to Termini → Leonardo Express to FCO
**Total Duration:** ~50 minutes
**Total Cost:** ~€20 per person
1. **3:00 PM:** Walk to nearest Metro B station (10 min)
2. **3:15 PM:** Metro to Termini (15 min, €1.50)
3. **3:35 PM:** Leonardo Express to FCO (32 min, €14)
4. **4:10 PM:** Arrive FCO (2.5 hours before 6:40 PM flight)Travel Log
After each day, voice-dictated log entries capture what actually happened — not just what was planned. These go into the Log section with date-linked headings, newest first.
## Log
### [2026-04-12](/obsidian/2026-04-12/)
- Started the morning walking through Campo de' Fiori market. Got fresh
fruit and a cornetto from a stand on the corner.
- Walked to the Pantheon — no line at 9 AM, stunning inside. The oculus
with morning light coming through was worth the early start.
- Took a wrong turn trying to find Piazza Navona and ended up in a quiet
residential street with a tiny church that had better frescoes than
half the museums.Calendar Integration
This is where ical closes the loop. After bookings are finalized in the project file, Claude reads the structured blocks and offers to push them to the shared family calendar.
The ical CLI (docs) is a Go binary that wraps macOS EventKit — it reads and writes directly to Apple Calendar, including shared iCloud calendars. Claude calls it from the terminal:
ical add "✈️ Iberia IB3210: Madrid → Rome" \
--start "2026-04-10 13:45" \
--end "2026-04-10 16:15" \
--calendar "Family Travel" \
--location "Madrid Barajas Airport (MAD)" \
--notes "Confirmation: XK4MNP
Baggage: 1 underseat cabin bag (40x30x20 cm) per passenger.
Online check-in opens 24 hours before flight." \
--alert 1d --alert 2hEach event type maps to a convention:
| Type | Emoji | Time | Alerts | Notes include |
|---|---|---|---|---|
| Flight | ✈️ | Departure → arrival | 1 day + 2 hours | Confirmation, baggage, check-in info |
| Bus/train | 🚌 🚆 | Departure → arrival | 1 day + 1 hour | Ref, seats, pickup/dropoff locations |
| Accommodation | 🏨 | All-day span | 1 day | Address, check-in/out times, host, confirmation |
The result: everyone in the shared calendar sees departure times with confirmation codes in the notes, accommodation with the address and check-in method, and alerts that fire at useful intervals. No manual event creation, no missed details.
All-Day Event Quirk
One thing to know: all-day events in Apple Calendar treat the end date as exclusive. If your stay is March 30 through April 5 (checkout), you need to set the end date to April 6 for it to display correctly through April 5. The ical CLI follows this convention, so --end "2026-04-06" means “through April 5.”
The Travel Planner Prompt
The prompt file lives in the vault (Planner/Prompts/) and tells Claude how to approach trip research. Key sections:
- Constraints gathering — dates, travelers, arrival/departure times, must-sees
- Research priorities — free admission days, booking requirements, transit logistics, time estimates
- Itinerary format — time-blocked with morning/afternoon/evening, realistic pacing, backup options
- Calendar integration — after finalizing bookings, offer to push events to the shared calendar with the emoji/alert conventions above
The prompt also encodes preferences: we don’t like expensive museums, we prefer non-touristy but culturally interesting spots, and we’re homeschooling — so stories and experiences matter more than checking boxes.
What Makes This Work
The project file is the load-bearing piece. Because bookings follow a consistent structure — emoji headers, wikilinked dates, labeled fields — Claude can parse any trip file and extract what needs to go on the calendar. The travel planner prompt ensures new bookings get added in the same format. And the ical CLI is just the bridge between the two worlds: markdown and Apple Calendar.
The whole thing is three tools that don’t know about each other, connected by a consistent format and an AI agent that can read one and write to the other.
Caveats
ical is new. The CLI (BRO3886/ical) had 18 stars when I installed it. It’s MIT-licensed, clean Go code, and uses Apple’s EventKit framework — but it’s a single-author project with minimal community review. The binary isn’t Apple-signed, so macOS Gatekeeper will flag it on first run. Remove the quarantine flag with xattr -d com.apple.quarantine ~/.local/bin/ical.
Shared calendar names with special characters. If your shared calendar has commas or spaces in the name, the ical CLI handles it fine in the --calendar flag — just wrap it in quotes.
Timezone handling for flights. Flight times in the project file are local to the departure/arrival city. When Claude creates calendar events, it uses the system timezone. For domestic trips this is fine; for international trips, double-check that the event times reflect what you expect.
Voice log entries need cleanup. The travel log section often starts as raw voice dictation. Proper nouns, street names, and local terms get mangled. A separate voice-log skill handles cleanup, but the raw input still needs human review for accuracy.