Skip to content

zotio

The trust-and-automation layer for Zotero. Search, export, analytics, and safe writes for your reference library — from the terminal, from a coding agent, or over MCP.

Zotero's GUI is great for reading and citing. It gets painful the moment you need to operate on a library at scale: find every article missing a PDF, catch duplicate \cite{} keys before a submission, export a week of highlights, keep an Obsidian vault in sync, or hand an AI agent trustworthy context. zotio owns that glue — and the risk that comes with it.

How it works

Reads stay on your machine. Writes split by intent: creating a new item (with its attachments/PDFs) prefers the local desktop connector (localhost:23119, no key — the same channel the browser "Save to Zotero" button uses), while everything else — field edits, deletes, enrichment, tag ops, moves, and collections create/update — routes to the Zotero Web API and needs a configured key. Every write is preview-first, the version read happens locally, and the applied change is replayed into your local mirror so a follow-up read sees it.

zotio hybrid routing architecture Hero diagram showing zotio routing reads locally without an API key, writes to Zotero Web API with a key, external metadata providers, local-only desktop commands, local version reads before writes, and replay into the SQLite mirror. zotio hybrid routing Local-fast reads, key-gated cloud writes, and an immediately refreshed local mirror. READ WRITE EXTERNAL LOCAL-only Semantic colors are shared across README diagrams. READ plane Local-first Local Zotero API :23119 Zotero desktop running items list/get collections annotations fulltext Local SQLite mirror Synced cache for compound reads search items audit stats Desktop connector New-item create path create items · attachments · PDFs prefers local · else Web API local reads/creates need no key · cloud writes do CLOUD write path Zotero Web API api.zotero.org Auto-routed mutation target items update/delete/move enrich · tags audit fix collections create/update vault push · journal undo LOCAL-only plane Files · desktop · introspection vault sync items open doctor capabilities EXTERNAL plane Metadata providers CrossRef · OpenAlex Semantic Scholar Unpaywall · OpenCitations zotio routing + safety layer one CLI surface reads new items writes replay → mirror enrich · import local ops
Plane Backend Needs a key?
Read Local Zotero API (localhost:23119) + synced SQLite mirror No
Write — new item Local desktop connector when personal + desktop up; else Web API No (connector path)
Write — everything else Zotero Web API (api.zotero.org) — edits, deletes, enrich, tags, moves Yes — configured once
External CrossRef · OpenAlex · Semantic Scholar · Unpaywall · OpenCitations No (feeds enrich/import)
Local-only Files, desktop launch, vault, introspection No

Run zotio doctor any time to see connectivity, cache freshness, and a writes: line telling you whether write-back is available.

Quickstart

zotio doctor                       # verify Zotero is running and reachable
zotio sync                         # mirror your library to local SQLite
zotio library stats                # see the shape of your library
zotio search 'automation trust' --data-source local --json
zotio annotations timeline --since 2026-05-01 --format markdown > this-week.md

No Zotero yet? zotio demo seeds a sandboxed sample library — 34 classic papers, one genuinely retracted — so every command above works with no desktop app and no API key (ZOTIO_DEMO=1 activates it):

zotio demo tour

New here? Install the CLI, then authenticate if you need writes.

Where to go next