多数功能是管理员开关,Journey、Collections、MCP、AI 助手等默认关闭需手动开启;AI 助手需自备 Anthropic、OpenAI、Gemini、OpenRouter 或兼容端点的 API Key;地图可选 Mapbox/MapLibre,部分地点与路线服务需额外申请 Key
TREK
liketrekAGPL-3.0活跃维护自托管旅行规划平台,支持多人实时协作编辑行程、记账、打包清单和旅行日志,内置全球地点搜索与路线规划,可离线使用并接入 AI。
The most complete open-source travel planner: real-time collaboration, bookings, budgets, packing lists, journals, offline PWA, SSO and an AI-ready MCP server, with planet-wide place search and routing built in.
docker pull mauriceboe/trekREADME 未说明硬件要求,仅提供 Docker 镜像部署方式
自托管旅行规划全家桶,实时协作、行程路线、预订记账、日志相册一站搞定
自托管旅行规划平台,支持多人实时协作编辑行程、记账、打包清单和旅行日志,内置全球地点搜索与路线规划,可离线使用并接入 AI。
核心能力
- WebSocket 实时同步,多人同开行程即时看到编辑
- 按天拖拽地点与预订,地图标记可直接落到某一天
- 自动排序当日站点并逐段按 OSRM/Valhalla 规划路线
- 费用按整数分账,支持多人付款与结算建议
- 内置 MCP 服务器与 AI 助手,改动需确认并可撤销
容易踩的坑
- v5.1.3最新正式版2026-11-10 · 2026-11-10 10:01 UTC
5.1.3
This release fixes the SSO sign-in of the TREK apps, which kept many testers of the closed app test from signing in at all. If you run TREK with SSO and test the app, please update your server; the app itself needs no update for it. The next app build will ask for TREK 5.1.3 on the server, so it is worth updating now.
The apps for iPhone, iPad, Apple Watch and Android are still in a closed test, and you can join. 👉 Sign up at liketrek.com/app-test and connect the app to a TREK server on the newest version, such as this one, or to the demo; please don't test with TREK Cloud.
Fixed
Sign-in
- Signing in to the app with SSO or a passkey still ended in the web app for many. A browser that had run TREK before 5.1.1 keeps that version in its service worker, and the worker answered the app's handoff page from its cache with a version that has no such page, so the sign-in ended on the dashboard in the browser instead of in the app. The app now starts its sign-in on a page the server always answers itself; it takes the old worker off the browser, and until the user is back in the app no worker is registered and no new version reloads the page. The browser's TREK keeps working offline as before. The handoff page also goes straight on to the sign-in provider now, instead of showing TREK's own login first.
- Password managers offered nothing for the two-factor code. The code step now keeps the account in the form and marks the field as a one-time code, and its placeholder is translated.
Planner
- Tapping a day in the day rail did not always change the plan below. On a trip of up to five days the day turned active in the rail while the card underneath stayed on the old one; the pager now follows every tap.
- Quick swipes through the days stopped after two and sprang back until the animation was over. Every day now has its page, so a run of swipes goes on as far as the trip does.
Bookings
- A hotel booking showed no check-in or check-out on its card when only the stay had them, while the edit dialog did. Both cards now show the stay's times.
- Editing only a booking's notes took a booking whose time has no date off its day, so it vanished from the planner (#3025). Such an edit now keeps its day, through the API and the MCP tools too.
Assistant
- The assistant sometimes gave the same answer twice. Asked about the next trip, it answered, offered the trip's own chat in the same step, and then wrote the answer again below that card. An answer that hands the conversation on to a trip's or a journey's chat now ends there.
Internal
Work on the native iOS and Android apps, which are in a closed test and do not ship with this release.
- Native app: a sign-in proxy that lets /api through. With Authelia or authentik in front of the page and a bypass for the API, the address check saw no proxy and the app handed the proxy's sign-in to the browser, so it stayed black on every launch; a redirect away from the server while its first page loads is now kept as the proxy's sign-in and shown in the app.
- Native app: the app needs TREK 5.1.3 on the server. The fixes that keep its sign-in in the app live on the server, so the app now refuses an older one with a hint to update. A server it remembers is checked once after the update and loads again if it is new enough.
- Native app: a way out of a proxy's sign-in page. Behind Pangolin or authentik nothing on the proxy's page led back to the address screen. A bar now offers to change the server and says that passkeys and security keys cannot work there in the app, and on iOS the page gets room for the keyboard.
- Native app: maps in the iOS app drew no tiles. The server's CSP did not allow the app's own tile store for images; it does now.
- **Native app: the Live Activity said all done wi
- v5.1.22026-11-09 · 2026-11-09 13:05 UTC
查看更新说明
5.1.2
Test the TREK apps
The TREK apps for iPhone, iPad, Apple Watch and Android are in a closed test, and you can join. They run on your own TREK server and add what a browser cannot: home and lock screen widgets, an Apple Watch app, encrypted push notifications, offline maps, sharing from any app into a trip, Wallet passes, and layouts made for iPad, tablets and foldables.
👉 Sign up at liketrek.com/app-test: pick Apple or Android, tick the devices you can test on, and leave the email of your Apple ID or Google account. Connect the app to a TREK server on the newest version, such as this one, or to the demo; please don't test with TREK Cloud.
Fixed
Photos
- Synology Photos: journey photos took the capture date and place of the next photo. On libraries where Synology's item and thumbnail ids match, the metadata came from the neighbouring item; TREK now takes only the item the thumbnail belongs to. Photos attached before this release are asked again once after the update and get their own date and place back. (Closes #3019)
Trips and packing
-
The packing list's weight field dropped digits on a slow connection and saved the wrong weight. It saved on every keystroke, so a slow reply put the old value back under the cursor; it now keeps what is typed and saves once, on blur or Enter. (#3015, Closes #3005)
-
Opening a trip on a slow connection looked like the app had stopped. The phone held a still picture of the dashboard for up to 0.8 s and then showed an empty background; it now holds the dashboard for 0.35 s at most, and a trip that takes longer shows its loading screen right after.
-
Swiping between days on a phone took long to settle. The detent now ticks as soon as the swipe is decided, and a second swipe made while the first still snaps carries on to the next day.
-
On a phone, tapping a booking opened its editor straight away. A transport showed its details first, a stay, a table or a ticket did not; every booking now opens the same detail sheet with a pencil to edit, as on the desktop. Its Wallet and Map buttons read short.
Dashboard
- The dashboard jumped while it loaded, and the currency widget flickered through other pairs. The hero, the atlas cards and the collections widget now hold their size while they load, and the currency widget shows only the saved pair with its own rates, so "1 JPY = 1.0000 EUR" can no longer appear. (#3015, Closes #3009)
- The home screen app on an iPhone or iPad started on a black screen for seconds with many map tiles stored. iOS reads every stored tile before the app can start; the offline tiles there now keep to 2,048 and a fuller cache is trimmed once a day. (#3015, Closes #3008)
Assistant
- The assistant on Claude Sonnet 5.5 still came back without an answer at times. Asked for its answer, the model sometimes offered its follow-ups once more instead of writing; that step may now only be answered with text. (#3018, Closes #3016)
Sign-in
- The language picker on the login page sat under the status bar on a phone with a notch. It now stands below it.
Internal
Work on the native iOS and Android apps, which are in a closed test and do not ship with this release.
- Native app: client certificates (mTLS). A server behind a proxy that lets in only devices with a client certificate (Cloudflare, nginx, Caddy, Traefik, HAProxy) is recognised on the address screen, which offers to add a .p12 or .pfx file; the certificate is shown only to that server and can be replaced or removed in the settings.
- Native app: closing the plan pane on a tablet left the map half black. Mapbox GL measured its box only on window resizes; every GL map now follows its own box. (Closes #3023)
- Native app: a sign-in proxy in front of TREK. A server behind Cloudflare Access, Pangolin, authentik, Authelia, OAuth2 Proxy or Basic Auth was
- v5.1.12026-11-08 · 2026-11-08 15:04 UTC
查看更新说明
5.1.1
Test the TREK apps
The TREK apps for iPhone, iPad, Apple Watch and Android are in a closed test, and you can join. They run on your own TREK server and add what a browser cannot: home and lock screen widgets, an Apple Watch app, encrypted push notifications, offline maps, sharing from any app into a trip, Wallet passes, and layouts made for iPad, tablets and foldables.
👉 Sign up at liketrek.com/app-test: pick Apple or Android, tick the devices you can test on, and leave the email of your Apple ID or Google account. Access goes out once the builds pass Apple's and Google's review. Connect the app to a TREK server on the newest version, such as this one, or to the demo; please don't test with TREK Cloud.
Fixed
Assistant
- The assistant on Claude Sonnet 5.5 came back without an answer. The model at times ended a turn on its follow-up suggestions alone; it is now asked for the answer, and the suggestions show under it. (#2930, Closes #2789)
- A chat failed with HTTP 400 after leaving the page. Leaving while the assistant was still running its tools left the chat in a state Anthropic and the OpenAI Responses API refused; the calls that never ran are now answered when the chat is sent again, and affected chats work on their next message. (#2930)
- The trip assistant failed Tours tools with an argument error. A tool from a group it had not loaded yet got its arguments as text; such a call now runs and loads the group, and a failing call tells the assistant to send its arguments again. (#2973, Closes #2967)
Maps and places
- Far from Europe, TREK could not reach its own services. Node gave each address only 250 ms to connect, less than a round trip from Australia, so place search fell back to OpenStreetMap and sharing place details stayed unavailable; the attempt now has 2 s, and the log names the reason behind "fetch failed". (#2943, Closes #2944)
- Sharing place details stayed unavailable until someone searched. An installation now asks for its TREK services key a few minutes after startup, and the daily check fetches a missing key. (#2945)
- Sharing place details left out what users typed before. When an admin agrees, the details typed since 5.1.0 are shared too, a few at a time and never replacing newer values; the consent prompt says so. (#2945)
- A place added on another copy of the world map stayed there. It was saved with a longitude like 274.9, without a name, and routes to it ran across the whole map; every point is now on the real world, and a migration moves the ones already saved. (#2977, Closes #2976)
- Places and flights showed on different copies of the world map. A trip across the date line is now drawn on one copy, with pins, routes and flights joined, and the map opens across the Pacific. (#2977, Closes #2975)
- Selecting a place fanned a whole city across the map. The selection now only opens small clusters or stops sharing one coordinate. (#2995, Closes #2990)
- The selected place was hard to find on the map. Its pin now has a white border inside a pulsing blue ring, and the map keeps it above the place card, also on portrait tablets. (#2995, Closes #2991)
- The places selection bar was cut off with a long list. "Select all" and "Delete selected" now stay at the foot of the panel however long the list is. (#2940)
- A map whose vector style could not load stayed empty under its markers. It now falls back to raster tiles.
Trips, bookings and tours
- Flights across time zones were out of order. Bookings with a known time zone are now ordered by when they actually leave, in every view of the day. (#2932, Closes #2929)
- Date first in day headings: a long title hid the date, and renaming replaced it. The title now gives way, and the rename pencil and input go with the title line under the date. (#2932, Closes #2920, Closes #2
- v5.1.02026-10-31 · 2026-10-31 11:24 UTC
查看更新说明
5.1.0
Highlights
TREK now runs its own map services, on servers sponsored by dataforest cloud. Place search, address search and routing come from TREK's own servers instead of public services that limit, slow down or drop requests. Every installation is connected on its own, without any setup. A big thank you to dataforest, who make all of this possible for every TREK installation: cloud servers made in Germany, in Frankfurt, billed by the hour.
- Routes that match the road. Every day, road trip and assistant route is calculated by TREK's own planet-wide Valhalla with elevation data. It knows road classes, turns, tolls, ferries and climbs, so routes and driving times come far closer to what you will actually drive.
- The right place first. Search now finds the place you mean far more often, and answers three times faster.
- Place details in milliseconds, from TREK's own copy of OpenStreetMap instead of the public Overpass servers.
- Place details from the whole community. With the admin's consent, an installation shares the details its users add, and every TREK gets better places.
- Hebrew, TREK's 28th language, with right-to-left layout.
By the numbers
5.0 5.1 Right place first in search suggestions 48 % 70 % Right place first in a full search 53 % 74 % Countries first in suggestions 44 % 99 % Cities first in suggestions 65 % 88 % The same place twice in one list 0.43 per list never Full search, 95th percentile 640 ms 203 ms Details of an OpenStreetMap place several seconds, often unavailable milliseconds Stops per road trip day 10 no limit Distance per road trip day 1,500 km no limit Search figures measured on 5,000 searches from Wikidata: cities, countries, landmarks, museums, airports, stations, nature and venues, with and without a trip around them.
Your TREK services
Service 5.0 5.1 Place search TREK API TREK API and OpenStreetMap in one ranked list Address search Public Nominatim, one request per second TREK's Photon, in every TREK language Routing Public OSRM TREK's Valhalla, planet-wide with elevation, OSRM as silent fallback Place details Public Overpass TREK's own OpenStreetMap copy, Overpass only as fallback Community place details none Shared between installations, with admin consent [!NOTE] Sharing place details is off until an admin turns it on. TREK asks the admin once in Admin > Settings; users are never asked and nothing about them is sent. Only the place detail itself leaves: the field, the value and the place it belongs to. No user, trip, note, file or search goes with it, and the Transmission log in Admin shows every value that was sent.
[!TIP] Please consider sharing. Every phone number, website, opening hours or picture you share makes TREK's own place data better for everyone and TREK less dependent on Google. We are grateful for each one.
[!IMPORTANT] Nothing to configure: every installation gets its key for the TREK services in the background. To keep using your own services, set
NOMINATIM_URLor choose FOSSGIS or your own Valhalla in Admin > Settings;TREK_SERVICES=offstops the key, TREK's Photon and TREK's Valhalla; to also keep place search from asking the TREK index, setTREK_PLACES_ENABLED=falseas well.[!NOTE] Search for a place once after updating. 5.1.0 registers with the TREK services under its own release. If place search, address search or routing do not answer right after the update, search for any place once: that registers the installation, and everyt
- v5.0.12026-10-28 · 2026-10-28 10:54 UTC
查看更新说明
5.0.1
Fixed
Assistant
- The assistant keeps working after changes were applied. On ChatGPT, the OpenAI reasoning models and Claude, a thread in which the assistant had kept a trip note or read an attached file failed with HTTP 400 once changes were applied, and every later message in it too. Those calls are now answered when the thread is sent again, and threads that already broke work again on their next message. (#2846, Closes #2845)
- Tool calls work with Gemini. After the first tool call of a turn, Gemini refused the next step, which showed as a
genericerror. Its thought signature now goes back with each call, and an own server on Gemini's endpoint gets the tool schemas Gemini accepts. (#2852, Closes #2848) - The assistant on Claude Sonnet 5.5 no longer gives up after a tool call. Models that think by default lost their thinking between steps and ended with "came back without an answer"; the assistant now hands it back to them unchanged. (#2791, Closes #2789)
- OpenAI reasoning models such as gpt-5.6-sol and gpt-6.1-sol no longer fail with HTTP 400 on an API key. They now go through the Responses API, which they need for the assistant's tools. (#2791, Closes #2792)
- An own server that speaks the OpenAI API connects. LM Studio, vLLM, a LiteLLM proxy, Groq and other servers that are not Ollama were asked for Ollama's paths only, so Connect said the server was not responding and the booking import failed with a 404. Connect now finds the model list and says whether a key was refused or the address sent no list, and the booking import goes through
/chat/completionsat the address you entered. (#2809, Closes #2806, Closes #2808) - The model of a ChatGPT plan shared with everyone can be changed. In Admin > Addons its model picker did nothing and stayed on the recommended model; picking a model now saves it. (#2787, Closes #2783)
- Pasting the ChatGPT sign-in address no longer says it took too long. An address read from the clipboard and pasted at the same time, or one left over from an earlier attempt, used up the sign-in in progress; it is now sent once and only for the current sign-in. (#2787)
- Connecting OpenRouter finishes the sign-in. When OpenRouter added its code to the return address after a second
?, TREK did not recognise the return and dropped the code without a word. Both shapes are read now. (#2798) - Brazilian Portuguese users get their answers in Portuguese. TREK's code for Brazilian Portuguese is
br, whichIntlreads as Breton, so the assistant answered in Breton and its cards wrote dates that way too. (#2801, Closes #2800, thanks @allanvobraun) - Day notes written by the assistant or an MCP client put the text in the body. The tools described a day note's body as a time label of at most 250 characters; it is now described as the Markdown body under the title, with the 2000 characters the planner allows. (#2846, Closes #2840)
- On the phone, the assistant opened from the dashboard, Vacay, Atlas, Collections, the settings or a journal is no longer see-through. It had no background there and the page showed through it; it now fills the screen as it does inside a trip. (#2785, Closes #2786)
Maps and routes
- A trip with its whole route shown no longer routes every leg again on every open. A month long trip took 30 to 45 seconds before its route was drawn, each time. Routed roads are now kept on the device, so the route opens drawn and only new or changed legs are routed. (#2797, #2846, Closes #2794)
- Transit routes from Google are credited to Google. With Google as the transit provider, the result list still named Transitous and saved routes recorded it as their source. The list now names the backend that answered, and routes from the planner and from
create_transit_journeyrecord it. (#2854, Closes #2850) - Place clusters on the MapLibre and Mapbox maps look like the ones on the Leaflet map. The co
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
Every part of your trip. One app you own.
TREK has grown from a travel planner into a whole ecosystem for trips: plan together in real time on a live map, build hikes, tours and road trips, keep bookings and shared costs in order, pack, write the journal, lay out the photo book and hand the busy work to the built-in AI. Self-hosted, on the web, on your phone and offline.
PUBLIC SERVICES PROUDLY SPONSORED BY
What you get
Most of what follows is an addon an admin switches on or off. Lists, Costs, Documents, Collab, Tours, Vacay and Atlas ship on; Journey, Collections, MCP, the AI assistant, AI Parsing, Road trip, Dawarich and AirTrail ship off and are marked below.
🧭 Planning
- Day plans: drag places, notes and bookings between days with undo, or drop a map marker straight onto a day
- Maps: Leaflet, Mapbox GL or MapLibre GL (OpenFreeMap, no token) with clustering, photo markers, route lines and a whole-trip route overview
- Places: search the TREK Places index and OpenStreetMap with no key, or Google Places and Amap with one. Descriptions, hours and photos from Wikipedia, Wikidata and Wikimedia Commons, plus a rating and a custom image per place
- Explore: nearby places by category for the map view, from the TREK Places index with Overpass as fallback
- Routes: auto-sort a day (nearest neighbour then 2-opt, locked stops and hotels stay put), a travel mode per leg over OSRM or Valhalla, then open the day in Google Maps or CoMaps and a place in seven navigation apps
- Public transport: door-to-door itineraries over Transitous, or Google where Transitous has no data
- Import and export: Google Maps and Naver Maps lists, Google Maps directions links, GPX, KML and KMZ in; GPX and an ICS feed per trip or across all trips out
- Weather: 16-day forecast from Open-Meteo, no key, and the archive for dates beyond it
- Trip dates: move a trip and its days re-date themselves, with the bookings along or re-anchored. Trips also copy and archive
- Road trip (off by default): drives with stops, day windows and arrival times that recompute, route alternatives, hazards and EV charging with range
🥾 Tours
- Seven tour types: hike, city walk, run, bike (touring, road, gravel, MTB), paddle (kayak, canoe, SUP), horse ride, and ski and winter (alpine, cross-country, touring, snowshoe, winter hike)
- Routing: legs routed over Valhalla with shaping points, hand-drawn legs, route variants, round hikes of a wished length and trip places as stops, all with undo
- Hikes: routed within a maximum SAC grade (T1 to T6), the trail grades along the way, and via ferratas on the map
- Terrain: elevation profile, ascent and descent, and a 3D terrain map with grade colouring and a flyover, no token needed. Topo, hiking, cycling and satellite bases with sea marks and ski pistes as overlays
- Multi-day tours: one route cut into stages and spread across the trip's days
- Along the way: viewpoints, huts, water, food and more within a corridor of the route, inserted as a stop with the detour it adds
- Ski, paddle and city walks: a piste router by difficulty and lift type; a water router with portages, locks and a wind forecast; city walks with stays, opening hours and transit between stops
- Plan against reality: link a recorded GPX to a planned day and compare distance, ascent and time. Import trails from a wanderer instance, save tours to a collection and take them into another trip
🧳 Bookings and money
- Reservations: 18 booking types with status, confirmation code, travellers and attached files
- Flights and trains: several legs with stopovers and endpoint timezones, against 4,045 bundled airports so local times resolve without a key
- Accommodation: a stay spans a range of nights with a check-in window
- Booking import: EML, PDF, PKPass, HTML, TXT and photos of confirmations, through KItinerary or an AI model, with a review step before anything is saved. Prices become linked costs
- AirTrail (off by default): import flights from a self-hosted AirTrail instance and keep them in sync
- Costs: split in integer cents with equal or custom shares, several payers, settle-up suggestions, a per-person summary, a settlement log and CSV export. A receipt photo can fill in an expense
- Currencies: one per expense with the rate frozen at entry, from Frankfurter with no key
- Packing lists and to-dos: categories, templates, assignees and visibility tiers; bags with weights as an admin switch; to-dos with due dates, priorities and reminders
- Files: attach to a trip, place, day or booking, 50 MB each and 500 MB for video, with trash and restore
- PDF export: cover, place photos, day notes, bookings and costs, with an optional page break per day
👥 Collaboration
- Real-time sync (WebSocket): edits land live for everyone who has the trip open
- Members: add by email or username, hand over ownership, or add guests who have no login at all
- Permissions: an admin maps each of 17 trip actions to admin, trip owner, trip member or everybody
- Invites: one reusable link per trip with an optional expiry, and admin signup invites that drop a new account straight into a trip
- Public share: a read-only trip page without an account, with switches for map, bookings, packing, costs and chat
- Collab: group chat with replies, reactions and link previews, shared notes, links, polls and a What's Next list, each one its own switch
- Notifications: an inbox grouped by day with answers right from the notification, and a per-user matrix of events against in-app, email, webhook, ntfy, Web Push and plugin channels
📔 Journey and TREK Studio
- Journey (off by default): dated entries with story, mood, weather and tags, photos and video from uploads, Immich or Synology Photos, map views, co-authors, drafts and a public share link
- Linked journal: a trip can show one journal as its own, with the members picked on the trip as viewers or editors
- Recorded days (with Dawarich): keep a day's recorded route and turn its stays into entries
- TREK Studio: turn a journal into a printable photo book. 34 print-licensed typefaces, 17 themes, 108 designed pages in twelve styles, 160 recolourable stickers, text effects, layers and a Travel tab with route maps, country stamps and trip figures
- Auto layout: lays the whole book on the designed pages in the style of its theme, every photo in a frame, or rebuilds one spread
- Print and share: PDF export as pages or spreads with crop marks, several people editing at once, and design files to move a spread into another book
🗺️ Atlas, Vacay and Collections
- Atlas: countries and regions visited on geoBoundaries outlines, a bucket list, travel stats, and a tour activities tab with planned against recorded totals
- Vacay: leave calendar with half days, public holidays from date.nager.at, school holidays for 16 European countries, company holidays, carry-over between years, and joint or read-only sharing
- Collections (off by default): a place library outside any trip with lists, labels, ratings, a status per place, cover images, GPX and file export, copy into a trip, and sharing by invite
- Dawarich (off by default): link a Dawarich instance for recorded tracks, suggested stays and countries for the Atlas
🤖 AI assistant and MCP
- AI assistant (off by default): a chat that plans with you in a trip, across all your trips, in a journal and in Studio, and works with tours, costs, bookings, packing, Vacay and the Atlas
- Your own model: an API key for Anthropic, OpenAI, Gemini or OpenRouter, a ChatGPT plan, or any OpenAI-compatible endpoint, set for the instance or per user
- You stay in charge: reads run at once, every change waits as a card to apply or discard and can be undone for 15 minutes. Nothing leaves before you agree to the provider, and a file's text only with your consent
- Attachments: drop a booking confirmation, a GPX file or a photo into the chat, and the assistant offers what to do with it
- MCP server (off by default): OAuth 2.1 with mandatory PKCE and dynamic client registration, 410 tools, 30 resources and 4 prompts, 35 scopes in 17 groups ticked on the consent screen, and every call in the audit log
- Addon-aware: twelve addon gates decide which tools a session sees, and flipping one re-registers live sessions
🧩 Plugins
- Third-party plugins: install from the TREK registry or sideload a zip, with their own pages under
/plugins/<id> - Sandboxed: one child process per plugin, 66 grantable permissions, an admin-edited outbound host allowlist, memory and call caps
- Trust: registry downloads are pinned by sha256 and checked against the author's minisign key, a sideloaded zip is marked unverified, and
TREK_PLUGINS_ENABLED=falseturns the whole system off - Extension points: map layers, place details, day schedules, PDF sections, Atlas layers, journal rows, trip warnings, search and photo providers, route profiles, notification channels and MCP tools
- SDK:
trek-plugin-sdkwith a CLI to create, validate, run against real data, sign and publish
📱 Mobile and offline
- Apps: TREK Travel Planner for iPhone, iPad and Android connects to any TREK server, and the browser installs TREK as a standalone app with a themed status bar too
- Phone layouts: their own screens for every part of the app, with a bottom bar and dashboard widgets the user orders
- Offline reads: the app shell is precached and trips, places, tours, files and nearby places live in a per-user IndexedDB store, so a trip opens with no network
- Offline writes: changes queue and replay with an
X-Idempotency-Key, and a stale edit waits for a keep-mine or keep-theirs choice - Offline maps: raster and vector tiles of a trip downloaded ahead, and a switch that takes the whole app offline on purpose
⚙️ Admin, accounts and security
- Sign-in: password, OIDC and passkeys each switch on and off on their own,
OIDC_ONLYleaves SSO as the only way in, and an OIDC claim can grant admin - SSO and 2FA: one OIDC provider by discovery with PKCE (Authentik, Keycloak, Google and the like), TOTP with backup codes that an admin can require, and passkeys that count as the second factor
- Sessions: every sign-in is a session you can see and end, one by one or all others at once
- Hardening: rate limits on sign-in, reset and 2FA, a password policy, secrets encrypted at rest and masked on read, and an SSRF guard on every URL you configure
- Admin panel: users and the permission matrix, defaults for new users, categories and templates, addons, plugins, storage, notifications, MCP tokens, backups, audit log and releases
- Backups and storage: scheduled backups with retention that restore their own secrets, and local or S3-compatible storage per content category with replicas
- Appearance: light, dark or follow the OS, seven colour schemes plus a custom accent, transparency, density, reduced motion and text size
- 28 languages: en, de, es, fr, it, nl, hu, ru, zh, zh-TW, pl, cs, ar (right to left), he (right to left), br, id, tr, ja, ko, uk, gr, sv, vi, ca, az, et, sk, th
- Help center: a ? in the top bar with 381 step-by-step guides with screenshots, searched together with the wiki that ships in the image
Powered by dataforest cloud
Every TREK installation in the world searches through servers that dataforest cloud sponsors.
The place index with over 88 million places, the address search in every TREK language and the planet-wide routing all run on dataforest cloud in Frankfurt, Germany, free of charge for everyone who self-hosts TREK. Without this sponsorship, these services would not exist in this form.
Thank you, dataforest, for backing open source this generously. 💚
Looking for a server for your own TREK? dataforest cloud is where TREK's own services live.
AI usage
We use LLM-assisted coding tools across parts of this codebase. Nothing ships that a maintainer has not read and understood: every change goes through a pull request, is reviewed and tested, and has a human who can answer for it. "The AI wrote that" is not an answer any of us would accept from ourselves.
See How we use AI in TREK for the details.
Get started in 30 seconds
ENCRYPTION_KEY=$(openssl rand -hex 32) docker run -d --name trek -p 3000:3000 \
-e ENCRYPTION_KEY=$ENCRYPTION_KEY \
-e COOKIE_SECURE=false \
-v ./data:/app/data -v ./uploads:/app/uploads mauriceboe/trek
Open http://localhost:3000, or http://<server-ip>:3000 from another machine. On first boot TREK seeds an admin account — if you set ADMIN_EMAIL/ADMIN_PASSWORD those are used, otherwise the credentials are printed to the container log (docker logs trek).
COOKIE_SECURE=false is only for trying TREK over plain HTTP: without it the browser drops the session cookie and the login does not stick. Once TREK sits behind HTTPS (see Reverse Proxy), remove it.
[!TIP] No server yet? TREK's own public services run on dataforest cloud, our infrastructure sponsor. A small seed is plenty for a TREK instance and is ready within a minute.
Docker Compose · Helm / Kubernetes · Install as PWA · Reverse Proxy
Tech stack
Real-time sync via WebSocket (ws). Backend on NestJS 11. State with Zustand. Auth via JWT + OAuth 2.1 + OIDC + Passkeys (WebAuthn) + TOTP MFA. Weather via Open-Meteo (no key required). Maps with Leaflet and Mapbox GL.
The repository ships a ready-to-use docker-compose.yml
with secure defaults and every option documented inline. Download it, then:
docker compose up -d
See Install with Docker Compose for the full walkthrough.
helm repo add trek https://chart.liketrek.com
helm repo update
helm install trek trek/trek
See charts/README.md for values.
TREK works as a Progressive Web App, and the TREK Travel Planner app for iPhone, iPad and Android connects to the same server (Native Apps). To install the web app instead:
- Open TREK in the browser (HTTPS required)
- iOS: Share ▸ Add to Home Screen
- Android: Menu ▸ Install app (or Add to Home Screen)
TREK then launches fullscreen with its own icon, just like a native app.
Updating
See Updating — Docker Compose, Docker run, Helm, Portainer, Unraid and Proxmox, plus the encryption-key note.
For production, put TREK behind a TLS-terminating reverse proxy. TREK uses WebSockets for real-time sync, so the proxy must support WebSocket upgrades on /ws.
If you use the MCP addon, the proxy must also pass the Mcp-Session-Id header through in both directions on /mcp — Nginx and Caddy do this by default, but a proxy that strips it makes every tool call open a new session instead of reusing one. See the Reverse Proxy wiki page for details.
server {
listen 80;
server_name trek.yourdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name trek.yourdomain.com;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
# 500 MB covers backup-restore uploads (capped at 500 MB server-side).
client_max_body_size 500m;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /ws {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 86400;
}
# Only needed if you use the MCP addon. Responses are Server-Sent Events,
# so buffering must be off or tool results arrive late.
location /mcp {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_read_timeout 3600s;
}
}
trek.yourdomain.com {
reverse_proxy localhost:3000
}
Caddy handles TLS and WebSockets automatically.
Environment variables
Every variable, its default and what it does: see Environment Variables.
Data sources
The Atlas map's country and sub-national (province/county) boundaries come from geoBoundaries (Runfola et al., 2020), licensed CC BY 4.0. See NOTICE.md for full third-party attributions.
License
TREK is AGPL v3. Self-host freely for personal or internal company use. If you modify and offer TREK as a network service to third parties, your modifications must be open-sourced under the same licence.