- A followed playlist (the UFO in friend mode) appears in my sidebar with
a purple UFO: mixed in with my playlists alphabetically, or inside a
folder named after the friend (per-friend, in Sync Settings). It's never
a Playlist of mine, so it stays out of the library and its merges.
- It plays from the cache. Player's queue accepts friend-track keys,
resolved through Cassette: they scrobble to Last.fm but don't count in
my play journal. Songs still on their way are grey and skipped.
- The cassette column there is hidden by default (right-click the
header); pressing one takes the song into my library — straight from
the cache if it's there, otherwise by asking for it.
- Sync Settings per friend: keep followed songs separate (default) or add
them to my library. Unfollowing (right-click) frees their cache.
- The bottom bar says when the friend's folder last synced.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Sending: a friend's requests ∩ what I still offer is copied into my
outbox (via a .part name Syncthing never sees); whatever they no longer
request is deleted, so the outbox cleans itself up.
- Receiving: a finished file I cassetted is imported exactly like Add to
Library — organized into Artist/Album, tags read, date added now, none
of their listening history — and a song wanted only for a followed
playlist lands in the cache. Then requests.json is rewritten without
what arrived and without what they stopped offering.
- Safe to repeat: Syncthing temp files ignored, Syncthing asked whether a
file is whole, and an exact match already in my library is never
imported twice.
- Folders are watched (re-armed after each rename), with a slow fallback.
- file_importer split into stage_file (off the GUI thread) and
track_from_file (date added = now).
- pytest --syncthing now runs a real invite → share → request → deliver →
cleanup between two Syncthing instances.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>