This release includes 18 security fixes for security teams reviewing exposed deployments.
Topics
+12 more
Affected surfaces
Summary
AI summaryBroad release touches Internationalization, Planner & Maps, Fixes & Hardening, and Authentication.
Full changelog
TREK 3.1.0
TREK 3 — rebuilt from the inside out. A modern NestJS backend, a React 19 frontend, and an end-to-end shared Zod contract layer so the client and server can never drift. On top of that foundation: a Splitwise-style Costs rework, Passkey login, AirTrail flight sync, multi-leg flights, real road routing, a reworked dashboard, five new languages, and a comprehensive offline/PWA hardening pass.
This release also fixes 18 privately-reported security vulnerabilities — including a critical authentication bypass. Updating to 3.1.0 is strongly recommended for every self-hosted instance. See Security below.
⚠ Proxmox VE community-script users: please wait before updating to v3.1.0
v3.1.0 changes how TREK is built and run:
- the repo is now an npm workspaces monorepo (client + server + new shared package) with a single root lockfile,
- the server is now compiled (dist/) instead of run directly via tsx,
- there are new build/runtime requirements (e.g. kitinerary-extractor for booking import).
The community-scripts (https://community-scripts.org/scripts/trek) LXC helper for TREK still targets the old 3.0.x layout. If you run its Update option right now, the build will fail and may leave your container in a broken state.
What to do: stay on your current version for now. An updated script is being submitted to ProxmoxVED and will roll out to ProxmoxVE after review — we'll post here once it's live. Your data (/opt/trek/data, /opt/trek/uploads) and .env are safe in the meantime.
Docker, Unraid, Helm and manual installs are not affected.
TREK 3 — NestJS + React 19
The biggest architectural change in TREK's history. The Express backend has been migrated to NestJS, the frontend upgraded to React 19, and both halves now share a single Zod contract package as the source of truth for every request and response.
- NestJS backend — modular architecture with dependency injection, replacing the previous Express app (#1087, foundation harness #1050)
- React 19 frontend — upgraded across the whole client
- Shared Zod contracts — one typed, validated schema package consumed by both client and server, so API shapes stay in lockstep
- Monorepo build pipeline —
sharedis now a properly built package; i18n moved into it so every surface reads from one translation set (#1056, #1066) - Pilot-then-migrate — the cutover started with a single module (
/api/weather) to prove the harness before the full migration (#1053)
Migrations run automatically on startup — no manual steps.
Security — Update Strongly Recommended
This release closes 18 privately-reported vulnerabilities, disclosed through coordinated private reporting. They range from a critical authentication bypass down to low-severity hardening. All self-hosted instances should update to 3.1.0.
Critical
| Advisory | Issue |
|---|---|
| GHSA-mjh4-w6fq-54qm | MFA bypass — the pre-2FA mfa_token was accepted as a full session token (JWT purpose confusion) |
High
| Advisory | Issue |
|---|---|
| GHSA-fvgw-r58q-4cw4 | OIDC account takeover — an SSO identity could be linked to an existing local account without email_verified |
| GHSA-627x-pmfq-98qv | SQL injection via unvalidated column names in journey entry update |
Medium
| Advisory | Issue |
|---|---|
| GHSA-xmqx-m462-52qr | OIDC login CSRF / session fixation — state was not bound to the initiating browser |
| GHSA-6vv9-669j-468p | Arbitrary file deletion under /uploads via attacker-controlled trip cover_image |
| GHSA-mggj-xgv8-95fp | MCP share-link tools let a non-owner member mint a public trip share link |
| GHSA-jx25-7cj6-88hq | Cross-trip IDOR — budget member paid-flag toggle not scoped to the trip |
| GHSA-p7pv-2jpm-qjx3 | Journey share permission flags (timeline/gallery/map) enforced only client-side |
| GHSA-pfr2-fgv9-q5xv | Stored HTML injection via reservation endpoint labels rendered into map markers |
| GHSA-h66w-m5g2-cqpc | Path traversal in the public journey photo proxy (local provider) reads auth-gated uploads |
| GHSA-3frp-pcr3-w932 | Stored HTML injection via journey entry story in the PDF export |
| GHSA-24x9-fcj9-vp6w | IDOR in the journey photo proxy — a share token resolves arbitrary asset IDs |
| GHSA-6f5j-xgjg-h9q7 | MCP tools bypass the admin-configurable RBAC permission system |
| GHSA-rrrf-7cf6-8736 | A settings password change did not invalidate existing sessions / tokens |
| GHSA-f5vh-p2h5-x735 | Blind SSRF via unvalidated redirect-following in Google/Naver list import and Maps URL resolution |
| GHSA-mx6m-qxv8-w624 | IDOR — any authenticated user could read another user's journey share token (full journey leak) |
Low
| Advisory | Issue |
|---|---|
| GHSA-w6f3-fp9r-xp6p | Admin backup restore extracted archives without a decompression-size limit (zip bomb) |
| GHSA-g8rf-gqrw-4qf9 | Stored cross-user HTML injection via trip title in the Journey suggestion banner |
Reported through coordinated private disclosure by @bytejmp, @tonghuaroot, @therawdev, and @shukla304. Thank you for reporting these responsibly.
Costs — Splitwise-Style Expense Splitting
Budget has been reworked into Costs: a proper shared-expense tracker built for group trips.
- Splitwise-style splitting — record who paid and split a cost across trip members, with running per-person balances
- Settle up — one-tap minimal-transfer settlement with persisted history and undo
- Multi-currency — log expenses in any currency (#551)
- Multi-payer support — costs aren't tied to a single payer
- Fixed categories — a consistent category set for cleaner reporting
- Mobile-first — redesigned for phone use end to end
Passkey (WebAuthn) Login
- Passwordless sign-in — register a passkey and log in with Face ID / Touch ID / a security key (#297, #1111)
- WebAuthn standard — platform and roaming authenticators supported
- Coexists with existing auth — passkeys sit alongside password, SSO, and MFA
Authentication
- Remember me option — Add a Remember me checkbox on login screen to extend session expiry (#1189)
AirTrail Integration
Two-way flight sync with AirTrail (#214, #1158).
- Import flights — pull your flight history from AirTrail into TREK
- Two-way sync — flights flow in both directions and stay aligned
- Reservation-aware — imported flights land as transport reservations
Planner & Maps
- Real road routes (OSRM) — when route display is enabled, day routes follow actual roads with travel-time connectors instead of straight-line estimates; the hidden route-calculation setting is gone, so enabled routes always use real road geometry (#1060, #1064)
- Multi-leg (layover) flights — model connecting flights with layovers as a single booking (#872, #1146)
- Reorder whole days + insert a day — drag entire days around and insert a new day into a trip (#589, #1148)
- Explore places on the map — discover and add points of interest (OpenStreetMap / Overpass) directly from the planner map; instance-wide Mapbox token support (#1147)
- More transport types — bus, taxi, bicycle, ferry and others (#1105)
- Richer imported places — list-imported places are enriched via the Places API (#886, #1161)
- Route optimization around accommodation + confirm-before-delete on notes (#1123)
- Category-coloured markers — map marker borders reflect the place's category colour (#1062)
- Mobile route tools — planner route tools are reachable from the mobile day-plan sheet (#1142)
Reservations
- Native booking-confirmation import — drop in a booking confirmation and TREK extracts the details via KDE KItinerary (#1102)
Dashboard Rework
- Boarding-pass hero — the next trip rendered as a boarding-pass-style hero card (#1079)
- Atlas row & live widgets — visited-countries row, upcoming reservations, and travel stats (country / distance) on the dashboard
- Mobile glass UI — frosted-glass styling and a context-aware bottom navigation
- OIDC PKCE — PKCE on the OIDC login flow
Packing
- Weight × quantity — bag and total weight calculations multiply item weight by quantity (#898)
- More bag colours — sub-bags stop repeating colours (#1156)
- Per-item quantity on bulk import — bulk import respects each item's quantity (#1157)
Internationalization
- Five new languages — Japanese, Korean, Turkish, Ukrainian, and Greek (#829, #977, #1029, #1055, #1061, #1075)
- i18n in the shared package — all locales now live in
sharedand are consumed by every surface (#1066)
Offline & PWA Overhaul
A focused hardening pass on the offline-first PWA, closing a series of sync, cache, and data-isolation issues.
- Hardened sync — temporary IDs are remapped on flush, ID collisions are prevented, and failed mutations are surfaced instead of lost (#1175)
- Reconnect re-hydration — the active trip store re-hydrates on reconnect / coming back online, and trip-scoped slices reset and hydrate uniformly in
loadTrip(#1180, #1181, #1184) - Offline tiles for real trips — offline map tiles now cover the actual trip area with a coherent cap and zoom-clamp (#1177)
- Bounded blob cache — the offline blob cache is scoped, evicted, and capped; place-photo caches no longer grow unbounded; Dexie is used as a fallback when a network read fails (#1178, #1179, #1174, H2/H3)
- Idempotency for multi-day offline — idempotency-key TTL lengthened so it survives being offline for days (#1182)
- Realtime dedup — corrected
assignment:createdecho de-duplication (#1183) - Persistent storage — offline storage is persisted and the Mapbox offline policy is honoured (#1184, #1058)
- Security: cross-user offline data leak — fixed an offline data leak between users on a shared device (#1176)
Fixes & Hardening
- Batched bug fixes — Atlas regions, planner overlays, imports, Safari modals, and more across several rounds (#1094, #1139, #1145, #1155)
- Backend/frontend hardening & consistency cleanups (#1113)
- Journey — PhotoLightbox z-index above the mobile entry view (#1101)
- Various — 2FA autofocus, viewer-timezone times on shared views, duplicate-place guard (#1159)
- Map/planner/dashboard polish plus small community-requested features (#1155)
- Self-hosted fonts — app fonts switched to self-hosted Poppins / Geist, dropping the Google Fonts CDN dependency (#1106)
Contributors
Thanks to everyone who contributed to 3.1.0:
- @mauriceboe
- @jubnl
- @Dkafetzis
- @Larinel
- @SkyLostTR
- @gzor
- @jufy111
- @ppuassi
- @rossanorbr
- @sharkpaw
- @soma3978
And to the security researchers who reported responsibly: @bytejmp, @tonghuaroot, @therawdev, @shukla304.
Stats
| Metric | Value |
|--------|-------|
| Commits | 58 |
| Merged PRs | 45+ |
| Files changed | 1,750 |
| Lines added | 138,000+ |
| Contributors | 11 |
Upgrading
docker pull mauriceboe/trek:3.1.0
docker compose up -d
Migrations run automatically on startup. No manual steps required.
Security: because 3.1.0 fixes a critical authentication bypass and 17 other vulnerabilities, updating promptly is strongly recommended.
Breaking Changes
- Backend migrated from Express to NestJS (requires Node 20+).
- Frontend upgraded to React 19 (compiled with Babel/webpack monorepo build).
- Monorepo npm workspaces layout replaces the previous single‑package structure; community Proxmox LXC scripts must be updated.
- Server now runs compiled dist/ output instead of being executed directly via tsx.
Security Fixes
- GHSA-mjh4-w6fq-54qm – Critical MFA bypass (mfa_token accepted as full session JWT).
- GHSA-fvgw-r58q-4cw4 – High‑severity OIDC account takeover without email_verified check.
- GHSA-627x-pmfq-98qv – SQL injection via unvalidated column names in journey entry update.
- GHSA-xmqx-m462-52qr – OIDC login CSRF/session fixation due to missing state binding.
- GHSA-6vv9-669j-468p – Arbitrary file deletion under /uploads via attacker‑controlled cover_image.
- GHSA-mggj-xgv8-95fp – MCP share‑link tools allow non‑owner members to mint public trip links.
- GHSA-jx25-7cj6-88hq – Cross‑trip IDOR toggling paid flag on budget member outside its trip.
- GHSA-p7pv-2jpm-qjx3 – Journey share permission flags enforced only client‑side.
- GHSA-pfr2-fgv9-q5xv – Stored HTML injection via reservation endpoint labels rendered into map markers.
- GHSA-h66w-m5g2-cqpc – Path traversal in public journey photo proxy reads auth‑gated uploads.
- GHSA-3frp-pcr3-w932 – Stored HTML injection via journey entry story in PDF export.
- GHSA-24x9-fcj9-vp6w – IDOR in journey photo proxy resolving arbitrary asset IDs with a share token.
- GHSA-6f5j-xgjg-h9q7 – MCP tools bypass admin‑configurable RBAC permission system.
- GHSA-rrrf-7cf6-8736 – Password change does not invalidate existing sessions/tokens.
- GHSA-f5vh-p2h5-x735 – Blind SSRF via unvalidated redirect following in Google/Naver list import and Maps URL resolution.
- GHSA-mx6m-qxv8-w624 – IDOR allowing any authenticated user to read another user's journey share token (full leak).
- GHSA-w6f3-fp9r-xp6p – Zip‑bomb vulnerability in admin backup restore lacking decompression size limit.
- GHSA-g8rf-gqrw-4qf9 – Stored cross‑user HTML injection via trip title in Journey suggestion banner.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
Related context
Related tools
Beta — feedback welcome: [email protected]