katlab invoicer keeps nothing on a server, and it doesn’t lock you in either. If this site disappeared tomorrow, you would lose nothing.
python3 -m http.server in the folder and open http://localhost:8000 — it works without internet and never contacts katlab.invoice.json file. Drop the PDF onto the Documents page (here or in the offline copy) and it comes back — with its number, lines, client and payments.{
"app": "katlab-invoicer",
"schemaVersion": 2,
"exportedAt": "2026-09-23T10:00:00.000Z",
"data": {
"meta": [{ "id": "activeBusinessId", "value": "…" }],
"businesses": [Business],
"clients": [Client],
"products": [Product],
"docs": [Document],
"payments": [Payment]
}
}
id and an ISO updatedAt. Restoring merges by id: newer records win and issued documents are never replaced by drafts."1250.50", "1.5") — never floating-point numbers. Payment amounts are integer strings in minor units ("125050" = 1,250.50).YYYY-MM-DD strings with no time zone.type: invoice, quote, proforma, credit_note, receipt, delivery_note, purchase_order · status: draft, issued, voidnumber, seq, seqKey (the counter and year it was issued under), issueDate, supplyDate, dueDate, validUntil, issuedAtseller and client: snapshots of name, address, country, VAT ID and bank details at the time of issuecurrency, fxRate, fxSource, fxDate, docLang, secondLang, priceMode (net/gross), rounding (doc/line)lines[]: name, description, qty, unit, unitPrice, discount {type: pct|abs, value}, tax {id, rate, category, label} — category codes follow EN 16931 (S, Z, E, AE, K, G, O)docDiscount, charges[] (label, amount, tax), legalNotes[], customFields[], notes, footer, payment (IBAN, reference, QR standard), themerefDoc (credit note / receipt / conversion source), advance and finalOf (advance invoices), acceptance (quote acceptance), recurrence (repeat schedule)Totals are not stored — they are always recomputed from the lines, so a backup can never contain totals that disagree with its items.
documentId, date, amountMinor, method, notename, address, country, vatId, email, docLang, currencyname, description, unit, unitPrice, taxRateIdPDFs contain an embedded file invoice.json (relationship Source) with {"app": "katlab-invoicer", "kind": "document", "schemaVersion": 2, "doc": Document, "payments": [Payment]}. Most PDF readers show it under Attachments.
Share links put the document after the # in the address — the part browsers never send to a server. Format: v1.z.<data> (compressed), v1.e.<salt>.<iv>.<data> (AES-GCM encrypted with a key derived from your password using PBKDF2-SHA256, 600,000 iterations), or v1.r.<data> (uncompressed, for older browsers).
Nothing is lost: your data is already on your device, every PDF contains its own data, the backup format is documented here, and the offline copy runs without this website.
The backup is JSON. Most spreadsheet tools can import JSON; the fields are documented above.