No description
Find a file
2026-06-29 18:15:00 -05:00
assets Add demo GIF to README 2026-06-29 18:15:00 -05:00
src 0.0.4: fix irregular whitespace (BOM literal -> \uFEFF) flagged in review 2026-06-15 19:07:32 -05:00
test Cite Engine v0.0.1 — drift-proof closed-corpus citations 2026-06-14 11:22:59 -05:00
.gitignore Cite Engine v0.0.1 — drift-proof closed-corpus citations 2026-06-14 11:22:59 -05:00
esbuild.config.mjs Cite Engine v0.0.1 — drift-proof closed-corpus citations 2026-06-14 11:22:59 -05:00
LICENSE Cite Engine v0.0.1 — drift-proof closed-corpus citations 2026-06-14 11:22:59 -05:00
main.js 0.0.4: fix irregular whitespace (BOM literal -> \uFEFF) flagged in review 2026-06-15 19:07:32 -05:00
manifest.json 0.0.5: plain-language description + README opening 2026-06-29 13:25:31 -05:00
package-lock.json Cite Engine v0.0.1 — drift-proof closed-corpus citations 2026-06-14 11:22:59 -05:00
package.json 0.0.5: plain-language description + README opening 2026-06-29 13:25:31 -05:00
README.md Add demo GIF to README 2026-06-29 18:15:00 -05:00
tsconfig.json Cite Engine v0.0.1 — drift-proof closed-corpus citations 2026-06-14 11:22:59 -05:00
versions.json 0.0.5: plain-language description + README opening 2026-06-29 13:25:31 -05:00

Cite Engine

You paste a quote into your writeup, then later edit or reword the source note. The link still works, so Obsidian shows everything as fine, but the words you quoted no longer match the source, and nothing warns you. Cite Engine catches that.

It stamps your source notes, snapshots each quote at the moment you cite it, and an integrity check re-reads your sources and flags any quote that has drifted. No AI touches your citations, so it can never invent one, and it never rewrites your prose. It just tells you which quotes to look at.

Works alongside Zotero, the Web Clipper, or any workflow where you keep your sources as notes in your vault.

Cite Engine flags a quote that no longer matches its source

Three commands

  1. Stamp source — run on a clipped note. Adds a stable citekey to frontmatter (from author / year / title) and a ^block-id to every passage. Idempotent.
  2. Cite a passage — fuzzy-pick a passage from your stamped sources and insert a live block-ref citation [[citekey#^blk|p. NN]]. There is no free-text path, so you cannot cite something that doesn't exist.
  3. Integrity check — scan the active note; flags any citation that no longer resolves, and any quoted text that has drifted from its source block.

A quote icon in the left ribbon also runs Cite a passage.

Data model

A source note carries citekey in frontmatter and ^block-ids on its passages. A citation is a native block ref plus a page locator. It renders live, so it can't drift. Resolution is by citekey (content-derived, stable), independent of filename, so renames don't break anything.

Install

From Community Plugins: Settings, Community plugins, Browse, search "Cite Engine".

Beta / testing via BRAT: install the BRAT plugin, run Add a beta plugin, and paste Flyingmiata-droid/cite-engine.

Manual: copy main.js, manifest.json, versions.json into <your-vault>/.obsidian/plugins/cite-engine/, then enable in Settings, Community plugins.

Develop

npm install
npm run build      # bundle -> main.js
npm test           # core logic: G1 no-fabrication, G2 drift-proof
npx tsc --noEmit   # typecheck

The citation logic lives in src/core.ts with no Obsidian imports, so it's unit tested headl