No description
  • C# 43.5%
  • Rust 34.9%
  • TypeScript 12.5%
  • QML 5.4%
  • JavaScript 2.2%
  • Other 1.5%
Find a file
2026-10-01 21:01:22 +02:00
.claude RockHeaven opgezet als kopie van RockHaven.Player 2026-07-28 17:23:11 +02:00
.forgejo/workflows RockHeaven.Gnome: GTK 4/libadwaita-speler naast de Qt-client 2026-09-29 12:39:37 +02:00
.vscode VS Code: RockHeaven.Gnome debuggen met F5 2026-10-01 15:30:55 +02:00
RockHeaven.Android RockHeaven.Android: volumeplaatje als achtergrond van de speler, lichtere laag 2026-09-29 10:03:47 +02:00
RockHeaven.Common Het jaartal volgt de gevonden plaat, en ging vanuit beheer verloren 2026-08-10 14:49:51 +02:00
RockHeaven.Core Het doorlopen zweeg een minuut en werd afgekapt 2026-08-10 14:08:15 +02:00
RockHeaven.Gnome RockHeaven.Gnome: scanknop in het beheervenster 2026-10-01 21:01:02 +02:00
RockHeaven.Qt RockHeaven.Gnome: GTK 4/libadwaita-speler naast de Qt-client 2026-09-29 12:39:37 +02:00
RockHeaven.Server RockHeaven.Player verwijderd; de Qt-client is de desktopspeler 2026-09-29 09:48:09 +02:00
.gitignore Deb naar main folder kopiereen 2026-08-20 16:51:25 +02:00
appsettings.json RockHeaven.Player verwijderd; de Qt-client is de desktopspeler 2026-09-29 09:48:09 +02:00
CLAUDE.md RockHeaven.Gnome: GTK 4/libadwaita-speler naast de Qt-client 2026-09-29 12:39:37 +02:00
README.md RockHeaven.Player verwijderd; de Qt-client is de desktopspeler 2026-09-29 09:48:09 +02:00
RockHeaven.sln RockHeaven.Player verwijderd; de Qt-client is de desktopspeler 2026-09-29 09:48:09 +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; the Avalonia player that came out of that has since been replaced by the Qt one.

Projects

  • 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.
  • RockHeaven.Qt — the desktop player, Rust + Qt (QML) over the server's API, with its own Cargo build and its own CLAUDE.md. Not in the solution.
  • 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; every player needs it

The desktop player builds with Cargo from RockHeaven.Qt/ — see its CLAUDE.md.

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, 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 server-v<n>, qt-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.