Update freikin/dawarich Docker tag to v1 #44

Open
renovate-bot wants to merge 1 commit from renovate/freikin-dawarich-1.x into master
Member

This PR contains the following updates:

Package Type Update Change
freikin/dawarich Kustomization major 0.32.01.7.11

Release Notes

Freika/dawarich (freikin/dawarich)

v1.7.11

Compare Source

Added
  • Onboarding "Load demo data" now seeds a fully populated /map/v2 instantly: 30 days of Berlin + a Prague-weekend trip, ~80 visits with tags and places, and stats anchored to the current calendar month. "Remove demo data" wipes everything in one click while preserving anything you've confirmed, edited, or built on top of (visits, trips, places, tags adopted by user action stay).
  • Visits can now be manually assigned to one of your saved areas. When you do, the visit takes the area's name automatically — unless you've already given it a custom name, or you've also picked a place (a place name wins over an area name). Available via API now; UI to follow. #​2577
Changed
  • Two unused indexes on the points table are dropped on upgrade; on large self-hosted instances this frees several GB of disk.
  • Areas now validate their geometry: radius must be greater than 0, latitude must be within -90…90, and longitude within -180…180. Invalid values are rejected instead of silently saved.
  • Bumped bundled gems (aws-sdk, devise, jwt, httparty, and others) to close 9 known CVEs. Self-hosters get the security fixes by upgrading.
Fixed
  • Cloud only: PostHog exception capture is enabled to help diagnose production errors.
  • Map v2 Timeline calendar now lights up days that have raw points even before Track or Visit generation has caught up, matching the Insights → Activity Overview calendar. #​2579
  • Reverse-geocoding flood: duplicate per-point enqueues are now coalesced for 24 h via a Redis dedup key, retries are capped at 3, and the nightly sweep bypasses (and clears) the dedup so points whose retries were exhausted — or whose key still lingers — are picked up on the next run.
  • Map v2 visits layer now honours the selected date range. Since 1.7.10 the viewport-bounded visits fetch silently dropped the start_at/end_at filter on the backend, so all visits inside the viewport were rendered regardless of the date filter. #​2817
  • POST /api/v1/visits no longer links a new visit to a place owned by another user. Passing a foreign place_id is ignored — the visit gets a place owned by the requester at the requested coordinates, and the response no longer echoes the other user's place id or coordinates.
  • Map v2 settings panel: "Apply Settings" now actually saves your changes. Points rendering mode, speed-colored routes, live mode, and fog-of-war toggles all persist on click and reload. Apply/Reset buttons moved above the Transportation Mode section so they sit inside the outer form. #​2680
  • The app no longer trips firewall blocks by repeatedly checking family status when you're not part of a family.

v1.7.10

Compare Source

⚠️ Upgrade notes
  • Stops shorter than 5 minutes are no longer suggested as visits by default. Change the threshold under Map V2 ->Settings -> Visit detection if you want shorter stops included.
  • Smart density fill now works correctly (it was broken in 1.7.8–1.7.9). You may see more visit suggestions, especially on days when your tracker recorded points unevenly.
Added
  • Map v2 family member markers show name + last-seen datetime on hover.
  • Map v2 area info card exposes an Edit button that opens the area modal pre-filled — rename and resize existing areas without redrawing. Backed by a new PATCH /areas/:id route.
  • Map v2 selection tool: Delete N Anomaly Points button appears when the selection contains anomaly points, so you can clean up GPS noise without touching real points.
  • New Minimum visit duration setting under Settings → Visit detection (1–60 minutes, default 5). Raise it to ignore short drive-bys; lower it to catch brief errands. Replaces the hardcoded 3-minute floor that was the same for everyone in 1.7.8–1.7.9.
Changed
  • Map v2 side panel only closes via its X button. Create Visit / Create Area / Create Place and clicking a visit marker no longer dismiss the panel — visit/track clicks switch the active tab in place.
  • Map v2 Visits layer is viewport-bounded: enabling the layer and panning/zooming refetch via selection=true&sw_lat=…&ne_lng=… (debounced 400 ms) so a wide date range no longer hauls every visit at once. Timeline day-selection still loads the full day regardless of zoom.
  • Submitting "Create Visit" auto-enables the Visits layer so the new visit is immediately visible.
Fixed
  • Map v2 Place creation modal now closes on successful submit — the success path is no longer gated on a Turbo Stream side-effect, so the modal always dismisses after the place is saved.
  • Stats page no longer 500s after deleting an import or recalculating a month with no points. #​2682
  • Timeline no longer fills with traveled · 0m rows from stationary keepalive clusters; commutes that absorb adjacent stationary points are correctly labeled by their moving mode (e.g. drove) rather than stationary. Hit Settings → Recalculate to apply to existing data.
  • New tracks now honor the user's enabled transportation modes during initial detection. Previously only the Recalculate path respected disabled modes, so a user who turned off (e.g.) cycling still saw cycling assigned to freshly built tracks. #​2787
  • Visit detection no longer suggests stops at places you only drove past. Clusters where the device was moving faster than walking pace between real GPS points are rejected, so road centerlines on busy arterials stop showing up as "visits" to Kent Street / Leach Highway / etc. #​2736 #​2775
  • Visit detection requires real GPS points (not interpolated density-fill ghost points) to meet the minimum-points threshold, so a single drive between two real fixes can't be inflated into a visit. #​2736
  • Smart density fill now works correctly — it was silently disabled in 1.7.8 and 1.7.9.
  • Visit detection now respects your Visit time threshold setting when deciding where one visit ends and the next begins. The setting was previously ignored and always treated as 30 minutes.

v1.7.9

Compare Source

⚠️ Upgrade notes
  • Run Settings → Recalculate tracks & stats to merge pre-existing overlapping tracks. #​2463
  • Visit detection now creates one Place per visit (was up to 25 candidates). Use GET /api/v1/visits/:id/possible_places and POST /api/v1/visits/:id/select_place for alternatives. The place_visits table will be dropped in a follow-up release.
  • Run after deploy (both safe to re-run):
    1. bin/rails dawarich:backfill_place_names
    2. bin/rails dawarich:cleanup_suggested_places
Added
  • Map v2 Hexagons layer (Pro) — H3 cell heatmap, zoom-adaptive resolution. #​2568
  • Download a trip's points as GPX or GeoJSON from the trip page. #​2400
  • OIDC PKCE support via OIDC_PKCE_ENABLED=true (off by default). #​2282
  • POST /api/v1/visits/:id/select_place — assign a Photon candidate to a visit.
  • Visits auto-clean their previous Place on reassignment/destroy when it has no notes, tags, or other references.
Changed
  • GET /api/v1/visits/:id/possible_places returns live Photon suggestions; the assigned place comes first with its id, others have id: null.
  • GET/POST /api/v1/places/nearby now include id, source, and geodata per item (additive).
  • Place#has_many :visits is now dependent: :nullify — deleting a Place no longer deletes its visits.
Fixed
  • select_place validates lat/lon bounds (422 on out-of-range) and serializes concurrent calls via PG advisory lock to prevent duplicate Places.
  • select_place dedups by name + 50 m proximity instead of geodata JSONB, working regardless of STORE_GEODATA.
  • Self-hosted instances no longer 500 on Stats/Insights when JWT_SECRET_KEY is unset; /trial/upgrade now redirects home. #​2682
  • Imports table shows duplicate-skip counts and notifies when an import is all duplicates. #​2721
  • Family members' positions update in real time instead of every 60 s. #​2733
  • Immich/Photoprism photos reappear after a transient empty response (no more 30-minute hidden window). #​1071, #​784
  • Map v2 Select Area includes anomaly points so bulk-delete works on them. #​2476
  • Map v2 area-selection: restored the "Delete N Points" action that disappeared in 1.7.8. Pro / self-hosted, confirmation prompt, capped at 5,000 per request; recalculates affected tracks and monthly stats. #​2754
  • Timeline day click no longer corrupts the Search end-time; fields match date-picker minute precision. #​2624
  • Map v2 speed-color gradient editor saves and applies correctly. #​2120
  • Trips respect the GPS anomaly filter for route, distance, and countries. Run Recalculate trip to refresh existing trips. #​2474
  • Bulk and single point deletion recalculate affected tracks. #​2496
  • "Recalculate tracks & stats" and "Re-evaluate past data" skip anomaly points, matching real-time generation. #​2630
  • Trip photos appear on sub-day trips (timestamps no longer truncated to dates). #​2708
  • Tracks no longer split into overlapping segments when points arrive late/out of order; same-device overlaps auto-merge on the next run. #​2463
  • Same-tracker boundary merging skips tracks more than 5 km apart (no more GPS-jump fusion).
  • Visit place cleanup runs in Places::DeleteIfOrphanJob instead of inline after_commit.
  • DataMigrations::BackfillPlacesUserIdJob correctly excludes just-assigned places from the orphan-delete pass.
  • Real-time track boundary detector skips the per-track scan when no untracked points exist.
  • Bulk visit suggestion accepts both user_id: and user_ids: to survive stale Sidekiq jobs. #​2740
  • RemoveUnusedIndexes migration drops invalid points indexes left by failed REINDEX CONCURRENTLY before removing unused ones. #​2124
  • Vendored h3-js retains its upstream Apache-2.0 license header.
  • Insights "Top Visited Locations" no longer underreports days for multi-month totals (e.g. 133 days rendered as "4 days"). #​2743

v1.7.8

Compare Source

⚠️ Upgrade notes
  • Self-hosters running OIDC-only sign-in: the ALLOW_EMAIL_PASSWORD_REGISTRATION env var no longer doubles as a login gate. Email/password sign-in is now controlled by the new ALLOW_EMAIL_PASSWORD_LOGIN env var (defaults to true). To preserve OIDC-only sign-in after upgrade, set ALLOW_EMAIL_PASSWORD_LOGIN=false.
  • Visit detection rewrite: the next nightly run after upgrade will produce different suggested visits. Confirmed visits and named places are preserved; only suggestions change.
  • Places backfill (irreversible): the place-ownership migration backfills places.user_id from owning visits and permanently deletes any place that has no linked visits. Multi-user instances and instances with orphan rows from prior bugs should run rake places:backfill_user_id_dry_run first to see assigned/deleted counts. Single-user self-hosted instances are unaffected. The follow-up release will add a NOT NULL constraint, so any new places created between this release and the next must carry a user_id.
  • Historical tracks auto-recalculate on upgrade. A background job backfills points.tracker_id from each point's raw_data (Google deviceTag, OwnTracks tid — both stored as-is) or its import_id (legacy-import-<id>, visible in points and tracks API responses for backfilled rows), then recalculates stats, tracks, and digests for every user with tracks predating the fix. The enqueue job is Sidekiq-retry-safe and re-checks its predicate on each retry, so a crashed/restarted Sidekiq resumes cleanly without re-processing finished users. New installs are unaffected.
  • Expect a temporary spike during the recalc window. Per-user jobs are staggered over the first hour; expect elevated Sidekiq queue depth, CPU, and database IO until they finish, with duration scaling by user count and history length. Tracks may appear merged on the map for individual accounts until their recalc completes.
  • 2FA lockout recovery on instances without SMTP: the new 10-attempt 2FA lockout sends an unlock email; self-hosters without SMTP configured will not receive it. Locked users can be unlocked from the Rails console with User.find(<id>).reset_failed_otp_attempts!, or by completing the password-reset flow (which also clears the lockout).
Changed
  • Visit detection now uses PostGIS spatial clustering for faster, more accurate stops; the iteration-based detector is removed.
  • Places are now strictly per-user. Suggestion, photo-geotagging, and reverse-geocoding all use your own place catalogue exclusively; no places are shared across users. Existing shared places have been backfilled to their most-active owner. Self-hosted single-user instances see no behaviour change.
Added
  • "Re-run detection on full history" button under Settings → Visits. Confirmed visits and named places are preserved.
  • Account lockout after 10 failed 2FA attempts (30-minute auto-unlock or password reset). Applies to both the mobile API (POST /api/v1/auth/otp_challenge) and the web sign-in flow. Backup codes still work during a lockout so users with one stored can recover immediately. A notification email is sent to the account owner when a lockout is triggered. #​2575
