MarkCalc

approved

by Levis-Code

Spreadsheet-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. - This plugin has not been manually reviewed by Obsidian staff.

1 stars186 downloadsUpdated 1mo agoMIT

MarkCalc

Obsidian plugin Version License: MIT

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.

Why MarkCalc

MarkCalcDataviewStatic tables
Results as plain, portable Markdown❌ (rendered view)
Survives without the plugin / in Git
Computes (formulas, aggregates, lookups)
Cross-note references with auto-recalcpartial
  • Portable results. The computed value is written into the cell. Versionable in Git, printable, readable without the plugin. Dataview renders an ephemeral view that disappears without it — MarkCalc doesn't.
  • Cross-note, like a multi-sheet workbook over your vault. A note can read a table in another note (xcell, xcol, xlookup, xfm); editing the source cascades the recalculation to dependent notes via a padres dependency graph, without scanning the whole vault.
  • Context-aware autocomplete. Inside the <!-- calc: --> comment, the editor suggests functions (with signature, description and example), table columns, @name tables and note names — derived from the formula itself.
  • Bilingual (EN / ES). Interface and editor helpers in English or Spanish, with a selector in settings (or automatic, following Obsidian's language).
  • Zero dependencies. The engine evaluates with native JavaScript. User functions (calc-functions / calc-js) are embedded in the note itself.

Example

| 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).

Cross-note in action

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.

Installation

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.

Documentation

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.

Development

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.

Security

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.

Support

If MarkCalc saves you time and you'd like to support its development:

☕ Buy me a coffee

License

MIT © 2026 Levis-Code

For plugin developers

Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.