managarten/apps/api/src/modules
Till JS d518169ce9 feat(website): M7 — observability + analytics + GC + M2-polish
Closes the plan. Prometheus metrics across the website endpoints, a
cookieless analytics block users can opt in to, a read-only orphan-
asset scan script, plus two M2 debts (rollback UI + determinism test).

apps/api:
- New /metrics endpoint (unauth; internal-network only via reverse proxy).
  Scrape with the existing Prometheus config that already covers mana-ai.
- lib/metrics.ts with prom-client Registry and default-metrics prefix
  `mana_api_`. Website-specific counters/histograms:
    website_publish_total{result=success|slug_taken|invalid|error}
    website_publish_duration_seconds (Histogram)
    website_submissions_total{result=received|spam|rate_limit|not_found|invalid}
    website_host_resolve_total{result=hit|miss|error}
    website_domain_verify_total{result=verified|failed}
    website_public_reads_total{result=hit|not_found}
    website_public_read_age_seconds (Histogram — age of served snapshot)
- Instrument publish.ts, submit.ts, public-routes.ts, domains.ts with
  .inc() calls on every code path.

packages/website-blocks:
- New `analytics` block: Plausible + Umami support with self-hosted
  script-URL override. Hidden in edit/preview, emits exactly one
  <script> in public mode. No cookies, no PII. Registered in block-
  registry; 11 blocks total now.

apps/api/scripts/gc-website-assets.ts:
- Read-only scan: walks published_snapshots.blob + submissions.payload
  for /api/v1/media/{id}/ references, asks mana-media for items scoped
  to app=website, flags orphans older than 30d. Writes report to
  /tmp/gc-website-assets-<ts>.json. Deletion toggle is a future commit.

apps/mana/apps/web:
- RollbackDialog component + PublishBar integration. Closes the M2
  debt "Rollback funktioniert" (API + store were there; UI was missing).
- publish.test.ts: snapshot determinism + orphan-drop tests. 4/4 pass.

docs:
- observability/website.md: metric reference, PromQL queries, alert
  suggestions, Grafana dashboard pointer.
- plans/website-builder.md: M7 checklist updated (Per-site-stats +
  submission-retention explicitly deferred with reason), shipping log
  table completed with all M1→M7 commits.

Validation:
- apps/mana/apps/web: pnpm check → 0 errors 0 warnings
- apps/api: tsc --noEmit → clean
- website-blocks tsc → clean
- publish.test.ts → 4/4 pass

Note: validate:all's check:crypto fails on unrelated WIP (wardrobe
module's Dexie tables aren't classified yet in encryption-registry).
Pre-existing failure, not introduced by this commit — the pre-commit
lint-staged run does NOT include check:crypto so it doesn't block.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 18:30:49 +02:00
..
articles feat(articles): browser-HTML bookmarklet + consent-wall detection + auto-save 2026-04-22 15:29:53 +02:00
calendar feat(api): create unified API server with first 3 modules 2026-04-02 21:12:15 +02:00
chat refactor(shared-tailwind): rewrite themes.css to single-layer shadcn convention 2026-04-09 01:13:06 +02:00
contacts refactor(shared-tailwind): rewrite themes.css to single-layer shadcn convention 2026-04-09 01:13:06 +02:00
context feat(api): POST /api/v1/context/import-url — crawler + optional LLM summary 2026-04-15 14:24:19 +02:00
food refactor: rename nutriphi module to food (Essen) 2026-04-14 15:30:07 +02:00
guides refactor(shared-tailwind): rewrite themes.css to single-layer shadcn convention 2026-04-09 01:13:06 +02:00
moodlit feat(api): port remaining 12 modules to unified API server 2026-04-02 21:34:08 +02:00
music refactor(shared-tailwind): rewrite themes.css to single-layer shadcn convention 2026-04-09 01:13:06 +02:00
news refactor(shared-rss): extract RSS parsing + Readability into one package 2026-04-15 22:30:44 +02:00
news-research feat(news-research): RSS feed discovery, filter, and AI-context export 2026-04-15 22:31:07 +02:00
picture feat(wardrobe): module foundation — garments + outfits space-scoped data layer (M1) 2026-04-23 18:27:37 +02:00
plants refactor: rename nutriphi module to food (Essen) 2026-04-14 15:30:07 +02:00
presi refactor: rename planta → plants, clean up codebase 2026-04-12 18:59:44 +02:00
profile feat(profile,api): meImages foundation for AI reference generation (M1) 2026-04-23 13:50:53 +02:00
research refactor: rename planta → plants, clean up codebase 2026-04-12 18:59:44 +02:00
storage docs: update architecture comparison — 5/10 roadmap items done 2026-04-16 15:00:09 +02:00
todo refactor: rename planta → plants, clean up codebase 2026-04-12 18:59:44 +02:00
traces refactor: rename planta → plants, clean up codebase 2026-04-12 18:59:44 +02:00
wardrobe feat(wardrobe): module foundation — garments + outfits space-scoped data layer (M1) 2026-04-23 18:27:37 +02:00
website feat(website): M7 — observability + analytics + GC + M2-polish 2026-04-23 18:30:49 +02:00
wetter feat(wetter): add multi-model source comparison view 2026-04-17 13:57:05 +02:00
who feat(who): add character dossier system for staged fact disclosure 2026-04-10 17:40:16 +02:00