Free and open source · Windows, macOS, Linux

Multi-currency personal finance that stays on your machine.

Koinkat is a desktop app for tracking accounts, budgets, and split expenses across currencies. It connects to European banks over PSD2 or works fully manually, and it stores everything in a SQLite database on your own computer. No account, no server, no telemetry.

One local SQLite file No server, no telemetry PSD2 via Enable Banking GPL-3.0-or-later

Version 0.1.0 · Koinkat_0.1.0_x64-setup.exe · Koinkat_0.1.0_aarch64.dmg (Apple Silicon) · Koinkat_0.1.0_amd64.AppImage · deb, rpm and all files on the releases page

The installers are not code-signed, so Windows and macOS will show an unknown-developer warning. That is expected: why, and how to proceed.

Alex·Everyday
Dashboard Review 3 Transactions Analysis Summary Budgets Categories Settings

Overview

Financial overview

Your balances and this month at a glance.

Synced 2h ago Sync Resync history

3 transactions need your review

We categorized them automatically. Confirm or correct each one to train the system.

Review now

Net worth

4,174.19 EUR

Across 3 accounts

  • Checking · DKB 2,340.12EUR
  • Danske Bank 8,120.55DKK 1,088.49EUR
  • Monzo 645.30GBP 745.58EUR

Account distribution

Checking · DKB 56.1%
Danske Bank 26.1%
Monzo 17.9%

This month · July

Full analysis Budget

Spent so far

1,284.31 EUR

Already above June's total (1,180.20 EUR)

Budget pace

1,284.31 / 1,800.00 EUR 71%

57.30 EUR per day until month end.

Top categories

Rent650.00 EUR
Groceries412.77 EUR
Eating out96.20 EUR
Your accounts
Add account
Checking · DKB
2,340.12 EUR
Transactions Edit Delete
Danske Bank
8,120.55 DKK
Transactions Edit Delete
Monzo
645.30 GBP
Transactions Edit Delete
Sample data. The Dashboard, rendered in HTML with the app's own styles: balances in EUR, DKK and GBP converted at daily rates. The eye icon works, it toggles the app's privacy mode.
01

Local-first

How Koinkat handles your data

Your financial data lives in a SQLite database file on your own computer. There is no Koinkat server, no account with us, no sign-up, no telemetry, and no analytics. Nobody involved in this project can see your data.

"Local-first" does not mean the app never touches the internet. This is the complete list of outbound connections, verifiable in the source:

api.enablebanking.com

Only if you link a bank, during linking and syncs

Fetches the balances and transactions you authorized, using your own Enable Banking application. Your banking password is entered on your bank's website, never in Koinkat.

cdn.jsdelivr.net / *.currency-api.pages.dev

On app start and before syncs

Downloads the day's public exchange-rate table before conversions run. The URL contains only the date: nothing about you, not even your chosen currency.

fonts.googleapis.com / fonts.gstatic.com

At app launch

A standard request for the app's three typefaces at launch. No app or financial data travels with it. This page, by contrast, self-hosts its own fonts.

marcosburlino.github.io/koinkat-callback/

Only during bank linking, in your regular browser

Receives a one-time authorization code from your bank and hands it back to the app locally. A single static file, zero further requests. Its source is public.

Nothing else phones home

Like every internet request, these servers see your IP address. Beyond this list there is nothing: no update pings, no crash reporting, no tracking. The app's content-security policy blocks requests to any other host, so a bug or a compromised dependency could not quietly phone home.

One honest caveat

The database is not encrypted at rest: anyone with access to your OS user account can read it, so use disk encryption (BitLocker, FileVault, LUKS) if that matters to you. Your Enable Banking private key is kept in the OS credential store, not in the database. Details in the security model.

02

Features

What it does

Accounts and net worth

Track accounts across currencies. Net worth converts to your preferred currency at today's rates, and every transaction stores the FX rate it was recorded at, so balances stay reproducible.

Bank sync over PSD2

Connect European banks through Enable Banking, read-only: it sees the balances and transactions you authorize and can never move money. Manual accounts work without any bank at all.

Review inbox and rules

Imported transactions land in Review with a suggested category: your rules first, an MCC fallback behind them. Confirming teaches the engine, and most soon arrive pre-sorted.

Split expenses

