Commit graph

1620 commits

Author SHA1 Message Date
Till JS
7c1e2aca49 chore: remove remaining Hetzner references across codebase
Deleted:
- DOCKER_REGISTRY_SETUP.md, QUICK_START_CICD.md (legacy CI/CD docs)
- docs/ULOAD-DEPLOYMENT.md (Hetzner VPS deployment guide)
- scripts/get-ssh-key.sh, scripts/remove-coolify-references.sh (legacy scripts)

Updated Hetzner → MinIO references in:
- shared-storage (package.json, README, client.ts, types.ts)
- App CLAUDE.md files (mukke, storage, planta, picture)
- .claude/GUIDELINES.md, sveltekit-web.md guideline
- TROUBLESHOOTING.md, SETUP_TEMPLATES.md (replaced IPs with placeholders)
- GIT_WORKFLOW.md, COMMANDS.md
- services/matrix-project-doc-bot/CLAUDE.md

Remaining Hetzner mentions are in historical devlogs/audits and docs
that list Hetzner as a hosting alternative (not as active infrastructure).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 10:30:26 +01:00
Till JS
cc5ba3bb90 chore: remove Hetzner legacy artifacts and update docs for Mac Mini self-hosting
Deleted files:
- docker/caddy/Caddyfile.production + Caddyfile.staging (Hetzner reverse proxy configs)
- scripts/deploy/ (deploy-hetzner.sh, build-and-push.sh, health-check.sh, migrate-db.sh, rollback.sh)
- scripts/generate-staging-secrets.sh
- cicd/ directory (11 Hetzner CI/CD planning docs)
- CI_CD_IMPLEMENTATION_SUMMARY.md, CI_CD_README.md, FILES_CREATED.md, HIVE_MIND_FINAL_REPORT.md

Updated docs:
- CLAUDE.md: Remove Hetzner Object Storage references, update to MinIO
- docs/ANALYTICS.md: Cloudflare Tunnel instead of Caddy
- docs/URL_SCHEMA.md: Mac Mini + Cloudflare Tunnel instead of Hetzner IP
- .env.development: Remove "Hetzner in production" comments

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 10:12:24 +01:00
Till JS
94fead0873 fix(mukke): add unsafe-eval to CSP for Butterchurn shader compilation
Butterchurn (Milkdrop) uses eval() for preset/shader compilation which
was blocked by CSP. Add unsafe-eval to script-src for mukke only.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 10:04:25 +01:00
Till JS
376cfe881b docs: add tech stack independence analysis and improvement roadmap
Comprehensive analysis of self-hosted vs cloud dependencies with
prioritized roadmap to reach ~90% self-hosting. Key findings: mana-image-gen
can replace Replicate, all LLM calls should route through mana-llm,
and backup strategy needs strengthening.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 10:01:14 +01:00
Till JS
d4d08cc68b fix(spiral-db): add test suite and fix critical bugs
Add comprehensive test suite (174 tests) covering encoding, schema,
image, database CRUD, and PNG round-trip. Fix critical bugs:

