A couple of years ago, in the time of the initial hype around ChatGPT and GenAI, there was a joke that really stuck with me. I don't remember who said it, but the point was:
People: let's create artificial intelligence, it will do all the hard work, and we will do hobbies, draw pictures, make videos, program.
Artificial Intelligence: draws pictures, makes videos, writes code.
People: still go to the office and fill out tax returns...
That's when I came up with the idea that I need to write an application that would finally make GenAI work for the benefit of all humanity — calculating taxes!
The life of a freelancer, indie hacker, and small business owner in Germany has always been unbearable. You don't have enough income yet to afford an army of assistants, tax advisors, and accountants who will take all the local bureaucracy on themselves this really takes hundreds of hours a year , but at the same time, you're already a damn capitalist-exploiter, unworthy of the benefits of German socialism and hated in society. "Eat The Rich, Bitch!" as they say.
In general, avoid starting a small business in Germany if possible better just inherit a multi-million dollar corporation from your parents — that's how normal Germans do it! . But if you was unlicky like me and couldn't avoid it — this post is for you!
My biggest pain as a self-employed in a high-tax country is properly tracking all expenses.
If you don't do this, the tax office will boldly ask for half of your income (not profit), and by the end of the year, you risk owing money you never even held in your hands.
The pain of every small business, yeah.
As the founder of a community where we constantly do events, rent venues, make swag in different countries, I have to collect hundreds of receipts, emails, and invoices so that each one is declared in the right category and explained to the tax office.
Doesn't matter if it's a pack of paperclips or renting a yacht.
Here, for example, is the pile of receipts and invoices I brought back from the last Vas3k Camp 2024, which took place in Serbia. And this is only 20% of all expenses, the main part was in electronic form.
Every year in January-February, my wife and I sit down together, open the receipts box, and spend literally several days, if not weeks, counting and accounting for all of them.
What the hell is KUVALO and why did we buy 5 of them? Oh right, those are kettles in Serbian, probably for the event. Okay, 199 to go!
Along the way, we discover a bunch of unpaid invoices that need to be followed up on, plus a bunch of transactions that we paid for but have no invoice. In some transactions, the amounts don't match, we run out of energy to fight with this, someone starts sobbing in the corner from helplessness, and we abandon it for a couple of weeks or months.
So this drags on for the whole year. We start filing our declaration at the beginning of the year and submit it only around Christmas.
My entire life in Germany for the last 5 years as an indie dev has been filling out tax returns! This can't go on. Really.
On the other hand, despite all the opinions of internet experts, which I'm not going to disprove right now, after communicating for many years with a good tax consultant, you understand that as a self-employed person, you can write off quite a lot of interesting things as business expenses.
For this, I had my own little Python script for the last 3-4 years. I'd put photos of receipts and PDF invoices in a folder, and it would periodically check it.
If it found a new file, it would upload it to Dropbox and add an entry to a table in Airtable, saying there was such a transaction on such a date, here's the link to the invoice.
Yes, I had to write the transaction amount right in the filename because the script couldn't look at its content. But it was smart enough to calculate the currency conversion rate (if the transaction wasn't in EUR) and the date the file was uploaded.
Life became somewhat easier.
Once a month, I'd go into this table and manually add the missing information while I still remembered – what the transaction was for, to whom, where, why.
And at the end of the year, I'd export all of this to an archive for our tax consultants, with a ton of PDFs and a CSV file of transactions, so they could check if I'd messed anything up and file everything correctly with the tax office.
Oh yes...
Then crypto and staking started, every income from which needs to be calculated and declared on the date of the specific payment.
Then trips to events, meetups, and journeys, which can also be officially deducted, but you need to calculate every kilometer of the trip to the destination... and the number of stops... and the number of days...
In short, even with the script, it wasn't simple, but it worked!
I almost never had questions from the tax office, even for some transactions where I just had a photo of a receipt from METRO in Serbia or from a gas station in Argentina.
So last year I thought: I need to turn my dumb script into a more user-friendly application and finally utilize AI for all this routine work.
That's how TaxHacker was born.
I know there are already about three billion invoice tracking applications in the world. Here's one more!
For many years, I tested various accounting applications and almost none fit my freelancer workflow (or were too expensive). I have a lot of receipts and very little time. I want to quickly take a photo of an invoice or receipt on my phone and send it to an "inbox" (aka "unsorted").
Then, when I return home and have time, I want to open my inbox and start sorting through it.
This is where it would be nice to have a little help from LLM.
Multimodal AI models are very good at recognizing text in images — even if it's handwritten and photographed with an old gypsy Nokia. I already talked about this cool feature in my previous post about Vibe-Coding.
I coded everything so that AI does most of the work for me — recognizing all amounts, transaction recipient, currencies, VAT if present, and other important things from my photo or PDF file.
Moreover, it summarizes the essence of the transaction, which is especially important if the receipt is in another language.
This is particularly nice for very bad receipts which the tax office might not even approve, but we'll deal with that later , like these:
💩 Not a Tax Advice: I specifically checked this point with my German tax consultants: in many countries outside the European Union, they don't want to give you "official" invoices. Well, the tax office understands this and can accept virtually any receipt as confirmation of a transaction abroad, as long as it looks reasonable and you can explain it.
At this stage, the most eagle-eyed might have noticed that in addition to LLM parsing, another automation is running — an automatic currency converter. And it's on the invoice date, not the current one!
My tax consultant said it clearly: you can conduct transactions in other currencies as much as you want, but you need to attach the exchange rate on the date of receipt. Take it from anywhere, even from the ECB website, no one will quibble over pennies.
To which I told him that I also have crypto in BTC, ETC, and DOT in Germany, crypto is legal and is largely considered like any investments or stocks , where the rate can change twofold in a day, should I also take the daily average?
At that, he started crying and hung up.
So I taught TaxHacker to convert currencies for me, including crypto!
💩 Not a Tax Advice: The tax office won't waste time on arguments about exchange rates if it at least roughly corresponds to reality and you're not trying to cleverly profit from it.
Then all the extracted and structured info from the invoice flies into the "Transactions" table and lives there beautifully until the next tax declaration.
With modern UI frameworks, such tables can be vibe-coded in an hour and even support various filters, search, and group operations. Noice!
Then I thought: what annoys me the most in all existing "accounting" applications? Each of them tries to impose its own structure on you, half of which is irrelevant to you, and the other fields you need are missing.
For example, in one of the accounting services I tested, fields like E-mail or State (WTF!?) were mandatory for each transaction.
And such an important field, for example, as whether the recipient is inside Germany, inside the EU, or outside it — was found in only one such service. And without this, you can't file a declaration, for instance.
So I thought, since I'm making indie accounting here, let all fields be customizable. So that everyone could create their own structure and write a prompt for LLM for each field, explaining exactly how to parse it.
Because a truly good tool should do what the user wants it to do, not just what the developer programmed it with. But we've long since forgotten that. That's why we're dumbed down...
And off we go:
So far only text fields and numbers are supported, but for testing, I added a separate field "Risks," where I asked AI to analyze the invoice from the perspective of German tax law and write down how much I risk that the tax office might not accept this transaction as a business expense. For example, buying first aid kits for the Vas3k Flot event might be viewed by the tax office as if I bought a kilogram of ibuprofen for myself at home, and then there would be a fight =/
It turned out to be a top-notch constructor.
In addition to fields, transaction categories and projects are also customizable.
Categories are a whole separate topic. Even in Germany, for each expense category like "Online Services," there will be a couple dozen subcategories like "Hosting," "Subscriptions," "Software," each of which the tax office views differently.
And in other countries, they have their own rules entirely.
💩 Not a Tax Advice: In reality, nobody cares about your 1Password or YouTube Premium subscription for €49.99 per month. Categories are made so that you don't write off 80% of your profit on restaurants or travel expenses — that would definitely be suspicious.
So I decided that categories should be customizable. I'll provide the basic set, and then let everyone create and customize their own.
And, as you've already guessed, categories are also parsed using prompts that you set. For example, "put in this category everything related to income from my YouTube channel and expenses for video equipment."
For complete happiness, we still needed full-fledged import and export. I really like how simple and cool reporting is in Stripe, where they don't overload you with SQL-like operators and custom export formats, but simply give you a list of filters and generate CSVs.
I want to make an archive with one button and send it to the tax people, and then let them use their super-duper B2B software to do their job.
So my export simply filters everything by any fields that I've customized there (transactions, categories, projects) and exports everything to a CSV table + an archive of all files for the specified time.
And import is also supported just in case. Although there's little point in it so far, except perhaps when moving from an old tool to a new one.
Overall, at this point, I decided it was time to deploy this creation on my home server and release it as open source, but I just couldn't stop myself from asking Cursor to generate a beautiful dashboard with statistics for my projects.
That's how I learned, for example, that Vas3k Camp in 2024 really broke even according to all invoices (considering a few outstanding ones). Great!
I've been using TaxHacker for my own needs for quite a while now, and it solves my tasks pretty well. We even sat down on the weekend and analyzed 200+ invoices for 2024 with its help and started tracking 2025.
I like it as a Minimum Lovable Product, I even made myself a mobile version to scan receipts directly from my phone. Of course, it lacks the "power" of large accounting services for $250/month, but it has the flexibility of customizable fields and categories with LLM prompts, which I continue to tune for myself.
If this thing saves me a couple thousand euros this year — consider it has already paid for itself!
I didn't have big plans for TaxHacker, it's really a pet project that I've been having fun with in my free time this month. I just want to finally stop tweaking it and release it somewhere for everyone :D
I built it for myself with my clear use cases in mind, and I'll continue to use it for them. But if the thing gets even some positive feedback from outside, here are some features I'd like to add in future releases:
GitHub: https://github.com/vas3k/TaxHacker
There's a docker-compose.yml there, which literally has one service. It doesn't require any settings and can be launched with a single command docker compose up
.
By default, it stores all data in a local SQLite database, and arranges invoices in the "uploads" folder you specify. In general, I think self-hosters will figure it out :)
Inside the application, you'll have to specify your OpenAI API key in the settings, without it the analysis won't work.
Normal people with a full life will have to wait for the SaaS version, if I ever get around to it.