Commit Diff


commit - 2aa9fbbba45049bab6b39e7ad5dd0ee7e22d5216
commit + d0ca2f7f9d8326831798201dc54be5ba04962e85
blob - 619a28117a31c0822a0433c70d96df05d42e74fb
blob + 8232a808f93cf6c90731455d34bdcf407ab9d539
--- home/ale/home.nix
+++ home/ale/home.nix
@@ -249,6 +249,7 @@
   home.packages = with pkgs; [
     yubikey-manager
     (callPackage ../../pkgs/librepods.nix { })
+    (callPackage ../../pkgs/nokkvi.nix { })
     gitstatus # da el binario gitstatusd que necesita Powerlevel10k (ver programs.zsh)
     meslo-lgs-nf # Nerd Font que recomienda p10k para sus glifos/iconos
     pfetch # info del sistema al abrir terminal (ver programs.zsh.initContent)
@@ -257,6 +258,14 @@
       # (no hay `programs.weechat`, se confirmó buscando en el source real del
       # input), así que la config de plugins/scripts queda a mano dentro de
       # weechat (`/script install ...`), no versionada en este repo.
+    jetbrains.idea # IntelliJ IDEA Ultimate -- paquete directo de nixpkgs, no
+      # Toolbox: Toolbox baja binarios fuera del store y se autoactualiza por
+      # su cuenta, no encaja con el modelo declarativo de este repo (mismo
+      # motivo por el que LibrePods se compila de fuente en vez de usar un
+      # AppImage, ver pkgs/librepods.nix). Requiere licencia/login JetBrains
+      # la primera vez que se abre. allowUnfree ya está en true a nivel
+      # sistema (hosts/ale/configuration.nix, por Nvidia/Steam) y
+      # useGlobalPkgs = true lo hereda acá, así que no hace falta nada extra.
     gpu-screen-recorder # dependencia del plugin oficial "screen_recorder" de Noctalia
       # (noctalia-dev/official-plugins) -- el plugin solo hace de wrapper/IPC,
       # busca este binario en PATH. El derivation de nixpkgs ya wrappea
blob - /dev/null
blob + ba257f7688ee0efb46a4ad98c57a9a6f9fd25055 (mode 644)
--- /dev/null
+++ pkgs/nokkvi.nix
@@ -0,0 +1,73 @@
+# Nokkvi (cliente de música nativo para Navidrome, github.com/f-o-o-g-s/nokkvi).
+# A diferencia de LibrePods, acá SÍ hay releases oficiales de Linux con
+# binario prebuilt -- pero el Cargo.toml del proyecto pinea `iced` a un
+# commit de la rama `master` upstream (no crates.io), lo que haría que
+# compilarlo de fuente con buildRustPackage dependa de un outputHashes
+# frágil que se puede romper con cada bump de esa fork. Por eso acá se usa
+# el binario oficial del release + autoPatchelfHook, en vez de compilar
+# (decisión tomada con el usuario, ver conversación -- prefirió esto a
+# nix-ld genérico + descarga manual sin declarar).
+#
+# El hash del tarball es el mismo `sha256` que publica el proyecto junto al
+# release (ver <url>.sha256 en la misma release de GitHub), así que además
+# de fijar la build es una verificación de integridad contra lo que firma
+# el autor. Para actualizar: cambiar `version` y `hash` (bajar el .sha256
+# del nuevo release y convertirlo con
+# `nix hash convert --hash-algo sha256 --to sri <hex>`).
+{ lib
+, stdenv
+, fetchurl
+, autoPatchelfHook
+, fontconfig
+, freetype
+, alsa-lib
+, pipewire
+, vulkan-loader
+, libxkbcommon
+, wayland
+}:
+
+stdenv.mkDerivation rec {
+  pname = "nokkvi";
+  version = "0.16.0";
+
+  src = fetchurl {
+    url = "https://github.com/f-o-o-g-s/nokkvi/releases/download/v${version}/nokkvi-v${version}-x86_64-unknown-linux-gnu.tar.gz";
+    hash = "sha256-SmBVYD2T6beJLGPoBeTktborhXP4jBaZSIdTQfo9Szs=";
+  };
+
+  nativeBuildInputs = [ autoPatchelfHook ];
+
+  # Dependencias directas del binario (confirmado con `readelf -d`):
+  # libfontconfig, libfreetype, libasound (ALSA), libpipewire-0.3, libgcc_s
+  # (stdenv.cc.cc.lib -- el runtime de gcc, no viene con ningún paquete de
+  # arriba, autoPatchelfHook no la encuentra si no se agrega a mano).
+  buildInputs = [ fontconfig freetype alsa-lib pipewire stdenv.cc.cc.lib ];
+
+  # iced/wgpu (mismo stack que LibrePods) resuelven Vulkan/Wayland en
+  # runtime vía dlopen, no aparecen en `readelf -d` -- autoPatchelfHook
+  # necesita que estén disponibles igual para que el dlopen no falle.
+  runtimeDependencies = [ vulkan-loader libxkbcommon wayland ];
+
+  dontConfigure = true;
+  dontBuild = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm755 nokkvi $out/bin/nokkvi
+    install -Dm644 assets/org.nokkvi.nokkvi.desktop $out/share/applications/org.nokkvi.nokkvi.desktop
+    install -Dm644 assets/org.nokkvi.nokkvi.svg $out/share/icons/hicolor/scalable/apps/org.nokkvi.nokkvi.svg
+    install -Dm644 assets/org.nokkvi.nokkvi.png $out/share/icons/hicolor/512x512/apps/org.nokkvi.nokkvi.png
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Native Navidrome music client (Rust/Iced) with PipeWire audio, gapless playback and GPU visualizers";
+    homepage = "https://github.com/f-o-o-g-s/nokkvi";
+    license = licenses.gpl3Only; # confirmado en Cargo.toml: "GPL-3.0-only"
+    platforms = platforms.linux;
+    mainProgram = "nokkvi";
+  };
+}