Freika / dawarich

Self-hosted alternative to Google Location History (Google Maps Timeline)
https://dawarich.app
GNU Affero General Public License v3.0
2.05k stars 42 forks source link

~90% of points from Google Takeout import are marked as Failed #239

Closed joelis10 closed 1 month ago

joelis10 commented 1 month ago

Describe the bug Title, with proof (I may have been exaggerating a little): image

Version 0.13.2, as that's what I started the import on a few days ago and obviously didn't want to update in the middle of an import.

To Reproduce Steps to reproduce the behavior:

  1. Import a Google Location History records.json file

Expected behavior All points successfully import without issue

Screenshots See above.

Logs sidekiq last 100 lines:


2024-09-09T12:53:42.355Z pid=77 tid=44qrx WARN: {"context":"Job raised exception","job":{"retry":true,"queue":"reverse_geocoding","wrapped":"ReverseGeocodingJob","args":[{"job_class":"ReverseGeocodingJob","job_id":"6430a781-8817-4376-a5ca-e1ce1e12cf4a","provider_job_id":null,"queue_name":"reverse_geocoding","priority":null,"arguments":["Point",611249],"executions":0,"exception_executions":{},"locale":"en","timezone":"Europe/London","enqueued_at":"2024-09-07T19:15:53.724880944Z","scheduled_at":null}],"class":"ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper","jid":"a1ebb8213daa9efd4cb1ab06","created_at":1725736553.7249298,"enqueued_at":1725874999.803192,"error_message":"Geocoder::ResponseParseError","error_class":"Geocoder::ResponseParseError","failed_at":1725785302.8698194,"retry_count":5,"retried_at":1725874341.1853704}}

2024-09-09T12:53:42.355Z pid=77 tid=44qrx WARN: Geocoder::ResponseParseError: Geocoder::ResponseParseError

2024-09-09T12:53:42.356Z pid=77 tid=44qrx WARN: app/services/reverse_geocoding/points/fetch_data.rb:15:in `call'

app/jobs/reverse_geocoding_job.rb:9:in `perform'

2024-09-09T12:53:42.356Z pid=77 tid=44r31 class=ReverseGeocodingJob jid=e1b0b172bddb929db9086380 INFO: start

