Levis-Code188 downloadsSpreadsheet-style formulas in Markdown tables. Results live as plain, portable text, not a rendered view. Aggregates, lookups, dates, custom functions, and cross-note references with automatic recalculation.
Spreadsheet-style formulas in Markdown tables — where the results stay as plain, portable text.
Compute inside your notes (budgets, ledgers, trackers, data tables) without leaving
Obsidian, and without locking the results into a plugin. Values are written into
the cells as real Markdown, so the note stays readable — and the numbers stay there —
even if you move the .md to GitHub, another editor, or another vault.
| MarkCalc | Dataview | Static tables | |
|---|---|---|---|
| Results as plain, portable Markdown | ✅ | ❌ (rendered view) | — |
| Survives without the plugin / in Git | ✅ | ❌ | ✅ |
| Computes (formulas, aggregates, lookups) | ✅ | ✅ | ❌ |
| Cross-note references with auto-recalc | ✅ | partial | ❌ |
xcell, xcol, xlookup, xfm); editing the source
cascades the recalculation to dependent notes via a padres dependency graph,
without scanning the whole vault.<!-- calc: --> comment, the editor
suggests functions (with signature, description and example), table columns,
@name tables and note names — derived from the formula itself.calc-functions / calc-js) are embedded in the note itself.| Product | Qty | Price | Total |
|---------|----:|------:|------:|
| Coffee | 2 | 3.5 | |
| Tea | 4 | 2.0 | |
<!-- calc: $Total = $Qty * $Price -->
On recalculation, the Total column is filled in. The formula stays in the comment
(the source of truth — idempotent).
A Ledger note names its table @name = accounts; a Balance Sheet note pulls
totals from it with xcol + sumIf, and a check row stays at 0 only if the books
balance. Change a number in the ledger and the balance updates on its own. Neither
Dataview nor a static table can do that in plain Markdown.
From the Community Plugins store (once approved): Settings → Community plugins → Browse → search MarkCalc.
Manual: download main.js, manifest.json and styles.css from the
latest release, drop them in
<your-vault>/.obsidian/plugins/markcalc/, then enable MarkCalc in Settings.
Full reference (every function, cross-note, security, editor helpers) in
MarkCalc-docs.md — Spanish: MarkCalc-docs.es.md.
Ready-to-run examples in the demo/ folder.
main.js is a generated artifact — never edit it by hand. Edit the sources in
src/ and rebuild:
node src/build.js # concatenates src/engine.js + src/wrapper.js -> main.js
node src/test/run.js # engine test suite (~42 assertions, no dependencies)
node src/test/i18n.js # bilingual catalog integrity
src/engine.js — pure engine (no dependencies, testable with Node).src/wrapper.js — Obsidian glue (Plugin, EditorSuggest, settings).Tagging a release (git tag 0.10.0 && git push --tags) triggers a CI workflow that
builds, tests, and publishes the release assets automatically.
MarkCalc evaluates note content as trusted code (same model as DataviewJS /
Templater): formulas and calc-js blocks run via new Function. Use it only in
notes you write yourself. Details in the docs, §7.
If MarkCalc saves you time and you'd like to support its development:
MIT © 2026 Levis-Code