Your Zotero library, your reader, your notes — one seamless workspace inside Obsidian.
ZotFlow is a community plugin for Obsidian that brings the full power of Zotero into your vault. Read papers, annotate PDFs, generate templated source notes, and cite literature — all without ever leaving Obsidian.

If any of these sound like you, ZotFlow was built for you:
A full-featured PDF/EPUB/HTML reader, embedded right in your workspace and themed to match Obsidian. Highlight, underline, draw, add sticky notes, capture image regions — every annotation type Zotero supports, in a window that finally feels like home.

Pull items, metadata, and annotations from Zotero — and push your changes back. Configure each library independently as Bidirectional, Read-Only, or Ignored. When conflicts happen, a field-level diff viewer lets you decide what to keep.

Every Zotero item gets one auto-generated Markdown note, rendered with LiquidJS templates you fully control.

Create, edit, and delete Zotero child notes without leaving Obsidian. Right-click any item in the Tree View to add a note, edit it in a dedicated tab with Obsidian's full Markdown editor, or unlock its region inside the parent source note and edit in place. Every change auto-saves and syncs back to Zotero.

Have PDFs or EPUBs that aren't in Zotero? Open them with the same reader. Annotations save into a co-located .zf.json sidecar — no Zotero account required. Perfect for personal notes, downloaded papers, or books you're reading.

Insert citations as Pandoc ([@key]), Wikilink ([[Source/@key|Author (year)]]), Footnote, or raw citekey — via drag-and-drop from the tree view, autocomplete with a trigger string (@@), or copy-from-reader hotkeys. Include annotation context (page numbers, quoted text) automatically.

Browse your entire Zotero universe — libraries, collections, items, attachments — in a fast virtualized sidebar tree. Search, sort, drag, right-click. Click any attachment to open it; drag any item to cite it.
Or open the search modal from the command palette, type to filter your library, and hit Enter to jump to an item or open its attachment.

SecretStorage, never in synced data.json.New to ZotFlow? Start here:
👉 Read the Getting Started guide — it introduces ZotFlow's key concepts and design philosophy first, then walks you through installation and your first sync.
For the impatient:
Full guides live in docs/:
Direct link: https://community.obsidian.md/plugins/zotflow
For pre-release builds, install via BRAT:
duanxianpi/obsidian-zotflowSee the Getting Started guide for step-by-step setup.
ZotFlow uses a Main Thread + Web Worker split for responsiveness:
Communication: Comlink (main ↔ worker) and Penpal (main ↔ reader iframe).
git clone https://github.com/duanxianpi/obsidian-zotflow.git --recursive
cd obsidian-zotflow
npm install
npm run build:ci # Full CI build (PDF.js + reader + plugin)
npm run dev:plugin # esbuild watch mode (plugin)
npm run dev:reader # webpack watch mode (reader, separate terminal)
npm run lint
Copy main.js, manifest.json, and styles.css to:
<vault>/.obsidian/plugins/obsidian-zotflow/
Reload Obsidian and enable the plugin.
SecretStorage.eval, no remote code.Xianpi Duan — GitHub
Thanks for checking out ZotFlow! I'm currently a student building this on nights and weekends. If it helps your research, a small tip keeps the features shipping.
ZotFlow stands on the shoulders of some incredible open-source work. Huge thanks to the teams and individuals behind these projects — they inspired the design, shaped the architecture, and in some cases provided the actual engine running inside ZotFlow:
Have ideas or found a bug? Join the Discord!