E, [2024-09-09T12:53:42.359035 #77] ERROR -- : Error performing ReverseGeocodingJob (Job ID: aa429fd5-7411-41e0-9c63-e561efb3ee8a) from Sidekiq(reverse_geocoding) in 118.03ms: Geocoder::ResponseParseError (Geocoder::ResponseParseError):

/var/app/vendor/bundle/ruby/3.3.0/gems/geocoder-1.8.3/lib/geocoder/lookups/base.rb:186:in `raise_error'

/var/app/vendor/bundle/ruby/3.3.0/gems/geocoder-1.8.3/lib/geocoder/lookups/base.rb:215:in `rescue in parse_json'

/var/app/vendor/bundle/ruby/3.3.0/gems/geocoder-1.8.3/lib/geocoder/lookups/base.rb:208:in `parse_json'

/var/app/vendor/bundle/ruby/3.3.0/gems/geocoder-1.8.3/lib/geocoder/lookups/base.rb:225:in `parse_raw_data'

/var/app/vendor/bundle/ruby/3.3.0/gems/geocoder-1.8.3/lib/geocoder/lookups/base.rb:196:in `fetch_data'

/var/app/vendor/bundle/ruby/3.3.0/gems/geocoder-1.8.3/lib/geocoder/lookups/photon.rb:23:in `results'

/var/app/vendor/bundle/ruby/3.3.0/gems/geocoder-1.8.3/lib/geocoder/lookups/base.rb:46:in `search'

/var/app/vendor/bundle/ruby/3.3.0/gems/geocoder-1.8.3/lib/geocoder/query.rb:11:in `execute'

/var/app/vendor/bundle/ruby/3.3.0/gems/geocoder-1.8.3/lib/geocoder.rb:22:in `search'

/var/app/app/services/reverse_geocoding/points/fetch_data.rb:15:in `call'

/var/app/app/jobs/reverse_geocoding_job.rb:9:in `perform'

/var/app/vendor/bundle/ruby/3.3.0/gems/activejob-7.2.1/lib/active_job/execution.rb:68:in `block in _perform_job'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/callbacks.rb:121:in `block in run_callbacks'

/var/app/vendor/bundle/ruby/3.3.0/gems/i18n-1.14.5/lib/i18n.rb:351:in `with_locale'

/var/app/vendor/bundle/ruby/3.3.0/gems/activejob-7.2.1/lib/active_job/translation.rb:9:in `block (2 levels) in <module:Translation>'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/callbacks.rb:130:in `instance_exec'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/callbacks.rb:130:in `block in run_callbacks'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/core_ext/time/zones.rb:65:in `use_zone'

/var/app/vendor/bundle/ruby/3.3.0/gems/activejob-7.2.1/lib/active_job/timezones.rb:9:in `block (2 levels) in <module:Timezones>'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/callbacks.rb:130:in `instance_exec'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/callbacks.rb:130:in `block in run_callbacks'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/callbacks.rb:141:in `run_callbacks'

/var/app/vendor/bundle/ruby/3.3.0/gems/activejob-7.2.1/lib/active_job/execution.rb:67:in `_perform_job'

/var/app/vendor/bundle/ruby/3.3.0/gems/activejob-7.2.1/lib/active_job/instrumentation.rb:32:in `_perform_job'

/var/app/vendor/bundle/ruby/3.3.0/gems/activejob-7.2.1/lib/active_job/execution.rb:51:in `perform_now'

/var/app/vendor/bundle/ruby/3.3.0/gems/activejob-7.2.1/lib/active_job/instrumentation.rb:26:in `block in perform_now'

/var/app/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.1/lib/active_record/railties/job_runtime.rb:13:in `block in instrument'

/var/app/vendor/bundle/ruby/3.3.0/gems/activejob-7.2.1/lib/active_job/instrumentation.rb:40:in `block in instrument'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/notifications.rb:210:in `block in instrument'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/notifications/instrumenter.rb:58:in `instrument'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/notifications.rb:210:in `instrument'

/var/app/vendor/bundle/ruby/3.3.0/gems/activejob-7.2.1/lib/active_job/instrumentation.rb:39:in `instrument'

/var/app/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.1/lib/active_record/railties/job_runtime.rb:11:in `instrument'

/var/app/vendor/bundle/ruby/3.3.0/gems/activejob-7.2.1/lib/active_job/instrumentation.rb:26:in `perform_now'

/var/app/vendor/bundle/ruby/3.3.0/gems/activejob-7.2.1/lib/active_job/logging.rb:32:in `block in perform_now'

/var/app/vendor/bundle/ruby/3.3.0/gems/activejob-7.2.1/lib/active_job/logging.rb:41:in `tag_logger'

/var/app/vendor/bundle/ruby/3.3.0/gems/activejob-7.2.1/lib/active_job/logging.rb:32:in `perform_now'

/var/app/vendor/bundle/ruby/3.3.0/gems/activejob-7.2.1/lib/active_job/execution.rb:29:in `block in execute'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/callbacks.rb:121:in `block in run_callbacks'

/var/app/vendor/bundle/ruby/3.3.0/gems/activejob-7.2.1/lib/active_job/railtie.rb:79:in `block (4 levels) in <class:Railtie>'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/reloader.rb:77:in `block in wrap'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/execution_wrapper.rb:87:in `wrap'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/reloader.rb:74:in `wrap'

/var/app/vendor/bundle/ruby/3.3.0/gems/activejob-7.2.1/lib/active_job/railtie.rb:78:in `block (3 levels) in <class:Railtie>'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/callbacks.rb:130:in `instance_exec'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/callbacks.rb:130:in `block in run_callbacks'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/callbacks.rb:141:in `run_callbacks'

/var/app/vendor/bundle/ruby/3.3.0/gems/activejob-7.2.1/lib/active_job/execution.rb:27:in `execute'

/var/app/vendor/bundle/ruby/3.3.0/gems/activejob-7.2.1/lib/active_job/queue_adapters/sidekiq_adapter.rb:70:in `perform'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/processor.rb:220:in `execute_job'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/processor.rb:185:in `block (4 levels) in process'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/middleware/chain.rb:180:in `traverse'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/job/interrupt_handler.rb:9:in `call'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/middleware/chain.rb:182:in `traverse'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/metrics/tracking.rb:26:in `track'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/metrics/tracking.rb:134:in `call'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/middleware/chain.rb:182:in `traverse'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/middleware/chain.rb:173:in `invoke'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/processor.rb:184:in `block (3 levels) in process'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/processor.rb:145:in `block (6 levels) in dispatch'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/job_retry.rb:118:in `local'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/processor.rb:144:in `block (5 levels) in dispatch'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/rails.rb:16:in `block in call'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/reloader.rb:77:in `block in wrap'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/execution_wrapper.rb:91:in `wrap'

/var/app/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.1/lib/active_support/reloader.rb:74:in `wrap'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/rails.rb:15:in `call'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/processor.rb:139:in `block (4 levels) in dispatch'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/processor.rb:281:in `stats'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/processor.rb:134:in `block (3 levels) in dispatch'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/job_logger.rb:23:in `call'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/processor.rb:133:in `block (2 levels) in dispatch'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/job_retry.rb:85:in `global'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/processor.rb:132:in `block in dispatch'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/job_logger.rb:50:in `prepare'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/processor.rb:131:in `dispatch'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/processor.rb:183:in `block (2 levels) in process'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/processor.rb:182:in `handle_interrupt'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/processor.rb:182:in `block in process'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/processor.rb:181:in `handle_interrupt'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/processor.rb:181:in `process'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/processor.rb:86:in `process_one'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/processor.rb:76:in `run'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/component.rb:10:in `watchdog'

/var/app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.2/lib/sidekiq/component.rb:19:in `block in safe_thread'

2024-09-09T12:53:42.360Z pid=77 tid=44qxp class=ReverseGeocodingJob jid=41b28c7da64c46ebb1c7a83c elapsed=0.129 INFO: fail

2024-09-09T12:53:42.360Z pid=77 tid=44qxp WARN: {"context":"Job raised exception","job":{"retry":true,"queue":"reverse_geocoding","wrapped":"ReverseGeocodingJob","args":[{"job_class":"ReverseGeocodingJob","job_id":"aa429fd5-7411-41e0-9c63-e561efb3ee8a","provider_job_id":null,"queue_name":"reverse_geocoding","priority":null,"arguments":["Point",612454],"executions":0,"exception_executions":{},"locale":"en","timezone":"Europe/London","enqueued_at":"2024-09-07T19:16:54.829502774Z","scheduled_at":null}],"class":"ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper","jid":"41b28c7da64c46ebb1c7a83c","created_at":1725736614.8295472,"enqueued_at":1725874999.8034253,"error_message":"Geocoder::ResponseParseError","error_class":"Geocoder::ResponseParseError","failed_at":1725785488.0392685,"retry_count":5,"retried_at":1725874347.3591552}}

2024-09-09T12:53:42.360Z pid=77 tid=44qxp WARN: Geocoder::ResponseParseError: Geocoder::ResponseParseError

2024-09-09T12:53:42.361Z pid=77 tid=44qxp WARN: app/services/reverse_geocoding/points/fetch_data.rb:15:in `call'

app/jobs/reverse_geocoding_job.rb:9:in `perform'

2024-09-09T12:53:42.362Z pid=77 tid=44r8t class=ReverseGeocodingJob jid=a36fbb0b1f108dbd2c1dba62 INFO: start

and main dawarich_app container:


12:50:27 web.1  | D, [2024-09-09T12:50:27.118975 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:50:30 web.1  | D, [2024-09-09T12:50:30.842421 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:50:32 web.1  | D, [2024-09-09T12:50:32.178175 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:50:37 web.1  | D, [2024-09-09T12:50:37.245498 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:50:40 web.1  | D, [2024-09-09T12:50:40.842720 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:50:42 web.1  | D, [2024-09-09T12:50:42.283538 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:50:47 web.1  | D, [2024-09-09T12:50:47.392632 #81] DEBUG -- :   User Load (4.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:50:50 web.1  | D, [2024-09-09T12:50:50.842586 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:50:52 web.1  | D, [2024-09-09T12:50:52.464543 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:50:57 web.1  | D, [2024-09-09T12:50:57.502808 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:51:00 web.1  | D, [2024-09-09T12:51:00.842907 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:51:02 web.1  | D, [2024-09-09T12:51:02.559495 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:51:07 web.1  | D, [2024-09-09T12:51:07.604008 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:51:10 web.1  | D, [2024-09-09T12:51:10.842664 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:51:12 web.1  | D, [2024-09-09T12:51:12.651679 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:51:17 web.1  | D, [2024-09-09T12:51:17.744190 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:51:20 web.1  | D, [2024-09-09T12:51:20.843025 #81] DEBUG -- :   User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:51:22 web.1  | D, [2024-09-09T12:51:22.800818 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:51:27 web.1  | D, [2024-09-09T12:51:27.844043 #81] DEBUG -- :   User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:51:30 web.1  | D, [2024-09-09T12:51:30.843402 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:51:32 web.1  | D, [2024-09-09T12:51:32.887739 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:51:38 web.1  | D, [2024-09-09T12:51:38.022657 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:51:40 web.1  | D, [2024-09-09T12:51:40.844209 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:51:42 web.1  | D, [2024-09-09T12:51:42.943976 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:51:48 web.1  | D, [2024-09-09T12:51:48.382394 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:51:50 web.1  | D, [2024-09-09T12:51:50.844235 #81] DEBUG -- :   User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:51:53 web.1  | D, [2024-09-09T12:51:53.477325 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:51:58 web.1  | D, [2024-09-09T12:51:58.572734 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:00 web.1  | D, [2024-09-09T12:52:00.843537 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:03 web.1  | D, [2024-09-09T12:52:03.699526 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:08 web.1  | D, [2024-09-09T12:52:08.694379 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:09 web.1  | F, [2024-09-09T12:52:09.968586 #81] FATAL -- :   

12:52:09 web.1  | ActionController::RoutingError (No route matches [GET] "/favicon.ico"):

12:52:09 web.1  |   

12:52:10 web.1  | D, [2024-09-09T12:52:10.036588 #81] DEBUG -- :   Rendering layout vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.1/lib/action_dispatch/middleware/templates/rescues/layout.erb

12:52:10 web.1  | D, [2024-09-09T12:52:10.036753 #81] DEBUG -- :   Rendering vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.1/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb within rescues/layout

12:52:10 web.1  | D, [2024-09-09T12:52:10.076367 #81] DEBUG -- :   Rendering vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb

12:52:10 web.1  | D, [2024-09-09T12:52:10.847957 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:11 web.1  | D, [2024-09-09T12:52:11.508014 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:11 web.1  | D, [2024-09-09T12:52:11.508511 #81] DEBUG -- :   ↳ app/controllers/application_controller.rb:11:in `unread_notifications'

12:52:11 web.1  | D, [2024-09-09T12:52:11.509767 #81] DEBUG -- :   Rendering layout layouts/application.html.erb

12:52:11 web.1  | D, [2024-09-09T12:52:11.509821 #81] DEBUG -- :   Rendering stats/show.html.erb within layouts/application

12:52:11 web.1  | D, [2024-09-09T12:52:11.512895 #81] DEBUG -- :   Stat Load (0.9ms)  SELECT "stats".* FROM "stats" WHERE "stats"."year" = $1 AND "stats"."user_id" = $2 ORDER BY "stats"."month" ASC  [["year", 2022], ["user_id", 1]]

12:52:11 web.1  | D, [2024-09-09T12:52:11.513384 #81] DEBUG -- :   ↳ app/models/stat.rb:34:in `block in year_distance'

12:52:11 web.1  | D, [2024-09-09T12:52:11.515354 #81] DEBUG -- :   Stat Load (1.0ms)  SELECT "stats".* FROM "stats" WHERE "stats"."user_id" = $1 AND "stats"."year" = $2 ORDER BY "stats"."month" ASC  [["user_id", 1], ["year", 2022]]

12:52:11 web.1  | D, [2024-09-09T12:52:11.515742 #81] DEBUG -- :   ↳ app/views/stats/_year.html.erb:15

12:52:11 web.1  | D, [2024-09-09T12:52:11.549405 #81] DEBUG -- :   Notification Load (1.1ms)  SELECT "notifications".* FROM "notifications" WHERE "notifications"."user_id" = $1 AND "notifications"."read_at" IS NULL  [["user_id", 1]]

12:52:11 web.1  | D, [2024-09-09T12:52:11.549804 #81] DEBUG -- :   ↳ app/views/shared/_navbar.html.erb:69

12:52:11 web.1  | I, [2024-09-09T12:52:11.551093 #81]  INFO -- : {"method":"GET","path":"/stats/2022","format":"html","controller":"StatsController","action":"show","status":200,"allocations":27350,"duration":44.41,"view":38.5,"db":3.2}

12:52:13 web.1  | D, [2024-09-09T12:52:13.184665 #81] DEBUG -- :   User Load (1.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:13 web.1  | D, [2024-09-09T12:52:13.375337 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:19 web.1  | D, [2024-09-09T12:52:19.420420 #81] DEBUG -- :   User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:20 web.1  | D, [2024-09-09T12:52:20.843791 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:24 web.1  | D, [2024-09-09T12:52:24.576932 #81] DEBUG -- :   User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:29 web.1  | D, [2024-09-09T12:52:29.701122 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:30 web.1  | D, [2024-09-09T12:52:30.844994 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:34 web.1  | D, [2024-09-09T12:52:34.839786 #81] DEBUG -- :   User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:39 web.1  | D, [2024-09-09T12:52:39.857039 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:40 web.1  | D, [2024-09-09T12:52:40.850685 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:45 web.1  | D, [2024-09-09T12:52:45.064570 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:50 web.1  | D, [2024-09-09T12:52:50.131500 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:50 web.1  | D, [2024-09-09T12:52:50.848276 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:52:55 web.1  | D, [2024-09-09T12:52:55.172283 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:53:00 web.1  | D, [2024-09-09T12:53:00.255920 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:53:00 web.1  | D, [2024-09-09T12:53:00.845979 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:53:05 web.1  | D, [2024-09-09T12:53:05.318490 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:53:10 web.1  | D, [2024-09-09T12:53:10.354243 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:53:10 web.1  | D, [2024-09-09T12:53:10.848471 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:53:15 web.1  | D, [2024-09-09T12:53:15.504648 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:53:20 web.1  | D, [2024-09-09T12:53:20.564014 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:53:20 web.1  | D, [2024-09-09T12:53:20.845611 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:53:25 web.1  | D, [2024-09-09T12:53:25.670254 #81] DEBUG -- :   User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:53:30 web.1  | D, [2024-09-09T12:53:30.702196 #81] DEBUG -- :   User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:53:30 web.1  | D, [2024-09-09T12:53:30.847015 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:53:35 web.1  | D, [2024-09-09T12:53:35.822111 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:53:40 web.1  | D, [2024-09-09T12:53:40.849072 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:53:40 web.1  | D, [2024-09-09T12:53:40.877788 #81] DEBUG -- :   User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:53:45 web.1  | D, [2024-09-09T12:53:45.984723 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:53:50 web.1  | D, [2024-09-09T12:53:50.846737 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:53:51 web.1  | D, [2024-09-09T12:53:51.004816 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:53:56 web.1  | D, [2024-09-09T12:53:56.054804 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:54:00 web.1  | D, [2024-09-09T12:54:00.851504 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:54:01 web.1  | D, [2024-09-09T12:54:01.139778 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:54:06 web.1  | D, [2024-09-09T12:54:06.178956 #81] DEBUG -- :   User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:54:10 web.1  | D, [2024-09-09T12:54:10.850672 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:54:11 web.1  | D, [2024-09-09T12:54:11.206652 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:54:16 web.1  | D, [2024-09-09T12:54:16.257739 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:54:20 web.1  | D, [2024-09-09T12:54:20.847768 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:54:21 web.1  | D, [2024-09-09T12:54:21.303359 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:54:26 web.1  | D, [2024-09-09T12:54:26.411873 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:54:30 web.1  | D, [2024-09-09T12:54:30.848151 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:54:31 web.1  | D, [2024-09-09T12:54:31.504748 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:54:36 web.1  | D, [2024-09-09T12:54:36.563565 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:54:40 web.1  | D, [2024-09-09T12:54:40.850935 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:54:41 web.1  | D, [2024-09-09T12:54:41.609577 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:54:46 web.1  | D, [2024-09-09T12:54:46.672465 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:54:50 web.1  | D, [2024-09-09T12:54:50.848482 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:54:51 web.1  | D, [2024-09-09T12:54:51.783612 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

12:54:56 web.1  | D, [2024-09-09T12:54:56.889808 #81] DEBUG -- :   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]

note that I took these logs out of their containers a few seconds apart, so they might not 100% match each other Additional context My import is still going as I speak, but I wanted to see if this was a known issue/if it would fix itself once actually done instead of waiting another 24 hours or so for it to finish before I find out.

Korenchkin commented 1 month ago

i would guess reverse geocoding error? can you do(a bit of disk size heavy) photon with dawarich? do another vm,if i remember correctly,it was more cpu tied than memory(it was using around 2GB ram),disk size i recommend 200GB...there is the issue of getting those 200GB-download(almost 100GB of data ?(g)zipped?) to another disk and unpack to those 200GB,otherwise you need more...after starting it,it eats ~20% of 2 cores on my 7600k for few seconds during resolving(each point)

tldr:free service of geocoding api limit or down

edit:i use dawarich as secondary,i always have source data,so i can wipe and restart,import,start photon again(i use it for first time import only,i have around 1.1GB google export raw text points),there is start/continue geocoding in gui settings,i believe those errors are not a problem for you,but if you have doubts,you can do it same as me,and adding photon (there should be some basic info how to photon,maybe on one release,test on a few points and then do overnight mass import)

joelis10 commented 1 month ago

I'm sorry I have no idea what you mean by Photon (and really anything you just said)

Korenchkin commented 1 month ago

photon is this: https://github.com/komoot/photon ,reverse geocoding is service where you give it api coordinates,it replies with name(city,street,maybe shop name),this service is cpu intensive,so limits are used,which you reached probably,or just bad time and it was down,you can bypass this with your own selfhosted,dawarich allows you to set your own geocoding service(photon),while it is still not completely selfhosted(you pull maps from openstreetmap provider),that could be sorted with another map proxy...

selfhosted means you are your own limit,if it does not work,it is your problem :)

jonhnet commented 1 month ago

I'm running into this same issue. 1.5M processed, 494k failed so far. Retries panel says:

[just now](http://localhost:3000/sidekiq/retries/1725941155.4189491-d77c8f8b7897bcd27e5d6f38)   0   [reverse_geocoding](http://localhost:3000/sidekiq/queues/reverse_geocoding)     ReverseGeocodingJob     
"Point", 775360

Geocoder::ResponseParseError: Geocoder::ResponseParseError

many times.

I don't understand @Korenchkin 's suggestion enough to implement it. Would you mind writing up a FAQ about what to do here?

joelis10 commented 1 month ago

I was going to say the same as @jonhnet - I'm sure there'd be a proper solution the dev(s) can share as this can't be the first time it's happened

Freika commented 1 month ago

Failed jobs != failed point imports. If you see your file on the Imports page, and it has some number of points against it, then it was successfully imported.

The other thing is reverse geocoding, which might fail due to ban from Nominatim or Photon instance misconfiguration. In the original problem description from @joelis10 I see exactly a problem with an invalid response from reverse geocoding service, but not with an import failure. In any case, it has nothing to do with Dawarich, but with reverse geocoding service, be it Nominatim or your own Photon API instance.

Following this guide should solve this problem: https://dawarich.app/docs/tutorials/reverse-geocoding#setting-up-your-own-reverse-geocoding-service

Kudos for providing proper logs though 👍

jonhnet commented 4 weeks ago

@Freika The linked guide describes but doesn't link to: https://tonsnoei.nl/en/post/2023/03/20/set-up-your-own-geocoder-api/ I'd send this suggestion as a PR, but I don't see where the tutorials live in the github tree. ...I'm off following the instructions at the linked tutorial now. Thank you!

Freika commented 4 weeks ago

@Freika The linked guide describes but doesn't link to

https://github.com/dawarich-app/site/blob/main/docs/tutorials/reverse-geocoding.md?plain=1#L49

jonhnet commented 4 weeks ago

Oh dear, it was there all along! Sorry about that. On my display the hyperlinks weren't rendered differently than ordinary text, so it didn't occur to me to click. Sorry about that!

Freika commented 3 weeks ago

@jonhnet that made me realise that light version of the website actually doesn't highlight links in any visible way. Will be fixed :)