github liketrek/TREK v4.2.0

latest release: plugin-sdk-v1.7.0
4 hours ago

Upvote your favourite feature requests

Thirty-two reported issues and discussions off the 4.1.1 tag, plus a layout bug found on a Galaxy S26 Ultra and the Studio work asked for in discussion #2064. No breaking changes; the one visible behaviour change is called out right below.

Read this first

Five of the changes deserve a heads-up:

  • Offline maps: tiles for the OpenStreetMap DE and Stadia presets were never actually stored, and the prefetch skipped the overview zoom levels a multi-city trip opens at (#2180). After updating, open the trip and press Download for offline use once more so the missing tiles get backfilled.
  • Android app icon: the launcher icon now keeps a proper safe zone instead of filling the whole tile. An installed PWA picks it up after removing and re-adding the app, or with Chrome's next WebAPK refresh.
  • Journey maps: the GPX tracks of linked trips no longer draw by default (#2194). If you want them back, flip on Show all trip GPX tracks in the Journey Settings (owners only).
  • Studio books: the book designer only ever rendered three of its seven typefaces, so a book set in Inter, Lora, EB Garamond, Playfair or Bebas was laid out against the wrong metrics (#2183). They render properly now, which means an existing book reflows: line breaks move and a tight text frame can overrun. Open a book you mean to print and look over its text frames once before you order it.
  • Passkeys on a localhost-only install: an instance that never set APP_URL and is browsed at http://localhost no longer advertises passkeys, because the relying-party scope cannot be derived and the enrolment would be refused anyway (#2147). If you use a passkey on such an install, set APP_URL to the address you actually open (for example http://localhost:3000) before upgrading, and the button stays where it was.

Studio

Three things from discussion #2064, all in the book designer.

The photo browser knows which day a picture is from. A filter above the grid narrows it to one journal entry, to the pictures no entry holds, or to what you just uploaded, and it combines with the search box: the filter answers "which day", the search answers "which words". Each entry in the Entries tab carries a button to its own pictures, and the page on the sheet offers its own entry in one press. On a journey with four hundred photographs and a page per day, this is the difference between browsing and hunting.

Pictures can come in without leaving Studio. The panel takes an upload or a drop from the desktop, and a drop onto the sheet itself places the picture where you let go, filling the frame under the pointer when there is one. Where a picture is stored follows the filter: into the entry it names, otherwise into the journey's gallery, and the line above the grid says which before you press. Videos are left out of a drop rather than failing it. A photo element also gets Fill page and Fill spread, which stretch it exactly to the bleed and send it behind everything else, which is the commonest layout in a photo book and the fiddliest to hit by hand.

A stop can be left off the route. The home airport written up as the first day is a leg nobody travelled, and it moved the printed distance, the furthest point and the countries. The travel panel now lists every stop in a folding section that says how many still count, with a switch on each; the same switch sits in the entry editor on desktop and phone, and an entry that is off the route says so on its card. The entry stays in the journal either way, and the figures are recomputed on the server, so the map, the distance and the country list agree with each other.

Fixes

Planner and maps

  • Re-entering a trip with the route toggle on released every automated transit route onto the map at once, and only toggling off and on cleared it. Routes now draw for the selected day only (#2019).
  • On days without check-in and check-out times, the route started at a hotel you had not checked into yet, or led back to one you had already left, including a 2400 km ray home after the return flight. A flight, train or ferry on the day now settles which side the hotel anchors (#2157).
  • Transit journeys from the transit search could only be fully edited on mobile. The journey dialog now hands over to the full booking form on desktop too: travelers, costs, files, booking code and status (#2148).
  • Day assignment notes written through the API or an assistant were stored but invisible. They now show in the place inspector, the day sidebar, both edit forms and the PDF export, and moving the place to another day keeps the note (#2163).
  • The day weather could silently belong to a different city: it anchored to the first located place anywhere in the trip. It now sticks to the selected day, names the place it is for, refreshes its cache hourly in the PWA, and serves the last few days from the live forecast instead of a lagging archive (#2167).
  • Two bookings linked to the same stop showed as one, the place card resolved its bookings with a first-match lookup. A stop now lists every booking linked to it, on the desktop plan tab, the place inspector and the phone's timeline and place sheet (#2201).
  • Editing a booking on a phone silently erased the stop it was linked to, because the sheet saved an empty link over the one made on the desktop. The link survives an edit now, and the picker the desktop dialog has always had is in the phone sheet too, so a booking can be pinned to a stop, moved or unpinned from either (#2216).
  • Editing a transit booking dropped the stations it came with. No form edits those, so an edit leaves them alone instead of saving an empty set over them.
  • The booking sheet on a phone showed no files at all for a booking that had them, and a place never showed the files of the bookings on it, on either platform. Both list them now, and a confirmation stored on a booking is reachable from the place card (#2217).
  • Opening a place in Google or Apple Maps from the installed app left an empty window behind that had to be dismissed before TREK was usable again. The handover happens from the page you are on now (#2218).

Costs

  • Recorded settlement payments never appeared in the mobile Costs tab. They now show up day-grouped, same as on desktop (#2151).
  • Editing an amount of 4,90 showed 4,9 in the field. Edit fields seed with two decimals everywhere, currency aware, and a three-decimal currency like KWD stays typable in the split and receipt fields (#2175).
  • Negative amounts work end to end for partial reimbursements: input (with a sign toggle, because the iOS number pad has no minus key), split math down to the cent, balances and the assistant tools (#2176).

Calendar and exports

  • Accommodation check-in and check-out appeared as 0-minute events in the calendar feed. They carry the same one-hour window as the parking and rental hand-overs; with both times set the all-day bar is dropped entirely, and the markers then carry the booking's confirmation number, notes and location themselves (#2136).
  • GPX export returned a 500 for any trip or place name with non-ASCII characters. Downloads keep the original name now, and the same fix covers the ICS export, the calendar feed and wallet passes (#2165).

Mobile and offline

  • The dashboard filter row could push the top bar and the bottom dock off the right edge on narrow phones with Android's forced zoom active, while the cards fit perfectly. The row scrolls inside its own box now and the page can no longer widen sideways.
  • The collections map on a phone was a fixed-height card with dead space below. It fills the viewport like the trip and journal maps (#2104).
  • When locating fails, typically an installed iOS app whose own location permission was denied, the only feedback was a hover tooltip. A clear message appears instead, with a hint at the device settings (#2095).
  • The app boots in the account's language when offline (#2146).
  • Tapping the hotel chip in a day's header opened the day overview, the same as the day pill next to it. It opens the stay now: the accommodation editor when you can edit days, otherwise the hotel's place, and closing it brings you back to the timeline (#2210).

Accounts

  • Passkey registration failed with a bare 400 on instances without APP_URL. An origin outside the relying-party scope is refused with an actionable message right at the options step, and derived setups heal scheme and port mismatches behind TLS proxies on registration and login. An instance without any usable configuration no longer advertises passkeys the options step would refuse (#2147).

Self-hosting

  • Stopping the container always ran into Docker's grace period and ended in SIGKILL, exit 137: any open browser tab holds a WebSocket, a WebSocket never closes by itself, and the shutdown waited for it with a fallback timed to lose the race. Sockets are released deliberately now: tabs get a clean "going away", the database closes on every exit path, and shutdown finishes well inside the grace period, so docker stop and restarts are clean and fast (#2193).
  • "Send test email" failed with a generic toast over an empty log. It now logs every outcome and names the actual cause, wrong credentials, DNS, a refused or filtered port, the 465-versus-587 TLS mix-up, a certificate problem, with the relay's own answer included and secrets kept out; the test send now bounds every phase so the verdict actually arrives, while a real notification keeps the patience it needs for a relay that scans the message. Found on the way: replacing a stored SMTP password typed the new one behind the masking bullets and saved both, the field now clears like its neighbours (#2196).
  • The image ships fast-uri 3.1.7, which closes six advisories rated high in the URL parser that the MCP SDK's schema validator pulls in. Nothing in TREK's own request handling was reachable through them, but the scanner flags the old version.

Studio

  • Only three of the seven text fonts rendered; Playfair, Inter, EB Garamond and Bebas fell back to Poppins, and serif drew Georgia instead of Lora: a stale three-font map, plus five font families that were declared but never actually shipped. All picker fonts load and reach the canvas and the print renderer now (#2183).

Journey

  • Editing an entry returned its tags as a raw JSON string instead of a list (#2155).
  • The gallery was in upload order, so photos added later landed behind days they belong before. It runs in trip chronology now: capture time when the photo carries one, otherwise the date of the stop it belongs to, on desktop, on phones and in shared journeys. The hand-arranged photo order inside an entry stays yours (#2200). A share link you have already circulated will show its photos in the new order from the first restart.
  • Journey maps drew the GPX tracks of every linked trip, with nothing to switch off, and one long track zoomed the map out until the entries were specks. The tracks are a journey setting now, owner-only and off by default, and the download is skipped entirely while they are off; when they are on, they no longer decide the framing as long as there are entries to frame (#2194).

MCP

  • The Trip Summary, Budget Overview and Packing List prompts failed in every MCP client, MCP Inspector included, with "Invalid arguments for prompt: expected number, received string". Prompt arguments always arrive as strings; the trip id is parsed from one now, invalid ids are refused up front, and the server's prompt registry no longer accepts a number schema at all (#2207).

Other

  • Task-list checkboxes would not toggle on desktop: the press animation shrank the row mid-click and the click landed next to the checkbox. The same trap is defused on the planner rows, the dashboard cards, the collections rows, the journey gallery tiles and the shared vacay calendar cards (#2158).
  • Long notes on Atlas bucket-list markers overflowed the viewport as one endless line. Tooltips wrap, scroll and stay on screen (#2153).
  • Creating a packing item over the API silently dropped weight, bag and quantity; the create routes accept them now on REST, MCP and the plugin RPC, and a bag reference from another trip is rejected instead of being stored (#2154).
  • A shared bag's weight was summed over only the items you are allowed to see, so your buddies' personal items silently dropped out: two people saw two different totals, and an overweight bag warned nobody. The total is computed on the server over every item now and updates live for everyone on all write paths, revealing nothing but the number itself; offline, the app falls back to summing what it can see (#2191).
  • The plugin update and consent dialogs scroll (#2159).
  • Shared note markdown is sanitized on every surface it renders on.

Small additions

  • The todo list can be sorted by due date: a toggle next to the priority sort, on desktop and on the phone, with the nearest deadline first and undated tasks last. Drag-to-reorder pauses while a sort is active, as it already did for the priority sort (#2205).
  • Poll questions support safe Markdown and multiline text, and long options wrap fully on desktop and mobile (#2177).
  • The admin addons page is a tile grid with sub-shelves: bag tracking, the collab features and the photo providers hang off their parent addon, and photo providers now require the Journey addon instead of dangling without it. If your instance has Immich or Synology connected while Journey is switched off, the providers go quiet until you enable Journey, and switching Journey off clears their enabled flags rather than remembering them.
  • Connected photo providers sit as buttons next to Upload in the journey gallery header.
  • Admins can edit instance-wide plugin settings in the admin UI (#2170).
  • A plugin can put its own buttons into the admin's instance-settings dialog, so an operator runs a plugin's action, a re-sync or a cache purge, from the admin panel rather than the user settings tab (#2209).
  • A plugin's declared setting defaults apply now: the admin form, the desktop settings tab and the phone settings screen all start from them, the plugin reads them at runtime, and a required field that is left empty is refused instead of saved blank (#2199).

Schema

Five appended migrations, all additive and all with a default that keeps existing data as it was. One is presentational only: the Naver list import counts as an integration instead of a trip addon, which moves its tile between admin groups and changes nothing about the import itself. One adds the flag behind the stops switch to journal entries, defaulting to counting, so every existing journey keeps the route and the figures it had. One adds the journey setting for the linked trips' GPX tracks, off by default. The last two belong to the plugin system: a settings field can carry a default value, and a settings action can carry a scope, defaulting to the user tab it renders on today.

Full changelog: v4.1.1...v4.2.0

Don't miss a new TREK release

NewReleases is sending notifications on new releases.