Backend · .NET 8 · self-hostable

Dorado Cloud

Community cloud services for the Dorado desktop and Android clients. Dorado Cloud replaces the long-dead Zune web services with a modern, open, self-hostable backend — shared catalog and artwork, identity and cross-device settings, recommendations, social features, directory search and signed app updates.

.NET 8 OpenIddict 5 (OIDC) PostgreSQL · Redis · S3 / MinIO Docker Compose · Helm

What it is

A modular monolith where each domain is an endpoint module mounted under /v1/{module}, behind a thin YARP gateway. Modules can be extracted into independent services later without changing the public routes. It is not affiliated with Microsoft and hosts no copyrighted media — streaming is limited to public-domain / Creative Commons content.

Modules

ModuleWhat it does
identityOpenIddict OIDC (auth-code + PKCE, refresh, client-credentials), accounts, device registry, versioned settings sync, GDPR export/erasure.
updatesSigned (RS256) update feed; the public verification key is served to clients.
catalogMusicBrainz artist / release-group / recording search and lookup, rate-limited and cached.
artworkCover Art Archive front covers, cloned into object storage with an SSRF allowlist and a long-lived cache header.
directoryPodcast Index and Radio-Browser search with attribution and graceful degradation.
recsQuickMix similarity recommendations (heuristic scoring, explained; a pgvector pipeline can slot in behind the stable contract).
socialProfiles, follow graph, activity feed, Zune Card, badges and moderation.
mediaPublic-domain / CC streaming — legal-gated (a deliberate stub pending sign-off).

Status

MilestoneScopeStatus
M0Modular monolith + gateway, OpenIddict, Postgres/Redis/MinIO, compose + Helm, CI → ghcrDone
M1Accounts + browser login, persistent keys, device registry, settings sync, signed updatesDone
M2Directory (podcast + radio)Done
M3Catalog + artwork CDN (object storage)Done
M4Social (profiles, feed, Zune Card, badges, moderation)Done
M5QuickMix recommendationsDone
M6Media — public-domain / CC streamingLegal-gated

Security & hardening

  • Auth rate limiting — a path-partitioned, per-IP fixed window on /connect/token, /account/login and /account/register.
  • Fail-closed admin — moderation/publish requires an allowlist outside development.
  • CORS allowlist — browsers are constrained to Cors:AllowedOrigins.
  • GDPRGET /v1/identity/me/export (portability) and DELETE /v1/identity/me (erasure; revokes OIDC tokens).
  • Schema — versioned EF Core migrations on PostgreSQL (EnsureCreated for local SQLite).
  • No DRM circumvention and no license-server emulation; no dev secret is seeded outside development.

Run it

# local (SQLite, no containers)
dotnet restore DoradoCloud.sln
dotnet run --project src/DoradoCloud.Api     # http://localhost:5080 (Swagger at /swagger)

# full stack (PostgreSQL + Redis + MinIO, gateway on :5088)
cp .env.example .env && docker compose up --build
The API is a modular monolith behind a YARP gateway. Official images are published to ghcr.io/project-dorado/dorado-cloud-{api,gateway}.

Technology

LayerChoice
RuntimeASP.NET Core minimal APIs (.NET 8)
AuthOpenIddict 5 — authorization code + PKCE, refresh, client credentials
DataEF Core + PostgreSQL (SQLite for local/dev), Redis cache, S3/MinIO object storage
ContractOpenAPI at /swagger; a typed client SDK in clients/DoradoCloud.Client
OpsDocker Compose, Helm chart, OpenTelemetry (opt-in), health probes

Legal & licensing

Code is MIT. Dorado Cloud hosts no copyrighted media and does not reimplement DRM. Metadata and artwork come from openly licensed providers with attribution. Zune, Zegoe, Zune HD and Microsoft are trademarks of Microsoft Corporation; Dorado is an independent, non-affiliated homage.

Run your own Dorado Cloud.

Self-host the whole stack with one compose file, or a Helm chart on Kubernetes.