-
Bei Fehler auf "Lokal" zurückfallen
-
+
+
+
+
Bei Fehler auf „Lokal" zurückfallen
+
Wenn die gewählte KI-Schicht eine Anfrage nicht beantworten kann, versucht Mana es mit der
lokalen Variante (sofern verfügbar). Aus: zeigt stattdessen einen Fehler an.
-
+
-
+
setFallback(!settings.fallbackToRulesOnError)}
+ aria-label="Fallback auf Lokal"
+ >
+
+
+
-
- setShowSource((e.currentTarget as HTMLInputElement).checked)}
- class="mt-0.5 h-4 w-4 rounded border-border"
- />
-
-
Quelle bei jedem KI-Resultat anzeigen
-
- Zeigt unter jeder KI-generierten Antwort eine kleine Markierung wie "Auf deinem Gerät"
- oder "via Google Gemini" — damit du immer siehst, wo deine Daten gerade verarbeitet
+
+
+
Quelle bei jedem KI-Resultat anzeigen
+
+ Zeigt unter jeder KI-generierten Antwort eine kleine Markierung wie „Auf deinem Gerät"
+ oder „via Google Gemini" — damit du immer siehst, wo deine Daten gerade verarbeitet
wurden.
-
+
-
+
setShowSource(!settings.showSourceInUi)}
+ aria-label="Quelle anzeigen"
+ >
+
+
+
+
+
diff --git a/apps/mana/apps/web/src/lib/components/settings/searchIndex.ts b/apps/mana/apps/web/src/lib/components/settings/searchIndex.ts
index bca629046..66403c913 100644
--- a/apps/mana/apps/web/src/lib/components/settings/searchIndex.ts
+++ b/apps/mana/apps/web/src/lib/components/settings/searchIndex.ts
@@ -4,9 +4,9 @@
* updates both the navigation and the search results.
*/
import type { Component } from 'svelte';
-import { Gear, Robot, ShieldCheck, CurrencyCircleDollar, Cloud } from '@mana/shared-icons';
+import { Gear, Robot, ShieldCheck, Cloud } from '@mana/shared-icons';
-export type CategoryId = 'general' | 'ai' | 'security' | 'credits' | 'data';
+export type CategoryId = 'general' | 'ai' | 'security' | 'data';
export interface Category {
id: CategoryId;
@@ -39,13 +39,6 @@ export const categories: Category[] = [
icon: ShieldCheck,
anchors: ['passkeys', 'sessions', 'two-factor', 'vault', 'security-log'],
},
- {
- id: 'credits',
- label: 'Credits',
- description: 'Guthaben & Transaktionen',
- icon: CurrencyCircleDollar,
- anchors: ['credits'],
- },
{
id: 'data',
label: 'Daten & Sync',
@@ -143,21 +136,6 @@ export const searchIndex: SearchEntry[] = [
anchor: 'security-log',
},
- // Credits
- {
- label: 'Credits-Guthaben',
- keywords: ['balance', 'geld'],
- category: 'credits',
- anchor: 'credits',
- },
- {
- label: 'Credits kaufen',
- keywords: ['buy', 'pakete', 'kaufen'],
- category: 'credits',
- anchor: 'credits',
- },
- { label: 'Transaktionen', keywords: ['history'], category: 'credits', anchor: 'credits' },
-
// Data
{
label: 'Cloud Sync',
diff --git a/apps/mana/apps/web/src/lib/components/settings/sections/CreditsSection.svelte b/apps/mana/apps/web/src/lib/components/settings/sections/CreditsSection.svelte
deleted file mode 100644
index 8b8eec397..000000000
--- a/apps/mana/apps/web/src/lib/components/settings/sections/CreditsSection.svelte
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
- {#snippet action()}
- Alle Details
- {/snippet}
-
-
-
-
-
Verfügbar
-
- {creditBalance ? formatCredits(creditBalance.balance) : '...'}
-
-
-
-
Gratis heute
-
- {creditBalance
- ? `${creditBalance.freeCreditsRemaining}/${creditBalance.dailyFreeCredits}`
- : '...'}
-
-
-
-
Gesamt verbraucht
-
- {creditBalance ? formatCredits(creditBalance.totalSpent) : '...'}
-
-
-
-
-
-
diff --git a/apps/mana/apps/web/src/lib/components/settings/sections/VaultSection.svelte b/apps/mana/apps/web/src/lib/components/settings/sections/VaultSection.svelte
index 683793623..75b3a1324 100644
--- a/apps/mana/apps/web/src/lib/components/settings/sections/VaultSection.svelte
+++ b/apps/mana/apps/web/src/lib/components/settings/sections/VaultSection.svelte
@@ -1,32 +1,28 @@
-
-
+{#snippet statusBadgeSnippet()}
+
+
+ {badge.label}
+
+{/snippet}
-
-
-
-
Status
- {badge.label}
-
+
+
+
+
{#if vaultState.status === 'unlocked'}
-
- Dein persönlicher Schlüssel ist auf diesem Gerät geladen. {totalEncryptedFields}
- Felder über {encryptedTables.length} Tabellen werden verschlüsselt gespeichert.
+
+ Dein persönlicher Schlüssel ist auf diesem Gerät geladen.
+ {totalEncryptedFields} Felder
+ über {encryptedTables.length} Tabellen werden verschlüsselt gespeichert.
{:else if vaultState.status === 'locked'}
-
+
Dein Schlüssel ist nicht geladen. Verschlüsselte Inhalte können nicht gelesen werden, bis du
dich erneut anmeldest oder den Schlüssel manuell lädst.
@@ -321,106 +284,103 @@
Schlüssel jetzt laden
{:else}
-
+
Es gab ein Problem beim Laden deines Verschlüsselungsschlüssels. Bitte melde dich neu an
oder prüfe deine Internetverbindung.
Erneut versuchen
{/if}
-
+
-
-
-
-
Verschlüsselte Felder
-
{totalEncryptedFields} Felder, {encryptedTables.length} Tabellen
+
+
+
Was Mana sehen kann
+
+
+ Was Mana nie sieht: deine verschlüsselten Inhalte (Chat, Notizen, Träume, Memos,
+ Kontaktdetails, Zyklus-Notizen, Transaktionsbeschreibungen, …). Sie verlassen dein Gerät nur als
+ unleserlicher Blob.
+
+
+ Was Mana technisch entschlüsseln könnte: deinen Master-Key, falls ein Mitarbeiter
+ mit Zugriff auf den Schlüsselverschlüsselungsschlüssel aktiv darauf zugreift. In der Praxis ist
+ das gegen alle realistischen Bedrohungen außer einer gerichtlich erzwungenen Offenlegung gegen
+ Mana selbst geschützt.
+
+
+ Was strukturell sichtbar bleibt: Anzahl deiner Notizen / Chats / Kontakte, Zeitstempel,
+ Verbindungen zwischen Records. Die Inhalte selbst nicht.
+
+
+
+
+
+
+
+
Verschlüsselte Felder
+
+ {totalEncryptedFields} Felder · {encryptedTables.length} Tabellen
+
-
+
Welche Spalten in welchen Tabellen verschlüsselt am Gerät liegen. Strukturelle Metadaten (IDs,
Zeitstempel, Status-Flags) bleiben absichtlich im Klartext, damit Indizes, Sortierungen und
Sync weiter funktionieren.
- {#each encryptedTables as { table, fields } (table)}
+ {#each visibleTables as { table, fields } (table)}
- {table}
- {fields.join(', ')}
+ {table}
+ {fields.join(', ')}
{/each}
-
-
-
-
-
-
Schlüssel rotieren
-
-
- Vorsicht: Beim Rotieren wird ein neuer Schlüssel generiert. Daten, die mit
- dem alten Schlüssel verschlüsselt wurden, sind danach nicht mehr lesbar — es sei denn, sie
- wurden vorher entschlüsselt und mit dem neuen Schlüssel neu geschrieben. Mana führt diesen
- Re-Encrypt-Schritt aktuell nicht automatisch durch.
-
-
- Wann verwenden? Wenn du den Verdacht hast, dass dein Gerät kompromittiert wurde, oder als
- regelmäßige Sicherheitspraxis nach einem Login von einem unbekannten Ort.
-
- {#if !confirmRotate}
- (confirmRotate = true)}
- >
- Schlüssel rotieren …
+ {#if hiddenTableCount > 0}
+ (fieldsExpanded = !fieldsExpanded)}>
+ {fieldsExpanded ? 'Weniger anzeigen' : `${hiddenTableCount} weitere anzeigen`}
- {:else}
-
-
- {rotating ? 'Rotiere …' : 'Ja, jetzt rotieren'}
-
- (confirmRotate = false)}
- >
- Abbrechen
-
-
{/if}
-
+
-
-
-
-
Zero-Knowledge-Modus
+
+
+
+
Zero-Knowledge-Modus
+
+ {zkActive ? 'Aktiv' : 'Nicht aktiv'}
+
-
+
Optional, fortgeschritten. Im Zero-Knowledge-Modus speichert Mana deinen
Schlüssel nur noch in einer Form, die wir selbst nicht entschlüsseln können . Du
brauchst dann beim Login von einem neuen Gerät deinen Recovery-Code, um deine Daten
freizuschalten.
-
+
Vorteil: selbst ein Mana-Mitarbeiter mit Vollzugriff auf den Server kann
deine Inhalte nicht mehr lesen. Risiko: wenn du den Recovery-Code verlierst, sind
deine Daten unwiderruflich weg — wir haben dann keinen Backup-Schlüssel mehr.
{#if zkError}
-
⚠️ {zkError}
+
+
+ {zkError}
+
{/if}
{#if zkSetupStep === 'idle'}
{#if hasRecoveryWrap}
-
- ℹ️ Du hast bereits einen Recovery-Code gespeichert, aber Zero-Knowledge ist noch nicht
- aktiv. Du kannst direkt aktivieren oder den Code zurücksetzen.
+
+
+
+ Du hast bereits einen Recovery-Code gespeichert, aber Zero-Knowledge ist noch nicht
+ aktiv. Du kannst direkt aktivieren oder den Code zurücksetzen.
+
-
+
{:else}
-
+
- Schritt 1 von 3 — Code sicher aufschreiben
-
- Speichere diesen Code an einem sicheren Ort (Passwort-Manager, ausgedruckt im Tresor, …).
- Wir zeigen ihn dir nur ein einziges Mal.
+
+
+ 1
+
Code sicher aufschreiben
+
+
+ Speichere diesen Code an einem sicheren Ort (Passwort-Manager, ausgedruckt im Tresor, …). Wir zeigen ihn dir nur ein einziges Mal.
{generatedCode}
-
-
📋 Kopieren
+
+
+
+ Kopieren
+
Ich habe den Code gesichert →
@@ -498,9 +465,12 @@
{/if}
{#if zkSetupStep === 'confirming'}
-
-
Schritt 2 von 3 — Code zurück eintippen
-
+
+
+ 2
+
Code zurück eintippen
+
+
Tippe (oder paste) den Code, den du gerade gespeichert hast. So stellen wir sicher, dass
der Backup wirklich vollständig ist.
@@ -512,7 +482,7 @@
autocomplete="off"
spellcheck="false"
/>
-
+
- Schritt 3 von 3 — Zero-Knowledge-Modus aktivieren
-
+
+
+ 3
+
Zero-Knowledge-Modus aktivieren
+
+
Wenn du jetzt aktivierst, löscht der Server seine Kopie deines Schlüssels. Ab sofort
kannst du nur noch mit dem Recovery-Code auf deine verschlüsselten Daten zugreifen.
-
- ⚠️ Diese Aktion ist nicht rückgängig zu machen ohne den Recovery-Code. Wenn du deinen Code
- verlegst, sind deine Inhalte verloren.
-
-
+
+
+
+ Diese Aktion ist nicht rückgängig zu machen ohne den Recovery-Code. Wenn du deinen Code
+ verlegst, sind deine Inhalte verloren.
+
+
+
- ✅ Zero-Knowledge-Modus aktiv
-
+
+
+
Der Server kann deine Daten ab sofort nicht mehr entschlüsseln. Beim nächsten Login auf
einem neuen Gerät wirst du nach deinem Recovery-Code gefragt.
-
+
+
- {#if rotateStep === 'rotated' && rotatedCode}
-
-
🔁 Neuer Recovery-Code
-
- Dein alter Code ist ab sofort ungültig. Speichere den neuen Code an einem
- sicheren Ort, bevor du diese Seite verlässt — wir zeigen ihn dir nur ein einziges Mal.
-
-
{rotatedCode}
-
-
- 📋 Kopieren
-
-
- Ich habe den neuen Code gesichert
-
-
+ {#if rotateStep === 'rotated' && rotatedCode}
+
+
- {:else if !confirmDisableZk}
-
-
- {zkBusy ? 'Rotiere …' : '🔁 Recovery-Code rotieren'}
-
- (confirmDisableZk = true)}
- >
- Zero-Knowledge-Modus wieder deaktivieren …
-
-
- {:else}
-
- Damit wir den Server-Schlüssel wiederherstellen können, brauchen wir deinen aktuell
- geladenen Master-Key. Der ist gerade in deinem Browser — wir senden ihn einmal an den
- Server, der ihn dann mit dem KEK neu wrappt.
+
+ Dein alter Code ist ab sofort ungültig. Speichere den neuen Code an einem
+ sicheren Ort, bevor du diese Seite verlässt — wir zeigen ihn dir nur ein einziges Mal.
-
-
- {zkBusy ? 'Deaktiviere …' : 'Ja, deaktivieren'}
+ {rotatedCode}
+
+
+
+ Kopieren
- (confirmDisableZk = false)}
- >
- Abbrechen
+
+ Ich habe den neuen Code gesichert
- {/if}
+
+ {:else if !confirmDisableZk}
+
+
+
+ {zkBusy ? 'Rotiere …' : 'Recovery-Code rotieren'}
+
+
(confirmDisableZk = true)}
+ >
+ Zero-Knowledge-Modus deaktivieren …
+
+
+ {:else}
+
+ Damit wir den Server-Schlüssel wiederherstellen können, brauchen wir deinen aktuell
+ geladenen Master-Key. Der ist gerade in deinem Browser — wir senden ihn einmal an den
+ Server, der ihn dann mit dem KEK neu wrappt.
+
+
+
+ {zkBusy ? 'Deaktiviere …' : 'Ja, deaktivieren'}
+
+ (confirmDisableZk = false)}
+ >
+ Abbrechen
+
+
+ {/if}
+ {/if}
+
+
+
+
+
Schlüssel rotieren
+
+ Vorsicht: Beim Rotieren wird ein neuer Schlüssel generiert. Daten, die mit
+ dem alten Schlüssel verschlüsselt wurden, sind danach nicht mehr lesbar — es sei denn, sie
+ wurden vorher entschlüsselt und mit dem neuen Schlüssel neu geschrieben. Mana führt diesen
+ Re-Encrypt-Schritt aktuell nicht automatisch durch.
+
+
+ Wann verwenden? Wenn du den Verdacht hast, dass dein Gerät kompromittiert wurde, oder als
+ regelmäßige Sicherheitspraxis nach einem Login von einem unbekannten Ort.
+
+ {#if !confirmRotate}
+
+ (confirmRotate = true)}
+ >
+ Schlüssel rotieren …
+
+
+ {:else}
+
+
+ {rotating ? 'Rotiere …' : 'Ja, jetzt rotieren'}
+
+ (confirmRotate = false)}
+ >
+ Abbrechen
+
{/if}
-
-
-
-
-
-
Was Mana sehen kann
-
-
- Mana speichert deinen Schlüssel verschlüsselt auf dem Server (mit einer separaten
- Schlüssel-Verschlüsselungs-Schlüssel-Strategie), damit du dich von neuen Geräten anmelden
- kannst. Das bedeutet:
-
-
-
- Was Mana nie sieht: deine verschlüsselten Inhalte (Chat, Notizen, Träume, Memos,
- Kontaktdetails, Zyklus-Notizen, Transaktionsbeschreibungen, …). Sie verlassen dein Gerät nur als
- unleserlicher Blob.
-
-
- Was Mana technisch entschlüsseln könnte: deinen Master-Key, falls ein Mitarbeiter
- mit Zugriff auf den Schlüsselverschlüsselungsschlüssel aktiv darauf zugreift. In der Praxis ist
- das gegen alle realistischen Bedrohungen außer einer gerichtlich erzwungenen Offenlegung gegen
- Mana selbst geschützt.
-
-
- Was strukturell sichtbar bleibt: Anzahl deiner Notizen / Chats / Kontakte, Zeitstempel,
- Verbindungen zwischen Records. Die Inhalte selbst nicht.
-
-
-
+
diff --git a/apps/mana/apps/web/src/lib/modules/settings/ListView.svelte b/apps/mana/apps/web/src/lib/modules/settings/ListView.svelte
index 96fec0cba..6dbd9b0e3 100644
--- a/apps/mana/apps/web/src/lib/modules/settings/ListView.svelte
+++ b/apps/mana/apps/web/src/lib/modules/settings/ListView.svelte
@@ -15,7 +15,6 @@
import GeneralSection from '$lib/components/settings/sections/GeneralSection.svelte';
import AiSection from '$lib/components/settings/sections/AiSection.svelte';
import SecuritySection from '$lib/components/settings/sections/SecuritySection.svelte';
- import CreditsSection from '$lib/components/settings/sections/CreditsSection.svelte';
import DataSection from '$lib/components/settings/sections/DataSection.svelte';
let activeCategory = $state('general');
@@ -76,8 +75,6 @@
{:else if activeCategory === 'security'}
- {:else if activeCategory === 'credits'}
-
{:else if activeCategory === 'data'}
{/if}