Skip to content

Releases: Freika/dawarich

1.13.1

Choose a tag to compare

@Freika Freika released this 23 Aug 16:43
fab7744

Added

  • The mobile apps can now use the family feature: see who is in your family, who is sharing their location, and respond to location requests. New endpoints: GET /api/v1/families/mine, PATCH /api/v1/families/sharing, POST /api/v1/families/location_requests, and POST /api/v1/families/location_requests/:id/accept and /decline. The overview carries no coordinates — locations stay in the existing family locations endpoints. Important: family functionality isn't there yet in the mobile app and will be added later.
  • Tracks are now served as vector tiles from GET /api/v1/tiles/tracks/:z/:x/:y.mvt.

Fixed

  • Saving family sharing settings without picking a duration no longer turns a timed share into a permanent one, and re-enabling a lapsed share restores its duration.
  • Each account can now pick its own geocoding provider — Photon, Geoapify, Nominatim or LocationIQ — under Settings → Integrations, with a button to test it. The PHOTON_API_HOST, GEOAPIFY_API_KEY, NOMINATIM_API_HOST and LOCATIONIQ_API_KEY variables keep working and take precedence.
  • A custom basemap that covers only part of the world can now fill the gaps with the built-in tiles. Turn on "Fill gaps with the default basemap" under Custom Basemap URL. It is off by default, because filling the gaps means requesting tiles from Dawarich's tile server.
  • Geocoding settings now take a requests-per-second limit, and lookups are paced to stay inside it, so a bulk backfill no longer floods a server that asked for one request a second. komoot is pinned to its published 1/s and ChibiGeo to your plan's limit. Set the same ceiling instance-wide with REVERSE_GEOCODING_RPS, and raise REVERSE_GEOCODING_CONCURRENCY if your provider has no limit worth respecting. (#3343)
  • Device and importer details are no longer repeated on every point, which noticeably shrinks large histories. Existing points are migrated by a background job after upgrading; on millions of points expect it to run for hours and the database to grow temporarily first. Nothing changes in the UI while it runs, and it can be re-run at any time to pick up rows it has not reached. Adding the linking column briefly locks points at startup; an instance with heavy write traffic that cannot get the lock defers the change to a background job, so booting still completes. To opt out, set SKIP_POINT_DIMENSION_BACKFILL=1 before migrating, on every service including Sidekiq.
  • Saving an AirTrail integration with an unreachable host no longer crashes the settings page — the settings are saved and the connection failure is reported instead. (#3393)
  • Custom geocoding hosts are checked against the same blocked-address list as the photo integrations; unresolvable hosts can still be saved.
  • Place and location search skip a busy geocoding rate limit instead of stalling the request; a skipped lookup is never cached as an empty answer.
  • The geocoding "Test my provider" button reports a busy rate limit honestly and no longer echoes internal error details.
  • Nightly and realtime reverse geocoding resolve each user's settings once instead of once per point.
  • Saving a new speed color scale now updates tiled tracks immediately.
  • Turning the Tracks layer off while it is still loading no longer shows it anyway.
  • The reverse-geocoding percentage follows the interface language's number format.
  • AirTrail's last-synced time is shown in the interface language and timezone.
  • A family location request can no longer be accepted and declined at the same time.
  • Double-submitting the geocoding provider form no longer fails.
  • Switching the Photon server to komoot now clears any API key you had saved, instead of sending it to a server that never asked for one.
  • Rotating a geocoding API key now refreshes cached place results instead of serving the previous key's answers for an hour.
  • The geocoding settings form lines its fields up on one width, credits ChibiGeo to the Dawarich team and links to it, and hides the API key field for the komoot server that takes none.

Changed

  • Tiled rendering (beta) now covers Routes, Tracks and Fog of War, leaving only the Scratch map on the classic full download. Under tiles, routes are colored per track, the route-splitting sliders no longer apply, and clicking a track opens its details.
  • The vector tile query timeout is now configurable with VECTOR_TILES_QUERY_TIMEOUT_MS (default 5000 ms), for self-hosted instances where very large date ranges exceeded the old limit. (#3386)
  • The Integrations settings page shows one service at a time, picked from a sidebar, each with a connection indicator. Geocoding settings moved here from their own tab; the old address redirects. (#3393)
  • The reverse geocoding panel now shows what share of your points have been geocoded instead of a raw count you had to divide yourself, and hides the "points without data" figure once it reaches zero. Instances with STORE_GEODATA=false no longer compute that count at all.

💙 This release is supported by Steven B., James Manolios, chenrik, aldumil, derpderpington, Chippie, dint, jhalpern, Lex Fradski, Schlufo, cyberswan.at, craftyklaus, Andre, hogenf, naraxius, Embrace, martin4861, Alex, evetters, GregF, Jon Coffee, Lukas, Robbie G, Kilian, Hans G, Chris, tabaha, Andre, Michael C, Chris, Jonah B., Dante, daallex, Tanner A., Milien M., Mathias, Travis S., Matthew F., Johnathan D., bleibdirtroy, no1etal, dixet, Bailey J., Alex D., Benjamin M., Daniel A., Florian, BeeHappy, ChemistryDachshund, OrangeWindies, Michelangelo V., Edward, Erazem Z., Denis Abt, Tony G., Lomky, Osamu Y., Linus T., Christian C., Sebastian, Jan K., Nathan T., Max G., Lars N., Karol B., Konstantin, Johannes H., t3hero, g3lin, Tim, Philipp M., Brand K., Pablo F. M., Jon H., fkB, Mikael, Dániel A., Hai_Tsung, ShooTex, GreenTentacle, PinkahPandah, David, Ken, Denna G., Andre, Hendl91, Jon H., MrRed, Arkadiusz Z., Jake, Bator T., Alex J. H., eps-dev, twiggu, Dragan V., Jerome G., Sheya B., ArnyminerZ, Gustav B., higgs01, Frank F., F. J. Kruz, Jon D., Alexander J. H., Daniel D., Gonzalo M., Ricardo T., Christof Z., Narrator, JohnSmith21, smartbert, A.M., Matthew Z., Dror T., Jonathan K., Kyle C., Mario B., Albin H., Phillip S., Bernd, Tom, Nick O., greeting7416, Dick, Brian R., Markus, TheSlimShady, Andrew M., Mason B., Chance, GoogilyBoogily, Dragon, Oliver, HexitNiels, Michael G., Pablo A., Leo L., Daniel D., DSKun, Jonathan K., Erik K., Tiebolt v. d. L., Steven, Mathias, Sam B., Martin C., Manuel F., K8BCO, Samuel D., duckduck, David, heydabop, Riccardo N., Tim. S., Jonas, Kenji I. on Patreon and KoFi 💙


What's Changed

  • Per-user geocoding provider settings by @Freika in #3388
  • Restructure integrations settings into a service sidebar with connection statuses by @Freika in #3393
  • Phase C: add point dimension tables and backfill jobs by @Freika in #3375
  • Family API: aggregate overview, sharing controls, location requests by @Freika in #3401
  • feat: fall back to the default basemap outside a custom tileset's coverage by @Freika in #3400
  • Tiled rendering for tracks, routes and fog of war by @Freika in #3402
  • Requests-per-second limits for geocoding by @Freika in #3403
  • fix: harden geocoding settings and stamp the 1.13.1 release by @Freika in #3405
  • docs: tighten the 1.13.1 review-fix changelog entries by @Freika in #3406
  • fix: keep the UI intact when text runs longer than English by @Freika in #3404
  • fix: address the actionable bot-review findings on the 1.13.1 rollup by @Freika in #3407
  • 1.13.1 by @Freika in #3399

Full Changelog: 1.13.0...1.13.1

1.13.0

Choose a tag to compare

@Freika Freika released this 18 Aug 18:21
97fad41

Experimental: new (opt-in) renderer for Points layer. Check it out, it can render 1M points in couple of seconds. More details below.

Added

  • The map has a new opt-in "Tiled rendering" beta in map settings: the points layer is drawn from vector tiles built by the database, so the browser only downloads what the current view needs. Dense areas arrive as aggregated markers carrying a point count — the heatmap weighs them accordingly — and long date ranges over large histories pan and zoom smoothly instead of stalling on one huge download. On a test account with 1 million points, opening the full three-year history classically pulls the whole range up front — 992 requests and roughly 590 MB of JSON, which crashed the browser tab a third of the way in; tiled rendering drew the same city view from 12 requests and 146 KB in a fraction of a second, and re-opening the map shortly after costs no requests at all. Individual points keep their popups, though a merged marker has no single point to open — zoom in to separate it. Dragging points to edit them is unavailable while tiled mode is on, and turning on Routes, Fog of War or Scratch map temporarily switches back to classic loading (the settings panel says which layer is blocking). Tiles are cached privately in the browser and refresh automatically when your location history changes, so the live trail can lag up to five minutes behind. (#2691)

Changed

  • Removed three superseded points indexes (the old dedup index and two composites) now that the consolidated (user_id, timestamp, lonlat) index from 1.12.2 serves their queries. The migration cleans up any invalid leftover index first, rebuilds the consolidated index automatically when an interrupted build left it invalid, and refuses to run only when it is missing entirely. Frees several gigabytes on large instances and further reduces the write cost of every point.
  • The nightly cache preheat now runs as one background job per user instead of a single job looping over every user. Its duration is bounded by the slowest individual user rather than by the sum of all of them, so one account with a large history no longer delays the preheat for everyone else. On Dawarich Cloud it now only preheats active and trial accounts; self-hosted instances continue to preheat every user.

Fixed

  • Four scheduled jobs (app version check, cache preheat, family location request expiry, points counter correction) were queued onto default instead of the queues their job classes declare, so they competed with higher-priority work — the cache preheat in particular could hold up imports, track generation and stats for minutes at a time. They now run on app_version_checking, cache, families and low_priority respectively.

💙 This release is supported by Steven B., James Manolios, chenrik, aldumil, derpderpington, Chippie, dint, jhalpern, Lex Fradski, Schlufo, cyberswan.at, craftyklaus, Andre, hogenf, naraxius, Embrace, martin4861, Alex, evetters, GregF, Jon Coffee, Lukas, Robbie G, Kilian, Hans G, Chris, tabaha, Andre, Michael C, Chris, Jonah B., Dante, daallex, Tanner A., Milien M., Mathias, Travis S., Matthew F., Johnathan D., bleibdirtroy, no1etal, dixet, Bailey J., Alex D., Benjamin M., Daniel A., Florian, BeeHappy, ChemistryDachshund, OrangeWindies, Michelangelo V., Edward, Erazem Z., Denis Abt, Tony G., Lomky, Osamu Y., Linus T., Christian C., Sebastian, Jan K., Nathan T., Max G., Lars N., Karol B., Konstantin, Johannes H., t3hero, g3lin, Tim, Philipp M., Brand K., Pablo F. M., Jon H., fkB, Mikael, Dániel A., Hai_Tsung, ShooTex, GreenTentacle, PinkahPandah, David, Ken, Denna G., Andre, Hendl91, Jon H., MrRed, Arkadiusz Z., Jake, Bator T., Alex J. H., eps-dev, twiggu, Dragan V., Jerome G., Sheya B., ArnyminerZ, Gustav B., higgs01, Frank F., F. J. Kruz, Jon D., Alexander J. H., Daniel D., Gonzalo M., Ricardo T., Christof Z., Narrator, JohnSmith21, smartbert, A.M., Matthew Z., Dror T., Jonathan K., Kyle C., Mario B., Albin H., Phillip S., Bernd, Tom, Brett J., Nick O., greeting7416, Dick, Brian R., Markus, TheSlimShady, Andrew M., Mason B., Chance, GoogilyBoogily, Dragon, Oliver, HexitNiels, Michael G., Pablo A., Leo L., Daniel D., DSKun, Jonathan K., Erik K., Tiebolt v. d. L., Steven, Mathias, Sam B., Martin C., Manuel F., K8BCO, Samuel D., duckduck, David, heydabop, Riccardo N., Tim. S., Jonas, on Patreon and KoFi 💙


What's Changed

Full Changelog: 1.12.2...1.13.0

1.12.2

Choose a tag to compare

@Freika Freika released this 15 Aug 15:48
fa4947b

Added

  • Dawarich Cloud can now credit sign-ups to affiliate partners. Self-hosted instances are unaffected — both the tracking script and the attribution call stay off unless the Cloud-only PARTNERO_PROGRAM_ID and PARTNERO_API_KEY are set.

Changed

  • Consolidated points table indexes: a new (user_id, timestamp, lonlat) unique index replaces three redundant indexes, roughly halving the write cost of every point. The index is built by the boot-time migration; on instances with millions of points this can take several minutes, during which the container waits before serving requests. The points table itself stays fully usable while the index builds.
  • Automatic daily track generation no longer rebuilds a user's entire history when their tracks are missing and their history exceeds 100k points. On Dawarich Cloud such histories are backfilled automatically at a throttled rate; self-hosted instances still rebuild directly, as fast as their own hardware allows.

Fixed

  • The map no longer stays blank after an upgrade when the dawarich_public Docker volume still holds precompiled assets from an older version. The asset manifest now ships inside the app image instead of the public volume, the boot-time asset sync stages from inside the app directory (a tmpfs-mounted /tmp can no longer skip it), and the container logs a warning if the sync still cannot run. (#3346)
  • User data exports no longer fail when a legacy place has no spatial coordinates. (#3344)
  • The Tracks layer toggle on the map now reflects your saved setting after a page reload; previously it always showed as off even though the setting was saved and tracks were loaded. (#736)
  • The map no longer leaps to a just-left place or a phantom spot off your route: iOS visit reports delivered after departure and coarse cell-tower fixes without motion data are now filtered out as anomalies. Existing histories are re-evaluated automatically after the upgrade, and tracks and stats are rebuilt along the way.
  • The Family page no longer fails to load, and the family map no longer places a member at the wrong spot dated 1970, when someone's history contains legacy points missing a timestamp or coordinates. Such points are also left out of shared location history, and a member whose points are all incomplete is omitted from the map rather than shown somewhere wrong. (#3254)
  • Google Timeline phone exports no longer lose altitude, accuracy and speed on points taken from the rawSignals section — those fields were read from the wrong nesting level and came back empty. Points already imported keep their empty values, and importing the same file again skips them; delete the old import first, then import the file again. (#3337)
  • Coarse rawSignals fixes with an accuracy radius above 10km are now flagged as anomalies on import, the same as points from every other source. They previously slipped through because their accuracy was never read.
  • Daily and monthly distance no longer counts a jump across a tracking gap longer than your "minutes between routes" setting when the two points come from different imports, from live tracking, or from a photo integration (Immich, PhotoPrism, Google Photos). Points inside one imported file still count as continuous history regardless of gaps, so sparse sources such as Google Timeline keep their full distance. Existing months keep their old numbers — run Map v2 → Settings → Recalculate tracks & stats once after upgrading to apply the fix to past months. (#2689)
  • Every anomaly-filter pass now detaches the points it flags from their tracks and queues the affected tracks and months for a rebuild, so a point flagged after a track was already built no longer leaves a stale leap baked into the geometry. Rebuilds triggered by the anomaly backfill run on the low-priority queue so live tracking stays ahead.
  • A large history that produces no tracks is no longer re-walked by the throttled track backfill every day; a completed walk now backs off for a week before it can be scheduled again.

💙 This release is supported by Steven B., James Manolios, chenrik, aldumil, derpderpington, Chippie, dint, jhalpern, Lex Fradski, Schlufo, cyberswan.at, craftyklaus, Andre, hogenf, naraxius, Embrace, martin4861, Alex, evetters, GregF, Jon Coffee, Lukas, Robbie G, Kilian, Hans G, Chris, tabaha, Andre, Michael C, Chris, Jonah B., Dante, daallex, Tanner A., Milien M., Mathias, Travis S., Matthew F., Johnathan D., bleibdirtroy, no1etal, dixet, Bailey J., Alex D., Benjamin M., Daniel A., Florian, BeeHappy, ChemistryDachshund, OrangeWindies, Michelangelo V., Edward, Erazem Z., Denis Abt, Tony G., Lomky, Osamu Y., Linus T., Christian C., Sebastian, Jan K., Nathan T., Max G., Lars N., Karol B., Konstantin, Johannes H., t3hero, g3lin, Tim, Philipp M., Brand K., Pablo F. M., Jon H., fkB, Mikael, Dániel A., Hai_Tsung, ShooTex, GreenTentacle, PinkahPandah, David, Ken, Denna G., Andre, Hendl91, Jon H., MrRed, Arkadiusz Z., Jake, Bator T., Alex J. H., eps-dev, twiggu, Dragan V., Jerome G., Sheya B., ArnyminerZ, Gustav B., higgs01, Frank F., F. J. Kruz, Jon D., Alexander J. H., Daniel D., Gonzalo M., Ricardo T., Christof Z., Narrator, JohnSmith21, smartbert, A.M., Matthew Z., Dror T., Jonathan K., Kyle C., Mario B., Albin H., Phillip S., Bernd, Tom, Brett J., Nick O., greeting7416, Dick, Brian R., Markus, TheSlimShady, Andrew M., Mason B., Chance, GoogilyBoogily, Dragon, Oliver, HexitNiels, Michael G., Pablo A., Leo L., Daniel D., DSKun, Ross, Andre K., Jonathan K., Erik K., Tiebolt v. d. L., Steven, Mathias, Poutouprod, Sam B., Martin C., Manuel F., K8BCO, Samuel D., duckduck, David on Patreon and KoFi 💙


What's Changed

  • Handle legacy place coordinates in user exports by @Freika in #3361
  • Fix blank map when the public volume carries stale assets by @Freika in #3362
  • perf: consolidate points indexes and guard full-history track rebuilds by @Freika in #3359
  • feat: throttled full-history track backfill for large users by @Freika in #3360
  • Filter leaped points: departed visit reports and cold-start fixes by @Freika in #3345
  • Sync the Tracks layer toggle with saved settings on map load by @Freika in #3365
  • fix: stop dropping altitude, accuracy and speed from phone rawSignals by @felicabrera in #3341
  • fix: accept both aff and via as the Partnero referral param by @Freika in #3366
  • Fix: family page 500 error due to null timestamps in latest_point and wrong date for family popup by @0LGuenth in #3258
  • fix: exclude cross-activity jumps from daily distance calculation by @f1dot4 in #2689
  • 1.12.2 by @Freika in #3364

New Contributors

Full Changelog: 1.12.1...1.12.2

1.12.1

Choose a tag to compare

@Freika Freika released this 12 Aug 22:27
59a0729

Fixed

  • Fix to recently added migrations that could fail on some self-hosted instances with a large number of visits. The migration now runs in smaller batches and is resumable if interrupted.

💙 This release is supported by Steven B., James Manolios, chenrik, aldumil, derpderpington, Chippie, dint, jhalpern, Lex Fradski, Schlufo, cyberswan.at, craftyklaus, Andre, hogenf, naraxius, Embrace, martin4861, Alex, evetters, GregF, Jon Coffee, Lukas, Robbie G, Kilian, Hans G, Chris, tabaha, Andre, Michael C, Chris, Jonah B., Dante, daallex, Tanner A., Milien M., Mathias, Travis S., Matthew F., Johnathan D., bleibdirtroy, no1etal, dixet, Bailey J., Alex D., Benjamin M., Daniel A., Florian, BeeHappy, ChemistryDachshund, OrangeWindies, Michelangelo V., Edward, Erazem Z., Denis Abt, Tony G., Lomky, Osamu Y., Linus T., Christian C., Sebastian, Jan K., Nathan T., Max G., Lars N., Karol B., Konstantin, Johannes H., t3hero, g3lin, Tim, Philipp M., Brand K., Pablo F. M., Jon H., fkB, Mikael, Dániel A., Hai_Tsung, ShooTex, GreenTentacle, PinkahPandah, David, Ken, Denna G., Andre, Hendl91, Jon H., MrRed, Arkadiusz Z., Jake, Bator T., Alex J. H., eps-dev, twiggu, Dragan V., Jerome G., Sheya B., ArnyminerZ, Gustav B., higgs01, Frank F., F. J. Kruz, Jon D., Alexander J. H., Daniel D., Gonzalo M., Ricardo T., Christof Z., Narrator, JohnSmith21, smartbert, A.M., Matthew Z., Dror T., Jonathan K., Kyle C., Mario B., Albin H., Phillip S., Bernd, Tom, Brett J., Nick O., greeting7416, Dick, Brian R., Markus, TheSlimShady, Andrew M., Mason B., Chance, GoogilyBoogily, Dragon, Oliver, HexitNiels, Michael G., Pablo A., Leo L., Daniel D., DSKun, Ross, Andre K., Jonathan K., Erik K., Tiebolt v. d. L., Steven, Mathias, Poutouprod, Sam B., Martin C., Manuel F., K8BCO, Samuel D., duckduck, David on Patreon and KoFi 💙


What's Changed

  • feat: attribute referred signups to Partnero affiliates by @Freika in #3348
  • Bound the adjacency query in BoundaryDetector by @Freika in #3351
  • Use unlogged tables instead of temporary ones in dedupe migrations by @Freika in #3350
  • 1.12.1 by @Freika in #3352

Full Changelog: 1.12.0...1.12.1

1.12.0

Choose a tag to compare

@Freika Freika released this 11 Aug 18:12
246e280

⚠️ Important ⚠️:

  1. Map V1 (Leaflet / Raster tiles map) was removed.
  2. This release contains data migrations that will recalculate your data. Please let them work, they will make a lot of stuff better.
  • Visits will be better
  • Tracks will be better
  • Timeline will be better

Thank you!

Added

  • Dawarich can now be used in German, Spanish or French: pick a language under Settings → General. The choice is saved to your account and applies to emails and notifications too; API responses stay in English.
  • If your browser prefers one of those languages, a dismissible banner offers the switch — it never changes your language on its own.

Removed

  • Map v1 (Leaflet) has been removed: /map now opens the MapLibre map and /map/v1 redirects to /map/v2. The Settings → Maps page went with it, and all maps now require WebGL.

Changed

  • Monthly statistics maps and publicly shared month maps are now rendered with MapLibre GL instead of Leaflet.
  • Deleting an import or a notification now updates the list in place instead of repainting the page.
  • Long-running backfills now resume where they stopped after a restart instead of starting over.
  • Visit detection has been rebuilt around stays, movement and honest gaps: a tracking silence that starts and ends at the same place is one continuous visit, a silence that ends somewhere else becomes an explicit "untracked" stretch, and visit times snap to when movement actually stopped. Slow traffic can no longer be carved into fake roadside "visits".
  • Visits are only named after a business or POI when the evidence supports it — anything weaker gets a street address instead of a made-up venue name.
  • Every detected visit carries a confidence score: medium-confidence visits render subdued, low-confidence ones collapse into a per-day disclosure, confirmed visits always render at full strength. The gating activates once your history has been re-detected.
  • The "Visit Max Gap" slider and "Smart density fill" toggle are gone — gap handling needs no configuration. Areas now label the visits detection finds instead of running a separate nightly pass, and reshaping an area relabels its historical visits.
  • Machine-detected visits are regenerable: re-detection replaces them wholesale, while anything you confirmed, renamed, re-placed, deleted or noted — and anything imported — survives untouched. Existing visits keep their old detection until re-detected: press the re-detect button in Settings → Visits. Self-hosted instances re-detect all accounts automatically after migrating (set SKIP_VISITS_FLEET_REDETECT=1 before migrating to opt out); Dawarich Cloud is re-detected in a staged rollout.
  • The timeline marks an interior gap as "untracked" from 45 minutes up (previously 90) once your history has been re-detected.
  • Transportation mode detection has been rebuilt: modes are inferred from movement patterns over time windows, segments carry a confidence score, and tracker hints are blended in rather than trusted blindly. Recognized: stationary, walking, running, cycling, driving, train, flying; bus, boat and motorcycle only come from tracker hints or manual edits.
  • The transportation threshold sliders and expert mode are gone. Existing tracks keep their old classification until re-detected: press "Re-classify my history" in Map settings → Transportation Mode Detection. Self-hosted admins can redo every account with TransportationModes::FleetReclassifyJob.perform_later once the segment backfill has finished.
  • The timeline got quieter: a one-line day header with per-mode distance chips, tracks that expand to a mode ribbon with only the legs that matter, and in-place mode editing — click a leg's mode name to change it. The full segment list lives behind "All segments".
  • Visits no longer have a review flow: the suggestions banner, "Needs review" cards, filters and bulk Confirm are gone. Every visit row has an Edit button, and editing a suggested visit confirms it.
  • Deleting a visit keeps an invisible tombstone so detection never re-suggests it; your location points are untouched. Previously declined visits become tombstones too.
  • Days per Country moved from the map's Create tab to the Insights page as a pair of cards, following the year you pick at the top of the page.
  • After upgrading, restart the app once migrations have run — until then, deleting a visit looks like it worked without saving. A background backfill converts existing track segments to time-based anchoring; progress is visible under Background jobs settings.

Fixed

  • The "someone joined your family" email no longer fails to send.
  • Re-detecting your whole visit history no longer fails when Dawarich is set to German or Spanish.
  • The "family is full" notice now shows how many seats are taken instead of stopping mid-sentence in German and Spanish.
  • Notifications about a failed import, a family invitation and the year-end digest are no longer partly untranslated.
  • Trip pages no longer fail with a 500 when Immich or Photoprism is unreachable — the trip loads without photos. (#3308)
  • OIDC_ISSUER written with a # fragment no longer fails sign-in with "Issuer mismatch". (#3289)
  • Clicking a map panel's own button now closes it. (#3317)
  • /metrics no longer reports duplicate series when the web and Sidekiq exporters merge; shared series carry a process label. (#3304)
  • Uploading points no longer logs unknown OID 28: failed to recognize type of 'xmax'. (#3309)
  • The coordinates shown when you click a point on the map now match the points list. (#3264)
  • Photo search now covers the whole of the end date. (#3263)

💙 This release is supported by Steven B., James Manolios, chenrik, aldumil, derpderpington, Chippie, dint, jhalpern, Lex Fradski, Schlufo, cyberswan.at, craftyklaus, Andre, hogenf, naraxius, Embrace, martin4861, Alex, evetters, GregF, Jon Coffee, Lukas, Robbie G, Kilian, Hans G, Chris, tabaha, Andre, Michael C, Chris, Jonah B., Dante, daallex, Tanner A., Milien M., Mathias, Travis S., Matthew F., Johnathan D., bleibdirtroy, no1etal, dixet, Bailey J., Alex D., Benjamin M., Daniel A., Florian, BeeHappy, ChemistryDachshund, OrangeWindies, Michelangelo V., Edward, Erazem Z., Denis Abt, Tony G., Lomky, Osamu Y., Linus T., Christian C., Sebastian, Jan K., Nathan T., Max G., Lars N., Karol B., Konstantin, Johannes H., t3hero, g3lin, Tim, Philipp M., Brand K., Pablo F. M., Jon H., fkB, Mikael, Dániel A., Hai_Tsung, ShooTex, GreenTentacle, PinkahPandah, David, Ken, Denna G., Andre, Hendl91, Jon H., MrRed, Arkadiusz Z., Jake, Bator T., Alex J. H., eps-dev, twiggu, Dragan V., Jerome G., Sheya B., ArnyminerZ, Gustav B., higgs01, Frank F., F. J. Kruz, Jon D., Alexander J. H., Daniel D., Gonzalo M., Ricardo T., Christof Z., Narrator, JohnSmith21, smartbert, A.M., Matthew Z., Dror T., Jonathan K., Kyle C., Mario B., Albin H., Phillip S., Bernd, Tom, Brett J., Nick O., greeting7416, Dick, Brian R., Markus, TheSlimShady, Andrew M., Mason B., Chance, GoogilyBoogily, Dragon, Oliver, HexitNiels, Michael G., Pablo A., Leo L., Daniel D., DSKun, Ross, Andre K., Jonathan K., Erik K., Tiebolt v. d. L., Steven, Mathias, Poutouprod, Sam B., Martin C., Manuel F., K8BCO, Samuel D., duckduck, David on Patreon and KoFi 💙


What's Changed

  • chore: extract UI strings to Rails I18n by @Freika in #3292
  • feat: add complete German locale by @Freika in #3294
  • feat: add complete Spanish locale by @Freika in #3303
  • feat: add French locale by @Freika in #3296
  • fix: google play URL by @sylvainmetayer in #3288
  • Adopt Rails 8.1 defaults, resumable backfills, and Turbo morphing by @Freika in #3297
  • Remove Map v1 (Leaflet), migrate remaining maps to MapLibre by @Freika in #3311
  • feat(e2e): seed per-worker demo users for parallel Playwright runs by @Freika in #3313
  • Degrade trip photos when the photo host is unreachable by @Freika in #3319
  • Ignore a fragment pasted into OIDC_ISSUER by @Freika in #3320
  • Keep merged /metrics label sets unique by @Freika in #3322
  • Close a map panel by clicking its own button again by @Freika in #3323
  • fix: repair the sign-up page markup and its translation seams by @Freika in #3326
  • Let a photo search end date cover its whole day by @Freika in #3321
  • Show the stored coordinates when a point is clicked by @Freika in #3325
  • Stop logging an unknown OID for xmax on every point upsert by @Freika in #3324
  • Transportation mode detection rewrite + flattened timeline UX by @Freika in #3302
  • Move Days per Country from the map to Insights by @Freika in #3333
  • Visit detection rewrite: bridged stays, movement reconciliation, honest gaps by @Freika in #3329
  • chore(deps): bump json from 2.20.0 to 2.21.2 in the bundler group across 1 directory by @dependabot[bot] in #3331
  • chore(deps): bump the npm_and_yarn group across 1 directory with 2 updates by @dependabot[bot] in #3332
  • 1.12.0 by @Freika in #3312

New Contributors

Read more

1.11.0

Choose a tag to compare

@Freika Freika released this 02 Aug 20:57
9a89d57

⚠️ Important: ⚠️

This release contains a data migration that recalculates user tracks and data. It will cause bigger resource consumption than usual, but it'll get back to normal once background jobs are done. Just let it work.

Tracks generation and different device detection was greatly improved.

Before:

telegram-cloud-document-2-5440680711612832770

After:

telegram-cloud-document-2-5440680711612832784

Added

  • The onboarding dialog now leads with Start tracking instead of importing, so a new account can get a phone sending points right away. Importing from Google Timeline and the other sources is still one click away in the same dialog.
  • Google Takeout (phone takeout, Semantic Location History) and Polarsteps imports can now also extract visits, named places, tracks and the source app's transportation-mode classification, alongside raw GPS points. Places named by Google Takeout (Home, Work, …) keep their original names. New imports extract automatically; for older ones use Extract additional data in the Imports list. Untick Trust the source app's classification to have Dawarich re-detect modes using your settings. Visits found by Dawarich's own detection are kept alongside the imported ones. Remove extracted data undoes an extraction and leaves your GPS points untouched.

Changed

  • Ordering a printed poster from the Poster Studio is now available to everyone instead of sitting behind a feature flag. To opt out, switch the poster_ordering flag off at /admin/flipper or leave PRINT_ORDER_URL blank. Note that the upgrade turns the flag on once, even on an instance that had already switched it off — switch it off again afterwards and it stays off.
  • GPS noise filtering no longer uses the "Accuracy Threshold" setting, and the slider is gone. A reported accuracy radius is a confidence estimate, not proof a position is wrong: Google Timeline routinely reports 1-4km for points sitting exactly on the road, and dropping those replaced real route geometry with straight lines. Only radii too large to be a position at all are discarded; wrong positions are caught by the speed checks instead. Any saved value now does nothing, and gps_accuracy_threshold is ignored by the settings API rather than rejected.
  • Points within 5km of (0, 0) are treated as broken coordinates everywhere — import, cleanup and noise filtering previously disagreed on what counted as near-zero.
  • Existing points are re-checked against the new noise rules after the upgrade, and tracks, stats and digests are rebuilt from the result. Points hidden by the former accuracy rule come back, and displaced fixes the new checks catch are dropped. The work is spread across accounts, and every per-account pass — including the track rebuild it triggers — runs on the lowest-priority queue, so live tracking and imports keep going ahead of it; accounts with GPS filtering off are skipped. You get a notification when your own re-check is done, and self-hosted instances can also check progress under Background jobs settings.

Fixed

  • The Family plan now works on Dawarich Cloud. Family pages, invitations, members and location sharing were self-hosted only, so subscribers hit errors on every family route. Access now follows the subscription: plan holders can create a family, and everyone they invite gets full family access without a subscription of their own. Users without the plan see the upgrade page instead of an error. If the owner stops paying, members fall back to their own plans once the paid period ends — the family itself is kept, so resubscribing restores it, and pending invitations can no longer be accepted. Self-hosted instances are unchanged.
  • Family members no longer keep Pro access indefinitely after the owner's subscription lapses; they revert to their own plan once the owner's paid period ends. Cancelling still leaves members with access until that period is over.
  • Self-hosted mode is now recognised from common SELF_HOSTED values (quoted "true", TRUE, whitespace-padded, 1, yes, on), not only the exact string true, so a non-canonical value no longer flips an instance into cloud mode and blocks LAN integration URLs (such as Immich) as SSRF. (#2522)
  • Outgoing email no longer fails against slower SMTP servers: connection open/read timeouts now match net-smtp's own 30s and 60s instead of a 5-second cap that failed digest reports with Net::OpenTimeout. Tune with SMTP_OPEN_TIMEOUT/SMTP_READ_TIMEOUT (#3096)
  • FIT files that carry developer data fields (such as those from Wahoo devices) now import their location records instead of failing to parse. (#2945)
  • Google Timeline imports now keep path points in order when several share the same minute-resolution timestamp: tied points are spaced one second apart, while genuine repeats at the same coordinate still collapse into one. Caveat: the synthetic spacing shifts the deduplication key, so delete the affected date range before re-importing the same file. (#3115)
  • Visit detection no longer turns long slow walks into one large suggested visit centered somewhere the user never stopped (#2970).
  • Photon place names no longer show generic "Yes" categories in visits (#3050)
  • Imports that finish with zero saved points now notify you instead of completing silently. GPX and KML files are called out when they lack per-point timestamps. (#3062)
  • Traccar KML exports now import LineString points using the time range in each track name instead of completing with zero points (#3120)
  • "Cancel my account" now works on self-hosted instances. It never sent a password, so the request failed silently with a 401; deletion now asks for confirmation in a dialog and reports failures. Accounts registered through OIDC, which never had a password, can confirm with their email address, on the web and via the API. (#3107)
  • Tracks no longer connect two different devices. Google's Records.json contains every device on the account, and imports made before 1.10.0 stamped them all as one, so a phone left at home was stitched to the one that travelled. Existing imports are repaired automatically by re-reading the uploaded file.
  • Restoring a data archive now recomputes GPS noise flags. The archive carries none, so restored points previously arrived unfiltered and tracks were rebuilt from noise the instance had already learned to ignore.
  • The Map v2 custom basemap field now accepts MapLibre style URLs whose path has no .json suffix, such as https://tiles.openfreemap.org/styles/liberty. A tile URL missing a {z}/{x}/{y} placeholder, or ending in a tile file extension, is still rejected. (#3256)

💙 This release is supported by Steven B., James Manolios, chenrik, aldumil, derpderpington, Chippie, dint, jhalpern, Lex Fradski, Schlufo, cyberswan.at, craftyklaus, Andre, hogenf, naraxius, Embrace, martin4861, Alex, evetters, GregF, Jon Coffee, Lukas, Robbie G, Kilian, Hans G, Chris, tabaha, Andre, Michael C, Chris, Jonah B., Dante, daallex, Tanner A., Milien M., Mathias, Travis S., Matthew F., Johnathan D., bleibdirtroy, no1etal, dixet, Bailey J., Alex D., Benjamin M., Daniel A., Florian, BeeHappy, ChemistryDachshund, OrangeWindies, Michelangelo V., Edward, Erazem Z., Denis Abt, Tony G., Andrew D., Lomky, Osamu Y., Linus T., Christian C., Sebastian, Jan K., Nathan T., Max G., Lars N., Karol B., Konstantin, Johannes H., t3hero, g3lin, Tim, Philipp M., Brand K., Pablo F. M., Jon H., fkB, Mikael, Dániel A., Hai_Tsung, ShooTex, GreenTentacle, PinkahPandah, David, Ken, Denna G., Andre, Hendl91, Jon H., MrRed, Arkadiusz Z., Jake, Bator T., Alex J. H., eps-dev, twiggu, Dragan V., Jerome G., Sheya B., ArnyminerZ, Gustav B., higgs01, Frank F., F. J. Kruz, Jon D., Alexander J. H., Daniel D., Gonzalo M., Ricardo T., Christof Z., Narrator, JohnSmith21, smartbert, A.M., Matthew Z., Dror T., Jonathan K., Kyle C., Mario B., Albin H., Phillip S., Bernd, Tom, Brett J., Nick O., greeting7416, Dick, Brian R., Markus, TheSlimShady, Andrew M., Mason B., Chance, GoogilyBoogily, Dragon, Oliver, HexitNiels, Michael G., Pablo A., Leo L., Daniel D., DSKun, Ross, Andre K., Jonathan K., Erik K., Tiebolt v. d. L., Steven, Mathias, Poutouprod, Sam B., Martin C., Manuel F., K8BCO, Samuel D., on Patreon and KoFi 💙


What's Changed

Read more

1.10.3

Choose a tag to compare

@Freika Freika released this 28 Jul 20:36
da551a0

Added

  • The Map v2 "Edit points" toggle is now remembered between sessions instead of resetting to off on every page load; it still defaults to off, so points stay protected from accidental drags until you opt in. On the Lite plan it stays session-only, since editing points requires Pro. (#3085)

Changed

  • The Docker image no longer ships ImageMagick — nothing in the app used it, so the image gets smaller. (#3139)

Fixed

  • Turning "Edit points" off on Map v2 now reliably disables point dragging. Changing the map style while editing was on left a stale drag handler attached, so points stayed draggable no matter what the toggle said.
  • The Family entry in the navigation bar is now clickable across its entire button area instead of only the label text. (#3100)
  • The Dawarich app and Sidekiq containers now restart automatically after a graceful (exit 0) shutdown instead of staying down, so a stray SIGHUP no longer takes an instance offline until manual intervention (#3099).
  • Nightly place- and area-visit calculation no longer fails when an instance contains legacy points without timestamps.
  • Import rows on the Imports page now update their status live as an import processes, instead of staying on "Processing" until the page is manually reloaded. (#3174)
  • Public live-share links now update in real time for signed-in visitors, instead of only refreshing the location on a full page reload. (#3111)
  • Reverse geocoding and place-name provider outages no longer flood error reporting with handled timeouts, dropped TLS connections, refused connections, unresolvable hostnames, or invalid provider responses. A misconfigured or rate-limited provider — a bad API key, for example — is still reported.
  • The place search box behind visit naming and the Map v2 place picker gets the same treatment: a query the geocoder rejects, or a provider that is briefly unreachable, is logged and returns no matches instead of raising an application error. Self-hosted logs now name the failing error class, and a misconfigured or rate-limited provider is still reported.
  • Place visit detection no longer fails when an unused suggested place is deleted while the nightly calculation is running.
  • Clicking "Continue reverse geocoding" again now re-processes points that were left ungeocoded by a previous run, instead of skipping them for up to a day. (#3071)
  • Public share links now expire at the start of the selected date in the owner's timezone instead of remaining active through that day (#3112).
  • The share link form now spells out that a link stays active only through the day before the selected expiry date.

💙 This release is supported by Steven B., James Manolios, chenrik, aldumil, derpderpington, Chippie, dint, jhalpern, Lex Fradski, Schlufo, cyberswan.at, craftyklaus, Andre, hogenf, naraxius, Embrace, martin4861, Alex, evetters, GregF, Jon Coffee, Lukas, Robbie G, Kilian, Hans G, Chris, tabaha, Andre, Michael C, Chris, Jonah B., Dante, daallex, Tanner A., Milien M., Mathias, Travis S., Matthew F., Johnathan D., bleibdirtroy, no1etal, dixet, Bailey J., Alex D., Benjamin M., Daniel A., Florian, BeeHappy, ChemistryDachshund, OrangeWindies, Michelangelo V., Edward, Erazem Z., Denis Abt, Tony G., Andrew D., Lomky, Osamu Y., Linus T., Christian C., Sebastian, Jan K., Nathan T., Max G., Lars N., Karol B., Konstantin, Johannes H., t3hero, g3lin, Tim, Philipp M., Brand K., Pablo F. M., Jon H., fkB, Mikael, Dániel A., Hai_Tsung, ShooTex, GreenTentacle, PinkahPandah, David, Ken, Denna G., Andre, Hendl91, Jon H., MrRed, Arkadiusz Z., Jake, Bator T., Alex J. H., eps-dev, twiggu, Dragan V., Jerome G., Sheya B., ArnyminerZ, Gustav B., higgs01, Frank F., F. J. Kruz, Jon D., Alexander J. H., Daniel D., Gonzalo M., Ricardo T., Christof Z., Narrator, JohnSmith21, smartbert, A.M., Matthew Z., Dror T., Jonathan K., Kyle C., Mario B., Albin H., Phillip S., Bernd, Tom, Brett J., Nick O., greeting7416, Dick, Brian R., Markus, TheSlimShady, Andrew M., Mason B., Chance, GoogilyBoogily, Dragon, Oliver, HexitNiels, Michael G., Pablo A., Leo L., Daniel D., DSKun, Ross, Andre K., Jonathan K., Erik K., Tiebolt v. d. L., Steven, Mathias, Poutouprod, Sam B., Martin C., Manuel F., on Patreon and KoFi 💙


What's Changed

  • Restart app and sidekiq containers after a graceful exit by @Freika in #3220
  • Ignore null timestamps during place visit calculation by @Freika in #3194
  • Broadcast import status updates from background jobs by @Freika in #3215
  • build: drop ImageMagick from the Docker image by @Freika in #3139
  • Fix "Family" button in Navbar being only partially clickable. by @0LGuenth in #3100
  • Deliver live share updates to signed-in visitors by @Freika in #3214
  • Handle invalid place search provider responses by @Freika in #3226
  • Prevent place visit creation after concurrent place deletion by @Freika in #3191
  • Re-enqueue ungeocoded points on a repeated Continue run by @Freika in #3225
  • Expire shared links on the selected date by @Freika in #3190
  • feat: add option to disable point dragging by @DawidPietrykowski in #3085
  • 1.10.3 by @Freika in #3252

New Contributors

Full Changelog: 1.10.2...1.10.3

1.10.2

Choose a tag to compare

@Freika Freika released this 27 Jul 20:19
61d5136

Added

  • Poster Studio has a track width control: a 50–300% slider beside track opacity that scales the route line on the saved poster.
  • The Map v2 custom basemap field now accepts raster XYZ tiles (.png/.jpg/.jpeg/.webp) and full MapLibre style URLs ending in .json, in addition to Protomaps-schema vector tiles. Previously a raster URL rendered as a blank grey map and a style URL was rejected. (#3146)

Fixed

  • Saving a zoomed-out Poster Studio view to the gallery no longer rejects routes that are visibly inside the poster frame (#3204). The area check now uses the same Mercator framing as the renderer and wraps across the antimeridian, so high-latitude and Pacific-centred posters are judged against the frame you actually see. Poster Studio also warns when a view is too wide for the largest poster area instead of silently zooming the saved poster in.
  • Instances with heavy write traffic no longer crash-loop on the 1.10.1 upgrade. Dropping the legacy points.latitude/points.longitude columns needs an exclusive lock that busy instances could not win in one attempt, which aborted the migration and restarted the container in a loop. The drop is now retried, and if it still cannot get the lock it is handed to a background job so startup completes. If that job cannot get the lock either, the columns stay and the log prints the statement to run by hand — they are unused, so nothing breaks in the meantime (#3176)
  • Trial lifecycle email jobs left over from older releases are now discarded instead of retrying forever in the background queue. Mail addressed to a record that has since been deleted is also discarded rather than retried.
  • Reverse geocoding and place-name provider outages no longer flood error reporting with handled timeouts, dropped TLS connections, or invalid provider responses. A misconfigured or rate-limited provider — a bad API key, for example — is still reported.
  • Reverse geocoding retries point updates that time out while waiting on concurrent writes.
  • Google Semantic History and phone Timeline imports now tag points with a per-import tracker id instead of one shared constant, so tracks from different devices are no longer braided together. A one-time backfill rewrites existing points and regenerates affected tracks per user.
  • Place names you set yourself are no longer overwritten by nightly reverse geocoding. Renaming a place, creating one by hand, or picking one on the timeline locks its name; renaming it back to "Suggested place" hands it back to auto-naming. Map v2 and the place drawer show when a name is locked. A one-time backfill locks names that were customised before this release (#3086, #3175)
  • Real-time visit detection no longer stops after the first run for users who track continuously — the debounce key is now released when the job runs.
  • The nightly visit suggestion job no longer scans forward to the end of the calendar year; it processes only the day it was asked for.
  • Merged visits now report the correct duration, centre, radius and suggested name instead of keeping the values of the first cluster in the merge.
  • Visit suggestion failures no longer show a raw stack trace in your notifications, and repeated failures within an hour no longer create a notification each time (#3091)
  • Points at exactly (0,0) — a common GPS glitch — are no longer accepted from any ingestion path (API, OwnTracks, Overland, Traccar, file imports) and no longer produce suggested visits at "Null Island". Existing (0,0) points are flagged as anomalies by a one-time cleanup that also removes visits placed at (0,0), tolerates legacy points without timestamps, and recalculates affected stats and tracks.
  • Point uploads from all ingestion paths (REST API, OwnTracks, Overland, Traccar) now retry transient statement and lock-wait timeouts, not just deadlocks, instead of failing the upload.
  • The DNS caching layer no longer crashes with a misleading NoMethodError when the SMTP server is not configured in the background worker, so email delivery surfaces the real configuration error instead. (#3038)

💙 This release is supported by Steven B., James Manolios, chenrik, aldumil, derpderpington, Chippie, dint, jhalpern, Lex Fradski, Schlufo, cyberswan.at, craftyklaus, Andre, hogenf, naraxius, Embrace, martin4861, Alex, evetters, GregF, Jon Coffee, Lukas, Robbie G, Kilian, Hans G, Chris, tabaha, Andre, Michael C, Chris, Jonah B., Dante, daallex, Tanner A., Milien M., Mathias, Travis S., Matthew F., Johnathan D., bleibdirtroy, no1etal, dixet, Bailey J., Alex D., Benjamin M., Daniel A., Florian, BeeHappy, ChemistryDachshund, OrangeWindies, Michelangelo V., Edward, Erazem Z., Denis Abt, Tony G., Andrew D., Lomky, Osamu Y., Linus T., Christian C., Sebastian, Jan K., Nathan T., Max G., Lars N., Karol B., Konstantin, Johannes H., t3hero, g3lin, Tim, Philipp M., Brand K., Pablo F. M., Jon H., fkB, Mikael, Dániel A., Hai_Tsung, ShooTex, GreenTentacle, PinkahPandah, David, Ken, Denna G., Andre, Hendl91, Jon H., MrRed, Arkadiusz Z., Jake, Bator T., Alex J. H., eps-dev, twiggu, Dragan V., Jerome G., Sheya B., ArnyminerZ, Gustav B., higgs01, Frank F., F. J. Kruz, Jon D., Alexander J. H., Daniel D., Gonzalo M., Ricardo T., Christof Z., Narrator, JohnSmith21, smartbert, A.M., Matthew Z., Dror T., Jonathan K., Kyle C., Mario B., Albin H., Phillip S., Bernd, Tom, Brett J., Nick O., greeting7416, Dick, Brian R., Markus, TheSlimShady, Andrew M., Mason B., Chance, GoogilyBoogily, Dragon, Oliver, HexitNiels, Michael G., Pablo A., Leo L., Daniel D., DSKun, Ross, Andre K., Jonathan K., Erik K., Tiebolt v. d. L., Steven, Mathias, Poutouprod, Sam B., Lucio S., Martin C. on Patreon and KoFi 💙


What's Changed

  • Retry point write contention across all ingestion paths by @Freika in #3189
  • Tolerate null timestamps in the Null Island cleanup by @Freika in #3197
  • Retry reverse geocoding point write timeouts by @Freika in #3186
  • fix: quiet handled geocoder provider errors by @Freika in #3183
  • Prevent reverse-geocoding place deadlocks by @Freika in #3193
  • Fix legacy trial email retries by @Freika in #3180
  • Fix NoMethodError from the DNS cache when the resolver gets a nil name by @SAY-5 in #3205
  • Add a Poster Studio track width control by @Freika in #3238
  • Make visit suggestion consistent and predictable by @Freika in #3237
  • Stop the legacy lat/lon column drop from crash-looping startup by @Freika in #3198
  • fix: judge poster saves against the rendered frame (+ track width control) by @Freika in #3230
  • Add custom raster and style basemap URLs by @Freika in #3231
  • 1.10.2 by @Freika in #3199

New Contributors

Full Changelog: 1.10.1...1.10.2

1.10.1

Choose a tag to compare

@Freika Freika released this 19 Jul 19:07
5ea231d

Added

  • Google Photos Takeout metadata sidecars can now add geotagged photos as sparse timeline points; sidecars without usable coordinates are skipped.
  • The Poster Studio can now be opened directly from a trip's page, pre-loaded with the trip's route, date range, and name.
  • Dawarich can now be installed to the phone home screen as a web app (PWA): all pages link the web app manifest and Apple touch icon, and the installed app opens straight into Map v2.

Changed

  • The legacy latitude/longitude columns on points are dropped — the PostGIS lonlat column has been the single source of truth since 0.25.0. The migration copies any remaining legacy-only coordinates into lonlat before dropping, so upgrades from older versions are safe.
  • File imports no longer store a copy of each source record in the point's raw_data — the uploaded file stays attached to the import as the source of truth. API responses return raw_data: {} for newly imported points, and FIT/TCX health fields (heart rate, cadence, power, temperature) as well as Google phone takeout HOME/WORK place labels are no longer stored.
  • TCX and FIT imports now store their activity type in motion_data: transportation-mode detection works for TCX imports for the first time, and FIT driving activities are classified correctly.
  • Google phone takeout imports now store the mapped activity type in motion_data, so transportation-mode detection (driving, walking, cycling, bus, train, flying) works for activity segments from phone takeout files.

Fixed

  • Deleting a single point from the map now recalculates your monthly distance and statistics, instead of leaving them counting the deleted point.
  • Large GeoJSON imports now stream features in bounded batches instead of loading the entire file into memory, preventing worker memory exhaustion on exports with hundreds of thousands of points.
  • Google phone Timeline imports now stream semantic segments and raw signals in bounded batches instead of loading the entire export into memory, preventing worker memory exhaustion on large Timeline files.
  • FIT activities without a device_info section now import their location records instead of failing strict FIT validation.
  • GPX imports now preserve XML byte-order marks, allowing files whose BOM correctly identifies the encoding despite an incorrect XML declaration to import successfully.
  • ZIP imports now accept large activity exports containing up to 25,000 files, while retaining file-count and expanded-size safety checks.
  • OwnTracks _type: waypoint sync messages are no longer stored as location points, so syncing your saved OwnTracks places no longer creates phantom distance/track spikes (#3137)
  • Map v2 date pickers now keep the time component when a range with a specific time is loaded from the URL, instead of resetting to the start/end of the day (#3106)
  • Track generation and user data recalculations now retry a bounded number of times when another job is already processing the same user's tracks, instead of dropping the request and reporting an error; a genuinely stuck lock is logged after the retries are exhausted. The per-user lock also renews itself while a job runs and frees within a minute if a worker dies, so a crashed job no longer blocks a user's track processing for up to half an hour.
  • Dawarich added to an iOS Home Screen now opens Map v2 instead of an unrelated previously visited page (#3097)
  • Point uploads (REST API, OwnTracks, Overland, Traccar) now write batches in a consistent order so concurrent uploads no longer deadlock each other, and both uploads and anomaly filtering recover automatically from any remaining transient database deadlocks instead of failing the upload or background job.
  • The app and Sidekiq containers no longer crash-loop on startup when WEB_CONCURRENCY or BACKGROUND_PROCESSING_CONCURRENCY reach the container as an unexpanded ${VAR:-default} string (seen with some podman-compose versions); the entrypoint now warns and falls back to the default value (#3124)
  • Cache preheating no longer times out for accounts with large location histories.
  • Cloud: Changing plans resets the Lite archival-warning state, so a user downgraded to Lite again is notified about archived data again.
  • TCX and KML imports no longer fail when text fields contain raw ampersands.
  • The Map v2 "Share" button no longer renders its label below the button bounds on narrow layouts (#3007)
  • Outgoing email now works with local unauthenticated SMTP relays: set SMTP_AUTHENTICATION=none (also off/false/disabled) to disable SMTP AUTH instead of hitting "SMTP-AUTH requested but missing user name" (#3147, #2690, #1469, #1463)
  • Deleting a place from the Places list no longer jumps back to the first page — you stay on the page you were viewing (#3145)
  • Map v2 now applies the existing simplified point-rendering mode, so dense point streams are thinned on the map when that setting is selected. Only the points layer is thinned — heatmap, fog of war, scratch map, and routes are still built from the full point set (#946).
  • Statistics pages no longer fail to load when older monthly data contains malformed country or city entries. Recalculating stats for an affected month repairs the stored data.
  • Google Semantic History and phone Timeline imports now tag points with a per-import tracker id instead of one shared constant, so tracks from different devices are no longer braided together. A one-time backfill rewrites existing points and regenerates affected tracks per user.
  • Points at exactly (0,0) — a common GPS glitch — are no longer accepted from any ingestion path (API, OwnTracks, Overland, Traccar, file imports) and no longer produce suggested visits at "Null Island". Existing (0,0) points are flagged as anomalies by a one-time cleanup that also removes visits placed at (0,0) and recalculates affected stats and tracks.

💙 This release is supported by Steven B., James Manolios, chenrik, aldumil, derpderpington, Chippie, dint, jhalpern, Lex Fradski, Schlufo, cyberswan.at, craftyklaus, Andre, hogenf, naraxius, Embrace, martin4861, Alex, evetters, GregF, Jon Coffee, Lukas, Robbie G, Kilian, Hans G, Chris, tabaha, Andre, Michael C, Chris, Jonah B., Dante, daallex, Tanner A., Milien M., Mathias, Travis S., Matthew F., Johnathan D., bleibdirtroy, no1etal, dixet, Bailey J., Alex D., Benjamin M., Daniel A., Florian, BeeHappy, ChemistryDachshund, OrangeWindies, Michelangelo V., Edward, Erazem Z., Denis Abt, Tony G., Andrew D., Lomky, Osamu Y., Linus T., Christian C., Sebastian, Jan K., Nathan T., Max G., Lars N., Karol B., Konstantin, Johannes H., t3hero, g3lin, Tim, Philipp M., Brand K., Pablo F. M., Jon H., fkB, Mikael, Dániel A., Hai_Tsung, ShooTex, GreenTentacle, PinkahPandah, David, Ken, Denna G., Andre, Hendl91, Jon H., MrRed, Arkadiusz Z., Jake, Bator T., Alex J. H., eps-dev, twiggu, Dragan V., Jerome G., Sheya B., ArnyminerZ, Gustav B., higgs01, Frank F., F. J. Kruz, Jon D., Alexander J. H., Daniel D., Gonzalo M., Ricardo T., Christof Z., Narrator, JohnSmith21, smartbert, A.M., Matthew Z., Dror T., Jonathan K., Kyle C., Mario B., Albin H., Phillip S., Bernd, Tom, Brett J., Nick O., greeting7416, Dick, Brian R., Henning, Markus, TheSlimShady, Andrew M., Mason B., Chance, GoogilyBoogily, Dragon, Oliver, HexitNiels, Michael G., Pablo A., Leo L., Daniel D., DSKun, Ross, Andre K., Jonathan K., Erik K., Tiebolt v. d. L., Steven, Mathias, Poutouprod, Sam B. on Patreon and KoFi 💙


What's Changed

  • Drop legacy points.latitude / points.longitude columns by @Freika in #2771
  • Stop persisting point raw_data for file-based imports by @Freika in #3123
  • 1.10.1 by @Freika in #3118
  • Add Dawarich/PointsLatLonAccess cop; fix 4 legacy lat/lon readers by @Freika in #2770
  • Detect transportation mode for Google phone takeout activity segments by @Freika in #3125
  • Guard entrypoints against unexpanded concurrency env vars by @Freika in #3127
  • fix: walk downgraded users through archival warnings gradually by @Freika in #3128
  • Prevent cache preheating timeouts on large histories by @Freika in #3136
  • Fix the red test suite: broken photo imports, factory flake, spec brittleness by @Freika in #3142
  • Handle raw ampersands in TCX and KML imports by @Freika in #3140
  • Retry transient point-ingest deadlocks by @Freika in #3149
  • Honor the existing simplified point-rendering mode in Map v2 by @Freika in #3134
  • feat: make the web app installable (PWA) by @Freika in #3141
  • Retry parallel track generation after lock contention by @Freika in #3151
  • Handle malformed toponym data on stats pages by @Freika in #3135
  • fix: keep pagination page when deleting a place by @Freika in #3152
  • fix: support unauthenticated SMTP relays via SMTP_AUTHENTICATION=none by @Freika in #3153
  • fix: keep Map v2 Share button label inside its bounds by @Freika in #3154
  • fix: keep Map v2 date-picker time component on URL hydration by @Freika in #3156
  • fix: ignore OwnTracks waypoint payloads on the live ingest path by @Freika in #3155
  • Strip UTF-8 BOM before detecting G...
Read more

1.10.0

Choose a tag to compare

@Freika Freika released this 15 Jul 08:28
ccaf280

⚠️ Important: ⚠️ there are some changes to defaults in the docker-compose.yml for self-hosted users. You may want to adjust environment variables to reduce memory usage or increase concurrency. See the "Changed" section below.

изображение

Added

  • Poster Studio: design a printable poster of your travels in a full-screen studio opened from Map v2, with live preview, theme and layout presets, text controls, and PNG/PDF export. Posters can be saved to a server-rendered gallery or — in the future releases — ordered as a print via Stripe. Self-hosters: the Docker image grows by ~100 MB for the server-side renderer, and gallery rendering is unavailable on 32-bit ARM (armv7) hosts.
  • New API endpoints GET/POST/DELETE /api/v1/demo_data to check, load and remove demo data, enabling demo-data onboarding in the mobile app.
  • New API endpoints GET/PATCH /api/v1/settings/mobile for syncing mobile app settings between devices (most recent write wins). The existing settings API now also accepts maps.distance_unit and merges the maps hash instead of replacing it, so partial updates no longer wipe other map settings.
  • Map v2 now reopens at your last viewport instead of the zoomed-out globe when the selected date range has no data to fit.
  • Custom map colors: pick from theme presets or edit individual color tokens for the map, and a reorganized, collapsible Settings tab to manage them.
  • The classic map (v1) now shows a dismissible banner announcing its retirement in August 2026, plus — when your family shares location — a second banner noting that family location history is only visible on Map v2. Dismissals are remembered per browser.

Changed

  • The default self-hosted stack now idles about 20% lighter (app container 452 → 325 MB, whole stack 843 → 690 MB): docker-compose.yml defaults to one Puma worker (WEB_CONCURRENCY=1) and 3 background job threads (BACKGROUND_PROCESSING_CONCURRENCY=3) — raise either env var for busier instances — and jemalloc now returns freed memory to the OS promptly. Installations that already set these variables are unaffected (#3119).
  • Deleting a point on Map v2 now removes it instantly and restores it if the delete request fails.
  • During replay, photos now stack up as a tilted, Polaroid-style pile in the top-left corner as the playhead reaches them (newest on top, up to five shown); click a photo to open it. The pile stays in sync as you play, scrub, or rewind, and works on map, trip, and public shared-trip replays.
  • Toggling the photos layer during a running replay now adds or removes its photos live (corner pile and map markers) — previously photos only appeared if the layer was enabled before starting the replay.
  • Replay panel: a new recenter & follow button. The camera follows the moving marker during playback; dragging the map turns following off, and the button re-centers and resumes it.
  • The replay panel no longer shows the per-day point count.
  • GET /api/v1/points is significantly faster over large date ranges: slim responses are built from a single SQL query (~5× faster, byte-identical output), the bounding-box filter runs as a single PostGIS predicate, and repeat requests answer 304 Not Modified via ETags. Map v2 and the monthly stats map both use this path (#3026).
  • Public shared-trip pages now query Immich/Photoprism once per view instead of twice: the photo search result is briefly cached and reused.

Fixed

  • Family location history now actually shows up on Map v2: the history endpoint read coordinates from the legacy latitude/longitude columns, which are empty on instances that only store the PostGIS lonlat value, so nothing was drawn. Coordinates are now derived from lonlat (#2977)
  • Declining the "Move the visit here?" prompt when picking a distant place for a Map v2 visit no longer renames the visit to that place.
  • Place visit detection no longer leaves an empty duplicate visit behind when a new point bridges two previously separate visits at the same place — they are now merged into one. The nightly re-scan also leaves confirmed visits untouched, so a new nearby point can no longer pull points out of a visit you already confirmed.
  • Re-evaluating anomalous points now refreshes the map immediately instead of occasionally serving a cached copy of the points until the next change.
  • Raw data archival: reading archived raw_data back works again (it silently returned nothing before), archive chunks are labeled with the points' actual month, archives are verified at write time, and the previously broken points:raw_data:archive/archive_full rake tasks work again.
  • Raw data archival, continued: re-importing a duplicate point with different raw_data now detaches it from its stale archive so the newer data can't be cleared away, and clearing archived data now waits out a 7-day cooling window. Restores are reported under the restored metric label instead of removed — update dashboards reading points_total{operation="removed"} accordingly.
  • User data exports now include archived raw_data as plain gzip files, so an export can be imported on a different instance (previously the archives were encrypted with the exporting instance's key and unreadable elsewhere).
  • Creating, updating, or deleting a user in Settings no longer shows a blank "HTTP ERROR 422" page when validation fails — the admin is redirected back with a message explaining what went wrong (e.g. password too short) (#3051)
  • Email delivery no longer times out with providers that use implicit TLS (SMTP port 465, e.g. many hosted mail services): set SMTP_SSL=true to enable it, and it is enabled automatically when SMTP_PORT=465. STARTTLS remains the default for all other ports (#3068)
  • Points on Map v2 can no longer be moved by accident: dragging a point now requires enabling the new "Edit points" toggle in the layers panel. The toggle resets on every page load, so points stay put unless you deliberately turn editing on (#3060)
  • The family "Location history" toggle is clearer: the settings page now explains it is distinct from live location, powers the recent-track view on Map v2, and only shares points recorded after enabling it. The default history window grew from 24 hours to 7 days, so newly-shared members show a useful track.
  • Place-based visit suggestions now work for users whose distance unit is kilometres — an integer-rounding bug set the detection radius to zero. Self-hosters on kilometres: the first nightly run after upgrading processes your whole history at once; on large databases raise PLACE_VISITS_THROTTLE_SECONDS beforehand to make it gentler (#2963)
  • The nightly place-visit job now only processes points that don't yet belong to a visit and pauses briefly between places, so it no longer saturates the database and delays incoming location uploads. The pause is tunable via PLACE_VISITS_THROTTLE_SECONDS (default 0.1) (#2963)
  • Opening "View on map" for an import on Map v2 now shows only that import's points, instead of every point within the import's date range (#2734)
  • Place and area visit detection no longer silently finds zero visits for users whose distance unit is kilometers (the search radius was being truncated to 0 by integer division) (#3031).
  • Points added retroactively through the API or trackers (with timestamps in the past) now get their routes generated, instead of only connecting after a manual data recalculation (#3036).
  • Photoprism photo imports no longer fail with an HTTP 400: the after/before filters are now sent as plain YYYY-MM-DD dates, as recent Photoprism requires (it rejects the full timestamps shipped in 1.9.2). Results are still bounded in-app by the exact end timestamp, and a blank start date no longer breaks the import (#3034).

💙 This release is supported by Steven B., James Manolios, chenrik, aldumil, derpderpington, Chippie, dint, jhalpern, Lex Fradski, Schlufo, cyberswan.at, craftyklaus, Andre, hogenf, naraxius, Embrace, martin4861, Alex, evetters, GregF, Jon Coffee, Lukas, Robbie G, Kilian, Hans G, Chris, tabaha, Andre, Michael C, Chris, Jonah B., Dante, daallex, Tanner A., Milien M., Mathias, Travis S., Matthew F., Johnathan D., bleibdirtroy, no1etal, dixet, Bailey J., Alex D., Benjamin M., Daniel A., Florian, BeeHappy, ChemistryDachshund, OrangeWindies, Michelangelo V., Edward, Erazem Z., Denis Abt, Tony G., Andrew D., Lomky, Osamu Y., Linus T., Christian C., Sebastian, Jan K., Nathan T., Max G., Lars N., Karol B., Konstantin, Johannes H., t3hero, g3lin, Tim, Philipp M., Brand K., Pablo F. M., Jon H., fkB, Mikael, Dániel A., Hai_Tsung, ShooTex, GreenTentacle, PinkahPandah, David, Ken, Denna G., Andre, Hendl91, Jon H., MrRed, Arkadiusz Z., Jake, Bator T., Alex J. H., eps-dev, twiggu, Dragan V., Jerome G., Sheya B., ArnyminerZ, Gustav B., higgs01, Frank F., F. J. Kruz, Jon D., Alexander J. H., Daniel D., Gonzalo M., Ricardo T., Christof Z., Narrator, JohnSmith21, smartbert, A.M., Matthew Z., Dror T., Jonathan K., Kyle C., Mario B., Albin H., Phillip S., Bernd, Tom, Brett J., Nick O., greeting7416, Dick, Brian R., Henning, Markus, TheSlimShady, Andrew M., Mason B., Chance, GoogilyBoogily, Dragon, Oliver, HexitNiels, Michael G., Pablo A., Leo L., Daniel D., DSKun, Ross, Andre K., Jonathan K., Erik K., on Patreon and KoFi 💙


What's Changed

  • perf(points): faster /points index — slim pluck, exact ST_Intersects bbox, conditional-GET caching by @Freika in #3026
  • Bump shoulda-matchers from 7.0.1 to 8.0.1 by @dependabot[bot] in #2994
  • Bump actions/checkout from 4 to 7 by @dependabot[bot] in #2992
  • Bump gitleaks/gitleaks-ac...
Read more