Skip to content

Releases: OrellBuehler/kept

v0.5.0

Choose a tag to compare

@OrellBuehler OrellBuehler released this 07 Oct 22:37
16c9968

Upgrading from 0.4.0

  • Reverse proxies and CDNs must not cache /sw.js or /workbox-*.js. Kept sends
    Cache-Control: no-cache for them; a proxy that caches them anyway keeps browsers on an old
    version after an upgrade.

Added

  • Installable app (PWA): a service worker precaches the static, content-hashed assets so the app
    loads faster, shows an offline page when the server cannot be reached, and offers to reload
    when a new version is available. Pages, data, documents and API responses are never cached in
    the browser.

What's Changed

Full Changelog: v0.4.0...v0.5.0

v0.4.0

Choose a tag to compare

@OrellBuehler OrellBuehler released this 06 Oct 21:08
8c3ffae

Upgrading from 0.3.0

  • Back up kept.db first. Migrations 0017–0031 run automatically on the first start, in one
    transaction (a failure leaves the database as it was). Two of them rewrite existing rows.
  • Finish or cancel open imports before upgrading. Uploads waiting for confirmation now live in
    the database and blob store; previews started on 0.3.0 are not carried over.
  • Tax payments may move to a different deduction year. Outflows mapped to a deduction that
    have no matching line on the tax statement are reclassified. The tax year page lists the moved
    payments and lets you undo or dismiss the change.
  • Email notifications are limited to administrators. Users have no verified address yet, so
    a member's existing email channel now fails with "limited to administrators". Use ntfy or a
    webhook instead.
  • Members can no longer reach private network addresses (webhooks, ntfy, Paperless) unless
    you set KEPT_ALLOW_PRIVATE_NETWORK=true. Administrators still can.
    KEPT_NOTIFY_BLOCK_PRIVATE=true blocks them for everyone.
  • KEPT_SECRET_KEY is required by every built server, not only with NODE_ENV=production.
    The Docker image already required it; bun run start without it now refuses to start. Use
    KEPT_ALLOW_INSECURE_KEY=true only for throwaway local runs.
  • Stored tokens that cannot be decrypted (for example after changing the key) are now flagged
    as needing re-entry in settings instead of failing on use.
  • Admin actions ask for your password (and second factor, when enabled) and are recorded in
    an audit log.
  • SQLite migrations moved from drizzle/ to drizzle/sqlite/. Only relevant if you run Kept
    from source with your own paths; already applied migrations are recognised.

Added

  • Investments: securities, trades, holdings valuation, stock splits, and daily prices and FX
    rates from Yahoo Finance.
  • Pillar 3a: portfolios, values and contributions, yearly limits and buy-in rules, overview page
    and tax summary.
  • Transfers between own accounts, linked on import and manual entry, with mirrored transactions.
  • Liquidity: notice periods, liquid cash and invested totals.
  • PostgreSQL (17+) as an alternative to SQLite, via DATABASE_URL, and S3-compatible blob
    storage via KEPT_STORAGE=s3.
  • Several instances can share one PostgreSQL database: scheduled jobs and cleanups run on one
    instance, and every instance shuts down gracefully.
  • Security headers and a content security policy; app error pages.
  • External API for companion apps: scoped, revocable tokens (Settings → API tokens) with read
    access to bills, transactions, categories, recurring payments and accounts, and links back to
    bills and transactions. See docs/external-api.md.
  • Warning about lost edits before undoing an import.

Fixed

  • Bills: editing a payment can no longer over-allocate it, and removed allocations are not
    re-added by automatic matching.
  • Pillar 3a: late payments capped per year, refunds subtracted, portfolios not counted twice.
  • Imports: confirm re-checks the preview under the ledger lock; inbox imports match bills again;
    expired uploads are cleaned up reliably.
  • Outgoing requests: private-address checks cannot be bypassed through DNS, and saved tokens are
    not sent to a changed host.
  • Login throttling per username and per client (IPv6 by /64), without hard-locking a username.
  • Many concurrency fixes around bills, transfers, categories and notification settings.

New environment variables

DATABASE_URL, KEPT_DB_POOL_MAX, KEPT_DB_PREPARE, KEPT_DB_STATEMENT_TIMEOUT_MS,
KEPT_DB_TRANSACTION_TIMEOUT_MS, KEPT_DB_APPLICATION_NAME, KEPT_STORAGE, KEPT_STORAGE_DIR,
KEPT_S3_*, KEPT_ALLOW_PRIVATE_NETWORK, KEPT_ALLOW_INSECURE_KEY.
See the README for details.

What's Changed

Full Changelog: v0.3.0...v0.4.0

v0.3.0

Choose a tag to compare

@OrellBuehler OrellBuehler released this 04 Oct 10:45
55181e2

What's Changed

Full Changelog: v0.2.0...v0.3.0

v0.2.0

Choose a tag to compare

@OrellBuehler OrellBuehler released this 02 Oct 22:10
v0.2.0
088f658

What's Changed

Full Changelog: v0.1.0...v0.2.0

v0.1.0

Choose a tag to compare

@OrellBuehler OrellBuehler released this 01 Oct 19:32
v0.1.0
d3e360f

First release of Kept, a self-hosted personal finance app.

Features

  • Accounts grouped by institution (current, savings, credit card, investment, pension, cash), with manual balance snapshots for accounts you don't import
  • Statement import from ISO 20022 camt.053, CSV and Excel (per-account column mapping with live preview); re-imports never duplicate transactions, and every import can be undone
  • Bills from PDF with Swiss QR-bill extraction, or entered by hand
  • Bill-to-payment matching by structured reference, by IBAN and amount as a suggestion, or manually; partial payments, overpayments and credit notes
  • Dashboard: net worth per currency, monthly income and expenses, overdue and upcoming bills, stale imports
  • PDF reports: account statement, open bills, net worth
  • Optional Paperless-ngx integration for pulling bills and writing status back
  • Multiple local users; each user only sees their own data

Run it

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:0.1.0