# Duplicate Ghost Files

**URL:** <https://community.algoriddim.com/t/duplicate-ghost-files/42759>\
**Category:** Questions\
**Tags:** macOS\
**Created:** [July 14, 2026, 1:51pm UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759 "2026-07-14T13:51:38Z")\
**Posts on this page:** 20\
**Page:** 2

<div class="post-metadata">

**Author:** ![Armigo](https://community.algoriddim.com/user_avatar/community.algoriddim.com/armigo/32/2239_2.png) [@Armigo](https://community.algoriddim.com/u/Armigo)\
**Post date:** [July 20, 2026, 12:09pm UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/23 "2026-07-20T12:09:34Z")

</div>

> [@EwoutdeBoer](#):
>
> a file could have multiple entries in the Djay database?

That’s what we’re calling “ghosting” and trying to figure out why and how to avoid it. No action required if you don’t have ghost file, just follow advice, re:

> [@Slak\_Jaw](#):
>
> - **Freeze external tagging once a track is in djay.** Do all Serato/MIK/kid3/mp3tag cleanup _before_ import; treat post-import edits as ghost-generating.
> - **Expect a ghost when you swap a file on disk.** The same-filename “replace in Finder” trick is convenient but appears to be a reliable trigger.

> [@EwoutdeBoer](#):
>
> The combination of a path, filename and extension is unique on all filesystems I know of. Then for each file there should also be a single entry in the database. If you change a comment in an id3 tag, then the database should have that latest change and not create a new record.

Yes, exactly. And that’s what should be implemented by design.

> [@EwoutdeBoer](#):
>
> Is this also related to [This post?](https://community.algoriddim.com/t/djay-database-and-cue-point-feedback-from-mixmasterg/42569/28)

Kind of, but not directly. MixMasterG’s youtube video explains a djay database design flaw; potentially it’s a root cause, but I ain’t no techie to know

---

<div class="post-metadata">

**Author:** ![Armigo](https://community.algoriddim.com/user_avatar/community.algoriddim.com/armigo/32/2239_2.png) [@Armigo](https://community.algoriddim.com/u/Armigo)\
**Post date:** [July 20, 2026, 6:39pm UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/24 "2026-07-20T18:39:03Z")

</div>

Fastest way to create a ghost:

With djay open, move a track from internal to external drive, then drop it back into djay deck.

Best way to delete ghosted file:

In Finder, Delete the actual file into bin  
Quit and relauch djay  
Run “Relink missing file” and delete library entry for the file (and the ghost)  
Re-import the file back into djay (and into the respective playlists)

---

<div class="post-metadata">

**Author:** ![Slak\_Jaw](https://community.algoriddim.com/user_avatar/community.algoriddim.com/slak_jaw/32/6517_2.png) [@Slak\_Jaw](https://community.algoriddim.com/u/Slak_Jaw)\
**Post date:** [July 20, 2026, 8:34pm UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/25 "2026-07-20T20:34:30Z")

</div>

Hey @Armigo, thanks again for the deep dive on this one! I believe your forensic work basically closes the diagnosis. A few things now line up cleanly:

- **The “untouched” 4 weren’t untouched.** Your Shenseea audit (Serato-era blank tags → later kid3 retag → CCC clone across drives) is the pattern — every ghost traces back to _something_ changing in the file. So there’s no mystery category left; it’s file changes all the way down.

- **Bulk is the trigger, not single edits.** Your fresh-file test is a key finding here: one file edited in Serato _and_ kid3 was captured cleanly, no ghost. Single/small edits seem to reconcile fine; bulk edits are what cause the duplicates. I think this is one of the sharpest leads we’ve had.

- **Your fast repro** , move a track to another drive with djay open, drop it back on a deck, djay warns that moving files _while it’s running_ needs a relaunch to detect the new location. Loading it before that reconciles is likely what creates the second entry. One thing to note — that route creates a duplicate with a **different** file-path, so your CSV/Url method likely won’t flag those; it only catches the same-path bulk-edit ghosts. Two slightly different flavors.

On the **“exorcism”** — your instinct that plain deletion is unsafe is right: some ghosts likely hold unique **playlist placements** , and decoupled ones could hold unique **cue points**. Ideally a full fix has to _merge_ those into one entry, not just delete duplicates. I’ll note this explicitly for engineering.

Your delete → relaunch → **relink** → re-import procedure is a valid manual clean, but re-importing fresh **loses the cues and playlist placement** you just worked to preserve. So it’s a per-track option, but probably not a library-wide cure.

On the **decoupling** , I agree it reads as transient, most likely a side-effect of the library still settling while you were stress-testing it hard - let’s park this unless it resurfaces.

This is now solid, reproducible, and corroborated across users and versions — so I’ll compile it all for engineering with your CSV inventories and samples. Thanks again for the great troubleshooting and forensic work here Armigo!

**Follow-up questions:**

1. For the **move-to-create-a-ghost** repro, please check that ghost’s **Url** : does it match the original’s path or differ?

2. Any rough sense of the **bulk threshold**? e.g. does a batch of 20 ghost while 10 doesn’t? Even a ballpark will help engineering troubleshooting.

3. When you ran your **delete → relink** procedure, did the deleted files reliably show up under _Relink Missing Files_?

4. Does the bulk trigger care about **which field** changed (Title/Artist vs Comment vs artwork), or is it purely edit-count?

**Updated Suggested Workarounds:**

- **Do all tagging before import, in one pass.** Since bulk post-import edits are the trigger, get files fully tagged _before_ they reach djay, and avoid batch re-tagging a collection that’s already imported.

- **Don’t move or replace files on disk while djay is open.** Quit djay first, move/replace, then relaunch so it reconciles instead of spawning a second entry.

- **If you must remaster in place,** for now, accept it’ll likely ghost, and use Armigo’s delete → relaunch → relink → re-import cycle per track — knowing it costs you that track’s cues and playlist spots.

- **Before deleting any ghost, consolidate first:** put both entries in the same playlists and keep whichever has the better cue points, so you don’t lose curation. (This is Armigo’s approach and it’s the safe one until a potential merge option exists.)

---

<div class="post-metadata">

**Author:** ![Armigo](https://community.algoriddim.com/user_avatar/community.algoriddim.com/armigo/32/2239_2.png) [@Armigo](https://community.algoriddim.com/u/Armigo)\
**Post date:** [July 21, 2026, 2:40pm UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/26 "2026-07-21T14:40:16Z")

</div>

> [@Slak\_Jaw](#):
>
> For the **move-to-create-a-ghost** repro, please check that ghost’s **Url** : does it match the original’s path or differ?

Ghost took on the new Url, original too ‘self-healed’ and took on the new url - and indeed the 2 were immediately coupled.  
Note: Like I said before, ghosting is still unpredictable. An attempt just now, i failed to ghost on the same file as light (library, on relaunch still “healed” and auto-corrected itself to the new url), Pay special attention: It neither created a duplicate with a different filepath, nor a ghost today (nice!).((Failed video upload))

> [@Slak\_Jaw](#):
>
> Any rough sense of the **bulk threshold**?

Ballpark: 400 did ghost for me. 10 didn’t

> [@Slak\_Jaw](#):
>
> When you ran your **delete → relink** procedure, did the deleted files reliably show up under _Relink Missing Files_?

Yes, consistently.

> [@Slak\_Jaw](#):
>
> Does the bulk trigger care about **which field** changed (Title/Artist vs Comment vs artwork), or is it purely edit-count?

For me, it was purely edit-count, but you must take into account, nearly 100% of my bulk edits were only in mass-deleting MIK energy comments field in serato.

---

<div class="post-metadata">

**Author:** ![Slak\_Jaw](https://community.algoriddim.com/user_avatar/community.algoriddim.com/slak_jaw/32/6517_2.png) [@Slak\_Jaw](https://community.algoriddim.com/u/Slak_Jaw)\
**Post date:** [July 21, 2026, 10:19pm UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/27 "2026-07-21T22:19:36Z")

</div>

Thanks again @Armigo! Super helpful. I’ve compiled everything and reported it to our engineering team for further analysis. I’ll report back when I have more news.

---

<div class="post-metadata">

**Author:** ![Slak\_Jaw](https://community.algoriddim.com/user_avatar/community.algoriddim.com/slak_jaw/32/6517_2.png) [@Slak\_Jaw](https://community.algoriddim.com/u/Slak_Jaw)\
**Post date:** [July 22, 2026, 3:38pm UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/29 "2026-07-22T15:38:12Z")

</div>

Hi again @DjBigBasha and @Armigo,

1. Can you both please share some screenshots of what these Ghost files look like within the djay library?
2. Our engineer thinks the most likely reason for duplicate/ghost imports is that the TitleID has somehow changed. So either the title/artist/duration value is different. To confirm, could you both please perform the following on one of your ghost files?
  1. Open **Terminal** — press **Cmd + Space** , type `Terminal`, hit Return.
  2. Type `avmediainfo` followed by **one space**. Don’t press Return yet.
  3. Open a Finder window and find your audio file.
  4. **Drag the file from Finder and drop it onto the Terminal window.** The full path fills itself in.
  5. Press **Return**.
  6. In the output, look for the line reporting **duration**.
  7. Then repeat this with the same track on your other device that is running a different macOS version.
  8. Share screenshots of the duration line for both.

Step 4 is doing real work, not just saving typing — your filenames contain spaces and `&` characters, which break the command if typed manually. Dragging handles all of that automatically.

---

<div class="post-metadata">

**Author:** ![Armigo](https://community.algoriddim.com/user_avatar/community.algoriddim.com/armigo/32/2239_2.png) [@Armigo](https://community.algoriddim.com/u/Armigo)\
**Post date:** [July 22, 2026, 8:15pm UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/30 "2026-07-22T20:15:48Z")

</div>

> [@Slak\_Jaw](#):
>
> Hi again

Example A: Same id3 ghost (only 1 physical file exists on disk)

 ![Screenshot 2026-07-22 at 22.47.56](https://community-assets.algoriddim.com/original/3X/7/e/7e800784ccc891dd35383eda7db7bf7a01ae8063.jpeg)  
Example B: Different id3 ghost (only 1 physical file exists on disk)

 ![Screenshot 2026-07-22 at 22.52.22](https://community-assets.algoriddim.com/original/3X/9/0/900f8f32af1c6b846e6ff487eb632b2d7e5f29c8.jpeg)

> [@Slak\_Jaw](#):
>
> So either the title/artist/duration value is different

Different from what?  
Sorry can you re-explain " Run command `avmediainfo <path to file>`" process step-by-step to a novice? I know how to paste a stated command into terminal, but then how should I proceed? I Pasted avmediainfo into terminal.  
Please define \<\> - what is it and how do I proceed? A screen recording with some narrative could help

> [@Slak\_Jaw](#):
>
> see if both files report the same

Both? 😕  
Also keep in mind there’s no actual physical duplicate files to compare the “differences” if that was the intention of this command.

---

<div class="post-metadata">

**Author:** ![Slak\_Jaw](https://community.algoriddim.com/user_avatar/community.algoriddim.com/slak_jaw/32/6517_2.png) [@Slak\_Jaw](https://community.algoriddim.com/u/Slak_Jaw)\
**Post date:** [July 22, 2026, 8:39pm UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/31 "2026-07-22T20:39:35Z")

</div>

Hi @Armigo, thanks for the screenshots. Wow - sorry, reading my post back now, I can see that I did a poor job wording and explaining it.

1. **What it’s comparing.** Not the ghost against the original. It’s comparing _the same file, read by two different machines_. The theory is that different macOS versions might compute a slightly different duration for the same audio file, and since duration is part of how djay identifies a track, a mismatch would make it think it’s looking at a new track. That test is really aimed at @DjBigBasha, who’s running macOS 26.5.1 on one Mac and Ventura 13.x on the other.
2. Since you’re single-machine, the literal test doesn’t apply to you. But you have something arguably better: that **abandoned 1TB HDD with the pre-edit copy** of the Shenseea file. Running this on the old copy and the current edited copy would tell us whether _tag editing itself_ changes the reported duration — which is the other half of what we’re chasing.
3. **Instructions:**
  1. The `<>` brackets are just placeholder notation — they mean “put your thing here.” You don’t type the brackets. So `avmediainfo <path to file>` means: type `avmediainfo`, then the file’s location. Nothing happened when you pasted `avmediainfo` alone because you gave it no file to look at.
  2. The easy way, which avoids typing paths entirely:
    1. Open **Terminal** — press **Cmd + Space** , type `Terminal`, hit Return.
    2. Type `avmediainfo` followed by **one space**. Don’t press Return yet.
    3. Open a Finder window and find your audio file.
    4. **Drag the current Shenseea file from Finder and drop it onto the Terminal window.** The full path fills itself in.
    5. Press **Return**.
    6. In the output, look for the line reporting **duration**.
    7. Then repeat this with the that **abandoned 1TB HDD with the pre-edit copy** of the **Shenseea file.**
    8. Share screenshots of the duration line for both.

  3. Step 4 is doing real work, not just saving typing — your filenames contain spaces and `&` characters, which break the command if typed manually. Dragging handles all of that automatically.

Thanks! Again, sorry about the poor initial request. I will go back and edit it…

---

<div class="post-metadata">

**Author:** ![Armigo](https://community.algoriddim.com/user_avatar/community.algoriddim.com/armigo/32/2239_2.png) [@Armigo](https://community.algoriddim.com/u/Armigo)\
**Post date:** [July 22, 2026, 9:12pm UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/32 "2026-07-22T21:12:06Z")

</div>

Very clear now!

> [@Slak\_Jaw](#):
>
> abandoned 1TB HDD with the pre-edit copy

Too late, sir. I wiped it clean yesterday - sold HDD off.  
All I have now is the SSD with singular files and their library ghosts  
Unable to upload screen recordings here - must be my poor 3G

---

<div class="post-metadata">

**Author:** ![Slak\_Jaw](https://community.algoriddim.com/user_avatar/community.algoriddim.com/slak_jaw/32/6517_2.png) [@Slak\_Jaw](https://community.algoriddim.com/u/Slak_Jaw)\
**Post date:** [July 22, 2026, 9:24pm UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/33 "2026-07-22T21:24:27Z")

</div>

Okay, thanks for the update @Armigo

---

<div class="post-metadata">

**Author:** ![Slak\_Jaw](https://community.algoriddim.com/user_avatar/community.algoriddim.com/slak_jaw/32/6517_2.png) [@Slak\_Jaw](https://community.algoriddim.com/u/Slak_Jaw)\
**Post date:** [July 23, 2026, 1:16pm UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/34 "2026-07-23T13:16:29Z")

</div>

Hi again @Armigo, engineering is asking if you can provide versions of an audio file before and after any metadata edits so we they can inspect them.

---

<div class="post-metadata">

**Author:** ![Armigo](https://community.algoriddim.com/user_avatar/community.algoriddim.com/armigo/32/2239_2.png) [@Armigo](https://community.algoriddim.com/u/Armigo)\
**Post date:** [July 23, 2026, 2:58pm UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/35 "2026-07-23T14:58:25Z")

</div>

1  
I have an automated (nearly daily) CCC backup task destined to a NAS storage that happens every midnight as long as my work SSD is plugged to the mac on wifi - so essentially is impossible to have a backup copy that differs from my work SSD. And as you have been following, I have managed to exorcise (manually) all my pre-existing ghost records - last ghost exited yesterday, and a CCC backup followed almost immediately at midnight.  
2  
My library is 100% mp4 files - and for some reason this entire week I am not able to upload media files online succesfully, no matter the size (internet issues i guess - upload goes to 90%+ and fails)  
3  
I am gonna try a small collection of some random mp3’s on a separate thumb drive (backed up only once to my mac) and see if really I can recreate some ghosts off them. This might take a few days though (of waiting for ghosts if any).  
Will report back

---

<div class="post-metadata">

**Author:** ![Slak\_Jaw](https://community.algoriddim.com/user_avatar/community.algoriddim.com/slak_jaw/32/6517_2.png) [@Slak\_Jaw](https://community.algoriddim.com/u/Slak_Jaw)\
**Post date:** [July 23, 2026, 3:02pm UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/36 "2026-07-23T15:02:43Z")

</div>

Sounds good! Thanks again @Armigo

---

<div class="post-metadata">

**Author:** ![Armigo](https://community.algoriddim.com/user_avatar/community.algoriddim.com/armigo/32/2239_2.png) [@Armigo](https://community.algoriddim.com/u/Armigo)\
**Post date:** [July 23, 2026, 4:00pm UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/37 "2026-07-23T16:00:21Z")

</div>

Sheer luck - this coupled type came out fast!

 ![Screenshot 2026-07-23 at 18.53.03](https://community-assets.algoriddim.com/original/3X/e/8/e875cf874fccbbca33ed00484412e6dff2a40c3e.jpeg)

Pre-edit copy  
[https://community-assets.algoriddim.com/original/3X/6/a/6a89809380fd82cfae6532b024572d875f8d09a0.mp3](https://community-assets.algoriddim.com/original/3X/6/a/6a89809380fd82cfae6532b024572d875f8d09a0.mp3)

Post- edit copy  
[https://community-assets.algoriddim.com/original/3X/8/7/878970ebe6f52e2ba3452022746e9ab6b562d8c8.mp3](https://community-assets.algoriddim.com/original/3X/8/7/878970ebe6f52e2ba3452022746e9ab6b562d8c8.mp3)

---

<div class="post-metadata">

**Author:** ![Slak\_Jaw](https://community.algoriddim.com/user_avatar/community.algoriddim.com/slak_jaw/32/6517_2.png) [@Slak\_Jaw](https://community.algoriddim.com/u/Slak_Jaw)\
**Post date:** [July 23, 2026, 4:10pm UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/38 "2026-07-23T16:10:46Z")

</div>

Nice one @Armigo! This is exactly what we need. Thanks!

---

<div class="post-metadata">

**Author:** ![Armigo](https://community.algoriddim.com/user_avatar/community.algoriddim.com/armigo/32/2239_2.png) [@Armigo](https://community.algoriddim.com/u/Armigo)\
**Post date:** [July 23, 2026, 5:23pm UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/39 "2026-07-23T17:23:32Z")

</div>

Am afraid I may have opened another can of worms here - I hope it stops on the 27mp3’s only I used.

 ![Screenshot 2026-07-23 at 19.23.20](https://community-assets.algoriddim.com/original/3X/3/d/3d1d4d0359fb037f155891d462a4c4930f474cfe.jpeg)

This decoupled ghost has creeped into my library (i had forgotten fact that this file belonged in my library too, but in a different internal ssd folder ( ghost/Original are both now pointing to internal SSD file, instead of actual file in thumb drive i had just imported and edited on).

This brings a new answer too: having same track (though file-named differently, in different locations), if imported both/all into djay library, AND id3 tag externally edited in any, may cause ghosting.  
For the record: I have 3 instances of the same file " **Otum Oko**"as shown; 1 each in thumbdrive, Downloads and in another internal ssd subfolder

 ![Screenshot 2026-07-23 at 20.08.18](https://community-assets.algoriddim.com/original/3X/4/1/4169ef05ef215f818c4d64f78d6e1e773d4968ae.jpeg)  
Please note the respective id3 tags as seen from kid3 (incase the upload here loses those)

Copy in internal SSD that had always been in library un-ghosted - the one I had forgotten about.  
[https://community-assets.algoriddim.com/original/3X/e/7/e7468ea1dfb6175b44dede170f8cf1a14627f7af.mp3](https://community-assets.algoriddim.com/original/3X/e/7/e7468ea1dfb6175b44dede170f8cf1a14627f7af.mp3)  
As seen in kid3:

 ![Screenshot 2026-07-23 at 20.13.30](https://community-assets.algoriddim.com/original/3X/7/6/76ed9957c9ae7ac5fa6746477d5e9a005fafbb9c.jpeg)

Thumb drive copy I just imported and edited id3 via serato  
[https://community-assets.algoriddim.com/original/3X/0/b/0b456d462bb825dcaaf2525d9507e82fa36c1e93.mp3](https://community-assets.algoriddim.com/original/3X/0/b/0b456d462bb825dcaaf2525d9507e82fa36c1e93.mp3)  
As seen in kid3:

 ![Screenshot 2026-07-23 at 20.20.08](https://community-assets.algoriddim.com/original/3X/4/4/44cf77460f228fbeaf9f1cfbed05c8a55b289c92.jpeg)

3rd copy in “downloads” folder (never directly imported to djay before) - the most earliest untouched version i copyied into thumb-drive above  
[https://community-assets.algoriddim.com/original/3X/c/6/c6d8984a0535805785fd9f8934ad535a7bb22973.mp3](https://community-assets.algoriddim.com/original/3X/c/6/c6d8984a0535805785fd9f8934ad535a7bb22973.mp3)  
As seen in kid3:

 ![Screenshot 2026-07-23 at 20.22.51](https://community-assets.algoriddim.com/original/3X/2/c/2c0cf5c876ac8db843b309c39903a168256ca493.jpeg)

---

<div class="post-metadata">

**Author:** ![Slak\_Jaw](https://community.algoriddim.com/user_avatar/community.algoriddim.com/slak_jaw/32/6517_2.png) [@Slak\_Jaw](https://community.algoriddim.com/u/Slak_Jaw)\
**Post date:** [July 23, 2026, 7:25pm UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/40 "2026-07-23T19:25:21Z")

</div>

Okay, wow! Super helpful as always @Armigo - thanks for all the careful observations and details. Let me digest this and share everything with engineering. I’ll get back to you soon.

---

<div class="post-metadata">

**Author:** ![EwoutdeBoer](https://community.algoriddim.com/letter_avatar_proxy/v4/letter/e/7feea3/32.png) [@EwoutdeBoer](https://community.algoriddim.com/u/EwoutdeBoer)\
**Post date:** [July 24, 2026, 11:28am UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/41 "2026-07-24T11:28:11Z")

</div>

This also looks like the mixmaster G issue, where Djay seems to use the first found file with the same Artist - Title - Length combination. So you imported from the thumb drive and while the combination is the same on the internal ssd both entries in the database now point to the ssd which was first found. It could be that while you imported the ssd version earlier it is more on top in the database, while scanning for the combination that file link is found first. But these are all assumptions / possibillities

---

<div class="post-metadata">

**Author:** ![Armigo](https://community.algoriddim.com/user_avatar/community.algoriddim.com/armigo/32/2239_2.png) [@Armigo](https://community.algoriddim.com/u/Armigo)\
**Post date:** [July 24, 2026, 11:46am UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/42 "2026-07-24T11:46:44Z")

</div>

> [@EwoutdeBoer](#):
>
> But these are all assumptions / possibillities

Exactly - but if MixMasterG said it, I take it as it is (fact). That guy knows alot of good techie shyte

---

<div class="post-metadata">

**Author:** ![EwoutdeBoer](https://community.algoriddim.com/letter_avatar_proxy/v4/letter/e/7feea3/32.png) [@EwoutdeBoer](https://community.algoriddim.com/u/EwoutdeBoer)\
**Post date:** [July 24, 2026, 11:58am UTC](https://community.algoriddim.com/t/duplicate-ghost-files/42759/43 "2026-07-24T11:58:07Z")

</div>

I totally agree, the assumptions were about the stuff in my post: It probably finds the ssd record first while it was added to the library before the version on the thumb drive.

[Previous page](https://community.algoriddim.com/t/duplicate-ghost-files/42759.md?page=1)

[Next page](https://community.algoriddim.com/t/duplicate-ghost-files/42759.md?page=3)
