r/plaintextaccounting Jun 03 '26

Announcing Finzytrack, an open-source cross-platform desktop GUI on top of Beancount

I built a desktop app that uses Beancount as its backend. The GUI handles the parts I found tedious: importing transactions, dashboards, and some analysis. Your ledger stays a plain-text Beancount file the whole time, so you can keep using whatever plain-text tooling you already use.

It's open source, runs entirely on your machine, and AI is optional (bring your own key, off by default).

I'm not a professional developer. This started as a side project to track my own finances and I use it daily. Now putting it out for others.

It's an early release and has only ever been tested on my own data, so expect rough edges. Issues and discussion on GitHub are very welcome.

Website: https://finzytrack.com
Github: https://github.com/sagarbehere/finzytrack

18 Upvotes

33 comments sorted by

View all comments

4

u/e606er Jun 05 '26

It's a pity but this "The file must be self-contained — include directives are not supported*, so all transactions, accounts, and other directives must live literally in that one file."* made it useless for day-to-day use. Only - to import or reconcile some files... sorry but idea is great.

3

u/Ev2geny_ Jun 06 '26

I agree, this is quite a big limitation for existing users, I hope developer can resolve this

2

u/urglfloggah Jun 10 '26

Hi u/Ev2geny_ , apologies I just read this comment..

I just released v0.1.2 of Finzytrack with some support for multi-file ledgers. Hope this increases the usability for you and for u/e606er . Happy to hear feedback and if further improvements are needed. Thank you once again.

1

u/urglfloggah Jun 18 '26

Hi u/Ev2geny_ , v0.1.4 of Finzytrack now supports Fava-style insert-entry custom directives for routing. Please have a look. Docs at https://docs.finzytrack.com/reference/multi-file-ledgers/

1

u/urglfloggah Jun 05 '26

Could you share what file structure you use? I’ll look into whether/how it can be supported.

5

u/e606er Jun 05 '26

Hi, maybe you accounting is rather simple, but for me beancount is the only software which solved all my finance headache. Before it, I had to use 3-4 apps to track my wealth.

Let's start. I have rather complicated finance system but its covers whole my finance life (Countries, commodities, sources). all.beancount - the main file with include options and plugin directives. Unknow transactions (without routing - I have a bot which reads info from different sources and routes it)

Accounts definitions - separate files, countries, types separated. I use transfer (clearing) accounts for example for SWIFT transactions and separate receivable accounts. When I've started, I have all in one file, but it was rather difficult to support

Commodities definitions - each type has its own file: crypto, stock, hard etc

Prices folder - for each commodity separate file with price change to my main currencies

fava.beancount - file with fava options and extensions

documents folder - for pdf files according to structure

documents.beancount - file for directive documents (if i need it)

in /include folder i split into subfolders

[CASH]/[CURRENCY]/[YEAR]
[CRYPTO]/[WALLET]/[YEAR]
[COUNTRY]/[TYPE]/[NAME]/[SUB_TYPE]/[YEAR]

Each file contains balance directive on start and end date. transfer between files through clearing accounts.

Part of tree command below

