Last week I open-sourced beancount-dkb, which is a Python package that provides importer classes for converting CSV exports of DKB (Deutsche Kredit Bank) account summaries into the Beancount format.

For the past few months, I've been looking into keeping tabs on my personal expenses. There are plenty of tools that let you do that. The problem is, I don't like the idea of a single company having access to all my bank accounts. I honestly don't care what the privacy policy says or what's in the security whitepaper. I've worked at enough software companies and talked to enough software engineers to know how things really work.

While searching, I stumbled upon the concept of Plain Text Accounting. The concept is simple - you maintain a list of all your transactions in a plain text file, which you are responsible for curating (hence no external access). This list of transactions follows the Double Entry Accounting method, and is written in a domain specific language (which may vary slightly from tool to tool).

This workflow is quite appealing. You download your account statements/summaries from your bank's website, run them through a script to convert them to a format that your tool of choice works with, and then run reporting on top. There are multiple such tools available to adopt this flow, the most prominent ones being ledger, hledger, and beancount. I settled on using beancount simply because I like Python.

The only problem was that my account is with DKB, and there were no existing conversion helpers to convert the CSV that I get from DKB to a format that beancount can work with.

Luckily, beancount defines how to ingest external transaction data. The idea is to implement a class that sticks to the beancount.ingest.importer.Importer interface provided by beancount. The main job of this class is to take the raw transactions data from your bank and output data in the beancount format.

This ingestion is extremely well documented. So I spent a weekend writing two such importer classes - ECImporter (which works with EC account summaries), and CreditImporter (which works on Credit Card account summaries). I've used it to import my own transaction data starting from 2015 onwards, and the entire setup works extremely well.

Anyway, the module is on PyPI under the name beancount-dkb, and the source is on Github. Hope it's useful!