Files
Musify/docs
AdminandClaude Sonnet 5 aa4b81b9a7 Clean up backend and web-player leftovers
Remove dead scaffold/config cruft and stale references left over from
recent refactors: dotnet's WebApi.http template file, the AppSettings
PascalCase/Dockerfile workaround (renamed to appsettings.json to match
convention), empty directories left behind by the auth-route and
folder-structure moves, a stale ESLint ignore, and the now-fully-applied
frontend refactor plan doc.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-22 16:08:44 +02:00
..

Musify documentation

Musify is a music streaming backend: upload tracks, process them (transcode the audio to .m4a, generate thumbnails), organize them into playlists, and stream them without the bytes ever passing through the API.

This folder explains what each piece does, its purpose, and why it's built this way.

Index

  • architecture.md: overview, components, how they fit together, and the main flows.
  • projects.md: what each project/solution is and what it's for.
  • authentication.md: Zitadel (OIDC), JWT validation, user provisioning/sync.
  • storage.md: SeaweedFS (S3), key layout, presigned URLs, what's public vs. private.
  • streaming.md: audio streaming (.m4a over HTTP range) with stream tickets (RS256) and the reverse proxy (StreamingGateway).
  • media-processing.md: the worker and its MassTransit workflows (audio transcoding, thumbnails).
  • development.md: running everything locally, containers, ports, commands.
  • ../deploy/README.md: deployment in detail, compose, scripts, and production.

Component map (high level)

                 ┌─────────────────────────────────────────────┐
   Client   ───► │ Musify.Api (:5111)  REST API + issues tickets│
                 └─────────────────────────────────────────────┘
                        │ EF Core          │ presigned (uploads)   │ MassTransit (events)
                        ▼                  ▼                       ▼
                 PostgreSQL          SeaweedFS S3 (:8333)     RabbitMQ ──► Worker (processes)
                 (metadata)          (objects)                            audio→.m4a, images
                                          ▲
   Client   ───► StreamingGateway (:8081) ┘   serves .m4a audio (validates ticket, proxies to the filer)

   Login: Client ◄──► Zitadel (:8080, OIDC)   →  Musify.Api validates the JWT

PostgreSQL, Zitadel, SeaweedFS and RabbitMQ are not run by this repository. They're shared infrastructure, provided by the separate Infrastructure repository, that this stack connects to the same way any other project does.

Stack

  • .NET 10, C#. Minimal APIs (Musify.Api), Worker Service (Musify.Worker), ASP.NET + YARP (Musify.StreamingGateway).
  • CQRS with [Mediator] (source generator) and results via ErrorOr.
  • EF Core 10 + PostgreSQL (metadata).
  • MassTransit 8 + RabbitMQ (async processing with routing slips/sagas).
  • SeaweedFS (S3-compatible object storage, via AWSSDK.S3).
  • ffmpeg (audio transcoding to AAC/.m4a), SixLabors.ImageSharp (thumbnails).
  • Zitadel (OIDC/OAuth2) for identity.

Repository layout

A single repo: backend/ (the six .NET projects), web-player/ (the SvelteKit web client), deploy/ (Docker Compose stacks and scripts), and docs/. The shared infrastructure (Postgres, Zitadel, SeaweedFS, RabbitMQ, Jaeger) lives in the separate Infrastructure repository, a sibling of this one, and is not part of this layout.