Transparenz
Dein Datenformat – offen dokumentiert
Deine Haushaltsdaten gehören dir. Kontoo speichert sie nur auf deinem Gerät — und damit du dich nie an uns gebunden fühlen musst, ist hier vollständig dokumentiert, wie jede Export-Datei aufgebaut ist. Alles ist mit Standard-Werkzeugen lesbar: der JSON-Export mit jedem Texteditor, die CSV-Datei mit jeder Tabellenkalkulation, das verschlüsselte Backup mit frei verfügbarer Standard-Kryptografie. Auch wenn es Kontoo morgen nicht mehr gäbe, kämst du an alles heran.
1. JSON-Export (vollständige Datei)
„Mehr-Menü → Exportieren" erzeugt eine JSON-Datei mit dem kompletten Haushalt. Grundstruktur:
{
"meta": { "v": 25, "currency": "EUR", "name": "Mein Haushalt", … },
"people": [ { "id": "…", "name": "Alex" }, … ],
"income": [ { "id": "…", "name": "Gehalt", "v": 2400, "owner": "<person-id>", "freq": "monthly" }, … ],
"savings": [ …wie income… ],
"personal": { "<person-id>": [ …Posten… ] },
"buckets": [ { "id": "…", "name": "Wohnen",
"split": { "mode": "income" | "even" | "fixed", "amounts": { "<person-id>": 500 } },
"groups": [ { "id": "…", "name": "Fixkosten", "items": [ …Posten… ] } ] } ],
"accounts": [ { "id": "…", "name": "Depot", "type": "depot|cash|property|loan|…", "value": 12000, "history": […] } ],
"goals": [ { "id": "…", "name": "Urlaub", "target": 3000, "saved": 500, "contributions": […] } ],
"scenarios": […], "wishes": […], "classMap": { "<tag>": "need" | "want" }, "rules": { … }, "learn": { … }
}
Ein Posten (item) hat die Felder id, name, v (Betrag), type
(amount = laufender Betrag, asset = Anschaffung mit cost/life
in Jahren/buffer in %), freq
(monthly | quarterly | half | yearly | once), optional dueMonth (1–12),
tags, note, track + actuals (Ist-Buchungen
{ts, amount, note}), assigned (Umschlag-Zuweisung je Monat) und
recurring (Vorlagen). Der Monatswert einer Anschaffung ist
cost / (life × 12) × (1 + buffer/100).
meta.v ist die Schema-Version. Kontoo liest alle älteren Versionen deiner Exporte für immer
ein (interne Migration beim Laden) und warnt, statt still zu verwerfen, wenn eine Datei aus einer neueren Version
stammt.
2. CSV-Export (Tabellenkalkulation)
Der CSV-Export ist verlustfrei re-importierbar und öffnet direkt in Excel, LibreOffice oder Numbers
(UTF-8 mit BOM; Dezimal- und Spaltentrennzeichen folgen deiner Sprache — im Deutschen ; und Komma).
Spalten:
| Spalte | Bedeutung |
|---|---|
| Bereich | Einnahme, Sparen, Persönlich oder Topf-Zeile |
| Topf / Gruppe / Person | Zuordnung im Haushalt |
| Bezeichnung, Typ, Rhythmus | Name, Betrag/Anschaffung, Zahlungsrhythmus |
| Betrag/Preis, Lebensdauer, Puffer, Monatswert | Rohwerte + normalisierter Monatswert |
| Tags, Klasse, Notiz | Schlagworte, Bedürfnis/Wunsch (50/30/20), Freitext |
| Ist JJJJ-MM | Ist-Ausgaben des Monats (bei aktivem Tracking) |
3. Verschlüsseltes Backup (.hbk)
Das verschlüsselte Backup ist eine JSON-Datei („Umschlag") — sie enthält keinerlei Klartext:
{ "format": "hbk1", "iter": 600000, "salt": "<Base64>", "iv": "<Base64>", "ct": "<Base64>" }
Entschlüsselung mit reinen Web-Standards (funktioniert in jedem Browser und in Node.js, ganz ohne Kontoo):
- Schlüssel ableiten: PBKDF2-SHA-256 mit deinem Passwort, dem
saltunditerIterationen → 256-Bit-Schlüssel. - Entschlüsseln: AES-256-GCM mit dem
ivaufct→ der Klartext ist der JSON-Export aus Abschnitt 1.
// Node.js ≥ 20 (WebCrypto), env = eingelesene .hbk-Datei als Objekt
const b64 = s => Buffer.from(s, 'base64');
const km = await crypto.subtle.importKey('raw', new TextEncoder().encode(passwort), 'PBKDF2', false, ['deriveKey']);
const key = await crypto.subtle.deriveKey({name:'PBKDF2', hash:'SHA-256', salt:b64(env.salt), iterations:env.iter},
km, {name:'AES-GCM', length:256}, false, ['decrypt']);
const klartext = new TextDecoder().decode(
await crypto.subtle.decrypt({name:'AES-GCM', iv:b64(env.iv)}, key, b64(env.ct)));
4. Geräte-Sync (optional)
Der optionale Sync überträgt exakt dasselbe hbk1-Chiffrat als Blob. Die Blob-Adresse wird aus deiner
Passphrase abgeleitet; der Server sieht zu keinem Zeitpunkt Klartext und kennt weder Namen noch Konto. Ohne
eingerichteten Sync macht die App gar keine Netzwerk-Anfragen — nachprüfbar im Netzwerk-Tab deines Browsers.
Stand: Juli 2026 · Schema-Version 25. Diese Seite wird bei Format-Änderungen aktualisiert; ältere Exporte bleiben immer einlesbar.