Summary
When ob sync runs in a headless container with appearance-data in its sync configuration, any CSS snippet or theme file uploaded by a real Obsidian client (desktop/mobile) is downloaded by the container and then immediately deleted from the remote in the same sync pass. This creates an infinite delete loop: the desktop client re-uploads, the container deletes again.
Reproduction steps
-
Run
ob sync(orob sync --continuous) in a headless container withappearance-datainallowSpecialFiles. -
From a real Obsidian client, add a CSS snippet (e.g.
.obsidian/snippets/my-style.css) to the vault. -
Wait for the headless container to sync.
-
Observe the following sequence in the logs:
Push: .obsidian/snippets/my-style.css (updated)
Downloading .obsidian/snippets/my-style.css
Downloaded .obsidian/snippets/my-style.css
Accepted .obsidian/snippets/my-style.css
Deleting remote file .obsidian/snippets/my-style.css ← bug
The file is downloaded to disk and accepted, then deleted from the remote in the same sync pass. On the next pass the desktop client re-uploads it and the cycle repeats.