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).
Reader-Surface ist nach Pageta (pageta.mana.how + pageta-api.mana.how)
umgezogen, das seit 2026-05-16 live ist und mehr Features bietet als
das alte managarten-news-Modul:
- Highlights (4 Farben, plain-text-offsets, Kontext)
- Reading-Progress + User-Note pro Artikel
- Bulk-Import (200 URLs/Job mit Worker)
- 5 MCP-Tools (save/list/archive/tag/highlight)
- Reading-Status-Enum (unread/reading/finished/archived) statt Boolean
Was Pageta NICHT hat: Categories mit Color+Icon — Pageta verwendet
freie String-Tags statt visuelle Folders. Bewusste Design-Entscheidung
in Pageta.
Daten-Migration: KEIN automatisches Skript. User mit gespeicherten
Artikeln im managarten-newsArticles müssen ihre Liste in Pageta neu
aufbauen (oder Bulk-Import via /api/v1/imports verwenden).
Gelöscht / abgebaut:
- Module: apps/mana/.../modules/news + Routen + Locales
- apps/articles/migrations/from-news.ts (one-off-Migration nach
articles-Modul, Sentinel-gated, abgeschlossen) + Call in
(app)/+layout.svelte
- apps/api/src/modules/news + MCP-Executor save_news_article
- shared-branding: APP_ICONS.news + MANA_APPS news-Entry
- shared-ai/tools/schemas save_news_article
- shared-types/spaces: 3 'news'-Einträge in Space-Modul-Listen
- Cross-Module: news-research/ListView + (app)/news-research/+page.svelte
hatten den preferencesStore + usePreferences vom news-Modul für
Custom-Feed-Pinning — Pin-UI entfernt (Custom-Feeds sind jetzt
Pageta-Verantwortung)
- Dashboard: 'news-unread' Widget + NewsUnreadWidget-Import
- Registries: app-registry/apps.ts (News registerApp + Newspaper icon +
Header), categories, help-content, module-registry, data/tools/init
- i18n: news in apps/{de,en,es,fr,it}.json
Was BLEIBT:
- `news-research` Modul + `apps/api/src/modules/news-research/` —
RSS-Discovery + Search-Funktion bleibt im managarten als
Recherche-Tool für andere Module
- `mana-news-pool` Plattform-Service (Code/mana/services/) — wird von
news-research + Pageta-Standalone konsumiert
- shared-ai `research_news` Tool
Dexie v65 Migration:
- droppt newsArticles, newsCategories, newsPreferences, newsReactions,
newsCachedFeed
mana-web svelte-check 0/0, snapshot test 10/10.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Mein vorheriges live-Edit am 2026-05-18 12:01 hat den moodlit-Block
direkt auf dem mana-server eingefügt, aber nicht im Git committet.
Beim Comicello-Deploy um 14:14 wurde die Server-Datei dann aus
einem älteren Git-State regeneriert → moodlit-Block weg, alter
`moodlit.mana.how → :5000`-Unified-App-Stub wieder aktiv → live
zeigte fälschlich die Unified-App.
Jetzt im Repo verankert (nach Comicello-Block, vor catch-all):
- moodlit.mana.how → :3106 (web)
- moodlit-api.mana.how → :3105 (api)
Plus: alter Stub `moodlit.mana.how → :5000` im unified-Block entfernt
(war fälschlich noch in Z. 129 — ingress-Reihenfolge zählt, hätte
den neuen Block weiter unten überrannt).
Live verifiziert: HTML zeigt `data-theme=\"twilight\"`, gelieferter
0.*.css enthält @keyframes sunrise / sunset / sparkle (eigene
Brightness-Animationen statt gradient-shift-Fallback) und
requestFullscreen ist im ausgelieferten Chunk.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- cloudflared-config: zwei zusätzliche Ingress-Regeln pageta.com →
:3100 + api.pageta.com → :3099 (zusätzlich zu pageta.mana.how —
kein Primary-Switch).
- docker-compose.macmini mana-auth CORS_ORIGINS: lesen.mana.how-
Reste durch pageta.mana.how + pageta-api.mana.how + pageta.com +
api.pageta.com ersetzt. Der Rebrand vom Mittag hatte diese env
übersehen — Memory project_pageta_live.md warnt explizit davor.
DNS-CNAMEs (pageta.com + api.pageta.com) sind via Cloudflare-API
angelegt (Zone ba85dec9..., proxied=true auf den mana-server-Tunnel).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3 Container fielen heimlich aus dem täglichen pg_dump-Backup raus:
1. moodlit-postgres, herbatrium-postgres — neu seit 2026-05-18 bzw.
2026-05-17, fehlten im db_user_for_container-case (defaultete auf
'postgres', der in diesen Containern nicht existiert).
2. wordeck-postgres — Cards-Rebrand 2026-05-17 hat den Container
umbenannt, der case zeigte aber noch auf 'cards-postgres' → kein
Match → default 'postgres' → role nicht da.
Zusätzlich: psql -U <user> versuchte ohne -d zur DB '<user>' zu
connecten (Default-Verhalten), das gibt's bei den Greenfield-Apps
nicht (DBs heißen mana_moodlit / mana_herbatrium / wordeck). Mit
expliziter `-d template1` (existiert in jeder Postgres-Instanz)
funktioniert die Liste-Datenbanken-Query universell.
Verifiziert per manuellem Run am 2026-05-18:
OK: moodlit-postgres/mana_moodlit (1.0K)
OK: wordeck-postgres/wordeck (575K)
OK: herbatrium-postgres/mana_herbatrium (2.8K)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>