kami d28a92803b feat(vibe): offer the four fifths of the library it never reached
Of 5,365 tracks, 692 had ever been played and 1,027 had ever entered a
plan. Four things kept the Vibe circling the same music.

Comfort took each top artist's two highest-scoring tracks in a fixed
order, so it proposed the same eighteen candidates in every session for
as long as the listener's top artists held still. It now samples two
from each artist's best ten.

A track the listener has never played now scores as if it carried real
relevance. Without that, library-fallback — the one generator that
samples the whole library evenly — entered at 0.05 and lost every slot.

A quarter of every plan is now reserved for unheard tracks outright,
taken from the tail so the track about to play keeps its shaping.

Hard exclusion reached back forty completed plays, so a track heard last
night was a candidate again tonight. It now covers everything heard in
the last fourteen days, counted from a durable serve or a play and never
from a plan item, since most planned tracks are replaced unheard. A cap
keeps the window from ever holding back more than 40% of the library.

Library-fallback also offers probation recommendations now. It is the
only generator that does not walk the graph, so it is how an acquired
recommendation gets heard before anything has enriched it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KENqSChfyqWnor6ud2WWH6
2026-08-10 13:59:44 +04:00

muzick

A high-performance, distributed music orchestration and recommendation platform.

Overview

muzick is designed to manage a local music library while providing an "infinite vibe" listening experience. It bridges the gap between a local filesystem and advanced discovery engines through a tiered recommendation architecture.

Tech Stack

Frontend

  • Framework: React
  • Routing: TanStack Router
  • Data Fetching: TanStack Query (with Look-ahead Buffering)
  • State Management: Zustand (for Session/Vibe state)
  • Styling: CSS Variables (Customizable Themes)

Backend

  • Runtime: Node.js / TypeScript
  • Framework: Fastify
  • Task Queue: BullMQ (via Redis)
  • Search: Typesense

Infrastructure & Data

  • Database: PostgreSQL (Source of truth for metadata, relationships, and session state)
  • Cache/Queue: Redis
  • Audio Analysis: Essentia (via Worker processes)
  • External Metadata: MusicBrainz, Discogs, LRCLib, Cover Art Archive

Core Concepts

  • The Rolling Vibe: A continuous, evolving stream of music that uses a "Rolling Window" of tracks. It interleaves owned library tracks with high-probability "probation" tracks (external discoveries).
  • The Dislike Lifecycle: A multi-stage state machine that protects users from accidental deletions while ensuring the library stays clean.
  • Tiered Similarity: Instant metadata-based matches, followed by deep audio-feature similarity.

Getting Started

Prerequisites

  • Docker & Docker Compose

Running Locally

Vibe uses the same per-user identity convention as the rest of the API: x-user-id when supplied, otherwise the local default user. Each user's Vibe session and listening history are isolated from other users.

docker-compose up -d
S
Description
No description provided
Readme 2.7 MiB
Languages
TypeScript 95.5%
PLpgSQL 2.4%
CSS 1.4%
JavaScript 0.4%
Dockerfile 0.2%