BibTeX Deduplicator
Find the entries in a .bib file that describe the same work, keep one of each and download the result.
Step 1: Add your library
Paste or upload a library in step 1 to scan it.
Step 2: Keep one of each
Duplicate entries will be grouped here
Scan your library and entries that share a DOI, or have the same title once case, braces and punctuation are ignored, are shown side by side. Entries with different DOIs are never grouped. You pick the one to keep in each group; nothing is merged for you.
These results are out of date. The text in step 1 has changed since it was scanned, so nothing can be chosen or downloaded from them. Scan again, or undo the change.
A DOI identifies a work, so entries with different DOIs are kept as separate works even when their titles match. An entry with one of these titles and no DOI could be a copy of any of them, so it is not grouped either: compare these yourself.
Step 3: Download the clean .bib
- Entries
- 0
- Duplicates
- 0
- Unique works
- 0
How to de-duplicate a BibTeX library
Merging reference libraries almost always creates duplicate citations. Here is the fastest way to find and remove them without uploading your research data.
Add your library
Paste BibTeX entries into step 1, or press Upload .bib to load a file. Merged exports from Zotero, Mendeley or EndNote are the usual source of duplicates. Load example gives you five entries to try.
Scan for duplicates
Press Scan for duplicates. Entries that share a DOI, or whose titles match once case, braces and punctuation are ignored, are put in one group. Two entries with different DOIs are never put in one group, whatever their titles.
Keep one of each
In each group, click the entry to keep. Keep the most complete in each picks, in every group, the entry with a DOI and the most fields filled in.
Download the clean file
When every group has an entry kept, press Download cleaned .bib. The file is your library with the other entries taken out: the order, the kept entries and any @string, @comment or @preamble blocks are as they were. If you change the text in step 1 after a scan, the results are marked out of date and the download is switched off until you scan again.
How the deduplicator works
Two kinds of match
A DOI is a globally unique identifier, so two entries sharing one are treated as the same work. A DOI is read in any of the forms it is written in (bare, as a doi.org, dx.doi.org or www.doi.org link, or after doi:) and compared without regard to case; a doi field that does not hold a DOI, such as n/a, counts as none. Entries are also grouped when their normalized titles match once case, braces, accents, formatting commands and punctuation are set aside. Every word, number and formula still counts, so two titles that differ only in \ce{NaCl} and \ce{KCl} stay apart. This catches duplicates where one copy is missing its DOI, a common result of merging databases.
Transitive grouping & privacy
Matches are combined with a union-find structure, so a chain such as A(doi)=B(title)=C collapses into a single conflict. A DOI outranks a title: two entries with different DOIs are never grouped. A title that entries with different DOIs share (Editorial, or a preprint and the article it became) is the title of more than one work, so it links nothing: those entries are grouped by DOI alone, an entry with that title and no DOI is left on its own, and all of them are listed under the groups for you to compare. The result does not depend on the order of the file. Nothing is auto-merged field-by-field, you choose which record survives. All parsing happens locally in your browser; your library is never uploaded.
Frequently asked questions
Is my bibliography uploaded to a server?
How are duplicates detected?
Will it automatically merge fields from both copies?
Why were two different papers flagged as duplicates?
What input does it accept?
@string macros and month macros such as jul are expanded before entries are compared; @comment and @preamble blocks are not compared. The download keeps all of these blocks, and each kept entry exactly as it was written.Runs entirely in your browser, no data leaves your device.