Service worker: - Strip version suffix from CACHE_PAGES and CACHE_IMAGES so cached pages and recipe thumbs survive SW updates. Each deploy used to wipe both, forcing a re-sync before the user could open the app offline. Build and static caches stay version-suffixed (entries are hash-fingerprinted). - Install precaches the offline shells: /, /rezepte, /recipes, both offline-shell pages, /glaube, /faith, /fitness — best-effort with Promise.allSettled so a single 5xx can't fail SW install. - Bulk thumbnail precache now skips URLs already in CACHE_IMAGES. Recipe thumb URLs embed a content hash, so a cache hit guarantees identical bytes; subsequent syncs after small recipe edits no longer redownload every image. - Activate cleanup deletes only stale versioned build/static entries and obsolete versioned pages/images caches. Universal load migration: - [recipeLang]/+layout.server.ts removed; logic in universal +layout.ts. Session fetched from /auth/session, nulled when offline. - [recipeLang]/+page.server.ts and season/[month]/+page.server.ts removed; merged into universal +page.ts. Drops the __data.json round-trip entirely for these routes — IndexedDB fallback now runs even when the SW page cache is empty (fresh install, hash mismatch, etc.) instead of getting blocked by a 503 from the data handler. Other: - /static/rezepte/thumb URLs in sync.ts and the SW thumb fallback now use the absolute https://bocken.org origin. Dev/preview servers don't host /static/rezepte and were 404ing on themselves; production keys resolve to the same string so existing caches stay valid. - Root +layout.svelte invalidateAll() now bails when !navigator.onLine. Resume-while-offline used to refetch every load() and surface the error page instead of the still-viewable cached content. Bump 1.64.2 -> 1.65.2.
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 (
/rezeptevs/recipes,/glaubevs/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
- 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