Self-hosted One container · SQLite by default

Your money, kept on your own server.

Import bank statements, match bills to payments, reconcile what the tax office counted and watch your net worth grow — without handing your finances to anyone.

No bank logins No subscription No cloud Swiss QR-bill aware
ISO 20022 camt.053 CSV Excel Swiss QR-bill PDF bills Paperless-ngx SQLite Docker PDF reports Multi-user
Features

Everything your bank statement can't tell you.

Kept turns the files you can already download into a ledger that knows which bills are paid, where the money went and what you owe the tax office.

Import any statement

ISO 20022 camt.053 out of the box, plus any CSV or Excel export through a column mapping you set up once, with a live preview. Overlapping files never create duplicates, and every import can be undone.

XMLstatement-2026-09.xmlcamt.053.001.08
CSVcard-export.csvSaved mapping
XLSXsavings-q3.xlsxPreview
212 new38 already imported0 duplicates

Bills that match themselves

Upload a PDF and Kept reads the Swiss QR-bill. Payments are matched by structured reference automatically, suggested by IBAN and amount, or linked by hand — partial payments and credit notes included.

Bill Health insurance 412.60 21 00000 00003 13947 14300 09017
Payment Debit · 06 Oct −412.60 21 00000 00003 13947 14300 09017
Reference · automatic IBAN + amount · suggested Manual Partial · overpaid · refund

Categories & budgets

Your own categories and rules that sort transactions on import. A category you set by hand always wins.

Groceries70%
Home45%
Leisure92%

Taxes, reconciled

Tag payments with a tax year, enter the lines from the tax office's statement, and see what you paid against what they counted — missing lines, differences and the remaining balance.

Tax year 2025 You paid They counted Δ
Instalment 1 2,400.00 2,400.00 ✓
Instalment 2 2,400.00 2,400.00 ✓
Instalment 3 2,400.00 — missing
Assessed 7,017.60 7,200.00 4,800.00 refund 182.40

A dashboard that tells the truth

Net worth over time per currency — never silently converted. This month's income and expenses, bills due, and accounts whose last import is getting old.

PDF reports

Account statements, open bills, net worth and tax reconciliation, ready to print or file.

Paperless-ngx, if you want it

Pull bills from a tag or saved view and write amount, due date and status back. Entirely optional.

Paperless integration
Bills pulled from your tag or saved view
Amount, due date and status written back
Reports filed into Paperless
How it works

Download. Drop. Done.

No bank credentials, no screen scraping, no aggregator in the middle. Just the files your e-banking already gives you.

Export from your bank

Download a camt.053 statement or a CSV/Excel export from your e-banking. eBill invoices? Save the PDF.

Drop it into Kept

Preview every row before it lands. Kept warns when a file's opening balance doesn't continue your history.

Let it reconcile

Rules categorize, bills match to payments, budgets fill up, and the dashboard shows where you stand.

Privacy by architecture

Your finances never leave your server.

  • SQLite by default, PostgreSQL optional. Everything in a single database file you can copy, inspect and back up, or in your own PostgreSQL 17+ server.
  • Backups built in. On SQLite, download a consistent snapshot any time, or let Kept write one every day.
  • Every user is walled off. Local accounts with argon2id passwords; nobody sees anyone else's data.
  • Secrets encrypted at rest. Integration tokens are encrypted with a key only you hold.
Self-host

Running in under a minute.

  1. 1
    Start the containerOne image on GitHub's registry, one volume for your data.
  2. 2
    Claim your instanceOpen /setup right away — the first user becomes the administrator.
  3. 3
    Import your first statementAdd an account, drop in a file, and watch the dashboard come alive.
~/kept
$ docker run -d --name kept -p 3000:3000 \
    -v kept-data:/data \
    -e KEPT_SECRET_KEY="$(openssl rand -base64 32)" \
    -e ORIGIN=https://kept.example.org \
    ghcr.io/orellbuehler/kept:latest
✓ migrations applied ✓ listening on http://0.0.0.0:3000 → open /setup to create the administrator
KEPT_SECRET_KEYEncrypts stored integration tokens. Keep it with your backups. ORIGINYour public URL, needed behind a reverse proxy. KEPT_BACKUP_DIROptional. Writes a daily database backup here.
FAQ

Good questions.

Does Kept connect to my bank?

No, on purpose. Kept never asks for your e-banking credentials. You download statements yourself and import them — camt.053, CSV or Excel. Re-importing overlapping files is safe.

Can I receive eBill invoices?

A self-hosted app can't receive eBill directly. Download the invoice PDF in your e-banking and upload it as a bill — Kept reads the QR data from it.

Does it handle multiple currencies?

Yes. Every amount keeps its currency, stored as exact integer minor units. Totals and net worth are shown per currency; Kept never converts them with a made-up exchange rate.

Do I need Paperless-ngx?

No. Kept stores bill PDFs itself. If you already run Paperless-ngx (2.16+), the optional integration pulls bills from it and writes their status back.

Can my household use it?

The administrator creates further local users. Each user has their own accounts, bills and budgets and only sees their own data.

What does it cost?

Nothing. Kept is licensed under PolyForm Noncommercial 1.0.0 — free for personal and other noncommercial use.

Take your finances back home.

One container. One file. Every franc accounted for.