- PNG compression: replace non-functional zlibCompress with pako.deflate
- PNG import: add CRC validation, support all filter types (Sub/Up/Avg/Paeth)
- Input validation: validate records against schema before insert
- Index overflow: dynamic dataStartRing prevents index/data ring overlap
- Image expansion: expand before writes instead of after to prevent OOB
- update() read bug: search index from end to find latest entry, not deleted one
- String encoding: enforce 511-byte max length
- Index ring count: use 6 bits (2 pixels) instead of 3 bits for >7 ring support

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 09:52:18 +01:00
Till JS
3f5c17adbc fix(mukke): fix audio CORS for MinIO presigned URLs
Set crossOrigin='anonymous' on audio element for Web Audio API
compatibility with cross-origin sources. Add MINIO_API_CORS_ALLOW_ORIGIN
to allow browser requests from all web apps.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 09:51:17 +01:00
Till JS
807c5da26e fix(mukke): add media-src to CSP for audio playback from MinIO
Add mediaSrc option to shared security headers and configure mukke
to allow audio loading from minio.mana.how (S3 presigned URLs).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 09:40:56 +01:00
Till JS
ae0ba94fce docs(analytics): fix Umami admin URL from umami.mana.how to stats.mana.how
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 09:38:54 +01:00
Till JS
55e4f7b5cc fix(shared-ui): fix transparent context menu background
Use existing --color-surface-elevated CSS variable instead of
non-existent --color-surface-elevated-3. Add box-shadow for depth.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 09:37:53 +01:00
Till JS
c0c64aa2cb docs(analytics): fix outdated information in ANALYTICS.md
- Replace hardcoded website IDs with env variable references (IDs were stale)
- Add missing web apps: Zitare, Presi, NutriPhi, Storage, Photos, SkillTree
- Fix AuthEvents docs to include 'github' method
- Add note that AuthEvents helpers are rarely used directly
- Fix Development Mode section (no console logging, events silently ignored)
- Fix Umami server details: container name, image, correct port (8010, not 3200)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 09:37:42 +01:00
Till JS
761421fada docs(analytics): update ANALYTICS.md with new tracking events
Add documentation for newly added events in Todo, Calendar, and Contacts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 09:33:25 +01:00
Till JS
c8de944c8d feat(monitoring): add GlitchTip health check and disk space monitoring
- Add GlitchTip to health-check.sh monitoring endpoints
- Add native disk space checks for / and /Volumes/ManaData with 80%/90% thresholds
- Extend Prometheus disk alerts to include /host_mnt/Volumes/ManaData mountpoint
- Add ManaData disk usage gauge to Grafana system-overview dashboard

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 09:33:09 +01:00
Till JS
a12ec68fc2 fix(docker): add shared-nestjs-metrics to 5 backend Dockerfiles
The previous commit added MetricsModule to these backends but their
Dockerfiles didn't COPY the shared-nestjs-metrics package into the
build context, causing Docker builds to fail.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 09:31:21 +01:00
Till JS
dd477d5fda feat(analytics): expand umami tracking in todo, calendar, and contacts apps
Todo:
- Track projectCreated, projectDeleted, labelCreated
- Track taskUncompleted
- Track quickAddUsed via QuickInputBar

Calendar:
- Track eventUpdated, eventDeleted
- Track calendarCreated, calendarDeleted

Contacts:
- Track contactUpdated, contactDeleted, contactFavorited, contactArchived
- Track searchPerformed in SearchModal
- Track contactExported in ExportModal
- Track contactImported for both Google and file (vCard/CSV) imports

Also extends analytics event helpers with new event types.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 09:27:30 +01:00
Till JS
c1ef55fd54 fix(infra): rename LightWrite to Mukke in Caddyfile production config
LightWrite was replaced by Mukke on the same ports (5180/3010).
Update reverse proxy to use mukke.mana.how and mukke-api.mana.how.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 09:26:54 +01:00
Till JS
6fa6509fa5 feat(observability): add metrics and monitoring for all 15 backends
- Add MetricsModule to 8 backends missing it (photos, zitare, mukke,
  planta, picture, storage, presi, nutriphi)
- Enable Prometheus scraping for all 15 backends in prometheus.yml
  (was only 6, with 3 commented out and 6 missing entirely)
- Update ServiceDown alert rule to cover all 15 backends
- Update Grafana dashboards (backends, master-overview, system-overview)
  with all backend services in health panels
