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.
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
| Module | What it does |
|---|---|
identity | OpenIddict OIDC (auth-code + PKCE, refresh, client-credentials), accounts, device registry, versioned settings sync, GDPR export/erasure. |
updates | Signed (RS256) update feed; the public verification key is served to clients. |
catalog | MusicBrainz artist / release-group / recording search and lookup, rate-limited and cached. |
artwork | Cover Art Archive front covers, cloned into object storage with an SSRF allowlist and a long-lived cache header. |
directory | Podcast Index and Radio-Browser search with attribution and graceful degradation. |
recs | QuickMix similarity recommendations (heuristic scoring, explained; a pgvector pipeline can slot in behind the stable contract). |
social | Profiles, follow graph, activity feed, Zune Card, badges and moderation. |
media | Public-domain / CC streaming — legal-gated (a deliberate stub pending sign-off). |
Status
| Milestone | Scope | Status |
|---|---|---|
| M0 | Modular monolith + gateway, OpenIddict, Postgres/Redis/MinIO, compose + Helm, CI → ghcr | Done |
| M1 | Accounts + browser login, persistent keys, device registry, settings sync, signed updates | Done |
| M2 | Directory (podcast + radio) | Done |
| M3 | Catalog + artwork CDN (object storage) | Done |
| M4 | Social (profiles, feed, Zune Card, badges, moderation) | Done |
| M5 | QuickMix recommendations | Done |
| M6 | Media — public-domain / CC streaming | Legal-gated |
Security & hardening
- Auth rate limiting — a path-partitioned, per-IP fixed window on
/connect/token,/account/loginand/account/register. - Fail-closed admin — moderation/publish requires an allowlist outside development.
- CORS allowlist — browsers are constrained to
Cors:AllowedOrigins. - GDPR —
GET /v1/identity/me/export(portability) andDELETE /v1/identity/me(erasure; revokes OIDC tokens). - Schema — versioned EF Core migrations on PostgreSQL (
EnsureCreatedfor 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
ghcr.io/project-dorado/dorado-cloud-{api,gateway}.
Technology
| Layer | Choice |
|---|---|
| Runtime | ASP.NET Core minimal APIs (.NET 8) |
| Auth | OpenIddict 5 — authorization code + PKCE, refresh, client credentials |
| Data | EF Core + PostgreSQL (SQLite for local/dev), Redis cache, S3/MinIO object storage |
| Contract | OpenAPI at /swagger; a typed client SDK in clients/DoradoCloud.Client |
| Ops | Docker 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.