Docker · Self-hosted

Bridge TripIt to Microsoft 365 calendars, reliably.

TripIt's iCal feed has a long-standing compatibility issue with Microsoft 365 — redirect chains and response patterns the M365 calendar engine doesn't handle reliably, so subscriptions fail silently or stop updating. This service re-serves your itinerary as a clean, standards-compliant HTTPS .ics file that M365 can actually subscribe to.

outlook · calendar
LHR → JFKThu 11 Sep · 09:40
Synced
Hotel · Midtown11 – 14 Sep
Synced
JFK → LHRSun 14 Sep · 18:15
In 30 min

How it works

[M365 Calendar] ──── HTTPS poll ────► [Caddy (Let's Encrypt TLS)]
                                              │  serves cached .ics
                                       [/data/ics volume]
                                              ▲  atomic write every 30 min
                                       [Python syncer]
                                              │  HTTPS GET
                                       [TripIt iCal feed]

The service fetches your TripIt feed every 30 minutes and caches it locally. Caddy re-serves it over HTTPS with an automatically managed Let's Encrypt certificate, so M365 subscribes to your own domain instead of TripIt directly. Both Caddy and the Python syncer run in a single container — no inter-container dependencies, no shared volumes between services.

What it does

Standards-compliant feed

Re-serves your itinerary as a plain HTTPS .ics file with no redirects — the exact thing M365's calendar engine chokes on when talking to TripIt directly.

Unguessable feed URL

On first launch the syncer generates a random token unrelated to your TripIt private token, and serves the feed at that URL instead.

Automatic HTTPS

Caddy obtains and renews a Let's Encrypt certificate on its own — no manual cert management, just a domain pointed at the server.

Health endpoint

A dedicated health URL always returns 200, with a status field your monitoring tool can check for sync failures without false-alarming on the feed itself.

Single container

Caddy and the Python syncer run together — no inter-container dependencies or shared volumes between services to keep in sync.

Multi-arch image

Published to GHCR on every push for linux/amd64 and linux/arm64 — runs on a Raspberry Pi as easily as a cloud VM.

Get started

  1. Download docker-compose.yml and .env.example onto your server, and copy the example to .env.
  2. Fill in your TripIt private iCal URL, domain, and HTTPS port in .env.
  3. Run docker compose up -d — Caddy obtains a Let's Encrypt certificate on first start (about 60 seconds).
  4. Read your subscription URL from docker compose logs tripit-sync and add it to Outlook as Calendar → Add calendar → Subscribe from web.

Full setup, troubleshooting, and configuration reference live in the project README. github.com/gareth-c/tripit-m365-sync →

Built with

Docker amd64 / arm64
Caddy Automatic HTTPS
Python Sync worker
Let's Encrypt TLS certificates