- Fix imprecise regex in application-details dashboard

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 09:09:04 +01:00
Till JS
073c216652 fix(docker): add shared-error-tracking package to all 15 web Dockerfiles
The browser error tracking hooks.client.ts added earlier requires the
shared-error-tracking package to be copied and built in the Docker image.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 09:08:33 +01:00
Till JS
31b84bbcf4 fix(todo): use Spiral icon for Spiral nav item instead of Sparkle
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 09:07:51 +01:00
Till JS
a4a7f6e825 fix(todo): rename 'Aufgaben' to 'Liste' in PillNav for clarity
Both list and kanban views show tasks, so 'Liste' better describes the view type.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 09:06:31 +01:00
Till JS
20b36697d4 fix(mukke): position MiniPlayer above PillNav to prevent overlap
MiniPlayer was fixed at bottom-0 behind PillNav (z-1000). Now offset
by 80px + safe-area so it sits directly above the navigation bar.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 08:59:12 +01:00
Till JS
abc7f95601 fix(todo): fix FAB close button hidden behind PillNav and move settings/mana to account dropdown
- Raise FAB z-index from 50 to 1002 so close button is clickable above PillNav (z:1000)
- Remove Settings from standalone nav items (already in account dropdown)
- Move Mana button from standalone pill into account dropdown

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 08:57:15 +01:00
Till JS
b37d5f0338 docs(devlog): add devlog for 2026-03-22
Analytics, PWA, Mukke Visualizer, Browser Error Tracking, CSP Headers,
Storage Deployment, Calendar Fixes — 26 commits across the monorepo.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 08:53:20 +01:00
Till JS
bae5bb99ea fix(error-tracking): switch to ESM output for SvelteKit compatibility
Change tsconfig module from commonjs to ES2020 and moduleResolution to
bundler so browser.js exports ESM that Vite/Rollup can tree-shake.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 08:44:47 +01:00
Till JS
c4385835ba chore: update pnpm-lock.yaml
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 19:16:47 +01:00
Till JS
04487ba909 docs(observability): add observability gaps analysis document
Document missing monitoring capabilities (distributed tracing, log aggregation,
APM, frontend error monitoring) and potential solutions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 19:16:42 +01:00
Till JS
42b32cb07d feat(mukke): add pluggable visualizer system with Butterchurn and Particle modes
Replace static FrequencyBars with VisualizerRenderer supporting multiple
visualizer backends via registry. Add Butterchurn (Milkdrop) and Particle
(pixi.js) visualizers with runtime switching.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 19:16:34 +01:00
Till JS
7cad4073d4 feat(error-tracking): add browser error tracking to all 19 SvelteKit web apps
Add @sentry/browser integration via shared-error-tracking/browser export
and hooks.client.ts in every web app for client-side error reporting to GlitchTip.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 19:16:21 +01:00
Till JS
a4e41ee1ed fix(storage): add shared-pwa package to web Dockerfile
Build fails because @manacore/shared-pwa is imported in vite.config.ts
but not copied into the Docker build context.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 19:14:07 +01:00
Till JS
287bbed86e feat(analytics): add automatic CTA tracking to all 10 landing pages
Create Analytics.astro component in @manacore/shared-landing-ui that
automatically tracks CTA clicks and pricing section views via Umami.

The component uses event delegation and auto-detection of section
context (hero/pricing/footer) from section IDs or DOM position,
requiring zero changes to existing landing page content.

Tracked events: cta_click (with location), pricing_viewed,
pricing_plan_selected (with plan name)

Added to all 10 landing page Layout.astro files.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 19:13:24 +01:00
Till JS
420926aef1 fix(infra): add no-cache headers for PWA files in Caddyfile
Ensure sw.js, manifest.webmanifest, and registerSW.js are never cached
by the browser or CDN so service worker updates are picked up immediately
after deploys. Uses a reusable Caddy snippet imported by all web app blocks.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 19:10:49 +01:00
Till JS
45c11a1730 feat(analytics): add event tracking to picture, storage, clock, mukke, planta
Track key user actions in remaining web apps:

- Picture: image_generated (with model ID), generation_failed
- Storage: file_uploaded (with size in KB), folder_created
- Clock: timer_started (with timer type)
- Mukke: song_uploaded
- Planta: plant_created

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 19:07:06 +01:00
Till JS
cc9679dc9f refactor(analytics): centralize landing page Umami tracking via env vars
Replace hardcoded Umami website IDs in all 10 Astro landing pages with
import.meta.env.PUBLIC_UMAMI_WEBSITE_ID, following the same pattern
as the web apps.