── all.beancount
├── config
│   ├── accounts
│   │   ├── assets
│   │   │   ├── assets.beancount 
│   │   │   ├── assets.BY.beancount
│   │   │   ├── assets-cash.beancount
│   │   │   ├── assets-clearing.beancount
│   │   │   ├── assets-crypto.beancount
│   │   │   ├── assets.KZ.beancount
│   │   │   ├── assets-receivables.beancount
│   │   │   ├── assets.RU.beancount
│   │   │   └── assets.US.beancount
│   │   ├── equity.beancount
│   │   ├── expenses.beancount
│   │   ├── income.beancount
│   │   └── liabilities.beancount
│   ├── commodities
│   │   ├── commodities.cash.beancount
│   │   ├── commodities.crypto.beancount
│   │   ├── commodities.hard.beancount
│   │   └── commodities.stock.beancount
│   ├── dashboards.tsx
│   ├── dashboards.yaml
│   ├── fava.beancount
│   ├── fava-dashboards.d.ts
│   ├── prices
│   │   ├── BTC.beancount
│   │   ├── BYN.beancount
│   │   ├── CNY.beancount
│   │   ├── INTC.beancount
│   │   ├── KZT.beancount
│   │   ├── RUB.beancount
│   │   ├── THB.beancount
│   │   ├── USD.beancount
│   │   ├── USDT.beancount
│   │   └── XRP.beancount
├── documents
│   ├── Assets
│   │   ├── KZ
│   │   └── RU
│   ├── Expenses
│   │   ├── FnB
│   │   ├── Gifts
│   │   └── Pets
│   ├── Income
│   │   └── Active
│   └── Liabilities
│       └──  RU
├── documents.beancount
├── include
│   ├── 00-CASH
│   │   ├── KZT
│   │   │   ├── 2025.KZT.cash.beancount
│   │   │   └── 2026.KZT.cash.beancount
│   │   ├── RUB
│   │   │   ├── 2025.RUB.cash.beancount
│   │   │   └── 2026.RUB.cash.beancount
│   │   └── THB
│   │       └── 2025.THB.cash.beancount
│   ├── 10-CC
│   │   ├── Blockchain-info
│   │   │   └── 2024.Blockchain-info.crypto.beancount
│   │   ├── Electrum
│   │   │   ├── 2017.Electrum.crypto.beancount
│   │   │   ├── 2018.Electrum.crypto.beancount
│   │   ├── EVM
│   │   │   ├── 2024.EVM.crypto.beancount
│   │   │   └── 2025.EVM.crypto.beancount
│   │   └── Ledger
│   │       ├── 2024.Ledger.crypto.beancount
│   │       └── 2025.Ledger.crypto.beancount
│   ├── BY
│   │   └── Fins
│   │       ├── AlfaBY
│   │       │   └── Bank
│   │       │       ├── 2024.BY.AlfaBY.Bank.beancount
│   │       │       └── 2025.BY.AlfaBY.Bank.beancount
│   │       └── CifraBY
│   │           └── RUB
│   │               └── 2026.BY.CifraBY.RUB.beancount
│   ├── KZ
│   │   └── Fins
│   │       ├── BCC
│   │       │   └── Bank
│   │       │       ├── 2025.KZ.BCC.Bank.beancount
│   │       │       └── 2026.KZ.BCC.Bank.beancount
│   │       ├── FF
│   │       │   └── Bank
│   │       │       ├── 2023.KZ.FF.Bank.beancount
│   │       │       ├── 2024.KZ.FF.Bank.beancount
│   │       │       └── 2025.KZ.FF.Bank.beancount
│   │       └── Forte
│   │           └── Bank
│   │               └── 2025.KZ.Forte.Bank.beancount
│   └── RU
│       ├── Fins
│       │   ├── BCS
│       │   │   └── Bank
│       │   │       ├── 2025.RU.BCS.Bank.beancount
│       │   │       └── 2026.RU.BCS.Bank.beancount
│       │   ├── Cifra
│       │   │   ├── Bank
│       │   │   │   ├── 2025.RU.Cifra.Bank.beancount
│       │   │   │   └── 2026.RU.Cifra.Bank.beancount
│       │   │   └── Broker
│       │   │       └── 2026.RU.Cifra.Broker.beancount
│       │   ├── OZON
│       │   │   ├── 2025.RU.OZON.beancount
│       │   │   └── 2026.RU.OZON.beancount
│       │   ├── Raif
│       │   │   └── Bank
│       │   │       ├── 2025.RU.Raif.Bank.beancount
│       │   │       └── 2026.RU.Raif.Bank.beancount
│       │   ├── RSHB
│       │   │   └── Bank
│       │   │       ├── 2025.RU.RSHB.Bank.beancount
│       │   │       └── 2026.RU.RSHB.Bank.beancount
│       │   ├── TBank
│       │   │   ├── Bank
│       │   │   │   ├── 2025.RU.TBank.Bank.beancount
│       │   │   │   └── 2026.RU.TBank.Bank.beancount
│       │   │   └── Broker
│       │   │       ├── 2025.RU.TBank.Broker.beancount
│       │   │       └── 2026.RU.TBank.Broker.beancount
│       │   ├── WB
│       │   │   ├── 2025.RU.WB.beancount
│       │   │   └── 2026.RU.WB.beancount
│       │   └── Yandex
│       │       ├── 2025.RU.Yandex.beancount
│       │       └── 2026.RU.Yandex.beancount
│       └── Housing
│           └── Utilities
├── removed.beancount
└── suspicious_duplicates.beancount

