Housni Yakoob6 downloadsKeep a catalog of budget items, build budgets from it, and track spending, credits and balances.
Earmark is an Obsidian plugin. Keep a catalog of budget items, build budgets from it, and track spending, credits and balances. Everything lives in your notes as YAML inside fenced code blocks.
Until Earmark is in the community plugin store, install it with BRAT:
housni/earmark.To install by hand instead, download main.js, manifest.json and styles.css from the latest release into <vault>/.obsidian/plugins/earmark/.
Earmark needs Obsidian 1.13.0 or later.
Earmark/Catalog.md. You can change the folder and the catalog note's name in settings. Click Add item to add rent, vet bills, visa fees and so on.YYYY-MM MMMM). It then lets you pick items from the catalog and creates a budget note.Budget items are copies of catalog items, so editing the catalog never changes a past budget. Refresh from catalog pulls the current values while keeping your spending.
Both the catalog and budgets:
Frequencies, categories, accounts, priorities, executors, currencies and the title format are all configured in the plugin settings.
Priorities are coloured by level, and overspending and surplus have their own colours. Under Settings → Colour vision you can pick a palette for red-green colour blindness (protanopia, deuteranopia), blue-yellow (tritanopia) or monochrome (achromatopsia). Choosing any of them also adds shapes and labels, so colour is never the only cue:
Help me choose shows the same sample in every palette, so you can pick the one you read most easily.
```budget
title: November 2026
baseCurrency: LKR
rates: { USD: 300 }
items:
- name: Rent
amount: 100000
currency: LKR
category: Housing
account: Common
sourceId: k3f9
transactions:
- { date: 2026-11-03, amount: 100000, note: paid }
credits:
- { source: Bank account, amount: 250000, currency: LKR }
```
You can edit the YAML by hand. Keys you add yourself are kept, but # comments inside the block are lost the next time the plugin saves it. If the YAML doesn't parse, the block shows the error and the plugin won't overwrite it.
npm install
npm run dev # watch build → main.js
npm test # vitest
npm run build # type-check + production build
Symlink this folder into <vault>/.obsidian/plugins/earmark/ and enable the plugin.
See TESTING.md for build options (including Docker), installing into a vault, and a step-by-step walkthrough of every feature with expected results.
CI runs the tests and the build on every push to main and on every pull request. A release is published when you push a version tag.
Start from a clean working tree on an up-to-date main (git status, git pull). Then choose the kind of bump:
| Bump | When | Example |
|---|---|---|
patch |
bug fixes only | 0.1.1 → 0.1.2 |
minor |
new features, existing notes still work | 0.1.1 → 0.2.0 |
major |
breaking changes, e.g. to the YAML format | 0.1.1 → 1.0.0 |
npm version runs version-bump.mjs, which bumps package.json, manifest.json and versions.json. It then commits and tags the new version. Tags have no v prefix (0.1.2), because Obsidian requires the tag to equal the manifest version. Never edit these versions by hand.
With Node installed:
npm version patch # or minor / major
With Docker (no local Node needed):
docker run --rm -u "$(id -u):$(id -g)" -e HOME=/tmp \
-v "$HOME/.config/git/config":/tmp/.config/git/config:ro \
-v "$PWD":/app -w /app \
node:22 npm version patch # or minor / major
node:22, not node:22-slim. npm version needs git, and only the full image includes it.~/.gitconfig, mount -v "$HOME/.gitconfig":/tmp/.gitconfig:ro instead.Either way, check the result before pushing:
git log --oneline -1 # a commit named after the new version, e.g. "0.1.2"
git tag --points-at HEAD # the same version
Pushing happens on the host in both cases, so your normal SSH keys and credentials are used:
git push --follow-tags
The tag starts the release workflow (.github/workflows/release.yml), which:
manifest.json or package.json versionmain.js, manifest.json and styles.css, so anyone can check them with gh attestation verify <file> --repo housni/earmarkBRAT users get the update automatically.
To follow the run and check the release (with the GitHub CLI):
gh run watch # pick the Release run
gh release view 0.1.2 # should list 3 assets
git tag -d 0.1.2 && git reset --hard HEAD~1.0.1.3. Don't move or reuse a tag that has already been pushed, because BRAT and other users may have seen it.