PageSourceSearch

https://dawarich.app/assets/js/7b91cd3e.3567f796.js

js dawarich.app collected 2026-10-03 22:14:25 UTC 16,198 bytes, 1 lines download raw bytes

1"use strict";(globalThis.webpackChunkdawarich_app=globalThis.webpackChunkdawarich_app||[]).push([[4631],{47992(e,i,a){a.r(i),a.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>n,toc:()=>h});var n=a(99213),t=a(74848),s=a(28453);const o={slug:"dawarich-1-9-1",title:"Dawarich 1.9.1: flights, public sharing, redesigned trips, and more",authors:"evgenii",tags:["release","montly-update"]},r=void 0,l={authorsImageUrls:[void 0]},h=[{value:"In-app changelogs with Chibichange",id:"in-app-changelogs-with-chibichange",level:2},{value:"Flight history on the map",id:"flight-history-on-the-map",level:2},{value:"Trips got a full redesign",id:"trips-got-a-full-redesign",level:2},{value:"Public sharing",id:"public-sharing",level:2},{value:"Better visit detection",id:"better-visit-detection",level:2},{value:"More map and import improvements",id:"more-map-and-import-improvements",level:2},{value:"Map V1 is going away",id:"map-v1-is-going-away",level:2},{value:"Posters are coming",id:"posters-are-coming",level:2},{value:"Mobile app updates",id:"mobile-app-updates",level:2},{value:"Links",id:"links",level:2},{value:"One more thing: Atlas",id:"one-more-thing-atlas",level:2},{value:"Come say hi in Berlin",id:"come-say-hi-in-berlin",level:2}];function d(e){const i={a:"a",br:"br",code:"code",h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.p,{children:"Hey, it's been a minute."}),"\n",(0,t.jsx)(i.p,{children:"Dawarich is still your favorite FOSS, self-hostable alternative to Google Timeline. Since the last update, a lot has shipped: better maps, public sharing, flight history, a redesigned trip experience, mobile app updates, safer imports, and a small detour into changelogs, roadmaps, and posters."}),"\n",(0,t.jsxs)(i.p,{children:["GitHub: ",(0,t.jsx)(i.a,{href:"https://github.com/Freika/dawarich",children:"github.com/Freika/dawarich"}),(0,t.jsx)(i.br,{}),"\n","Website: ",(0,t.jsx)(i.a,{href:"https://dawarich.app/",children:"dawarich.app"})]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Dawarich 1.9.1 map preview",src:a(76848).A+"",width:"1800",height:"2400"})}),"\n",(0,t.jsx)(i.h2,{id:"in-app-changelogs-with-chibichange",children:"In-app changelogs with Chibichange"}),"\n",(0,t.jsx)(i.p,{children:"Before we get to the bigger Dawarich features, let's talk about release notes."}),"\n",(0,t.jsxs)(i.p,{children:["Dawarich 1.8.0 introduced a new way to see updates inside your instance. It uses my new app, ",(0,t.jsx)(i.a,{href:"https://chibichange.com",children:"Chibichange"}),", to show changelogs directly in the navbar."]}),"\n",(0,t.jsxs)(i.p,{children:["The short version: Dawarich now ships with a Chibichange widget. If you consent, it pings ",(0,t.jsx)(i.code,{children:"chibichange.com"})," to check whether there is a newer Dawarich release. When there is, you will see a green pulsing dot in the navbar. Click it and you get the changelog for everything that changed since your current version."]}),"\n",(0,t.jsx)(i.p,{children:'This is opt-in. If you click "No thanks", Dawarich will not make external requests to Chibichange. You will still get the old GitHub release indicator, but not the in-app changelog.'}),"\n",(0,t.jsxs)(i.p,{children:["I built Chibichange because I wanted a better way to deliver release notes to Dawarich users. Soon it should also support feature suggestions, voting, and feedback. Suggested features we decide to build will go into the public roadmap. Speaking of which, Dawarich now has a roadmap: ",(0,t.jsx)(i.a,{href:"https://dawarich.app/roadmap/",children:"dawarich.app/roadmap"}),"."]}),"\n",(0,t.jsx)(i.p,{children:"Chibichange will be open-sourced this summer. The model will be the same as Dawarich: FOSS, self-hostable, with an optional hosted service for people who do not want to run it themselves. It is a niche tool, but I think it can be useful for anyone building self-hostable software and trying to keep users informed without turning the app into a telemetry machine."}),"\n",(0,t.jsx)(i.h2,{id:"flight-history-on-the-map",children:"Flight history on the map"}),"\n",(0,t.jsx)(i.p,{children:"The big one: Dawarich can now draw your flights on the map."}),"\n",(0,t.jsxs)(i.p,{children:["If you self-host ",(0,t.jsx)(i.a,{href:"https://github.com/jonathongardner/AirTrail",children:"AirTrail"}),', Dawarich can pull your flight history and render it as arcs on Map V2. Set it up on the Integrations page, click "Sync now", and Dawarich will keep it synced daily.']}),"\n",(0,t.jsx)(i.p,{children:"Finally, your map knows you did not teleport across the ocean."}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Dawarich flight arcs on the map",src:a(38071).A+"",width:"1800",height:"1012"})}),"\n",(0,t.jsx)(i.p,{children:"There will be more for flights in future releases."}),"\n",(0,t.jsx)(i.h2,{id:"trips-got-a-full-redesign",children:"Trips got a full redesign"}),"\n",(0,t.jsx)(i.p,{children:"Trips are now built on MapLibre V2."}),"\n",(0,t.jsx)(i.p,{children:"The new trip page has a sticky map on the left and a scrollable day-by-day accordion on the right. Each day can show its own distance, time range, route color, photo overlay, and replay controls. You can scrub through a trip and watch it play back on the map."}),"\n",(0,t.jsx)(i.p,{children:"You can also add a short note to any individual day of a trip now."}),"\n",(0,t.jsx)(i.p,{children:"I'm really happy with how this one came out."}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Redesigned Dawarich trips page",src:a(35689).A+"",width:"1800",height:"1012"})}),"\n",(0,t.jsx)(i.h2,{id:"public-sharing",children:"Public sharing"}),"\n",(0,t.jsx)(i.p,{children:"Public sharing is a new thing in Dawarich."}),"\n",(0,t.jsx)(i.p,{children:"You can now share trips, tracks, live location, and selected time ranges through public links. Links can be phrase-protected, and 
1you can choose exactly what the public page exposes: route, stats, countries, day-by-day details, notes, photos, and so on."}),"\n",(0,t.jsx)(i.p,{children:"Public trip pages look close to the in-app trip pages, but they are designed for sharing with someone who does not have access to your Dawarich instance."}),"\n",(0,t.jsxs)(i.p,{children:["Here is a public example from my Norway road trip: ",(0,t.jsx)(i.a,{href:"https://my.dawarich.app/s/07024d88-0c43-4554-ad89-d7f2916b7d57",children:"my.dawarich.app/s/07024d88-0c43-4554-ad89-d7f2916b7d57"})]}),"\n",(0,t.jsx)(i.h2,{id:"better-visit-detection",children:"Better visit detection"}),"\n",(0,t.jsx)(i.p,{children:"Visit detection got rewritten."}),"\n",(0,t.jsx)(i.p,{children:"There is a new opt-in stay-point detector. It is non-ML, single-pass, and gives each suggested visit a confidence score from 0 to 100."}),"\n",(0,t.jsx)(i.p,{children:"It fixes two of the old algorithm's biggest annoyances:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"missing slow stays"}),"\n",(0,t.jsx)(i.li,{children:"splitting one visit into two when your phone battery died for a bit"}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"The new detector is behind a flag while I collect feedback, but the plan is to make it the default soon."}),"\n",(0,t.jsx)(i.p,{children:"You can also label a visit by searching for the real place name directly from the Timeline."}),"\n",(0,t.jsx)(i.h2,{id:"more-map-and-import-improvements",children:"More map and import improvements"}),"\n",(0,t.jsx)(i.p,{children:"A lot of smaller pieces landed too:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Multi-device tracks no longer get mangled. If you track from a phone, watch, and GPS unit, each device keeps its own track instead of turning into one zigzagging mess."}),"\n",(0,t.jsx)(i.li,{children:"Fog of War can now reveal per hexagon, not just per point."}),"\n",(0,t.jsx)(i.li,{children:"Globe view is now on by default."}),"\n",(0,t.jsx)(i.li,{children:"GPX imports now stream instead of loading the whole file into memory, which should help with huge exports."}),"\n",(0,t.jsx)(i.li,{children:"Garmin FIT files are now supported."}),"\n",(0,t.jsxs)(i.li,{children:["Google's ",(0,t.jsx)(i.code,{children:"Timeline Edits.json"})," Takeout file is now recognized."]}),"\n",(0,t.jsx)(i.li,{children:"The official Traccar client is now supported directly."}),"\n",(0,t.jsx)(i.li,{children:"Immich photo timestamps that could be off by up to 24 hours are fixed."}),"\n",(0,t.jsx)(i.li,{children:"Monthly stats now bucket data by your local timezone."}),"\n",(0,t.jsx)(i.li,{children:"A pile of timezone and DST crashes are gone."}),"\n",(0,t.jsxs)(i.li,{children:["Containers can now run as a custom user through ",(0,t.jsx)(i.code,{children:"PUID"})," and ",(0,t.jsx)(i.code,{children:"PGID"}),"."]}),"\n",(0,t.jsx)(i.li,{children:"OIDC got fixes for trailing slashes and PKCE."}),"\n",(0,t.jsx)(i.li,{children:"2FA now has a lockout to help keep accounts safer."}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"And, as always, there were a ton of other fixes. Some bugs too, because apparently one cannot go without the other."}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Fog of War hexagon reveal mode",src:a(14955).A+"",width:"1800",height:"1012"})}),"\n",(0,t.jsx)(i.p,{children:"Hexagons are the bestagons."}),"\n",(0,t.jsx)(i.h2,{id:"map-v1-is-going-away",children:"Map V1 is going away"}),"\n",(0,t.jsx)(i.p,{children:"A gentle reminder: Map V1, the old Leaflet map, is being sunsetted this August."}),"\n",(0,t.jsx)(i.p,{children:"Everything new is being written for Map V2, and it is better in basically every way. But if there is something from V1 you would miss, please tell me. I would rather know now and figure it out than remove something important by accident."}),"\n",(0,t.jsx)(i.p,{children:"Vector maps are the future."}),"\n",(0,t.jsx)(i.h2,{id:"posters-are-coming",children:"Posters are coming"}),"\n",(0,t.jsx)(i.p,{children:"I found an awesome tool for generating maps, bent it in a couple places to work with Dawarich, and poster generation will be a thing soon."}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Dawarich poster generation preview",src:a(29353).A+"",width:"1800",height:"2400"})}),"\n",(0,t.jsx)(i.p,{children:'I was so excited about how well it worked that I also looked into whether it would be possible to add an "Order" button inside Dawarich.'}),"\n",(0,t.jsx)(i.p,{children:"Turns out: yes."}),"\n",(0,t.jsx)(i.p,{children:'I probably will not automate the whole flow right away. The first version will likely add an "Order" button next to "Download" for generated posters, and then we will see how it goes. It could be a nice way to support development while getting a personalized thing you can actually hang on your wall.'}),"\n",(0,t.jsx)(i.p,{children:"Man, I love these posters."}),"\n",(0,t.jsx)(i.h2,{id:"mobile-app-updates",children:"Mobile app updates"}),"\n",(0,t.jsx)(i.p,{children:"We finally released updates for the mobile apps."}),"\n",(0,t.jsx)(i.p,{children:"The new builds include the new logo, bug fixes, and a registration flow that does not matter much for self-hosters but is still important to have. The annoying dark mode bug where the map would not render is fixed too."}
1),"\n",(0,t.jsx)(i.p,{children:"One important Android note: we had to re-list the Android app in the Google Play Store. That means the update requires installing the new listing and authenticating again."}),"\n",(0,t.jsx)(i.p,{children:"Before switching, make sure the old app has uploaded all local data that had not been uploaded yet."}),"\n",(0,t.jsxs)(i.p,{children:["New Android app page: ",(0,t.jsx)(i.a,{href:"https://play.google.com/store/apps/details?id=app.dawarich.Dawarich",children:"Google Play"})]}),"\n",(0,t.jsx)(i.p,{children:"We will still release a small update for the old Android app with a banner pointing people to the new one. Sorry for the inconvenience."}),"\n",(0,t.jsx)(i.p,{children:"This mobile release took a lot of effort and testing, but it opens the door for more. In the next mobile release, we want to focus on battery consumption and start moving closer to feature parity with the web app."}),"\n",(0,t.jsx)(i.h2,{id:"links",children:"Links"}),"\n",(0,t.jsxs)(i.p,{children:["GitHub: ",(0,t.jsx)(i.a,{href:"https://github.com/Freika/dawarich",children:"github.com/Freika/dawarich"}),(0,t.jsx)(i.br,{}),"\n","Website: ",(0,t.jsx)(i.a,{href:"https://dawarich.app/",children:"dawarich.app"}),(0,t.jsx)(i.br,{}),"\n","iOS app: ",(0,t.jsx)(i.a,{href:"https://apps.apple.com/us/app/dawarich/id6739544999",children:"App Store"}),(0,t.jsx)(i.br,{}),"\n","Android app: ",(0,t.jsx)(i.a,{href:"https://play.google.com/store/apps/details?id=app.dawarich.Dawarich",children:"Google Play"}),(0,t.jsx)(i.br,{}),"\n","Donate: ",(0,t.jsx)(i.a,{href:"https://www.patreon.com/freika",children:"Patreon"})," / ",(0,t.jsx)(i.a,{href:"https://github.com/sponsors/Freika/",children:"GitHub Sponsors"})]}),"\n",(0,t.jsx)(i.h2,{id:"one-more-thing-atlas",children:"One more thing: Atlas"}),"\n",(0,t.jsxs)(i.p,{children:["I also started tinkering on another app: ",(0,t.jsx)(i.a,{href:"https://atlas.dawarich.app/",children:"Atlas"}),"."]}),"\n",(0,t.jsx)(i.p,{children:"It is basically self-hostable offline maps for homelabbers, built on the shoulders of Overpass, Photon, Valhalla, and other great mapping tools, under one UI and API."}),"\n",(0,t.jsx)(i.p,{children:"Once it is mature enough, I will write more about it separately. For Dawarich, this opens a lot of doors."}),"\n",(0,t.jsx)(i.p,{children:"Map matching comes to Dawarich, baby."}),"\n",(0,t.jsx)(i.h2,{id:"come-say-hi-in-berlin",children:"Come say hi in Berlin"}),"\n",(0,t.jsxs)(i.p,{children:["If you are in Berlin, I will be presenting Dawarich at ",(0,t.jsx)(i.a,{href:"https://thegeomob.com/",children:"Geomob"})," on October 1st."]}),"\n",(0,t.jsx)(i.p,{children:"Come say hi. I may have stickers by then."})]})}function c(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},38071(e,i,a){a.d(i,{A:()=>n});const n=a.p+"assets/images/flight-arcs-c07e6f56160112d8a7ac104051092c72.webp"},14955(e,i,a){a.d(i,{A:()=>n});const n=a.p+"assets/images/fog-hexagons-da1f89910eb2e3cf24b45aab19bf0609.webp"},76848(e,i,a){a.d(i,{A:()=>n});const n=a.p+"assets/images/map-preview-81da7faae958115c2a8c19b5e49d0ff0.webp"},29353(e,i,a){a.d(i,{A:()=>n});const n=a.p+"assets/images/poster-preview-78b92432a93a85d418d402cbf374921b.webp"},35689(e,i,a){a.d(i,{A:()=>n});const n=a.p+"assets/images/trips-redesign-7f938f3ddc3fc32f848422f585c43e3f.webp"},28453(e,i,a){a.d(i,{R:()=>o,x:()=>r});var n=a(96540);const t={},s=n.createContext(t);function o(e){const i=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),n.createElement(s.Provider,{value:i},e.children)}},99213(e){e.exports=JSON.parse('{"permalink":"/blog/dawarich-1-9-1","source":"@site/blog/2026-07-07-dawarich-1-9-1.md","title":"Dawarich 1.9.1: flights, public sharing, redesigned trips, and more","description":"Hey, it\'s been a minute.","date":"2026-07-07T00:00:00.000Z","tags":[{"inline":false,"label":"Release","permalink":"/blog/tags/release","description":"New releases announcements"},{"inline":false,"label":"Monthly Update","permalink":"/blog/tags/monthly-update","description":"Monthly updates on the project"}],"readingTime":6.64,"hasTruncateMarker":true,"authors":[{"name":"Evgenii Burmakin","title":"Author of Dawarich","url":"https://github.com/Freika","imageURL":"https://github.com/Freika.png","key":"evgenii","page":null}],"frontMatter":{"slug":"dawarich-1-9-1","title":"Dawarich 1.9.1: flights, public sharing, redesigned trips, and more","authors":"evgenii","tags":["release","montly-update"]},"unlisted":false,"prevItem":{"title":"Mileage Logs and Day Counting: Your Location History at Tax Time","permalink":"/blog/location-history-for-taxes"},"nextItem":{"title":"Dawarich \u2014 Proper Timeline and Birthday!","permalink":"/blog/dawarich-proper-timeline"}}')}
1}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.