# Claude Desktop — Native Build auf NixOS Anleitung für den nativen Produktiv-Build auf NixOS. **Das CI-AppImage funktioniert auf NixOS nicht** (WebKit2GTK/Mesa EGL-ABI-Konflikt, siehe KB #381) — deshalb wird hier immer nativ über die Nix-Dev-Shell gebaut. ## Voraussetzungen - NixOS-System mit `nix-shell` im PATH - `shell.nix` im Projekt-Root (liefert Rust, Node 22, WebKitGTK 4.1, GTK3, OpenSSL, libsoup3 etc.) - Projekt liegt auf SMB-Mount — `/mnt/17 - Entwicklungen/20 - Projekte/ClaudeDesktop` ## Warum `CARGO_TARGET_DIR=/tmp/...`? Das Projekt liegt auf einem SMB-Share. Cargo kann dort nicht zuverlässig schreiben (I/O-Errors bei Lockfiles, Rename-Operationen scheitern). Deshalb muss das Build-Target auf ein lokales Dateisystem (tmpfs/ext4) umgeleitet werden. Siehe KB #382. ## Build-Befehl (der Pflicht-Weg) ```bash CARGO_TARGET_DIR=/tmp/claude-target \ nix-shell shell.nix --run 'npm ci && npm run tauri build -- --bundles appimage' ``` Phasen: 1. `npm ci` — Frontend-Abhängigkeiten (überspringbar wenn `node_modules/` aktuell ist) 2. SvelteKit-Build — produziert `build/` (Vite) 3. Cargo-Build `--release` — kompiliert Rust-Binary in `/tmp/claude-target/release/claude-desktop` 4. Tauri-Bundle (AppImage) — **crasht auf NixOS oft in der pkg-config-Phase von `linuxdeploy`** > Das Bundling darf scheitern — das Binary aus Phase 3 ist trotzdem lauffähig. ## Binary starten ```bash nix-shell shell.nix --run /tmp/claude-target/release/claude-desktop ``` Der Start muss durch `nix-shell` laufen, damit `LD_LIBRARY_PATH` korrekt gesetzt ist (WebKitGTK, GTK3 etc.). ## Inkrementelle Builds Nach Code-Änderungen reicht: ```bash CARGO_TARGET_DIR=/tmp/claude-target \ nix-shell shell.nix --run 'npm run tauri build -- --bundles appimage' ``` - Nur Rust geändert → Cargo baut inkrementell neu (~10–60 s) - Nur Frontend geändert → Vite+Cargo linken neu (~30 s) - Abhängigkeiten neu → erster Cargo-Build dauert 5–15 min ## Typische Fehler | Symptom | Ursache | Fix | |---|---|---| | `error: could not write to ...` | Cargo auf SMB | `CARGO_TARGET_DIR=/tmp/...` vorne anstellen | | `pkg-config exited with status code 1` am Ende | Tauri-Bundler-Bug bei AppImage auf NixOS | ignorieren, Binary ist fertig | | `EGL_BAD_PARAMETER` beim Start | AppImage statt nativem Binary gestartet | `/tmp/claude-target/release/claude-desktop` direkt starten | | `webkit2gtk-4.1 not found` | außerhalb von `nix-shell` | Start immer via `nix-shell shell.nix --run …` | | `rustc: command not found` | außerhalb von `nix-shell` | siehe oben | ## Hot-Reload-Dev-Mode (Alternative) Für UI-Entwicklung reicht meist der Dev-Modus — kein Release-Build nötig: ```bash nix-shell shell.nix --run 'npm ci && npm run tauri:dev' ``` Vite auf Port 1420 + Tauri-Window. Rust wird unoptimiert gebaut, deutlich schneller für Iteration.