Names compared, not files: a folder counts as yours when your library has that album under that artist. Browse someone again to refresh their line.
{:else}A persistent SoulStream community on Freenet. The owner's signed checkpoint is the roster; a removal is a new epoch, and in a private Space every removal rotates the key. Not a Soulseek Room, and never mirrored to one. Invitations travel sealed through the encrypted inbox — the person you invite needs one. A member joins under a key minted for this Space alone, so its roster says nothing about who they are anywhere else; only the owner can put a name to one.
{community.spaceError}
{/if} {#if spaceTab === "chat"} {#if sv.pinned_uuid}A card goes quiet after {LISTEN_LIVE_MINS} minutes with nothing new — nobody is reported as listening because the app forgot to say they stopped.
Nothing played here yet. Turn the switch above on and the next track you finish appears — for everyone in the room, and nobody outside it.
{:else}Reading the room's lists…
{/if}A member's list is read when the Space opens and again after ten minutes; a member who never published costs a slow search, so they are asked again only hourly.
They appear in Members once they answer with the key they will wear here — an invitation on its own puts nobody on the roster.
{#if community.friends.some((f) => f.state === "friends")}Friends: {#each community.friends.filter((f) => f.state === "friends") as f (f.id)} {/each}
{/if} {/if}Members are their SoulStream identities here — a joined Space is a linked identity. Removing someone is a new epoch{#if sv.private}, and in this private Space it also rotates the key: those who stay receive the new one sealed{/if}.
A board lives beside a pinned playlist: members propose adds, removes and moves against the exact revision they see, and the playlist's owner decides. {#if spaceOwner}Pin one of your public playlists from the Chat tab and the board opens here.{:else}The owner has not pinned a playlist yet.{/if}
{community.boardError}
Reading the board through your node…
Proposals bind to revision {bv.revision_seq} exactly · {bv.i_am_owner ? "you decide" : "the playlist's owner decides"} · every decision is signed · {bv.contributors.length} {bv.contributors.length === 1 ? "contributor" : "contributors"} on epoch {bv.epoch}{#if !bv.reachable} · the owner has not opened the board yet{/if}
{community.boardError}
{/if}Move rows, take some out, add from your library. The owner receives titles, artists and albums — never a file, never a path. Nothing here plays or downloads.
Nothing pending. {#if bv.can_propose}Propose an add, a remove or a move against the current revision — up to 32 changes each, 8 pending per person.{/if}
{/if} {#each bv.proposals as p (p.id)}{p.note}
{/if}None yet. Each decision is owner-signed with a sequence number; the last 256 are kept.
{/if} {#each bv.decisions as d (d.seq)}What the network can see: that the Space exists, its owner, its roster keys, and — for a private Space — how many sealed lines it holds. Leaving does not erase copies others hold.
{#if sv.description}{sv.description}
{/if}Anyone who has your SoulStream ID can fetch this. It is signed by your persona key and replicated — publishing is not something that can be fully undone.
Preparing your photo and publishing it — a few seconds normally; the first publication can take longer.
{:else if profile?.avatar_note && profile.avatar_note !== "none published"}{profile.avatar_note}
{/if}Display names are not unique. People you meet may give you a private petname; you cannot see it.
A SoulStream identity is a key pair held by your local Freenet node. Turn the Freenet layer on (right) and the node will hold it; nothing is published until you say so.
{:else if !nodeUp}Waiting for the node — {status.text}. Identity needs a connected node.
{:else}Create a fresh key here, or bring one back from a recovery file. Creating one publishes nothing; your profile is a separate button, later.
{community.error}
{/if}Nothing published yet. Open a playlist and choose Share on SoulStream: a signed manifest goes to the network under your ID — titles, artists, albums, durations, your notes; never a file, never a path.
{:else} {#each community.published as p (p.playlist_id)}Withdrawing stops your pointer; copies others already fetched stay with them.
{/if}The fingerprint of your persona key. It is the stable you — names change, this does not. Share it as text; nothing else identifies you across networks.
Your identity lives in the node's key custody on this machine. Export a recovery file — encrypted with a passphrase you choose — and keep it somewhere that is not this disk.
Written: {exportDone.path} ({exportDone.bytes} bytes). Test it on another machine before you need it.
{/if}{community.error}
{/if}A paired device gets its own key and a signed grant — it never receives your root key or Soulseek password. Comes after the profile work settles.