gitextract_7c6y4j0y/ ├── .app_version ├── .circleci/ │ └── config.yml ├── .devcontainer/ │ ├── Dockerfile │ ├── devcontainer.json │ └── docker-compose.yml ├── .dockerignore ├── .gitattributes ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ └── bug_report.md │ ├── dependabot.yml │ └── workflows/ │ ├── attach_compose.yml │ ├── biome.yml │ ├── build_and_push.yml │ ├── ci.yml │ ├── release_notifications.yml │ └── rubocop.yml ├── .gitignore ├── .rspec ├── .rubocop.yml ├── .ruby-version ├── AGENTS.md ├── CHANGELOG.md ├── CLAUDE.md ├── CONTRIBUTING.md ├── DEVELOPMENT.md ├── Gemfile ├── LICENSE ├── Procfile ├── Procfile.dev ├── Procfile.production ├── Procfile.prometheus.dev ├── README.md ├── Rakefile ├── app/ │ ├── assets/ │ │ ├── builds/ │ │ │ ├── .keep │ │ │ └── tailwind.css │ │ ├── config/ │ │ │ └── manifest.js │ │ ├── images/ │ │ │ ├── .keep │ │ │ └── favicon/ │ │ │ └── browserconfig.xml.erb │ │ └── stylesheets/ │ │ ├── actiontext.css │ │ ├── application.css │ │ ├── application.tailwind.css │ │ ├── leaflet.control.layers.tree.css │ │ ├── leaflet_theme.css │ │ ├── maplibre-gl.css │ │ ├── maps_maplibre.css │ │ ├── maps_maplibre_panel.css │ │ ├── maps_maplibre_replay.css │ │ └── maps_maplibre_timeline_feed.css │ ├── channels/ │ │ ├── application_cable/ │ │ │ ├── channel.rb │ │ │ └── connection.rb │ │ ├── family_locations_channel.rb │ │ ├── imports_channel.rb │ │ ├── notifications_channel.rb │ │ ├── points_channel.rb │ │ └── tracks_channel.rb │ ├── controllers/ │ │ ├── api/ │ │ │ └── v1/ │ │ │ ├── areas_controller.rb │ │ │ ├── countries/ │ │ │ │ ├── borders_controller.rb │ │ │ │ └── visited_cities_controller.rb │ │ │ ├── digests_controller.rb │ │ │ ├── families/ │ │ │ │ └── locations_controller.rb │ │ │ ├── health_controller.rb │ │ │ ├── imports_controller.rb │ │ │ ├── insights_controller.rb │ │ │ ├── locations_controller.rb │ │ │ ├── maps/ │ │ │ │ └── hexagons_controller.rb │ │ │ ├── overland/ │ │ │ │ └── batches_controller.rb │ │ │ ├── owntracks/ │ │ │ │ └── points_controller.rb │ │ │ ├── photos_controller.rb │ │ │ ├── places_controller.rb │ │ │ ├── plan_controller.rb │ │ │ ├── points/ │ │ │ │ └── tracked_months_controller.rb │ │ │ ├── points_controller.rb │ │ │ ├── settings_controller.rb │ │ │ ├── stats_controller.rb │ │ │ ├── subscriptions_controller.rb │ │ │ ├── tags_controller.rb │ │ │ ├── timeline_controller.rb │ │ │ ├── tracks/ │ │ │ │ └── points_controller.rb │ │ │ ├── tracks_controller.rb │ │ │ ├── users_controller.rb │ │ │ ├── visits/ │ │ │ │ └── possible_places_controller.rb │ │ │ └── visits_controller.rb │ │ ├── api_controller.rb │ │ ├── application_controller.rb │ │ ├── areas_controller.rb │ │ ├── auth/ │ │ │ └── ios_controller.rb │ │ ├── concerns/ │ │ │ ├── .keep │ │ │ ├── flash_streamable.rb │ │ │ ├── safe_timestamp_parser.rb │ │ │ ├── sortable.rb │ │ │ └── utm_trackable.rb │ │ ├── exports_controller.rb │ │ ├── families_controller.rb │ │ ├── family/ │ │ │ ├── invitations_controller.rb │ │ │ ├── location_requests_controller.rb │ │ │ ├── location_sharing_controller.rb │ │ │ └── memberships_controller.rb │ │ ├── home_controller.rb │ │ ├── imports_controller.rb │ │ ├── insights_controller.rb │ │ ├── map/ │ │ │ ├── leaflet_controller.rb │ │ │ ├── maplibre_controller.rb │ │ │ └── timeline_feeds_controller.rb │ │ ├── metrics_controller.rb │ │ ├── notifications_controller.rb │ │ ├── places_controller.rb │ │ ├── points_controller.rb │ │ ├── settings/ │ │ │ ├── background_jobs_controller.rb │ │ │ ├── general_controller.rb │ │ │ ├── integrations_controller.rb │ │ │ ├── maps_controller.rb │ │ │ ├── onboardings_controller.rb │ │ │ └── users_controller.rb │ │ ├── settings_controller.rb │ │ ├── shared/ │ │ │ ├── digests_controller.rb │ │ │ └── stats_controller.rb │ │ ├── stats_controller.rb │ │ ├── tags_controller.rb │ │ ├── trips_controller.rb │ │ ├── users/ │ │ │ ├── digests_controller.rb │ │ │ ├── omniauth_callbacks_controller.rb │ │ │ ├── registrations_controller.rb │ │ │ └── sessions_controller.rb │ │ └── visits_controller.rb │ ├── helpers/ │ │ ├── application_helper.rb │ │ ├── country_flag_helper.rb │ │ ├── datetime_formatting_helper.rb │ │ ├── flash_helper.rb │ │ ├── insights_helper.rb │ │ ├── month_styling_helper.rb │ │ ├── points_helper.rb │ │ ├── stats_comparison_helper.rb │ │ ├── stats_helper.rb │ │ ├── tags_helper.rb │ │ ├── trips_helper.rb │ │ ├── user_helper.rb │ │ └── users/ │ │ └── digests_helper.rb │ ├── javascript/ │ │ ├── README.md │ │ ├── application.js │ │ ├── channels/ │ │ │ ├── consumer.js │ │ │ ├── family_locations_channel.js │ │ │ ├── imports_channel.js │ │ │ ├── index.js │ │ │ ├── notifications_channel.js │ │ │ └── points_channel.js │ │ ├── controllers/ │ │ │ ├── activity_heatmap_controller.js │ │ │ ├── add_visit_controller.js │ │ │ ├── application.js │ │ │ ├── area_creation_v2_controller.js │ │ │ ├── area_drawer_controller.js │ │ │ ├── area_selector_controller.js │ │ │ ├── base_controller.js │ │ │ ├── checkbox_select_all_controller.js │ │ │ ├── clipboard_controller.js │ │ │ ├── color_picker_controller.js │ │ │ ├── datetime_controller.js │ │ │ ├── emoji_picker_controller.js │ │ │ ├── family_members_controller.js │ │ │ ├── family_navbar_indicator_controller.js │ │ │ ├── flash_controller.js │ │ │ ├── imports_controller.js │ │ │ ├── index.js │ │ │ ├── location_sharing_toggle_controller.js │ │ │ ├── map_controls_controller.js │ │ │ ├── map_panel_controller.js │ │ │ ├── map_preview_controller.js │ │ │ ├── maps/ │ │ │ │ ├── maplibre/ │ │ │ │ │ ├── area_selection_manager.js │ │ │ │ │ ├── data_loader.js │ │ │ │ │ ├── date_manager.js │ │ │ │ │ ├── event_handlers.js │ │ │ │ │ ├── filter_manager.js │ │ │ │ │ ├── layer_manager.js │ │ │ │ │ ├── map_data_manager.js │ │ │ │ │ ├── map_initializer.js │ │ │ │ │ ├── places_manager.js │ │ │ │ │ ├── routes_manager.js │ │ │ │ │ ├── settings_manager.js │ │ │ │ │ └── visits_manager.js │ │ │ │ ├── maplibre_controller.js │ │ │ │ └── maplibre_realtime_controller.js │ │ │ ├── maps_controller.js │ │ │ ├── notifications_controller.js │ │ │ ├── onboarding_modal_controller.js │ │ │ ├── place_creation_controller.js │ │ │ ├── places_filter_controller.js │ │ │ ├── privacy_radius_controller.js │ │ │ ├── public_stat_map_controller.js │ │ │ ├── removals_controller.js │ │ │ ├── sharing_modal_controller.js │ │ │ ├── speed_color_editor_controller.js │ │ │ ├── stat_page_controller.js │ │ │ ├── timeline_feed_controller.js │ │ │ ├── trip_map_controller.js │ │ │ ├── trips_controller.js │ │ │ ├── upload_controller.js │ │ │ ├── visit_creation_v2_controller.js │ │ │ ├── visit_modal_map_controller.js │ │ │ ├── visit_modal_places_controller.js │ │ │ ├── visit_name_controller.js │ │ │ └── visits_map_controller.js │ │ ├── maps/ │ │ │ ├── areas.js │ │ │ ├── country_codes.js │ │ │ ├── fog_of_war.js │ │ │ ├── helpers.js │ │ │ ├── layers.js │ │ │ ├── live_map_handler.js │ │ │ ├── location_search.js │ │ │ ├── map_controls.js │ │ │ ├── marker_factory.js │ │ │ ├── markers.js │ │ │ ├── photos.js │ │ │ ├── places.js │ │ │ ├── places_control.js │ │ │ ├── polylines.js │ │ │ ├── popups.js │ │ │ ├── privacy_zones.js │ │ │ ├── raster_maps_config.js │ │ │ ├── scratch_layer.js │ │ │ ├── theme_utils.js │ │ │ ├── tracks.js │ │ │ ├── vector_maps_config.js │ │ │ └── visits.js │ │ ├── maps_maplibre/ │ │ │ ├── channels/ │ │ │ │ └── map_channel.js │ │ │ ├── components/ │ │ │ │ ├── photo_popup.js │ │ │ │ ├── toast.js │ │ │ │ ├── upgrade_banner.js │ │ │ │ ├── visit_card.js │ │ │ │ └── visit_popup.js │ │ │ ├── layers/ │ │ │ │ ├── areas_layer.js │ │ │ │ ├── base_layer.js │ │ │ │ ├── family_layer.js │ │ │ │ ├── fog_layer.js │ │ │ │ ├── heatmap_layer.js │ │ │ │ ├── photos_layer.js │ │ │ │ ├── places_layer.js │ │ │ │ ├── points_layer.js │ │ │ │ ├── recent_point_layer.js │ │ │ │ ├── replay_marker_layer.js │ │ │ │ ├── routes_layer.js │ │ │ │ ├── scratch_layer.js │ │ │ │ ├── selected_points_layer.js │ │ │ │ ├── selection_layer.js │ │ │ │ ├── track_points_layer.js │ │ │ │ ├── tracks_layer.js │ │ │ │ └── visits_layer.js │ │ │ ├── managers/ │ │ │ │ └── replay_manager.js │ │ │ ├── services/ │ │ │ │ ├── api_client.js │ │ │ │ └── location_search_service.js │ │ │ └── utils/ │ │ │ ├── cleanup_helper.js │ │ │ ├── fps_monitor.js │ │ │ ├── geojson_transformers.js │ │ │ ├── geometry.js │ │ │ ├── layer_gate.js │ │ │ ├── lazy_loader.js │ │ │ ├── performance_monitor.js │ │ │ ├── popup_theme.js │ │ │ ├── progressive_loader.js │ │ │ ├── route_segmenter.js │ │ │ ├── search_manager.js │ │ │ ├── settings_manager.js │ │ │ ├── speed_colors.js │ │ │ ├── style_manager.js │ │ │ └── websocket_manager.js │ │ ├── posthog.js │ │ └── styles/ │ │ └── visits.css │ ├── jobs/ │ │ ├── app_version_checking_job.rb │ │ ├── application_job.rb │ │ ├── area_visits_calculating_job.rb │ │ ├── area_visits_calculation_scheduling_job.rb │ │ ├── bulk_stats_calculating_job.rb │ │ ├── bulk_visits_suggesting_job.rb │ │ ├── cache/ │ │ │ ├── cleaning_job.rb │ │ │ └── preheating_job.rb │ │ ├── concerns/ │ │ │ └── user_timezone.rb │ │ ├── data_migrations/ │ │ │ ├── backfill_country_name_job.rb │ │ │ ├── backfill_motion_data_job.rb │ │ │ ├── backfill_onboarding_completed_job.rb │ │ │ ├── fix_route_opacity_job.rb │ │ │ ├── migrate_places_lonlat_job.rb │ │ │ ├── migrate_points_latlon_job.rb │ │ │ ├── prefill_points_counter_cache_job.rb │ │ │ ├── set_points_country_ids_job.rb │ │ │ ├── set_reverse_geocoded_at_for_points_job.rb │ │ │ └── start_settings_points_country_ids_job.rb │ │ ├── enqueue_background_job.rb │ │ ├── export_job.rb │ │ ├── families/ │ │ │ └── expire_location_requests_job.rb │ │ ├── family/ │ │ │ └── invitations/ │ │ │ ├── cleanup_job.rb │ │ │ └── sending_job.rb │ │ ├── import/ │ │ │ ├── google_takeout_job.rb │ │ │ ├── immich_geodata_job.rb │ │ │ ├── photoprism_geodata_job.rb │ │ │ ├── process_job.rb │ │ │ ├── update_points_count_job.rb │ │ │ └── watcher_job.rb │ │ ├── imports/ │ │ │ └── destroy_job.rb │ │ ├── lite/ │ │ │ └── archival_warning_job.rb │ │ ├── place_visits_calculating_job.rb │ │ ├── places/ │ │ │ ├── bulk_name_fetching_job.rb │ │ │ └── name_fetching_job.rb │ │ ├── points/ │ │ │ ├── create_job.rb │ │ │ ├── nightly_reverse_geocoding_job.rb │ │ │ └── raw_data/ │ │ │ ├── archive_job.rb │ │ │ └── re_archive_month_job.rb │ │ ├── reverse_geocoding_job.rb │ │ ├── stale_jobs_recovery_job.rb │ │ ├── stats/ │ │ │ └── calculating_job.rb │ │ ├── tracks/ │ │ │ ├── boundary_resolver_job.rb │ │ │ ├── daily_generation_job.rb │ │ │ ├── deduplication_job.rb │ │ │ ├── parallel_generator_job.rb │ │ │ ├── realtime_generation_job.rb │ │ │ ├── recalculate_job.rb │ │ │ ├── time_chunk_processor_job.rb │ │ │ └── transportation_mode_recalculation_job.rb │ │ ├── transportation_modes/ │ │ │ ├── backfill_job.rb │ │ │ └── import_backfill_job.rb │ │ ├── trips/ │ │ │ ├── calculate_all_job.rb │ │ │ ├── calculate_countries_job.rb │ │ │ ├── calculate_distance_job.rb │ │ │ └── calculate_path_job.rb │ │ ├── users/ │ │ │ ├── destroy_job.rb │ │ │ ├── digests/ │ │ │ │ ├── calculating_job.rb │ │ │ │ ├── email_sending_job.rb │ │ │ │ └── year_end_scheduling_job.rb │ │ │ ├── export_data_job.rb │ │ │ ├── import_data_job.rb │ │ │ ├── mailer_sending_job.rb │ │ │ ├── recalculate_data_job.rb │ │ │ └── trial_webhook_job.rb │ │ └── visit_suggesting_job.rb │ ├── mailers/ │ │ ├── application_mailer.rb │ │ ├── family_mailer.rb │ │ ├── users/ │ │ │ └── digests_mailer.rb │ │ └── users_mailer.rb │ ├── models/ │ │ ├── application_record.rb │ │ ├── area.rb │ │ ├── concerns/ │ │ │ ├── .keep │ │ │ ├── archivable.rb │ │ │ ├── calculateable.rb │ │ │ ├── distance_convertible.rb │ │ │ ├── distanceable.rb │ │ │ ├── nearable.rb │ │ │ ├── omniauthable.rb │ │ │ ├── plan_scopable.rb │ │ │ ├── point_validation.rb │ │ │ ├── soft_deletable.rb │ │ │ ├── taggable.rb │ │ │ └── user_family.rb │ │ ├── country.rb │ │ ├── export.rb │ │ ├── family/ │ │ │ ├── invitation.rb │ │ │ ├── location_request.rb │ │ │ └── membership.rb │ │ ├── family.rb │ │ ├── import.rb │ │ ├── notification.rb │ │ ├── place.rb │ │ ├── place_visit.rb │ │ ├── point.rb │ │ ├── points/ │ │ │ └── raw_data_archive.rb │ │ ├── stat.rb │ │ ├── tag.rb │ │ ├── tagging.rb │ │ ├── track.rb │ │ ├── track_segment.rb │ │ ├── trip.rb │ │ ├── user.rb │ │ ├── users/ │ │ │ └── digest.rb │ │ ├── visit.rb │ │ └── visit_draft.rb │ ├── policies/ │ │ ├── application_policy.rb │ │ ├── family/ │ │ │ ├── invitation_policy.rb │ │ │ └── membership_policy.rb │ │ ├── family_policy.rb │ │ ├── import_policy.rb │ │ ├── insights_policy.rb │ │ ├── place_policy.rb │ │ └── tag_policy.rb │ ├── queries/ │ │ ├── stats/ │ │ │ ├── daily_distance_query.rb │ │ │ └── time_of_day_query.rb │ │ ├── stats_query.rb │ │ └── tracks/ │ │ └── index_query.rb │ ├── serializers/ │ │ ├── api/ │ │ │ ├── digest_detail_serializer.rb │ │ │ ├── digest_list_serializer.rb │ │ │ ├── insights_details_serializer.rb │ │ │ ├── insights_overview_serializer.rb │ │ │ ├── location_search_result_serializer.rb │ │ │ ├── photo_serializer.rb │ │ │ ├── place_serializer.rb │ │ │ ├── point_serializer.rb │ │ │ ├── slim_point_serializer.rb │ │ │ ├── user_serializer.rb │ │ │ └── visit_serializer.rb │ │ ├── export_serializer.rb │ │ ├── exports/ │ │ │ ├── point_geojson_serializer.rb │ │ │ └── point_gpx_serializer.rb │ │ ├── point_serializer.rb │ │ ├── points/ │ │ │ ├── geojson_serializer.rb │ │ │ └── gpx_serializer.rb │ │ ├── stats_serializer.rb │ │ ├── tag_serializer.rb │ │ ├── track_serializer.rb │ │ ├── tracks/ │ │ │ └── geojson_serializer.rb │ │ └── tracks_serializer.rb │ ├── services/ │ │ ├── areas/ │ │ │ └── visits/ │ │ │ └── create.rb │ │ ├── cache/ │ │ │ ├── clean.rb │ │ │ ├── invalidate_user_caches.rb │ │ │ └── preheat_insights_digests.rb │ │ ├── check_app_version.rb │ │ ├── concerns/ │ │ │ └── ssl_configurable.rb │ │ ├── countries/ │ │ │ └── iso_code_mapper.rb │ │ ├── countries_and_cities.rb │ │ ├── exception_reporter.rb │ │ ├── exports/ │ │ │ └── create.rb │ │ ├── families/ │ │ │ ├── accept_invitation.rb │ │ │ ├── create.rb │ │ │ ├── create_location_request.rb │ │ │ ├── invite.rb │ │ │ ├── locations.rb │ │ │ ├── memberships/ │ │ │ │ └── destroy.rb │ │ │ └── update_location_sharing.rb │ │ ├── geojson/ │ │ │ ├── importer.rb │ │ │ └── params.rb │ │ ├── google_maps/ │ │ │ ├── phone_takeout_importer.rb │ │ │ ├── records_importer.rb │ │ │ ├── records_storage_importer.rb │ │ │ └── semantic_history_importer.rb │ │ ├── gpx/ │ │ │ └── track_importer.rb │ │ ├── immich/ │ │ │ ├── connection_tester.rb │ │ │ ├── import_geodata.rb │ │ │ ├── request_photos.rb │ │ │ ├── response_analyzer.rb │ │ │ └── response_validator.rb │ │ ├── imports/ │ │ │ ├── broadcaster.rb │ │ │ ├── create.rb │ │ │ ├── destroy.rb │ │ │ ├── file_loader.rb │ │ │ ├── secure_file_downloader.rb │ │ │ ├── source_detector.rb │ │ │ └── watcher.rb │ │ ├── insights/ │ │ │ ├── activity_heatmap_calculator.rb │ │ │ ├── travel_insight_generator.rb │ │ │ ├── travel_patterns_loader.rb │ │ │ ├── year_comparison_calculator.rb │ │ │ └── year_totals_calculator.rb │ │ ├── jobs/ │ │ │ └── create.rb │ │ ├── kml/ │ │ │ └── importer.rb │ │ ├── location_search/ │ │ │ ├── geocoding_service.rb │ │ │ ├── point_finder.rb │ │ │ ├── result_aggregator.rb │ │ │ └── spatial_matcher.rb │ │ ├── maps/ │ │ │ ├── bounds_calculator.rb │ │ │ ├── hexagon_center_manager.rb │ │ │ ├── hexagon_polygon_generator.rb │ │ │ └── hexagon_request_handler.rb │ │ ├── metrics/ │ │ │ └── archives/ │ │ │ ├── compression_ratio.rb │ │ │ ├── count_mismatch.rb │ │ │ ├── operation.rb │ │ │ ├── points_archived.rb │ │ │ ├── size.rb │ │ │ └── verification.rb │ │ ├── notifications.rb │ │ ├── overland/ │ │ │ ├── params.rb │ │ │ └── points_creator.rb │ │ ├── own_tracks/ │ │ │ ├── importer.rb │ │ │ ├── params.rb │ │ │ ├── point_creator.rb │ │ │ └── rec_parser.rb │ │ ├── photoprism/ │ │ │ ├── cache_preview_token.rb │ │ │ ├── connection_tester.rb │ │ │ ├── import_geodata.rb │ │ │ ├── request_photos.rb │ │ │ └── response_validator.rb │ │ ├── photos/ │ │ │ ├── cache_cleaner.rb │ │ │ ├── importer.rb │ │ │ ├── search.rb │ │ │ └── thumbnail.rb │ │ ├── places/ │ │ │ ├── name_fetcher.rb │ │ │ ├── nearby_search.rb │ │ │ └── visits/ │ │ │ └── create.rb │ │ ├── points/ │ │ │ ├── create.rb │ │ │ ├── live_broadcaster.rb │ │ │ ├── motion_data_extractor.rb │ │ │ ├── params.rb │ │ │ ├── raw_data/ │ │ │ │ ├── archiver.rb │ │ │ │ ├── chunk_compressor.rb │ │ │ │ ├── clearer.rb │ │ │ │ ├── encryption.rb │ │ │ │ ├── restorer.rb │ │ │ │ └── verifier.rb │ │ │ └── raw_data_lonlat_extractor.rb │ │ ├── points_limit_exceeded.rb │ │ ├── prometheus_metrics.rb │ │ ├── reverse_geocoding/ │ │ │ ├── places/ │ │ │ │ └── fetch_data.rb │ │ │ └── points/ │ │ │ └── fetch_data.rb │ │ ├── settings/ │ │ │ └── update.rb │ │ ├── stats/ │ │ │ ├── bulk_calculator.rb │ │ │ ├── calculate_month.rb │ │ │ └── hexagon_calculator.rb │ │ ├── subscription/ │ │ │ ├── decode_jwt_token.rb │ │ │ └── encode_jwt_token.rb │ │ ├── supporter/ │ │ │ └── verify_email.rb │ │ ├── tasks/ │ │ │ └── imports/ │ │ │ └── google_records.rb │ │ ├── timeline/ │ │ │ └── day_assembler.rb │ │ ├── tracks/ │ │ │ ├── boundary_detector.rb │ │ │ ├── build_path.rb │ │ │ ├── deduplicator.rb │ │ │ ├── incremental_generator.rb │ │ │ ├── merger.rb │ │ │ ├── parallel_generator.rb │ │ │ ├── realtime_debouncer.rb │ │ │ ├── reprocessor.rb │ │ │ ├── segmentation.rb │ │ │ ├── session_manager.rb │ │ │ ├── time_chunker.rb │ │ │ ├── track_builder.rb │ │ │ └── transportation_recalculation_status.rb │ │ ├── transportation_modes/ │ │ │ ├── activity_backfiller.rb │ │ │ ├── detector.rb │ │ │ ├── mode_classifier.rb │ │ │ ├── movement_analyzer.rb │ │ │ └── source_data_extractor.rb │ │ ├── trips/ │ │ │ └── photos.rb │ │ ├── users/ │ │ │ ├── destroy.rb │ │ │ ├── digests/ │ │ │ │ ├── activity_breakdown_calculator.rb │ │ │ │ ├── calculate_month.rb │ │ │ │ ├── calculate_year.rb │ │ │ │ ├── first_time_visits_calculator.rb │ │ │ │ ├── month_over_month_calculator.rb │ │ │ │ ├── monthly_first_time_visits_calculator.rb │ │ │ │ ├── seasonality_calculator.rb │ │ │ │ └── year_over_year_calculator.rb │ │ │ ├── export_data/ │ │ │ │ ├── areas.rb │ │ │ │ ├── digests.rb │ │ │ │ ├── exports.rb │ │ │ │ ├── imports.rb │ │ │ │ ├── notifications.rb │ │ │ │ ├── places.rb │ │ │ │ ├── points.rb │ │ │ │ ├── stats.rb │ │ │ │ ├── tracks.rb │ │ │ │ ├── trips.rb │ │ │ │ └── visits.rb │ │ │ ├── export_data.rb │ │ │ ├── import_data/ │ │ │ │ ├── areas.rb │ │ │ │ ├── digests.rb │ │ │ │ ├── exports.rb │ │ │ │ ├── imports.rb │ │ │ │ ├── notifications.rb │ │ │ │ ├── places.rb │ │ │ │ ├── points.rb │ │ │ │ ├── raw_data_archives.rb │ │ │ │ ├── settings.rb │ │ │ │ ├── stats.rb │ │ │ │ ├── taggings.rb │ │ │ │ ├── tags.rb │ │ │ │ ├── tracks.rb │ │ │ │ ├── trips.rb │ │ │ │ ├── v1_handler.rb │ │ │ │ ├── v2_handler.rb │ │ │ │ └── visits.rb │ │ │ ├── import_data.rb │ │ │ ├── safe_settings.rb │ │ │ └── transportation_thresholds_updater.rb │ │ └── visits/ │ │ ├── bulk_update.rb │ │ ├── create.rb │ │ ├── creator.rb │ │ ├── detector.rb │ │ ├── find_in_time.rb │ │ ├── find_within_bounding_box.rb │ │ ├── finder.rb │ │ ├── group.rb │ │ ├── merge_service.rb │ │ ├── merger.rb │ │ ├── names/ │ │ │ ├── builder.rb │ │ │ ├── fetcher.rb │ │ │ └── suggester.rb │ │ ├── place_finder.rb │ │ ├── smart_detect.rb │ │ ├── suggest.rb │ │ └── time_chunks.rb │ └── views/ │ ├── active_storage/ │ │ └── blobs/ │ │ └── _blob.html.erb │ ├── application/ │ │ └── _favicon.html.erb │ ├── devise/ │ │ ├── confirmations/ │ │ │ └── new.html.erb │ │ ├── mailer/ │ │ │ ├── confirmation_instructions.html.erb │ │ │ ├── email_changed.html.erb │ │ │ ├── password_change.html.erb │ │ │ ├── reset_password_instructions.html.erb │ │ │ └── unlock_instructions.html.erb │ │ ├── passwords/ │ │ │ ├── edit.html.erb │ │ │ └── new.html.erb │ │ ├── registrations/ │ │ │ ├── _api_key.html.erb │ │ │ ├── _points_usage.html.erb │ │ │ ├── edit.html.erb │ │ │ └── new.html.erb │ │ ├── sessions/ │ │ │ └── new.html.erb │ │ ├── shared/ │ │ │ ├── _error_messages.html.erb │ │ │ └── _links.html.erb │ │ └── unlocks/ │ │ └── new.html.erb │ ├── exports/ │ │ ├── _table_row.html.erb │ │ └── index.html.erb │ ├── families/ │ │ ├── _location_sharing_toggle.html.erb │ │ ├── _navbar_indicator.html.erb │ │ ├── edit.html.erb │ │ ├── index.html.erb │ │ ├── new.html.erb │ │ └── show.html.erb │ ├── family/ │ │ ├── invitations/ │ │ │ ├── index.html.erb │ │ │ └── show.html.erb │ │ └── location_requests/ │ │ └── show.html.erb │ ├── family_mailer/ │ │ ├── invitation.html.erb │ │ ├── invitation.text.erb │ │ ├── location_request.html.erb │ │ ├── location_request.text.erb │ │ ├── member_joined.html.erb │ │ └── member_joined.text.erb │ ├── home/ │ │ └── index.html.erb │ ├── imports/ │ │ ├── _form.html.erb │ │ ├── _import.html.erb │ │ ├── _table_row.html.erb │ │ ├── destroy.turbo_stream.erb │ │ ├── edit.html.erb │ │ ├── index.html.erb │ │ ├── new.html.erb │ │ └── show.html.erb │ ├── insights/ │ │ ├── _activity_breakdown.html.erb │ │ ├── _activity_heatmap.html.erb │ │ ├── _activity_heatmap_cells.html.erb │ │ ├── _activity_streak.html.erb │ │ ├── _details_skeleton.html.erb │ │ ├── _header.html.erb │ │ ├── _location_clusters.html.erb │ │ ├── _monthly_digest.html.erb │ │ ├── _movement_wellness.html.erb │ │ ├── _pro_locked_card.html.erb │ │ ├── _stats_row.html.erb │ │ ├── _top_visited_locations.html.erb │ │ ├── _travel_patterns.html.erb │ │ ├── _travel_story.html.erb │ │ ├── _year_comparison.html.erb │ │ ├── details.html.erb │ │ └── index.html.erb │ ├── kaminari/ │ │ ├── _first_page.html.erb │ │ ├── _gap.html.erb │ │ ├── _last_page.html.erb │ │ ├── _next_page.html.erb │ │ ├── _page.html.erb │ │ ├── _paginator.html.erb │ │ └── _prev_page.html.erb │ ├── layouts/ │ │ ├── action_text/ │ │ │ └── contents/ │ │ │ └── _content.html.erb │ │ ├── application.html.erb │ │ ├── mailer.html.erb │ │ ├── mailer.text.erb │ │ └── map.html.erb │ ├── map/ │ │ ├── _onboarding_modal.html.erb │ │ ├── leaflet/ │ │ │ ├── _settings_modals.html.erb │ │ │ └── index.html.erb │ │ ├── maplibre/ │ │ │ ├── _area_creation_modal.html.erb │ │ │ ├── _replay_panel.html.erb │ │ │ ├── _settings_panel.html.erb │ │ │ ├── _visit_creation_modal.html.erb │ │ │ ├── _webgl_error.html.erb │ │ │ └── index.html.erb │ │ └── timeline_feeds/ │ │ ├── _day.html.erb │ │ ├── _day_summary.html.erb │ │ ├── _feed.html.erb │ │ ├── _journey_entry.html.erb │ │ ├── _track_info.html.erb │ │ ├── _visit_entry.html.erb │ │ ├── index.html.erb │ │ └── track_info.html.erb │ ├── notifications/ │ │ ├── _badge.html.erb │ │ ├── _navbar_item.html.erb │ │ ├── _notification.html.erb │ │ ├── index.html.erb │ │ └── show.html.erb │ ├── places/ │ │ ├── _nearby_places.html.erb │ │ └── index.html.erb │ ├── points/ │ │ ├── _point.html.erb │ │ └── index.html.erb │ ├── settings/ │ │ ├── _navigation.html.erb │ │ ├── background_jobs/ │ │ │ └── index.html.erb │ │ ├── general/ │ │ │ ├── _supporter_status.html.erb │ │ │ └── index.html.erb │ │ ├── integrations/ │ │ │ └── index.html.erb │ │ ├── maps/ │ │ │ └── index.html.erb │ │ ├── subscriptions/ │ │ │ └── index.html.erb │ │ └── users/ │ │ ├── edit.html.erb │ │ ├── index.html.erb │ │ └── show.html.erb │ ├── shared/ │ │ ├── _chartkick_scripts.html.erb │ │ ├── _flash.html.erb │ │ ├── _flash_message.html.erb │ │ ├── _footer.html.erb │ │ ├── _legal_footer.html.erb │ │ ├── _navbar.html.erb │ │ ├── _place_creation_modal.html.erb │ │ ├── _plan_data_window_alert.html.erb │ │ ├── _sharing_link.html.erb │ │ ├── _sharing_modal.html.erb │ │ ├── _trix_scripts.html.erb │ │ ├── map/ │ │ │ ├── _date_navigation.html.erb │ │ │ ├── _date_navigation_v2.html.erb │ │ │ └── _upgrade_banner.html.erb │ │ └── navbar/ │ │ ├── _help_links.html.erb │ │ └── _theme_toggle.html.erb │ ├── stats/ │ │ ├── _locked_year_card.html.erb │ │ ├── _month.html.erb │ │ ├── _reverse_geocoding_stats.html.erb │ │ ├── _stat.html.erb │ │ ├── _year.html.erb │ │ ├── index.html.erb │ │ ├── month.html.erb │ │ ├── public_month.html.erb │ │ └── show.html.erb │ ├── tags/ │ │ ├── _form.html.erb │ │ ├── edit.html.erb │ │ ├── index.html.erb │ │ └── new.html.erb │ ├── trips/ │ │ ├── _countries.html.erb │ │ ├── _distance.html.erb │ │ ├── _form.html.erb │ │ ├── _path.html.erb │ │ ├── _trip.html.erb │ │ ├── edit.html.erb │ │ ├── index.html.erb │ │ ├── new.html.erb │ │ └── show.html.erb │ ├── users/ │ │ ├── digests/ │ │ │ ├── index.html.erb │ │ │ ├── public_year.html.erb │ │ │ └── show.html.erb │ │ └── digests_mailer/ │ │ ├── year_end_digest.html.erb │ │ └── year_end_digest.text.erb │ ├── users_mailer/ │ │ ├── archival_approaching.html.erb │ │ ├── archival_approaching.text.erb │ │ ├── explore_features.html.erb │ │ ├── explore_features.text.erb │ │ ├── post_trial_reminder_early.html.erb │ │ ├── post_trial_reminder_early.text.erb │ │ ├── post_trial_reminder_late.html.erb │ │ ├── post_trial_reminder_late.text.erb │ │ ├── trial_expired.html.erb │ │ ├── trial_expired.text.erb │ │ ├── trial_expires_soon.html.erb │ │ ├── trial_expires_soon.text.erb │ │ ├── welcome.html.erb │ │ └── welcome.text.erb │ └── visits/ │ ├── _buttons.html.erb │ ├── _modal.html.erb │ ├── _name.html.erb │ ├── _visit.html.erb │ └── index.html.erb ├── app.json ├── bin/ │ ├── dev │ ├── importmap │ ├── rails │ ├── rake │ ├── rubocop │ └── setup ├── biome.json ├── config/ │ ├── application.rb │ ├── boot.rb │ ├── cable.yml │ ├── database.ci.yml │ ├── database.yml │ ├── environment.rb │ ├── environments/ │ │ ├── development.rb │ │ ├── production.rb │ │ ├── staging.rb │ │ └── test.rb │ ├── favicon.json │ ├── importmap.rb │ ├── initializers/ │ │ ├── 00_random.rb │ │ ├── 01_constants.rb │ │ ├── 03_dawarich_settings.rb │ │ ├── assets.rb │ │ ├── aws.rb │ │ ├── cache_jobs.rb │ │ ├── content_security_policy.rb │ │ ├── devise.rb │ │ ├── dns_cache.rb │ │ ├── filter_parameter_logging.rb │ │ ├── geocoder.rb │ │ ├── httparty.rb │ │ ├── inflections.rb │ │ ├── mime_types.rb │ │ ├── new_framework_defaults_8_0.rb │ │ ├── oj.rb │ │ ├── permissions_policy.rb │ │ ├── prometheus.rb │ │ ├── rack_attack.rb │ │ ├── rails_icons.rb │ │ ├── rails_pulse.rb │ │ ├── rswag_api.rb │ │ ├── rswag_ui.rb │ │ ├── sentry.rb │ │ ├── sidekiq.rb │ │ └── web_app_manifest.rb │ ├── locales/ │ │ ├── devise.en.yml │ │ └── en.yml │ ├── puma.rb │ ├── routes.rb │ ├── schedule.yml │ ├── sidekiq.yml │ ├── storage.yml │ └── tailwind.config.js ├── config.ru ├── db/ │ ├── data/ │ │ ├── 20240525110530_bind_existing_points_to_first_user.rb │ │ ├── 20240610170930_remove_points_without_coordinates.rb │ │ ├── 20240625201842_add_fog_of_war_meters_to_settings.rb │ │ ├── 20240713103122_make_first_user_admin.rb │ │ ├── 20240724141417_add_visit_settings_to_user.rb │ │ ├── 20240730130922_add_route_opacity_to_settings.rb │ │ ├── 20240808133112_run_initial_visit_suggestion.rb │ │ ├── 20240815174852_add_owntracks_points_data.rb │ │ ├── 20240822094532_add_counter_cache_to_imports.rb │ │ ├── 20241022100309_add_points_rendering_mode_to_settings.rb │ │ ├── 20241107112451_add_live_map_enabled_to_settings.rb │ │ ├── 20241202125248_set_reverse_geocoded_at_for_points.rb │ │ ├── 20241206163450_create_telemetry_notification.rb │ │ ├── 20250104204852_create_photon_load_notification.rb │ │ ├── 20250120154554_remove_duplicate_points.rb │ │ ├── 20250123151849_create_paths_for_trips.rb │ │ ├── 20250222213848_migrate_points_latlon.rb │ │ ├── 20250226192005_activate_selfhosted_users.rb │ │ ├── 20250303194123_migrate_places_lonlat.rb │ │ ├── 20250403204658_update_imports_points_count.rb │ │ ├── 20250404182629_set_active_until_for_selfhosted_users.rb │ │ ├── 20250516180933_set_points_country_ids.rb │ │ ├── 20250518173936_fix_france_codes.rb │ │ ├── 20250518174305_set_default_distance_unit_for_user.rb │ │ ├── 20250704185707_create_tracks_from_points.rb │ │ ├── 20250709195003_recalculate_trips_distance.rb │ │ └── 20250720171241_recalculate_stats_after_changing_distance_units.rb │ ├── data_schema.rb │ ├── migrate/ │ │ ├── 20220325100310_devise_create_users.rb │ │ ├── 20231021104256_add_service_name_to_active_storage_blobs.active_storage.rb │ │ ├── 20231021104257_create_active_storage_variant_records.active_storage.rb │ │ ├── 20231021104258_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb │ │ ├── 20240315213523_create_points.rb │ │ ├── 20240315215423_create_imports.rb │ │ ├── 20240317171559_add_indicies_to_points_latitude_longitude.rb │ │ ├── 20240323125126_add_raw_points_and_doubles_to_import.rb │ │ ├── 20240323160300_create_stats.rb │ │ ├── 20240323161049_add_index_to_points_timestamp.rb │ │ ├── 20240323190039_add_user_id_to_stat.rb │ │ ├── 20240324161309_create_active_storage_tables.active_storage.rb │ │ ├── 20240324161800_add_processed_to_imports.rb │ │ ├── 20240324173315_add_daily_distance_to_stat.rb │ │ ├── 20240404154959_add_api_key_to_users.rb │ │ ├── 20240425200155_add_raw_data_to_imports.rb │ │ ├── 20240518095848_add_theme_to_users.rb │ │ ├── 20240525110244_add_user_id_to_points.rb │ │ ├── 20240612152451_create_exports.rb │ │ ├── 20240620205120_add_settings_to_users.rb │ │ ├── 20240630093005_add_fog_of_war_to_default_settings.rb │ │ ├── 20240703105734_create_notifications.rb │ │ ├── 20240712141303_add_geodata_to_points.rb │ │ ├── 20240713103051_add_admin_to_users.rb │ │ ├── 20240721165313_create_areas.rb │ │ ├── 20240721183005_create_visits.rb │ │ ├── 20240721183116_add_visit_id_to_points.rb │ │ ├── 20240805150111_create_places.rb │ │ ├── 20240808102348_add_place_id_to_visits.rb │ │ ├── 20240808102425_make_area_id_optional_in_visits.rb │ │ ├── 20240808121027_create_place_visits.rb │ │ ├── 20240822092405_add_points_count_to_imports.rb │ │ ├── 20241127161621_create_trips.rb │ │ ├── 20241128095325_create_action_text_tables.action_text.rb │ │ ├── 20241202114820_add_reverse_geocoded_at_to_points.rb │ │ ├── 20241205160055_add_devise_trackable_columns_to_users.rb │ │ ├── 20241211113119_add_started_at_index_to_visits.rb │ │ ├── 20241226202204_add_database_users_constraints.rb │ │ ├── 20241226202831_validate_add_database_users_constraints.rb │ │ ├── 20250120152014_add_course_and_course_accuracy_to_points.rb │ │ ├── 20250120152540_add_external_track_id_to_points.rb │ │ ├── 20250120154555_add_unique_index_to_points.rb │ │ ├── 20250123145155_enable_postgis_extension.rb │ │ ├── 20250123151657_add_path_to_trips.rb │ │ ├── 20250219195822_add_status_to_users.rb │ │ ├── 20250221181805_add_lonlat_to_points.rb │ │ ├── 20250221185032_add_lonlat_index.rb │ │ ├── 20250221194430_remove_points_latitude_longitude_uniqueness_index.rb │ │ ├── 20250221194509_add_unique_lon_lat_index_to_points.rb │ │ ├── 20250303194009_add_lonlat_to_places.rb │ │ ├── 20250303194043_add_lonlat_index_to_places.rb │ │ ├── 20250324180755_add_format_start_at_end_at_to_exports.rb │ │ ├── 20250404182437_add_active_until_to_users.rb │ │ ├── 20250513164521_add_visited_countries_to_trips.rb │ │ ├── 20250515190752_create_countries.rb │ │ ├── 20250515192211_add_country_id_to_points.rb │ │ ├── 20250625185030_add_file_type_to_exports.rb │ │ ├── 20250627184017_add_status_to_imports.rb │ │ ├── 20250703193656_create_tracks.rb │ │ ├── 20250703193657_add_track_id_to_points.rb │ │ ├── 20250721204404_add_index_on_places_geodata_osm_id.rb │ │ ├── 20250723164055_add_track_generation_composite_index.rb │ │ ├── 20250728191359_add_country_name_to_points.rb │ │ ├── 20250821192219_add_points_count_to_users.rb │ │ ├── 20250823125940_remove_default_from_imports_source.rb │ │ ├── 20250905120121_add_user_country_composite_index_to_points.rb │ │ ├── 20250910224538_add_sharing_fields_to_stats.rb │ │ ├── 20250910224714_add_index_to_stats_share_uuid.rb │ │ ├── 20250918215512_add_h3_hex_ids_to_stats.rb │ │ ├── 20250926220114_create_families.rb │ │ ├── 20250926220135_create_family_memberships.rb │ │ ├── 20250926220158_create_family_invitations.rb │ │ ├── 20250926220345_validate_family_foreign_keys.rb │ │ ├── 20251028130433_add_omniauth_to_users.rb │ │ ├── 20251030190924_add_utm_parameters_to_users.rb │ │ ├── 20251116184506_add_user_id_to_places.rb │ │ ├── 20251116184514_create_tags.rb │ │ ├── 20251116184520_create_taggings.rb │ │ ├── 20251118204141_add_privacy_radius_to_tags.rb │ │ ├── 20251118210506_add_note_to_places.rb │ │ ├── 20251201192510_add_user_id_reverse_geocoded_at_index_to_points.rb │ │ ├── 20251206000001_create_points_raw_data_archives.rb │ │ ├── 20251206000002_add_archival_columns_to_points.rb │ │ ├── 20251206000004_validate_archival_foreign_keys.rb │ │ ├── 20251208210410_add_composite_index_to_stats.rb │ │ ├── 20251210193532_add_verified_at_to_points_raw_data_archives.rb │ │ ├── 20251226170919_add_composite_index_to_points_user_id_timestamp.rb │ │ ├── 20251227000001_create_digests.rb │ │ ├── 20251227223614_change_digests_distance_to_bigint.rb │ │ ├── 20251228000000_remove_unused_indexes.rb │ │ ├── 20251228100000_add_performance_indexes.rb │ │ ├── 20251228163703_install_rails_pulse_tables.rb │ │ ├── 20260103114630_add_indexes_to_points_for_stats_query.rb │ │ ├── 20260108192905_add_deleted_at_to_users.rb │ │ ├── 20260112192240_set_existing_users_to_map_v1.rb │ │ ├── 20260113230537_set_points_timestamp_from_geojson_date.rb │ │ ├── 20260120193124_add_month_to_digests.rb │ │ ├── 20260120193200_create_track_segments.rb │ │ ├── 20260120193336_add_dominant_mode_to_tracks.rb │ │ ├── 20260120193401_add_travel_patterns_to_digests.rb │ │ ├── 20260120193501_change_tracks_distance_precision.rb │ │ ├── 20260124221434_add_index_to_track_segments.rb │ │ ├── 20260125100000_enqueue_transportation_mode_backfill_jobs.rb │ │ ├── 20260201000001_add_processing_started_at_to_exports_and_imports.rb │ │ ├── 20260201000002_add_error_message_to_exports.rb │ │ ├── 20260206202634_deduplicate_tracks.rb │ │ ├── 20260216190000_add_unique_index_to_raw_data_archives.rb │ │ ├── 20260217000000_optimize_points_indexes.rb │ │ ├── 20260217000001_backfill_motion_data_from_raw_data.rb │ │ ├── 20260222215414_add_error_message_to_imports.rb │ │ ├── 20260301201446_add_plan_to_users.rb │ │ ├── 20260301202147_set_plan_for_existing_users.rb │ │ ├── 20260310000001_drop_redundant_indexes.rb │ │ ├── 20260310000002_add_composite_indexes_and_drop_low_selectivity.rb │ │ ├── 20260310000003_add_unique_index_to_place_visits.rb │ │ ├── 20260310000006_fix_tracks_original_path_srid.rb │ │ ├── 20260313134546_create_family_location_requests.rb │ │ ├── 20260314000001_fix_route_opacity_default.rb │ │ └── 20260315000001_backfill_onboarding_completed_for_existing_users.rb │ ├── rails_pulse_migrate/ │ │ └── .keep │ ├── rails_pulse_schema.rb │ ├── schema.rb │ └── seeds.rb ├── docker/ │ ├── Dockerfile │ ├── docker-compose.yml │ ├── sidekiq-entrypoint.sh │ └── web-entrypoint.sh ├── docs/ │ ├── How_to_extract_geodata_from_photos.md │ ├── How_to_install_Dawarich_in_k8s.md │ ├── How_to_install_Dawarich_on_Synology.md │ ├── How_to_install_Dawarich_using_Docker.md │ ├── how_to_setup_reverse_proxy.md │ └── synology/ │ ├── docker-compose.yml │ ├── spk.tgz │ └── update.sh ├── e2e/ │ ├── README.md │ ├── helpers/ │ │ ├── map.js │ │ ├── navigation.js │ │ ├── places.js │ │ └── selection.js │ ├── lite/ │ │ └── plan-gates.spec.js │ ├── map/ │ │ ├── map-add-visit.spec.js │ │ ├── map-bulk-delete.spec.js │ │ ├── map-calendar-panel.spec.js │ │ ├── map-controls.spec.js │ │ ├── map-info-toggle.spec.js │ │ ├── map-layers.spec.js │ │ ├── map-places-creation.spec.js │ │ ├── map-places-layers.spec.js │ │ ├── map-points.spec.js │ │ ├── map-route-interactions.spec.js │ │ ├── map-routes-tracks-selector.spec.js │ │ ├── map-search.spec.js │ │ ├── map-selection-tool.spec.js │ │ ├── map-settings-panel.spec.js │ │ ├── map-side-panel.spec.js │ │ ├── map-stats-display.spec.js │ │ ├── map-suggested-visits.spec.js │ │ └── map-visits.spec.js │ ├── setup/ │ │ ├── auth-lite.setup.js │ │ └── auth.setup.js │ └── v2/ │ ├── helpers/ │ │ ├── api.js │ │ ├── constants.js │ │ └── setup.js │ ├── map/ │ │ ├── area-selection.spec.js │ │ ├── core.spec.js │ │ ├── interactions.spec.js │ │ ├── layers/ │ │ │ ├── advanced.spec.js │ │ │ ├── areas.spec.js │ │ │ ├── family.spec.js │ │ │ ├── heatmap.spec.js │ │ │ ├── photos.spec.js │ │ │ ├── places.spec.js │ │ │ ├── points.spec.js │ │ │ ├── routes.spec.js │ │ │ ├── track-segments.spec.js │ │ │ ├── tracks.spec.js │ │ │ └── visits.spec.js │ │ ├── navigation.spec.js │ │ ├── performance.spec.js │ │ ├── replay.spec.js │ │ ├── search.spec.js │ │ ├── settings.spec.js │ │ └── timeline-feed.spec.js │ ├── realtime/ │ │ ├── family.spec.js │ │ ├── live-mode-api.spec.js │ │ └── live-mode.spec.js │ └── trips.spec.js ├── lib/ │ ├── assets/ │ │ ├── .keep │ │ └── countries.geojson │ ├── json_stream_handler.rb │ ├── tasks/ │ │ ├── .keep │ │ ├── data_cleanup.rake │ │ ├── demo.rake │ │ ├── exports.rake │ │ ├── import.rake │ │ ├── imports.rake │ │ ├── points.rake │ │ ├── points_raw_data.rake │ │ ├── rswag.rake │ │ ├── users.rake │ │ └── webmanifest.rake │ └── timestamps.rb ├── log/ │ └── .keep ├── package.json ├── playwright.config.js ├── public/ │ ├── .well-known/ │ │ └── apple-app-site-association │ ├── 400.html │ ├── 404.html │ ├── 406-unsupported-browser.html │ ├── 422.html │ ├── 500.html │ ├── exports/ │ │ └── .keep │ ├── maps_maplibre/ │ │ └── styles/ │ │ ├── black.json │ │ ├── dark.json │ │ ├── grayscale.json │ │ ├── light.json │ │ └── white.json │ ├── robots.txt │ └── site.webmanifest ├── spec/ │ ├── channels/ │ │ ├── imports_channel_spec.rb │ │ ├── notifications_channel_spec.rb │ │ ├── points_channel_spec.rb │ │ └── tracks_channel_spec.rb │ ├── controllers/ │ │ ├── api_controller_spec.rb │ │ ├── application_controller_spec.rb │ │ └── concerns/ │ │ └── safe_timestamp_parser_spec.rb │ ├── factories/ │ │ ├── areas.rb │ │ ├── countries.rb │ │ ├── exports.rb │ │ ├── families.rb │ │ ├── family_invitations.rb │ │ ├── family_location_requests.rb │ │ ├── family_memberships.rb │ │ ├── imports.rb │ │ ├── notifications.rb │ │ ├── place_visits.rb │ │ ├── places.rb │ │ ├── points.rb │ │ ├── points_raw_data_archives.rb │ │ ├── stats.rb │ │ ├── taggings.rb │ │ ├── tags.rb │ │ ├── track_segments.rb │ │ ├── tracks.rb │ │ ├── trips.rb │ │ ├── users/ │ │ │ └── digests.rb │ │ ├── users.rb │ │ └── visits.rb │ ├── fixtures/ │ │ ├── files/ │ │ │ ├── geojson/ │ │ │ │ ├── export.json │ │ │ │ ├── export_same_points.json │ │ │ │ ├── google_takeout_example.json │ │ │ │ └── gpslogger_example.json │ │ │ ├── google/ │ │ │ │ ├── location-history/ │ │ │ │ │ ├── with_activitySegment_with_startLocation.json │ │ │ │ │ ├── with_activitySegment_with_startLocation_timestampMs.json │ │ │ │ │ ├── with_activitySegment_with_startLocation_timestamp_in_milliseconds_format.json │ │ │ │ │ ├── with_activitySegment_with_startLocation_timestamp_in_seconds_format.json │ │ │ │ │ ├── with_activitySegment_with_startLocation_with_iso_timestamp.json │ │ │ │ │ ├── with_activitySegment_without_startLocation.json │ │ │ │ │ ├── with_activitySegment_without_startLocation_without_waypointPath.json │ │ │ │ │ ├── with_placeVisit_with_location_with_coordinates.json │ │ │ │ │ ├── with_placeVisit_with_location_with_coordinates_with_iso_timestamp.json │ │ │ │ │ ├── with_placeVisit_with_location_with_coordinates_with_milliseconds_timestamp.json │ │ │ │ │ ├── with_placeVisit_with_location_with_coordinates_with_seconds_timestamp.json │ │ │ │ │ ├── with_placeVisit_with_location_with_coordinates_with_timestampMs.json │ │ │ │ │ ├── with_placeVisit_without_location_with_coordinates.json │ │ │ │ │ └── with_placeVisit_without_location_with_coordinates_with_otherCandidateLocations.json │ │ │ │ ├── location-history.json │ │ │ │ ├── phone-takeout_w_3_duplicates.json │ │ │ │ ├── records.json │ │ │ │ └── semantic_history.json │ │ │ ├── gpx/ │ │ │ │ ├── arc_example.gpx │ │ │ │ ├── garmin_example.gpx │ │ │ │ ├── gpx_track_multiple_segments.gpx │ │ │ │ ├── gpx_track_multiple_tracks.gpx │ │ │ │ └── gpx_track_single_segment.gpx │ │ │ ├── immich/ │ │ │ │ ├── geodata.json │ │ │ │ └── response.json │ │ │ ├── kml/ │ │ │ │ ├── extended_data.kml │ │ │ │ ├── gx_track.kml │ │ │ │ ├── invalid_coordinates.kml │ │ │ │ ├── large_track.kml │ │ │ │ ├── linestring_track.kml │ │ │ │ ├── multigeometry.kml │ │ │ │ ├── nested_folders.kml │ │ │ │ ├── points_with_timestamps.kml │ │ │ │ ├── points_with_timestamps.kmz │ │ │ │ └── timespan.kml │ │ │ ├── overland/ │ │ │ │ └── geodata.json │ │ │ ├── owntracks/ │ │ │ │ ├── 2023-02_old.rec │ │ │ │ └── 2024-03.rec │ │ │ ├── points/ │ │ │ │ └── geojson_example.json │ │ │ └── watched/ │ │ │ ├── invalid_user@domain.com/ │ │ │ │ └── location-history.json │ │ │ └── user@domain.com/ │ │ │ ├── 2023_January.json │ │ │ ├── Records.json │ │ │ ├── export_same_points.json │ │ │ ├── gpx_track_single_segment.gpx │ │ │ ├── location-history.json │ │ │ └── owntracks.rec │ │ └── users/ │ │ └── welcome │ ├── helpers/ │ │ ├── application_helper_spec.rb │ │ ├── insights_helper_spec.rb │ │ └── stats_helper_spec.rb │ ├── integration/ │ │ └── family_privacy_spec.rb │ ├── jobs/ │ │ ├── app_version_checking_job_spec.rb │ │ ├── application_job_spec.rb │ │ ├── area_visits_calculating_job_spec.rb │ │ ├── area_visits_calculation_scheduling_job_spec.rb │ │ ├── bulk_stats_calculating_job_spec.rb │ │ ├── bulk_visits_suggesting_job_spec.rb │ │ ├── cache/ │ │ │ └── preheating_job_spec.rb │ │ ├── concerns/ │ │ │ └── user_timezone_spec.rb │ │ ├── data_migrations/ │ │ │ ├── backfill_motion_data_job_spec.rb │ │ │ ├── backfill_onboarding_completed_job_spec.rb │ │ │ ├── fix_route_opacity_job_spec.rb │ │ │ ├── migrate_places_lonlat_job_spec.rb │ │ │ ├── migrate_points_latlon_job_spec.rb │ │ │ ├── set_points_country_ids_job_spec.rb │ │ │ └── start_settings_points_country_ids_job_spec.rb │ │ ├── enqueue_background_job_spec.rb │ │ ├── export_job_spec.rb │ │ ├── families/ │ │ │ └── expire_location_requests_job_spec.rb │ │ ├── family/ │ │ │ └── invitations/ │ │ │ └── sending_job_spec.rb │ │ ├── import/ │ │ │ ├── immich_geodata_job_spec.rb │ │ │ ├── process_job_spec.rb │ │ │ └── watcher_job_spec.rb │ │ ├── imports/ │ │ │ └── destroy_job_spec.rb │ │ ├── lite/ │ │ │ └── archival_warning_job_spec.rb │ │ ├── places/ │ │ │ ├── bulk_name_fetching_job_spec.rb │ │ │ └── name_fetching_job_spec.rb │ │ ├── points/ │ │ │ ├── create_job_spec.rb │ │ │ ├── nightly_reverse_geocoding_job_spec.rb │ │ │ └── raw_data/ │ │ │ ├── archive_job_spec.rb │ │ │ └── re_archive_month_job_spec.rb │ │ ├── reverse_geocoding_job_spec.rb │ │ ├── stale_jobs_recovery_job_spec.rb │ │ ├── stats/ │ │ │ └── calculating_job_spec.rb │ │ ├── tracks/ │ │ │ ├── daily_generation_job_spec.rb │ │ │ ├── deduplication_job_spec.rb │ │ │ ├── parallel_generator_job_spec.rb │ │ │ ├── realtime_generation_job_spec.rb │ │ │ ├── recalculate_job_spec.rb │ │ │ └── transportation_mode_recalculation_job_spec.rb │ │ ├── trips/ │ │ │ └── calculate_countries_job_spec.rb │ │ ├── users/ │ │ │ ├── destroy_job_spec.rb │ │ │ ├── digests/ │ │ │ │ ├── calculating_job_spec.rb │ │ │ │ ├── email_sending_job_spec.rb │ │ │ │ └── year_end_scheduling_job_spec.rb │ │ │ ├── export_data_job_spec.rb │ │ │ ├── import_data_job_spec.rb │ │ │ ├── mailer_sending_job_spec.rb │ │ │ ├── recalculate_data_job_spec.rb │ │ │ └── trial_webhook_job_spec.rb │ │ └── visit_suggesting_job_spec.rb │ ├── lib/ │ │ ├── dawarich_settings_spec.rb │ │ └── json_stream_handler_spec.rb │ ├── mailers/ │ │ ├── family_mailer_spec.rb │ │ ├── previews/ │ │ │ ├── users/ │ │ │ │ └── digests_mailer_preview.rb │ │ │ └── users_mailer_preview.rb │ │ └── users_mailer_spec.rb │ ├── models/ │ │ ├── area_spec.rb │ │ ├── concerns/ │ │ │ ├── archivable_spec.rb │ │ │ ├── plan_scopable_spec.rb │ │ │ ├── point_validation_spec.rb │ │ │ ├── soft_deletable_spec.rb │ │ │ ├── taggable_spec.rb │ │ │ └── user_family_spec.rb │ │ ├── country_spec.rb │ │ ├── export_spec.rb │ │ ├── family/ │ │ │ ├── invitation_spec.rb │ │ │ ├── location_request_spec.rb │ │ │ └── membership_spec.rb │ │ ├── family_spec.rb │ │ ├── import_spec.rb │ │ ├── notification_spec.rb │ │ ├── place_spec.rb │ │ ├── place_visit_spec.rb │ │ ├── point_spec.rb │ │ ├── points/ │ │ │ └── raw_data_archive_spec.rb │ │ ├── stat_spec.rb │ │ ├── tag_spec.rb │ │ ├── tagging_spec.rb │ │ ├── track_segment_spec.rb │ │ ├── track_spec.rb │ │ ├── trip_spec.rb │ │ ├── user_family_spec.rb │ │ ├── user_spec.rb │ │ ├── users/ │ │ │ └── digest_spec.rb │ │ └── visit_spec.rb │ ├── policies/ │ │ ├── family/ │ │ │ ├── invitation_policy_spec.rb │ │ │ └── membership_policy_spec.rb │ │ ├── import_policy_spec.rb │ │ └── tag_policy_spec.rb │ ├── queries/ │ │ ├── stats/ │ │ │ ├── daily_distance_query_spec.rb │ │ │ └── time_of_day_query_spec.rb │ │ └── stats_query_spec.rb │ ├── rails_helper.rb │ ├── requests/ │ │ ├── api/ │ │ │ └── v1/ │ │ │ ├── areas_spec.rb │ │ │ ├── countries/ │ │ │ │ ├── borders_spec.rb │ │ │ │ └── visited_cities_spec.rb │ │ │ ├── digests_spec.rb │ │ │ ├── families/ │ │ │ │ └── locations_spec.rb │ │ │ ├── health_spec.rb │ │ │ ├── imports_spec.rb │ │ │ ├── insights_spec.rb │ │ │ ├── locations_spec.rb │ │ │ ├── maps/ │ │ │ │ └── hexagons_spec.rb │ │ │ ├── overland/ │ │ │ │ └── batches_spec.rb │ │ │ ├── owntracks/ │ │ │ │ └── points_spec.rb │ │ │ ├── photos_spec.rb │ │ │ ├── places_spec.rb │ │ │ ├── plan_spec.rb │ │ │ ├── points/ │ │ │ │ └── tracked_months_spec.rb │ │ │ ├── points_spec.rb │ │ │ ├── rate_limiting_spec.rb │ │ │ ├── settings_spec.rb │ │ │ ├── stats_spec.rb │ │ │ ├── subscriptions_spec.rb │ │ │ ├── tags_spec.rb │ │ │ ├── timeline_spec.rb │ │ │ ├── tracks/ │ │ │ │ └── points_spec.rb │ │ │ ├── tracks_spec.rb │ │ │ ├── users_spec.rb │ │ │ ├── visits/ │ │ │ │ └── possible_places_spec.rb │ │ │ └── visits_spec.rb │ │ ├── areas_spec.rb │ │ ├── authentication_spec.rb │ │ ├── exports_spec.rb │ │ ├── families_spec.rb │ │ ├── family/ │ │ │ ├── invitations_spec.rb │ │ │ ├── location_requests_spec.rb │ │ │ ├── location_sharing_spec.rb │ │ │ └── memberships_spec.rb │ │ ├── family_workflows_spec.rb │ │ ├── home_spec.rb │ │ ├── imports_spec.rb │ │ ├── insights_spec.rb │ │ ├── map/ │ │ │ └── timeline_feeds_spec.rb │ │ ├── map_spec.rb │ │ ├── notifications_spec.rb │ │ ├── places_spec.rb │ │ ├── points_spec.rb │ │ ├── settings/ │ │ │ ├── background_jobs_spec.rb │ │ │ ├── general_spec.rb │ │ │ ├── integrations_spec.rb │ │ │ ├── maps_spec.rb │ │ │ ├── onboarding_spec.rb │ │ │ └── users_spec.rb │ │ ├── settings_spec.rb │ │ ├── shared/ │ │ │ ├── digests_spec.rb │ │ │ └── stats_spec.rb │ │ ├── sidekiq_spec.rb │ │ ├── stats_spec.rb │ │ ├── tags_spec.rb │ │ ├── timezone_spec.rb │ │ ├── trips_spec.rb │ │ ├── users/ │ │ │ ├── digests_spec.rb │ │ │ ├── omniauth_callbacks_spec.rb │ │ │ ├── registrations_spec.rb │ │ │ └── sessions_spec.rb │ │ ├── users_spec.rb │ │ └── visits_spec.rb │ ├── serializers/ │ │ ├── api/ │ │ │ ├── digest_list_serializer_spec.rb │ │ │ ├── photo_serializer_spec.rb │ │ │ ├── place_serializer_spec.rb │ │ │ ├── point_serializer_spec.rb │ │ │ ├── slim_point_serializer_spec.rb │ │ │ ├── user_serializer_spec.rb │ │ │ └── visit_serializer_spec.rb │ │ ├── export_serializer_spec.rb │ │ ├── exports/ │ │ │ ├── point_geojson_serializer_spec.rb │ │ │ └── point_gpx_serializer_spec.rb │ │ ├── point_serializer_spec.rb │ │ ├── points/ │ │ │ ├── geojson_serializer_spec.rb │ │ │ └── gpx_serializer_spec.rb │ │ ├── stats_serializer_spec.rb │ │ ├── tag_serializer_spec.rb │ │ ├── track_serializer_spec.rb │ │ ├── tracks/ │ │ │ └── geojson_serializer_spec.rb │ │ └── tracks_serializer_spec.rb │ ├── services/ │ │ ├── areas/ │ │ │ └── visits/ │ │ │ └── create_spec.rb │ │ ├── cache/ │ │ │ ├── clean_spec.rb │ │ │ └── invalidate_user_caches_spec.rb │ │ ├── check_app_version_spec.rb │ │ ├── concerns/ │ │ │ └── ssl_configurable_spec.rb │ │ ├── countries/ │ │ │ └── iso_code_mapper_spec.rb │ │ ├── countries_and_cities_spec.rb │ │ ├── exports/ │ │ │ └── create_spec.rb │ │ ├── families/ │ │ │ ├── accept_invitation_spec.rb │ │ │ ├── create_location_request_spec.rb │ │ │ ├── create_spec.rb │ │ │ ├── invite_spec.rb │ │ │ ├── locations_spec.rb │ │ │ ├── memberships/ │ │ │ │ └── destroy_spec.rb │ │ │ └── update_location_sharing_spec.rb │ │ ├── geojson/ │ │ │ ├── importer_spec.rb │ │ │ └── params_spec.rb │ │ ├── google_maps/ │ │ │ ├── phone_takeout_importer_spec.rb │ │ │ ├── records_importer_spec.rb │ │ │ ├── records_storage_importer_spec.rb │ │ │ └── semantic_history_importer_spec.rb │ │ ├── gpx/ │ │ │ └── track_importer_spec.rb │ │ ├── immich/ │ │ │ ├── connection_tester_spec.rb │ │ │ ├── import_geodata_spec.rb │ │ │ ├── request_photos_spec.rb │ │ │ ├── response_analyzer_spec.rb │ │ │ └── response_validator_spec.rb │ │ ├── imports/ │ │ │ ├── create_spec.rb │ │ │ ├── destroy_spec.rb │ │ │ ├── secure_file_downloader_spec.rb │ │ │ ├── source_detector_spec.rb │ │ │ └── watcher_spec.rb │ │ ├── insights/ │ │ │ ├── activity_heatmap_calculator_spec.rb │ │ │ ├── travel_insight_generator_spec.rb │ │ │ ├── travel_patterns_loader_spec.rb │ │ │ ├── year_comparison_calculator_spec.rb │ │ │ └── year_totals_calculator_spec.rb │ │ ├── jobs/ │ │ │ └── create_spec.rb │ │ ├── kml/ │ │ │ └── importer_spec.rb │ │ ├── location_search/ │ │ │ ├── geocoding_service_spec.rb │ │ │ ├── point_finder_spec.rb │ │ │ ├── result_aggregator_spec.rb │ │ │ └── spatial_matcher_spec.rb │ │ ├── maps/ │ │ │ ├── bounds_calculator_spec.rb │ │ │ ├── hexagon_center_manager_spec.rb │ │ │ ├── hexagon_polygon_generator_spec.rb │ │ │ └── hexagon_request_handler_spec.rb │ │ ├── metrics/ │ │ │ └── archives/ │ │ │ ├── compression_ratio_spec.rb │ │ │ ├── count_mismatch_spec.rb │ │ │ ├── operation_spec.rb │ │ │ ├── points_archived_spec.rb │ │ │ ├── size_spec.rb │ │ │ └── verification_spec.rb │ │ ├── notifications/ │ │ │ └── create_spec.rb │ │ ├── overland/ │ │ │ ├── params_spec.rb │ │ │ └── points_creator_spec.rb │ │ ├── own_tracks/ │ │ │ ├── importer_spec.rb │ │ │ ├── params_spec.rb │ │ │ └── point_creator_spec.rb │ │ ├── photoprism/ │ │ │ ├── cache_preview_token_spec.rb │ │ │ ├── connection_tester_spec.rb │ │ │ ├── import_geodata_spec.rb │ │ │ ├── request_photos_spec.rb │ │ │ └── response_validator_spec.rb │ │ ├── photos/ │ │ │ ├── cache_cleaner_spec.rb │ │ │ ├── importer_spec.rb │ │ │ ├── search_spec.rb │ │ │ └── thumbnail_spec.rb │ │ ├── places/ │ │ │ └── name_fetcher_spec.rb │ │ ├── points/ │ │ │ ├── create_spec.rb │ │ │ ├── live_broadcaster_spec.rb │ │ │ ├── motion_data_extractor_spec.rb │ │ │ ├── params_spec.rb │ │ │ ├── raw_data/ │ │ │ │ ├── archiver_spec.rb │ │ │ │ ├── chunk_compressor_spec.rb │ │ │ │ ├── clearer_spec.rb │ │ │ │ ├── encryption_spec.rb │ │ │ │ ├── restorer_spec.rb │ │ │ │ └── verifier_spec.rb │ │ │ └── raw_data_lonlat_extractor_spec.rb │ │ ├── points_limit_exceeded_spec.rb │ │ ├── reverse_geocoding/ │ │ │ ├── places/ │ │ │ │ └── fetch_data_spec.rb │ │ │ └── points/ │ │ │ └── fetch_data_spec.rb │ │ ├── settings/ │ │ │ └── update_spec.rb │ │ ├── stats/ │ │ │ ├── bulk_calculator_spec.rb │ │ │ ├── calculate_month_spec.rb │ │ │ └── hexagon_calculator_spec.rb │ │ ├── subscription/ │ │ │ └── encode_jwt_token_spec.rb │ │ ├── tasks/ │ │ │ └── imports/ │ │ │ └── google_records_spec.rb │ │ ├── timeline/ │ │ │ └── day_assembler_spec.rb │ │ ├── tracks/ │ │ │ ├── boundary_detector_spec.rb │ │ │ ├── build_path_spec.rb │ │ │ ├── deduplicator_spec.rb │ │ │ ├── incremental_generator_spec.rb │ │ │ ├── index_query_spec.rb │ │ │ ├── merger_spec.rb │ │ │ ├── parallel_generator_spec.rb │ │ │ ├── realtime_debouncer_spec.rb │ │ │ ├── segmentation_spec.rb │ │ │ ├── session_manager_spec.rb │ │ │ ├── time_chunker_spec.rb │ │ │ ├── track_builder_spec.rb │ │ │ └── transportation_recalculation_status_spec.rb │ │ ├── transportation_modes/ │ │ │ ├── detector_spec.rb │ │ │ ├── mode_classifier_spec.rb │ │ │ ├── movement_analyzer_spec.rb │ │ │ └── source_data_extractor_spec.rb │ │ ├── trips/ │ │ │ └── photos_spec.rb │ │ ├── users/ │ │ │ ├── destroy_spec.rb │ │ │ ├── digests/ │ │ │ │ ├── activity_breakdown_calculator_spec.rb │ │ │ │ ├── calculate_year_spec.rb │ │ │ │ ├── first_time_visits_calculator_spec.rb │ │ │ │ └── year_over_year_calculator_spec.rb │ │ │ ├── export_data/ │ │ │ │ ├── areas_spec.rb │ │ │ │ ├── digests_spec.rb │ │ │ │ ├── exports_spec.rb │ │ │ │ ├── imports_spec.rb │ │ │ │ ├── notifications_spec.rb │ │ │ │ ├── places_spec.rb │ │ │ │ ├── points_spec.rb │ │ │ │ ├── stats_spec.rb │ │ │ │ ├── tracks_spec.rb │ │ │ │ ├── trips_spec.rb │ │ │ │ └── visits_spec.rb │ │ │ ├── export_data_spec.rb │ │ │ ├── export_import_integration_spec.rb │ │ │ ├── import_data/ │ │ │ │ ├── areas_spec.rb │ │ │ │ ├── digests_spec.rb │ │ │ │ ├── exports_spec.rb │ │ │ │ ├── imports_spec.rb │ │ │ │ ├── notifications_spec.rb │ │ │ │ ├── places_spec.rb │ │ │ │ ├── places_streaming_spec.rb │ │ │ │ ├── points_spec.rb │ │ │ │ ├── raw_data_archives_spec.rb │ │ │ │ ├── settings_spec.rb │ │ │ │ ├── stats_spec.rb │ │ │ │ ├── taggings_spec.rb │ │ │ │ ├── tags_spec.rb │ │ │ │ ├── tracks_spec.rb │ │ │ │ ├── trips_spec.rb │ │ │ │ ├── v1_handler_spec.rb │ │ │ │ ├── v2_handler_spec.rb │ │ │ │ └── visits_spec.rb │ │ │ ├── import_data_spec.rb │ │ │ ├── safe_settings_spec.rb │ │ │ └── transportation_thresholds_updater_spec.rb │ │ └── visits/ │ │ ├── bulk_update_spec.rb │ │ ├── create_spec.rb │ │ ├── creator_spec.rb │ │ ├── detector_spec.rb │ │ ├── find_in_time_spec.rb │ │ ├── find_within_bounding_box_spec.rb │ │ ├── finder_spec.rb │ │ ├── group_spec.rb │ │ ├── merge_service_spec.rb │ │ ├── merger_spec.rb │ │ ├── names/ │ │ │ ├── builder_spec.rb │ │ │ └── suggester_spec.rb │ │ ├── place_finder_spec.rb │ │ ├── smart_detect_spec.rb │ │ ├── suggest_spec.rb │ │ └── time_chunks_spec.rb │ ├── spec_helper.rb │ ├── support/ │ │ ├── capybara.rb │ │ ├── devise.rb │ │ ├── geocoder_stubs.rb │ │ ├── github_api_stubs.rb │ │ ├── omniauth.rb │ │ ├── pundit_matchers.rb │ │ ├── redis.rb │ │ ├── swagger_response_example.rb │ │ └── turbo_stream_helpers.rb │ ├── swagger/ │ │ └── api/ │ │ └── v1/ │ │ ├── areas_controller_spec.rb │ │ ├── countries/ │ │ │ ├── borders_controller_spec.rb │ │ │ └── visited_cities_spec.rb │ │ ├── digests_controller_spec.rb │ │ ├── families/ │ │ │ └── locations_controller_spec.rb │ │ ├── health_controller_spec.rb │ │ ├── imports_controller_spec.rb │ │ ├── insights_controller_spec.rb │ │ ├── locations_controller_spec.rb │ │ ├── maps/ │ │ │ └── hexagons_controller_spec.rb │ │ ├── overland/ │ │ │ └── batches_controller_spec.rb │ │ ├── owntracks/ │ │ │ └── points_controller_spec.rb │ │ ├── photos_controller_spec.rb │ │ ├── places_controller_spec.rb │ │ ├── points/ │ │ │ └── tracked_months_controller_spec.rb │ │ ├── points_controller_spec.rb │ │ ├── settings_controller_spec.rb │ │ ├── stats_controller_spec.rb │ │ ├── subscriptions_controller_spec.rb │ │ ├── tags_controller_spec.rb │ │ ├── timeline_controller_spec.rb │ │ ├── tracks/ │ │ │ └── points_controller_spec.rb │ │ ├── tracks_controller_spec.rb │ │ ├── users_controller_spec.rb │ │ └── visits_controller_spec.rb │ ├── swagger_helper.rb │ └── tasks/ │ ├── import_spec.rb │ └── points_raw_data_reset_all_spec.rb ├── storage/ │ └── .keep ├── swagger/ │ └── v1/ │ └── swagger.yaml ├── tmp/ │ └── .keep └── vendor/ ├── .keep └── javascript/ ├── .keep ├── @rails--ujs.js ├── emoji-mart.js ├── leaflet-draw.js ├── leaflet-providers.js ├── leaflet.control.layers.tree.js ├── leaflet.heat.js ├── leaflet.js └── maplibre-gl.js