{#if empty}

Welcome to SoulStream

Search the network, stream instantly, and follow artists — new releases, your library and their news will land here.

{:else}
{#if lead}
{/if}
{#if lead}
{/if}
{dateKicker()}
{greetWord()}
{fresh31} new this month {homeStore.follows.length} followed {libraryStore.albums.length} albums
{#each slots.slice(0, 7) as s (s.id)} {#if s.picture} {/if} {/each}

New from your artists · {homeStore.follows.length} followed

{#if lead}
{lead.upcoming ? "Coming" : "New"} · {kindLabel(lead.record_type).toUpperCase()}
{lead.title}
{lead.artistName} · {lead.upcoming ? upcomingLabel(lead) : age(lead.release_date)} {#if lead.track_count} ·{lead.track_count} tracks {/if}
{#if lead.upcoming} {:else} {/if}
{/if} {#snippet releaseCard(r, sub, chip, playable)}
openRelease(r)} onkeydown={(e) => e.key === "Enter" && openRelease(r)} >
{#if chip}{chip}{/if} {#if r.cover}
{:else}
{/if} {#if playable} {/if}
{r.title}
{sub}
{/snippet}
{#each gridItems as r (r.artistName + r.title)} {@render releaseCard( r, kindLabel(r.record_type) + " · " + r.artistName, r.upcoming ? inDays(r.release_date) : age(r.release_date), !r.upcoming && !r.mbOnly, )} {/each}
{#snippet bandRow(pic, title, meta, first, open)} {/snippet} {#if newsItems.length}

News · from your follows · last {NEWS_MAX_AGE_DAYS} days

{#each newsItems as n, i (n.url)} {@render bandRow( slots.find((s) => s.name === n.artist)?.picture, n.title, n.source + " · " + age(new Date(n.date * 1000).toISOString()), i < bandCols, () => openNews(n), )} {/each}
{/if} {#if jumpRows.length}

Jump back in · picks up where you left off

{#each jumpRows as r (r.artist + r.title)}
r.catalog_album_id && openCatalogAlbum(r.catalog_album_id)} onkeydown={(e) => e.key === "Enter" && r.catalog_album_id && openCatalogAlbum(r.catalog_album_id)} >
{#if r.last}{ageShort(r.last)}{/if}
{#if r.art_url} {:else if r.art_path} {/if}
{r.title} {#if r.kind === "library"}{/if}
{r.artist}
{/each}
{/if} {#if backCatalogue.length}

From the back catalogue · albums you may have missed

{#each backCatalogue as r (r.artistName + r.title)} {@render releaseCard(r, r.artistName, age(r.release_date), !r.mbOnly)} {/each}
{/if} {#if because.length}

Recommended for you · from everyone you follow

{#each because as r (r.id)} {/each}
{/if} {#if libraryRows.length}

Your library · {libraryStore.albums.length} albums

{#each libraryRows as a (a.id)}
goToView("library", { albumId: a.id })} onkeydown={(e) => e.key === "Enter" && goToView("library", { albumId: a.id })} >
{a.title}
{a.artist}
{/each}
{/if} {#if completeSet.length}

Complete the set · gaps on your shelf

{#each completeSet as row, i (row.slot.id)} {@render bandRow( row.slot.picture, row.slot.name, setNote(row), i < bandCols, () => openCatalogArtist(row.slot.id, { id: row.slot.id, name: row.slot.name }), )} {/each}
{/if} {#if following.length}

Following · {homeStore.follows.length} artists

{#each following as row, i (row.slot.id)} {@render bandRow( row.slot.picture, row.slot.name, followNote(row), i < bandCols, () => openCatalogArtist(row.slot.id, { id: row.slot.id, name: row.slot.name }), )} {/each}
{/if}
{/if}