You’re planning a two-week trip across Iceland with three friends. The spreadsheet has 14 tabs, the Google Doc has 8 contributors, half the budget is in a Splitwise group, the packing list is in someone’s Notes app, and nobody can agree on where you stayed in Reykjavik last time. TREK is the self-hosted answer to all of that — one app where the four of you edit the trip in real time, the map shows every reservation, budgets split per-person and per-currency, and packing lists are templated. The unusual twist for 2026: TREK ships an OAuth-secured MCP server, so Claude or any MCP-aware AI can plan trips on your behalf with explicitly-granted scopes.
What is TREK?
TREK is a self-hostable travel planner with real-time collaboration. WebSocket sync means every change across multiple users appears instantly; addons cover budgets, packing lists, document attachments, group chat, vacation calendars, visited-country atlases, and a magazine-style travel journal. Built on Node.js 22 + React 18, single Docker container, AGPL-licensed.
“A self-hosted, real-time collaborative travel planner — with maps, budgets, packing lists, a journal, and AI built in.”
TREK on GitHub TREK Live Demo TREK Discord
What makes it different
- 🔄 Real-time WebSocket sync — multi-user edits appear instantly across all connected devices
- 🗺️ 3D maps — Leaflet (default) or Mapbox GL with 3D buildings, terrain, photo markers, clustering, route visualization
- 💰 Multi-currency budgets — per-person / per-day splits, category pie charts, multi-currency awareness
- 🧳 Packing lists — categories, templates, user assignment, progress tracking, optional bag weight distribution
- 📓 Travel journal — magazine-style entries, photos from Immich or Synology, maps, moods (Journey addon)
- 🌍 Atlas addon — world map of visited countries, bucket list, travel stats, streak tracking
- 🤖 OAuth 2.1 MCP server — 150+ tools, 30 resources, 27 scopes across 13 permission groups; addon-aware
- 📱 PWA — installable on iOS / Android, offline support via Workbox-managed Service Worker
- 🆔 OIDC SSO — Google, Apple, Authentik, Keycloak, generic; TOTP 2FA built in
- 🌍 15 languages — including Arabic with RTL support
- 🛡️ Hardened compose —
read_only: true,cap_drop: ALL,no-new-privileges, tmpfs/tmp - ⚖️ AGPL-3.0 — fully open source
The MCP angle (the genuinely novel feature)
The MCP addon is what sets TREK apart from every other self-hosted travel planner. When enabled, TREK exposes an OAuth 2.1-authenticated MCP server with:
- 150+ tools — create trips, plan days, build packing lists, manage budgets, mark countries visited
- 30 resources — readable surfaces (trip details, reservations, budget summaries)
- 27 OAuth scopes across 13 permission groups — fine-grained “Claude can read trips but not delete them”
- Pre-built prompts —
trip-summary,packing-list,budget-overview - Addon-aware — only exposes tools for addons that are actually enabled
This is the connective tissue between the self-hosting world and the AI agent world we’ve covered elsewhere on this site. Hook up Claude Desktop or any MCP-aware AI assistant (OpenClaw , Hermes , custom agents) to your TREK instance, grant the scopes you want, and the AI can plan a trip end-to-end on your behalf. Granular scopes mean you don’t have to trust the AI with everything to give it some access.
The natural pairings on this site
| If you have… | TREK pairs because… |
|---|---|
| Dawarich | Dawarich tracks where you’ve been; TREK plans where you’re going. Together: full past + future travel coverage |
| Immich | TREK’s Journey addon embeds Immich photos directly into trip entries |
| Nextcloud | Document attachments work naturally with Nextcloud-served storage |
| An MCP-aware AI assistant | TREK’s MCP server lets the AI plan trips, manage packing lists, update budgets via OAuth-granted scopes |
Self-Hosting TREK with Docker
Get Docker 🐋
Install Docker on your system before proceeding:
- Linux: Official Docker Engine install guide
- Windows / Mac: Docker Desktop
Verify installation: docker --version && docker compose version
30-second quick start
ENCRYPTION_KEY=$(openssl rand -hex 32) docker run -d -p 3000:3000 \
-e ENCRYPTION_KEY=$ENCRYPTION_KEY \
-v ./data:/app/data -v ./uploads:/app/uploads \
mauriceboe/trek
Open http://localhost:3000. The admin account is auto-seeded — credentials are printed to docker logs trek unless you pass ADMIN_EMAIL / ADMIN_PASSWORD env vars.
Production Docker Compose
The compose below is adapted from the upstream README. The security flags are load-bearing — don’t strip them when copy-pasting:
services:
app:
image: mauriceboe/trek:latest
container_name: trek
read_only: true
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
cap_add:
- CHOWN
- SETUID
- SETGID
tmpfs:
- /tmp:noexec,nosuid,size=64m
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- PORT=3000
- ENCRYPTION_KEY=${ENCRYPTION_KEY:-} # openssl rand -hex 32
- TZ=${TZ:-UTC}
- APP_URL=${APP_URL:-} # required for OIDC + email links
# - FORCE_HTTPS=true # behind a TLS-terminating proxy
# - TRUST_PROXY=1
# - OIDC_ISSUER=https://auth.example.com
# - OIDC_CLIENT_ID=trek
# - OIDC_CLIENT_SECRET=supersecret
volumes:
- ./data:/app/data
- ./uploads:/app/uploads
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:3000/api/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 15s
The security defaults shipped here are unusually strong for a self-hosted project:
read_only: true— the container filesystem is immutable; writes only through declared volumescap_drop: ALL+ minimalcap_add— drops every Linux capability except the three needed for user/group ID handlingno-new-privileges:true— no escalation via setuid binariestmpfs /tmpwithnoexec,nosuid—/tmpis in-memory and non-executable
Most projects ship docker-compose.yml files with none of these. Keep them.
OIDC / SSO setup
TREK supports OIDC against Google, Apple, Authentik, Keycloak, and generic OIDC providers. Set:
environment:
- APP_URL=https://trek.example.com
- OIDC_ISSUER=https://auth.example.com
- OIDC_CLIENT_ID=trek
- OIDC_CLIENT_SECRET=...
- OIDC_DISPLAY_NAME=SSO
- OIDC_ADMIN_CLAIM=groups
- OIDC_ADMIN_VALUE=app-trek-admins
APP_URL is mandatory for OIDC callbacks and email links — without it, login redirects break.
OIDC_ADMIN_CLAIM + OIDC_ADMIN_VALUE map a claim in the OIDC token to TREK admin status — e.g. anyone in the app-trek-admins group becomes a TREK admin on first SSO login.
Enabling the MCP server for AI assistants
The MCP addon is admin-toggleable. After enabling it in the admin panel:
- Each user generates a personal MCP token from their profile, scoped to specific permission groups (e.g. “read trips” + “manage packing lists” but not “delete trips”)
- The token is added to Claude Desktop’s MCP config, or to the agent’s MCP client config
- The AI now has authenticated access to the user’s TREK instance with exactly those scopes
The server is OAuth 2.1 with PKCE, not a hand-rolled token scheme — so it works with any spec-compliant MCP client. Documented in MCP.md in the repo.
This is the path if you want an AI agent like OpenClaw to plan trips on your behalf — set up the OAuth scope, and OpenClaw can create trips, manage your packing list, mark countries visited, all via the TREK MCP surface.
Kubernetes (Helm) and Unraid
For Kubernetes, the project ships a Helm chart:
helm repo add trek https://mauriceboe.github.io/TREK
helm repo update
helm install trek trek/trek
Values reference at charts/README.md in the repo.
For Unraid, the repo includes unraid-template.xml for one-click Community Apps installation.
Updating
docker compose pull && docker compose up -d
Data in data/ and uploads/ is preserved across updates. The maintainer’s auto-backup system creates scheduled snapshots regardless — visible in the admin panel.
Encryption key rotation
If you’re upgrading from an older version that derived encryption from JWT_SECRET:
docker exec -it trek node --import tsx scripts/migrate-encryption.ts
TREK vs the Alternatives
| TREK | Wanderlog | Tripit | Google Maps Saved | |
|---|---|---|---|---|
| Self-hosted | Yes | No | No | No |
| Real-time multi-user collaboration | Yes | Partial | No | No |
| Budget with multi-currency splits | Yes | Partial | No | No |
| Packing lists | Yes | Yes | No | No |
| Travel journal | Yes (Journey addon) | Partial | No | No |
| Visited-countries atlas | Yes (Atlas addon) | No | No | No |
| MCP server for AI assistants | Yes (OAuth 2.1) | No | No | No |
| 3D maps | Yes (Mapbox GL) | Yes | No | Limited |
| Self-hostable | AGPL-3.0 | SaaS only | SaaS only | SaaS only |
| Multi-language | 15 incl. Arabic RTL | Few | Few | Many |
The honest read:
- Pick TREK if you want self-hosted collaboration + the option to wire AI assistants in via MCP
- Pick Wanderlog if you want the most polished commercial trip planner and don’t mind SaaS lock-in
- Pick Tripit if you just need an itinerary inbox and don’t care about collaboration or planning
- Pick Google Maps Saved if your “planning” is dropping pins on a map and zero collaboration
TREK occupies a niche no SaaS competitor does: a full-featured planner where the data is yours, the AI integration is open, and the collaboration model doesn’t require a paid tier per user.
Conclusion
TREK is the most feature-complete self-hosted travel planner currently shipping, and the MCP server addon is genuinely forward-looking — it puts TREK in the small group of self-hosted apps that ship a first-class AI integration via the open MCP standard rather than just calling an OpenAI API. The hardened Docker defaults are also a refreshing change from projects that publish docker-compose.yml with no security flags.
For groups of travelers who want their plans on their own server, with Dawarich-style historical context, Immich photos in their journal, and an AI assistant able to help plan via OAuth-scoped MCP — TREK is the right shape of tool today.
Related tools worth knowing:
- Dawarich — where you’ve been (passive GPS); pairs naturally with TREK (where you’re going)
- Immich — TREK’s Journey addon embeds Immich photos in travel journal entries
- OpenClaw / Hermes Agent — MCP-aware AI assistants that can plan trips via TREK’s MCP server
- Wanderlog — closest commercial competitor; SaaS, not self-hostable
Frequently Asked Questions
Can I really run trips collaboratively in real time?
Yes — WebSocket-based sync (ws library) pushes every change to every connected user instantly. Multiple travelers editing the same trip see each other’s cursors and updates without a refresh. This is the load-bearing feature for group travel planning.
Do I need an API key for maps?
No for basic use. Leaflet with OpenStreetMap tiles is the default and needs no key. Mapbox GL with 3D buildings + terrain requires a Mapbox API key but is optional. Place search defaults to OpenStreetMap (free, no key); Google Places gives richer data (photos, ratings, hours) if you want to bring an API key.
Does the MCP server expose all my data to the AI?
Only the scopes you grant. The MCP server has 27 OAuth scopes across 13 permission groups, so you can give Claude “read trips + manage packing lists” but not “delete trips” or “see budget details.” The server is also addon-aware — disabling the Atlas addon removes Atlas-related MCP tools from the surface.
What’s the encryption key for?
ENCRYPTION_KEY is used for at-rest encryption of sensitive fields in the SQLite database (API keys, OIDC tokens, attachment metadata). Generate with openssl rand -hex 32 and treat it like a secret — losing it means losing the encrypted data. If you’re upgrading from an older version that derived this from JWT_SECRET, run the migration script (scripts/migrate-encryption.ts).
Will it work on a Raspberry Pi?
Yes — the Docker image is multi-arch and Node 22 runs comfortably on a Pi 4 / 5. WebSocket sync is light on CPU; SQLite is fine for typical group trip sizes. Mapbox 3D maps may be sluggish on Pi-class browsers — Leaflet is the better default there.
How does the Journey addon integrate with Immich?
The Journey addon (magazine-style travel journal) supports pulling photos from a self-hosted Immich instance or a Synology Photos library. You point the addon at the photo source, grant credentials, and journal entries can reference photos directly from those libraries rather than re-uploading.
Does it work offline?
Partially via PWA + Workbox-managed Service Worker. Map tiles, API responses, and uploads cache for offline viewing. Real-time WebSocket sync obviously requires connectivity, but reading and lightly editing trips offline works.
Can I expose this to the public internet?
Yes, with the right setup. The shipped Docker compose has strong security defaults (read-only filesystem, capability drops, no-new-privileges). Add a reverse proxy with TLS in front (Caddy, Traefik, nginx). Set FORCE_HTTPS=true and TRUST_PROXY=1 for correct cookie/redirect handling behind the proxy.
Why AGPL-3.0?
The maintainer chose AGPL specifically to require source-code disclosure if anyone runs a modified version as a network-accessible service. Self-hosting for your own personal/group use is completely fine — AGPL only requires source disclosure if you serve modified TREK to third parties as a hosted service. Most users will never hit this.
Comments