https://github.com/galvez/plainbudget
Minimalist Plain Text Budgeting
https://github.com/galvez/plainbudget
nuxt plaintext spreadsheet vue
Last synced: about 2 months ago
JSON representation
Minimalist Plain Text Budgeting
- Host: GitHub
- URL: https://github.com/galvez/plainbudget
- Owner: galvez
- Created: 2018-05-25T08:36:53.000Z (about 7 years ago)
- Default Branch: main
- Last Pushed: 2025-05-08T13:39:04.000Z (about 2 months ago)
- Last Synced: 2025-05-08T13:41:59.909Z (about 2 months ago)
- Topics: nuxt, plaintext, spreadsheet, vue
- Language: JavaScript
- Homepage:
- Size: 421 KB
- Stars: 168
- Watchers: 6
- Forks: 6
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# PlainBudget
Minimalist plain text budgeting.
[**Read the blog post.**](https://hire.jonasgalvez.com.br/2025/may/8/plainbudget)
[**Get the app.**](https://plainbudget.com/)
```
% npm i pbudget -g
% pbudget -s Budget.txt
% pbudget --stats Budget.txt
% cat Budget.txt | pbudget > Budget.txt
```## Supported Syntax
- **Groups** start with `=` and are used to group values.
- **Flows** start with `+` and are used to express cash flow.
- **Groups** can be referenced in other groups or flows.
- **Multipliers** can added to any referenced group or value.
- Blocks of text with invalid syntax will be ignored and remain intact in the source.
- Circular dependencies (group references) will cause both groups to be ignored.
- Padding is automatically added to the value column.
**Input**
```
= 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
```**Output**
```
= 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
```## Programmatic Usage
```js
import { readFileSync } from 'node:fs'
import { PlainBudget } from 'pbudget'const budget = readFileSync('Budget.txt', 'utf8')
const pbudget = new PlainBudget(budget)
pbudget.process()
console.log(pbudget.renderWithPadding())
pbudget.computeStats()
console.log(pbudget.stats)
```