commit d0ca2f7f9d8326831798201dc54be5ba04962e85 from: ale date: Fri Jul 17 02:35:04 2026 UTC Agrega IntelliJ IDEA Ultimate y nokkvi (cliente de Navidrome) - jetbrains.idea directo de nixpkgs (no Toolbox -- no encaja con el modelo declarativo del repo, ver comentario en home.nix). allowUnfree ya estaba en true a nivel sistema (Nvidia/Steam). - nokkvi: cliente nativo de Navidrome (Rust/Iced), coexiste con psysonic (no lo reemplaza). Empaquetado en pkgs/nokkvi.nix desde el binario oficial del release + autoPatchelfHook -- compilar de fuente hubiera dependido de un hash frágil por la fork de iced pineada a git que usa el proyecto. Build verificado en vivo (nix build + nokkvi --version). 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 .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 `). +{ 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"; + }; +}