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.
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
- Download
docker-compose.ymland.env.exampleonto your server, and copy the example to.env. - Fill in your TripIt private iCal URL, domain, and HTTPS port in
.env. - Run
docker compose up -d— Caddy obtains a Let's Encrypt certificate on first start (about 60 seconds). - Read your subscription URL from
docker compose logs tripit-syncand 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 →