I tried every budgeting app out there. They're too much for me. Big commitment to get your data in, a hassle to get it out. Lots of things I didn't need.
So I gave up and built my own thing.
I wanted a simple textual way to represent my expenses and income, and get savings projections and expense distribution from it. I also wanted my data to be easily portable — plain text, not a binary or CSV file. I didn't want a spreadsheet, I wanted computable plain text.
In short, I needed a domain-specific language (DSL).
First, I needed a way to group expenses:
= Main
- 2000 Rent
- 1000 Utilities
- 500 Leisure
= <Group Label>
- <Value> <Label>
Then, a way to multiply values:
= Groceries
- 10 Coffee x 12
- 10 Milk x 12
- 20 Cereal x 6
= <Group Label>
- <Value> <Label> x <Multiplier>
And finally, a way to express cash flow:
+ 10000 Income
- Housing
- Office
- Groceries
+ <Group Label> or <Value> <Label>
- <Value> <Label>
- <Group Label>
- <Value> <Label> x <Multiplier>
And there we have it, the PlainBudget DSL.
It allows you to represent groups (expense groups) and flows (cash flows).
Groups always start with =
and flows always start with +
.
And any group can be referenced everywhere, be it other groups or flows.
This is the final transformation made possible:
= Main
- 2000 Rent
- 1000 Utilities
- 500 Leisure
= Groceries
- 10 Coffee x 12
- 10 Milk x 12
- 20 Cereal x 6
= Income
- 5000 Salary
- 1000 Side hustle
+ Income
- Main
- Groceries
= 3500 Main
- 2000 Rent
- 1000 Utilities
- 500 Leisure
= 360 Groceries
- 10 Coffee x 12
- 10 Milk x 12
- 20 Cereal x 6
= 6000 Income
- 5000 Salary
- 1000 Side hustle
+ 6000 Income
- 3500 Main
- 360 Groceries
= 2140
It safely ignores and retains any other text inbetween groups and flows that doesn't follow the DSL syntax. Using any kind of invalid syntax will simply cause the whole block of text to be ignored and printed as-is by the processor.
⁂
What you've just seen is now seven years old.
The first version of the CLI remained without updates for a long time, and had two very annoying bugs: non-conforming blocks were removed, and groups couldn't be referenced in flows and credit operations.
The v1.0.0
release, just pushed to GitHub and npm, solves all these issues and make the example above work flawlessly.
It also features a comprehensive test suite now:

Going further
I've been using PlainBudget for my personal financial planning for several years now. One thing I've always wanted was savings projections, to motivate me to save money. And also, a quick way to see where my money goes.
The PlainBudget class now includes a computeStats()
method, which gives you projections
and distribution
. Here's what it looks like:
= 3500 Housing
- 2000 Rent
- 1000 Utilities
- 500 Leisure
= 360 Groceries
- 10 Coffee x 12
- 10 Milk x 12
- 20 Cereal x 6
= 6000 Income
- 5000 Salary
- 1000 Side hustle
+ 6000 Income
- 3500 Housing
- 360 Groceries
- 50 Foobar x 2
= 2140
{
distribution: [
[ 'Rent', 0.33333 ],
[ 'Utilities', 0.16667 ],
[ 'Leisure', 0.08333 ],
[ 'Coffee', 0.02 ],
[ 'Milk', 0.02 ],
[ 'Cereal', 0.02 ],
[ 'Foobar', 0.01667 ]
],
projections: {
savings: 2040,
sixmonths: 14280,
oneyear: 26520,
threeyears: 75480,
fiveyears: 124440,
tenyears: 246840
}
}
So far, the way I've used this was through the CLI.
I always thought about how nice it would be to have a quick glance at these stats in an equally minimal interface. And now, with the extra data and other refinements to the parser and processor, it's possible.
Building an app
It's that time of the year:

If you're like me, you probably have half a dozen domains registered for ideas you had but never had the time to work on. Well, not this time.
This time I dove head first into Electron. I used electron-vite's Vue starter and proceeded to experiment with dozens of different iterations of a minimal UI, and also learning how to implement all the essentials: controlling window display aspects and opening and saving files. Electron ain't bad, indeed!
Only thing missing now is getting an Apple Developer account and being able to sign the app (and publish it to the Mac App Store).
And here it is, the very first release of PlainBudget, the desktop app:

You can purchase the beta here. The CLI remains free and open source. If there's enough interest in the Desktop app, I'll make sure it lands on the Mac App Store and receives the love of a real designer (I DABBLE, okay) in its next iterations.
The purchase also includes the final version once it's released!
Currently the app is unsigned, so you have to manually authorize it.
Don't hesitate to reach out with bugs, suggestions, feature requests — or if you had any problems downloading the app after the Stripe checkout.