This is a fork of Zotero that adds a Self-Hosted Read Aloud tier, allowing you to use a local Kokoro TTS server instead of Zotero's cloud voices. No account, no internet, no cost.
The companion server package is zotero-kokoro-server (pip install zotero-kokoro-server).
- Node.js 18+ — install via nodejs.org or
brew install node - Python 3 — comes with macOS, or
brew install python - Git with submodule support
git clone --recurse-submodules https://github.com/Helios113/zotero.git
cd zoteroIf you already cloned without --recurse-submodules:
git submodule update --init --recursivenpm install
cd reader && npm install && cd ..npm run build-appThis does everything in one shot:
- Compiles the reader (webpack)
- Transpiles JS/JSX and compiles SCSS
- Packages it all into
app/staging/Zotero.app
First build takes ~2–3 minutes. Subsequent builds are faster.
npm run run-appOr double-click app/staging/Zotero.app.
pip install zotero-kokoro-serverRequires Python 3.10–3.12.
zotero-kokoro-serverThe first run downloads the Kokoro model weights (~300 MB) from Hugging Face. After that it works fully offline.
Open http://localhost:8880 in your browser to access the voice playground and settings UI.
In the built Zotero app, open Edit → Preferences → General and scroll to Read Aloud — Self-Hosted Server. The URL defaults to http://127.0.0.1:8880 — leave it as-is if you're running the server locally.
Then open any PDF in the Reader, click the Read Aloud button, expand the options panel, and select Self-Hosted from the Voice Mode dropdown.
npm run build-app && npm run run-appIf you only changed non-reader JS/CSS (i.e. nothing inside reader/src/), you can skip the reader webpack step for a faster build — but build-app is always safe to run in full.