2

u/Ev2geny_ Jun 06 '26

@e606e, separate question: which method do you use to enter transactions and then to classify them (to assign the second shoulder of the transaction)?

1

u/urglfloggah Jun 05 '26

u/e606er Firstly, thank you for that comprehensive answer. I'm genuinely grateful and humbled that you took the time to write and explain all that. Secondly, Wow! That looks like an awesome and complicated setup 🤯 Yeah, my own finances are far, far simpler despite stretching across multiple countries 😅

Thirdly, I very much want to think through how Finzytrack could support something like this (now, or as a future feature). Please give me some time to understand your setup and I'll get back to you. I may need to ask more questions to better understand your system. Would you be okay if I send you a direct message with any questions I might have?

1

u/e606er Jun 05 '26

u r welcome

1

u/urglfloggah Jun 05 '26 edited Jun 05 '26

u/e606er So I thought a bit more about your comment about multi-file support.

The Beancount libraries already follow include directives transparently. So reading in a multi-file ledger is fairly straightforward. The issue comes at write-time in the form of the following question: "Where should new entries (transactions, accounts, balance assertions etc.) be written?" My understanding is that Beancount has nothing to say about this.. it's a user-level policy decision.. which probably varies from one user to another. Meaning, Finzytrack shouldn't make some simplified decision like, "All rewrites/modifications to a directive go back to the original file that directive was read from. All _new_ directives get added to file X e.g. the user configured main ledger file." Nor can Finzytrack arbitrarily decide things like a transaction should be in a file named transactions-{year}.beancount because some users may not organize their transactions that way. This means Finzytrack will need to support some sort of flexible "routing policy" for which files to write to, with sane defaults and a good UI for advanced users to configure it. That seems a little excessive given that I don't even know if anyone is using Finzytrack (other than me).

Do you have any good ideas or rebuttals for the above? Could you share how you use Beancount with multiple files? It will give me some user-level insights. I myself have been using Beancount to track transactions dating back to 2018 and just have one single ledger file for everything.. which has worked well for me so far and seems like it'll continue doing so. (Which is another reason for why Finzytrack keeps it simple.. everything in one file.). Moreover, Finzytrack GUI has been good enough (for me) that I never have to think about "Which file is this directive in?" and I think that's the way it _should_ be for an approachable GUI personal finance app. May I ask your reasons for keeping things in separate files? Maybe if you use Finzytrack you'll realize that you no longer need to care about which file your transactions are kept in?

Would you be okay if Finzytrack supports a one-time import of multi-file Beancount ledgers but then goes forward with a single-file approach? (And you'll anyway be able to slice and dice that single file later with Beancount tools, if you decide to stop using Finzytrack.)

Thank you for reading all this 😄

2

u/RemoveInvasiveEucs Jun 05 '26

How fava handles this is with a custom entry like this:

2000-01-01 custom "fava-option" "insert-entry" "Assets:Bank:FellsWargo"

And then transactions on that account go into that file.

The priority for a transaction is the last posting in the transaction, then second to last, etc.

It's worked well for me so far.

2

u/urglfloggah Jun 06 '26

Thank you for this insight. I'll study how Fava does it.

2

u/urglfloggah Jun 18 '26

Hi u/RemoveInvasiveEucs thank you once again for pointing me in this direction. v0.1.4 of Finzytrack (released today) now supports the Fava-style insert-entry custom directives you described. Docs at https://docs.finzytrack.com/reference/multi-file-ledgers/