A simple way to budget your money and reconcile your statements.
You can try it out here:
https://forevermatt.github.io/budget/
WARNING:
This is a beta version (or earlier), so it very likely still has some bugs.
- As easy-to-use as possible.
- "Offline first" approach.
- As much of it as possible should be completely free.
- Minimize cost of operations/infrastructure.
- For features that require some level of infrastructure (and therefore potentially incur a cost), keep the cost really low (see priority 4).
Budget
: A user's plan for how they want to spend their money in a given month.BudgetApp
: This budgeting application, probably running in a user's browser.Category
: Part of a user's Budget, indicating how much they are willing to spend on a particular type of expense each month.DataService
: Something to handle a particular collection of data. For example, there may be anaccountService
(for handling data about accounts), acategoryService
(for handling data about categories), etc.DataStore
: A way to persist the application's data (such aslocalStorage
).DataManager
: The gate-keeper for managing the application logic's interaction with the data structures.id
: Astring
that uniquely identifiers an item within the context of that type of item. For example, there should only be one Account with a givenid
. Also note that anid
must be astring
(orundefined
); otherwise comparison ofid
values is inconsistent.Page
: A section of the BudgetApp, such as the category-list page or the expense-amount page.
Note: Data structure versions do NOT necessarily correlate with application versions. For example, version 0.2.1 of the application may still use data structure version 0.1.0 (theoretically).
The goal is to provide an automated migration process from one data structure version to the next.
-
Data structure version 0.1.0
{ "version": "*data structure version of this data*", "accounts": { "*account id*": { "name": "*account name*", "id": *account id* }, *...* }, "budget": { "*YYYY-MM*": { "*category id*": { "budgetedAmount": *allotted amount for this month, in cents*, "remaining": *amount left after subtacting this month's* *activity from last month's remaining amount for* *this category* }, *...* }, *...* }, "categories": { "*category id*": { "name": "*category name*", "id": *category id* }, *...* }, "incomeSources": { "byName": { "*payee name*": true, *...* } }, "payees": { "byName": { "*payee name*": true, *...* } }, "transactions": { "*YYYY-MM*": [ { "accountId": *account id*, "amountTotal": *transaction total, in cents*, "categories": { "*category id*": { "name": "*category name*", "amount": *amount from this category, in cents* }, *...* }, "whenTimestamp": *date/time of transaction, as JS unix timestamp*, "who": "*name of payee*" } ] } }