Commit Graph

101 Commits

Author SHA1 Message Date
slothful-vassal
485ec53f6d feat: add plugin system (#1034)
* feat: add plugin system

* fix db docker build

* fix hammerhead readme, add strava subscription news to docs

* fixes and sdk improvements

* fix: reduce Meilisearch load, debounce federation sync (#1012)

* optimize meili trail index

* several fixes

---------

Co-authored-by: Flomp <Flomp@users.noreply.github.com>

* Bump svelte from 5.55.5 to 5.56.0 in /docs (#1032)

Bumps [svelte](https://github.com/sveltejs/svelte/tree/HEAD/packages/svelte) from 5.55.5 to 5.56.0.
- [Release notes](https://github.com/sveltejs/svelte/releases)
- [Changelog](https://github.com/sveltejs/svelte/blob/main/packages/svelte/CHANGELOG.md)
- [Commits](https://github.com/sveltejs/svelte/commits/svelte@5.56.0/packages/svelte)

---
updated-dependencies:
- dependency-name: svelte
  dependency-version: 5.56.0
  dependency-type: direct:production
...

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

* Release v0.19.2 (#1035)

* chore: release v0.19.2

* add changelog

---------

Co-authored-by: Flomp <26000991+Flomp@users.noreply.github.com>
Co-authored-by: Christian Beutel <>

* speed up plugin sync and several small fixes

* concepts for security improvements and process stability

* improve concept

* security concept implemented

* remove insecure TLS

* worker concept implemented

* fixes and cleanup

* fixes

* docu

* mermaid, namings

* WASM plugin host improvements, plugin logging

* fix db migration

* Improve plugin config and category mapping UI

* fixes

* further fixes

* remove manual test sync

* fix db migration and strava mapping

* type added, UI improvements

* fix plugin card toggle clickable area

* optimize synch status card layout

* plugin type 'trails' instead of 'integration'

* session auth validation in UI

* fix komoot date and waypoints

* improve category mapping

* fix send to hammerhead: trail name

* plugin setup error handling improved

* fix review findings

* re-mapping added

* rename remote_category

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Flomp <Flomp@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Flomp <26000991+Flomp@users.noreply.github.com>
2026-06-22 15:00:44 +02:00
Pål Håland
197cd8d04e feat: implement server-side map clustering (#991)
* feat: meilisearch bounding box intersection and map filtering

* feat: tiered clustering and polyline filtering based on bounding box diagonal

Addressing review comments with optimized performance and data accuracy:
- Implemented a two-tiered search strategy (Summary vs. Detailed) to provide 100% accurate cluster counts while minimizing metadata traffic.
- Added a client-side ID-based cache to eliminate redundant network requests for trails already in memory.
- Introduced tiered 'detail shedding' that dynamically hides small trail lines when zooming out to maintain smooth panning performance.
- Fixed Svelte 5 reactivity issues to ensure clusters reappear instantly when trail detail is shed.
- Consolidated zoom thresholds into centralized constants for system-wide consistency.
- Updated Meilisearch configuration to support efficient ID-based filtering.

* feat: implement server-side map clustering using Meilisearch and Supercluster

- Implemented SvelteKit server-side clustering route at `/api/v1/search/trails/cluster` using the `supercluster` library.
- Integrated backend search results with the new clustering endpoint to improve performance for large trail datasets.
- Fixed Svelte 5 reactivity in `MapWithElevationMaplibre.svelte` by making `mapLoaded` reactive and fixing destructuring of `` map data.
- Removed obsolete client-side zoom constraints (`minzoom`/`maxzoom`) from `TrailLayer`, `PreviewLayer`, and `ClusterLayer` to allow dynamic visibility controlled by backend attributes.
- Fixed a bug where unauthenticated users generated invalid Meilisearch filters.
- Optimized map page performance by caching bounding box and filter values in the route loader.
- Updated `ClusterLayer` font to `Noto Sans Regular` to match available tileserver resources.

* feat: implement dynamic polyline visibility based on result density

- Replaced static zoom-based diagonal thresholds with a dynamic "Top N" approach for polyline visibility.
- Updated `/api/v1/search/trails/cluster` to mark only the top `MAP_MAX_POLYLINES` (default 100) trails by bounding box diagonal as "large".
- Modified `trails_search_bounding_box` store function to always fetch polylines for trails marked as large, regardless of zoom level.
- Removed obsolete `MAP_*_ZOOM_DIAGONAL_LIMIT` constants and simplified map layer constructors by removing tier-based filtering.
- Updated environment configurations and documentation to use the new `PUBLIC_MAP_MAX_POLYLINES` variable.

* refactor: remove obsolete zoom-based map clustering thresholds

Following the transition to dynamic server-side clustering based on result density (Top N polylines), this commit removes all remaining zoom-based thresholds and logic.

- Removed PUBLIC_MAP_LOW_ZOOM_THRESHOLD, PUBLIC_MAP_MEDIUM_ZOOM_THRESHOLD, and PUBLIC_MAP_HIGH_ZOOM_THRESHOLD environment variables.
- Removed the 'mapClusterMinZoom' user setting from the schema, models, and settings UI.
- Simplified the map component and MapLibre layer managers by removing unused 'clusterMinZoom', 'minZoom', and 'maxZoom' parameters.
- Cleaned up obsolete 'map-cluster-zoom-level' translation keys across all locales.
- Updated documentation to reflect the removal of these variables.

* chore: remove map clustering debug logs

* docs: update changelog and fix global zoom feature disappearance

* fix: address PR reviews and refine map cluster/preview visuals

* feat: implement configurable map cluster zoom and trail start marker settings

* feat: render single unclustered shedded trails as start markers instead of cluster circles

* minor fixes

* minor ui changes

* fix missing entries in map list

* remove redundant map clustering zoom clamp

* fix merge issues

* fix merge issues

* fixes

* hide popup for trails without details

* several improvements

* prevent import of client trail_store in server cluster code

* update changelog

---------

Co-authored-by: slothful-vassal <89943360+slothful-vassal@users.noreply.github.com>
2026-06-07 13:00:26 +02:00
slothful-vassal
44cd092065 Improve trail planning: option to re-order route anchors (#1007)
* trail anchor list added

* add search location card to extend route endpoint in drawing mode

* add POI popup endpoint action in route drawing mode

* fix anchor stats, improve anchor list entries and refine route marker behavior

* fix map marker spinner

* docs updated

* fix spinner when delete an anchor

* further improvements

* fix adding first anchor from POI

* optimize drag handle area

---------

Co-authored-by: Flomp <Flomp@users.noreply.github.com>
2026-06-06 11:56:12 +02:00
slothful-vassal
6d1d1236ef Trail Edit / Waypoints from photos: prevent creating different waypoints for near-by locations (#457)
* trail edit / waypoints from photos: prevent creating different waypoints for near-by locations

* remove not necessary imports

* remove changes from gitignore

* patch gitignore

* waypoint merge radius as category property

* change datamodel for merge radius (use more generic settings field for future implementations)

* fix npm run check issues

* several improvements/fixes

* fix

* move geo cluster code to db

* fix compile issue

* fix docker issue

* merge with existing waypoints

---------

Co-authored-by: Christian Beutel <>
Co-authored-by: Flomp <Flomp@users.noreply.github.com>
2026-04-29 11:15:06 +02:00
Flomp
7bdf0d3151 Adds option to mark trail as completed (#920)
* initial commit

* add completed for komoot tours

* mark hammerhead activities as completed

* fix review suggestions

* adds completed modal to trail edit page

---------

Co-authored-by: Christian Beutel <>
Co-authored-by: slothful-vassal <89943360+slothful-vassal@users.noreply.github.com>
2026-04-27 20:37:11 +02:00
slothful-vassal
f6354dcd56 narrow-wide trail list view mode added (#666)
* narrow-wide trail list view mode added

* change icon, change pos, add i18n

* change icon

---------

Co-authored-by: Christian Beutel <>
Co-authored-by: Flomp <Flomp@users.noreply.github.com>
2026-04-01 19:07:27 +02:00
Flomp
591a72e2d1 initial commit (#896)
Co-authored-by: Christian Beutel <>
2026-03-26 20:54:40 +01:00
Flomp
83a64775d0 initial commit (#883)
Co-authored-by: Christian Beutel <>
2026-03-10 21:49:10 +01:00
Flomp
711a592038 Feature: API Tokens (#848)
* initial commit

* fix last_used timestamp

---------

Co-authored-by: Christian Beutel <>
2026-03-07 10:10:25 +01:00
slothful-vassal
f2396ae574 new trail view options: create copy & change visibility (#571)
* change visibility of multiple trails in trails view (multi-select)

* error handling

* create copy option added

* wait for meilisearch when updating trail

* remove toggles from dropdown

* change public/private logic

* adds loading spinner for bulk operations

* fixes trail duplicate

* fixes tags delete on visiblility change

* fix conflict resolving issue

* edit labels & german translation

---------

Co-authored-by: Christian Beutel <>
Co-authored-by: Flomp <Flomp@users.noreply.github.com>
2026-03-01 18:18:09 +01:00
slothful-vassal
bd293e6739 new setting: begin drawing a new trail from current location (#592)
* new setting: begin drawing a new trail from  current location

* apply only when drawing

* fix application when editing an existing route

* documentation

* ignore pointer events on location circles

* fix i18n

---------

Co-authored-by: Flomp <Flomp@users.noreply.github.com>
Co-authored-by: Christian Beutel <>
2026-02-28 10:15:43 +01:00
slothful-vassal
230f42d639 Improve save public list (#554)
* improve save public list

* remove obsolete code fragment

---------

Co-authored-by: Flomp <Flomp@users.noreply.github.com>
2026-02-28 09:26:48 +01:00
Flomp
32a9a67e7e Adds czech (#774)
Co-authored-by: Christian Beutel <>
2026-02-05 09:36:57 +01:00
Flomp
dacdaeab26 New Crowdin updates (#622)
* New translations en.json (French)

* New translations en.json (Dutch)

* New translations en.json (Dutch)

* New translations en.json (Russian)

* New translations en.json (Russian)

* New translations en.json (French)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Spanish)

* New translations en.json (Czech)

* New translations en.json (Czech)

* New translations en.json (Czech)

* New translations en.json (Czech)

* New translations en.json (Czech)

* New translations en.json (Czech)

* New translations en.json (Czech)

* New translations en.json (Czech)

* New translations en.json (Czech)

* New translations en.json (Czech)

* New translations en.json (Czech)

* New translations en.json (Czech)

* New translations en.json (German)

* New translations en.json (French)

* New translations en.json (German)

* New translations en.json (German)

* New translations en.json (German)

* New translations en.json (German)

* fixes valhalla spelling

* Added Norwegian translation (#668)

* adds norwegian

* minor fixes in de

---------

Co-authored-by: Christian Beutel <>
Co-authored-by: Pål Håland <4449863+palhaland@users.noreply.github.com>
2026-02-02 18:24:20 +01:00
Flomp
b65fbdd128 fix trail privacy (#719)
* fix trail privacy

* adds privacy setting to integrations

---------

Co-authored-by: Christian Beutel <>
2026-01-13 19:01:05 +01:00
Niklas
712174491b fix spelling so translating is easier (#700)
Co-authored-by: Niklas <niklas1375@gmail.com>
2026-01-11 21:27:50 +01:00
Flomp
72b57f85bd New translations en.json (Chinese Simplified) 2025-09-13 16:53:22 +02:00
Christian Beutel
72acac072c fixes strava integration 2025-09-13 16:04:48 +02:00
Christian Beutel
4ffd2dd0c2 updates changelog 2025-08-28 15:04:21 +02:00
Flomp
0032556cb9 New Crowdin updates (#478)
* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (German)

* New translations en.json (Basque)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Chinese Simplified)

---------

Co-authored-by: Christian Beutel <>
2025-08-28 14:33:39 +02:00
Christian Beutel
a8de5d075f adds es, eu, ru translations 2025-08-24 15:23:54 +02:00
Flomp
00bb717def New Crowdin updates (#394)
* New translations en.json (Spanish)

* New translations en.json (French)

* New translations en.json (German)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Chinese Simplified)

* New translations en.json (Russian)

* New translations en.json (Basque)

* New translations en.json (Spanish)

* New translations en.json (French)

* New translations en.json (German)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Chinese Simplified)

* New translations en.json (Russian)

* New translations en.json (Basque)

* New translations en.json (Spanish)

* New translations en.json (French)

* New translations en.json (German)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Chinese Simplified)

* New translations en.json (Russian)

* New translations en.json (Basque)

* New translations en.json (Spanish)

* New translations en.json (French)

* New translations en.json (German)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Chinese Simplified)

* New translations en.json (Russian)

* New translations en.json (Basque)

* New translations en.json (Russian)

* New translations en.json (French)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (French)

* New translations en.json (German)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Chinese Simplified)

* New translations en.json (Russian)

* New translations en.json (Basque)

* New translations en.json (Spanish)

* New translations en.json (French)

* New translations en.json (German)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Chinese Simplified)

* New translations en.json (Russian)

* New translations en.json (Basque)

* New translations en.json (Italian)

* New translations en.json (Basque)

* New translations en.json (Basque)

* New translations en.json (Basque)

* New translations en.json (Basque)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Basque)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (German)

* New translations en.json (Basque)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Chinese Simplified)

* New translations en.json (German)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (German)

* New translations en.json (Basque)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Chinese Simplified)

* adds OpenHikingMaps

* update changelogs

---------

Co-authored-by: Christian Beutel <>
2025-08-24 13:39:28 +02:00
Christian Beutel
4ba0281e0f adds customizable "about" section 2025-08-23 19:10:46 +02:00
Christian Beutel
1e22c78c22 adds trail link sharing 2025-08-20 16:51:33 +02:00
Christian Beutel
ef1571c54e adds route edit menu 2025-07-19 19:40:11 +02:00
Christian Beutel
6a908a3ace adds overpass icons 2025-07-18 21:42:16 +02:00
Christian Beutel
eac9b2e489 adds layer manager 2025-07-13 22:22:08 +02:00
Christian Beutel
03bf5aa5ad finishes feed 2025-07-12 16:36:40 +02:00
Christian Beutel
237d12bfec adds feed 2025-07-11 16:02:18 +02:00
Flomp
7791acb1fe New translations en.json (Chinese Simplified) 2025-07-10 13:17:06 +02:00
Flomp
f0b58e7949 New translations en.json (Chinese Simplified) 2025-07-04 14:06:15 +02:00
Flomp
783bde9e07 New translations en.json (Chinese Simplified) 2025-06-27 18:58:57 +02:00
Flomp
1ec7032f1e New translations en.json (Chinese Simplified) 2025-06-27 14:47:42 +02:00
Flomp
9c37c19188 New translations en.json (Chinese Simplified) 2025-06-26 15:44:52 +02:00
Flomp
00e64ff57f New translations en.json (Chinese Simplified) 2025-06-26 14:41:56 +02:00
Flomp
eea73497fc New translations en.json (Chinese Simplified) 2025-06-26 13:16:06 +02:00
Flomp
7768fd17bf New translations en.json (Chinese Simplified) 2025-06-21 12:33:52 +02:00
Flomp
80f2d1bb20 New Crowdin updates (#328)
* New translations en.json (Spanish)

* New translations en.json (French)

* New translations en.json (German)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Chinese Simplified)

* New translations en.json (Russian)

---------

Co-authored-by: Christian Beutel <>
2025-06-21 10:28:22 +02:00
Flomp
ac0d0ed401 New translations en.json (Chinese Simplified) 2025-06-21 10:10:09 +02:00
Flomp
8f4084f58f New translations en.json (Chinese Simplified) 2025-04-30 15:32:45 +02:00
Flomp
a630d4d2e2 New translations en.json (Chinese Simplified) 2025-04-25 13:21:35 +02:00
Flomp
6b8934af5e New translations en.json (Chinese Simplified) 2025-04-15 15:50:12 +02:00
Flomp
6873a03f45 New translations en.json (Chinese Simplified) 2025-04-11 14:51:31 +02:00
Flomp
fada4b8756 New translations en.json (Chinese Simplified) 2025-03-29 12:53:40 +01:00
Flomp
f5997b69e1 New translations en.json (Chinese Simplified) 2025-03-19 22:30:55 +01:00
Flomp
a3ffd58260 New translations en.json (Chinese Simplified) 2025-03-16 18:24:05 +01:00
Flomp
90327ae44a New translations en.json (Chinese Simplified) 2025-03-14 18:58:06 +01:00
Flomp
9fe94f9483 New translations en.json (Chinese Simplified) 2025-02-16 21:02:28 +01:00
Flomp
a7abbd7f04 New translations en.json (Chinese Simplified) 2025-02-14 13:30:59 +01:00
Flomp
7e85c8d19e New translations en.json (Chinese Simplified) 2025-02-08 12:08:43 +01:00