# Command: `websites:cleanup-duplicates`

**Description**: Find and clean up duplicate websites (including IDN Unicode/Punycode duplicates)
**Status**: completed
**Started**: 2026-07-10 16:09:10 | **Ended**: 2026-07-10 16:09:12 | **Duration**: 2s
**Jobs**: 0 dispatched / 0 completed / 0 failed

---

## Command Output

16:09:10 [INFO] Lock acquired for command: websites:cleanup-duplicates

16:09:11 [INFO] 🔍 Starting duplicate website cleanup...

16:09:11 [INFO] Found 1 group(s) of duplicate websites.

16:09:11 [INFO] Re-keying domain-keyed data onto the keeper BEFORE merging, so nothing is orphaned.

16:09:11 [INFO] <fg=yellow\>Duplicate group for: https://adlogger.org</\>

16:09:11 [INFO] <fg=green\>KEEP: ID 3cfc1c33-d85c-456e-8fcb-31cba35e16b8, www.adlogger.org (type LINK, status LIVE)</\>

16:09:11 [INFO] <fg=red\>DELETE: ID 3f145f93-5828-402a-b852-856ed442282b, adlogger.org (type LINK, status LIVE)</\>

16:09:11 [WARNING] ⚠️ Keeper and losers already share the canonical domain\_name. If websites:canonicalize-hosts already ran, data filed under the old variant may be missed.

16:09:12 [INFO] 📊 Cleanup complete:

16:09:12 [INFO] ✅ Groups processed: 1

16:09:12 [INFO] ⏭  Groups skipped (re-key/keeper failures): 0

16:09:12 [INFO] ❗ Groups aborted (unexpected error): 0

16:09:12 [INFO] 🔄 Domain-keyed docs re-keyed onto keepers: 0

16:09:12 [INFO] 🧹 Logical duplicates merged: 0

16:09:12 [INFO] ✅ Losers deleted: 1

16:09:12 [INFO] ⏭  Losers skipped (reassign failures): 0

16:09:12 [INFO] 🔤 Keepers canonicalized: 1

16:09:12 [INFO] 💡 Re-run websites:audit-idn-duplicate-data to confirm 0 at-risk docs for the merged groups.

16:09:12 [INFO] Lock released for websites:cleanup-duplicates

---

## Jobs (0)

*No jobs dispatched*

*Exported at 2026-08-27T06:39:17+00:00*
