A Zotero plugin that merges duplicate items by DOI only, keeping the newest record's field values and preserving every collection the duplicates appeared in.
Zotero's built-in duplicate detector is fuzzy by design — it inspects titles, creators, and years. That is the right default for most libraries but a poor fit for curated collections where the DOI is the source of truth. Argus One does one job: it groups items that share a normalized DOI, picks a survivor by dateAdded, fills missing fields from older copies, unions tags / related items / collection memberships, re-parents attachments and notes, and trashes the older records inside a single Zotero transaction.
- Zotero 9 and later (see
src/argus-one/manifest.json) - Cross-platform (Windows, macOS, Linux)
- Download the latest
argus-one-<version>.xpifrom the Releases page. - In Zotero, open Tools → Plugins.
- Click the gear icon → Install Plugin From File…
- Select the downloaded
.xpi. - Restart Zotero if prompted.
- Open Tools → Argus One: merge DOI duplicates…
- A confirmation dialog reports how many DOI duplicate groups were found and how many items will be moved to trash.
- Confirm to merge. All work runs inside one Zotero database transaction, so any error rolls the entire operation back.
- Empty the Zotero trash yourself when you have verified the result.
For every group of items that share the same normalized DOI:
- Pick the newest by
dateAdded(ties broken by higheritemID). - Newest wins on conflicts. If the survivor already has a value in a field, that value is kept. Empty fields are filled from older siblings.
- Collections are unioned. If the DOI appeared in collections
AandB, the survivor ends up in both. - Tags, related items, and creators are unioned across all duplicates (creators only if the survivor has none).
- Attachments and child notes of older copies are re-parented to the survivor.
- Older copies move to trash — never deleted permanently.
Case-insensitive. Strips https://doi.org/, https://dx.doi.org/, and doi: prefixes. Items without a dedicated DOI field also have their Extra field scanned for DOI: ….
- Items without a DOI are ignored.
- Group libraries are not touched (user library only in this version).
- No fuzzy title matching — use Zotero's built-in Duplicate Items view for that.
cd src/argus-one
Compress-Archive -Path * -DestinationPath ../../argus-one-0.1.0.xpi -Force
Rename-Item ../../argus-one-0.1.0.xpi.zip ../../argus-one-0.1.0.xpiOr with zip:
cd src/argus-one
zip -r ../../argus-one-0.1.0.xpi . -x "*.DS_Store"Full vignette and walkthrough: https://cttir.github.io/argus-one/
If Argus One supports your research, please cite it.
BibTeX
@software{heller_argus_one_2026,
author = {Heller, Raban},
title = {{Argus One: DOI-based duplicate merger for Zotero}},
year = {2026},
version = {0.1.0},
url = {https://github.com/CTTIR/argus-one},
license = {MIT}
}APA
Heller, R. (2026). Argus One: DOI-based duplicate merger for Zotero (Version 0.1.0) [Computer software]. https://github.com/CTTIR/argus-one
DOI: none yet. To mint a permanent DOI, enable the Zenodo–GitHub integration and publish a release. Once minted, paste the DOI into the
doi:field ofCITATION.cffand into the BibTeX entry above asdoi = {10.xxxx/zenodo.xxxxxxx}.
- Documentation: https://cttir.github.io/argus-one/
- Issues: https://github.com/CTTIR/argus-one/issues
- License: MIT
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md