Why Duplicate Contacts Accumulate
Most people carry contact lists that are larger — and messier — than they appear. Every time you switch phones, migrate between email providers, or sync a work account alongside a personal one, the same person can land in your address book two, three, or four times under slightly different names: "Jane Doe," "Jane M. Doe," and "J. Doe," each with a different phone number format, may all refer to the same person. Repeated manual entry compounds the problem — a number typed from a business card rarely matches the same number imported from a vCard because one includes a country code and the other doesn't.
The social cost of a fragmented contact list is quietly real. Research on relationship maintenance and social network structure — including Dunbar's foundational work on the cognitive limits of human social group size (Journal of Human Evolution, 22(6), 469–493; DOI: 10.1016/0047-2484(92)90081-J) — suggests that keeping a tidy, accurate address book is part of the cognitive overhead of managing a meaningful social circle. Duplicate contacts create friction every time you search, call, or sync — they are not a cosmetic problem.
Format drift accelerates the issue. Phone numbers collected over years appear in dozens of notations: +1 555 123 4567, (555) 123-4567, 5551234567. vCard exports from different apps apply different escaping rules, different property names, and different version numbers. A contact that looks like a duplicate when you search by eye is genuinely hard to detect programmatically — which is why this tool exists.
What This Tool Does
The Contact Deduplicator accepts three input formats: vCard 3.0 and 4.0 (the standard .vcf format exported by Google Contacts, iOS, macOS, and most CRM tools), CSV (a flat spreadsheet format many tools export alongside or instead of vCard), and Google Takeout JSON (the format Google exports when you request a data download from takeout.google.com).
Drop a file into the upload zone or paste the raw text directly. The tool detects the format automatically — if the text starts with a , it tries Google JSON first; if it contains BEGIN:VCARD, it parses as vCard; otherwise it attempts CSV. If the first guess yields zero contacts, it tries the other formats and picks the one producing the most results.
After parsing, the dedup engine scans for duplicate groups and presents them for your review. You choose — per group — whether to merge into one contact or keep the entries separate. The output is a cleaned .vcf or .csv file downloaded directly to your device. The entire process — parsing, detection, merging, serialization — runs in JavaScript inside your browser. Nothing is uploaded.
How Duplicate Detection Works
Detection runs in three passes. The first pass looks for exact canonical phone matches: all phone numbers are stripped of spaces, dashes, parentheses, and the leading + country code prefix, then compared. (555) 123-4567 and +1-555-123-4567 normalize to the same string and trigger a match. Because a contact can have multiple phone numbers, the pass uses a union-find structure so that if A shares a phone with B and B shares a different phone with C, all three end up in one group.
The second pass does the same for email addresses. Gmail's well-known dot-insensitivity rule is applied: jane.doe@gmail.com and janedoe@gmail.com canonicalize to the same address. Plus-aliasing (janedoe+work@gmail.com) is also stripped. Contacts already grouped by the phone pass are excluded.
The third pass computes Levenshtein edit distance between normalized names — lowercase, diacritics removed. Two contacts whose names differ by ≤ 40% of the longer name's length are flagged as similar. "Jonathan Smith" and "Jon Smith" have a ratio of about 36%, which falls within the threshold. The reason code (exact-phone, exact-email, similar-name, name + org) is shown in the group header so you know why each pair was surfaced.
Reviewing and Merging — What the UI Tells You
Each duplicate group is presented as a small card listing all the candidate contacts. For each member you see the display name, email, phone, and organization. A radio button lets you choose which member to keep as the "base" — the merged result will carry that contact's name, birthday, and organization, with phones and emails from all members union-merged (duplicates removed using the same canonical keys from the detection passes).
The "Keep separate" option is always available. Use it when the similar-name match is a false positive — two genuinely different people with similar names, or a contact that happens to share a phone number via a shared office line. Reason codes help here: exact-phone and exact-email matches are almost always real duplicates; name-similar matches carry more risk of false positives and deserve a closer look.
The output summary at the bottom of the page updates as you make decisions, showing the final contact count before you download. Unknown vCard properties (addresses, custom fields, photo URLs) are preserved losslessly in the output — the merger keeps the base contact's version of any conflicting field and appends unknown properties from discarded members that aren't already present.
Privacy: Contacts Never Leave This Browser
Contact lists are among the most sensitive data you own. They contain phone numbers, home addresses, relationship context, and the social graph of your closest circle. This tool is designed around a single hard constraint: no data leaves your device. There is no upload step, no server, no API call. When you paste a vCard or drop a file, the text is held in browser memory. The dedup engine, the merge logic, and both serializers run entirely in JavaScript inside the browser tab.
This tool uses no LocalStorage, no cookies, no session state beyond what the browser's memory holds for the current tab. Closing or refreshing the tab clears everything immediately. There is no share-link feature, no save feature, no history. That's by design: your contact list should not persist in a tool you visit once.
Endearist's servers never see a single contact. The only network request this page makes is loading the page itself — the JavaScript bundle that runs the tool is served once as a static asset, and everything after that is client-side computation.
Where to Import the Output
Once you've downloaded the cleaned file, importing it back into your contact manager is straightforward. Google Contacts: go to contacts.google.com, click the Settings gear (top-right), then "Import" — select your .vcf file. Google will merge new data with existing contacts where it can find a match. iOS Contacts: open the .vcf file from Files or Mail — iOS will prompt you to add each vCard to your contacts. For a full replace rather than an append, it's safer to delete the duplicates in the Contacts app before importing. Outlook: File → Open & Export → Import/Export → "Import a vCard file (.vcf)" or, for CSV, "Import from another program or file" → "Comma Separated Values."
The CSV export is intended for review and mail-merge workflows, not for re-importing into a contact manager (most managers import vCard natively). Use it when you want to open the cleaned list in a spreadsheet, review it visually, use it as a mail-merge data source, or share it with a VA or assistant who needs a flat file.
A clean contact list is a small but compounding investment in every relationship it touches. Duplicates create friction exactly when you least want it — looking up someone's number in a hurry, syncing to a new device, or passing contacts to someone else. Want this kept clean automatically, per-person? → Endearist tracks the people who matter and reminds you when it's time to reach out. Join the waitlist to be among the first to know.