ensure-containers-running.sh heilte bisher nur ^mana-Container und nur
über die eine managarten-Compose — nach der Core-Isolation (mana-core in
mana-platform) und für eigenständige App-Stacks (nutriphi/viadocu/zitare)
griff das nicht. Beim VM-Crash 2026-05-26 kam dadurch weder das komplett
fehlende mana-auth (Core) noch viadocu/nutriphi (nicht-mana-*) zurück.
- Recovery jetzt LABEL-getrieben: jeder Container via seinem eigenen
com.docker.compose.project/-config_files/-service → projektübergreifend.
- Restart-Policy-Gate: nur always/unless-stopped werden auto-gestartet;
bewusst gestoppte (restart=no, z.B. watchtower) nie. Fixt nebenbei den
minio-init-False-Positive (One-Shot, keine Dauerläufer-Policy).
- mana-core-Reconciliation: gleicht Core-Compose-Services gegen vorhandene
Container ab und (re-)erstellt komplett fehlende gezielt (--no-deps).
Respektiert das Wartungs-Lock /tmp/mana-colima-maintenance.
- DRY_RUN=1 zum gefahrlosen Testen. colima-Guard/Notifications/Loop-Guard
unverändert. bash -n grün, DRY_RUN + Live-Lauf auf dem Server verifiziert.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Covers the secret-mount mechanism added so sveltekit-base + web-app builds
authenticate to npm.mana.how for private @mana/* packages. Makes the
docker-compose.macmini.yml comment reference accurate.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
These landing/legal/shared-utils edits are part of the umami decommission
(Umami → no-op / 'kein Web-Analytics', dated 2026-05-26) but were left
uncommitted in the working tree after the concurrent git-reset incident.
Pure rewording — no behaviour change, tracking was already dead.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The sveltekit-base build (and the mana-web / manavoxel-web app builds on
top of it) run `pnpm install` with no .npmrc in the build context, so
private @mana/* packages resolved against registry.npmjs.org and 404'd
(e.g. @mana/shared-icons@1.0.0, which only lives on npm.mana.how). It had
been coasting on a warm pnpm cache; once sveltekit-base:local was gone the
rebuild hard-failed.
Mount the host ~/.npmrc (registry map + resolved _authToken) as a BuildKit
secret at /root/.npmrc in all three pnpm-install steps. Token never lands
in an image layer. build-app.sh passes it via --secret for the base build;
docker compose build reads it from the top-level secrets: entry.
Unblocks every managarten web rebuild (incl. the pending umami-removal).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The quotes module was removed in the 2026-05-19 decommission but its
COPY + build steps lingered in apps/mana/apps/web/Dockerfile, breaking
every mana-web rebuild since ("/apps/quotes/packages/content": not
found at the COPY stage). The web app no longer imports the package.
This unblocks the umami-removal deploy.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Auf expliziten Wunsch — 6 historische Audit-/Decision-/Plan-Records. Token
Umami→Web-Analytics; präzise Historie bleibt in git-log + devlog erhalten.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
backup-databases.sh spiegelt nach erfolgreichem lokalem Dump die
heutigen Dumps verschlüsselt (AES-256 via openssl) per scp auf die
GPU-Box (LAN). Schließt die "alles auf einer Disk"-Lücke.
- Non-blocking: Push-Fehler/Box-aus kippt NIE das lokale Backup,
meldet nur via send_notification (ssh-Reachability-Probe vorweg).
- Verschlüsselt mit Passfile /Users/mana/.config/mana-backup-offsite.pass
(chmod 600); fehlt es, wird unverschlüsselt gespiegelt + laut gewarnt.
- Zielpfad als Variable (OFFSITE_DIR) — beim Anschluss der externen SSD
an die GPU nur diese eine Zeile umbiegen.
- Bewusst ZWEITKOPIE, kein echtes Off-Site (gleicher Standort) — Cloud
bleibt Phase 2.
Deployed (Backup .bak-pre-offsite-20260525), bash -n grün, Skip-Pfad +
scp-Transport verifiziert. Aktiviert sich automatisch, sobald mana@macmini
auf der GPU-Box autorisiert ist (administrators_authorized_keys, Elevation
nötig — manueller Einzelschritt).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Schließt das letzte SPOF-Loch: stirbt die colima-VM im laufenden Betrieb
(Crash/OOM), brachte bisher nichts sie zurück — startup.sh läuft nur beim
Boot, ensure-containers nahm an, docker sei oben (exit 1 bei totem docker).
Neu: vor dem docker-info-Check prüft das Script `colima status` und
startet die VM bei Bedarf. Sicherungen:
- Wartungs-Lock `/tmp/mana-colima-maintenance` (touch = Guard pausiert) —
damit bewusste colima-Stopps (egress-/ssh-mux-Debug) nicht
überschrieben werden.
- Backoff: nach 3 Fehlstarts in Folge KEIN Auto-Start mehr +
urgent-Notification (z.B. stale in_use_by-Symlink → manueller Eingriff).
- send_notification bei Auto-Restart + bei Backoff-Stopp.
- set-e-sicher (if/else statt nacktem &&).
Deployed auf mana-server (Backup .bak-pre-colima-guard-20260525),
bash -n grün, einmal real ausgeführt (colima running → Guard no-op).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
credits.mana.how routete im cloudflared-Ingress auf localhost:3002 —
dort lauscht aber nichts (refused), der mana-credits-Container läuft
auf 3061. Live funktioniert credits.mana.how aktuell über einen
anderen Tunnel (3 cloudflared-Prozesse), die :3002-Zeile war eine
Reload-Zeitbombe: der nächste Reload dieser Config hätte
credits.mana.how auf refused:3002 geschickt.
Auch gpu-box.yml MANA_CREDITS_URL 192.168.178.131:3002→3061.
Server-Dateien wurden parallel gepatcht (Backups .bak-credits-20260525),
aber bewusst KEIN cloudflared-Reload — live bleibt unverändert (200),
der Fix greift beim nächsten regulären Reload/Deploy.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Browser direkt zu MinIO sprechen lassen ist Voraussetzung für
Memoro-Multipart-Upload (Cloudflare-Cap-Umgehung, siehe
memoro/docs/MULTIPART_UPLOAD.md). Gleichzeitig Drift mit
Server-Stand gesynct (food/plants ergänzt).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Drift war 2030+/506- Zeilen — package.json war clean (z.B. yaml
^2.8.3 schon committet), aber Lockfile hatte noch alte Specifier
(yaml ^2.9.0 etc.) plus eine andere transitive jiti-Resolution
(2.6.1 → 1.21.7, beide valid). Routine-pnpm-install-Output, kein
funktionaler Effekt.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Diese drei Container failten still bei der DB-Enumeration (Default-User
`postgres` existiert dort nicht → `:list`-Fail), wurden also nie
gebackupt. Echte Superuser verifiziert: kreisel→kreisel (mana_kreisel),
mukke→mukke (mana_mukke), viadocu→viadocu (viadocu).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Lokale Datei war seit 2026-05-21 ~50 Zeilen hinter dem Server-Stand
(`/Users/mana/projects/managarten/cloudflared-config.yml`). Editiert
wurde durchgehend server-side via SSH; mehrere live-Routes nie
zurück nach Git geflossen.
Nachgezogen (Stand: scp vom Mac Mini):
- **s3.mana.how → localhost:9000** (memoro presigned-URL signing,
siehe memoro-Audio-Pipeline-Fix vom 22.05.).
- **mukke-api.mana.how → :3113** + **stems/music-gen/pitch/mix.mana.how**
→ Vocal-Studio-Plattform-Services (Mai 21).
- **chor.mana.how → :3091** (Chorplattform-Schnellfix-Hostname).
- **app.<wordeck|pageta|herbatrium>.com**-Routen für die jeweiligen
Web-Apps (Apex-Domain → Landing, app-Subdomain → SPA).
- Diverse Service-Port-Updates (`5181 → 3202` für wordeck.com etc).
Bis das Drift-Pattern besser unterbunden wird (z.B. ein git-hook auf
mana-server der diff zum letzten Push prüft), bleibt es weiter ein
TODO immer den Server-Stand als Source-of-Truth zu betrachten und
nach Edits in Git nachzuziehen.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Beide standen seit dem letzten shared-ui-Sync (ce923bbdc) als
svelte-check --fail-on-warnings Treffer im Pre-Push-Hook drin.
Aufgeräumt für die Cutover-PRs.
TagChip: outer war `<button>` mit innerem Remove-`<button>` —
verschachtelte interaktive Elemente sind invalid HTML und brechen
SSR-Hydration. Outer ist jetzt `<span role="button" tabindex="0">`
mit Enter/Space-Keyboard-Handler. CSS-Selektor `button.chip` →
`.chip-interactive` Klasse.
Pill: `<svelte:element this={tag}>` mit onclick/oncontextmenu
braucht explizite ARIA-Rolle (button bzw. link), weil der
statische Analyser den dynamischen Tag nicht aufdröselt.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Phase 1 des managarten me-images → mana-me Cutovers
(siehe mana/docs/USER_CONTEXT_STRATEGY.md). Spiegelt Primary-Slot-
Wechsel (face-ref, body-ref) in die Plattform-Service mana-me, damit
cross-app-Konsumenten (Werdrobe, Memoro) den aktuellen Face/Body
des Users ohne managarten-DB-Abhängigkeit bekommen.
- apps/api/src/lib/mana-me.ts: Service-to-Service-Client (X-Service-Key)
mit slot→kind-Mapping (face-ref→face, body-ref→fullbody).
- apps/api/.../profile/routes.ts: POST /me-images/sync-primary (JWT)
ruft den Client; best-effort, blockt setPrimary nicht.
- web stores/me-images.svelte.ts: setPrimary('face-ref'|'body-ref')
triggert die Brücke via api/me-images.ts.
cloudflared: me.mana.how → localhost:3078 in der Plattform-Sektion
(neben share/mcp).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Workspace-Kopie in packages/shared-ui synchronisiert mit
mana@1dc8a98 (Compat-Layer für alle v0.1.x-Patterns). 219 Files
geändert — alter Code (Charts, Quick-Input-Originale, Help, Onboarding,
Settings, Bottom-Stack, Search-Core, ColorPicker, Actions) entfällt;
neue v1.0.0-Komponenten kommen rein.
tsconfig.json self-contained (kein extends auf nicht-existierenden
managarten/tsconfig.base.json).
pnpm check ergibt jetzt 0 Errors über alle 10086 Files
(Stand vorher: 204 Errors mit dem unverarbeiteten Sync). Zwei
non-blocking Warnings stehen offen (SSR-nested-button bei TagChip,
ARIA-Role bei Pill mit click-handler).
AppSlider toter Code in apps/mana/apps/web/src/lib/components/
AppSlider.svelte entfernt — der Wrapper hatte keine Aufrufer mehr.
mana-internal Configs (Storybook, lost-pixel, vite.config, Dockerfile,
infrastructure, PORTING_PLAN.md) bewusst NICHT gesynced — die wandern
nur im mana-Repo. managarten-shared-ui ist eingefrorene Kopie, kein
publish-target.
scripts/validate-disziplin.mjs: ungenutzte lines-Variable entfernt
(ESLint no-unused-vars).
- herbatrium.mana.how + herbatrium-api.mana.how raus aus cloudflared
und mana-auth CORS_ORIGINS — nur noch herbatrium.com /
api.herbatrium.com.
- Seepuls vom .mana.how- auf .com-Setup gewechselt: cloudflared
exposed jetzt seepuls.com (apex + www) und api.seepuls.com (statt
seepuls.mana.how + seepuls-api.mana.how).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Beim 2026-05-20-Cutover war Schritt "Ingress in cloudflared-config.yml" zwar
im Memory abgehakt, aber nie wirklich gemacht — beide Hosts liefen in den
service: http_status:404 Catchall. App-Symptom: Native zeigte "API-Fehler
404:" in Töpfe-/Aufnehmen-Tab, Container kreisel-api selbst war healthy.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
cloudflared-config: 2 hostnames hinzu (apex → 3104, api → 3103).
docker-compose mana-auth: CORS_ORIGINS erweitert um die zwei neuen
Origins. herbatrium.mana.how bleibt funktional (kein Primary-Switch).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Folge-Commit zu a0a463a4f. Der FIXME-Block in +page.ts war noch der
alte „prerender = false weil 500-Crash" — jetzt ersetzt durch die
Erklärung warum @-Notation + prerender = true die saubere Lösung sind.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Seit 2026-04-07 stand `prerender = false` mit FIXME im Repo, weil der
SvelteKit-Build-SSR der Offline-Page in „Error: 500 /offline" lief —
ohne Stack. Daraus folgten zwei latente Probleme:
- /offline lag NICHT in `prerendered/`, die @mana/shared-pwa-Workbox
matched aber nur `**/*.html`. Pageta hat 2026-05-20 denselben
Effekt unter `non-precached-url: /offline` aufgedeckt.
- SSR-at-request-time war kaschiert, weil mana.how heute kaum
Worker-Caching greift.
Root-Cause: `apps/mana/apps/web/src/routes/+layout.svelte` lädt
Dexie / encryption-vault / data-layer-listeners / auth-store auf
Modul-Ebene — Browser-only Code (window/document/IndexedDB) explodiert
im SSR-Worker.
Fix: `/offline` aus der Layout-Chain rauswerfen. Datei umbenannt von
`+page.svelte` zu `+page@.svelte` (SvelteKit-Konvention: @-Suffix
bricht alle Eltern-Layouts). OfflinePage-Komponente aus @mana/shared-ui
kommt ohne Stores aus, also unproblematisch.
Verifiziert:
- pnpm run build → keine Crashes mehr
- `.svelte-kit/output/prerendered/pages/offline.html` (9.2 KB) generiert
- `sw.js` Precache enthält `/offline` + `offline/__data.json`
- Workbox `createHandlerBoundToURL("/offline")` hat jetzt ein Target
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Primary-Domain-Cutover 2026-05-20 — Apex zeigte vorher als
Namecheap-Parking-A-Record, Tunnel hatte keine Routes für die
.com-Domain. CF-DNS auf Verein-Tunnel umgehängt, Routes hier
ergänzt. .mana.how-Co-Domain bleibt.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Drei Hostnames waren NIE im aktiven cloudflared-config eingetragen,
obwohl die DNS-CNAMEs angelegt waren:
- sync2.mana.how → mana-sync-v2 (Event-Sourcing-Platform, alle 9
Verein-Apps; ohne diesen Route konnten Browser-Clients keine
Events emittieren)
- herbatrium.mana.how / -api.mana.how (Live-Status in Memory war
falsch, Smokes nur gegen localhost grün)
Manueller Insert via sed am 2026-05-19 ist beim nächsten managarten-
git-pull verloren gegangen, jetzt sauber im Repo persistiert.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
`https://wordeck.com` + `https://api.wordeck.com` in mana-auth
CORS_ORIGINS. Ohne diese werden Cross-Origin-Refresh-Calls vom
wordeck-Callback hart geblockt — pendant zum PRODUCTION_TRUSTED_ORIGINS-
Update in mana@e9e78c0.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Nach places-Lift hat scan.ts SOURCES=[]. Der alte Header behauptete
"M3 ships only places source" — das war historisch korrekt, ist aber
seit dem places-Decommission irreführend. Jetzt klar dokumentiert:
Inbox bleibt leer bis habits/contacts-Source kommt; manuelles
create_last via UI/Tool funktioniert weiter.
Plan-Doc: mana/docs/playbooks/MANAGARTEN_LIFTS_FOLLOWUPS.md @ 9e7046f.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Drei Root-Causes für die 8 pre-existing svelte-check errors auf main
(blockierten den pre-push-Hook seit längerem):
1. `dexie` fehlte als devDep in packages/shared-stores — 4 Files
importieren `type { Table } from 'dexie'`. Type-only-Import, daher
devDep reicht.
2. `vite-plugin-pwa` fehlte als devDep in apps/mana/apps/web. Wird
nur transitiv via `@vite-pwa/sveltekit` gezogen, aber die
`/// <reference types="vite-plugin-pwa/info" />`-Direktiven in
src/app.d.ts brauchen das Package direkt im Tree.
3. packages/shared-auth/tsconfig.json baut `src/**/*` inklusive
`*.spec.ts` — Spec-Files sollen aber nicht in den prepare-Build.
exclude erweitert um `*.spec.ts` + `*.test.ts`.
Verifikation: `pnpm check` von apps/mana/apps/web läuft jetzt mit
0 ERRORS / 0 WARNINGS / 0 FILES_WITH_PROBLEMS (vorher 8 Errors).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- docker-compose.macmini.yml: cards-server- + cards-web-Compose-Services
entfernt (dockerfile-Pfade existieren seit den decommission-Commits
bc158cb0b + 9cd871749 nicht mehr im Tree). Container liefen schon nicht
mehr — siehe Memory project_cards_auth_bypass_live.md: alte mana-app-
cards-{server,web}-Container im LIVE-Cutover gestoppt + entfernt.
- docker-compose.macmini.yml: CORS_ORIGINS um mukke.mana.how,
mukke-api.mana.how, manaclick.mana.how erweitert (mukke LIVE
2026-05-19, manaclick LIVE 2026-05-19).
- package.json: 5 tote cards-Scripts entfernt (dev:cards-server,
dev:cards:web, dev:cards:landing, dev:cards:app, dev:cardecky:full,
dev:cards:local, cards:dev, deploy:landing:cards, cards-landing
aus cf:projects:create + deploy:landing:all).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Nach dem uLoad-Cutover 2026-05-18 (Code/uload/ als Standalone) war
@mana/shared-uload structurell broken: ShareModal-Calls aus presi+
music landeten in mana_sync.sync_changes, aber der alte Konsument
(mana-app-uload-server) ist abgeschaltet → 404 auf ulo.ad/r/<code>.
Fix: shared-uload schreibt jetzt direkt via HTTP gegen die föderierte
uload-API.
- create-link.ts: createShortLink() → POST {apiUrl}/api/v1/links
mit Authorization: Bearer <token>. Init-Signatur ist neu
initSharedUload({ apiUrl, getAuthToken, shortUrlOrigin? }).
- types.ts: UloadLink (Dexie-internal-Type) entfernt — Caller arbeiten
nur noch mit CreateShortLinkOptions + CreatedLink (Wire-Shapes).
- package.json: @mana/local-store-Dep entfernt. Version 0.2.0.
- index.ts: getBaseUrl-Export ergänzt, UloadLink raus.
Caller-Site (apps/mana/apps/web/src/routes/(app)/+layout.svelte):
initSharedUload({
apiUrl: PUBLIC_ULOAD_API_URL ?? 'https://uload-api.mana.how',
getAuthToken: () => authStore.getValidToken(),
shortUrlOrigin: PUBLIC_ULOAD_SHORT_ORIGIN ?? 'https://ulo.ad',
});
Bonus-Cleanup:
- plaintext-allowlist.ts: uloadFolders + uloadTags raus (Tables sind
via Dexie v67 gedroppt, Allowlist-Entries waren orphaned).
mana-Web-App: pnpm check grün (0/0 auf 7396 Files).
Wurde während des υ-6-Cutovers nur live auf mana-server gepatcht, nicht
committed — letzter git pull hat die Edits überschrieben (live-Stack
lief weiter weil cloudflared in-Memory + mana-auth post-restart-State
noch korrekt war, aber bei nächstem Restart wäre alles weg).
- cloudflared-config.yml: uload.mana.how 5000→3108, uload-api.mana.how
3070→3107, ulo.ad NEU auf 3107.
- docker-compose.macmini.yml: 3 uload-Origins (uload.mana.how,
uload-api.mana.how, ulo.ad) in mana-auth CORS_ORIGINS.
- scripts/mac-mini/backup-databases.sh: uload-postgres → 'uload' +
comicello-postgres → 'comicello' im db_user_for_container()-Case.
Memory + Playbook tracken Cutover-Details (project_uload_live.md).