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.

Version 0.1.2 · Koinkat_0.1.2_x64-setup.exe · Koinkat_0.1.2_universal.dmg ·Koinkat_0.1.2_amd64.AppImage · deb, rpm and all files on the releases page

The macOS app is signed and notarized by Apple; the universal build runs on Intel and Apple Silicon. On Windows, the warning-free install is one command: winget install MarcoSburlino.Koinkat. The direct download is not code-signed yet, so Windows shows an unknown-publisher warning: why, and how to proceed.

Connect a bank, confirm what arrives, and see everything in one currency.

What each screen is for

Accounts, budgets, and analysis in one window, on your own data.

Dashboard

Every account keeps its own currency; net worth converts into the one chosen for the workspace, at the day's rates. Below it each budget shows how far through the month you are against its limit. The eye in the header blurs every value on screen. Try it.

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

20,870.95 EUR

Across 3 accounts

  • Checking · DKB 11,700.60EUR
  • Danske Bank 40,602.75DKK 5,442.45EUR
  • Monzo 3,226.50GBP 3,727.90EUR

Account distribution

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

This month · July

Full analysis Budget

Spent so far

6,421.55 EUR

Already above June's total (5,901.00 EUR)

Budget pace

6,421.55 / 9,000.00 EUR 71%

286.50 EUR per day until month end.

Top categories

Rent3,250.00 EUR
Groceries2,063.85 EUR
Eating out481.00 EUR
Your accounts
Add account
Checking · DKB
11,700.60 EUR
Transactions Edit Delete
Danske Bank
40,602.75 DKK
Transactions Edit Delete
Monzo
3,226.50 GBP
Transactions Edit Delete

How a transaction gets in

Or type it yourself. Bank sync is optional.

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.

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.

The database is not encrypted at rest, which is covered in what Koinkat does not do, and in the security model.

Every outbound connection

"Local-first" does not mean the app never touches the internet. This is every connection the app itself makes, 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.

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.

Like every internet request, these servers see your IP address. Beyond this list the app contacts nothing: no update pings, no crash reporting, no tracking. Two independent controls keep its traffic to these hosts, the webview's content-security policy and the Tauri capability allowlist. Neither constrains the Rust dependency tree itself, so as in any native app a compromised crate could open a socket directly. Both lockfiles are in the repository so the dependency set can be audited.

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 per period.

One preferred currency per workspace
The Dashboard converts every balance into it at the day's rates.
Rates recorded, not guessed
Every transaction stores the 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

40,602.75 DKK 5,442.45 EUR

1 EUR = 7.4604 DKK

3,226.50 GBP 3,727.90 EUR

1 GBP = 1.1554 EUR

Converted at the day's public rate.

From download to a first balance

  1. 01

    Install

    Download the build for your system. The install guide has the exact clicks for each OS, or you can build from source.

  2. 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. Each workspace is isolated, with its own accounts, categories, budgets and bank links.

  3. 03

    Link a bank, if you want

    Register your own free Enable Banking application, a one-time job of roughly 15 to 20 minutes walked through in the guide. Or skip it and enter transactions by hand; every feature except sync works without it.

What Koinkat does not do

The honest limits of the current release.

Unsigned Windows installer
Windows will warn on the downloaded installer: code signing there costs a yearly fee this free project does not pay yet. Installing from the command line with winget install MarcoSburlino.Koinkat avoids the warning entirely. The macOS app is signed with an Apple Developer ID and notarized, so it opens without warnings. 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.
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 steps per OS, including the Windows warning-bypass clicks. v0.1.2 is the first public release; if something does not behave as documented, open an issue.

Version 0.1.2, free and GPL-3.0-or-later.

deb, rpm and checksums are on the releases page.

Windows
winget install MarcoSburlino.Koinkat

macOS
Koinkat_0.1.2_universal.dmg

Linux
Koinkat_0.1.2_amd64.AppImage

Install on Windows with no security warning

Koinkat is in the Windows Package Manager, built into Windows 10 and 11. Open PowerShell (press the Start key, type powershell, press Enter) and run this command; clicking it selects it, ready to copy:

winget install MarcoSburlino.Koinkat

winget downloads the installer from the official release and verifies it against the hash in Microsoft's community repository, so no SmartScreen warning appears. When it finishes, Koinkat is in the Start menu. Prefer a classic installer? Download Koinkat_0.1.2_x64-setup.exe - Windows will show an unknown-publisher warning, which is expected.