Yogesh Jadhav61 downloadsSpend, billing-cycle and map dashboards from a markdown transaction inbox.
Money Dashboard turns a plain markdown table of transactions into three pages inside Obsidian:
| Page | Code block | What it shows |
|---|---|---|
| Money Dashboard | money-dashboard |
Net spend for a month, a trend, spend by category, card and method, top merchants, and a filterable transaction table |
| Money Accounts | money-accounts |
Spend per card on the card's own billing cycle, with the statement date, due date and credit limit used |
| Money Map | money-map |
A heatmap of where the money went, weighted by amount |
Everything is read from notes in your vault. Nothing is sent anywhere, except map tile requests on the Money Map page (see Network use).
Money folder (you can change the folder in the plugin settings), then opens Money Dashboard:| Note | Purpose |
|---|---|
Expenses.md |
The inbox: one row per transaction for the current month |
Money Accounts Config.md |
Billing cycle settings, one row per account |
Money Dashboard.md, Money Accounts.md, Money Map.md |
The three pages |
YYYY - MM-MMMM.md |
A sample archived month (sample data only) |
The command never overwrites a note that already exists. To start without sample rows, run Money Dashboard: Set up money notes instead.
You can also put any of the three code blocks in a note of your own:
```money-dashboard
```
The short version is below. The full format is in docs/data-format.md.
%% money:inbox:start %% followed by a table. New rows go at the end of the file.2026 - 07-July, with its table between %% money:txns:start %% and %% money:txns:end %%. Any folder works: notes are found by marker and by name, never by path.Direction column (debit or credit) carries the sign.When a month is in both the inbox and a month note, it is never counted twice. The inbox wins for the current month, and the month note wins for a past month. The page tells you when this happens.
While a month is still in the inbox, you can set Category from a dropdown, and click Merchant or Description to edit it. The change is written straight into the inbox row. The write reads the file again first, so a row added in the meantime is never lost. To delete a row, press 🗑 at the end of it and confirm. The row is removed from the inbox and kept in .archive-backups/Deleted rows.md next to the inbox, so it can be pasted back under the inbox marker. Rows of archived months are read-only on the page, and have no delete button.
Two Apple Shortcuts turn a bank SMS into an inbox row. A language model reads the message and writes the row, so you do not type anything.
| Shortcut | What it does | Link |
|---|---|---|
| Log Transaction | Runs from an automation when a bank SMS arrives | Get Log Transaction |
| Log Transaction from Share Sheet | Share an SMS to it by hand, for a message the automation missed | Get Log Transaction from Share Sheet |
Open each link and add the shortcut.
Copy the prompt from docs/shortcut-prompt.md into a note in your vault, for example ExpensePrompt.md. Replace every <...> placeholder with your own name, accounts and merchant spellings.
In each shortcut, point the two file actions at your own files:
ExpensePrompt.md.Expenses.md.The shared shortcuts still point at the author's folder, so this step is needed.
In Append to Text File, check that Make New Line is on. When it is off, two rows can join onto one line and both are lost.
In Log Transaction, the first Use Model action asks whether the message is a transaction. It also names a mobile operator whose messages should be ignored. Change that name to your own operator, or remove it.
Log Transaction runs from Personal Automations in the Shortcuts app. Create one automation for each word your bank uses in its SMS:
debited.Repeat for each word:
| Message contains | Catches |
|---|---|
debited |
Money out |
credited |
Money in, and card refunds |
deposited |
Money in, from banks that say "deposited" |
Add a word for any other phrase your bank uses, for example spent or withdrawn.
When an automation misses a message, open the SMS, share it, and choose Log Transaction from Share Sheet.
| Setting | Value | Why |
|---|---|---|
| Append to Text File, Make New Line | On | Off lets two rows join onto one line, and both are lost |
The If condition |
Response is Yes |
A bare If Response also passes a No |
| Format Date | yyyy-MM-dd HH:mm |
This is the When value |
Run Money Dashboard: Add expense, or press + in the Money Dashboard header. Fill in the form and press Add (or Cmd/Ctrl+Enter).
MANUAL-YYYYMMDDHHmmssSSS, so two real purchases that look alike are never merged as duplicates.The inbox holds the current month. When a month ends, move it into its own note:
What archiving does, in this order:
.archive-backups/ next to it. Obsidian does not index that folder.2026 - 08-August is used wherever it is. If there is none, one is created in the Month notes folder from the settings. Duplicates are dropped (by Ref, or by date, amount and merchant), merchant spellings are unified, and the money: frontmatter totals are written.Only the table between the txns markers and the plugin's own keys under money: change. Anything else you wrote in a month note, its other frontmatter, and your own keys under money: (such as currency) are kept. A monthly note with no money section yet gets one appended.
Archiving refuses, and changes nothing, while a row in a completed month has no category. The preview lists those rows. Rows from the current month, and rows dated in the future, stay in the inbox.
The Money Map page downloads map tiles from tile.openstreetmap.org. Your transactions are never sent, but each tile request names a zoom level and a map square, so the tile server can see which areas you look at, and those are the areas where you spend. You can turn tiles off, or point them at another tile server, in the plugin settings. Map data © OpenStreetMap contributors. Please respect the OpenStreetMap tile usage policy.
The plugin makes no other network requests and collects no telemetry.
| Setting | Default |
|---|---|
| Currency symbol | ₹ |
| Number format | Indian (1,56,729; L and Cr). International is 156,729; k, M and B |
| Category list | 24 categories, one per line |
| Income, Transfer and Investments categories | Income, Transfer, Investments |
| Monthly spending budgets | No limits configured |
| Rows before "Show all" | 40 |
| Months on the trend chart | 12 |
| Load map tiles | On |
| Tile URL | https://tile.openstreetmap.org/{z}/{x}/{y}.png |
| Folder for new notes | Money |
| Month notes folder | Money/Months |
| One subfolder per year | On |
Set a recurring monthly limit for each spending category under Settings → Money Dashboard → Monthly spending budgets. Enter an amount in your configured currency, without currency symbols or separators. Leave it blank to remove the limit; 0 means no spending is budgeted. Income, transfers and investments are excluded.
The dashboard compares each budget with the selected month's net category spending (after refunds) in a horizontal bar graph. Spending and budget bars share one amount scale; overspending is highlighted and the amount left or over budget is labelled. Refunds exceeding spending draw to the left of zero, and categories with no spending show zero. The current limits apply to every month you view; changing a limit also changes comparisons for past months. Budgets use category names, and a saved category stays in the budget settings if you remove it from the category picker, so you can still edit or clear its limit.
npm install
npm test # vitest
npm run lint # the rules the Obsidian plugin review runs
npm run build # writes main.js
To try it in a vault, copy main.js, manifest.json and styles.css into <vault>/.obsidian/plugins/money-dashboard/ and enable the plugin.
MIT. See LICENSE.