Alexander f3d16d5187 feat(hikes): route-builder, overview map + cards, SAC-coloured pipeline
Build pipeline (scripts/build-hikes.ts) parses per-hike GPX, encodes
images via sharp, reverse-geocodes the centroid against Swisstopo and
emits a typed manifest under src/lib/data/hikes.generated.ts (gitignored).
Track JSON + image binaries live outside /static; served in dev by a
small hike-images plugin in vite.config.ts, in prod by nginx (private/
images proxied through Node + X-Accel-Redirect for auth-gating).

/hikes overview: full-bleed Swisstopo hero map (HikesOverviewMap) sits
under the sticky nav, drawing one polyline per route coloured by SAC
tier (T1 yellow Wegweiser, T2/T3 white-red-white, T4-T6 white-blue-
white). Click navigates, hover thickens + tooltips. Layer toggle,
recenter, GPS controls mirror the detail map (minus images toggle).
Cards drop the trail SVG, gain a per-route icon + SAC marker
pictogram on the cover, altitude range, season label, and "Neu" badge
for recently-published hikes. Filter bar + totals strip recompute over
the currently-visible set.

/hikes/[slug]: hero map with elevation profile, photo strip with map
sync, scroll-position pin, GPX download, SAC marker stats + min/max
altitude + season.

Route-builder (/hikes/route-builder): client-side draft persisted to
localStorage, EXIF-driven image placement, snap-to-route via BRouter
(OSRM + linear fallback) and Swisstopo profile.json elevation
enrichment that handles degenerate same-coord segments via the height
endpoint.

Filter init switched from a script-time snapshot of data.hikes (which
sporadically returned a one-hike subset during dev hydration and
locked the page to that single hike) to a post-mount \$effect.

Content under src/content/hikes/ intentionally not included (WIP).
2026-05-18 21:13:00 +02:00
2023-06-24 15:33:41 +02:00
2023-06-24 15:35:36 +02:00

Personal Homepage

My own homepage, bocken.org, built with SvelteKit and Svelte 5.

Features

Recipes (/rezepte · /recipes)

Bilingual recipe collection with search, category filtering, and seasonal recommendations. Authenticated users can add recipes and mark favorites. Recipes are browsable offline via service worker caching.

Faith (/glaube · /faith)

Catholic prayer collection in German, English, and Latin. Includes an interactive Rosary with scroll-synced SVG bead visualization, mystery images (sticky column on desktop, draggable PiP on mobile), decade progress tracking, and a daily streak counter. Adapts prayers for liturgical seasons like Eastertide.

Fitness (/fitness)

Workout tracker with template-based training plans, set logging with RPE, rest timers synced across devices via SSE, workout history with statistics, and body measurement tracking. Cardio exercises support native GPS tracking via the Android app with background location recording.

Android app: Download APK — Tauri v2 shell with native GPS foreground service for screen-off tracking, live notification with elapsed time, distance, and pace.

Expense Sharing (/cospend)

Shared expense tracker with balance dashboards, debt breakdowns, monthly bar charts with category filtering, and payment management.

Self-Hosted Services

Landing pages and themed integrations for Gitea, Jellyfin, SearxNG, Photoprism, Jitsi, Webtrees, and more — all behind Authentik SSO.

Technical Highlights

  • PWA with offline support — service worker with network-first caching, offline recipe browsing, and intelligent prefetching
  • Bilingual routing — language derived from URL (/rezepte vs /recipes, /glaube vs /faith) with seamless switching
  • Nord theme — consistent color palette with light/dark mode support
  • Auth — Auth.js with OIDC/LDAP via Authentik, role-based access control
  • Progressive enhancement — core functionality works without JavaScript

TODO

General

Rezepte

Glaube

E-Mail

  • emailwiz setup
  • fail2ban
  • LDAP?

Dendrite

  • setup dendrite
  • Connect to LDAP/OIDC (waiting on upstream)
  • Serve some web-frontend -> Just element?

Webtrees

  • setup Oauth2proxy -> not necessary, authentik has proxy integrated
  • connect to OIDC using Oauth2proxy (using authentik)
  • consistent theming
  • auto-login if not logged in

Jitsi

  • consistent theming
  • move away from docker
  • find a way to improve max video quality without jitsi becoming unreliable

Searx

  • investigate SearxNG as more reliable alternative
  • consistent theming

Photoprism

  • consistent theming
  • OIDC integration
S
Description
My personal website built to learn SvelteKit. The largest part is the Recipes subsection.
https://bocken.org
Readme AGPL-3.0 160 MiB
Languages
Svelte 52%
TypeScript 43.1%
CSS 1.3%
Kotlin 1%
JavaScript 0.9%
Other 1.7%