Admin b60a87adb5 web-player: big pages (Explore, Home) and tracks.ts cleanup
This pass also tackles the task deferred earlier: removing
tracks.ts's TrackTarget wrapper and its 8 accessors
(targetId/targetTitle/targetArtist/targetOwnerUserId/targetExplicit/
targetListensCount/isTargetCurrent/queueItemForTarget/
targetForQueueItem). Explore, Home, Mix, menus.svelte.ts and mixes.ts
now use track objects directly, with
toQueueItem/trackFromQueueItem (new, in player.svelte.ts) as the only
converters. Along the way, TypeScript revealed that isExplicit
doesn't exist in the real /tracks schema: Explore's "explicit" badge
was already a no-op before this refactor (always undefined ??
false); the binding is removed instead of pretending support that
never existed.

Explore: GENRE_INFO/genreTiles are extracted to src/lib/genres.ts;
the search logic
(showGroup/capped/matchPlaylists/searchCounts/searchChips/findTopResult)
is extracted to src/lib/search.ts as pure functions parameterized by
filter/query instead of closing over component state. "Top result"
unifies the duplicated button/link with <svelte:element>. Decision
made without blocking: the 4 group blocks (Tracks/Albums/Users/
Playlists) are not collapsed into a single {#each groups} — each
group has genuinely different snippets, context menu and ListRow
props, and a generic config would have added more indirection than it
removed.

Home: uses Page instead of a hand-rolled page-x; the 3 stats become
an {#each}; the hero/spotlight backgrounds (inline style= with CSS
variables) become the hero-surface/spotlight-surface utilities, and
gap-11.5 is replaced by the --spacing-section token (2.875rem) via
gap-section.

Verified with npm run check (0 errors) and npm run build. /explore
without a session redirects to /login because +layout.server.ts
requires allowAnonymousListening from the backend (unreachable
without Docker this session) — pre-existing behavior, not a
regression. No authenticated visual QA; smoke-tested /login with no
console errors.
2026-09-21 14:51:43 +02:00

Musify

Music streaming platform: upload your own tracks, process them asynchronously (audio transcoded to .m4a, thumbnails generated) and stream them without the bytes ever going through the API.

backend/      .NET 10 — Domain / Application / Infrastructure / Api / Worker / StreamingGateway / Tests
web-player/   SvelteKit 2 + Svelte 5 + Tailwind 4 web client
deploy/       Docker Compose stacks — self-contained, no wrapper scripts
docs/         What each piece does and why (in Spanish)
dotnet test backend/Musify.slnx   # backend/Tests/ — Docker running (Testcontainers: Postgres, SeaweedFS)

Run it

Development (Docker Desktop):

docker compose -f deploy/compose.yml -f deploy/compose.dev.yml up -d

Infrastructure plus stream-ticket keys, database migrations and Zitadel OIDC provisioning — all as one-shot jobs baked into the compose file. Apps run from the IDE by default; add --profile apps up -d --build as a second command to run them in Docker instead.

Production, on a server with a domain:

cp deploy/.env.prod.example deploy/.env.prod   # fill in the domain and secrets
docker compose --env-file deploy/.env.prod -f deploy/compose.yml -f deploy/compose.prod.yml up -d
docker compose --env-file deploy/.env.prod -f deploy/compose.yml -f deploy/compose.prod.yml --profile apps up -d --build

Idempotent — run the same commands again to deploy an update. See deploy/README.md for the details, the port map and the production prerequisites.

Components

Service Port (dev) Role
Musify.Api 5111 REST API, issues presigned upload URLs and stream tickets
Musify.StreamingGateway 8081 YARP proxy that validates the stream ticket and serves the audio
Musify.Worker — MassTransit consumers: transcoding, thumbnails
web-player 5173 / 3000 Web client (SvelteKit, server-side OIDC session)
Zitadel 8080 Identity (OIDC/OAuth2)
PostgreSQL / RabbitMQ / SeaweedFS / Jaeger 59000 / 5672 / 8333 / 16686 Metadata, messaging, object storage, traces

More in docs/: architecture, authentication, storage, streaming, media processing, development.

S
Description
No description provided
Readme
5.1 MiB
Languages
C# 73.1%
Svelte 12.1%
TypeScript 9%
Kotlin 4.1%
CSS 1.1%
Other 0.6%