- Add UMAMI_WEBSITE_ID_*_LANDING vars for all 10 landings in .env.development
- Add landing page configs to generate-env.mjs
- Replace hardcoded IDs with env var in 7 existing Layout.astro files
- Add Umami tracking to 3 missing landings (NutriPhi, Presi, Mukke)
- Fix Todo Landing invalid ID ("todo-landing" -> proper UUID)
- Update ANALYTICS.md with new landing page IDs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 19:03:02 +01:00
Till JS
f5ee3aae20 feat(security): add unified CSP headers to all 17 web apps
Create @manacore/shared-utils/security-headers with setSecurityHeaders()
utility that sets standard security headers (CSP, X-Frame-Options,
X-Content-Type-Options, Referrer-Policy, Permissions-Policy).

CSP includes stats.mana.how (Umami) and glitchtip.mana.how by default.
Each app passes its own connectSrc origins (auth URL, backend URL, etc.).

Previously only Calendar and Storage had CSP headers - now all 17 web
apps have consistent security headers via the shared utility.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:53:40 +01:00
Till JS
79544160b7 feat(analytics): add key action tracking to todo, calendar, chat, contacts
Add Umami event tracking for the most important user actions:

- Todo: task_created (with deadline flag), task_completed, task_deleted
- Calendar: event_created (with recurring flag), view_changed
- Chat: message_sent (with model ID)
- Contacts: contact_created

Uses pre-built event helpers from @manacore/shared-utils/analytics.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:48:18 +01:00
Till JS
6c140c181e docs(mukke): add visualizer alternatives and technology comparison
Independent overview of all implementation approaches for music
visualization: rendering technologies (Canvas 2D, PixiJS, Three.js,
WebGL/GLSL, Babylon.js, p5.js), ready-made solutions (Butterchurn,
audiomotion-analyzer), user-generated content strategies (code editor,
shader editor, node-based, DSL, AI-generated), audio analysis options
(Meyda, essentia.js, AudioWorklet), performance strategies, and 5
architecture strategies with decision matrix.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:46:58 +01:00
Till JS
f043db2b05 feat(analytics): add automatic auth event tracking via shared-auth
Add inline Umami tracking to @manacore/shared-auth authService for
login, signup, logout, SSO, and social auth events. Tracks both
success and failure with auth method metadata.

This automatically covers all web apps without any per-app code
changes. No-ops silently in environments without Umami (mobile, SSR).

Tracked events: login, login_failed, signup, signup_failed, logout,
password_reset_requested (with method: email/google/apple/sso)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:44:03 +01:00
Till JS
2c26fce736 fix: replace all manacore.app URLs with mana.how
The production domain is mana.how, not manacore.app. Updated all
references across shared-branding APP_URLS, app configs, landing pages,
docs, help content, calendar iCal UIDs, and deploy scripts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:40:37 +01:00
Till JS
2d7ca7e387 docs(mukke): add comprehensive visualizer system concept
Describes the architecture for an extensible music visualizer framework:
- Audio data layer with frequency, beat detection, and energy bands
- Registry system with discriminated union pattern for visualizer types
- 10+ planned built-in visualizations (spectrum, particles, 3D, etc.)
- Custom visualizer system with sandboxed code execution
- AI-powered code generation via mana-llm
- Fullscreen visualizer mode and community sharing
- Phased implementation roadmap

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:34:42 +01:00
Till JS
0786e6bf49 feat(mukke): add real-time frequency bars visualizer
Add Web Audio API AnalyserNode integration and a Canvas 2D-based
frequency bars component. The visualizer connects to the player's
Audio element and renders frequency data in real-time using
requestAnimationFrame. Integrated into FullPlayer (mirrored, 48 bars)
and MiniPlayer (subtle 64-bar overlay behind progress bar).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:30:33 +01:00
Till JS
e01b740dba refactor(analytics): centralize Umami tracking via env vars and shared utility
Move Umami analytics from hardcoded script tags in app.html to
server-side injection via hooks.server.ts. Website IDs are now
managed centrally in .env.development and distributed via
generate-env.mjs as PUBLIC_UMAMI_WEBSITE_ID.

