Files
psysonic/nixos-install.md
T
cucadmuh 3501a82df6 rdocs(nix): refresh NixOS install guide for channels and CI (#380)
* docs(nix): refresh NixOS install guide for channels and CI

Align nixos-install.md with current automation: reusable verify-nix on
next/release, npmDepsHash sync on main, devShell vs shell.nix, nix run,
and pinning by branch or app-v tag. Link maintainers to RELEASE_PROCESS.

* docs(nix): steer production installs to release channel

Add a stability note and clarify pinning: prefer the release branch or
`app-v*` tags for everyday use; reserve main/next for contributors.
2026-04-30 03:29:28 +03:00

180 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Installing Psysonic on NixOS (flake)
This guide is for **NixOS** users who want **Psysonic from the upstream Git flake** (`github:Psychotoxical/psysonic`). Supported systems match the flake: **`x86_64-linux`** and **`aarch64-linux`**.
**Stability:** The project is in **very active development**. For **production or everyday use**, prefer **released builds**: pin the flake input to a stable **`app-v*`** tag, or track the **`release`** branch (`?ref=release`). Following **`main`** or **`next`** is better suited to contributors and early testers.
## Prerequisites
**Flakes** enabled (e.g. in `configuration.nix`):
```nix
nix.settings.experimental-features = [ "nix-command" "flakes" ];
```
## Binary cache (Cachix)
The project publishes store paths to a public Cachix cache so you can **substitute** binaries instead of compiling Psysonic locally on every machine.
- **Cache page:** [psysonic.cachix.org](https://psysonic.cachix.org)
- **Substituter URL:** `https://psysonic.cachix.org`
- **Public key** (trust this only if it matches what you expect from the cache owners):
```text
psysonic.cachix.org-1:M9cQyQ7tgvUWOQ5Pyt8ozlMoPLtOZir6MfRuTH9/VYA=
```
### NixOS (`configuration.nix` or a flake module)
Add the substituter **and** its signing key under `nix.settings`. Keep `cache.nixos.org` in the list so ordinary `nixpkgs` binaries still resolve:
```nix
{
nix.settings = {
substituters = [
"https://psysonic.cachix.org"
"https://cache.nixos.org/"
];
trusted-public-keys = [
"psysonic.cachix.org-1:M9cQyQ7tgvUWOQ5Pyt8ozlMoPLtOZir6MfRuTH9/VYA="
"cache.nixos.org-1:6NCHdSuAYQQOxGEKTGXLN9WWRXoSBT8GRiSnR6IdfGW="
];
};
}
```
After `nixos-rebuild switch`, builds that hit the cache will download from Cachix. More background: [Cachix — Getting started](https://docs.cachix.org/getting-started).
## Install on NixOS (flake configuration)
Add the repo as an **input**, then reference **`packages.<system>.psysonic`** (or **`default`**, which is the same package).
### Example: top-level `flake.nix` + `nixosConfigurations`
```nix
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
psysonic.url = "github:Psychotoxical/psysonic";
};
outputs = { self, nixpkgs, ... }@inputs: let
system = "x86_64-linux";
in {
nixosConfigurations.my-host = nixpkgs.lib.nixosSystem {
inherit system;
modules = [
./configuration.nix
{
environment.systemPackages = [
inputs.psysonic.packages.${system}.psysonic
];
}
];
};
};
}
```
Inside a **module** where you already have `pkgs` and flake `inputs` in scope, a common pattern is:
```nix
environment.systemPackages = with pkgs; [
# …
inputs.psysonic.packages.${pkgs.stdenv.hostPlatform.system}.psysonic
];
```
### Pinning a revision, branch, or tag
- **`main`** (default in the examples above) follows upstream development.
- **Channel branches** (`next`, `release`) exist for pre-release / release automation. For **operational installs**, prefer **`release`** (or an **`app-v*`** tag) over **`next`** or **`main`**; use **`?ref=next`** only if you want pre-release channel builds.
```nix
psysonic.url = "github:Psychotoxical/psysonic?ref=release";
```
- **Tags** (`app-v*`) match published GitHub releases and are the usual choice for a **reproducible** install aligned with a shipped version:
```nix
psysonic.url = "github:Psychotoxical/psysonic?ref=app-v1.44.0"; # example; pick a tag that exists on GitHub
```
Use a `ref` (branch, tag, or commit SHA) that exists on GitHub.
### How `flake.lock` and `nix/upstream-sources.json` stay in sync
CI runs a **verify-nix** job (Nix build, `npmDepsHash` refresh, `flake.lock` refresh, Cachix push) from **`.github/workflows/reusable-channel-publish.yml`**, invoked by:
- **`.github/workflows/next.yml`** (Next channel, branch `next`)
- **`.github/workflows/release.yml`** (Release channel, branch `release`)
So the lock and **`nix/upstream-sources.json`** (`npmDepsHash`) are updated as part of channel publishing, not only from a single legacy “tag-only” path. On **`main`**, **`nix-npm-deps-hash-sync.yml`** can also open PRs when `package-lock.json` changes so the Nix npm hash does not drift.
End users who pin **`main`** should run `nix flake update psysonic` (or equivalent) periodically if they want the latest lock inputs from upstream.
### One-shot run (no system install)
From any machine with flakes:
```bash
nix run github:Psychotoxical/psysonic
```
Same package as `nix build` / `packages.<system>.default`; uses the flake `apps` output.
### Apply configuration
- **NixOS flake host**
```bash
sudo nixos-rebuild switch --flake .#my-host
```
- **Home Manager** (if used separately)
```bash
home-manager switch --flake .#my-user@my-host
```
## Home Manager
If you manage packages with [Home Manager](https://github.com/nix-community/home-manager), add the same package to `home.packages`:
```nix
home.packages = [
inputs.psysonic.packages.${pkgs.stdenv.hostPlatform.system}.psysonic
];
```
(Adjust how `inputs` / `pkgs` are passed into your Home Manager module.)
## Development shell (contributors)
From a **flake-enabled** clone of the repo:
- **`nix develop`** — enters the upstream `devShell` (Rust, Node 22, WebKitGTK, GStreamer plugins for the webview, env hooks aligned with `package.json` / Tauri dev).
- **`nix shell .#devShells.default`** — same packages and hooks without `nix develop`s subshell semantics.
The flake **`devShell`** uses the same **`nixpkgs`** input as **`packages.psysonic`** (see **`flake.nix`**).
If you prefer **classic `nix-shell`** without evaluating the flake, the repo also provides **`shell.nix`**: it pulls **`nixos-unstable`** via `fetchTarball`, so the nixpkgs pin may **differ** from **`flake.lock`**; use it only when you understand that tradeoff (comments at the top of `shell.nix` describe local Tauri build commands).
## Desktop entry
The flake package installs a **`.desktop`** file and icon via `copyDesktopItems`; after `nixos-rebuild switch` (or a Home Manager activation that includes the package), Psysonic should appear in your application launcher like any other desktop app.
## Troubleshooting (Linux / WebKit)
Some GPU / compositor setups show a black window or broken scrolling under Wayland/EGL. The upstream Help / FAQ documents workarounds (e.g. running under **X11** and compositor-related env vars). Those apply to the Nix-built binary as well as other Linux builds.
## More detail in-repo
- **`flake.nix`** — `packages`, `apps`, `devShells`, supported systems; inline comments for `nix build` / `nix develop` / `nix run`.
- **`nix/psysonic.nix`** — how the app is built from this source tree (`npmDepsHash` from **`nix/upstream-sources.json`**).
- **`.github/workflows/reusable-channel-publish.yml`** — **`verify-nix`** job (prefetch npm deps hash, `nix flake update`, `nix build .#psysonic`, Cachix push, optional lock refresh PR).
- **`.github/workflows/next.yml`** / **`.github/workflows/release.yml`** — channel workflows that call the reusable publish workflow with **`verify_nix: true`**.
- **`.github/workflows/nix-npm-deps-hash-sync.yml`** — keeps **`nix/upstream-sources.json`** aligned with **`package-lock.json`** on **`main`** via PRs.
For the full promotion and release picture (branches, tags, automation), see **`RELEASE_PROCESS.md`**.