Skip to content

Conversation

@ArnyminerZ
Copy link

@ArnyminerZ ArnyminerZ commented Jan 11, 2026

Closes #2060

Currently, the images loaded from Immich (I guess also Photoprism) are always stored in cache, no matter whether the server responded successfully or not.

This is a simple PR to make sure no errors (or empty images) are stored in cache.


I can't find where to suggest updates to the documentation, but this page must be updated to indicate that the asset.view is also required, as explained in the original issue.

Summary by CodeRabbit

Release Notes

  • New Features

    • Added interactive route visualization with hover highlights and emoji markers for route start/end points
    • Introduced route information panel displaying start time, end time, distance, duration, and speed
    • Added tracks layer to map with GeoJSON support and visibility toggle in settings
    • Implemented tracks API endpoint with pagination support
  • Improvements

    • Enhanced map performance by optimizing marker sizes and distance calculations
    • Improved point creation workflows with synchronous processing and better error handling
    • Added pagination to visits, places, and tracks endpoints with header information
    • Implemented total distance caching for improved performance
  • Bug Fixes

    • Resolved route map rendering parity between Map V1 and V2
    • Disabled Rails Pulse on self-hosted instances

✏️ Tip: You can customize this high-level summary in your review settings.

rtuszik and others added 30 commits November 25, 2025 20:30
Freika#1980)

* Update exporting code to stream points data to file in batches to reduce memory usage

* Update changelog
* Add a plan to use MapLibre GL JS for the frontend map rendering, replacing Leaflet

* Implement phase 1

* Phases 1-3 + part of 4

* Fix e2e tests

* Phase 6

* Implement fog of war

* Phase 7

* Next step: fix specs, phase 7 done

* Use our own map tiles

* Extract v2 map logic to separate manager classes

* Update settings panel on v2 map

* Update v2 e2e tests structure

* Reimplement location search in maps v2

* Update speed routes

* Implement visits and places creation in v2

* Fix last failing test

* Implement visits merging

* Fix a routes e2e test and simplify the routes layer styling.

* Extract js to modules from maps_v2_controller.js

* Implement area creation

* Fix spec problem

* Fix some e2e tests

* Implement live mode in v2 map

* Update icons and panel

* Extract some styles

* Remove unused file

* Start adding dark theme to popups on MapLibre maps

* Make popups respect dark theme

* Move v2 maps to maplibre namespace

* Update v2 references to maplibre

* Put place, area and visit info into side panel

* Update API to use safe settings config method

* Fix specs

* Fix method name to config in SafeSettings and update usages accordingly

* Add missing public files

* Add handling for real time points

* Fix remembering enabled/disabled layers of the v2 map

* Fix lots of e2e tests

* Add settings to select map version

* Use maps/v2 as main path for MapLibre maps

* Update routing