- Add @manacore/shared-utils/analytics-server with injectUmamiAnalytics()
- Add UMAMI_WEBSITE_ID_* for all 17 web apps to .env.development
- Add PUBLIC_UMAMI_WEBSITE_ID mapping in generate-env.mjs for all web apps
- Update 10 existing hooks.server.ts to use shared utility
- Create 7 new hooks.server.ts (picture, planta, presi, photos, clock,
  questions, manadeck)
- Remove hardcoded Umami scripts from all 17 app.html files
- Add missing Umami tracking to Mukke and Questions
- Add shared-utils dependency to 6 web apps that lacked it
- Update ANALYTICS.md with architecture docs and "add new app" guide

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:27:31 +01:00
Till JS
87516bb58a fix(storage): add Umami analytics injection to hooks.server.ts
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:25:10 +01:00
Till JS
db2a0e6afc fix(storage): copy patches directory in Dockerfile for pnpm install
pnpm install --frozen-lockfile fails without the patches directory
since pnpm-lock.yaml references patched packages.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:24:59 +01:00
Till JS
50d084b25f fix(todo): add missing patches directory to web Dockerfile
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:24:10 +01:00
Till JS
9bdb997394 refactor(pwa): replace custom service workers with Vite PWA plugin and centralize offline page
Remove hand-written sw.js, offline.html, and manifest.json from todo/skilltree/zitare web apps
in favor of the Workbox-based service worker generated by @vite-pwa/sveltekit. This fixes an
issue where the custom SW could get stuck serving the offline fallback page even when the server
was reachable. Also extracts the duplicated offline page (~80 lines each across 19 apps) into a
shared OfflinePage component in @manacore/shared-ui with 3 props (appName, offlineMessage,
accentColor), reducing each app's offline route to an 8-line wrapper.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:16:43 +01:00
Till JS
93a7c90f4f feat(storage): add storage to CD pipeline and fix Docker config
- Add build context to storage-web in docker-compose (was pulling from
  GHCR, now builds locally like other services)
- Add storage-backend and storage-web to CD change detection and deploy
- Fix mukke health check URLs (were using wrong ports 3035/5015)
- Remove hardcoded port from Dockerfile (use PORT env var from compose)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:02:40 +01:00
Till JS
97b610020c fix(storage): use runtime env vars instead of hardcoded localhost URLs
The storage web app had hardcoded localhost:3001 (auth) and localhost:3016
(backend) URLs, causing production to try connecting to localhost. Added
hooks.server.ts for runtime URL injection and CSP headers, matching the
pattern used by calendar/chat apps.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 17:59:36 +01:00
Till JS
6b2b7035cf fix(calendar): scroll to current time and show time label on indicator
- Changed scroll behavior to position current time ~1/3 from viewport
  top instead of centering, so the red time indicator line is always
  visible on load
- Added current time label (e.g. "14:30") above the red indicator line
  on the right side

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 17:52:32 +01:00
Till JS
79becc971b fix(calendar): add auth gate to prevent 401 errors and fix CSP for analytics
Child components' onMount callbacks fire before the parent layout's auth
check in Svelte, causing API calls (todo, contacts, calendar) to fire
without a valid token on initial page load. Added appReady gate so
children only render after auth is confirmed.

Also added stats.mana.how to CSP script-src to allow Umami analytics.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 17:49:07 +01:00
Till JS
28d8cfcbe7 fix(manacore): copy patches directory in Dockerfile for pnpm install
The pnpm-lock.yaml references patches/react-native-reanimated which
was not being copied into the Docker build context, causing build failures.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 17:43:17 +01:00
Till JS
fa116dfee0 feat(manacore): add App Hub as new default home page
Replace dashboard as the default landing page with a new App Hub that
shows all Mana ecosystem apps grouped by category (AI & Creative,
Productivity, Tools & Utilities) with status badges, icons, and
direct links. Uses shared-branding MANA_APPS as data source.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 17:40:45 +01:00