Fixed
  • Fix support of FIT files from Garmin Connect. #​2686
  • The Anomalies map layer no longer requires manually toggling off and on after a page reload or timeframe change. The toggle state is restored on reload, and the layer refetches anomalies for the active date range. #​2568
  • Email/password login is now shown alongside the OIDC button on self-hosted instances by default, instead of being hidden whenever OIDC is configured. Operators who want to enforce OIDC-only sign-in can set ALLOW_EMAIL_PASSWORD_LOGIN=false. See the upgrade note above. #​2495
  • Suggested visits at residential addresses are no longer stuck on the placeholder name "Suggested place" indefinitely. The nightly place-naming job now assembles a name from street, house number, city, and state when the geocoder response has no top-level place name — matching how new visits are named at creation time. #​1711
  • Photos imported from Immich now display at the correct time on Map v2 and import with the correct UTC timestamp, regardless of the host server's timezone or the photo's capture timezone. Previously, photos taken outside the server's timezone could appear up to 24 hours off. Existing imports keep their old timestamps; to fix already-imported photos, re-run the Immich import from Settings → Integrations → Immich. The photos API now exposes a capturedAt field with the canonical UTC instant (from Immich's fileCreatedAt / PhotoPrism's TakenAt) alongside the existing localDateTime key, which continues to return the source's wall-clock value. Map v2 uses capturedAt for time display. #​2253
  • Confirmed and declined visits inside an area or assigned to a place are no longer reverted to "suggested" — and any name you gave them is no longer overwritten — by the nightly visit-recompute job. #​2048, #​2484
  • GPX import now streams the file rather than loading the entire XML into memory, so multi-hundred-MB GPX files (e.g. long-running activity exports) no longer OOM the Sidekiq worker. #​2296
  • Viewing an import on Map v2 or the Points page now selects the import's full date range, instead of defaulting to today or the last month. #​1857
  • Imports (GPX, KML, GeoJSON, FIT, TCX, Google Timeline, OwnTracks .rec, CSV, Polarsteps) now generate tracks for the imported point range. To rebuild every track in a range — including manually-corrected ones — use Map v2 → Settings → Recalculate tracks & stats. #​2224
  • Tracks recorded by multiple devices on the same account (phone + watch + GPS unit) no longer get merged into one zigzagging track on the map. Each device's points are kept on their own track, and Map v2 draws routes per-device. #​337, #​1726
  • Importing a GPX file with multiple <trk> or <trkseg> elements no longer merges them into a single track when timestamps overlap or arrive out of order (e.g. Garmin daily-file exports); each track and segment becomes its own track. When a <trk> declares <src>, that value is SHA1-hashed and used as a stable device identity so consecutive imports of the same device stay on the same track stream; with only <name>, identity is scoped to the import filename to prevent unrelated devices from colliding. #​1726
  • Importing a Google Records.json export with positions from more than one device no longer "teleports" between devices and inflates distance travelled; points are scoped per-device using Google's deviceTag. #​337
  • The tracks unique index now scopes by tracker_id (via a COALESCE(tracker_id, '') expression so legacy NULL-tracker rows still can't duplicate), letting two devices produce a journey with the same start/end timestamps on one account without colliding on insert.

v1.7.7

Compare Source

⚠️ Breaking changes

Prometheus metrics backend migrated to Yabeda.

Dawarich now uses the Yabeda monitoring framework instead of discourse/prometheus_exporter. Self-hosters who scrape Prometheus metrics from Dawarich should update their configuration.

If Sidekiq is unreachable during a scrape, web returns its own metrics only and
logs a warning. Prometheus sees a momentary gap in sidekiq_* rather than a
failed scrape.

Scrape target (requires HTTP basic auth with METRICS_USERNAME / METRICS_PASSWORD):

  • Web: http://dawarich_app:3000/metrics

Custom dawarich_archive_* metric names are unchanged. Dashboards and alerts built on these metrics continue to work.

Infrastructure metric names have changed. If you have dashboards built on ruby_*, active_record_*, or similar metrics emitted by prometheus_exporter, you must update them:

Category Before After
HTTP requests (total) ruby_http_requests_total rails_requests_total
HTTP request duration ruby_http_request_duration_seconds rails_request_duration
Sidekiq job count ruby_sidekiq_jobs_total sidekiq_jobs_executed_total
Sidekiq failed jobs ruby_sidekiq_failed_jobs_total sidekiq_jobs_failed_total
Sidekiq job duration ruby_sidekiq_job_duration_seconds sidekiq_job_runtime_seconds
Sidekiq queue latency ruby_sidekiq_queue_latency_seconds sidekiq_queue_latency
Sidekiq queue backlog ruby_sidekiq_queue_backlog_total sidekiq_jobs_waiting_count
Sidekiq process count ruby_sidekiq_process_count sidekiq_active_processes
Puma workers ruby_puma_workers puma_workers
Puma backlog ruby_puma_request_backlog puma_backlog
Puma thread pool capacity ruby_puma_thread_pool_capacity puma_pool_capacity
ActiveRecord pool active_record_connection_pool_connections activerecord_connection_pool_size
Process/GC (e.g. ruby_rss, ruby_heap_live_slots) emitted not emitted by default; add a custom Yabeda group if needed

Removed environment variables:

  • PROMETHEUS_EXPORTER_HOST, PROMETHEUS_EXPORTER_HOST_SIDEKIQ — no longer needed. Metrics are served in-process by each application.

Retained environment variables:

  • PROMETHEUS_EXPORTER_ENABLED — still the single on/off switch.
  • METRICS_USERNAME, METRICS_PASSWORD — unchanged.
  • PROMETHEUS_EXPORTER_PORT — port the in-process Sidekiq metrics exporter binds to (default 9394).

New optional environment variable:

  • SIDEKIQ_METRICS_URL — internal URL the web container uses to fetch Sidekiq metrics (default http://dawarich_sidekiq:9394/metrics). Override on Dokku, Kubernetes, or any deployment where the worker container's hostname differs from the docker-compose default.

Prometheus scrape config example:

scrape_configs:
  - job_name: dawarich
    metrics_path: /metrics
    basic_auth:
      username: prometheus     # set via METRICS_USERNAME
      password: prometheus     # set via METRICS_PASSWORD
    static_configs:
      - targets: ['dawarich_app:3000']
Fixed
  • Fixed monthly stats failing with a "Stats update failed" notification when the month's distance exceeded the int4 limit (2,147,483,647 m ≈ 2.15M km). Affected months stayed stuck on the prior value until recalculated. #​1996
  • 500 error on the imports page. #​2683
  • Insights weekly pattern now refreshes after monthly stats change, instead of showing a stale snapshot until the next monthly digest job runs. #​2478
  • Points with no reverse-geocoding result (ocean, wilderness) are now marked as attempted instead of being re-queued every nightly run; use "Start Reverse Geocoding" to retry after switching providers. #​2271
  • Activity detection now falls back to displacement when the tracker reports 0 m/s, so OwnTracks Significant Change mode and similar low-power setups stop misclassifying real movement as stationary. Run Map v2 → Settings → Recalculate tracks & stats to apply to existing tracks. #​2390
  • Redis no longer balloons (multi-GB) when browsing photos with Immich or Photoprism connected. Photo thumbnails are no longer copied into the server-side Redis cache; the browser caches them directly via Cache-Control instead. #​1609
  • Drag-selecting a region on the map now includes visits attached to your saved Areas (Home, Work, etc.), instead of silently dropping area-only visits from the visit tray. #​2420

v1.7.6

Compare Source

Added
  • Map v2 timeline: bulk Confirm and Decline in selection mode, capped at 500 visits per request.
  • Trip Recalculate button: refresh path, distance, and visited countries on demand. The page updates automatically when it finishes; repeat clicks within 60 seconds are ignored. #​2478
  • Google's "Timeline Edits.json" type of Takeout export is now recognized and imported directly.
Fixed
  • Monthly stats now bucket points by your local timezone instead of UTC — fixes phantom day-1 spikes from overnight imports and undercounts near month boundaries. #​2546
  • Slider knobs in settings and map-layer toggles now move on click instead of staying left while only the track color changes. #​2566
  • Stats and tracks recalculation no longer crashes in midnight-DST timezones (e.g. America/Santiago). #​2638
  • Mobile map fills the dynamic viewport and respects iPhone safe-area insets — navbar below the notch, date selector / demo banner above the home indicator and Safari URL bar. #​1873
  • Transactional emails now build links with HTTPS, fixing reset links that arrived as http:// even when the site was served over HTTPS via reverse proxy. #​1469
  • SMTP authentication and timeouts (SMTP_AUTHENTICATION, SMTP_OPEN_TIMEOUT, SMTP_READ_TIMEOUT) are now env-configurable — Office 365 and similar no longer need a custom initializer. #​1469
  • Export zip entry timestamps no longer drift across timezones (was 7h ahead on US Pacific). Applies to per-export and full-archive downloads. #​2639
  • Map v2 heatmap stays visible at city and street zoom instead of fading out past city level. #​2087
  • Map v2 search panel: visits list no longer flashes and disappears after picking a location — a stale debounced fetch was overwriting it. #​2394
  • Transportation-mode sliders (Walking/Cycling/Driving max speed, Min flight distance) in Map v2 settings now respect your unit of measurement (mph/mi when miles are selected). #​2634
  • Self-hosting docs (Docker, Synology, intro) now show the correct default password safepassword instead of password. #​2636
  • Map v2 light/white/grayscale basemaps: dense point sequences no longer camouflage as thin white lines — strokes are now dark on light basemaps, white on dark. #​2387
  • Activity Overview heatmap opens centered on your most recent active day instead of January 1 — no blank future months on mobile early in the year. #​2228
  • Map v2 timeline calendar: a selected day shows visits in your profile timezone — late-evening visits no longer leak across day tabs. #​2619
  • Renaming a suggested visit in the timeline now confirms it and saves the typed name as a place under your account. #​2621
  • User-data archive import no longer lets the payload overwrite a track's user_id, id, or timestamps.
  • Track generation no longer creates duplicate tracks — multiple background jobs (daily, realtime, recalc, import) could previously produce the same track per time window, leaving 2–3 copies on your map. Run Map v2 → Settings → Recalculate tracks & stats once after upgrading to recompute from the merged points. #​2677
  • Heatmap on Map V2 looks a lot better than before
  • In notifications section of navbar only "99+" is shown when there are more than 99 notifications, instead of the actual number.

v1.7.5

Compare Source

Added
  • Manual transportation-mode correction per segment in the map view, with a one-click reset to auto-detection. Manually-corrected segments are preserved across re-classification. #​2405
  • Per-user transportation-mode allowlist in the map settings panel. Disabled modes are excluded from auto-detection going forward; existing tracks stay as they are until you press "Re-classify my history". #​2405
Fixed
  • Track duration and average speed are now refreshed whenever a track's path is rebuilt (e.g. after a merge), instead of keeping their pre-merge values. To heal tracks already affected, click Map v2 → Settings → Recalculate tracks & stats once after upgrading.
  • Visited-country statistics no longer count countries that were merely flown over. Points moving faster than 500 km/h are now excluded from the country and city aggregation. Trains and high-altitude cities (Denver, Mexico City, La Paz, Lhasa, …) continue to count as visited. Previously-saved monthly stats are not recomputed automatically — re-run stats calculation to refresh historic months. #​1917
  • Server-rendered timestamps (Points, Places, Imports, Exports, account settings, trial banner) now display in the user's profile timezone, matching the Maps tab. Previously, the time and tooltip could fall back to the server's default zone, drifting by hours. Invalid stored timezones no longer raise. #​1824
  • "Start Reverse Geocoding" now actually re-runs for every point in your database — previously it silently skipped any point that had already been geocoded, even though the button promised a full re-run. #​2141
  • Map v2 date-navigation arrows (< / >) now shift the time window by exactly one day, matching Map v1. Previously they shifted by the current window width, so a 00:00–23:59 selection paged back by 23h59m instead of 24h. #​2548
  • Daily track generation now merges a newly-created track with the immediately-preceding existing track when they are seconds apart, instead of leaving a permanent split each time live tracking briefly pauses. To heal splits that have already accumulated in your database, open Map v2 → Settings → Recalculate tracks & stats once after upgrading; from then on the daily job will keep adjacent tracks merged on its own. #​2265
  • The Maps v1 area-drawing toolbar no longer disappears after toggling the Areas layer or refreshing the page. #​1938
  • Trip page no longer shows an indefinite "loading" spinner in the Countries card when no country data is available; an em-dash placeholder is shown instead, matching the modal's "No countries data available yet." message. #​1831
  • Trips that cross midnight in the user's timezone now contribute distance and time to both calendar days, instead of being attributed entirely to the day they started. The timeline day summary, the calendar heat grid, and adjacent-day km totals all reflect the trip on each day it actually spans. #​2544, #​2546
Changed
  • "Start Reverse Geocoding" and "Continue Reverse Geocoding" now enqueue Sidekiq jobs in bulk batches of 1,000 instead of one round-trip per point. For large databases (millions of points) this drops the enqueue phase from minutes to seconds. Per-point geocoder rate-limit behavior is unchanged. #​2141
  • Map (Leaflet) on mobile browsers no longer clips the bottom of the map and routes after the address bar collapses or the date is changed. #​2000
  • Visit suggestions are now generated from live tracking (Dawarich iOS app, OwnTracks, Overland, Traccar), not just from imports. Previously, only imported data triggered visit detection. Visit suggestion still requires a configured reverse geocoder (Photon, Geoapify, Nominatim, or LocationIQ). #​1749, #​1966

v1.7.4

Compare Source

Fixed
  • Cloud Trial users are no longer limited to 10 MB import files.
  • Self-hosted instances no longer need to set JWT_SECRET_KEY. #​2570
  • QR sizes are fixed. #​2479
  • Family owners can now remove other members directly from the family page. #​2555
  • Insights and statistics now agree on the number of countries visited per month. #​2581
  • The default password for the demo account has been changed to safepassword. The old default password prevented seeds from running due to the new 12-character minimum password length validation. Existing users were not affected. #​2593

v1.7.3

Compare Source

Security

Fixes for several issues found in a static-analysis security audit. None of these have a known in-the-wild exploit, but operators should still upgrade.

  • Path traversal in user-data archive import (POST /settings/users/import) — a malicious archive whose JSON manifest referenced files via .. could attach arbitrary host files (e.g. config/master.key, /proc/self/environ) to the user's import record and download them.
  • OAuth web callback (Google / GitHub / OIDC) used to silently link an existing local-password account to an incoming OAuth identity on email match, with no email_verified check or consent. The web flow now mirrors the mobile-API flow: the user must confirm the link.
  • SSRF blocklist for the immich_url / photoprism_url settings missed RFC1918, CGNAT, IPv6 ULA, multicast and reserved ranges. Cloud installs now reject those; self-hosted gets a smaller blocklist that still catches non-http schemes, cloud-metadata IPs and multicast while permitting LAN / loopback / Docker DNS.
  • Web OTP challenge (POST /users/otp_challenge) had no rate limit, leaving 2FA brute-forceable given a leaked password. Added rack-attack throttles (5/15min per session, 20/15min per IP) plus an in-controller cap of 5 invalid attempts.
  • Stored XSS via family.name rendered through notification.content.html_safe is now passed through sanitize.
  • Disabling 2FA now requires both the password AND a current authenticator code (or backup code), on web and API.
  • Default prometheus / prometheus credentials for /metrics are gone — the endpoint refuses until both METRICS_USERNAME and METRICS_PASSWORD are set.
  • Devise minimum password length raised from 6 to 12.
  • API keys generated by new accounts are 256-bit (was 128-bit). Existing keys keep working.
  • OwnTracks point ingest replaces a blanket params.permit! with the documented field whitelist.
Added
  • Polarsteps support — locations.json and segment-array exports now import directly.
  • Files with unsupported extensions are rejected in the browser before upload starts.
  • Clear, actionable error messages when an unsupported file is uploaded — points to the right file in your Takeout instead of a generic "Unable to detect file format".
Changed
  • Monthly and yearly email digests now hide countries and cities with 1 hour or less of time spent, so the Top Countries / Top Cities lists no longer get padded with 0h and 1h entries.
  • Disabling 2FA via /settings/two_factor now asks for both your password and a current authenticator code (or one of your backup codes). The web form has been updated; API clients must send password AND otp_code to DELETE /api/v1/users/me/two_factor.
  • Setting a new password (signup, password change, password reset) now requires at least 12 characters. Existing shorter passwords still work for sign-in.
  • /metrics endpoint: if you scrape Prometheus metrics, set METRICS_USERNAME and METRICS_PASSWORD in your environment. With them unset, /metrics now returns 503.
  • OAuth (web) without SMTP: a user signing in via OIDC/GitHub/Google for the first time when an email-matching local account already exists is no longer auto-linked. They are sent to a password-challenge page where entering their existing Dawarich password completes the linking. No SMTP setup is required for this path. A "send me a confirmation email instead" button on the same page is the SMTP-based fallback for users who have forgotten their password.
  • Self-hosted Immich/PhotoPrism URLs: the next save of these settings re-validates the URL. Configurations using non-http schemes, 0.0.0.0, multicast IPs, or the cloud-metadata 169.254.169.254 will be rejected. Standard LAN / Docker / loopback URLs continue to work.
Fixed
  • Google Phone Takeout location-history.json now imports reliably. (#​2437, #​2587)
  • KMZ files from a wider range of exporters now import.
  • Imports no longer fail intermittently with No such file or directory @&#8203; rb_sysopen - /tmp/.... #​2446
  • FIT files from non-Garmin devices and phone apps now import.
  • CSV files with quoted headers (e.g. "Latitude","Longitude") are now recognized.
  • Empty (0-byte) uploads now produce a clear error instead of crashing.
  • Upgrades from older versions (≤ 1.3.1) no longer crash during db:migrate. #​2576

v1.7.2

Compare Source

Removed
  • rails_pulse performance monitoring has been removed entirely. The gem, its initializer (config/initializers/rails_pulse.rb), the /rails_pulse route mount, the scheduled RailsPulse::SummaryJob and RailsPulse::CleanupJob cron entries, and all rails_pulse_* tables are gone. A new migration DropRailsPulseTables cleans up existing installations on upgrade. This resolves a class of upgrade failures where the rails_pulse_* tables ended up missing/half-applied on production. #​2549
Added
  • Swagger docs for all the recent API additions and changes, improving API discoverability and client generation. The full OpenAPI spec is available at /api-docs.
  • Map v2: Delete button on the point info card. Selecting a point now offers an immediate Delete action (with confirm dialog), matching the long-standing Map v1 behavior. The deleted point is removed from the points layer in place without a full reload.
Fixed
  • Monthly and yearly digest emails now convert distance from stored meters to the user's preferred unit (km/mi). Previously the raw meter value was shown next to the unit label (e.g. 500000 km instead of 500 km).
  • Map (Leaflet): route lines no longer revert to their pre-move shape when an unrelated point is deleted after dragging another point. The dragend handler was failing to update the marker array because it looked for the controller in the wrong place. #​1797
  • Track creation now caps a single track's distance at 100,000 km (with a logged warning) instead of silently truncating at the legacy 999,999 m limit. Long-haul journeys are no longer collapsed to ~1000 km. #​1693
  • Dev container: bind-mount the project root into the container so bundle install can locate the Gemfile. Previously only sub-paths were mounted, leaving /var/app/Gemfile missing. #​1804
  • Map v2: photos without GPS metadata (latitude/longitude null) no longer render as markers at Null Island (0°, 0°) — they are now correctly excluded from the photos layer. (#​2464, #​2465)

v1.7.1

Compare Source

Added
  • Onboarding "Load demo data" now seeds a fully populated /map/v2 instantly: 30 days of Berlin + a Prague-weekend trip, ~80 visits with tags and places, and stats anchored to the current calendar month. "Remove demo data" wipes everything in one click while preserving anything you've confirmed, edited, or built on top of (visits, trips, places, tags adopted by user action stay).
  • Visits can now be manually assigned to one of your saved areas. When you do, the visit takes the area's name automatically — unless you've already given it a custom name, or you've also picked a place (a place name wins over an area name). Available via API now; UI to follow. #​2577
Changed
  • Two unused indexes on the points table are dropped on upgrade; on large self-hosted instances this frees several GB of disk.
  • Areas now validate their geometry: radius must be greater than 0, latitude must be within -90…90, and longitude within -180…180. Invalid values are rejected instead of silently saved.
  • Bumped bundled gems (aws-sdk, devise, jwt, httparty, and others) to close 9 known CVEs. Self-hosters get the security fixes by upgrading.
Fixed
  • Cloud only: PostHog exception capture is enabled to help diagnose production errors.
  • Map v2 Timeline calendar now lights up days that have raw points even before Track or Visit generation has caught up, matching the Insights → Activity Overview calendar. #​2579
  • Reverse-geocoding flood: duplicate per-point enqueues are now coalesced for 24 h via a Redis dedup key, retries are capped at 3, and the nightly sweep bypasses (and clears) the dedup so points whose retries were exhausted — or whose key still lingers — are picked up on the next run.
  • Map v2 visits layer now honours the selected date range. Since 1.7.10 the viewport-bounded visits fetch silently dropped the start_at/end_at filter on the backend, so all visits inside the viewport were rendered regardless of the date filter. #​2817
  • POST /api/v1/visits no longer links a new visit to a place owned by another user. Passing a foreign place_id is ignored — the visit gets a place owned by the requester at the requested coordinates, and the response no longer echoes the other user's place id or coordinates.
  • Map v2 settings panel: "Apply Settings" now actually saves your changes. Points rendering mode, speed-colored routes, live mode, and fog-of-war toggles all persist on click and reload. Apply/Reset buttons moved above the Transportation Mode section so they sit inside the outer form. #​2680
  • The app no longer trips firewall blocks by repeatedly checking family status when you're not part of a family.

v1.7.0

Compare Source

The Timeline Release

The Timeline Feature in Map V2 is now a feature capable to fully replace Google Timeline's user experience and overshine it. Please enjoy responsibly.

Added
  • Monthly digest emails. On the 2nd of each month users receive an email summarizing the previous month with an ASCII-rendered overview (distance, active days, countries, cities), a weekly pattern bar chart, a daily distance sparkline, top countries and cities by time spent, first-time visits, and a month-over-month trend comparison. Enabled by default; opt out at Settings → Email Preferences.
  • Visible, selectable family invitation URL under each pending invite on the family page, so self-hosted instances without SMTP can still share the link #​2438.
  • User-configurable GPS noise filtering in Map v2 → Settings. The accuracy threshold (previously a hardcoded 100 m) is now adjustable from 50–1000 m, and the filter can be disabled entirely, so trips on trains or other weak-signal data sources no longer get their legitimate points stripped out. A "Re-evaluate past data" button clears existing anomaly flags, re-runs the filter with the new settings, and rebuilds tracks/stats/digests; a separate "Recalculate tracks & stats" button rebuilds derived data without touching anomalies. Fixes #​2480.
Changed
  • S3 storage can now be used in self-hosted mode. It's compatible with S3-like backends, such as MinIO, Ceph, or Cloudflare R2. To enable S3 storage, set STORAGE_BACKEND=s3 and provide AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, and AWS_BUCKET. For S3-compatible backends, additionally set AWS_ENDPOINT_URL (or AWS_ENDPOINT).
  • The Timeline tab in Map v2 Tools panel is now a first-class feature.
  • The single digest email toggle in Settings has been split into independent Monthly Digest and Year-End Digest controls. A data migration preserves explicit opt-outs: users who had previously disabled digest emails stay opted out of both; users with no preference default to both on.
  • The Year-End Digest email has been rewritten with ASCII-rendered charts (activity heatmap, monthly distance bars, top countries, year-over-year trend). Content renders identically in HTML and plain-text email clients without JavaScript or external images, fixing rendering issues in Gmail and Outlook.
  • Points exports (GeoJSON and GPX) are now stored on S3 as single-entry zip archives. Downloads are delivered as <name>.zip.
  • Import uploads are compressed client-side before upload. Users who previously uploaded uncompressed files see no behavior change; S3 storage for new uploads drops substantially for text formats.
  • Trial users' 10 MB import-file size limit applies to the uploaded file before any client-side compression, so the user-facing limit is unchanged.
Fixed
  • Fix yearly digest emails not being sent automatically. The scheduling job existed in the codebase but was never wired into config/schedule.yml, so no year-end emails went out. Yearly digests now fire on January 2nd at 06:00 UTC.
  • Fix a latent race in the yearly digest pipeline where the email job was scheduled with a 30-minute delay after the calculation job; if the calculation took longer than 30 minutes (e.g., Sidekiq backpressure, transient retries), the email was silently dropped. Emails are now chained from the calculation job's success path.
  • Fix visit name being overwritten by the location name when updating a visit via the map popup. The custom name typed into the "Visit Name" field is now preserved; the place name is only used as a default when the user leaves the name blank #​1915.
  • Fix stray "Map layer preferences saved" flash (and spurious settings requests) when deleting a point on Map v1. Layer-preference saves are now suppressed while the delete flow internally rebuilds the routes layer and layer control #​1902.
  • Fix the Map v2 replay slider showing times in the browser's local timezone instead of the timezone configured in Settings. Day buckets and the minute-of-day index are now computed in the user's timezone so the replay scrubber matches the rest of the app #​2457.
  • Fix "View on map" to use the preferred map. #​2475
  • Fix a bug allowing inactive users to create points via the API.
  • Fix country name canonicalization on the Stats page producing wrong results (e.g., France showing as "Scarborough Reef") when the countries table has multiple rows sharing the same ISO code #​2434.
  • Fix Stats dashboard charts stuck on "Loading..." for some years due to duplicate Chartkick element IDs when rendered inside cached year partials #​2453.
  • Fix map date-navigation prev/next buttons always shifting by one day; they now shift by the currently selected interval #​1736.
  • Fix individual points occasionally rendering on top of dense point lines on Map v2 by adding a deterministic timestamp-based sort key #​2388.

v1.6.1

Compare Source

Added
  • Info badge on import form suggesting users zip large files (200MB+) before uploading.
  • Missing SVG icons for activity breakdown (ship, circle).
Fixed
  • Fix compressed zip files failing to import with "No such file or directory" error. Rubyzip needs to re-open the source zip for compressed entries, but the temp file could be garbage collected before extraction completes #​2446.
  • Fix anomaly filter crashing on large imports (millions of points) due to loading all points into memory at once. Speed-based filtering now processes data in monthly chunks.

v1.6.0

Compare Source

Added
  • Immich users can now enrich their photos with geodata.
  • Users can now optionally enable two-factor authentication (2FA) for their accounts in Settings > Two-Factor Authentication. Supported methods: TOTP apps (Google Authenticator, Authy, etc.) and backup codes. Once enabled, users will be prompted for a 2FA code on login. This adds an extra layer of security to protect your location data.
Fixed
  • Fix OIDC account linking failing when the email from the identity provider has different casing than the existing Dawarich account #​1983.
  • Fix confirmation dialogs being ignored when clicking "Cancel" — destructive actions (account deletion, import/export deletion, place deletion) fired regardless of user choice due to Rails UJS and Turbo both handling the same click #​1978.
  • Fix Year in Review share link being empty when toggling public access #​2418.
  • Fix address field on Points page being empty when geodata properties are unavailable #​2419.
  • Fix Stats API returning the same country/city count for every year instead of per-year counts #​2280.
  • Fix flyover countries (with no visited cities) still showing in monthly stats views #​2423.
  • Fix importing Google Timeline files. #​2427

v1.5.1

Compare Source

Fixed
  • Fix points and tracks interactions on Map v2 being unresponsive after the latest update.
  • Fix creating demo data from the onboarding modal.
  • Fix navbar for cloud trial users.
  • Reset months stats instead of deleting when there is no data.

v1.5.0

Compare Source

Added
  • GPS noise filtering. An automatic system to detect ahd filter out points with unrealistic speeds, altitudes, or sudden jumps.
  • Support for signing in via web view using our Android app.
  • On the map settings page user now can enable and disable map layers.
  • Onboarding modal now offers a third option to load demo data (3 days in Berlin, ~1000 points) so new users can instantly see what the map looks like. Demo imports bypass trial limits, are clearly labeled with a "Demo" badge, and can be deleted from a banner on the map page or from the imports list.
  • New tool to the Map V2 tools: The "Day per Country" button will open a modal showing a breakdown of how many days the user has spent in each country, based on their points data. This is calculated by grouping points by country and counting unique days with at least one point in that country.
Changed
  • [Cloud] The point creation API endpoints are being excluded from the default Lite/Pro rate limits (200/1,000 requests/hour). They now have general rate limits of 10,000 requests/hour.
  • Buildings numbers on map V2 are now shown on closer zoom.
Fixed
  • Users who registered via Google (or other OAuth providers) can now change their password and email without needing to enter their current password.
  • Fix deadlocks in reverse geocoding job when multiple Sidekiq workers update points concurrently.
  • Fix counter_cache_column error in points counter reset job by using direct SQL count instead of reset_counters.
  • Fix duplicate place records causing ON CONFLICT cardinality violations during reverse geocoding.
  • Fix TypeError crash in transportation mode backfill when Google export files have unexpected JSON structure.
  • Fix inability to disable visit suggestions background job due to conflicting Rails UJS and Turbo handlers causing request cancellation #​2118.
  • Fix visit confirm/decline buttons firing twice #​2379.
  • Fix clicking on a point in Map v2 silently moving it to the cursor position. Points now only update when intentionally dragged #​2149, #​2150.
  • Fix visit name suggester not recognizing Photon reverse geocoding data format, causing all suggested places to show as "Suggested place" #​2151, #​2377.
  • Fix visit edit form displaying UTC times instead of the user's configured timezone #​2168.
  • Fix export deletion failing when the export file was manually removed from disk #​915.
  • Fix PhotoPrism before date filter being off by one day, excluding photos taken on the end date #​747.
  • Fix datetime inputs allowing 5-digit years on Chrome by adding max attribute to all datetime-local fields #​578.
  • Fix Points page datetime fields requiring seconds input, preventing search on mobile browsers and some desktop browsers #​1040, #​1478.
  • Fix altitude values being truncated to integers instead of preserving decimal precision #​1573.
  • Fix suggested visits keeping "Suggested Visit" name when confirmed directly without selecting a place #​1725.
  • Fix visit name becoming empty and uneditable when clicking the name field and then clicking away #​1776.
  • Fix trips page crashing with undefined method 'coordinates' for nil when trip path calculation hasn't completed yet #​1356, #​1765.
  • Fix Immich/PhotoPrism photos on map not being filtered by the selected date range #​1755.
  • Fix short trips (less than one full day) not showing photos due to PhotoPrism before date filter being exclusive #​1688.
  • Fix health check endpoint (/api/v1/health) triggering unnecessary User Load database queries on every request #​1770.
  • Fix points created via Overland API (Home Assistant, GPSLogger) not being automatically reverse geocoded after creation #​1242.
  • Fix monthly stats map crashing with Invalid LatLng object: (NaN, NaN) when points have missing coordinates #​1762.
  • Fix trips failing with self-signed certificates by leveraging per-integration SSL skip settings #​455.
  • Fix non-admin users unable to access Background Jobs settings to trigger reverse geocoding or manage visit suggestions #​1714.
  • Fix family page map not loading due to escape_javascript producing invalid JSON in the Stimulus data attribute.
  • Fix countries appearing in visited statistics despite only being driven through without spending meaningful time in any city #​1595, #​1779.
  • Fix migrate_to_new_storage rake task crashing when export URL is blank, already migrated, or points to a directory instead of a file #​1018, #​1037.
  • Fix selecting the only suggested place for a visit having no effect because the dropdown change event never fires with a single option #​471.
  • Fix city duration calculation undercounting time spent due to integer division truncating sub-minute GPS intervals to zero #​2408.
  • Fix tooltips in data tables (Imports, Exports, Points) being hidden behind adjacent rows #​2409.
  • Fix iOS QR code in Account settings being cut off on the right side #​2406.

v1.4.0

Compare Source

Added
  • Family page now contains a map with family members markers on it.
  • Visits page now have "Confirm all" and "Decline all" buttons to quickly confirm or decline all visit suggestions at once.
Changed
  • Updated look and feel
  • The point counting was changed to be more efficient on bigger accounts.
  • Redesigned raw data archival system for large instances (10M+ points).
Fixed
  • Fix Lite plan archival warnings sending all three notifications (11-month, 11.5-month, and 12-month) simultaneously when a user's oldest data already exceeds all thresholds. Now only the most severe warning is sent, and lower thresholds are marked as already notified.
  • Misconfigured Prometheus settings will no longer litter logs with error messages, it will make multiple attempts to connect instead and then stop.
  • One of previous versions removed a database index making points upload very slow. The index is now added back to fix the issue.

v1.3.4

Compare Source

Added
  • Family members can now share their location with each other. In the family settings, you can send a location sharing request to any family member. Once they accept it, you will be able to see their location on the map and they will be able to see yours. You can also revoke location sharing at any time. Location sharing is disabled by default for all existing families, so you need to enable it in the family settings if you want to use this feature.
Changed
  • Redesigned onboarding modal with two paths: "I have data" (inline file import) and "Start tracking" (app download + QR code). New users with existing location data can now start importing within 2 clicks of signing up.
  • Onboarding completion is now persisted server-side (settings.onboarding_completed) instead of relying solely on localStorage, preventing the modal from reappearing after browser data clears.
  • Route opacity data migration now runs as a background job instead of inline during migration, improving deployment reliability for large instances.
Fixed
  • Fix admin and supporter tooltip overflowing the page on narrow screens. #​1449
  • Fix date navigation arrow tooltips overlapping with the navbar on map pages. #​2229 #​2100
  • Fix infinite loading spinner when a trip has no points in its date range. #​2293
  • Fix Insights monthly digest panels disappearing when switching months. #​2305
  • Fix suggested visit confirm/decline not removing the visit from the list. #​2307
  • Fix Stats page reloading when clicking "countries, cities" link. #​2270
  • Fix map base layer selection not being restored after page reload (Maps v1). #​2093
  • Fix duplicate country names in stats caused by geocoder returning different spellings. #​2044
  • Fix total distance display overlapping layer picker when distance is in miles. #​2017
  • Fix default route opacity displaying as 6000% for new users. #​1891
  • Fix shared month stats map missing hexagons from the last day of the month. #​1934
  • Fix Nominatim reverse geocoder producing all places named "Suggested place" instead of actual place names. #​2182
  • Fix IDL-crossing route segmenter returning inconsistent coordinate types. unwrapCoordinates now always returns a uniform array-of-arrays structure. #​2038
  • Fix a migration taking too long. #​2375
  • Fix family sharing not including the requesting user's own location. #​2153
  • The "Destroy" button on the trip page is now orange. #​2348

v1.3.3

Compare Source

Added
  • Better user management with pagination, search, and filtering in the admin panel. Admins can now easily find and manage users based on email, registration date, and activity status.
Fixed
  • Points table now converts speed from m/s to km/h (or mph) using the user's distance unit preference. Previously raw m/s values were displayed with a "km/h" label. #​2337
  • Digest list API (GET /api/v1/digests) now returns distance as a structured object with meters, converted, and unit fields, matching the detail endpoint. Previously it returned raw meters, causing clients to display incorrect values. Breaking change: the distance field changed from an integer to an object. #​2336
  • Dead documentation links in v0.26.0 changelog entry now point to the correct URLs. #​2344
  • Filter out Immich and Photoprism api keys from logs to prevent accidental exposure. #​2368
  • Fix foreign key violation when deleting users with place_visits referencing visits.
  • Fix reverse geocoding job failing on points with nil timestamp or lonlat.
  • Fix unsupported archive format generating Sentry noise instead of a user-friendly notification.
  • Fix deadlock in reverse geocoding places upsert under concurrent Sidekiq workers.
  • Reduce Redis disk I/O by relaxing RDB snapshot frequency. Previously the default save 60 10000 rule caused a snapshot every ~60 seconds due to Sidekiq polling, generating tens of terabytes of disk writes over weeks. New defaults: snapshots every 15 minutes (10+ changes) or 5 minutes (100+ changes).
  • Reduce default Sidekiq concurrency from 10 to 5 threads. Most self-hosted instances don't need 10 workers and the extra threads increase Redis polling traffic.
  • Migration bug for version skippers. #​2362

v1.3.2

Compare Source

Important: Self-hosters are not limited in any way. All features remain fully available regardless of plan. The new Lite plan and related limitations apply only to Dawarich Cloud users. If you're self-hosting, you can ignore the Lite plan details below. Self-hosted instances will continue to have access to all features without any restrictions.

Added
  • Lite plan for Dawarich Cloud. Lite includes core tracking, map visualization (routes, points), stats, and the read API. Data view is limited to the last 12 months — older data is archived but can always be exported. Pro-only features: Heatmap, Fog of War, Scratch Map, Globe View, Immich/Photoprism integrations, public stats sharing, and write API (update/delete). Lite users can still create points via the API. Self-hosted instances are unaffected — all features remain fully available regardless of plan.
  • Timed layer previews for Lite users on the map. Toggling a Pro-only layer (Heatmap, Fog of War, Scratch Map) shows it for 20 seconds with a countdown, then auto-hides with an upgrade prompt.
  • Per-plan API rate limiting via rack-attack. Lite: 200 requests/hour, Pro: 1,000 requests/hour. Self-hosted instances are exempt. Rate-limited responses return 429 with Retry-After header.
  • Archival warning notifications for Lite users approaching the 12-month data window: in-app notification at 11 months, email at 11.5 months, archived confirmation at 12 months.
  • GET /api/v1/plan endpoint returning the user's current plan and feature availability.
  • X-Total-Points-In-Range and X-Scoped-Points response headers on the points API, allowing clients to detect when data is being windowed.
  • Branded OAuth buttons for Google and GitHub on the login page.
Changed
  • Numeric-only strings passed to timestamp API parameters (e.g. start_at, end_at) are now treated as Unix timestamps directly. Previously they were passed through Time.zone.parse, which could return unexpected results. If you were relying on the old behavior for numeric strings, update your API calls accordingly.
  • The user serializer now includes plan in the subscription object.

v1.3.1

Compare Source

Changed
  • User deletion now being done in the background to prevent request timeouts for users with large amount of data.
Fixed
  • Point speed in Map V2 is now correctly calculated from m/s to km/h or mph based on user preference. #​2308
  • Family members are now being loaded correctly on Map V2 when family layer is enabled. #​2250
  • Photos popups on Map V2 now show the photo timestamp in user's timezone. #​2310
  • Fix the issue preventing fresh app from starting. #​2304

v1.3.0

Compare Source

The Storage & Timeline Interaction Release

This release adds a dedicated motion_data column for transportation-relevant fields alongside the existing raw_data. Users can now set their timezone for accurate date/time display across the app. The Timeline feed in Map v2 gains richer map interaction: hovering a journey highlights its track with an animated border, clicking zooms to fit and selects it, and expanding a day shows visit markers even when the Visits layer is off. User data export/import is enhanced with a new v2 format using JSONL files and monthly splitting for large datasets, while remaining backward-compatible with the old format.

Added
  • Per-user timezone setting. Users can now select their timezone from Settings > General, and all dates/times across the app (including background jobs and API responses) will respect it. Defaults to the server's TIME_ZONE environment variable for existing users.
  • motion_data JSONB column on the points table for storing transportation-relevant fields separately from raw_data.
  • Background job (DataMigrations::BackfillMotionDataJob) to backfill motion_data from raw_data for existing points.
  • New Timeline feed in Map v2 Tools panel for browsing daily location history. Distances and speeds respect the user's distance unit preference (km/mi).
  • Clicking a track point (when "Show Points" is enabled) now displays point info (timestamp, battery, altitude, speed) in the track info panel instead of triggering a position update. Dragging a point still updates its position and triggers track recalculation.
  • Timeline-map interaction: hovering a journey entry in the Timeline feed now highlights the matching track on the map with the animated border and flow effect. Clicking a journey entry zooms the map to fit the track and keeps it selected. Expanding a day in the Timeline now temporarily shows visit markers for that day, even if the Visits layer is disabled.
  • AES-256-GCM encryption for raw data archives (format version 2). Set ARCHIVE_ENCRYPTION_KEY to use a custom key; otherwise derives from SECRET_KEY_BASE. Existing unencrypted archives (format version 1) are read transparently.
  • v2 export/import format with JSONL files and monthly splitting for large entities (points, visits, stats, tracks, digests). The new format streams data to avoid memory issues with large datasets, while remaining backward-compatible with v1 archives (data.json).
  • User data export now includes Tags, Taggings, Tracks (with embedded TrackSegments), Digests, and Raw Data Archives — previously missing from export/import, meaning users who exported and re-imported would lose these entities.
  • Tracks are exported with their original_path serialized as WKT and track_segments embedded as a nested array, preserving transportation mode detection data across export/import cycles.
  • Digests get a fresh sharing_uuid on import for security — old share links from the original user won't work for the importing user.
  • Raw Data Archives are exported with their attached gzip files, enabling full data restoration.
  • Failed imports now will have an error message shown to the user.
  • Pagination now looks nicer and more informative, indicating current page. #​2279
  • Imports and exports now can be sorted by name, file size, number of points, and creation date. #​2279
  • Lots of missing Swagger specs for the API endpoints have been added, improving API documentation and enabling better client generation. swagger.yaml is updated.
Changed
  • Transportation-relevant fields (motion, activity, action) are now stored in a dedicated motion_data column alongside raw_data, enabling efficient transportation mode detection.
  • All import sources now write both raw_data (full original payload) and motion_data (transportation-relevant fields).
  • The STORE_GEODATA setting now correctly controls whether geodata is written during reverse geocoding.
  • Dropped unused idx_points_user_city database index (304 MB) and replaced the full reverse_geocoded_at index (1,149 MB) with a smaller partial index covering only un-geocoded rows.
  • Selecting a track on Map v2 now always dims other tracks, regardless of whether the track has transportation mode segments.
  • Default map layers for new users changed from Routes + Heatmap to Tracks + Heatmap. Existing users' settings are unaffected.
  • Renamed the bottom-panel "Timeline" feature to "Replay" to avoid naming collision with the new Timeline feed sidebar.
  • Default value for RAILS_ENV in docker-compose.yml is now production instead of development
Fixed
  • Stats queries (daily distance, time of day) now correctly handle timezone conversion without double-converting from UTC.
  • Timezone validation in stats queries now properly resolves Rails timezone names to IANA identifiers.
  • Clicking on [Map] on Stats page now correctly respects the user's preferred map version (v1 or v2) instead of always linking to Map v1. #​2281

v1.2.0

Compare Source

Changed
  • Overall app performance in browser was improved
  • Docker images are now being built in parallel for both amd64 and arm64 architectures to speed up the build process. Thank you @​rtuszik!
Added
  • Map v2 requires WebGL support, so if user's browser doesn't support it or it's disabled, they will see a warning message with a link to the list of supported browsers.
  • New Insights API (GET /api/v1/insights) returning year overview with totals, activity heatmap, and streak data for the mobile app.
  • New Insights Details API (GET /api/v1/insights/details) returning year-over-year comparison and travel patterns for the mobile app.
  • New Digests API (GET/POST/DELETE /api/v1/digests) allowing the mobile app to list, view, generate, and delete yearly digests. Digest generation runs asynchronously via Sidekiq and returns 202 Accepted. Digest detail supports conditional GET (Last-Modified / 304 Not Modified).
Fixed
  • Scratch map layer is now working again on Map v2.
  • Colored routes on Map v2 are now working correctly. Zoom in closer to see colored segments. #​2254
  • Live mode on Map v2 is now working again.

v1.1.0

Compare Source

The Timeline Release

In Map V2 Tools, user can now enable Timeline tool, which allows to quickly navigate through time and see how their location changed throughout the day. It can also be used to replay a trip by clicking the play button. Timeline tool always spans across 24 hours, but you can change the date by clicking on the date picker. Timeline tool is available only on Map V2.

Added
  • Photos are now being clustered on the Map v2 to improve performance and usability when viewing large numbers of photos.
  • City statistics thresholds are now user-configurable: "Min Minutes in City" and "Max Gap Between Points" sliders in the Map v2 Settings panel. #​2207
  • New Timeline tool is added to Map V2. It allows user to quickly navigate through time and see how their location changed throughout the day. It can also be used to replay a trip by clicking the play button.
Fixed
  • The SSL Security Warning is now working correctly on the Immich and Photoprism integration forms.
  • Family members and Places layers are now being correctly remembered across page reloads on Map v2.
  • Immich returning 400. #​2222 #​2186
  • Points info on the Map V2 now shows time in 24h format and includes seconds. #​2172
  • Digests not being created for years earlier than 2000. #​2158
  • Tracks on Map V2 are now respecting the date filters correctly. #​2196
  • Undefined method .to_sym for nil in Sidekiq. #​2190
  • /api/v1/stats now works faster.
Changed
  • Zooming animation is disabled on Map V2 loading #​2219
  • Exporting points to GPX and GeoJSON now works better and faster for large numbers of points by processing the export in chunks to reduce memory usage. #​2161

v1.0.4

Compare Source

Fixed

v1.0.3

Compare Source

Fixed
Added
  • SMTP_STARTTLS environment variable to enable STARTTLS for SMTP connections. Disabled by default.

v1.0.2

Compare Source

The Insights, Transportation Mode Detection and Supporter Verification release

Quiet a few big things in this release! It starterted with the idea of adding the Insights page. I experimented with it a bit to see what kinds charts and visualizations we can already have based on the existing data. There were some, but one of the most exciting to me would be the ability to see the Activity Breakdown: now many hours I spent walking, driving and running. Spoiler: I didn't run that much last year :) Anyway, to get that, we needed to have transportation mode detection for tracks. So naturally I went ahead and implemented that as well. Now, not only we can see the activity breakdown, but also, on the Map V2, if you click on a track (Tracks layer should enabled), you will see the transportation modes for it. That's what I wanted for Dawarich for a long time, and I'm happy it's finally here! In the map settings panel, there is now Transportation Mode Detection section, where you can configure speed thresholds for each mode. By default, they are set to reasonable values, but you can tweak them as you wish. Changing the thresholds will recalculate modes for all tracks in the background, which may take a while depending on how many tracks you have.

Another thing introduced in this release, is support verification. Almost 150 people have supported us financially on Ko-fi, Patreon and GitHub Sponsors, and if you're one of them, on the Settings page you can now enter your email and verify your support. Verified supporters will get a special (disableable) badge in the navbar as a token of our appreciation. Thank you so much for supporting Dawarich!

Anyway, enjoy the release and don't forget to report any bugs you may find!

Added
  • App-level DNS cache with 5 minutes TTL to reduce DNS lookups and improve performance. #​2183
  • New Insights page with comprehensive analytics and visualizations:
    • Activity heatmap: GitHub-style contribution graph showing daily activity throughout the year
    • Activity streak: Track your current streak and longest streak of consecutive active days
    • Top visited locations: See your most frequently visited places for the selected year
    • Year comparison: Compare stats (distance, countries, cities, active days) with previous year
    • Activity breakdown: Visualize your activity distribution by transportation mode
    • Monthly digest: Detailed monthly statistics with travel patterns
    • Travel patterns: Time-of-day and day-of-week activity distribution
    • Movement wellness: Health-related insights based on your movement data
    • Location clusters: Geographic clustering of your visited locations
  • Transportation mode detection for tracks: Tracks are now automatically segmented by transportation mode (walking, cycling, driving, etc.) with configurable speed thresholds in settings. Modes are recalculated when threshold settings change.
  • Near real-time track generation: Tracks are now generated within ~45 seconds of receiving new points (via OwnTracks, Overland, or the Points API) using a Redis-based debouncer. This replaces the previous 4-hour polling cycle for most cases. Daily generation job frequency reduced from every 4 hours to every 12 hours as a fallback.
  • Track merging: Consecutive tracks that belong to the same journey are automatically merged when the gap between them is within the configured time threshold.
  • Email preferences moved to "General" tab in user settings for better organization.
Fixed
  • Remove assets before precompilation to prevent stale assets from being served. #​2187
  • undefined method 'to_sym' for nil in sidekiq #​2190
  • Tracks::BoundaryResolverJob now uses deterministic exponential backoff instead of random delays, and stops retrying after 5 attempts to avoid infinite rescheduling.
  • Hanging Sidekiq job #​2134
Changed
  • Daily track generation job runs every 12 hours instead of every 4 hours, since real-time generation handles most cases.

v1.0.1

Compare Source

Added
  • SSL certificate verification can now be disabled for Immich and Photoprism integrations to support self-signed certificates. A prominent security warning is displayed when this option is enabled. #​1645
Fixed
  • Photo timestamps from Immich are now correctly parsed as UTC, fixing the double timezone offset bug where times were displayed incorrectly. #​1752
  • Trip photo grids now update immediately after photos are imported, instead of showing cached/stale results for up to 24 hours. #​627 #​988
  • Immich API responses are now validated for content-type and JSON format before parsing, providing clear diagnostic error messages when the API returns unexpected responses. #​698 #​1013 #​1078
  • Response validator logs truncated response bodies (max 1000 chars) when JSON parsing fails, improving debugging capabilities.
  • GeoJSON formatted points now have correct timestamp parsed from raw_data['properties']['date'] field.
  • Reduce number of iterations during cache cleaning to improve performance.
  • Version in the navbar is now correct. #​2154
  • Dawarich can now be ran under a non-root user in Docker. #​1159
  • Fix an error on the Trips page when trip is created but no path is yet calculated. #​1426
  • Catch an error with invalid response during reverse-geocoding. #​1439
  • In the Immich integration form there are now required permissions listed: asset.read and asset.view. #​1730
  • A doc issue regarding suggesting new visits. #​1737
  • ALLOW_EMAIL_PASSWORD_REGISTRATION and OIDC_AUTO_REGISTER env vars are now being respected correctly. #​1972
  • Fog of War layer on Map V1 now properly re-appears when toggled off and on again without requiring a page refresh. #​2039
  • User's points_count counter cache is now properly updated when creating points via OwnTracks, Overland, and generic Points API. This fixes visit suggestions not working for users using HomeAssistant or similar integrations. #​2167
  • Removed redundant subscriptions to WS channel.
  • Live mode is working again on both map V1 and V2.
Changed
  • Map V2 is now the default map version for new users. Existing users will keep using Map V1 unless they change it in the settings.
  • Email preferences moved to dedicated "Emails" tab in user settings for better organization.
Removed
  • Tile Usage reporting feature and related prometheus metric have been removed due to low usage. #​1876

v1.0.0

Compare Source

The 1.0.0 release. Same as in 0.37.3, but with updated version number. We're aiming to provide more stable releases going forward.

All the issues that are currently open in Github will be addressed in the upcoming releases.

v0.37.3

Compare Source

Fixed
  • Routes are now being drawn the very same way on Map V2 as in Map V1. #​2132 #​2086 #​2121
  • RailsPulse performance monitoring is now disabled for self-hosted instances. It fixes poor performance on Synology. #​2139 #​2096
Changed
  • Map V2 points loading is significantly sped up.
  • Points size on Map V2 was reduced to prevent overlapping. #​2122
  • Points sent from Owntracks and Overland are now being created synchronously to instantly reflect success or failure of point creation.

v0.37.2

Compare Source

Fixed
  • Months are now correctly ordered (Jan-Dec) in the year-end digest chart instead of being sorted alphabetically.
  • Time spent in a country and city is now calculated correctly for the year-end digest email. #​2104
  • Updated Trix to fix a XSS vulnerability. #​2102
  • Map v2 UI no longer blocks when Immich/Photoprism integration has a bad URL or is unreachable. Added 10-second timeout to photo API requests and improved error handling to prevent UI freezing during initial load. #​2085
Added
  • In Map v2 settings, you can now enable map to be rendered as a globe.

v0.37.1

Compare Source

Fixed
  • The db migration preventing the app from starting.
  • Raw data archive verifier now allows having points deleted from the db after archiving.

v0.37.0

Compare Source

Added
  • In the beginning of the year users will receive a year-end digest email with stats about their tracking activity during the past year. Users can opt out of receiving these emails in User Settings -> Notifications. Emails won't be sent if no email is configured in the SMTP settings or if user has no points tracked during the year.
Changed
  • Added and removed some indexes to improve the app performance based on the production usage data.
Changed
  • Deleting an import will now be processed in the background to prevent request timeouts for large imports.
Fixed
  • Deleting an import will no longer result in negative points count for the user.
  • Updating stats. #​2022
  • Validate trip start date to be earlier than end date. #​2057
  • Fog of war radius slider in map v2 settings is now being respected correctly. #​2041
  • Applying changes in map v2 settings now works correctly. #​2041
  • Invalidate stats cache on recalculation and other operations that change stats data.

v0.36.4

Compare Source

Fixed
  • Fixed a bug preventing the app to start if a composite index on stats table already exists. #​2034 #​2051 #​2046
  • New compiled assets will override old ones on app start to prevent serving stale assets.
  • Number of points in stats should no longer go negative when points are deleted. #​2054
  • Disable Family::Invitations::CleanupJob no invitations are in the database. #​2043
  • User can now enable family layer in Maps v2 and center on family members by clicking their emails. #​2036

v0.36.3

Compare Source

Added
  • Setting ARCHIVE_RAW_DATA env var to true will enable monthly raw data archiving for all users. It will look for points older than 2 months with raw_data column not empty and create a zip archive containing raw data files for each month. After successful archiving, raw data will be removed from the database to save space. Monthly archiving job is being run every day at 2:00 AM. Default env var value is false.
  • In map v2, user can now move points when Points layer is enabled. #​2024
  • In map v2, routes are now being rendered using same logic as in map v1, route-length-wise. #​2026
Fixed
  • Cities visited during a trip are now being calculated correctly. #​547 #​641 #​1686 #​1976
  • Points on the map are now show time in user's timezone. #​580 #​1035 #​1682
  • Date range inputs now handle pre-epoch dates gracefully by clamping to valid PostgreSQL integer range. #​685
  • Redis client now also being configured so that it could connect via unix socket. #​1970
  • Importing KML files now creates points with correct timestamps. #​1988
  • Importing KMZ files now works correctly.
  • Map settings are now being respected in map v2. #​2012

v0.36.2

Compare Source

The Map v2 release

In this release we're introducing Map v2 based on MapLibre GL JS. It brings better performance, smoother interactions and more features in the future. User can select between Map v1 (Leaflet) and Map v2 (MapLibre GL JS) in the Settings -> Map Settings. New map features will be added to Map v2 only.

Added
  • User can select between Map v1 (Leaflet) and Map v2 (MapLibre GL JS) in the User Settings.
Fixed
  • Heatmap and Fog of War now are moving correctly during map interactions on v2 map. #​1798
  • Polyline crossing international date line now are rendered correctly on v2 map. #​1162
  • Place popup tags parsing (MapLibre GL JS compatibility)
  • Stats calculation should be faster now.

v0.36.1

Compare Source

Fixed
  • Exporting user data now works a lot faster and consumes less memory.
  • Fix the restart loop. #​1937 #​1975

v0.36.0

Compare Source

OIDC and KML support release

So, you want to configure your OIDC provider. If not — skip to the actual changelog. You're going to need to provide at least 4 environment variables: OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, OIDC_ISSUER, and OIDC_REDIRECT_URI. Then, if you want to rename the provider from "OpenID Connect" to something else (e.g. "Authentik"), set OIDC_PROVIDER_NAME variable as well. If you want to disable email/password registration and allow only OIDC login, set ALLOW_EMAIL_PASSWORD_REGISTRATION to false. After just 7 brand new environment variables, you'll never have to deal with passwords in Dawarich again!

Jokes aside, even though I'm not a fan of bloating the environment with too many variables, this is a nice addition and it will be reused in the cloud version of Dawarich as well. Thanks for waiting more than a year for this feature!

To configure your OIDC provider, set the following environment variables:

OIDC_CLIENT_ID=client_id_example
OIDC_CLIENT_SECRET=client_secret_example
OIDC_ISSUER=https://authentik.yourdomain.com/application/o/dawarich/
OIDC_REDIRECT_URI=https://your-dawarich-url.com/users/auth/openid_connect/callback
OIDC_AUTO_REGISTER=true # optional, default is false
OIDC_PROVIDER_NAME=YourProviderName # optional, default is OpenID Connect
ALLOW_EMAIL_PASSWORD_REGISTRATION=false # optional, default is true
Added
  • Support for KML file uploads. #​350
  • Added a commented line in the docker-compose.yml file to use an alternative PostGIS image for ARM architecture.
  • User can now create a place directly from the map and add tags and notes to it. If reverse geocoding is enabled, list of nearby places will be shown as suggestions.
  • User can create and manage tags for places.
  • Visits for manually created places are being suggested automatically, just like for areas.
  • User can enable or disable places layers on the map to show/hide all or just some of their visited places based on tags.
  • User can define privacy zones around places with specific tags to hide map data within a certain radius.
  • If user has a place tagged with a tag named "Home" (case insensitive), and this place doesn't have a privacy zone defined, this place will be used as home location for days with no tracked data. #​1659 #​1575
Fixed
  • The map settings panel is now scrollable
  • Fixed a bug where family location sharing settings were not being updated correctly. #​1940
Changed
  • Internal redis settings updated to implement support for connecting to Redis via unix socket. #​1706
  • Implemented authentication via GitHub and Google for Dawarich Cloud.
  • Implemented OpenID Connect authentication for self-hosted Dawarich instances. #​66

v0.35.1

Compare Source

Fixed

v0.35.0

Compare Source

⚠️ Important ⚠️

The default docker-compose.yml file has been updated to provide sensible defaults for self-hosted production environments. This should not break existing setups, but it's recommended to review your docker-compose.yml file and update it accordingly.

You can now set RAILS_ENV environment variable to production to run Dawarich in production mode.

Added
  • Selection tool on the map now can select points that user can delete in bulk. #​433
Fixed
  • Taiwan flag is now shown on its own instead of in combination with China flag.
  • On the registration page and other user forms, if something goes wrong, error messages are now shown to the user.
  • Leaving family, deleting family and cancelling invitations now prompt confirmation dialog to prevent accidental actions.
  • Each pending family invitation now also contains a link to share with the invitee.
Changed
  • Removed useless system tests and cover map functionality with Playwright e2e tests instead.
  • S3 storage now can be used in self-hosted instances as well. Set STORAGE_BACKEND environment variable to s3 and provide AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, AWS_BUCKET and AWS_ENDPOINT_URL environment variables to configure it.
  • Number of family members on self-hosted instances is no longer limited. #​1918
  • Export to GPX now adds speed and course to each point if they are available.
  • docker-compose.yml file updated to provide sensible defaults for self-hosted production environment.
  • .env.example file added with default environment variables.
  • Single Dockerfile introduced so Dawarich could be run in self-hosted mode in production environment.

v0.34.2

Compare Source

Fixed
  • Fixed a bug in UTM trackable concern. #​1909

v0.34.1

Compare Source

Fixed
  • Broken Stats page for users with no reverse geocoding enabled. #​1877
Changed
  • Date navigation on the map page is no longer shown as floating panel. It is now part of the top navigation bar to prevent overlapping with other map controls. #​1894 #​1881
Added
  • [Dawarich Cloud] Added support for UTM parameters during user registration. UTM parameters will be stored with the user record for marketing analytics purposes.

v0.34.0

Compare Source

The Family release

In this release we're introducing family features that allow users to create family groups, invite members, and share location data. Family owners can manage members, control sharing settings, and ensure secure access to shared information. Location sharing is optional and can be enabled or disabled by each member individually. Users can join only one family at a time. Location sharing settings can be set to share location for 1, 6, 12, 24 hours or permanently. Family features are now available only for self-hosted instances and will be available in the cloud in the future. When "Family members" layer is enabled on the map, family member markers will be updated in real-time.

Added
  • Users can now create family groups and invite members to join.
Fixed
  • Sign out button works again. #​1844
  • Fixed user deletion bug where user could not be deleted due to counter cache on points.
  • Users always have default distance unit set to kilometers. #​1832
  • All confirmation dialogs are now showing only once.
Changed
  • Minor versions of Dawarich are being built for ARM64 architecture as well again. #​1840
  • Importing process for Google Maps Timeline exports, GeoJSON and geodata from photos is now significantly faster.
  • The Map page now features a full-screen map.

v0.33.1

Compare Source

Changed
  • On the Trip page, instead of list of visited countries, a number of them is being shown. Clicking on it opens a modal with a list of countries visited during the trip. #​1731
Fixed
  • GET /api/v1/stats endpoint now returns correct 0 instead of null if no points were tracked in the requested period.
  • User import data now being streamed instead of loaded into memory all at once. This should prevent large imports from exhausting memory or hitting IO limits while reading export archives.
  • Popup for manual visit creation now looks better in both light and dark modes. #​1835
  • Fixed a bug where visit circles were not interactive on the map page. #​1833
  • Fixed a bug with stats sharing settings being not filled. #​1826
  • Fixed a bug where user could not be deleted due to counter cache on points. #​1818
  • Introduce apt-get upgrade before installing new packages in the docker image to prevent vulnerabilities. #​1793
  • Fixed time shift when creating visits manually. #​1679
  • Provide default map layer if user settings are not set.

v0.33.0

Compare Source

Fixed
  • Fix a bug where some points from Owntracks were not being processed correctly which prevented import from being created. #​1745
  • Hexagons for the stats page are now being calculated a lot faster.
  • Prometheus exporter is now not being started when console is being run.
  • Stats will now properly reflect countries and cities visited after importing new points.
  • GET /api/v1/points will now return correct latitude and longitude values. #​1502
  • Deleting an import will now trigger stats recalculation for affected months. #​1789
  • Importing process should now schedule visits suggestions job a lot faster.
  • Importing GPX files that start with <gpx tag will now be detected correctly. #​1775
  • Buttons on the map now have correct contrast in both light and dark modes.
Changed
  • Onboarding modal window now features a link to the App Store and a QR code to configure the Dawarich iOS app.
  • A permanent option was removed from stats sharing options. Now, stats can be shared for 1, 12 or 24 hours only.
  • User data archive importing now uploads the file directly to the storage service instead of uploading it to the app first.
  • Importing progress bars are now looking nice.
  • Ruby version was updated to 3.4.6.
Added
  • Based on preferred theme (light or dark), the map controls will now load with the corresponding styles.
  • [Dawarich Cloud] Added foundation for upcoming authentication from iOS app.
  • [Dawarich Cloud] Trial users can now create up to 5 imports. After that, they will be prompted to subscribe to a paid plan.
  • [Dawarich Cloud] Added Posthog analytics. Disabled by default, can be enabled with POSTHOG_ENABLED environment variable.

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Renovate Bot.

This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [freikin/dawarich](https://github.com/Freika/dawarich) | Kustomization | major | `0.32.0` → `1.7.11` | --- ### Release Notes <details> <summary>Freika/dawarich (freikin/dawarich)</summary> ### [`v1.7.11`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#1711---2026-05-31) [Compare Source](https://github.com/Freika/dawarich/compare/1.7.10...1.7.11) ##### Added - Onboarding "Load demo data" now seeds a fully populated `/map/v2` instantly: 30 days of Berlin + a Prague-weekend trip, \~80 visits with tags and places, and stats anchored to the current calendar month. "Remove demo data" wipes everything in one click while preserving anything you've confirmed, edited, or built on top of (visits, trips, places, tags adopted by user action stay). - Visits can now be manually assigned to one of your saved areas. When you do, the visit takes the area's name automatically — unless you've already given it a custom name, or you've also picked a place (a place name wins over an area name). Available via API now; UI to follow. [#&#8203;2577](https://github.com/Freika/dawarich/issues/2577) ##### Changed - Two unused indexes on the `points` table are dropped on upgrade; on large self-hosted instances this frees several GB of disk. - Areas now validate their geometry: radius must be greater than 0, latitude must be within -90…90, and longitude within -180…180. Invalid values are rejected instead of silently saved. - Bumped bundled gems (aws-sdk, devise, jwt, httparty, and others) to close 9 known CVEs. Self-hosters get the security fixes by upgrading. ##### Fixed - Cloud only: PostHog exception capture is enabled to help diagnose production errors. - Map v2 Timeline calendar now lights up days that have raw points even before Track or Visit generation has caught up, matching the Insights → Activity Overview calendar. [#&#8203;2579](https://github.com/Freika/dawarich/issues/2579) - Reverse-geocoding flood: duplicate per-point enqueues are now coalesced for 24 h via a Redis dedup key, retries are capped at 3, and the nightly sweep bypasses (and clears) the dedup so points whose retries were exhausted — or whose key still lingers — are picked up on the next run. - Map v2 visits layer now honours the selected date range. Since 1.7.10 the viewport-bounded visits fetch silently dropped the `start_at`/`end_at` filter on the backend, so all visits inside the viewport were rendered regardless of the date filter. [#&#8203;2817](https://github.com/Freika/dawarich/issues/2817) - `POST /api/v1/visits` no longer links a new visit to a place owned by another user. Passing a foreign `place_id` is ignored — the visit gets a place owned by the requester at the requested coordinates, and the response no longer echoes the other user's place id or coordinates. - Map v2 settings panel: "Apply Settings" now actually saves your changes. Points rendering mode, speed-colored routes, live mode, and fog-of-war toggles all persist on click and reload. Apply/Reset buttons moved above the Transportation Mode section so they sit inside the outer form. [#&#8203;2680](https://github.com/Freika/dawarich/issues/2680) - The app no longer trips firewall blocks by repeatedly checking family status when you're not part of a family. ### [`v1.7.10`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#1710---2026-05-26) [Compare Source](https://github.com/Freika/dawarich/compare/1.7.9...1.7.10) ##### ⚠️ Upgrade notes - Stops shorter than 5 minutes are no longer suggested as visits by default. Change the threshold under **Map V2 ->Settings -> Visit detection** if you want shorter stops included. - Smart density fill now works correctly (it was broken in 1.7.8–1.7.9). You may see more visit suggestions, especially on days when your tracker recorded points unevenly. ##### Added - Map v2 family member markers show name + last-seen datetime on hover. - Map v2 area info card exposes an **Edit** button that opens the area modal pre-filled — rename and resize existing areas without redrawing. Backed by a new `PATCH /areas/:id` route. - Map v2 selection tool: **Delete N Anomaly Points** button appears when the selection contains anomaly points, so you can clean up GPS noise without touching real points. - New **Minimum visit duration** setting under Settings → Visit detection (1–60 minutes, default 5). Raise it to ignore short drive-bys; lower it to catch brief errands. Replaces the hardcoded 3-minute floor that was the same for everyone in 1.7.8–1.7.9. ##### Changed - Map v2 side panel only closes via its X button. Create Visit / Create Area / Create Place and clicking a visit marker no longer dismiss the panel — visit/track clicks switch the active tab in place. - Map v2 Visits layer is viewport-bounded: enabling the layer and panning/zooming refetch via `selection=true&sw_lat=…&ne_lng=…` (debounced 400 ms) so a wide date range no longer hauls every visit at once. Timeline day-selection still loads the full day regardless of zoom. - Submitting "Create Visit" auto-enables the Visits layer so the new visit is immediately visible. ##### Fixed - Map v2 Place creation modal now closes on successful submit — the success path is no longer gated on a Turbo Stream side-effect, so the modal always dismisses after the place is saved. - Stats page no longer 500s after deleting an import or recalculating a month with no points. [#&#8203;2682](https://github.com/Freika/dawarich/issues/2682) - Timeline no longer fills with `traveled · 0m` rows from stationary keepalive clusters; commutes that absorb adjacent stationary points are correctly labeled by their moving mode (e.g. `drove`) rather than `stationary`. Hit **Settings → Recalculate** to apply to existing data. - New tracks now honor the user's enabled transportation modes during initial detection. Previously only the Recalculate path respected disabled modes, so a user who turned off (e.g.) cycling still saw cycling assigned to freshly built tracks. [#&#8203;2787](https://github.com/Freika/dawarich/issues/2787) - Visit detection no longer suggests stops at places you only drove past. Clusters where the device was moving faster than walking pace between real GPS points are rejected, so road centerlines on busy arterials stop showing up as "visits" to Kent Street / Leach Highway / etc. [#&#8203;2736](https://github.com/Freika/dawarich/issues/2736) [#&#8203;2775](https://github.com/Freika/dawarich/issues/2775) - Visit detection requires real GPS points (not interpolated density-fill ghost points) to meet the minimum-points threshold, so a single drive between two real fixes can't be inflated into a visit. [#&#8203;2736](https://github.com/Freika/dawarich/issues/2736) - Smart density fill now works correctly — it was silently disabled in 1.7.8 and 1.7.9. - Visit detection now respects your **Visit time threshold** setting when deciding where one visit ends and the next begins. The setting was previously ignored and always treated as 30 minutes. ### [`v1.7.9`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#179---2026-05-21) [Compare Source](https://github.com/Freika/dawarich/compare/1.7.8...1.7.9) ##### ⚠️ Upgrade notes - Run **Settings → Recalculate tracks & stats** to merge pre-existing overlapping tracks. [#&#8203;2463](https://github.com/Freika/dawarich/issues/2463) - Visit detection now creates one Place per visit (was up to 25 candidates). Use `GET /api/v1/visits/:id/possible_places` and `POST /api/v1/visits/:id/select_place` for alternatives. The `place_visits` table will be dropped in a follow-up release. - Run after deploy (both safe to re-run): 1. `bin/rails dawarich:backfill_place_names` 2. `bin/rails dawarich:cleanup_suggested_places` ##### Added - Map v2 **Hexagons** layer (Pro) — H3 cell heatmap, zoom-adaptive resolution. [#&#8203;2568](https://github.com/Freika/dawarich/issues/2568) - Download a trip's points as GPX or GeoJSON from the trip page. [#&#8203;2400](https://github.com/Freika/dawarich/issues/2400) - OIDC PKCE support via `OIDC_PKCE_ENABLED=true` (off by default). [#&#8203;2282](https://github.com/Freika/dawarich/issues/2282) - `POST /api/v1/visits/:id/select_place` — assign a Photon candidate to a visit. - Visits auto-clean their previous Place on reassignment/destroy when it has no notes, tags, or other references. ##### Changed - `GET /api/v1/visits/:id/possible_places` returns live Photon suggestions; the assigned place comes first with its `id`, others have `id: null`. - `GET/POST /api/v1/places/nearby` now include `id`, `source`, and `geodata` per item (additive). - `Place#has_many :visits` is now `dependent: :nullify` — deleting a Place no longer deletes its visits. ##### Fixed - `select_place` validates lat/lon bounds (422 on out-of-range) and serializes concurrent calls via PG advisory lock to prevent duplicate Places. - `select_place` dedups by name + 50 m proximity instead of `geodata` JSONB, working regardless of `STORE_GEODATA`. - Self-hosted instances no longer 500 on Stats/Insights when `JWT_SECRET_KEY` is unset; `/trial/upgrade` now redirects home. [#&#8203;2682](https://github.com/Freika/dawarich/issues/2682) - Imports table shows duplicate-skip counts and notifies when an import is all duplicates. [#&#8203;2721](https://github.com/Freika/dawarich/issues/2721) - Family members' positions update in real time instead of every 60 s. [#&#8203;2733](https://github.com/Freika/dawarich/issues/2733) - Immich/Photoprism photos reappear after a transient empty response (no more 30-minute hidden window). [#&#8203;1071](https://github.com/Freika/dawarich/issues/1071), [#&#8203;784](https://github.com/Freika/dawarich/issues/784) - Map v2 **Select Area** includes anomaly points so bulk-delete works on them. [#&#8203;2476](https://github.com/Freika/dawarich/issues/2476) - Map v2 area-selection: restored the "Delete N Points" action that disappeared in 1.7.8. Pro / self-hosted, confirmation prompt, capped at 5,000 per request; recalculates affected tracks and monthly stats. [#&#8203;2754](https://github.com/Freika/dawarich/issues/2754) - Timeline day click no longer corrupts the Search end-time; fields match date-picker minute precision. [#&#8203;2624](https://github.com/Freika/dawarich/issues/2624) - Map v2 speed-color gradient editor saves and applies correctly. [#&#8203;2120](https://github.com/Freika/dawarich/issues/2120) - Trips respect the GPS anomaly filter for route, distance, and countries. Run **Recalculate trip** to refresh existing trips. [#&#8203;2474](https://github.com/Freika/dawarich/issues/2474) - Bulk and single point deletion recalculate affected tracks. [#&#8203;2496](https://github.com/Freika/dawarich/issues/2496) - "Recalculate tracks & stats" and "Re-evaluate past data" skip anomaly points, matching real-time generation. [#&#8203;2630](https://github.com/Freika/dawarich/issues/2630) - Trip photos appear on sub-day trips (timestamps no longer truncated to dates). [#&#8203;2708](https://github.com/Freika/dawarich/issues/2708) - Tracks no longer split into overlapping segments when points arrive late/out of order; same-device overlaps auto-merge on the next run. [#&#8203;2463](https://github.com/Freika/dawarich/issues/2463) - Same-tracker boundary merging skips tracks more than 5 km apart (no more GPS-jump fusion). - Visit place cleanup runs in `Places::DeleteIfOrphanJob` instead of inline `after_commit`. - `DataMigrations::BackfillPlacesUserIdJob` correctly excludes just-assigned places from the orphan-delete pass. - Real-time track boundary detector skips the per-track scan when no untracked points exist. - Bulk visit suggestion accepts both `user_id:` and `user_ids:` to survive stale Sidekiq jobs. [#&#8203;2740](https://github.com/Freika/dawarich/issues/2740) - `RemoveUnusedIndexes` migration drops invalid `points` indexes left by failed `REINDEX CONCURRENTLY` before removing unused ones. [#&#8203;2124](https://github.com/Freika/dawarich/issues/2124) - Vendored `h3-js` retains its upstream Apache-2.0 license header. - Insights "Top Visited Locations" no longer underreports days for multi-month totals (e.g. 133 days rendered as "4 days"). [#&#8203;2743](https://github.com/Freika/dawarich/issues/2743) ### [`v1.7.8`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#178---2026-05-16) [Compare Source](https://github.com/Freika/dawarich/compare/1.7.7...1.7.8) ##### ⚠️ Upgrade notes - **Self-hosters running OIDC-only sign-in:** the `ALLOW_EMAIL_PASSWORD_REGISTRATION` env var no longer doubles as a login gate. Email/password sign-in is now controlled by the new `ALLOW_EMAIL_PASSWORD_LOGIN` env var (defaults to `true`). To preserve OIDC-only sign-in after upgrade, set `ALLOW_EMAIL_PASSWORD_LOGIN=false`. - **Visit detection rewrite:** the next nightly run after upgrade will produce different suggested visits. Confirmed visits and named places are preserved; only suggestions change. - **Places backfill (irreversible):** the place-ownership migration backfills `places.user_id` from owning visits and **permanently deletes any place that has no linked visits**. Multi-user instances and instances with orphan rows from prior bugs should run `rake places:backfill_user_id_dry_run` first to see assigned/deleted counts. Single-user self-hosted instances are unaffected. The follow-up release will add a `NOT NULL` constraint, so any new places created between this release and the next must carry a `user_id`. - **Historical tracks auto-recalculate on upgrade.** A background job backfills `points.tracker_id` from each point's `raw_data` (Google `deviceTag`, OwnTracks `tid` — both stored as-is) or its `import_id` (`legacy-import-<id>`, visible in points and tracks API responses for backfilled rows), then recalculates stats, tracks, and digests for every user with tracks predating the fix. The enqueue job is Sidekiq-retry-safe and re-checks its predicate on each retry, so a crashed/restarted Sidekiq resumes cleanly without re-processing finished users. New installs are unaffected. - **Expect a temporary spike during the recalc window.** Per-user jobs are staggered over the first hour; expect elevated Sidekiq queue depth, CPU, and database IO until they finish, with duration scaling by user count and history length. Tracks may appear merged on the map for individual accounts until their recalc completes. - **2FA lockout recovery on instances without SMTP:** the new 10-attempt 2FA lockout sends an unlock email; self-hosters without SMTP configured will not receive it. Locked users can be unlocked from the Rails console with `User.find(<id>).reset_failed_otp_attempts!`, or by completing the password-reset flow (which also clears the lockout). ##### Changed - Visit detection now uses PostGIS spatial clustering for faster, more accurate stops; the iteration-based detector is removed. - Places are now strictly per-user. Suggestion, photo-geotagging, and reverse-geocoding all use your own place catalogue exclusively; no places are shared across users. Existing shared places have been backfilled to their most-active owner. Self-hosted single-user instances see no behaviour change. ##### Added - "Re-run detection on full history" button under Settings → Visits. Confirmed visits and named places are preserved. - Account lockout after 10 failed 2FA attempts (30-minute auto-unlock or password reset). Applies to both the mobile API (`POST /api/v1/auth/otp_challenge`) and the web sign-in flow. Backup codes still work during a lockout so users with one stored can recover immediately. A notification email is sent to the account owner when a lockout is triggered. [#&#8203;2575](https://github.com/Freika/dawarich/issues/2575) ##### Fixed - Fix support of FIT files from Garmin Connect. [#&#8203;2686](https://github.com/Freika/dawarich/issues/2686) - The Anomalies map layer no longer requires manually toggling off and on after a page reload or timeframe change. The toggle state is restored on reload, and the layer refetches anomalies for the active date range. [#&#8203;2568](https://github.com/Freika/dawarich/issues/2568) - Email/password login is now shown alongside the OIDC button on self-hosted instances by default, instead of being hidden whenever OIDC is configured. Operators who want to enforce OIDC-only sign-in can set `ALLOW_EMAIL_PASSWORD_LOGIN=false`. See the upgrade note above. [#&#8203;2495](https://github.com/Freika/dawarich/issues/2495) - Suggested visits at residential addresses are no longer stuck on the placeholder name "Suggested place" indefinitely. The nightly place-naming job now assembles a name from street, house number, city, and state when the geocoder response has no top-level place name — matching how new visits are named at creation time. [#&#8203;1711](https://github.com/Freika/dawarich/issues/1711) - Photos imported from Immich now display at the correct time on Map v2 and import with the correct UTC timestamp, regardless of the host server's timezone or the photo's capture timezone. Previously, photos taken outside the server's timezone could appear up to 24 hours off. Existing imports keep their old timestamps; to fix already-imported photos, re-run the Immich import from **Settings → Integrations → Immich**. The photos API now exposes a `capturedAt` field with the canonical UTC instant (from Immich's `fileCreatedAt` / PhotoPrism's `TakenAt`) alongside the existing `localDateTime` key, which continues to return the source's wall-clock value. Map v2 uses `capturedAt` for time display. [#&#8203;2253](https://github.com/Freika/dawarich/issues/2253) - Confirmed and declined visits inside an area or assigned to a place are no longer reverted to "suggested" — and any name you gave them is no longer overwritten — by the nightly visit-recompute job. [#&#8203;2048](https://github.com/Freika/dawarich/issues/2048), [#&#8203;2484](https://github.com/Freika/dawarich/issues/2484) - GPX import now streams the file rather than loading the entire XML into memory, so multi-hundred-MB GPX files (e.g. long-running activity exports) no longer OOM the Sidekiq worker. [#&#8203;2296](https://github.com/Freika/dawarich/issues/2296) - Viewing an import on Map v2 or the Points page now selects the import's full date range, instead of defaulting to today or the last month. [#&#8203;1857](https://github.com/Freika/dawarich/issues/1857) - Imports (GPX, KML, GeoJSON, FIT, TCX, Google Timeline, OwnTracks .rec, CSV, Polarsteps) now generate tracks for the imported point range. To rebuild every track in a range — including manually-corrected ones — use Map v2 → Settings → **Recalculate tracks & stats**. [#&#8203;2224](https://github.com/Freika/dawarich/issues/2224) - Tracks recorded by multiple devices on the same account (phone + watch + GPS unit) no longer get merged into one zigzagging track on the map. Each device's points are kept on their own track, and Map v2 draws routes per-device. [#&#8203;337](https://github.com/Freika/dawarich/issues/337), [#&#8203;1726](https://github.com/Freika/dawarich/issues/1726) - Importing a GPX file with multiple `<trk>` or `<trkseg>` elements no longer merges them into a single track when timestamps overlap or arrive out of order (e.g. Garmin daily-file exports); each track and segment becomes its own track. When a `<trk>` declares `<src>`, that value is SHA1-hashed and used as a stable device identity so consecutive imports of the same device stay on the same track stream; with only `<name>`, identity is scoped to the import filename to prevent unrelated devices from colliding. [#&#8203;1726](https://github.com/Freika/dawarich/issues/1726) - Importing a Google Records.json export with positions from more than one device no longer "teleports" between devices and inflates distance travelled; points are scoped per-device using Google's `deviceTag`. [#&#8203;337](https://github.com/Freika/dawarich/issues/337) - The `tracks` unique index now scopes by `tracker_id` (via a `COALESCE(tracker_id, '')` expression so legacy NULL-tracker rows still can't duplicate), letting two devices produce a journey with the same start/end timestamps on one account without colliding on insert. ### [`v1.7.7`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#177---2026-05-09) [Compare Source](https://github.com/Freika/dawarich/compare/1.7.6...1.7.7) ##### ⚠️ Breaking changes **Prometheus metrics backend migrated to Yabeda.** Dawarich now uses the Yabeda monitoring framework instead of `discourse/prometheus_exporter`. Self-hosters who scrape Prometheus metrics from Dawarich should update their configuration. If Sidekiq is unreachable during a scrape, web returns its own metrics only and logs a warning. Prometheus sees a momentary gap in `sidekiq_*` rather than a failed scrape. **Scrape target** (requires HTTP basic auth with `METRICS_USERNAME` / `METRICS_PASSWORD`): - Web: `http://dawarich_app:3000/metrics` **Custom `dawarich_archive_*` metric names are unchanged.** Dashboards and alerts built on these metrics continue to work. **Infrastructure metric names have changed.** If you have dashboards built on `ruby_*`, `active_record_*`, or similar metrics emitted by `prometheus_exporter`, you must update them: | Category | Before | After | | ---------------------------------------------------- | ------------------------------------------- | ----------------------------------------------------------- | | HTTP requests (total) | `ruby_http_requests_total` | `rails_requests_total` | | HTTP request duration | `ruby_http_request_duration_seconds` | `rails_request_duration` | | Sidekiq job count | `ruby_sidekiq_jobs_total` | `sidekiq_jobs_executed_total` | | Sidekiq failed jobs | `ruby_sidekiq_failed_jobs_total` | `sidekiq_jobs_failed_total` | | Sidekiq job duration | `ruby_sidekiq_job_duration_seconds` | `sidekiq_job_runtime_seconds` | | Sidekiq queue latency | `ruby_sidekiq_queue_latency_seconds` | `sidekiq_queue_latency` | | Sidekiq queue backlog | `ruby_sidekiq_queue_backlog_total` | `sidekiq_jobs_waiting_count` | | Sidekiq process count | `ruby_sidekiq_process_count` | `sidekiq_active_processes` | | Puma workers | `ruby_puma_workers` | `puma_workers` | | Puma backlog | `ruby_puma_request_backlog` | `puma_backlog` | | Puma thread pool capacity | `ruby_puma_thread_pool_capacity` | `puma_pool_capacity` | | ActiveRecord pool | `active_record_connection_pool_connections` | `activerecord_connection_pool_size` | | Process/GC (e.g. `ruby_rss`, `ruby_heap_live_slots`) | emitted | not emitted by default; add a custom Yabeda group if needed | **Removed environment variables:** - `PROMETHEUS_EXPORTER_HOST`, `PROMETHEUS_EXPORTER_HOST_SIDEKIQ` — no longer needed. Metrics are served in-process by each application. **Retained environment variables:** - `PROMETHEUS_EXPORTER_ENABLED` — still the single on/off switch. - `METRICS_USERNAME`, `METRICS_PASSWORD` — unchanged. - `PROMETHEUS_EXPORTER_PORT` — port the in-process Sidekiq metrics exporter binds to (default 9394). **New optional environment variable:** - `SIDEKIQ_METRICS_URL` — internal URL the web container uses to fetch Sidekiq metrics (default `http://dawarich_sidekiq:9394/metrics`). Override on Dokku, Kubernetes, or any deployment where the worker container's hostname differs from the docker-compose default. **Prometheus scrape config example:** ```yaml scrape_configs: - job_name: dawarich metrics_path: /metrics basic_auth: username: prometheus # set via METRICS_USERNAME password: prometheus # set via METRICS_PASSWORD static_configs: - targets: ['dawarich_app:3000'] ``` ##### Fixed - Fixed monthly stats failing with a "Stats update failed" notification when the month's distance exceeded the int4 limit (2,147,483,647 m ≈ 2.15M km). Affected months stayed stuck on the prior value until recalculated. [#&#8203;1996](https://github.com/Freika/dawarich/issues/1996) - 500 error on the imports page. [#&#8203;2683](https://github.com/Freika/dawarich/issues/2683) - Insights weekly pattern now refreshes after monthly stats change, instead of showing a stale snapshot until the next monthly digest job runs. [#&#8203;2478](https://github.com/Freika/dawarich/issues/2478) - Points with no reverse-geocoding result (ocean, wilderness) are now marked as attempted instead of being re-queued every nightly run; use "Start Reverse Geocoding" to retry after switching providers. [#&#8203;2271](https://github.com/Freika/dawarich/issues/2271) - Activity detection now falls back to displacement when the tracker reports 0 m/s, so OwnTracks Significant Change mode and similar low-power setups stop misclassifying real movement as stationary. Run **Map v2 → Settings → Recalculate tracks & stats** to apply to existing tracks. [#&#8203;2390](https://github.com/Freika/dawarich/issues/2390) - Redis no longer balloons (multi-GB) when browsing photos with Immich or Photoprism connected. Photo thumbnails are no longer copied into the server-side Redis cache; the browser caches them directly via `Cache-Control` instead. [#&#8203;1609](https://github.com/Freika/dawarich/issues/1609) - Drag-selecting a region on the map now includes visits attached to your saved Areas (Home, Work, etc.), instead of silently dropping area-only visits from the visit tray. [#&#8203;2420](https://github.com/Freika/dawarich/issues/2420) ### [`v1.7.6`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#176---2026-05-09) [Compare Source](https://github.com/Freika/dawarich/compare/1.7.5...1.7.6) ##### Added - Map v2 timeline: bulk Confirm and Decline in selection mode, capped at 500 visits per request. - Trip **Recalculate** button: refresh path, distance, and visited countries on demand. The page updates automatically when it finishes; repeat clicks within 60 seconds are ignored. [#&#8203;2478](https://github.com/Freika/dawarich/issues/2478) - Google's "Timeline Edits.json" type of Takeout export is now recognized and imported directly. ##### Fixed - Monthly stats now bucket points by your local timezone instead of UTC — fixes phantom day-1 spikes from overnight imports and undercounts near month boundaries. [#&#8203;2546](https://github.com/Freika/dawarich/issues/2546) - Slider knobs in settings and map-layer toggles now move on click instead of staying left while only the track color changes. [#&#8203;2566](https://github.com/Freika/dawarich/issues/2566) - Stats and tracks recalculation no longer crashes in midnight-DST timezones (e.g. `America/Santiago`). [#&#8203;2638](https://github.com/Freika/dawarich/issues/2638) - Mobile map fills the dynamic viewport and respects iPhone safe-area insets — navbar below the notch, date selector / demo banner above the home indicator and Safari URL bar. [#&#8203;1873](https://github.com/Freika/dawarich/issues/1873) - Transactional emails now build links with HTTPS, fixing reset links that arrived as `http://` even when the site was served over HTTPS via reverse proxy. [#&#8203;1469](https://github.com/Freika/dawarich/issues/1469) - SMTP authentication and timeouts (`SMTP_AUTHENTICATION`, `SMTP_OPEN_TIMEOUT`, `SMTP_READ_TIMEOUT`) are now env-configurable — Office 365 and similar no longer need a custom initializer. [#&#8203;1469](https://github.com/Freika/dawarich/issues/1469) - Export zip entry timestamps no longer drift across timezones (was 7h ahead on US Pacific). Applies to per-export and full-archive downloads. [#&#8203;2639](https://github.com/Freika/dawarich/issues/2639) - Map v2 heatmap stays visible at city and street zoom instead of fading out past city level. [#&#8203;2087](https://github.com/Freika/dawarich/issues/2087) - Map v2 search panel: visits list no longer flashes and disappears after picking a location — a stale debounced fetch was overwriting it. [#&#8203;2394](https://github.com/Freika/dawarich/issues/2394) - Transportation-mode sliders (Walking/Cycling/Driving max speed, Min flight distance) in Map v2 settings now respect your unit of measurement (mph/mi when miles are selected). [#&#8203;2634](https://github.com/Freika/dawarich/issues/2634) - Self-hosting docs (Docker, Synology, intro) now show the correct default password `safepassword` instead of `password`. [#&#8203;2636](https://github.com/Freika/dawarich/issues/2636) - Map v2 light/white/grayscale basemaps: dense point sequences no longer camouflage as thin white lines — strokes are now dark on light basemaps, white on dark. [#&#8203;2387](https://github.com/Freika/dawarich/issues/2387) - Activity Overview heatmap opens centered on your most recent active day instead of January 1 — no blank future months on mobile early in the year. [#&#8203;2228](https://github.com/Freika/dawarich/issues/2228) - Map v2 timeline calendar: a selected day shows visits in your profile timezone — late-evening visits no longer leak across day tabs. [#&#8203;2619](https://github.com/Freika/dawarich/issues/2619) - Renaming a suggested visit in the timeline now confirms it and saves the typed name as a place under your account. [#&#8203;2621](https://github.com/Freika/dawarich/issues/2621) - User-data archive import no longer lets the payload overwrite a track's `user_id`, `id`, or timestamps. - Track generation no longer creates duplicate tracks — multiple background jobs (daily, realtime, recalc, import) could previously produce the same track per time window, leaving 2–3 copies on your map. Run **Map v2 → Settings → Recalculate tracks & stats** once after upgrading to recompute from the merged points. [#&#8203;2677](https://github.com/Freika/dawarich/issues/2677) - Heatmap on Map V2 looks a lot better than before - In notifications section of navbar only "99+" is shown when there are more than 99 notifications, instead of the actual number. ### [`v1.7.5`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#175---2026-05-04) [Compare Source](https://github.com/Freika/dawarich/compare/1.7.4...1.7.5) ##### Added - Manual transportation-mode correction per segment in the map view, with a one-click reset to auto-detection. Manually-corrected segments are preserved across re-classification. [#&#8203;2405](https://github.com/Freika/dawarich/issues/2405) - Per-user transportation-mode allowlist in the map settings panel. Disabled modes are excluded from auto-detection going forward; existing tracks stay as they are until you press "Re-classify my history". [#&#8203;2405](https://github.com/Freika/dawarich/issues/2405) ##### Fixed - Track duration and average speed are now refreshed whenever a track's path is rebuilt (e.g. after a merge), instead of keeping their pre-merge values. To heal tracks already affected, click Map v2 → Settings → **Recalculate tracks & stats** once after upgrading. - Visited-country statistics no longer count countries that were merely flown over. Points moving faster than 500 km/h are now excluded from the country and city aggregation. Trains and high-altitude cities (Denver, Mexico City, La Paz, Lhasa, …) continue to count as visited. Previously-saved monthly stats are not recomputed automatically — re-run stats calculation to refresh historic months. [#&#8203;1917](https://github.com/Freika/dawarich/issues/1917) - Server-rendered timestamps (Points, Places, Imports, Exports, account settings, trial banner) now display in the user's profile timezone, matching the Maps tab. Previously, the time and tooltip could fall back to the server's default zone, drifting by hours. Invalid stored timezones no longer raise. [#&#8203;1824](https://github.com/Freika/dawarich/issues/1824) - "Start Reverse Geocoding" now actually re-runs for every point in your database — previously it silently skipped any point that had already been geocoded, even though the button promised a full re-run. [#&#8203;2141](https://github.com/Freika/dawarich/issues/2141) - Map v2 date-navigation arrows (`<` / `>`) now shift the time window by exactly one day, matching Map v1. Previously they shifted by the current window width, so a 00:00–23:59 selection paged back by 23h59m instead of 24h. [#&#8203;2548](https://github.com/Freika/dawarich/issues/2548) - Daily track generation now merges a newly-created track with the immediately-preceding existing track when they are seconds apart, instead of leaving a permanent split each time live tracking briefly pauses. To heal splits that have already accumulated in your database, open Map v2 → Settings → **Recalculate tracks & stats** once after upgrading; from then on the daily job will keep adjacent tracks merged on its own. [#&#8203;2265](https://github.com/Freika/dawarich/issues/2265) - The Maps v1 area-drawing toolbar no longer disappears after toggling the Areas layer or refreshing the page. [#&#8203;1938](https://github.com/Freika/dawarich/issues/1938) - Trip page no longer shows an indefinite "loading" spinner in the Countries card when no country data is available; an em-dash placeholder is shown instead, matching the modal's "No countries data available yet." message. [#&#8203;1831](https://github.com/Freika/dawarich/issues/1831) - Trips that cross midnight in the user's timezone now contribute distance and time to both calendar days, instead of being attributed entirely to the day they started. The timeline day summary, the calendar heat grid, and adjacent-day km totals all reflect the trip on each day it actually spans. [#&#8203;2544](https://github.com/Freika/dawarich/issues/2544), [#&#8203;2546](https://github.com/Freika/dawarich/issues/2546) ##### Changed - "Start Reverse Geocoding" and "Continue Reverse Geocoding" now enqueue Sidekiq jobs in bulk batches of 1,000 instead of one round-trip per point. For large databases (millions of points) this drops the enqueue phase from minutes to seconds. Per-point geocoder rate-limit behavior is unchanged. [#&#8203;2141](https://github.com/Freika/dawarich/issues/2141) - Map (Leaflet) on mobile browsers no longer clips the bottom of the map and routes after the address bar collapses or the date is changed. [#&#8203;2000](https://github.com/Freika/dawarich/issues/2000) - Visit suggestions are now generated from live tracking (Dawarich iOS app, OwnTracks, Overland, Traccar), not just from imports. Previously, only imported data triggered visit detection. Visit suggestion still requires a configured reverse geocoder (Photon, Geoapify, Nominatim, or LocationIQ). [#&#8203;1749](https://github.com/Freika/dawarich/issues/1749), [#&#8203;1966](https://github.com/Freika/dawarich/issues/1966) ### [`v1.7.4`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#174---2026-05-03) [Compare Source](https://github.com/Freika/dawarich/compare/1.7.3...1.7.4) ##### Fixed - Cloud Trial users are no longer limited to 10 MB import files. - Self-hosted instances no longer need to set `JWT_SECRET_KEY`. [#&#8203;2570](https://github.com/Freika/dawarich/issues/2570) - QR sizes are fixed. [#&#8203;2479](https://github.com/Freika/dawarich/issues/2479) - Family owners can now remove other members directly from the family page. [#&#8203;2555](https://github.com/Freika/dawarich/issues/2555) - Insights and statistics now agree on the number of countries visited per month. [#&#8203;2581](https://github.com/Freika/dawarich/issues/2581) - The default password for the demo account has been changed to `safepassword`. The old default `password` prevented seeds from running due to the new 12-character minimum password length validation. Existing users were not affected. [#&#8203;2593](https://github.com/Freika/dawarich/issues/2593) ### [`v1.7.3`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#173---2026-05-02) [Compare Source](https://github.com/Freika/dawarich/compare/1.7.2...1.7.3) ##### Security Fixes for several issues found in a static-analysis security audit. None of these have a known in-the-wild exploit, but operators should still upgrade. - Path traversal in user-data archive import (`POST /settings/users/import`) — a malicious archive whose JSON manifest referenced files via `..` could attach arbitrary host files (e.g. `config/master.key`, `/proc/self/environ`) to the user's import record and download them. - OAuth web callback (Google / GitHub / OIDC) used to silently link an existing local-password account to an incoming OAuth identity on email match, with no `email_verified` check or consent. The web flow now mirrors the mobile-API flow: the user must confirm the link. - SSRF blocklist for the `immich_url` / `photoprism_url` settings missed RFC1918, CGNAT, IPv6 ULA, multicast and reserved ranges. Cloud installs now reject those; self-hosted gets a smaller blocklist that still catches non-http schemes, cloud-metadata IPs and multicast while permitting LAN / loopback / Docker DNS. - Web OTP challenge (`POST /users/otp_challenge`) had no rate limit, leaving 2FA brute-forceable given a leaked password. Added rack-attack throttles (5/15min per session, 20/15min per IP) plus an in-controller cap of 5 invalid attempts. - Stored XSS via `family.name` rendered through `notification.content.html_safe` is now passed through `sanitize`. - Disabling 2FA now requires both the password AND a current authenticator code (or backup code), on web and API. - Default `prometheus` / `prometheus` credentials for `/metrics` are gone — the endpoint refuses until both `METRICS_USERNAME` and `METRICS_PASSWORD` are set. - Devise minimum password length raised from 6 to 12. - API keys generated by new accounts are 256-bit (was 128-bit). Existing keys keep working. - OwnTracks point ingest replaces a blanket `params.permit!` with the documented field whitelist. ##### Added - Polarsteps support — `locations.json` and segment-array exports now import directly. - Files with unsupported extensions are rejected in the browser before upload starts. - Clear, actionable error messages when an unsupported file is uploaded — points to the right file in your Takeout instead of a generic "Unable to detect file format". ##### Changed - Monthly and yearly email digests now hide countries and cities with 1 hour or less of time spent, so the Top Countries / Top Cities lists no longer get padded with `0h` and `1h` entries. - Disabling 2FA via `/settings/two_factor` now asks for both your password and a current authenticator code (or one of your backup codes). The web form has been updated; API clients must send `password` AND `otp_code` to `DELETE /api/v1/users/me/two_factor`. - Setting a new password (signup, password change, password reset) now requires at least 12 characters. Existing shorter passwords still work for sign-in. - **`/metrics` endpoint**: if you scrape Prometheus metrics, set `METRICS_USERNAME` and `METRICS_PASSWORD` in your environment. With them unset, `/metrics` now returns 503. - **OAuth (web) without SMTP**: a user signing in via OIDC/GitHub/Google for the first time when an email-matching local account already exists is no longer auto-linked. They are sent to a password-challenge page where entering their existing Dawarich password completes the linking. **No SMTP setup is required for this path.** A "send me a confirmation email instead" button on the same page is the SMTP-based fallback for users who have forgotten their password. - **Self-hosted Immich/PhotoPrism URLs**: the next save of these settings re-validates the URL. Configurations using non-http schemes, `0.0.0.0`, multicast IPs, or the cloud-metadata `169.254.169.254` will be rejected. Standard LAN / Docker / loopback URLs continue to work. ##### Fixed - Google Phone Takeout `location-history.json` now imports reliably. ([#&#8203;2437](https://github.com/Freika/dawarich/issues/2437), [#&#8203;2587](https://github.com/Freika/dawarich/issues/2587)) - KMZ files from a wider range of exporters now import. - Imports no longer fail intermittently with `No such file or directory @&#8203; rb_sysopen - /tmp/...`. [#&#8203;2446](https://github.com/Freika/dawarich/issues/2446) - FIT files from non-Garmin devices and phone apps now import. - CSV files with quoted headers (e.g. `"Latitude","Longitude"`) are now recognized. - Empty (0-byte) uploads now produce a clear error instead of crashing. - Upgrades from older versions (≤ 1.3.1) no longer crash during `db:migrate`. [#&#8203;2576](https://github.com/Freika/dawarich/issues/2576) ### [`v1.7.2`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#172---2026-04-29) [Compare Source](https://github.com/Freika/dawarich/compare/1.7.1...1.7.2) ##### Removed - `rails_pulse` performance monitoring has been removed entirely. The gem, its initializer (`config/initializers/rails_pulse.rb`), the `/rails_pulse` route mount, the scheduled `RailsPulse::SummaryJob` and `RailsPulse::CleanupJob` cron entries, and all `rails_pulse_*` tables are gone. A new migration `DropRailsPulseTables` cleans up existing installations on upgrade. This resolves a class of upgrade failures where the `rails_pulse_*` tables ended up missing/half-applied on production. [#&#8203;2549](https://github.com/Freika/dawarich/issues/2549) ##### Added - Swagger docs for all the recent API additions and changes, improving API discoverability and client generation. The full OpenAPI spec is available at `/api-docs`. - Map v2: Delete button on the point info card. Selecting a point now offers an immediate Delete action (with confirm dialog), matching the long-standing Map v1 behavior. The deleted point is removed from the points layer in place without a full reload. ##### Fixed - Monthly and yearly digest emails now convert distance from stored meters to the user's preferred unit (km/mi). Previously the raw meter value was shown next to the unit label (e.g. `500000 km` instead of `500 km`). - Map (Leaflet): route lines no longer revert to their pre-move shape when an unrelated point is deleted after dragging another point. The dragend handler was failing to update the marker array because it looked for the controller in the wrong place. [#&#8203;1797](https://github.com/Freika/dawarich/issues/1797) - Track creation now caps a single track's distance at 100,000 km (with a logged warning) instead of silently truncating at the legacy 999,999 m limit. Long-haul journeys are no longer collapsed to \~1000 km. [#&#8203;1693](https://github.com/Freika/dawarich/issues/1693) - Dev container: bind-mount the project root into the container so `bundle install` can locate the `Gemfile`. Previously only sub-paths were mounted, leaving `/var/app/Gemfile` missing. [#&#8203;1804](https://github.com/Freika/dawarich/issues/1804) - Map v2: photos without GPS metadata (`latitude`/`longitude` null) no longer render as markers at Null Island (0°, 0°) — they are now correctly excluded from the photos layer. ([#&#8203;2464](https://github.com/Freika/dawarich/issues/2464), [#&#8203;2465](https://github.com/Freika/dawarich/issues/2465)) ### [`v1.7.1`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#1711---2026-05-31) [Compare Source](https://github.com/Freika/dawarich/compare/1.7.0...1.7.1) ##### Added - Onboarding "Load demo data" now seeds a fully populated `/map/v2` instantly: 30 days of Berlin + a Prague-weekend trip, \~80 visits with tags and places, and stats anchored to the current calendar month. "Remove demo data" wipes everything in one click while preserving anything you've confirmed, edited, or built on top of (visits, trips, places, tags adopted by user action stay). - Visits can now be manually assigned to one of your saved areas. When you do, the visit takes the area's name automatically — unless you've already given it a custom name, or you've also picked a place (a place name wins over an area name). Available via API now; UI to follow. [#&#8203;2577](https://github.com/Freika/dawarich/issues/2577) ##### Changed - Two unused indexes on the `points` table are dropped on upgrade; on large self-hosted instances this frees several GB of disk. - Areas now validate their geometry: radius must be greater than 0, latitude must be within -90…90, and longitude within -180…180. Invalid values are rejected instead of silently saved. - Bumped bundled gems (aws-sdk, devise, jwt, httparty, and others) to close 9 known CVEs. Self-hosters get the security fixes by upgrading. ##### Fixed - Cloud only: PostHog exception capture is enabled to help diagnose production errors. - Map v2 Timeline calendar now lights up days that have raw points even before Track or Visit generation has caught up, matching the Insights → Activity Overview calendar. [#&#8203;2579](https://github.com/Freika/dawarich/issues/2579) - Reverse-geocoding flood: duplicate per-point enqueues are now coalesced for 24 h via a Redis dedup key, retries are capped at 3, and the nightly sweep bypasses (and clears) the dedup so points whose retries were exhausted — or whose key still lingers — are picked up on the next run. - Map v2 visits layer now honours the selected date range. Since 1.7.10 the viewport-bounded visits fetch silently dropped the `start_at`/`end_at` filter on the backend, so all visits inside the viewport were rendered regardless of the date filter. [#&#8203;2817](https://github.com/Freika/dawarich/issues/2817) - `POST /api/v1/visits` no longer links a new visit to a place owned by another user. Passing a foreign `place_id` is ignored — the visit gets a place owned by the requester at the requested coordinates, and the response no longer echoes the other user's place id or coordinates. - Map v2 settings panel: "Apply Settings" now actually saves your changes. Points rendering mode, speed-colored routes, live mode, and fog-of-war toggles all persist on click and reload. Apply/Reset buttons moved above the Transportation Mode section so they sit inside the outer form. [#&#8203;2680](https://github.com/Freika/dawarich/issues/2680) - The app no longer trips firewall blocks by repeatedly checking family status when you're not part of a family. ### [`v1.7.0`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#170---2026-04-26) [Compare Source](https://github.com/Freika/dawarich/compare/1.6.1...1.7.0) The Timeline Release The Timeline Feature in Map V2 is now a feature capable to fully replace Google Timeline's user experience and overshine it. Please enjoy responsibly. ##### Added - Monthly digest emails. On the 2nd of each month users receive an email summarizing the previous month with an ASCII-rendered overview (distance, active days, countries, cities), a weekly pattern bar chart, a daily distance sparkline, top countries and cities by time spent, first-time visits, and a month-over-month trend comparison. Enabled by default; opt out at Settings → Email Preferences. - Visible, selectable family invitation URL under each pending invite on the family page, so self-hosted instances without SMTP can still share the link [#&#8203;2438](https://github.com/Freika/dawarich/issues/2438). - User-configurable GPS noise filtering in Map v2 → Settings. The accuracy threshold (previously a hardcoded 100 m) is now adjustable from 50–1000 m, and the filter can be disabled entirely, so trips on trains or other weak-signal data sources no longer get their legitimate points stripped out. A "Re-evaluate past data" button clears existing anomaly flags, re-runs the filter with the new settings, and rebuilds tracks/stats/digests; a separate "Recalculate tracks & stats" button rebuilds derived data without touching anomalies. Fixes [#&#8203;2480](https://github.com/Freika/dawarich/issues/2480). ##### Changed - S3 storage can now be used in self-hosted mode. It's compatible with S3-like backends, such as MinIO, Ceph, or Cloudflare R2. To enable S3 storage, set `STORAGE_BACKEND=s3` and provide `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION`, and `AWS_BUCKET`. For S3-compatible backends, additionally set `AWS_ENDPOINT_URL` (or `AWS_ENDPOINT`). - The Timeline tab in Map v2 Tools panel is now a first-class feature. - The single digest email toggle in Settings has been split into independent **Monthly Digest** and **Year-End Digest** controls. A data migration preserves explicit opt-outs: users who had previously disabled digest emails stay opted out of both; users with no preference default to both on. - The Year-End Digest email has been rewritten with ASCII-rendered charts (activity heatmap, monthly distance bars, top countries, year-over-year trend). Content renders identically in HTML and plain-text email clients without JavaScript or external images, fixing rendering issues in Gmail and Outlook. - Points exports (GeoJSON and GPX) are now stored on S3 as single-entry zip archives. Downloads are delivered as `<name>.zip`. - Import uploads are compressed client-side before upload. Users who previously uploaded uncompressed files see no behavior change; S3 storage for new uploads drops substantially for text formats. - Trial users' 10 MB import-file size limit applies to the uploaded file before any client-side compression, so the user-facing limit is unchanged. ##### Fixed - Fix yearly digest emails not being sent automatically. The scheduling job existed in the codebase but was never wired into `config/schedule.yml`, so no year-end emails went out. Yearly digests now fire on January 2nd at 06:00 UTC. - Fix a latent race in the yearly digest pipeline where the email job was scheduled with a 30-minute delay after the calculation job; if the calculation took longer than 30 minutes (e.g., Sidekiq backpressure, transient retries), the email was silently dropped. Emails are now chained from the calculation job's success path. - Fix visit name being overwritten by the location name when updating a visit via the map popup. The custom name typed into the "Visit Name" field is now preserved; the place name is only used as a default when the user leaves the name blank [#&#8203;1915](https://github.com/Freika/dawarich/issues/1915). - Fix stray "Map layer preferences saved" flash (and spurious settings requests) when deleting a point on Map v1. Layer-preference saves are now suppressed while the delete flow internally rebuilds the routes layer and layer control [#&#8203;1902](https://github.com/Freika/dawarich/issues/1902). - Fix the Map v2 replay slider showing times in the browser's local timezone instead of the timezone configured in Settings. Day buckets and the minute-of-day index are now computed in the user's timezone so the replay scrubber matches the rest of the app [#&#8203;2457](https://github.com/Freika/dawarich/issues/2457). - Fix "View on map" to use the preferred map. [#&#8203;2475](https://github.com/Freika/dawarich/issues/2475) - Fix a bug allowing inactive users to create points via the API. - Fix country name canonicalization on the Stats page producing wrong results (e.g., France showing as "Scarborough Reef") when the `countries` table has multiple rows sharing the same ISO code [#&#8203;2434](https://github.com/Freika/dawarich/issues/2434). - Fix Stats dashboard charts stuck on "Loading..." for some years due to duplicate Chartkick element IDs when rendered inside cached year partials [#&#8203;2453](https://github.com/Freika/dawarich/issues/2453). - Fix map date-navigation prev/next buttons always shifting by one day; they now shift by the currently selected interval [#&#8203;1736](https://github.com/Freika/dawarich/issues/1736). - Fix individual points occasionally rendering on top of dense point lines on Map v2 by adding a deterministic timestamp-based sort key [#&#8203;2388](https://github.com/Freika/dawarich/issues/2388). ### [`v1.6.1`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#161---2026-04-02) [Compare Source](https://github.com/Freika/dawarich/compare/1.6.0...1.6.1) ##### Added - Info badge on import form suggesting users zip large files (200MB+) before uploading. - Missing SVG icons for activity breakdown (ship, circle). ##### Fixed - Fix compressed zip files failing to import with "No such file or directory" error. Rubyzip needs to re-open the source zip for compressed entries, but the temp file could be garbage collected before extraction completes [#&#8203;2446](https://github.com/Freika/dawarich/issues/2446). - Fix anomaly filter crashing on large imports (millions of points) due to loading all points into memory at once. Speed-based filtering now processes data in monthly chunks. ### [`v1.6.0`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#160---2026-03-29) [Compare Source](https://github.com/Freika/dawarich/compare/1.5.1...1.6.0) ##### Added - Immich users can now enrich their photos with geodata. - Users can now optionally enable two-factor authentication (2FA) for their accounts in Settings > Two-Factor Authentication. Supported methods: TOTP apps (Google Authenticator, Authy, etc.) and backup codes. Once enabled, users will be prompted for a 2FA code on login. This adds an extra layer of security to protect your location data. ##### Fixed - Fix OIDC account linking failing when the email from the identity provider has different casing than the existing Dawarich account [#&#8203;1983](https://github.com/Freika/dawarich/issues/1983). - Fix confirmation dialogs being ignored when clicking "Cancel" — destructive actions (account deletion, import/export deletion, place deletion) fired regardless of user choice due to Rails UJS and Turbo both handling the same click [#&#8203;1978](https://github.com/Freika/dawarich/issues/1978). - Fix Year in Review share link being empty when toggling public access [#&#8203;2418](https://github.com/Freika/dawarich/issues/2418). - Fix address field on Points page being empty when geodata properties are unavailable [#&#8203;2419](https://github.com/Freika/dawarich/issues/2419). - Fix Stats API returning the same country/city count for every year instead of per-year counts [#&#8203;2280](https://github.com/Freika/dawarich/issues/2280). - Fix flyover countries (with no visited cities) still showing in monthly stats views [#&#8203;2423](https://github.com/Freika/dawarich/issues/2423). - Fix importing Google Timeline files. [#&#8203;2427](https://github.com/Freika/dawarich/issues/2427) ### [`v1.5.1`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#151---2026-03-28) [Compare Source](https://github.com/Freika/dawarich/compare/1.5.0...1.5.1) ##### Fixed - Fix points and tracks interactions on Map v2 being unresponsive after the latest update. - Fix creating demo data from the onboarding modal. - Fix navbar for cloud trial users. - Reset months stats instead of deleting when there is no data. ### [`v1.5.0`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#150---2026-03-28) [Compare Source](https://github.com/Freika/dawarich/compare/1.4.0...1.5.0) ##### Added - GPS noise filtering. An automatic system to detect ahd filter out points with unrealistic speeds, altitudes, or sudden jumps. - Support for signing in via web view using our Android app. - On the map settings page user now can enable and disable map layers. - Onboarding modal now offers a third option to load demo data (3 days in Berlin, \~1000 points) so new users can instantly see what the map looks like. Demo imports bypass trial limits, are clearly labeled with a "Demo" badge, and can be deleted from a banner on the map page or from the imports list. - New tool to the Map V2 tools: The "Day per Country" button will open a modal showing a breakdown of how many days the user has spent in each country, based on their points data. This is calculated by grouping points by country and counting unique days with at least one point in that country. ##### Changed - \[Cloud] The point creation API endpoints are being excluded from the default Lite/Pro rate limits (200/1,000 requests/hour). They now have general rate limits of 10,000 requests/hour. - Buildings numbers on map V2 are now shown on closer zoom. ##### Fixed - Users who registered via Google (or other OAuth providers) can now change their password and email without needing to enter their current password. - Fix deadlocks in reverse geocoding job when multiple Sidekiq workers update points concurrently. - Fix `counter_cache_column` error in points counter reset job by using direct SQL count instead of `reset_counters`. - Fix duplicate place records causing `ON CONFLICT` cardinality violations during reverse geocoding. - Fix `TypeError` crash in transportation mode backfill when Google export files have unexpected JSON structure. - Fix inability to disable visit suggestions background job due to conflicting Rails UJS and Turbo handlers causing request cancellation [#&#8203;2118](https://github.com/Freika/dawarich/issues/2118). - Fix visit confirm/decline buttons firing twice [#&#8203;2379](https://github.com/Freika/dawarich/issues/2379). - Fix clicking on a point in Map v2 silently moving it to the cursor position. Points now only update when intentionally dragged [#&#8203;2149](https://github.com/Freika/dawarich/issues/2149), [#&#8203;2150](https://github.com/Freika/dawarich/issues/2150). - Fix visit name suggester not recognizing Photon reverse geocoding data format, causing all suggested places to show as "Suggested place" [#&#8203;2151](https://github.com/Freika/dawarich/issues/2151), [#&#8203;2377](https://github.com/Freika/dawarich/issues/2377). - Fix visit edit form displaying UTC times instead of the user's configured timezone [#&#8203;2168](https://github.com/Freika/dawarich/issues/2168). - Fix export deletion failing when the export file was manually removed from disk [#&#8203;915](https://github.com/Freika/dawarich/issues/915). - Fix PhotoPrism `before` date filter being off by one day, excluding photos taken on the end date [#&#8203;747](https://github.com/Freika/dawarich/issues/747). - Fix datetime inputs allowing 5-digit years on Chrome by adding `max` attribute to all datetime-local fields [#&#8203;578](https://github.com/Freika/dawarich/issues/578). - Fix Points page datetime fields requiring seconds input, preventing search on mobile browsers and some desktop browsers [#&#8203;1040](https://github.com/Freika/dawarich/issues/1040), [#&#8203;1478](https://github.com/Freika/dawarich/issues/1478). - Fix altitude values being truncated to integers instead of preserving decimal precision [#&#8203;1573](https://github.com/Freika/dawarich/issues/1573). - Fix suggested visits keeping "Suggested Visit" name when confirmed directly without selecting a place [#&#8203;1725](https://github.com/Freika/dawarich/issues/1725). - Fix visit name becoming empty and uneditable when clicking the name field and then clicking away [#&#8203;1776](https://github.com/Freika/dawarich/issues/1776). - Fix trips page crashing with `undefined method 'coordinates' for nil` when trip path calculation hasn't completed yet [#&#8203;1356](https://github.com/Freika/dawarich/issues/1356), [#&#8203;1765](https://github.com/Freika/dawarich/issues/1765). - Fix Immich/PhotoPrism photos on map not being filtered by the selected date range [#&#8203;1755](https://github.com/Freika/dawarich/issues/1755). - Fix short trips (less than one full day) not showing photos due to PhotoPrism `before` date filter being exclusive [#&#8203;1688](https://github.com/Freika/dawarich/issues/1688). - Fix health check endpoint (`/api/v1/health`) triggering unnecessary `User Load` database queries on every request [#&#8203;1770](https://github.com/Freika/dawarich/issues/1770). - Fix points created via Overland API (Home Assistant, GPSLogger) not being automatically reverse geocoded after creation [#&#8203;1242](https://github.com/Freika/dawarich/issues/1242). - Fix monthly stats map crashing with `Invalid LatLng object: (NaN, NaN)` when points have missing coordinates [#&#8203;1762](https://github.com/Freika/dawarich/issues/1762). - Fix trips failing with self-signed certificates by leveraging per-integration SSL skip settings [#&#8203;455](https://github.com/Freika/dawarich/issues/455). - Fix non-admin users unable to access Background Jobs settings to trigger reverse geocoding or manage visit suggestions [#&#8203;1714](https://github.com/Freika/dawarich/issues/1714). - Fix family page map not loading due to `escape_javascript` producing invalid JSON in the Stimulus data attribute. - Fix countries appearing in visited statistics despite only being driven through without spending meaningful time in any city [#&#8203;1595](https://github.com/Freika/dawarich/issues/1595), [#&#8203;1779](https://github.com/Freika/dawarich/issues/1779). - Fix `migrate_to_new_storage` rake task crashing when export URL is blank, already migrated, or points to a directory instead of a file [#&#8203;1018](https://github.com/Freika/dawarich/issues/1018), [#&#8203;1037](https://github.com/Freika/dawarich/issues/1037). - Fix selecting the only suggested place for a visit having no effect because the dropdown `change` event never fires with a single option [#&#8203;471](https://github.com/Freika/dawarich/issues/471). - Fix city duration calculation undercounting time spent due to integer division truncating sub-minute GPS intervals to zero [#&#8203;2408](https://github.com/Freika/dawarich/issues/2408). - Fix tooltips in data tables (Imports, Exports, Points) being hidden behind adjacent rows [#&#8203;2409](https://github.com/Freika/dawarich/issues/2409). - Fix iOS QR code in Account settings being cut off on the right side [#&#8203;2406](https://github.com/Freika/dawarich/issues/2406). ### [`v1.4.0`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#140--2026-03-22) [Compare Source](https://github.com/Freika/dawarich/compare/1.3.4...1.4.0) ##### Added - Family page now contains a map with family members markers on it. - Visits page now have "Confirm all" and "Decline all" buttons to quickly confirm or decline all visit suggestions at once. ##### Changed - Updated look and feel - The point counting was changed to be more efficient on bigger accounts. - Redesigned raw data archival system for large instances (10M+ points). ##### Fixed - Fix Lite plan archival warnings sending all three notifications (11-month, 11.5-month, and 12-month) simultaneously when a user's oldest data already exceeds all thresholds. Now only the most severe warning is sent, and lower thresholds are marked as already notified. - Misconfigured Prometheus settings will no longer litter logs with error messages, it will make multiple attempts to connect instead and then stop. - One of previous versions removed a database index making points upload very slow. The index is now added back to fix the issue. ### [`v1.3.4`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#134---2026-03-15) [Compare Source](https://github.com/Freika/dawarich/compare/1.3.3...1.3.4) ##### Added - Family members can now share their location with each other. In the family settings, you can send a location sharing request to any family member. Once they accept it, you will be able to see their location on the map and they will be able to see yours. You can also revoke location sharing at any time. Location sharing is disabled by default for all existing families, so you need to enable it in the family settings if you want to use this feature. ##### Changed - Redesigned onboarding modal with two paths: "I have data" (inline file import) and "Start tracking" (app download + QR code). New users with existing location data can now start importing within 2 clicks of signing up. - Onboarding completion is now persisted server-side (`settings.onboarding_completed`) instead of relying solely on localStorage, preventing the modal from reappearing after browser data clears. - Route opacity data migration now runs as a background job instead of inline during migration, improving deployment reliability for large instances. ##### Fixed - Fix admin and supporter tooltip overflowing the page on narrow screens. [#&#8203;1449](https://github.com/Freika/dawarich/issues/1449) - Fix date navigation arrow tooltips overlapping with the navbar on map pages. [#&#8203;2229](https://github.com/Freika/dawarich/issues/2229) [#&#8203;2100](https://github.com/Freika/dawarich/issues/2100) - Fix infinite loading spinner when a trip has no points in its date range. [#&#8203;2293](https://github.com/Freika/dawarich/issues/2293) - Fix Insights monthly digest panels disappearing when switching months. [#&#8203;2305](https://github.com/Freika/dawarich/issues/2305) - Fix suggested visit confirm/decline not removing the visit from the list. [#&#8203;2307](https://github.com/Freika/dawarich/issues/2307) - Fix Stats page reloading when clicking "countries, cities" link. [#&#8203;2270](https://github.com/Freika/dawarich/issues/2270) - Fix map base layer selection not being restored after page reload (Maps v1). [#&#8203;2093](https://github.com/Freika/dawarich/issues/2093) - Fix duplicate country names in stats caused by geocoder returning different spellings. [#&#8203;2044](https://github.com/Freika/dawarich/issues/2044) - Fix total distance display overlapping layer picker when distance is in miles. [#&#8203;2017](https://github.com/Freika/dawarich/issues/2017) - Fix default route opacity displaying as 6000% for new users. [#&#8203;1891](https://github.com/Freika/dawarich/issues/1891) - Fix shared month stats map missing hexagons from the last day of the month. [#&#8203;1934](https://github.com/Freika/dawarich/issues/1934) - Fix Nominatim reverse geocoder producing all places named "Suggested place" instead of actual place names. [#&#8203;2182](https://github.com/Freika/dawarich/issues/2182) - Fix IDL-crossing route segmenter returning inconsistent coordinate types. `unwrapCoordinates` now always returns a uniform array-of-arrays structure. [#&#8203;2038](https://github.com/Freika/dawarich/issues/2038) - Fix a migration taking too long. [#&#8203;2375](https://github.com/Freika/dawarich/issues/2375) - Fix family sharing not including the requesting user's own location. [#&#8203;2153](https://github.com/Freika/dawarich/issues/2153) - The "Destroy" button on the trip page is now orange. [#&#8203;2348](https://github.com/Freika/dawarich/issues/2348) ### [`v1.3.3`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#133---2026-03-12) [Compare Source](https://github.com/Freika/dawarich/compare/1.3.2...1.3.3) ##### Added - Better user management with pagination, search, and filtering in the admin panel. Admins can now easily find and manage users based on email, registration date, and activity status. ##### Fixed - Points table now converts speed from m/s to km/h (or mph) using the user's distance unit preference. Previously raw m/s values were displayed with a "km/h" label. [#&#8203;2337](https://github.com/Freika/dawarich/issues/2337) - Digest list API (`GET /api/v1/digests`) now returns distance as a structured object with `meters`, `converted`, and `unit` fields, matching the detail endpoint. Previously it returned raw meters, causing clients to display incorrect values. **Breaking change**: the `distance` field changed from an integer to an object. [#&#8203;2336](https://github.com/Freika/dawarich/issues/2336) - Dead documentation links in v0.26.0 changelog entry now point to the correct URLs. [#&#8203;2344](https://github.com/Freika/dawarich/issues/2344) - Filter out Immich and Photoprism api keys from logs to prevent accidental exposure. [#&#8203;2368](https://github.com/Freika/dawarich/issues/2368) - Fix foreign key violation when deleting users with place\_visits referencing visits. - Fix reverse geocoding job failing on points with nil timestamp or lonlat. - Fix unsupported archive format generating Sentry noise instead of a user-friendly notification. - Fix deadlock in reverse geocoding places upsert under concurrent Sidekiq workers. - Reduce Redis disk I/O by relaxing RDB snapshot frequency. Previously the default `save 60 10000` rule caused a snapshot every \~60 seconds due to Sidekiq polling, generating tens of terabytes of disk writes over weeks. New defaults: snapshots every 15 minutes (10+ changes) or 5 minutes (100+ changes). - Reduce default Sidekiq concurrency from 10 to 5 threads. Most self-hosted instances don't need 10 workers and the extra threads increase Redis polling traffic. - Migration bug for version skippers. [#&#8203;2362](https://github.com/Freika/dawarich/issues/2362) ### [`v1.3.2`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#132---2026-03-08) [Compare Source](https://github.com/Freika/dawarich/compare/1.3.1...1.3.2) **Important**: Self-hosters are not limited in any way. All features remain fully available regardless of plan. The new Lite plan and related limitations apply only to Dawarich Cloud users. If you're self-hosting, you can ignore the Lite plan details below. Self-hosted instances will continue to have access to all features without any restrictions. ##### Added - Lite plan for Dawarich Cloud. Lite includes core tracking, map visualization (routes, points), stats, and the read API. Data view is limited to the last 12 months — older data is archived but can always be exported. Pro-only features: Heatmap, Fog of War, Scratch Map, Globe View, Immich/Photoprism integrations, public stats sharing, and write API (update/delete). Lite users can still create points via the API. Self-hosted instances are unaffected — all features remain fully available regardless of plan. - Timed layer previews for Lite users on the map. Toggling a Pro-only layer (Heatmap, Fog of War, Scratch Map) shows it for 20 seconds with a countdown, then auto-hides with an upgrade prompt. - Per-plan API rate limiting via `rack-attack`. Lite: 200 requests/hour, Pro: 1,000 requests/hour. Self-hosted instances are exempt. Rate-limited responses return 429 with `Retry-After` header. - Archival warning notifications for Lite users approaching the 12-month data window: in-app notification at 11 months, email at 11.5 months, archived confirmation at 12 months. - `GET /api/v1/plan` endpoint returning the user's current plan and feature availability. - `X-Total-Points-In-Range` and `X-Scoped-Points` response headers on the points API, allowing clients to detect when data is being windowed. - Branded OAuth buttons for Google and GitHub on the login page. ##### Changed - Numeric-only strings passed to timestamp API parameters (e.g. `start_at`, `end_at`) are now treated as Unix timestamps directly. Previously they were passed through `Time.zone.parse`, which could return unexpected results. If you were relying on the old behavior for numeric strings, update your API calls accordingly. - The user serializer now includes `plan` in the `subscription` object. ### [`v1.3.1`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#131---2026-02-27) [Compare Source](https://github.com/Freika/dawarich/compare/1.3.0...1.3.1) ##### Changed - User deletion now being done in the background to prevent request timeouts for users with large amount of data. ##### Fixed - Point speed in Map V2 is now correctly calculated from m/s to km/h or mph based on user preference. [#&#8203;2308](https://github.com/Freika/dawarich/issues/2308) - Family members are now being loaded correctly on Map V2 when family layer is enabled. [#&#8203;2250](https://github.com/Freika/dawarich/issues/2250) - Photos popups on Map V2 now show the photo timestamp in user's timezone. [#&#8203;2310](https://github.com/Freika/dawarich/issues/2310) - Fix the issue preventing fresh app from starting. [#&#8203;2304](https://github.com/Freika/dawarich/issues/2304) ### [`v1.3.0`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#130---2026-02-25) [Compare Source](https://github.com/Freika/dawarich/compare/1.2.0...1.3.0) The Storage & Timeline Interaction Release This release adds a dedicated `motion_data` column for transportation-relevant fields alongside the existing `raw_data`. Users can now set their timezone for accurate date/time display across the app. The Timeline feed in Map v2 gains richer map interaction: hovering a journey highlights its track with an animated border, clicking zooms to fit and selects it, and expanding a day shows visit markers even when the Visits layer is off. User data export/import is enhanced with a new v2 format using JSONL files and monthly splitting for large datasets, while remaining backward-compatible with the old format. ##### Added - Per-user timezone setting. Users can now select their timezone from Settings > General, and all dates/times across the app (including background jobs and API responses) will respect it. Defaults to the server's `TIME_ZONE` environment variable for existing users. - `motion_data` JSONB column on the `points` table for storing transportation-relevant fields separately from `raw_data`. - Background job (`DataMigrations::BackfillMotionDataJob`) to backfill `motion_data` from `raw_data` for existing points. - New Timeline feed in Map v2 Tools panel for browsing daily location history. Distances and speeds respect the user's distance unit preference (km/mi). - Clicking a track point (when "Show Points" is enabled) now displays point info (timestamp, battery, altitude, speed) in the track info panel instead of triggering a position update. Dragging a point still updates its position and triggers track recalculation. - Timeline-map interaction: hovering a journey entry in the Timeline feed now highlights the matching track on the map with the animated border and flow effect. Clicking a journey entry zooms the map to fit the track and keeps it selected. Expanding a day in the Timeline now temporarily shows visit markers for that day, even if the Visits layer is disabled. - AES-256-GCM encryption for raw data archives (format version 2). Set `ARCHIVE_ENCRYPTION_KEY` to use a custom key; otherwise derives from `SECRET_KEY_BASE`. Existing unencrypted archives (format version 1) are read transparently. - v2 export/import format with JSONL files and monthly splitting for large entities (points, visits, stats, tracks, digests). The new format streams data to avoid memory issues with large datasets, while remaining backward-compatible with v1 archives (`data.json`). - User data export now includes Tags, Taggings, Tracks (with embedded TrackSegments), Digests, and Raw Data Archives — previously missing from export/import, meaning users who exported and re-imported would lose these entities. - Tracks are exported with their `original_path` serialized as WKT and `track_segments` embedded as a nested array, preserving transportation mode detection data across export/import cycles. - Digests get a fresh `sharing_uuid` on import for security — old share links from the original user won't work for the importing user. - Raw Data Archives are exported with their attached gzip files, enabling full data restoration. - Failed imports now will have an error message shown to the user. - Pagination now looks nicer and more informative, indicating current page. [#&#8203;2279](https://github.com/Freika/dawarich/issues/2279) - Imports and exports now can be sorted by name, file size, number of points, and creation date. [#&#8203;2279](https://github.com/Freika/dawarich/issues/2279) - Lots of missing Swagger specs for the API endpoints have been added, improving API documentation and enabling better client generation. swagger.yaml is updated. ##### Changed - Transportation-relevant fields (motion, activity, action) are now stored in a dedicated `motion_data` column alongside `raw_data`, enabling efficient transportation mode detection. - All import sources now write both `raw_data` (full original payload) and `motion_data` (transportation-relevant fields). - The `STORE_GEODATA` setting now correctly controls whether geodata is written during reverse geocoding. - Dropped unused `idx_points_user_city` database index (304 MB) and replaced the full `reverse_geocoded_at` index (1,149 MB) with a smaller partial index covering only un-geocoded rows. - Selecting a track on Map v2 now always dims other tracks, regardless of whether the track has transportation mode segments. - Default map layers for new users changed from Routes + Heatmap to Tracks + Heatmap. Existing users' settings are unaffected. - Renamed the bottom-panel "Timeline" feature to "Replay" to avoid naming collision with the new Timeline feed sidebar. - Default value for `RAILS_ENV` in `docker-compose.yml` is now `production` instead of `development` ##### Fixed - Stats queries (daily distance, time of day) now correctly handle timezone conversion without double-converting from UTC. - Timezone validation in stats queries now properly resolves Rails timezone names to IANA identifiers. - Clicking on \[Map] on Stats page now correctly respects the user's preferred map version (v1 or v2) instead of always linking to Map v1. [#&#8203;2281](https://github.com/Freika/dawarich/issues/2281) ### [`v1.2.0`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#120---2026-02-15) [Compare Source](https://github.com/Freika/dawarich/compare/1.1.0...1.2.0) ##### Changed - Overall app performance in browser was improved - Docker images are now being built in parallel for both amd64 and arm64 architectures to speed up the build process. Thank you [@&#8203;rtuszik](https://github.com/rtuszik)! ##### Added - Map v2 requires WebGL support, so if user's browser doesn't support it or it's disabled, they will see a warning message with a link to the list of supported browsers. - New **Insights API** (`GET /api/v1/insights`) returning year overview with totals, activity heatmap, and streak data for the mobile app. - New **Insights Details API** (`GET /api/v1/insights/details`) returning year-over-year comparison and travel patterns for the mobile app. - New **Digests API** (`GET/POST/DELETE /api/v1/digests`) allowing the mobile app to list, view, generate, and delete yearly digests. Digest generation runs asynchronously via Sidekiq and returns `202 Accepted`. Digest detail supports conditional GET (`Last-Modified` / `304 Not Modified`). ##### Fixed - Scratch map layer is now working again on Map v2. - Colored routes on Map v2 are now working correctly. Zoom in closer to see colored segments. [#&#8203;2254](https://github.com/Freika/dawarich/issues/2254) - Live mode on Map v2 is now working again. ### [`v1.1.0`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#110---2026-02-08) [Compare Source](https://github.com/Freika/dawarich/compare/1.0.4...1.1.0) The Timeline Release In Map V2 Tools, user can now enable Timeline tool, which allows to quickly navigate through time and see how their location changed throughout the day. It can also be used to replay a trip by clicking the play button. Timeline tool always spans across 24 hours, but you can change the date by clicking on the date picker. Timeline tool is available only on Map V2. ##### Added - Photos are now being clustered on the Map v2 to improve performance and usability when viewing large numbers of photos. - City statistics thresholds are now user-configurable: "Min Minutes in City" and "Max Gap Between Points" sliders in the Map v2 Settings panel. [#&#8203;2207](https://github.com/Freika/dawarich/issues/2207) - New Timeline tool is added to Map V2. It allows user to quickly navigate through time and see how their location changed throughout the day. It can also be used to replay a trip by clicking the play button. ##### Fixed - The SSL Security Warning is now working correctly on the Immich and Photoprism integration forms. - Family members and Places layers are now being correctly remembered across page reloads on Map v2. - Immich returning 400. [#&#8203;2222](https://github.com/Freika/dawarich/issues/2222) [#&#8203;2186](https://github.com/Freika/dawarich/issues/2186) - Points info on the Map V2 now shows time in 24h format and includes seconds. [#&#8203;2172](https://github.com/Freika/dawarich/issues/2172) - Digests not being created for years earlier than 2000. [#&#8203;2158](https://github.com/Freika/dawarich/issues/2158) - Tracks on Map V2 are now respecting the date filters correctly. [#&#8203;2196](https://github.com/Freika/dawarich/issues/2196) - Undefined method `.to_sym` for nil in Sidekiq. [#&#8203;2190](https://github.com/Freika/dawarich/issues/2190) - `/api/v1/stats` now works faster. ##### Changed - Zooming animation is disabled on Map V2 loading [#&#8203;2219](https://github.com/Freika/dawarich/issues/2219) - Exporting points to GPX and GeoJSON now works better and faster for large numbers of points by processing the export in chunks to reduce memory usage. [#&#8203;2161](https://github.com/Freika/dawarich/issues/2161) ### [`v1.0.4`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#104---2026-02-01) [Compare Source](https://github.com/Freika/dawarich/compare/1.0.3...1.0.4) ##### Fixed - Wrong path helper in the navbar for Settings link. [#&#8203;2215](https://github.com/Freika/dawarich/issues/2215) [#&#8203;2213](https://github.com/Freika/dawarich/issues/2213) ### [`v1.0.3`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#103---2026-02-01) [Compare Source](https://github.com/Freika/dawarich/compare/1.0.2...1.0.3) ##### Fixed - Gemfile being not updated [#&#8203;2210](https://github.com/Freika/dawarich/issues/2210) - Excessive memory usage during visits suggestions job (thanks [@&#8203;nareddyt](https://github.com/nareddyt)!) [#&#8203;2119](https://github.com/Freika/dawarich/issues/2119) ##### Added - `SMTP_STARTTLS` environment variable to enable STARTTLS for SMTP connections. Disabled by default. ### [`v1.0.2`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#102---2026-01-31) [Compare Source](https://github.com/Freika/dawarich/compare/1.0.1...1.0.2) The Insights, Transportation Mode Detection and Supporter Verification release Quiet a few big things in this release! It starterted with the idea of adding the Insights page. I experimented with it a bit to see what kinds charts and visualizations we can already have based on the existing data. There were some, but one of the most exciting to me would be the ability to see the Activity Breakdown: now many hours I spent walking, driving and running. Spoiler: I didn't run that much last year :) Anyway, to get that, we needed to have transportation mode detection for tracks. So naturally I went ahead and implemented that as well. Now, not only we can see the activity breakdown, but also, on the Map V2, if you click on a track (Tracks layer should enabled), you will see the transportation modes for it. That's what I wanted for Dawarich for a long time, and I'm happy it's finally here! In the map settings panel, there is now Transportation Mode Detection section, where you can configure speed thresholds for each mode. By default, they are set to reasonable values, but you can tweak them as you wish. Changing the thresholds will recalculate modes for all tracks in the background, which may take a while depending on how many tracks you have. Another thing introduced in this release, is support verification. Almost 150 people have supported us financially on [Ko-fi](https://ko-fi.com/freika), [Patreon](https://www.patreon.com/freika) and [GitHub Sponsors](https://github.com/sponsors/Freika/), and if you're one of them, on the Settings page you can now enter your email and verify your support. Verified supporters will get a special (disableable) badge in the navbar as a token of our appreciation. Thank you so much for supporting Dawarich! Anyway, enjoy the release and don't forget to report any bugs you may find! ##### Added - App-level DNS cache with 5 minutes TTL to reduce DNS lookups and improve performance. [#&#8203;2183](https://github.com/Freika/dawarich/issues/2183) - New **Insights page** with comprehensive analytics and visualizations: - **Activity heatmap**: GitHub-style contribution graph showing daily activity throughout the year - **Activity streak**: Track your current streak and longest streak of consecutive active days - **Top visited locations**: See your most frequently visited places for the selected year - **Year comparison**: Compare stats (distance, countries, cities, active days) with previous year - **Activity breakdown**: Visualize your activity distribution by transportation mode - **Monthly digest**: Detailed monthly statistics with travel patterns - **Travel patterns**: Time-of-day and day-of-week activity distribution - **Movement wellness**: Health-related insights based on your movement data - **Location clusters**: Geographic clustering of your visited locations - **Transportation mode detection for tracks**: Tracks are now automatically segmented by transportation mode (walking, cycling, driving, etc.) with configurable speed thresholds in settings. Modes are recalculated when threshold settings change. - **Near real-time track generation**: Tracks are now generated within \~45 seconds of receiving new points (via OwnTracks, Overland, or the Points API) using a Redis-based debouncer. This replaces the previous 4-hour polling cycle for most cases. Daily generation job frequency reduced from every 4 hours to every 12 hours as a fallback. - **Track merging**: Consecutive tracks that belong to the same journey are automatically merged when the gap between them is within the configured time threshold. - Email preferences moved to "General" tab in user settings for better organization. ##### Fixed - Remove assets before precompilation to prevent stale assets from being served. [#&#8203;2187](https://github.com/Freika/dawarich/issues/2187) - undefined method 'to\_sym' for nil in sidekiq [#&#8203;2190](https://github.com/Freika/dawarich/issues/2190) - `Tracks::BoundaryResolverJob` now uses deterministic exponential backoff instead of random delays, and stops retrying after 5 attempts to avoid infinite rescheduling. - Hanging Sidekiq job [#&#8203;2134](https://github.com/Freika/dawarich/issues/2134) ##### Changed - Daily track generation job runs every 12 hours instead of every 4 hours, since real-time generation handles most cases. ### [`v1.0.1`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#101---2026-01-24) [Compare Source](https://github.com/Freika/dawarich/compare/1.0.0...1.0.1) ##### Added - SSL certificate verification can now be disabled for Immich and Photoprism integrations to support self-signed certificates. A prominent security warning is displayed when this option is enabled. [#&#8203;1645](https://github.com/Freika/dawarich/issues/1645) ##### Fixed - Photo timestamps from Immich are now correctly parsed as UTC, fixing the double timezone offset bug where times were displayed incorrectly. [#&#8203;1752](https://github.com/Freika/dawarich/issues/1752) - Trip photo grids now update immediately after photos are imported, instead of showing cached/stale results for up to 24 hours. [#&#8203;627](https://github.com/Freika/dawarich/issues/627) [#&#8203;988](https://github.com/Freika/dawarich/issues/988) - Immich API responses are now validated for content-type and JSON format before parsing, providing clear diagnostic error messages when the API returns unexpected responses. [#&#8203;698](https://github.com/Freika/dawarich/issues/698) [#&#8203;1013](https://github.com/Freika/dawarich/issues/1013) [#&#8203;1078](https://github.com/Freika/dawarich/issues/1078) - Response validator logs truncated response bodies (max 1000 chars) when JSON parsing fails, improving debugging capabilities. - GeoJSON formatted points now have correct timestamp parsed from `raw_data['properties']['date']` field. - Reduce number of iterations during cache cleaning to improve performance. - Version in the navbar is now correct. [#&#8203;2154](https://github.com/Freika/dawarich/issues/2154) - Dawarich can now be ran under a non-root user in Docker. [#&#8203;1159](https://github.com/Freika/dawarich/issues/1159) - Fix an error on the Trips page when trip is created but no path is yet calculated. [#&#8203;1426](https://github.com/Freika/dawarich/issues/1426) - Catch an error with invalid response during reverse-geocoding. [#&#8203;1439](https://github.com/Freika/dawarich/issues/1439) - In the Immich integration form there are now required permissions listed: `asset.read` and `asset.view`. [#&#8203;1730](https://github.com/Freika/dawarich/issues/1730) - A doc issue regarding suggesting new visits. [#&#8203;1737](https://github.com/Freika/dawarich/issues/1737) - `ALLOW_EMAIL_PASSWORD_REGISTRATION` and `OIDC_AUTO_REGISTER` env vars are now being respected correctly. [#&#8203;1972](https://github.com/Freika/dawarich/issues/1972) - Fog of War layer on Map V1 now properly re-appears when toggled off and on again without requiring a page refresh. [#&#8203;2039](https://github.com/Freika/dawarich/issues/2039) - User's `points_count` counter cache is now properly updated when creating points via OwnTracks, Overland, and generic Points API. This fixes visit suggestions not working for users using HomeAssistant or similar integrations. [#&#8203;2167](https://github.com/Freika/dawarich/issues/2167) - Removed redundant subscriptions to WS channel. - Live mode is working again on both map V1 and V2. ##### Changed - Map V2 is now the default map version for new users. Existing users will keep using Map V1 unless they change it in the settings. - Email preferences moved to dedicated "Emails" tab in user settings for better organization. ##### Removed - Tile Usage reporting feature and related prometheus metric have been removed due to low usage. [#&#8203;1876](https://github.com/Freika/dawarich/issues/1876) ### [`v1.0.0`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#100---2026-01-20) [Compare Source](https://github.com/Freika/dawarich/compare/0.37.3...1.0.0) The 1.0.0 release. Same as in 0.37.3, but with updated version number. We're aiming to provide more stable releases going forward. All the issues that are currently open in Github will be addressed in the upcoming releases. ### [`v0.37.3`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#0373---2026-01-11) [Compare Source](https://github.com/Freika/dawarich/compare/0.37.2...0.37.3) ##### Fixed - Routes are now being drawn the very same way on Map V2 as in Map V1. [#&#8203;2132](https://github.com/Freika/dawarich/issues/2132) [#&#8203;2086](https://github.com/Freika/dawarich/issues/2086) [#&#8203;2121](https://github.com/Freika/dawarich/issues/2121) - RailsPulse performance monitoring is now disabled for self-hosted instances. It fixes poor performance on Synology. [#&#8203;2139](https://github.com/Freika/dawarich/issues/2139) [#&#8203;2096](https://github.com/Freika/dawarich/issues/2096) ##### Changed - Map V2 points loading is significantly sped up. - Points size on Map V2 was reduced to prevent overlapping. [#&#8203;2122](https://github.com/Freika/dawarich/issues/2122) - Points sent from Owntracks and Overland are now being created synchronously to instantly reflect success or failure of point creation. ### [`v0.37.2`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#0372---2026-01-04) [Compare Source](https://github.com/Freika/dawarich/compare/0.37.1...0.37.2) ##### Fixed - Months are now correctly ordered (Jan-Dec) in the year-end digest chart instead of being sorted alphabetically. - Time spent in a country and city is now calculated correctly for the year-end digest email. [#&#8203;2104](https://github.com/Freika/dawarich/issues/2104) - Updated Trix to fix a XSS vulnerability. [#&#8203;2102](https://github.com/Freika/dawarich/issues/2102) - Map v2 UI no longer blocks when Immich/Photoprism integration has a bad URL or is unreachable. Added 10-second timeout to photo API requests and improved error handling to prevent UI freezing during initial load. [#&#8203;2085](https://github.com/Freika/dawarich/issues/2085) ##### Added - In Map v2 settings, you can now enable map to be rendered as a globe. ### [`v0.37.1`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#0371---2025-12-30) [Compare Source](https://github.com/Freika/dawarich/compare/0.37.0...0.37.1) ##### Fixed - The db migration preventing the app from starting. - Raw data archive verifier now allows having points deleted from the db after archiving. ### [`v0.37.0`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#0370---2025-12-30) [Compare Source](https://github.com/Freika/dawarich/compare/0.36.4...0.37.0) ##### Added - In the beginning of the year users will receive a year-end digest email with stats about their tracking activity during the past year. Users can opt out of receiving these emails in User Settings -> Notifications. Emails won't be sent if no email is configured in the SMTP settings or if user has no points tracked during the year. ##### Changed - Added and removed some indexes to improve the app performance based on the production usage data. ##### Changed - Deleting an import will now be processed in the background to prevent request timeouts for large imports. ##### Fixed - Deleting an import will no longer result in negative points count for the user. - Updating stats. [#&#8203;2022](https://github.com/Freika/dawarich/issues/2022) - Validate trip start date to be earlier than end date. [#&#8203;2057](https://github.com/Freika/dawarich/issues/2057) - Fog of war radius slider in map v2 settings is now being respected correctly. [#&#8203;2041](https://github.com/Freika/dawarich/issues/2041) - Applying changes in map v2 settings now works correctly. [#&#8203;2041](https://github.com/Freika/dawarich/issues/2041) - Invalidate stats cache on recalculation and other operations that change stats data. ### [`v0.36.4`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#0364---2025-12-26) [Compare Source](https://github.com/Freika/dawarich/compare/0.36.3...0.36.4) ##### Fixed - Fixed a bug preventing the app to start if a composite index on stats table already exists. [#&#8203;2034](https://github.com/Freika/dawarich/issues/2034) [#&#8203;2051](https://github.com/Freika/dawarich/issues/2051) [#&#8203;2046](https://github.com/Freika/dawarich/issues/2046) - New compiled assets will override old ones on app start to prevent serving stale assets. - Number of points in stats should no longer go negative when points are deleted. [#&#8203;2054](https://github.com/Freika/dawarich/issues/2054) - Disable Family::Invitations::CleanupJob no invitations are in the database. [#&#8203;2043](https://github.com/Freika/dawarich/issues/2043) - User can now enable family layer in Maps v2 and center on family members by clicking their emails. [#&#8203;2036](https://github.com/Freika/dawarich/issues/2036) ### [`v0.36.3`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#0363---2025-12-14) [Compare Source](https://github.com/Freika/dawarich/compare/0.36.2...0.36.3) ##### Added - Setting `ARCHIVE_RAW_DATA` env var to true will enable monthly raw data archiving for all users. It will look for points older than 2 months with `raw_data` column not empty and create a zip archive containing raw data files for each month. After successful archiving, raw data will be removed from the database to save space. Monthly archiving job is being run every day at 2:00 AM. Default env var value is false. - In map v2, user can now move points when Points layer is enabled. [#&#8203;2024](https://github.com/Freika/dawarich/issues/2024) - In map v2, routes are now being rendered using same logic as in map v1, route-length-wise. [#&#8203;2026](https://github.com/Freika/dawarich/issues/2026) ##### Fixed - Cities visited during a trip are now being calculated correctly. [#&#8203;547](https://github.com/Freika/dawarich/issues/547) [#&#8203;641](https://github.com/Freika/dawarich/issues/641) [#&#8203;1686](https://github.com/Freika/dawarich/issues/1686) [#&#8203;1976](https://github.com/Freika/dawarich/issues/1976) - Points on the map are now show time in user's timezone. [#&#8203;580](https://github.com/Freika/dawarich/issues/580) [#&#8203;1035](https://github.com/Freika/dawarich/issues/1035) [#&#8203;1682](https://github.com/Freika/dawarich/issues/1682) - Date range inputs now handle pre-epoch dates gracefully by clamping to valid PostgreSQL integer range. [#&#8203;685](https://github.com/Freika/dawarich/issues/685) - Redis client now also being configured so that it could connect via unix socket. [#&#8203;1970](https://github.com/Freika/dawarich/issues/1970) - Importing KML files now creates points with correct timestamps. [#&#8203;1988](https://github.com/Freika/dawarich/issues/1988) - Importing KMZ files now works correctly. - Map settings are now being respected in map v2. [#&#8203;2012](https://github.com/Freika/dawarich/issues/2012) ### [`v0.36.2`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#0362---2025-12-06) [Compare Source](https://github.com/Freika/dawarich/compare/0.36.1...0.36.2) The Map v2 release In this release we're introducing Map v2 based on MapLibre GL JS. It brings better performance, smoother interactions and more features in the future. User can select between Map v1 (Leaflet) and Map v2 (MapLibre GL JS) in the Settings -> Map Settings. New map features will be added to Map v2 only. ##### Added - User can select between Map v1 (Leaflet) and Map v2 (MapLibre GL JS) in the User Settings. ##### Fixed - Heatmap and Fog of War now are moving correctly during map interactions on v2 map. [#&#8203;1798](https://github.com/Freika/dawarich/issues/1798) - Polyline crossing international date line now are rendered correctly on v2 map. [#&#8203;1162](https://github.com/Freika/dawarich/issues/1162) - Place popup tags parsing (MapLibre GL JS compatibility) - Stats calculation should be faster now. ### [`v0.36.1`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#0361---2025-11-29) [Compare Source](https://github.com/Freika/dawarich/compare/0.36.0...0.36.1) ##### Fixed - Exporting user data now works a lot faster and consumes less memory. - Fix the restart loop. [#&#8203;1937](https://github.com/Freika/dawarich/issues/1937) [#&#8203;1975](https://github.com/Freika/dawarich/issues/1975) ### [`v0.36.0`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#0360---2025-11-24) [Compare Source](https://github.com/Freika/dawarich/compare/0.35.1...0.36.0) OIDC and KML support release So, you want to configure your OIDC provider. If not — skip to the actual changelog. You're going to need to provide at least 4 environment variables: `OIDC_CLIENT_ID`, `OIDC_CLIENT_SECRET`, `OIDC_ISSUER`, and `OIDC_REDIRECT_URI`. Then, if you want to rename the provider from "OpenID Connect" to something else (e.g. "Authentik"), set `OIDC_PROVIDER_NAME` variable as well. If you want to disable email/password registration and allow only OIDC login, set `ALLOW_EMAIL_PASSWORD_REGISTRATION` to `false`. After just 7 brand new environment variables, you'll never have to deal with passwords in Dawarich again! Jokes aside, even though I'm not a fan of bloating the environment with too many variables, this is a nice addition and it will be reused in the cloud version of Dawarich as well. Thanks for waiting more than a year for this feature! To configure your OIDC provider, set the following environment variables: ``` OIDC_CLIENT_ID=client_id_example OIDC_CLIENT_SECRET=client_secret_example OIDC_ISSUER=https://authentik.yourdomain.com/application/o/dawarich/ OIDC_REDIRECT_URI=https://your-dawarich-url.com/users/auth/openid_connect/callback OIDC_AUTO_REGISTER=true # optional, default is false OIDC_PROVIDER_NAME=YourProviderName # optional, default is OpenID Connect ALLOW_EMAIL_PASSWORD_REGISTRATION=false # optional, default is true ``` ##### Added - Support for KML file uploads. [#&#8203;350](https://github.com/Freika/dawarich/issues/350) - Added a commented line in the `docker-compose.yml` file to use an alternative PostGIS image for ARM architecture. - User can now create a place directly from the map and add tags and notes to it. If reverse geocoding is enabled, list of nearby places will be shown as suggestions. - User can create and manage tags for places. - Visits for manually created places are being suggested automatically, just like for areas. - User can enable or disable places layers on the map to show/hide all or just some of their visited places based on tags. - User can define privacy zones around places with specific tags to hide map data within a certain radius. - If user has a place tagged with a tag named "Home" (case insensitive), and this place doesn't have a privacy zone defined, this place will be used as home location for days with no tracked data. [#&#8203;1659](https://github.com/Freika/dawarich/issues/1659) [#&#8203;1575](https://github.com/Freika/dawarich/issues/1575) ##### Fixed - The map settings panel is now scrollable - Fixed a bug where family location sharing settings were not being updated correctly. [#&#8203;1940](https://github.com/Freika/dawarich/issues/1940) ##### Changed - Internal redis settings updated to implement support for connecting to Redis via unix socket. [#&#8203;1706](https://github.com/Freika/dawarich/issues/1706) - Implemented authentication via GitHub and Google for Dawarich Cloud. - Implemented OpenID Connect authentication for self-hosted Dawarich instances. [#&#8203;66](https://github.com/Freika/dawarich/issues/66) ### [`v0.35.1`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#0351---2025-11-09) [Compare Source](https://github.com/Freika/dawarich/compare/0.35.0...0.35.1) ##### Fixed - StrongMigration issue [#&#8203;1931](https://github.com/Freika/dawarich/issues/1931) ### [`v0.35.0`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#0350---2025-11-09) [Compare Source](https://github.com/Freika/dawarich/compare/0.34.2...0.35.0) ⚠️ Important ⚠️ The default `docker-compose.yml` file has been updated to provide sensible defaults for self-hosted production environments. This should not break existing setups, but it's recommended to review your `docker-compose.yml` file and update it accordingly. You can now set `RAILS_ENV` environment variable to `production` to run Dawarich in production mode. ##### Added - Selection tool on the map now can select points that user can delete in bulk. [#&#8203;433](https://github.com/Freika/dawarich/issues/433) ##### Fixed - Taiwan flag is now shown on its own instead of in combination with China flag. - On the registration page and other user forms, if something goes wrong, error messages are now shown to the user. - Leaving family, deleting family and cancelling invitations now prompt confirmation dialog to prevent accidental actions. - Each pending family invitation now also contains a link to share with the invitee. ##### Changed - Removed useless system tests and cover map functionality with Playwright e2e tests instead. - S3 storage now can be used in self-hosted instances as well. Set STORAGE\_BACKEND environment variable to `s3` and provide `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION`, `AWS_BUCKET` and `AWS_ENDPOINT_URL` environment variables to configure it. - Number of family members on self-hosted instances is no longer limited. [#&#8203;1918](https://github.com/Freika/dawarich/issues/1918) - Export to GPX now adds speed and course to each point if they are available. - `docker-compose.yml` file updated to provide sensible defaults for self-hosted production environment. - `.env.example` file added with default environment variables. - Single Dockerfile introduced so Dawarich could be run in self-hosted mode in production environment. ### [`v0.34.2`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#0342---2025-10-31) [Compare Source](https://github.com/Freika/dawarich/compare/0.34.1...0.34.2) ##### Fixed - Fixed a bug in UTM trackable concern. [#&#8203;1909](https://github.com/Freika/dawarich/issues/1909) ### [`v0.34.1`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#0341---2025-10-30) [Compare Source](https://github.com/Freika/dawarich/compare/0.34.0...0.34.1) ##### Fixed - Broken Stats page for users with no reverse geocoding enabled. [#&#8203;1877](https://github.com/Freika/dawarich/issues/1877) ##### Changed - Date navigation on the map page is no longer shown as floating panel. It is now part of the top navigation bar to prevent overlapping with other map controls. [#&#8203;1894](https://github.com/Freika/dawarich/issues/1894) [#&#8203;1881](https://github.com/Freika/dawarich/issues/1881) ##### Added - \[Dawarich Cloud] Added support for UTM parameters during user registration. UTM parameters will be stored with the user record for marketing analytics purposes. ### [`v0.34.0`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#0340---2025-10-10) [Compare Source](https://github.com/Freika/dawarich/compare/0.33.1...0.34.0) The Family release In this release we're introducing family features that allow users to create family groups, invite members, and share location data. Family owners can manage members, control sharing settings, and ensure secure access to shared information. Location sharing is optional and can be enabled or disabled by each member individually. Users can join only one family at a time. Location sharing settings can be set to share location for 1, 6, 12, 24 hours or permanently. Family features are now available only for self-hosted instances and will be available in the cloud in the future. When "Family members" layer is enabled on the map, family member markers will be updated in real-time. ##### Added - Users can now create family groups and invite members to join. ##### Fixed - Sign out button works again. [#&#8203;1844](https://github.com/Freika/dawarich/issues/1844) - Fixed user deletion bug where user could not be deleted due to counter cache on points. - Users always have default distance unit set to kilometers. [#&#8203;1832](https://github.com/Freika/dawarich/issues/1832) - All confirmation dialogs are now showing only once. ##### Changed - Minor versions of Dawarich are being built for ARM64 architecture as well again. [#&#8203;1840](https://github.com/Freika/dawarich/issues/1840) - Importing process for Google Maps Timeline exports, GeoJSON and geodata from photos is now significantly faster. - The Map page now features a full-screen map. ### [`v0.33.1`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#0331---2025-10-07) [Compare Source](https://github.com/Freika/dawarich/compare/0.33.0...0.33.1) ##### Changed - On the Trip page, instead of list of visited countries, a number of them is being shown. Clicking on it opens a modal with a list of countries visited during the trip. [#&#8203;1731](https://github.com/Freika/dawarich/issues/1731) ##### Fixed - `GET /api/v1/stats` endpoint now returns correct 0 instead of null if no points were tracked in the requested period. - User import data now being streamed instead of loaded into memory all at once. This should prevent large imports from exhausting memory or hitting IO limits while reading export archives. - Popup for manual visit creation now looks better in both light and dark modes. [#&#8203;1835](https://github.com/Freika/dawarich/issues/1835) - Fixed a bug where visit circles were not interactive on the map page. [#&#8203;1833](https://github.com/Freika/dawarich/issues/1833) - Fixed a bug with stats sharing settings being not filled. [#&#8203;1826](https://github.com/Freika/dawarich/issues/1826) - Fixed a bug where user could not be deleted due to counter cache on points. [#&#8203;1818](https://github.com/Freika/dawarich/issues/1818) - Introduce apt-get upgrade before installing new packages in the docker image to prevent vulnerabilities. [#&#8203;1793](https://github.com/Freika/dawarich/issues/1793) - Fixed time shift when creating visits manually. [#&#8203;1679](https://github.com/Freika/dawarich/issues/1679) - Provide default map layer if user settings are not set. ### [`v0.33.0`](https://github.com/Freika/dawarich/blob/HEAD/CHANGELOG.md#0330---2025-09-29) [Compare Source](https://github.com/Freika/dawarich/compare/0.32.0...0.33.0) ##### Fixed - Fix a bug where some points from Owntracks were not being processed correctly which prevented import from being created. [#&#8203;1745](https://github.com/Freika/dawarich/issues/1745) - Hexagons for the stats page are now being calculated a lot faster. - Prometheus exporter is now not being started when console is being run. - Stats will now properly reflect countries and cities visited after importing new points. - `GET /api/v1/points` will now return correct latitude and longitude values. [#&#8203;1502](https://github.com/Freika/dawarich/issues/1502) - Deleting an import will now trigger stats recalculation for affected months. [#&#8203;1789](https://github.com/Freika/dawarich/issues/1789) - Importing process should now schedule visits suggestions job a lot faster. - Importing GPX files that start with `<gpx` tag will now be detected correctly. [#&#8203;1775](https://github.com/Freika/dawarich/issues/1775) - Buttons on the map now have correct contrast in both light and dark modes. ##### Changed - Onboarding modal window now features a link to the App Store and a QR code to configure the Dawarich iOS app. - A permanent option was removed from stats sharing options. Now, stats can be shared for 1, 12 or 24 hours only. - User data archive importing now uploads the file directly to the storage service instead of uploading it to the app first. - Importing progress bars are now looking nice. - Ruby version was updated to 3.4.6. ##### Added - Based on preferred theme (light or dark), the map controls will now load with the corresponding styles. - \[Dawarich Cloud] Added foundation for upcoming authentication from iOS app. - \[Dawarich Cloud] Trial users can now create up to 5 imports. After that, they will be prompted to subscribe to a paid plan. - \[Dawarich Cloud] Added Posthog analytics. Disabled by default, can be enabled with POSTHOG\_ENABLED environment variable. </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi43MS4wIiwidXBkYXRlZEluVmVyIjoiNDMuMTI5LjAiLCJ0YXJnZXRCcmFuY2giOiJtYXN0ZXIiLCJsYWJlbHMiOltdfQ==-->
renovate-bot force-pushed renovate/freikin-dawarich-1.x from 4dab76a95e to ebda402552 2026-02-25 20:05:17 +00:00 Compare
renovate-bot force-pushed renovate/freikin-dawarich-1.x from ebda402552 to 146bc28dc7 2026-02-27 21:05:04 +00:00 Compare
renovate-bot force-pushed renovate/freikin-dawarich-1.x from 146bc28dc7 to 06662032cb 2026-03-08 21:05:06 +00:00 Compare
renovate-bot force-pushed renovate/freikin-dawarich-1.x from 06662032cb to 65ffe3e0d1 2026-03-12 22:05:33 +00:00 Compare
renovate-bot force-pushed renovate/freikin-dawarich-1.x from 65ffe3e0d1 to ab3f9171cf 2026-03-15 16:05:26 +00:00 Compare
JustScreaMy removed their assignment 2026-03-16 18:27:49 +00:00
JustScreaMy removed their assignment 2026-03-16 18:31:34 +00:00
renovate-bot force-pushed renovate/freikin-dawarich-1.x from ab3f9171cf to 9dda0ff228 2026-03-22 14:05:09 +00:00 Compare
renovate-bot force-pushed renovate/freikin-dawarich-1.x from 9dda0ff228 to 685cdfba00 2026-03-28 13:04:25 +00:00 Compare
renovate-bot force-pushed renovate/freikin-dawarich-1.x from 685cdfba00 to 4663b2fa14 2026-03-28 21:04:35 +00:00 Compare
renovate-bot force-pushed renovate/freikin-dawarich-1.x from 4663b2fa14 to 42bfe3d2fd 2026-03-29 22:04:29 +00:00 Compare
renovate-bot force-pushed renovate/freikin-dawarich-1.x from 42bfe3d2fd to 42cb25ae8f 2026-04-01 23:09:05 +00:00 Compare
renovate-bot changed title from chore(deps): update freikin/dawarich docker tag to v1 to Update freikin/dawarich Docker tag to v1 2026-04-18 10:06:20 +00:00
renovate-bot force-pushed renovate/freikin-dawarich-1.x from d6a82abcdc to 661cb783e2 2026-05-02 19:04:25 +00:00 Compare
renovate-bot force-pushed renovate/freikin-dawarich-1.x from 661cb783e2 to 09b2868464 2026-05-03 09:04:23 +00:00 Compare
renovate-bot force-pushed renovate/freikin-dawarich-1.x from 09b2868464 to fc157acc35 2026-05-03 23:04:24 +00:00 Compare
renovate-bot force-pushed renovate/freikin-dawarich-1.x from fc157acc35 to 3186c546c0 2026-05-09 16:04:37 +00:00 Compare
renovate-bot force-pushed renovate/freikin-dawarich-1.x from 3186c546c0 to 625b2727e7 2026-05-09 23:04:25 +00:00 Compare
renovate-bot force-pushed renovate/freikin-dawarich-1.x from 625b2727e7 to 708c162c62 2026-05-16 22:04:40 +00:00 Compare
This pull request is broken due to missing fork information.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin renovate/freikin-dawarich-1.x:renovate/freikin-dawarich-1.x
git switch renovate/freikin-dawarich-1.x

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch master
git merge --no-ff renovate/freikin-dawarich-1.x
git switch renovate/freikin-dawarich-1.x
git rebase master
git switch master
git merge --ff-only renovate/freikin-dawarich-1.x
git switch renovate/freikin-dawarich-1.x
git rebase master
git switch master
git merge --no-ff renovate/freikin-dawarich-1.x
git switch master
git merge --squash renovate/freikin-dawarich-1.x
git switch master
git merge --ff-only renovate/freikin-dawarich-1.x
git switch master
git merge renovate/freikin-dawarich-1.x
git push origin master
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
KropCloud/services!44
No description provided.