Free, self-hosted bookkeeping for freelancers and one-person businesses.
Scan receipts, send invoices and quotes, import the bank, and have your tax figures ready when they're due. The Netherlands is supported first.
Report a bug
·
Request a feature
Table of contents
I run a one-person company and didn't want to pay a monthly fee for bookkeeping software, so I built my own. Ledgerbee covers what a freelancer needs every day and at every tax deadline. Tax rules live in a module per country; the Netherlands (btw and inkomstenbelasting) is the first, and the app itself is in Dutch for now.
- Receipts: photograph a bon and the phone reads it (on the device, offline). Share a PDF invoice from your mail and the server reads its text layer. You check the draft and confirm.
- Invoices and quotes: numbered without gaps, with every field the Belastingdienst requires, a scan-to-pay QR code, e-mail delivery, reminders for late payers and credit invoices for corrections. An accepted quote becomes an invoice in one tap.
- Bank: import a CSV or CAMT.053 export from ING, Rabobank, ABN AMRO, Knab or bunq. Payments are matched to invoices and receipts, and payments without a receipt are listed.
- Btw-aangifte: every rubriek from 1a to 5g for a quarter, in whole euros the way the form wants them. Tap a rubriek to see the invoices and costs behind it before you file.
- Inkomstenbelasting: winst, urencriterium, zelfstandigenaftrek, startersaftrek, MKB-winstvrijstelling, KIA, depreciation and kilometres, from tax tables that are updated each year.
- Reminders: phone notifications and a daily e-mail before every deadline.
Your data stays on your own server. There is one user per install, and a filed quarter is locked so the numbers you filed can't change underneath you.
The server is a single Rust binary (axum, rusqlite) that holds all data and all tax logic. The app is Flutter for Android and Linux, with Google ML Kit for on-device text recognition and an offline outbox for receipts scanned without signal.
- A machine that stays on: a Raspberry Pi is plenty.
- Rust (the toolchain is pinned in
server/rust-toolchain.toml),pdftotextfrom poppler-utils, andsqlite3. - Flutter, to build the app.
- Optional: a Brevo account for sending invoices and reminder e-mails. The free tier is enough.
- Clone the repo and configure the server:
git clone https://github.com/Not-Bad-Company/ledgerbee.git cd ledgerbee/server cp .env.example .env # set BOEK_SECRET to the output of: openssl rand -hex 32 cargo build --release
- Create your account. It asks for a password and prints a QR code for your authenticator app plus ten recovery codes:
./target/release/boekhouding create-user you@example.nl
- Run it as a service. Adjust the user and paths in
deploy/*.servicefirst:sudo cp ../deploy/boekhouding.service ../deploy/boekhouding-backup.* /etc/systemd/system/ sudo systemctl enable --now boekhouding boekhouding-backup.timer
- Keep it off the open internet. Either bind
BOEK_BINDto your Tailscale address, or keep127.0.0.1and put it behind a reverse proxy or tunnel with https. The app refuses plain http to anything outside your own network. - Build and install the app:
cd ../app flutter build apk --release # Android: install build/app/outputs/flutter-apk/app-release.apk flutter build linux --release # Linux: build/linux/x64/release/bundle/
- Log in with the server address, your e-mail, password and a code from the authenticator. The overview asks for your company details first; they appear on every invoice.
- When you pay: tap Kosten toevoegen, photograph the bon or pick the PDF, check the draft, confirm. From another app, share the file to Ledgerbee.
- Once a month: import the bank export, link the suggestions and find the receipts that are missing.
- Each quarter (deadline: the last day of the following month): open Aangifte → Btw, check the rubrieken, copy the whole-euro figures into Mijn Belastingdienst Zakelijk, pay, then mark the quarter Ingediend.
- Before 1 May: open Aangifte → Inkomstenbelasting for last year, export the year as a zip of CSVs and attachments if your accountant wants it, and file.
- Every January: add the new year's figures to
server/src/tax/mod.rs. A missing year falls back to the newest one, and the report says so.
Backups run nightly: a consistent SQLite snapshot plus the attachments, kept for eight years (the bewaarplicht is seven). Set BOEK_BACKUP_REMOTE to an rclone remote for an off-site copy.
- Receipts by camera, file or share sheet
- Btw-aangifte with the sources behind each rubriek
- Invoices with scan-to-pay, reminders and credit invoices
- Quotes that turn into an invoice
- Recurring invoices
- Receipts forwarded by e-mail
- UBL / Peppol export
- English interface and more countries
- Web version of the app
The full list is in docs/ROADMAP.md. See the open issues for known bugs and requests.
Bug reports are the most useful contribution, especially wrong tax figures: say which rubriek or line, what you expected and why. Pull requests are welcome too. Read CONTRIBUTING.md first, because contributions come with a licence grant.
- Fork the project
- Create a branch (
git checkout -b feature/quotes) - Commit your changes
- Push the branch and open a pull request
Ledgerbee is free to use, change and self-host, for yourself or your own business, under the Elastic License 2.0. You may not offer it to others as a hosted or managed service.
Daan Hessen, Not Bad Company · contact@notbadcompany.com
Project link: github.com/Not-Bad-Company/ledgerbee
- Best-README-Template, which this README follows
- Google ML Kit for on-device text recognition
- printpdf and qrcode for the invoice PDF
- Schibsted Grotesk, Public Sans and JetBrains Mono