Track split expenses and who still owes what, including repayments via PayPal or cash, outside your bank accounts. Fees are recorded as separate linked transactions.

Budgets

Recurring monthly budgets plus one-off envelope events, with multi-currency math. The Dashboard shows pace: what is spent, and what is safe per day until month end.

Workspaces

Each workspace is fully isolated, with its own accounts, categories, budgets, and bank links. Start manual, then add a bank-linked workspace whenever you are ready.

Your bank

PSD2, read-only

Sync

Within PSD2 rate limits

Review inbox

Suggested category

Categorized

Rules learn from you

Each sync pulls new transactions into Review with a suggested category. Confirming them teaches Koinkat your categories.

The screens

Rendered in HTML with the app's own styles, not screenshots. Sample data.

Overview

Transactions

Browse, search and edit every movement across your accounts.

Income/Expense Transfer Split expense

Account

All accounts

Type

All

Year

2026

Month

July

Category

All categories

Sort

Date (newest)

Income & expenses

Date Type Amount Account Category Note
21 Jul 2026 Income 2,950.00EUR Checking · DKB Salary Salary July
21 Jul 2026 Expense -42.15EUR Checking · DKB Groceries REWE
19 Jul 2026 ExpenseSplit -187.50DKK Danske Bank Eating out Dinner, split with Nadia
18 Jul 2026 Expense -34.90GBP Monzo Transport Trainline
17 Jul 2026 ExpenseRecurring -15.99EUR Checking · DKB Subscriptions Netflix
15 Jul 2026 Expense -650.00EUR Checking · DKB Rent Rent July

Transfers

Date Type Amount From / To Note
16 Jul 2026 Transfer 500.00EUR Checking · DKBDanske Bank Savings top-up
Previous Page 1 of 4 Next
Transactions: every movement, filterable by account, type, month and category. Transfers get their own table; splits and recurring rows are badged. Sample data.
03

Multi-currency

Built for money that crosses currencies

Salary in one currency, rent in another, a card in a third. Koinkat treats that as the normal case: accounts keep their native currency, totals convert to yours, and budgets do the conversion math per period.

One preferred currency. Pick it per workspace; the Dashboard converts every balance into it at the day's rates.

Rates recorded, not guessed. Every transaction stores the exchange rate it was recorded at, so historical balances stay reproducible.

Decimal money math. Amounts are handled with big.js. IEEE 754 floats never touch monetary values.

Converted at daily rates

8,120.55 DKK 1,088.49 EUR

1 EUR = 7.4604 DKK

645.30 GBP 745.58 EUR

1 GBP = 1.1554 EUR

Sample data, public daily rates.

04

Get started

Three steps

01

Install

Download the installer for your system. It is not code-signed, so Windows and macOS will warn about an unknown developer; the install guide shows the exact clicks to proceed. Prefer to run what you can read? Build from source instead.

02

Create a workspace

On first launch you enter a name. That is the whole "account": a label on your machine, not a login to anything. A Manual workspace works immediately, no bank required.

03

Link a bank, if you want

Register your own free Enable Banking application first, a one-time job of roughly 15 to 20 minutes walked through by the in-app setup guide and the README. Then pick your bank and approve read access on the bank's own website.

05

Before you install

Limitations, stated plainly

Unsigned installers

Windows and macOS will warn: code signing costs a yearly fee this free project does not pay. The source is public, and building it yourself produces the identical app.

European banks only

Bank sync works over PSD2 via Enable Banking, so it covers the European banks that provider reaches. Everywhere else in the world, manual accounts work fully.

Bring your own credentials

Koinkat ships with no bank-access credentials of its own. Connecting a bank requires registering a free Enable Banking application yourself, about 15 to 20 minutes, once. Real setup friction, stated up front.

macOS build is Apple Silicon only

The released .dmg needs an M1 or newer. On an Intel Mac, build from source; the build produces the same app the releases ship.

Not encrypted at rest

The local database is readable by anyone with access to your OS user account. Use OS disk encryption if you need protection there.

Consents expire

PSD2 consents last just under 180 days. When one lapses, syncing pauses for that bank until you relink it; your history and categorizations are kept.

The install guide has the exact warning-bypass clicks per OS. v0.1.0 is the first public release; if something does not behave as documented, open an issue.