* Update live mode
* 0.36.2 (Freika#2007)

* fix: move foreman to global gems to fix startup crash (Freika#1971)

* Update exporting code to stream points data to file in batches to red… (Freika#1980)

* Update exporting code to stream points data to file in batches to reduce memory usage

* Update changelog

* Update changelog

* Feature/maplibre frontend (Freika#1953)

* Add a plan to use MapLibre GL JS for the frontend map rendering, replacing Leaflet

* Implement phase 1

* Phases 1-3 + part of 4

* Fix e2e tests

* Phase 6

* Implement fog of war

* Phase 7

* Next step: fix specs, phase 7 done

* Use our own map tiles

* Extract v2 map logic to separate manager classes

* Update settings panel on v2 map

* Update v2 e2e tests structure

* Reimplement location search in maps v2

* Update speed routes

* Implement visits and places creation in v2

* Fix last failing test

* Implement visits merging

* Fix a routes e2e test and simplify the routes layer styling.

* Extract js to modules from maps_v2_controller.js

* Implement area creation

* Fix spec problem

* Fix some e2e tests

* Implement live mode in v2 map

* Update icons and panel

* Extract some styles

* Remove unused file

* Start adding dark theme to popups on MapLibre maps

* Make popups respect dark theme

* Move v2 maps to maplibre namespace

* Update v2 references to maplibre

* Put place, area and visit info into side panel

* Update API to use safe settings config method

* Fix specs

* Fix method name to config in SafeSettings and update usages accordingly

* Add missing public files

* Add handling for real time points

* Fix remembering enabled/disabled layers of the v2 map

* Fix lots of e2e tests

* Add settings to select map version

* Use maps/v2 as main path for MapLibre maps

* Update routing

* Update live mode

* Update maplibre controller

* Update changelog

* Remove some console.log statements

---------

Co-authored-by: Robin Tuszik <[email protected]>

* Remove esbuild scripts from package.json

* Remove sideEffects field from package.json

* Raw data archivation

* Add tests

* Fix tests

* Fix tests

* Update ExceptionReporter

* Add schedule to run raw data archival job monthly

* Change file structure for raw data archival feature

* Update changelog and version for raw data archival feature

---------

Co-authored-by: Robin Tuszik <[email protected]>
)

* Consider MIN_MINUTES_SPENT_IN_CITY during stats calculation

* Remove raw data from visited cities api endpoint
* Use user timezone to show dates on maps

* Limit timestamps to valid range to prevent database errors when users enter pre-epoch dates.

* Limit timestamps to valid range to prevent database errors when users enter pre-epoch dates.

* Fix tests failing due to new index on stats table

* Fix failing specs
* Fix kml kmz import issues

* Refactor KML importer to improve readability and maintainability
Freika#2027)

* Implement moving points in map v2 and fix route rendering logic to match map v1.

* Fix route spec
* Add verification step to raw data archival process

* Add actual verification of raw data archives after creation, and only clear raw_data for verified archives.

* Fix failing specs
Freika and others added 27 commits January 3, 2026 13:28
…il (Freika#2110)

* Update calculation of time spent in a country for year-end digest email

* Add a filter to exclude raw data points when calculating yearly digests.
…rectory (Freika#2098)

* 0.37.1 (Freika#2092)

* fix: move foreman to global gems to fix startup crash (Freika#1971)

* Update exporting code to stream points data to file in batches to red… (Freika#1980)

* Update exporting code to stream points data to file in batches to reduce memory usage

* Update changelog

* Update changelog

* Feature/maplibre frontend (Freika#1953)

* Add a plan to use MapLibre GL JS for the frontend map rendering, replacing Leaflet

* Implement phase 1

* Phases 1-3 + part of 4

* Fix e2e tests

* Phase 6

* Implement fog of war

* Phase 7

* Next step: fix specs, phase 7 done

* Use our own map tiles

* Extract v2 map logic to separate manager classes

* Update settings panel on v2 map

* Update v2 e2e tests structure

* Reimplement location search in maps v2

* Update speed routes

* Implement visits and places creation in v2

* Fix last failing test

* Implement visits merging

* Fix a routes e2e test and simplify the routes layer styling.

* Extract js to modules from maps_v2_controller.js

* Implement area creation

* Fix spec problem

* Fix some e2e tests

* Implement live mode in v2 map

* Update icons and panel

* Extract some styles

* Remove unused file

* Start adding dark theme to popups on MapLibre maps

* Make popups respect dark theme

* Move v2 maps to maplibre namespace

* Update v2 references to maplibre

* Put place, area and visit info into side panel

* Update API to use safe settings config method

* Fix specs

* Fix method name to config in SafeSettings and update usages accordingly

* Add missing public files

* Add handling for real time points

* Fix remembering enabled/disabled layers of the v2 map

* Fix lots of e2e tests

* Add settings to select map version

* Use maps/v2 as main path for MapLibre maps

* Update routing

* Update live mode

* Update maplibre controller

* Update changelog

* Remove some console.log statements

* Pull only necessary data for map v2 points

* Feature/raw data archive (Freika#2009)

* 0.36.2 (Freika#2007)

* fix: move foreman to global gems to fix startup crash (Freika#1971)

* Update exporting code to stream points data to file in batches to red… (Freika#1980)

* Update exporting code to stream points data to file in batches to reduce memory usage

* Update changelog

* Update changelog

* Feature/maplibre frontend (Freika#1953)

* Add a plan to use MapLibre GL JS for the frontend map rendering, replacing Leaflet

* Implement phase 1

* Phases 1-3 + part of 4

* Fix e2e tests

* Phase 6

* Implement fog of war

* Phase 7

* Next step: fix specs, phase 7 done

* Use our own map tiles

* Extract v2 map logic to separate manager classes

* Update settings panel on v2 map

* Update v2 e2e tests structure

* Reimplement location search in maps v2

* Update speed routes

* Implement visits and places creation in v2

* Fix last failing test

* Implement visits merging

* Fix a routes e2e test and simplify the routes layer styling.

* Extract js to modules from maps_v2_controller.js

* Implement area creation

* Fix spec problem

* Fix some e2e tests

* Implement live mode in v2 map

* Update icons and panel

* Extract some styles

* Remove unused file

* Start adding dark theme to popups on MapLibre maps

* Make popups respect dark theme

* Move v2 maps to maplibre namespace

* Update v2 references to maplibre

* Put place, area and visit info into side panel

* Update API to use safe settings config method

* Fix specs

* Fix method name to config in SafeSettings and update usages accordingly

* Add missing public files

* Add handling for real time points

* Fix remembering enabled/disabled layers of the v2 map

* Fix lots of e2e tests

* Add settings to select map version

* Use maps/v2 as main path for MapLibre maps

* Update routing

* Update live mode

* Update maplibre controller

* Update changelog

* Remove some console.log statements

---------

Co-authored-by: Robin Tuszik <[email protected]>

* Remove esbuild scripts from package.json

* Remove sideEffects field from package.json

* Raw data archivation

* Add tests

* Fix tests

* Fix tests

* Update ExceptionReporter

* Add schedule to run raw data archival job monthly

* Change file structure for raw data archival feature

* Update changelog and version for raw data archival feature

---------

Co-authored-by: Robin Tuszik <[email protected]>

* Set raw_data to an empty hash instead of nil when archiving

* Fix storage configuration and file extraction

* Consider MIN_MINUTES_SPENT_IN_CITY during stats calculation (Freika#2018)

* Consider MIN_MINUTES_SPENT_IN_CITY during stats calculation

* Remove raw data from visited cities api endpoint

* Use user timezone to show dates on maps (Freika#2020)

* Fix/pre epoch time (Freika#2019)

* Use user timezone to show dates on maps

* Limit timestamps to valid range to prevent database errors when users enter pre-epoch dates.

* Limit timestamps to valid range to prevent database errors when users enter pre-epoch dates.

* Fix tests failing due to new index on stats table

* Fix failing specs

* Update redis client configuration to support unix socket connection

* Update changelog

* Fix kml kmz import issues (Freika#2023)

* Fix kml kmz import issues

* Refactor KML importer to improve readability and maintainability

* Implement moving points in map v2 and fix route rendering logic to ma… (Freika#2027)

* Implement moving points in map v2 and fix route rendering logic to match map v1.

* Fix route spec

* fix(maplibre): update date format to ISO 8601 (Freika#2029)

* Add verification step to raw data archival process (Freika#2028)

* Add verification step to raw data archival process

* Add actual verification of raw data archives after creation, and only clear raw_data for verified archives.

* Fix failing specs

* Eliminate zip-bomb risk

* Fix potential memory leak in js

* Return .keep files

* Use Toast instead of alert for notifications

* Add help section to navbar dropdown

* Update changelog

* Remove raw_data_archival_job

* Ensure file is being closed properly after reading in Archivable concern

* Add composite index to stats table if not exists

* Update changelog

* Update entrypoint to always sync static assets (not only new ones)

* Add family layer to MapLibre maps (Freika#2055)

* Add family layer to MapLibre maps

* Update migration

* Don't show family toggle if feature is disabled

* Update changelog

* Return changelog

* Update changelog

* Update tailwind file

* Bump sentry-rails from 6.0.0 to 6.1.0 (Freika#1945)

Bumps [sentry-rails](https://github.com/getsentry/sentry-ruby) from 6.0.0 to 6.1.0.
- [Release notes](https://github.com/getsentry/sentry-ruby/releases)
- [Changelog](https://github.com/getsentry/sentry-ruby/blob/master/CHANGELOG.md)
- [Commits](getsentry/sentry-ruby@6.0.0...6.1.0)

---
updated-dependencies:
- dependency-name: sentry-rails
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump turbo-rails from 2.0.17 to 2.0.20 (Freika#1944)

Bumps [turbo-rails](https://github.com/hotwired/turbo-rails) from 2.0.17 to 2.0.20.
- [Release notes](https://github.com/hotwired/turbo-rails/releases)
- [Commits](hotwired/turbo-rails@v2.0.17...v2.0.20)

---
updated-dependencies:
- dependency-name: turbo-rails
  dependency-version: 2.0.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evgenii Burmakin <[email protected]>

* Bump webmock from 3.25.1 to 3.26.1 (Freika#1943)

Bumps [webmock](https://github.com/bblimke/webmock) from 3.25.1 to 3.26.1.
- [Release notes](https://github.com/bblimke/webmock/releases)
- [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md)
- [Commits](bblimke/webmock@v3.25.1...v3.26.1)

---
updated-dependencies:
- dependency-name: webmock
  dependency-version: 3.26.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evgenii Burmakin <[email protected]>

* Bump brakeman from 7.1.0 to 7.1.1 (Freika#1942)

Bumps [brakeman](https://github.com/presidentbeef/brakeman) from 7.1.0 to 7.1.1.
- [Release notes](https://github.com/presidentbeef/brakeman/releases)
- [Changelog](https://github.com/presidentbeef/brakeman/blob/main/CHANGES.md)
- [Commits](presidentbeef/brakeman@v7.1.0...v7.1.1)

---
updated-dependencies:
- dependency-name: brakeman
  dependency-version: 7.1.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump redis from 5.4.0 to 5.4.1 (Freika#1941)

Bumps [redis](https://github.com/redis/redis-rb) from 5.4.0 to 5.4.1.
- [Changelog](https://github.com/redis/redis-rb/blob/master/CHANGELOG.md)
- [Commits](redis/redis-rb@v5.4.0...v5.4.1)

---
updated-dependencies:
- dependency-name: redis
  dependency-version: 5.4.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Put import deletion into background job (Freika#2045)

* Put import deletion into background job

* Update changelog

* fix null type error and update heatmap styling (Freika#2037)

* fix: use constant weight for maplibre heatmap layer

* fix null type, update heatmap styling

* improve heatmap styling

* fix typo

* Fix stats calculation to recursively reduce H3 resolution when too ma… (Freika#2065)

* Fix stats calculation to recursively reduce H3 resolution when too many hexagons are generated

* Update CHANGELOG.md

* Validate trip start and end dates (Freika#2066)

* Validate trip start and end dates

* Update changelog

* Update migration to clean up duplicate stats before adding unique index

* Fix fog of war radius setting being ignored and applying settings causing errors (Freika#2068)

* Update changelog

* Add Rack::Deflater middleware to config/application.rb to enable gzip compression for responses.

* Add composite index to points on user_id and timestamp

* Deduplicte points based on timestamp brought to unix time

* Fix/stats cache invalidation (Freika#2072)

* Fix family layer toggle in Map v2 settings for non-selfhosted env

* Invalidate cache

* Remove comments

* Remove comment

* Add new indicies to improve performance and remove unused ones to opt… (Freika#2078)

* Add new indicies to improve performance and remove unused ones to optimize database.

* Remove comments

* Update map search suggestions panel styling

* Add yearly digest (Freika#2073)

* Add yearly digest

* Rename YearlyDigests to Users::Digests

* Minor changes

* Update yearly digest layout and styles

* Add flags and chart to email

* Update colors

* Fix layout of stats in yearly digest view

* Remove cron job for yearly digest scheduling

* Update CHANGELOG.md

* Update digest email setting handling

* Allow sharing digest for 1 week or 1 month

* Change Digests Distance to Bigint

* Fix settings page

* Update changelog

* Add RailsPulse (Freika#2079)

* Add RailsPulse

* Add RailsPulse monitoring tool with basic HTTP authentication

* Bring points_count to integer

* Update migration and version

* Update rubocop issues

* Fix migrations and data verification to remove safety_assured blocks and handle missing points gracefully.

* Update version

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Robin Tuszik <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump trix in the npm_and_yarn group across 1 directory

Bumps the npm_and_yarn group with 1 update in the / directory: [trix](https://github.com/basecamp/trix).


Updates `trix` from 2.1.15 to 2.1.16
- [Release notes](https://github.com/basecamp/trix/releases)
- [Commits](basecamp/trix@v2.1.15...v2.1.16)

---
updated-dependencies:
- dependency-name: trix
  dependency-version: 2.1.16
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <[email protected]>

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Evgenii Burmakin <[email protected]>
Co-authored-by: Robin Tuszik <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [rubocop-rails](https://github.com/rubocop/rubocop-rails) from 2.33.4 to 2.34.2.
- [Release notes](https://github.com/rubocop/rubocop-rails/releases)
- [Changelog](https://github.com/rubocop/rubocop-rails/blob/master/CHANGELOG.md)
- [Commits](rubocop/rubocop-rails@v2.33.4...v2.34.2)

---
updated-dependencies:
- dependency-name: rubocop-rails
  dependency-version: 2.34.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [chartkick](https://github.com/ankane/chartkick) from 5.2.0 to 5.2.1.
- [Changelog](https://github.com/ankane/chartkick/blob/master/CHANGELOG.md)
- [Commits](ankane/chartkick@v5.2.0...v5.2.1)

---
updated-dependencies:
- dependency-name: chartkick
  dependency-version: 5.2.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [rubyzip](https://github.com/rubyzip/rubyzip) from 3.2.0 to 3.2.2.
- [Release notes](https://github.com/rubyzip/rubyzip/releases)
- [Changelog](https://github.com/rubyzip/rubyzip/blob/main/Changelog.md)
- [Commits](rubyzip/rubyzip@v3.2.0...v3.2.2)

---
updated-dependencies:
- dependency-name: rubyzip
  dependency-version: 3.2.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [sentry-ruby](https://github.com/getsentry/sentry-ruby) from 6.0.0 to 6.2.0.
- [Release notes](https://github.com/getsentry/sentry-ruby/releases)
- [Changelog](https://github.com/getsentry/sentry-ruby/blob/master/CHANGELOG.md)
- [Commits](getsentry/sentry-ruby@6.0.0...6.2.0)

---
updated-dependencies:
- dependency-name: sentry-ruby
  dependency-version: 6.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evgenii Burmakin <[email protected]>
Bumps [sidekiq](https://github.com/sidekiq/sidekiq) from 8.0.8 to 8.1.0.
- [Changelog](https://github.com/sidekiq/sidekiq/blob/main/Changes.md)
- [Commits](sidekiq/sidekiq@v8.0.8...v8.1.0)

---
updated-dependencies:
- dependency-name: sidekiq
  dependency-version: 8.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evgenii Burmakin <[email protected]>
Freika#2115)

* Update digest calculation to use actual time spent in countries based on consecutive points, avoiding double-counting days when crossing borders.

* Move methods to private
Freika#2133)

* Implement some performance improvements and caching for various features.

* Fix failing tests

* Implement routes behaviour in map v2 to match map v1

* Fix route highlighting

* Add fallbacks when retrieving full route features to handle cases where source data access methods vary.

* Fix some e2e tests
…Freika#2138)

* Add immediate verification and count validation to raw data archiving

* Remove verifying job

* Add archive metrics reporting

* Disable RailsPulse in Self-hosted Environments

* Remove user_id and points_count parameters from Metrics::Archives::Operation and related calls.
…reika#2145)

* Move points creation logic from background jobs to service objects

* Remove unused point creation jobs

* Update changelog
* Add tracks to map v2

* Remove console log

* Update tracks generation behavior to ignore distance threshold for frontend parity

* Extract logic to services from TracksController#index and add tests

* Move query logic for track listing into a service object.
@coderabbitai
Copy link

coderabbitai bot commented Jan 11, 2026

Caution

Review failed

The pull request is closed.

📝 Walkthrough

Walkthrough

This PR introduces synchronous point creation APIs for Overland and OwnTracks sources, adds a new Tracks API with GeoJSON serialization, implements route interaction features in MapLibre (hover, selection, info display), and adds comprehensive Prometheus metrics for archive operations. It removes background job enqueueing in favor of synchronous service execution and expands pagination support across multiple endpoints.

Changes

Cohort / File(s) Summary
Documentation
AGENTS.md, CHANGELOG.md, CLAUDE.md
Repository guidelines (project structure, architecture, testing, security), changelog entries for v0.37.3 fixes and v0.37.2 features, and documented unit mismatch in route drawing logic between Map v1 and v2.
Point Creation API Changes
app/controllers/api/v1/overland/batches_controller.rb, app/controllers/api/v1/owntracks/points_controller.rb
Replaced asynchronous job enqueueing with synchronous service calls (Overland::PointsCreator, OwnTracks::PointCreator). Added error handling with Sentry integration and standardized error responses.
New Tracks API
app/controllers/api/v1/tracks_controller.rb, app/queries/tracks/index_query.rb, app/serializers/tracks/geojson_serializer.rb, config/routes.rb
New Api::V1::TracksController#index with pagination and date-range filtering. Query object for scoped track retrieval and GeoJSON serialization of track data.
Pagination & Data Fetching Enhancements
app/controllers/api/v1/places_controller.rb, app/controllers/api/v1/visits_controller.rb, app/controllers/api/v1/points_controller.rb, app/controllers/api/v1/photos_controller.rb
Added optional pagination with headers (X-Current-Page, X-Total-Pages, X-Total-Count); optimized places query using ID-based union; conditional cache validation for photos; error handling in points update.
Point Creation Services (Synchronous)
app/services/overland/points_creator.rb, app/services/own_tracks/point_creator.rb, app/services/overland/params.rb
New synchronous creators with batch upsert via Point.upsert_all. Enhanced params parsing with altitude, velocity, tracker_id, ssid, accuracy data. Returns created point records with coordinates.
Archive Metrics Services
app/services/metrics/archives/compression_ratio.rb, app/services/metrics/archives/count_mismatch.rb, app/services/metrics/archives/operation.rb, app/services/metrics/archives/points_archived.rb, app/services/metrics/archives/size.rb, app/services/metrics/archives/verification.rb
New Prometheus metric emitters for archive lifecycle: compression ratio, count mismatches, operation status, archived points count, archive size, and verification duration/failures.
Archive Verification & Operations
app/services/points/raw_data/archiver.rb, app/services/points/raw_data/verifier.rb, app/services/points/raw_data/clearer.rb, app/services/points/raw_data/restorer.rb, app/services/points/raw_data/chunk_compressor.rb
Enhanced archiver with immediate verification post-archive, count mismatch detection, and metrics reporting. Compressor returns hash with data and count. Clearer and restorer emit operation metrics. Verifier adds timing and check classification.
Cache & Statistics
app/services/cache/preheating_job.rb, app/services/cache/invalidate_user_caches.rb, app/services/cache/clean.rb, app/models/user.rb, app/controllers/stats_controller.rb, app/services/stats/calculate_month.rb
New total_distance caching with 1-day expiry. Cache invalidation and cleanup methods. Stats controller refactored to use column selection and combined ordering. Calculate_month reuses point collection for toponym extraction.
Model Enhancements
app/models/points/raw_data_archive.rb
Added numeric constraint for point_count, metadata validation for expected/actual counts, and public methods verified? and count_mismatch?.
MapLibre Route Interactions
app/javascript/controllers/maps/maplibre/event_handlers.js
New route-aware interactions: hover effects, selection state tracking, start/end emoji markers, route info display. Added methods: handleRouteHover, handleRouteMouseLeave, handleRouteClick, clearRouteSelection, helpers for feature matching and marker creation.
MapLibre Layer & Data Management
app/javascript/controllers/maps/maplibre/layer_manager.js, app/javascript/controllers/maps/maplibre/map_data_manager.js, app/javascript/maps_maplibre/layers/routes_layer.js
Added routes-hit interaction layer with hover state. LayerManager now guards against duplicate event handler setup. MapDataManager wires route handlers to layer setup. RoutesLayer enhanced with hover source, hover route updates, and lifecycle overrides.
Route Utilities & Data Processing
app/javascript/maps_maplibre/utils/route_segmenter.js, app/javascript/maps_maplibre/services/api_client.js
New RouteSegmenter class for distance calculations, segment splitting, and route feature generation with IDL crossing support. API client adds parallelized pagination with maxConcurrent limit; new methods: fetchVisits, fetchPlaces, fetchTracks with per-page variants and progress reporting.
MapLibre UI & Settings
app/javascript/controllers/maps/maplibre_controller.js, app/javascript/maps/marker_factory.js, app/views/map/maplibre/_settings_panel.html.erb
Added route info UI targets and showRouteInfo method. Route info template for display. Settings panel re-enables and updates Tracks control description, adds route info UI template. Marker default size reduced from 8 to 4.
Track Segmentation
app/services/tracks/segmentation.rb, app/services/tracks/parallel_generator.rb
Removed distance-based segmentation logic; now time-only via time_gap_exceeded?. Added metadata field distance_threshold_behavior: 'ignored_for_frontend_parity'.
Background Job Removals
app/jobs/overland/batch_creating_job.rb, app/jobs/owntracks/point_creating_job.rb, app/jobs/users/mailer_sending_job.rb
Deleted batch and point creating jobs (replaced by synchronous services). Updated mailer job to use guard clause instead of skip_reason helper.
Infrastructure & Configuration
docker/web-entrypoint.sh, config/initializers/rails_pulse.rb, lib/tasks/demo.rake
Docker entrypoint adds optional Prometheus exporter startup. Rails Pulse now disabled in self-hosted environments. Demo rake task adds track creation (20 tracks) before family creation with haversine distance helper.
Distance Calculation
app/controllers/map/leaflet_controller.rb
Replaced Ruby-based distance aggregation with PostGIS SQL window function (LAG) for pairwise distance calculation. Added import_id filter path.
Visits Management
app/services/visits/find_in_time.rb, app/services/visits/find_within_bounding_box.rb
Broadened eager loading to include both :place and :area associations.
Debug Logging Cleanup
app/javascript/controllers/maps/maplibre/area_selection_manager.js, app/javascript/controllers/maps/maplibre/places_manager.js, app/javascript/controllers/maps/maplibre/visits_manager.js, app/javascript/maps_maplibre/layers/base_layer.js
Removed numerous console.log and console.error debug statements across area selection, places, visits, and base layer lifecycle.
E2E Tests - Routes
e2e/v2/map/interactions.spec.js
Comprehensive new test suite covering route hover, selection, info display, marker presence/removal, cursor changes, multiple route interactions, and deselection. Tests visual feedback and modal content.
E2E Tests - Tracks
e2e/v2/map/layers/tracks.spec.js
New test suite validating Tracks layer UI toggling, visibility, data integrity (LineString geometry, red color), metadata properties, styling, date navigation persistence.
E2E Tests - UI Interaction Updates
e2e/v2/map/layers/family.spec.js, e2e/v2/map/layers/points.spec.js, e2e/v2/map/search.spec.js
Updated family members test to data-driven assertions. Points tests replaced manual layer visibility checks with UI-driven checkbox toggling. Search tests wait for modal attachment before assertion.
E2E Test Helpers
e2e/v2/helpers/setup.js
Added utility functions: waitForSettingsPanel, waitForActiveTab, openSettingsTab, waitForLayer, waitForLayerVisibility for settings/layer interactions.
RSpec Tests - Point Creation
spec/requests/api/v1/overland/batches_spec.rb, spec/requests/api/v1/owntracks/points_spec.rb, spec/services/overland/points_creator_spec.rb, spec/services/own_tracks/point_creator_spec.rb
Updated API specs to assert immediate point creation instead of job enqueueing. Added service-level specs validating idempotency, invalid data handling, and coordinate extraction.
RSpec Tests - Tracks
spec/requests/api/v1/tracks_spec.rb, spec/serializers/tracks/geojson_serializer_spec.rb, spec/services/tracks/index_query_spec.rb
New specs for Tracks API (GeoJSON response, pagination, date range filtering), serializer structure validation, and query object behavior.
RSpec Tests - Archive Operations
spec/services/points/raw_data/archiver_spec.rb, spec/services/points/raw_data/chunk_compressor_spec.rb, spec/services/points/raw_data/verifier_spec.rb
Enhanced archiver tests with count validation and immediate verification. Compressor tests updated for hash return value.
RSpec Tests - Metrics
spec/services/metrics/archives/*.rb
New test files for all Prometheus metric emitters (compression_ratio, count_mismatch, operation, points_archived, size, verification) validating metric payload, labels, and disabled-exporter behavior.
RSpec Tests - Segmentation
spec/services/tracks/segmentation_spec.rb, spec/services/tracks/parallel_generator_spec.rb
New segmentation tests for time-gap-only splitting logic. Parallel generator tests validate distance_threshold_behavior metadata presence.
RSpec Tests - Removed
spec/jobs/overland/batch_creating_job_spec.rb, spec/jobs/owntracks/point_creating_job_spec.rb
Deleted job specs (jobs removed in favor of synchronous services).
RSpec Tests - Updated
spec/requests/api/v1/users_spec.rb
Updated user serializer tests to expect additional globe_projection setting key.
Test Fixtures
spec/factories/points_raw_data_archives.rb
Updated metadata factory to dynamically include expected_count and actual_count derived from point_count.

Sequence Diagrams

sequenceDiagram
    participant Client as External Client
    participant Controller as Overland/OwnTracks<br/>Controller
    participant Service as PointsCreator<br/>Service
    participant DB as Database<br/>(Point.upsert_all)
    
    Client->>Controller: POST batch/points with location data
    Controller->>Service: new(params, user_id).call
    Service->>Service: Parse & validate params<br/>(via Params class)
    Service->>Service: Filter incomplete locations
    Service->>Service: Merge user_id into payload
    Service->>DB: upsert_all with RETURNING<br/>(chunks of 1000)
    DB-->>Service: Created point records<br/>(id, timestamp, lon, lat)
    Service-->>Controller: Array of created points
    Controller-->>Client: JSON response<br/>(201 or error)
Loading
sequenceDiagram
    participant Client as API Client
    participant Controller as TracksController
    participant Query as Tracks::IndexQuery
    participant Serializer as Tracks::GeojsonSerializer
    participant DB as Database
    
    Client->>Controller: GET /api/v1/tracks?page=1&per_page=100
    Controller->>Query: new(user, params).call
    Query->>DB: Fetch user's tracks<br/>(ordered, date-filtered, paginated)
    DB-->>Query: Track records
    Query-->>Controller: Paginated relation +<br/>pagination_headers
    Controller->>Serializer: new(tracks).call
    Serializer->>Serializer: Convert each track to<br/>GeoJSON Feature
    Serializer-->>Controller: FeatureCollection
    Controller-->>Client: JSON + pagination headers<br/>(X-Current-Page, X-Total-Pages, X-Total-Count)
Loading
sequenceDiagram
    participant User as User<br/>(Map UI)
    participant Handler as EventHandlers
    participant Layer as LayerManager
    participant Source as MapLibre<br/>Sources
    
    User->>Handler: Hover over route
    Handler->>Handler: _getFullRouteFeature(properties)
    Handler->>Source: setData on hover source
    Source-->>Handler: Hover layer updates
    Handler->>Handler: _createRouteMarkers(features)<br/>(emoji markers)
    Handler-->>User: Visual feedback:<br/>highlight + markers
    
    User->>Handler: Click route
    Handler->>Handler: handleRouteClick(e)
    Handler->>Handler: Update selectedRouteFeature<br/>Compute metrics
    Handler->>User: Emit showRouteInfo<br/>(to controller)
    
    User->>Handler: Click outside route
    Handler->>Handler: clearRouteSelection()
    Handler->>Source: Clear hover data<br/>Clear markers
    Handler->>User: Deselect + close panel
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related PRs

  • 0.36.3 #2013: Modifies the archive verification and storage subsystem (Points::RawData::Archiver, ChunkCompressor, models, verifier/clearer services, and related tests) with overlapping archive implementation details.
  • 0.37.1 #2092: Updates app/services/points/raw_data/verifier.rb with changes to archive verification behavior and error handling for missing points.
  • 0.37.2 #2114: Introduces overlapping MapLibre changes (routes/tracks layers, globe projection settings, frontend serializers) and API endpoint modifications for map data.

Poem

🐰 Routes now glow when we hover near,
Tracks sing in red, crisp and clear,
Prometheus watches with metrics bright,
Synchronous points, forever in flight,
From jobs to services, the code runs tight!

✨ Finishing touches
  • 📝 Generate docstrings

📜 Recent review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f00460c and aec9df0.

📒 Files selected for processing (87)
  • AGENTS.md
  • CHANGELOG.md
  • CLAUDE.md
  • app/controllers/api/v1/overland/batches_controller.rb
  • app/controllers/api/v1/owntracks/points_controller.rb
  • app/controllers/api/v1/photos_controller.rb
  • app/controllers/api/v1/places_controller.rb
  • app/controllers/api/v1/points_controller.rb
  • app/controllers/api/v1/tracks_controller.rb
  • app/controllers/api/v1/visits_controller.rb
  • app/controllers/map/leaflet_controller.rb
  • app/controllers/stats_controller.rb
  • app/javascript/controllers/maps/maplibre/area_selection_manager.js
  • app/javascript/controllers/maps/maplibre/data_loader.js
  • app/javascript/controllers/maps/maplibre/event_handlers.js
  • app/javascript/controllers/maps/maplibre/layer_manager.js
  • app/javascript/controllers/maps/maplibre/map_data_manager.js
  • app/javascript/controllers/maps/maplibre/places_manager.js
  • app/javascript/controllers/maps/maplibre/visits_manager.js
  • app/javascript/controllers/maps/maplibre_controller.js
  • app/javascript/maps/marker_factory.js
  • app/javascript/maps_maplibre/layers/base_layer.js
  • app/javascript/maps_maplibre/layers/routes_layer.js
  • app/javascript/maps_maplibre/services/api_client.js
  • app/javascript/maps_maplibre/utils/route_segmenter.js
  • app/javascript/maps_maplibre/utils/settings_manager.js
  • app/jobs/cache/preheating_job.rb
  • app/jobs/overland/batch_creating_job.rb
  • app/jobs/owntracks/point_creating_job.rb
  • app/jobs/users/mailer_sending_job.rb
  • app/models/points/raw_data_archive.rb
  • app/models/user.rb
  • app/queries/tracks/index_query.rb
  • app/serializers/tracks/geojson_serializer.rb
  • app/services/cache/clean.rb
  • app/services/cache/invalidate_user_caches.rb
  • app/services/metrics/archives/compression_ratio.rb
  • app/services/metrics/archives/count_mismatch.rb
  • app/services/metrics/archives/operation.rb
  • app/services/metrics/archives/points_archived.rb
  • app/services/metrics/archives/size.rb
  • app/services/metrics/archives/verification.rb
  • app/services/overland/params.rb
  • app/services/overland/points_creator.rb
  • app/services/own_tracks/point_creator.rb
  • app/services/points/raw_data/archiver.rb
  • app/services/points/raw_data/chunk_compressor.rb
  • app/services/points/raw_data/clearer.rb
  • app/services/points/raw_data/restorer.rb
  • app/services/points/raw_data/verifier.rb
  • app/services/stats/calculate_month.rb
  • app/services/tracks/parallel_generator.rb
  • app/services/tracks/segmentation.rb
  • app/services/visits/find_in_time.rb
  • app/services/visits/find_within_bounding_box.rb
  • app/views/map/maplibre/_settings_panel.html.erb
  • config/initializers/rails_pulse.rb
  • config/routes.rb
  • docker/web-entrypoint.sh
  • e2e/v2/helpers/setup.js
  • e2e/v2/map/interactions.spec.js
  • e2e/v2/map/layers/family.spec.js
  • e2e/v2/map/layers/points.spec.js
  • e2e/v2/map/layers/tracks.spec.js
  • e2e/v2/map/search.spec.js
  • lib/tasks/demo.rake
  • spec/factories/points_raw_data_archives.rb
  • spec/jobs/overland/batch_creating_job_spec.rb
  • spec/jobs/owntracks/point_creating_job_spec.rb
  • spec/requests/api/v1/overland/batches_spec.rb
  • spec/requests/api/v1/owntracks/points_spec.rb
  • spec/requests/api/v1/tracks_spec.rb
  • spec/requests/api/v1/users_spec.rb
  • spec/serializers/tracks/geojson_serializer_spec.rb
  • spec/services/metrics/archives/compression_ratio_spec.rb
  • spec/services/metrics/archives/count_mismatch_spec.rb
  • spec/services/metrics/archives/operation_spec.rb
  • spec/services/metrics/archives/points_archived_spec.rb
  • spec/services/metrics/archives/size_spec.rb
  • spec/services/metrics/archives/verification_spec.rb
  • spec/services/overland/points_creator_spec.rb
  • spec/services/own_tracks/point_creator_spec.rb
  • spec/services/points/raw_data/archiver_spec.rb
  • spec/services/points/raw_data/chunk_compressor_spec.rb
  • spec/services/tracks/index_query_spec.rb
  • spec/services/tracks/parallel_generator_spec.rb
  • spec/services/tracks/segmentation_spec.rb

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@ArnyminerZ
Copy link
Author

Closing because trying to merge into master. Reopened as #2148

@ArnyminerZ ArnyminerZ closed this Jan 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

No immich photos in map view

3 participants