尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗A single-file, offline web app (index.html) that finds and merges duplicate contacts in vCard (.vcf) exports without losing anything — especially the multi-line Notes that an earlier tool stripped.
Live: https://dedupe-pro.vercel.app · Works equally well by opening index.html locally. No data leaves the browser.
.csv) or a .vcf (Synology / iPhone / Mac). Optionally load a second file of either kind to compare the two lists..vcf, an audit log, an Outlook-compatible CSV, a printable duplicate list, and (with two files) "only in file 2" / "only in file 1" .vcf files.---. The .vcf download is blocked if any approved merge has fewer note characters than its sources (only possible if a reviewer edits notes by hand).X- property survives. Where a single-valued field disagrees (two different companies), the winner is written to the field and the other is recorded in the notes under [Merged duplicates], along with alternate name spellings that carry extra words (e.g. Handyman, Al Holmes).0/0/00 dates, Normal, False, Unspecified, auto-generated Initials) are treated as empty. The E-mail Display Name columns ("Name (address)") are ignored. Exchange /o=… addresses are resolved to the SMTP address in the display name.[Extra details — no matching Outlook column]. The file is Windows-1252 when every character fits, otherwise UTF-8 with a BOM..pst, import the CSV into a new, non-synced contacts folder, check it, then swap it in. Importing over the live, synced folder duplicates or misses merges on every device. Don't open the CSV in Excel first.| Evidence | Points |
|---|---|
| Same email address | 50 |
| Same phone number (last 7 digits) | 40 |
| Same toll-free number (800/888/877/…) | 30, or 10 with a warning if the names are unrelated |
| Exact name (word order ignored) | 50 |
| Nickname match (Bob/Robert, Cathy/Catherine…) | 45 |
| Same first and last name, extra words differ | 42 |
| Names share two words | 35 |
| Same last name + first initial, or last name only on one side | 25 |
| Names share one word / last name only | 8 / 5 (deliberately below the floor — households share phones) |
| Same company | +10 |
Group-level warnings: Chained (AB and BC but A and C never matched directly), Large group, Different organizations, Different birthdays, Name-only match, Names look unrelated, Shared toll-free number. Any warning prevents pre-approval.
node tests/test_engine.mjs # unit tests on the real engine code
node tests/test_engine.mjs ~/Documents/Contacts/ALLSynologyContactsSep292025.vcf # + real-file smoke test
python3 -m unittest tests/test_note_roundtrip.py # note escape/merge mirror tests
Against the September 2025 Synology export (10,208 contacts, 3,448 with notes, 546,095 note characters): every merge passes the note and field integrity checks, and a second pass over the exported file finds no 95%+ groups.
.vcf directly..vcf. Use the Outlook CSV download (see above).index.html — the whole app (engine between // ENGINE-START and // ENGINE-END, then the UI).tests/test_engine.mjs — Node tests that load the engine straight out of index.html (including an Outlook CSV round trip of the real export).tests/fixtures/outlook_export_cp1252.csv — hand-built classic-Outlook export in Windows-1252 with multi-line notes, quotes, filler values and an Exchange address.tests/test_note_roundtrip.py, tests/verify_synology_notes.py — Python mirrors of the note handling.docs/ — design spec and plan from the July 2026 rebuild; Phyllis_Contact_Dedup_Rebuild_Handoff.md — background on the environment and the original notes-loss incident.