{"id":19776796,"url":"https://github.com/chenglongma/zoplicate","last_synced_at":"2026-04-16T13:01:38.680Z","repository":{"id":205776594,"uuid":"711394431","full_name":"ChenglongMa/zoplicate","owner":"ChenglongMa","description":"A plugin that does one thing only: Detect and manage duplicate items in Zotero.","archived":false,"fork":false,"pushed_at":"2026-04-16T04:03:23.000Z","size":3784,"stargazers_count":855,"open_issues_count":51,"forks_count":12,"subscribers_count":5,"default_branch":"main","last_synced_at":"2026-04-16T05:48:46.781Z","etag":null,"topics":["duplicate-detection","zotero","zotero-addon","zotero-plugin","zotero6","zotero7","zotero8"],"latest_commit_sha":null,"homepage":"https://chenglongma.com/zoplicate/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ChenglongMa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["ChenglongMa"],"buy_me_a_coffee":"chenglongma","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"lfx_crowdfunding":null,"custom":["https://www.paypal.me/imchenglong"]}},"created_at":"2023-10-29T05:52:27.000Z","updated_at":"2026-04-16T04:03:27.000Z","dependencies_parsed_at":"2023-12-16T16:25:18.255Z","dependency_job_id":"4edf50b5-26b6-4b20-980e-faec23e845b7","html_url":"https://github.com/ChenglongMa/zoplicate","commit_stats":null,"previous_names":["chenglongma/zoplicate"],"tags_count":21,"template":false,"template_full_name":"windingwind/zotero-plugin-template","purl":"pkg:github/ChenglongMa/zoplicate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChenglongMa%2Fzoplicate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChenglongMa%2Fzoplicate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChenglongMa%2Fzoplicate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChenglongMa%2Fzoplicate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ChenglongMa","download_url":"https://codeload.github.com/ChenglongMa/zoplicate/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChenglongMa%2Fzoplicate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31886937,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-16T11:36:10.202Z","status":"ssl_error","status_checked_at":"2026-04-16T11:36:09.652Z","response_time":69,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["duplicate-detection","zotero","zotero-addon","zotero-plugin","zotero6","zotero7","zotero8"],"created_at":"2024-11-12T05:21:54.588Z","updated_at":"2026-04-16T13:01:38.673Z","avatar_url":"https://github.com/ChenglongMa.png","language":"TypeScript","funding_links":["https://github.com/sponsors/ChenglongMa","https://buymeacoffee.com/chenglongma","https://www.paypal.me/imchenglong"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n    \u003cimg src=\"./docs/banner.png\" alt=\"zoplicate banner\"\u003e\n\u003c/div\u003e\n\n👉\n[![zotero target version](https://img.shields.io/badge/Zotero-9-green?style=flat-square\u0026logo=zotero\u0026logoColor=CC2936)](https://www.zotero.org)\n[![Version for Zotero 9](https://img.shields.io/github/package-json/v/ChenglongMa/zoplicate)](https://github.com/ChenglongMa/zoplicate/releases/latest)\n[![Downloads for Zotero 9](https://img.shields.io/github/downloads/ChenglongMa/zoplicate/total)](https://github.com/ChenglongMa/zoplicate/releases/latest)👈\n\n![GitHub License](https://img.shields.io/github/license/ChenglongMa/zoplicate)\n[![Using Zotero Plugin Template](https://img.shields.io/badge/Using-Zotero%20Plugin%20Template-blue?style=flat-square\u0026logo=github)](https://github.com/windingwind/zotero-plugin-template)\n[![GitHub Repo stars](https://img.shields.io/github/stars/ChenglongMa/zoplicate)](https://github.com/ChenglongMa/zoplicate)\n[![DOI](https://zenodo.org/badge/711394431.svg)](https://doi.org/10.5281/zenodo.16986945)\n\n----\n\n\u003cdiv align=\"center\" style=\"margin-bottom: 25px;\"\u003e\n    English | \u003ca href=\"./README_CN.md\"\u003e简体中文\u003c/a\u003e | \u003ca href=\"https://citationstyler.com/wissen/zotero-plugin-zoplicate-einfach-duplikate-erkennen/\" target=\"_blank\"\u003eDeutsch\u003c/a\u003e* | \u003ca href=\"https://docs.zotero-fr.org/kbfr/kbfr_zoplicate/\" target=\"_blank\"\u003eFrench\u003c/a\u003e**\n\u003c/div\u003e\n\n\n\u0026emsp; _* Many thanks to **Patrick O'Brien** for the German tutorial._\n\n\u0026emsp; _** Many thanks to [**Frédérique Flamerie**](https://github.com/fflamerie) for the French tutorial._\n\nA plugin that does one thing only: **Detect** and **Manage** duplicate items in [![zotero](https://www.zotero.org/support/lib/exe/fetch.php?tok=2735f1\u0026media=https%3A%2F%2Fwww.zotero.org%2Fstatic%2Fimages%2Fpromote%2Fzotero-logo-128x31.png)](https://www.zotero.org/).\n\n# Main Features\n\n* **Duplicates Detection**\n  * Detects if newly imported items are duplicates of existing ones in the Zotero library.\n  * You can choose which version of duplicate items to use as the **master item** and **merge** them.\n  * The actions you can take:\n    1. **Keep New**: Set the **new item** as the master item and merge the duplicates.\n    2. **Keep Old**: Set the **existing item** as the master item and merge the duplicates.\n    3. **Keep All**: Keep both the new item and the existing item.\n    4. **Merge Manually**: Go to the Duplicate Items Panel and merge the duplicate item manually.\n* **Auto-Bulk Merge**\n  * Merges all duplicate items in the library automatically.\n  * Introduced in Version 2.0.0.\n* **Non-duplicates Management**\n  * Allows marking items as \"Non-duplicates\" if mistakenly identified as duplicates by Zotero.\n  * Introduced in Version 3.0.0.\n* **Show Duplicate Statistics**\n  * Append the duplicate count on the label of Duplicate Items pane.\n  * Introduced in Version 2.3.0.\n\n*If you find this project helpful, please consider [giving it a star](https://github.com/ChenglongMa/zoplicate)* ⭐. *It would be a great encouragement for me!*\n\n\u003e [!IMPORTANT]\n\u003e \n\u003e Zoplicate does NOT delete the duplicate items arbitrarily.\n\u003e \n\u003e Instead, it extracts the useful information from the duplicate items and merges them into the retained item.\n\u003e \n\u003e It makes some improvements based on [the official detection and merging methods of Zotero](https://www.zotero.org/support/duplicate_detection).\n\u003e\n\n# Changelog\n\n## v5.0.1\n\n\u003cdetails markdown=\"1\" open\u003e\n  \u003csummary\u003e\u003ci\u003eClick here to show more.\u003c/i\u003e\u003c/summary\u003e\n\nThis hotfix resolves the Zotero sync error reported as `Invalid setting 'zoplicate-nonDuplicatePairs'`:\n\n1. 🐛 **FIX!**: Disabled the v5.0.0 non-duplicate-pair sync path that wrote an unsupported custom key to `Zotero.SyncedSettings`.\n2. 🧹 **CLEANUP!**: Zoplicate now removes the legacy `zoplicate-nonDuplicatePairs` local synced setting on startup so Zotero stops retrying the invalid upload.\n3. 🗄️ **NOTE!**: Non-duplicate pairs continue to be stored locally; cross-device syncing for these pairs is disabled until a supported storage path is available.\n\n\u003c/details\u003e\n\n## v5.0.0\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003e\u003ci\u003eClick here to show more.\u003c/i\u003e\u003c/summary\u003e\n\nThis version focuses on the Zotero 9 migration and data integrity work:\n\n1. ✨ **NEW!**: Zoplicate now targets **Zotero 9** (`9.0` to `9.*`) and the release manifest is generated for Zotero 9.\n2. ✨ **NEW!**: Non-duplicate pairs can now be synced through `Zotero.SyncedSettings` with key-based storage for cross-device portability.\n3. 🧬 **CHANGE!**: The duplicate detection, dialog rendering, menu registration, window handling, and plugin lifecycle code were reorganized for the Zotero 9 runtime.\n4. 🐛 **FIX!**: Added local DB schema versioning, safer cleanup for merged/deleted items, startup hydration, and conflict-safe union merge for synced non-duplicate pairs.\n5. ✅ **TEST!**: Expanded the automated test suite for duplicate detection, non-duplicate sync, hydration, cleanup, lifecycle, menus, and bulk merge flows.\n\n\u003c/details\u003e\n\n## v4.0.0\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003e\u003ci\u003eClick here to show more.\u003c/i\u003e\u003c/summary\u003e\n\nMany thanks to all the contributors and users who liked, reported issues, and provided valuable feedback! ❤️\n\nWe are now supporting **Zotero 8**!\n\n\u003c/details\u003e\n\n## v3.0.8\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003e\u003ci\u003eClick here to show more.\u003c/i\u003e\u003c/summary\u003e\n\nIn this version, we have made the following changes:\n\n1. 🐛 **FIX!**: We have fixed the bug that caused the dialog not to open again when importing duplicate items.\n    * Thanks to [pascaloettli](https://github.com/pascaloettli) for reporting this bug in [issue #147](https://github.com/ChenglongMa/zoplicate/issues/147).\n    * Thanks to \"如梦江南\" for reporting this bug on RedNote.\n2. 🐛 **FIX!**: We have fixed the dialog styling issue in dark mode.\n    * Thanks to [pascaloettli](https://github.com/pascaloettli) for reporting this bug in [issue #146](https://github.com/ChenglongMa/zoplicate/issues/146).\n\n\u003c/details\u003e\n\n## v3.0.6\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003e\u003ci\u003eClick here to show more.\u003c/i\u003e\u003c/summary\u003e\n\nIn this version, we have updated the dependencies and adapted to the latest version of Zotero.\n\nThanks to [pascaloettli](https://github.com/pascaloettli) for the feedback in [issue #131](https://github.com/ChenglongMa/zoplicate/issues/131).\n\n\u003c/details\u003e\n\n## v3.0.5\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003e\u003ci\u003eClick here to show more.\u003c/i\u003e\u003c/summary\u003e\n\nIn this version, we have made the following changes:\n\n1. 🐛 **FIX!**: We have fixed the bug that caused the sync error.\n    * Thanks to [dstillman](https://github.com/dstillman) for reporting this issue in [issue #124](https://github.com/ChenglongMa/zoplicate/issues/124).\n2. 🐛 **FIX!**: We have optimized the UI of context menu.\n    * Thanks to [dschaehi](https://github.com/dschaehi) for reporting this issue in [issue #119](https://github.com/ChenglongMa/zoplicate/issues/119).\n3. 🐛 **FIX!**: We have optimized the UI styling of bulk merge buttons.\n    * Thanks to [vancleve](https://github.com/vancleve) for reporting this issue in [issue #120](https://github.com/ChenglongMa/zoplicate/issues/120).\n\n\u003c/details\u003e\n\n## v3.0.4\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003e\u003ci\u003eClick here to show more.\u003c/i\u003e\u003c/summary\u003e\n\nIn this version, we have made the following changes:\n\n1. 🐛 **FIX!**: We have fixed the bug that caused the UI blocked when selecting too many items and opening the context menu.\n    * Thanks to [zzlb0224](https://github.com/zzlb0224), [pencilheart](https://github.com/pencilheart) and [dschaehi](https://github.com/dschaehi) for reporting this bug in [issue #94](https://github.com/ChenglongMa/zoplicate/issues/94) and [issue #119](https://github.com/ChenglongMa/zoplicate/issues/119) respectively.\n2. 🐛 **FIX!**: We have optimized the plugin lifecycle which may cause the plugin to load multiple preference settings on macOS.\n    * Thanks to [WangYe661](https://github.com/WangYe661) and [pencilheart](https://github.com/pencilheart) for reporting this bug in [issue #81](https://github.com/ChenglongMa/zoplicate/issues/81).\n3. 🐛 **FIX!**: We have optimized database operations to reduce the risk of data loss.\n\n\u003c/details\u003e\n\n## v3.0.3\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003e\u003ci\u003eClick here to show more.\u003c/i\u003e\u003c/summary\u003e\n\nIn this version, we have made the following changes:\n\n1. 🐛 **FIX!**: We have fixed the bug that caused the attachment to be lost when merging duplicate items.\n    * Thanks to [tommyhosman](https://github.com/tommyhosman) for reporting this bug in [issue #43](https://github.com/ChenglongMa/zoplicate/issues/43).\n    * Thanks to [csdaboluo](https://github.com/csdaboluo) for reporting this bug in [issue #51](https://github.com/ChenglongMa/zoplicate/issues/51).\n2. 🐛 **FIX!**: Zoplicate will now ignore the **Feed** items when detecting duplicates.\n    * Thanks to [Raphael-Hao](https://github.com/Raphael-Hao) for reporting this bug in [issue #54](https://github.com/ChenglongMa/zoplicate/issues/54).\n3. 🐛 **FIX!**: We have fixed the bug that caused the detection dialog blocking the main thread.\n4. 🐛 **FIX!**: We have fixed the bug that caused the deleted items to be showing in NonDuplicates panel.\n5. 🐛 **FIX!**: Now, the NonDuplicates panel won't show up when clicking attachment items.\n6. ✨ **NEW!**: We added a prompt to remind the duplicates when Zotero is in background.\n\n\u003c/details\u003e\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003e\u003ci\u003eClick here to show more.\u003c/i\u003e\u003c/summary\u003e\n\n## v3.0.2\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003e\u003ci\u003eClick here to show more.\u003c/i\u003e\u003c/summary\u003e\n\nIn this version, we have made the following changes:\n\n1. 🐛 **FIX!**: We have fixed the progress window icon bug in Zotero 7.0.0-beta.77.\n2. 🧬 **CHANGE!**: We have updated the style of duplicate detection dialog.\n3. 🧬 **CHANGE!**: We have updated the icon style in preference pane.\n4. 🧬 **CHANGE!**: Items with different `itemType` will not be considered as duplicates.\n\n\u003c/details\u003e\n\n## v3.0.1\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003e\u003ci\u003eClick here to show more.\u003c/i\u003e\u003c/summary\u003e\n\nIn this version, we have made the following changes:\n\n1. 🧬 **CHANGE!**: We have updated the UI of buttons in the duplicate pane.\n2. 🐛 **FIX!**: We have optimized the performance of duplicate search and detection.\n\n\u003c/details\u003e\n\n## v3.0.0\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003e\u003ci\u003eClick here to show more.\u003c/i\u003e\u003c/summary\u003e\n\nIn this version, we have made the following changes:\n\n1. 🐛 **FIX!**: We have fixed a **memory leak** bug that caused the app to freeze when editing PDF annotations.\n   * Thanks [vancleve](https://github.com/vancleve) and [pencilheart](https://github.com/pencilheart) for reporting this bug in [issue #30](https://github.com/ChenglongMa/zoplicate/issues/30) and [issue #31](https://github.com/ChenglongMa/zoplicate/issues/31) respectively.\n2. ✨ **NEW!**: We have added the **Non-duplicates** functionality.\n   * You can mark items as **Non-duplicates** when they are mistakenly identified as \"duplicates\" by Zotero.\n   * Selecting two \"false duplicates\", you can find the `They are NOT duplicates` **menu items** in the context menu.\n     * ![menu_not_duplicates](./docs/non_duplicates/menu_not_duplicates.png)\n   * You can also find the `They are NOT duplicates` button in the `Duplicate Items` panel.\n     * ![button_not_duplicates](./docs/non_duplicates/button_not_duplicates.png)\n   * For more details, please see [Non-duplicates](#non-duplicates) section below.\n   * Thanks [dschaehi](https://github.com/dschaehi) for the discussion in [issue #25](https://github.com/ChenglongMa/zoplicate/issues/25).\n\n\u003c/details\u003e\n\n## v2.3.0\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003e\u003ci\u003eClick here to show more.\u003c/i\u003e\u003c/summary\u003e\n\nIn this version, we have made the following changes:\n\n1. ✨ **NEW!**: We have added an option to show the duplicate count on the left collection pane.\n   * You can find the option in the `Zoplicate` tab in the settings.\n   * When your mouse hovers over the \u003ckbd\u003eDuplicate Items\u003c/kbd\u003e entry, a tooltip will show the duplicate statistics.\n      \n      ![Show duplicate count](docs/show-duplicate-count.png)\n   * The duplicate count will be updated automatically. You can also find the \u003ckbd\u003eRefresh Duplicate Count\u003c/kbd\u003e menu to update the count manually.\n      \n     ![Refresh duplicate count](docs/refresh-duplicate-count.png)\n   * Thanks [Apollo7777777](https://github.com/Apollo7777777)'s idea mentioned in [discussion #18](https://github.com/ChenglongMa/zoplicate/discussions/18)\n2. 🐛 **FIX!**: We have fixed a bug that caused the dialog to be too narrow when the title is short.\n3. 🐛 **FIX!**: We have fixed a bug that caused the `Bulk Merge` icons to not maintain aspect ratios.\n\n\u003c/details\u003e\n\n## v2.2.0\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003e\u003ci\u003eClick here to show more.\u003c/i\u003e\u003c/summary\u003e\n\nIn this version, we have made the following changes:\n\n1. ✨ **NEW!**: We have added **\"Smart\" Merge** functionality (Only available in Zotero 7 now).\n   * When merging duplicate items, the function will fill in the missing information of the retained item with the duplicates.\n   * Thanks [endfreude](https://github.com/endfreude)'s idea mentioned in [issue #15](https://github.com/ChenglongMa/zoplicate/issues/15).\n\n\u003c/details\u003e\n\n## v2.1.0\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003e\u003ci\u003eClick here to show more.\u003c/i\u003e\u003c/summary\u003e\n\nIn this version, we have made the following changes:\n\n1. ✨ **NEW!**: We have added the **Suspend** and **Restore** functionality (Only available in Zotero 7 now).\n   * Please see [Bulk Merge](#bulk-merge) section below for more details.\n2. 🧬 **CHANGE!**: We have changed the behavior of **Keep Others** action.\n   * Previously, the **Keep Others** action will delete the last imported item and save **ALL** the rest existing items.\n   * Now, the action will **Merge** the existing items based on the **Master Item** preferences in [Settings](#settings).\n3. 🐛 **FIX!**: We have fixed a bug that caused the **tags** could not be loaded correctly in v2.0.0.\n   * Thanks [ChinJCheung](https://github.com/ChinJCheung) for reporting this bug in [issue #10](https://github.com/ChenglongMa/zoplicate/issues/10).\n\n\u003c/details\u003e\n\n## v2.0.0\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003e\u003ci\u003eClick here to show more.\u003c/i\u003e\u003c/summary\u003e\n\nIn this version, we have made the following changes:\n\n1. ✨ **NEW!**: We have added the **Bulk Merge** functionality (Only available in Zotero 7 now).\n   * **Bulk Merge**: Merge all duplicate items in the library automatically.\n   * You can find the **Bulk Merge** button in the `Duplicate Items` panel.\n   * Please see [Bulk Merge](#bulk-merge) section below for more details.\n   * Thanks [csdaboluo](https://github.com/csdaboluo)'s idea mentioned in [issue #8](https://github.com/ChenglongMa/zoplicate/issues/8).\n2. 🐛 **FIX!**: We have fixed a bug that caused the dialog height to be too high when importing duplicate items in bulk.\n3. 🐛 **FIX!**: Now Zotero will auto-select the remained item after merging duplicate items.\n   * Thanks [pencilheart](https://github.com/pencilheart)'s report in [issue #7](https://github.com/ChenglongMa/zoplicate/issues/7).\n\n\u003c/details\u003e\n\n## v1.1.0\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003e\u003ci\u003eClick here to show more.\u003c/i\u003e\u003c/summary\u003e\n\nIn this version, we have made the following changes:\n\n1. 🧬 **CHANGE!**: We have changed the processing method of duplicate items.\n\n   Previously, we use the `Trash` method to process duplicate items, i.e., delete the duplicate items.\n   However, this method will cause the loss of some information of the duplicate items.\n   * E.g., **notes**, **tags**, **collections**, **attachments**.\n\n   In this version, we use the `Merge` method to process duplicate items.\n   This method will copy all the aforementioned information to the retained item, and then delete the duplicate items.\n   * **NOTE**: If you are using [ZotFile](http://zotfile.com/), the `Merge` method will copy the **file link** of the duplicate items to the retained item.\n   * However, users relying on Zotero's default attachment storage may encounter duplication issues if the newly imported item contains attachments. \n     * This is a known potential problem in Zotero, as detailed in [Zotero Documentation - Duplicate Detection](https://www.zotero.org/support/duplicate_detection).\n\nThanks [ChinJCheung](https://github.com/ChinJCheung)'s idea mentioned in [issue #5](https://github.com/ChenglongMa/zoplicate/issues/5).\n\n\u003c/details\u003e\n\n\u003c/details\u003e\n\n# Install\n\n## From GitHub\n\n1. Zoplicate 5 targets **Zotero 9** (`9.0` to `9.*`).\n2. Visit the [latest release page](https://github.com/ChenglongMa/zoplicate/releases/latest) and download [the latest `zoplicate.xpi` file](https://github.com/ChenglongMa/zoplicate/releases/latest/download/zoplicate.xpi).\n   - If you are using FireFox, right-click on the link of the XPI file and select \"Save As...\".\n3. Then, in Zotero, click `Tools` -\u003e `Plugins` and drag the `.xpi` onto the Plugins window.\n   - See [how to install a Zotero addon](https://www.zotero.org/support/plugins).\n\n## From Add-on Market Plugin for Zotero\n\n_Additional third-party plugin is required._\n\n1. Install Add-on Market for Zotero from [here](https://github.com/syt2/zotero-addons).\n2. Search `Zoplicate` in the Add-on Market and install it.\n\n## 通过 Zotero 插件商店 安装 (For Chinese Users)\n\n1. 前往 [Zotero 插件商店](https://zotero-chinese.com/plugins/).\n2. 搜索 `Zoplicate` 然后单击 `下载` 按钮。\n\n# Usage\n\n## Settings\n\nIn Zotero, click `Edit` -\u003e `Settings`, go to `Zoplicate` tab, and you will see the settings.\n\n![zoplicate settings](docs/settings_2.3.0.png)\n\n1. You can select the actions you want to take when duplicate items are detected.\n    * `Always Ask` is the default option if you have not changed the settings.\n2. You can select the version of duplicate items to use as the **master item**.\n    * `Earliest Added` is the default option if you have not changed the settings.\n\n## Duplicate Detection\n\nBy default, or you have selected `Always Ask` in the settings,\na dialog will pop up when you import a new item that is a duplicate of an existing item.\n\n![zoplicate dialog](docs/dialog.png)\n\nThe dialog will show the duplicate items and the actions you can take.\n\n1. Select the action you want to take and click \u003ckbd\u003eApply\u003c/kbd\u003e to process the duplicate items.\n2. Click \u003ckbd\u003eGo to Duplicates\u003c/kbd\u003e to go to the `Duplicate Items` panel and merge the duplicate items manually.\n3. Click \u003ckbd\u003eCancel\u003c/kbd\u003e to dismiss the dialog and **save** the import of the new item and the existing items.\n4. Check \u003ckbd\u003eUse this action by default\u003c/kbd\u003e to remember the selected action in default settings.\n   Then the next time you import a duplicate item, the selected action will be applied automatically.\n\n### Multiple Duplicate Items\n\nWhen you import multiple duplicate items,\nor import another duplicate item before you process the previous duplicate items,\nthe dialog will show all the duplicate items and the actions you can take.\n\n![zoplicate dialog](docs/dialog2.png)\n\n1. You can select different actions for different duplicate items.\n2. Click the _header_ of action columns to select the same action for all duplicate items.\n3. \u003ckbd\u003eUse this action by default\u003c/kbd\u003e option will be shown only when you select the same action for all duplicate items.\n\n## Bulk Merge\n\nInspired by [csdaboluo](https://github.com/csdaboluo)'s idea and [ZoteroDuplicatesMerger](https://github.com/frangoud/ZoteroDuplicatesMerger),\nwe have added the **Bulk Merge** functionality in **Version 2.0.0**.\n\nIn the `Duplicate Items` panel, you can find the \u003ckbd\u003eBulk Merge All Duplicate Items\u003c/kbd\u003e button:\n\n![zoplicate bulk merge](docs/bulk-merge-nonselection.png)\n\nYou can also find it when you select one or more duplicate items:\n\n![zoplicate bulk merge](docs/bulk-merge-selection.png)\n\n\u003e [!WARNING]  \n\u003e \n\u003e 1. Before clicking the button, please make sure you have properly configured the _Master Item_ preferences in [Settings](#settings).\n\u003e 2. The **Bulk Merge** functionality will **take a while** to complete if you have a large number of duplicate items.\n\nYou will see the progress of the bulk merge process:\n![zoplicate bulk merge process](docs/bulk-merge-progress.png)\n\n### Suspend Bulk Merge\n\nYou can click the \u003ckbd\u003eSuspend\u003c/kbd\u003e button to suspend the bulk merge process.\n\nA dialog will pop up to confirm your action:\n![zoplicate bulk merge suspend](docs/bulk-merge-suspended-dialog.png)\n\n1. Click \u003ckbd\u003eResume\u003c/kbd\u003e to **resume** the bulk merge process.\n2. Click \u003ckbd\u003eCancel\u003c/kbd\u003e to **cancel** the bulk merge process.\n   * Check \u003ckbd\u003eRestore Deleted Items\u003c/kbd\u003e to restore the duplicate items that have been merged.\n   * Note that the **Restore** action is only effective if you click \u003ckbd\u003eCancel\u003c/kbd\u003e. \n\n\u003e [!TIP]\n\u003e\n\u003e If you want to **Restore** the duplicate items that have been merged, \n\u003e you can go to `Trash` panel and restore them.\n\u003e \n\u003e 1. Select the duplicate items you want to restore.\n\u003e 2. Click \u003ckbd\u003eRestore to Library\u003c/kbd\u003e button to process.\n\n## Show Duplicate Statistics\n\nStarting from **Version 2.3.0**, we have added an option to show the duplicate count on the left collection pane.\n\nYou can find the option in the `Zoplicate` tab in [the settings](#settings).\n\nWhen your mouse hovers over the \u003ckbd\u003eDuplicate Items\u003c/kbd\u003e entry, a tooltip will show the duplicate statistics.\n\n![Show duplicate count](docs/show-duplicate-count.png)\n\nThe duplicate count will be updated automatically. You can also find the \u003ckbd\u003eRefresh\u003c/kbd\u003e menu to update the count manually.\n\n![Refresh duplicate count](docs/refresh-duplicate-count.png)\n\n## Non-duplicates\n\nStarting from **Version 3.0.0**, we have added the **Non-duplicates** functionality.\n\nYou can mark items as **Non-duplicates** when they are mistakenly identified as \"duplicates\" by Zotero.\n\nSelecting an item, you can manage the **Non-duplicates** items in the side panel:\n![side_panel_not_duplicates](./docs/non_duplicates/side_panel_non_duplicates.png)\n\n* Click the \u003ckbd\u003e![non-duplicate button](./addon/chrome/content/icons/non-duplicate.svg)\u003c/kbd\u003e button to show the **Non-duplicates** section.\n* Click the \u003ckbd\u003e+\u003c/kbd\u003e button to add the selected item to the **Non-duplicates** list.\n* Click the \u003ckbd\u003e-\u003c/kbd\u003e button to remove the selected entry from the **Non-duplicates** list.\n\nThere are some ways to mark and unmark items as **Non-duplicates**:\n\n### Mark as Non-duplicates\n\n1. Click the \u003ckbd\u003e+\u003c/kbd\u003e button to add the selected item to the **Non-duplicates** list.\n2. Selecting two \"false duplicates\", you can find the `They are NOT duplicates` **menu items** in the context menu.\n   * ![menu_not_duplicates](./docs/non_duplicates/menu_not_duplicates.png)\n3. You can also find the `They are NOT duplicates` button in the `Duplicate Items` panel.\n   * ![button_not_duplicates](./docs/non_duplicates/button_not_duplicates.png)\n\n### Unmark as Non-duplicates\n\n1. Click the \u003ckbd\u003e-\u003c/kbd\u003e button to remove the selected entry from the **Non-duplicates** list.\n2. Selecting two \"non duplicates\", you can find the `They are duplicates` **menu items** in the context menu.\n   * ![menu_not_duplicates](./docs/non_duplicates/menu_duplicates.png)\n\n# How to cite\n\n## Plain citation\n\n```text\nMa, C. (2026). Zoplicate (v5.0.0) [Software]. Zenodo. https://doi.org/10.5281/zenodo.16986945\n```\n## BibTeX\n\n```bibtex\n@software{zoplicate_16986945,\n  author = {Ma, Chenglong},\n  title = {Zoplicate: Detect and manage duplicate items in Zotero},\n  version = {v5.0.0},\n  date = {2026-04-16},\n  doi = {10.5281/zenodo.16986945},\n  url = {https://github.com/ChenglongMa/zoplicate}\n}\n```\n\n# Contributing\n\n👋 Welcome to **Zoplicate**! We're excited to have your contributions. Here's how you can get involved:\n\n1. 💡 **Discuss New Ideas**: Have a creative idea or suggestion? Start a discussion in\n   the [Discussions](https://github.com/ChenglongMa/zoplicate/discussions) tab to share your thoughts and\n   gather feedback from the community.\n\n2. ❓ **Ask Questions**: Got questions or need clarification on something in the repository? Feel free to open\n   an [Issue](https://github.com/ChenglongMa/zoplicate/issues) labeled as a \"question\" or participate\n   in [Discussions](https://github.com/ChenglongMa/zoplicate/discussions).\n\n3. 🐛 **Issue a Bug**: If you've identified a bug or an issue with the code, please open a\n   new [Issue](https://github.com/ChenglongMa/zoplicate/issues) with a clear description of the problem, steps\n   to reproduce it, and your environment details.\n\n4. ✨ **Introduce New Features**: Want to add a new feature or enhancement to the project? Fork the repository, create a\n   new branch, and submit a [Pull Request](https://github.com/ChenglongMa/zoplicate/pulls) with your changes.\n   Make sure to follow our contribution guidelines.\n\n5. 💖 **Funding**: If you'd like to financially support the project, you can do so\n   by [sponsoring the repository on GitHub](https://github.com/sponsors/ChenglongMa). Your contributions help us\n   maintain and improve the project.\n\n# Acknowledgements\n\nI would like to express my gratitude to the following individuals and organizations for their generous support and contributions to this project:\n\n## Sponsors\n\n\u003cp\u003e \n    \u003ca href=\"https://github.com/quinn-p-mchugh\" aria-label=\"Sponsor Quinn McHugh\" style=\"display: inline-block; margin: 10px;\"\u003e \n        \u003cimg src=\"https://avatars.githubusercontent.com/u/40648753?v=4\" height=\"100\" alt=\"Sponsor Quinn McHugh\" style=\"border-radius: 50%;\"/\u003e \n        \u003cbr/\u003e\n        \u003cspan style=\"display: block; text-align: center;\"\u003eQuinn McHugh\u003c/span\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/Mctalos\" aria-label=\"Sponsor Mctalos\" style=\"display: inline-block; margin: 10px;\"\u003e \n        \u003cimg src=\"https://avatars.githubusercontent.com/u/9693755?v=4\" height=\"100\" alt=\"Sponsor Mctalos\" style=\"border-radius: 50%;\"/\u003e\n        \u003cbr/\u003e\n        \u003cspan style=\"display: block; text-align: center;\"\u003eMctalos\u003c/span\u003e\n    \u003c/a\u003e \n\u003c/p\u003e\n\nUsually, a ⭐️ is enough to make me happy. Your sponsorship will help me maintain and improve the project. \nAlso, part of the sponsorship will be donated to the open-source community.\n\nThank you for considering contributing to **Zoplicate**. We value your input and look forward to collaborating\nwith you!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchenglongma%2Fzoplicate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchenglongma%2Fzoplicate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchenglongma%2Fzoplicate/lists"}