No description
  • C# 81%
  • TypeScript 14.5%
  • JavaScript 3%
  • CSS 0.6%
  • HTML 0.4%
  • Other 0.5%
Find a file
2026-08-06 20:18:47 +02:00
.claude RockHeaven opgezet als kopie van RockHaven.Player 2026-07-28 17:23:11 +02:00
.forgejo/workflows De player praat met de server in plaats van met de database 2026-07-31 16:30:08 +02:00
.vscode RockHeaven opgezet als kopie van RockHaven.Player 2026-07-28 17:23:11 +02:00
RockHeaven.Android Elke collectie houdt zijn eigen plek 2026-08-06 15:27:53 +02:00
RockHeaven.Common Een lopende baan is nu te volgen 2026-08-06 19:44:32 +02:00
RockHeaven.Core De opzoeking vermenigvuldigde zichzelf 2026-08-06 20:14:11 +02:00
RockHeaven.Player Een lopende baan is nu te volgen 2026-08-06 19:44:32 +02:00
RockHeaven.Server Een lopende baan is nu te volgen 2026-08-06 19:44:32 +02:00
.gitignore RockHeaven opgezet als kopie van RockHaven.Player 2026-07-28 17:23:11 +02:00
appsettings.json De database is PostgreSQL 2026-08-03 14:54:51 +02:00
CLAUDE.md De opzoeking vermenigvuldigde zichzelf 2026-08-06 20:14:11 +02:00
README.md Welke rechten de databasegebruiker nodig heeft 2026-08-03 16:07:17 +02:00
RockHeaven.sln De player praat met de server in plaats van met de database 2026-07-31 16:30:08 +02:00

RockHeaven

A personal music library of hundred-track volumes, with a desktop player, a web player and a phone app over it. Started as a copy of RockHaven.Player.

Projects

  • RockHeaven.Player — the Avalonia GUI: views, view models and the player-only services (mpv playback, API client, theme, fonts). It is a client of the server and holds no database of its own.
  • RockHeaven.Server — the API over the library and the web player on top of it. The one program that opens the database and the mp3 files.
  • RockHeaven.Core — the supporting library: the PostgreSQL database (EF Core) and the domain services it builds on. Only the server references it.
  • RockHeaven.Common — the wire contracts, the volume arithmetic and the configuration and logging layers, shared by all three.
  • RockHeaven.Android — a React Native app over the same API, with its own build and its own CLAUDE.md. Not in the solution.

Build and run

dotnet build RockHeaven.sln
dotnet run --project RockHeaven.Server   # the library; the player needs it
dotnet run --project RockHeaven.Player

Playback shells out to mpv, so that has to be installed.

Configuration

appsettings.json in the repository root is copied next to the binary on every build. It names the music folder the collections sit in, the address the server listens on, the address the player talks to, and the Serilog sinks.

Nothing secret goes in it — it is in the repository. The database connection string, the fanart.tv key and the credentials for sending a login code live in ~/.config/rockheaven/settings.json, or in the environment (DatabaseSettings__ConnectionString, SmsSettings__Password, …), which is how the container is told.

Signing in is a code sent by mail or text message to somebody in the users table; there is no shared password. The first row goes in by hand — see CLAUDE.md.

The database user needs to own the schema, which on PostgreSQL 15 and up it does not by default — dotnet ef database update fails with 42501: permission denied for schema public otherwise. CLAUDE.md has the two lines that fix it.

Release

Pushing to main runs the workflows under .forgejo/workflows/, which publish framework-dependent linux-x64 tarballs to Forgejo releases tagged player-v<n>, server-v<n> and android-v<n>. The server workflow also builds and pushes the Docker image out of the same publish. The prefixes matter: the build number is per workflow, so two projects releasing under a bare v<n> would overwrite each other.