The Problem

Zotero's built-in note editor is basic. Researchers juggle notes, annotations, and PDFs across separate tools because Zotero itself cannot handle linked notes, templates, Markdown sync, or flexible export. Better Notes (BN) closes that gap by turning Zotero into the single workspace for the entire reading-to-writing pipeline.

What This Does

BN is a Zotero plugin that replaces the stock note editor with a full-featured one. It supports note linking (inbound/outbound relations), customizable note templates, two-way Markdown file sync, and export to Markdown, DOCX, PDF, and mind maps. It also adds an outline, context pane, and image viewer to the note workspace.

The core logic lives in src/ (124 files, mostly TypeScript), while the actual plugin payload is assembled in addon/ (227 files) — the XPI structure Zotero loads. The src/extras/convertWorker/main.ts entry point runs a background worker for format conversion; src/index.ts is the plugin's main entry.

How It Is Wired

Execution starts at src/index.ts, which registers the plugin with Zotero's lifecycle hooks. From there, control flows into the note editor and command modules, which call into the conversion worker (src/extras/convertWorker/main.ts) for export and import operations. The worker runs as a separate process, so heavy conversions do not block the Zotero UI.

The addon/chrome/content/ folder holds the HTML shells for the editor (exportNotes.xhtml), the bubble map (bubbleMap.html), and DOCX export (docxExport.html). The addon/bootstrap.js file is the XPI bootstrap that Zotero executes on install. The typings/ folder (8 files) gives TypeScript definitions for Zotero's API, which is what lets the source compile against an external host.

The widest blast radius sits in the note editor module under src/ — nearly every feature (linking, templates, sync, export) routes through it. Changing its data model affects all downstream features. The module graph shows a hub-and-spoke pattern with the editor at the center; there is no mapped cycle, but a change to the editor's state management will ripple through the entire feature set.

The wiring has not been fully mapped for this repository — no internal call graph or file-by-file responsibility block exists beyond what the structure shows.

How To Use It

Setup: Clone and install dependencies.

git clone https://github.com/moses-y/zotero-better-notes
cd zotero-better-notes
npm install

Build: The package.json defines the build scripts. Run npm run build to produce the .xpi file in the build/ directory. The .env.example file lists any required environment variables (likely Zotero plugin signing keys — the repo does not document them beyond the template).

Install: In Zotero, go to Tools > Plugins, click the gear icon, select Install Add-on from file, and pick the built .xpi.

Run: There is no standalone runtime — the plugin activates inside Zotero once installed. The README's quick start covers opening note tabs and using the editor.

Real-World Use

A researcher reads a paper in Zotero, highlights three key passages, then double-clicks the note item to open the BN tab. They press a template shortcut to auto-generate a structured summary from the annotations, link it to two related notes, and export the result to Markdown for their Obsidian vault. The two-way sync keeps the Zotero note and the Markdown file in lockstep.

Code Health & Issues

No measured static analysis has run for this repository yet. Structural observations from the file tree:

  • Low — Tests exist (20 files in test/) and CI is configured (.github/workflows/CI.yml), but there is no coverage report or test count in the README. Verify coverage before relying on the suite.
  • Low — The repo is a fork of windingwind/zotero-better-notes (8,111 stars) with zero stars and no topics. Verify against the upstream for recent fixes; the fork may lag.
  • Lowdocs/ holds only 3 files, thin for a plugin this feature-dense. Expect to read source for non-obvious behavior.

The Bottom Line

This is a mature, feature-rich Zotero plugin that solves a real workflow problem — the upstream has 8,000+ stars for a reason. The fork adds nothing visible over upstream, so use it only if you need the exact state of this tree. For anyone building on it, the TypeScript source and Zotero typings make it approachable, but the editor-centric hub will make deep changes expensive.