commit d21cf2f802e59b3d663b621c33a01f458c1a579a from: ale date: Sun Aug 30 06:04:01 2026 UTC nix-flatpak (Speech Note) y DaVinci Resolve vía gamescope - flake.nix: input nix-flatpak (v0.7.0) + su módulo NixOS, para instalar Flatpaks de Flathub declarativamente. - desktop.nix: services.flatpak con net.mkiol.SpeechNote (+ Addon.nvidia), que solo se distribuye como Flatpak upstream. - desktop.nix: wrapper davinci-resolve-gamescope -- Resolve es X11 y bajo xwayland-satellite su ventana principal nunca llega a niri; envolverlo en gamescope le da una raíz X11 limpia y sale como una ventana Wayland normal. Las __NV_PRIME/__GLX/__VK fuerzan la Nvidia dentro del compositor anidado. - desktop.nix: flatpak-managed-install.service se ordena tras network-online.target -- si no, en cada boot falla resolviendo dl.flathub.org y reintenta cada 60s hasta que sube el DNS. commit - 1fb8baf74f396960c307c6aa6dffc29c348bfa3d commit + d21cf2f802e59b3d663b621c33a01f458c1a579a blob - 863fb6f85e26a237d30c290648508dc8672bb5a7 blob + 60b986241eca4380499f91ad9bd28a921bb63cab --- flake.nix +++ flake.nix @@ -73,6 +73,16 @@ url = "github:Richard7987/slide"; inputs.nixpkgs.follows = "nixpkgs"; }; + + # Instala flatpaks (Flathub) de forma declarativa vía + # services.flatpak.packages -- necesario para Speech Note (mkiol/dsnote), + # que solo se distribuye oficialmente como Flatpak (no está en nixpkgs, + # confirmado buscando). Pineado al último tag publicado (v0.7.0) en vez + # de la rama main -- mismo criterio que dank-material-shell arriba. No + # tiene input propio de nixpkgs (es un módulo puro, sin paquetes + # compilados desde nixpkgs -- confirmado en su flake.nix real), así que + # no hace falta `inputs.nixpkgs.follows`. + nix-flatpak.url = "github:gmodena/nix-flatpak/v0.7.0"; }; outputs = @@ -86,6 +96,7 @@ , psysonic , nezzontli-ctl , slides + , nix-flatpak , ... }@inputs: let @@ -98,6 +109,7 @@ modules = [ ./hosts/ale/configuration.nix dank-material-shell.nixosModules.default + nix-flatpak.nixosModules.nix-flatpak home-manager.nixosModules.home-manager { home-manager.useGlobalPkgs = true; blob - 91ad47e26ad504808b67fde8f82ceffac1f50982 blob + 2fb2debc18ea323a14cd387becff8228ecc28585 --- modules/desktop.nix +++ modules/desktop.nix @@ -1,5 +1,43 @@ { config, lib, pkgs, inputs, ... }: +let + # DaVinci Resolve es una app X11 y esta sesión usa xwayland-satellite, no + # XWayland nativo (ver modules/niri.nix). xwayland-satellite NO le reenvía a + # niri la ventana principal de Resolve ("Organizador de proyectos"): el splash + # abre, se cierra, y el editor nunca aparece -- el proceso queda vivo sin + # ventana girando CPU. Diagnosticado en vivo 2026-08-29: la X-window existe + # (Map State IsViewable, sin override-redirect) pero `niri msg windows` no la + # lista nunca. Envolver Resolve en gamescope (micro-compositor anidado) le da + # una raíz X11 limpia y hacia niri sale como UNA ventana Wayland normal -- + # confirmado que así abre el Organizador de proyectos sin crash. + # + # Las tres __*_OFFLOAD/__GLX/__VK son para que, en esta Optimus (Intel UHD 630 + # + GTX 1050), tanto gamescope como Resolve usen la Nvidia: sin ellas el + # GPUDetect de Resolve dentro del compositor anidado no encuentra la GPU y + # crashea (SIGABRT en libddm, "mutex lock failed"). Con Xwayland directo + # Resolve ya elegía la Nvidia sin ayuda, pero gamescope por default arranca + # sobre la Intel. + # + # El .desktop de Resolve trae Exec=davinci-resolve (sin path absoluto), así + # que el lanzador de DMS/fuzzel agarra este wrapper vía PATH. Contra conocida: + # la ventana queda con app-id "gamescope", no "resolve" -- rompe el + # StartupWMClass del .desktop y cualquier regla de ventana de niri que apunte + # a "resolve". + davinci-resolve-gamescope = pkgs.symlinkJoin { + name = "davinci-resolve-gamescope"; + paths = [ pkgs.davinci-resolve ]; + nativeBuildInputs = [ pkgs.makeWrapper ]; + postBuild = '' + rm $out/bin/davinci-resolve + makeWrapper ${pkgs.gamescope}/bin/gamescope $out/bin/davinci-resolve \ + --set __NV_PRIME_RENDER_OFFLOAD 1 \ + --set __GLX_VENDOR_LIBRARY_NAME nvidia \ + --set __VK_LAYER_NV_optimus NVIDIA_only \ + --add-flags "-w 1920 -h 1080 -f --" \ + --add-flags "${pkgs.davinci-resolve}/bin/davinci-resolve" + ''; + }; +in { # pkexec necesita el wrapper setuid de NixOS para funcionar (el binario # crudo del store no tiene setuid). Sin esto, el propio módulo de gamemode @@ -165,6 +203,42 @@ configHome = "/home/ale"; }; + # --- Flatpak (Flathub), gestionado declarativamente por nix-flatpak --- + # Único uso actual: Speech Note (mkiol/dsnote) -- Speech-to-Text/Text-to- + # Speech/traducción offline, no está en nixpkgs (confirmado buscando: solo + # se distribuye oficialmente como Flatpak/AppImage/Snap upstream) y su + # build desde fuente depende de whisper.cpp/piper/vosk, demasiado frágil + # para empaquetar a mano acá. El remoto "flathub" lo agrega nix-flatpak + # solo por default -- no hace falta declararlo. + # + # El addon ".Addon.nvidia" trae la aceleración por GPU (CUDA) de los + # modelos de Whisper/Piper -- el propio Flathub advierte que pesa bastante + # (varios GB, ver flathub.org/apps/net.mkiol.SpeechNote.Addon.nvidia). La + # GPU real de esta laptop (GTX 1050, ver modules/graphics.nix) usa el + # driver propietario "legacy_580" -- flatpak resuelve el runtime + # org.freedesktop.Platform.GL.nvidia- automático matcheando la + # versión del driver del host, así que debería tomarlo solo. Si el addon + # no detecta la GPU (versión de runtime GL sin publicar todavía para + # 580.x), Speech Note sigue andando por CPU sin romperse -- es un + # fallback, no un hard requirement. + services.flatpak = { + enable = true; + packages = [ + "net.mkiol.SpeechNote" + "net.mkiol.SpeechNote.Addon.nvidia" + ]; + update.onActivation = true; # mantiene los paquetes declarados al día en cada rebuild + }; + + # nix-flatpak ordena flatpak-managed-install solo tras multi-user.target, no + # tras la red -- en cada boot falla "Could not resolve hostname" contra + # dl.flathub.org y reintenta cada 60s (~20 fallos por boot) hasta que el DNS + # sube. Ordenarlo tras network-online.target elimina ese ruido. + systemd.services.flatpak-managed-install = { + after = [ "network-online.target" ]; + wants = [ "network-online.target" ]; + }; + fonts.packages = with pkgs; [ nerd-fonts.jetbrains-mono noto-fonts @@ -245,6 +319,34 @@ # setup GTK4 en vez de alternativas nativas de Wayland (swayimg/ # imv), que no traen esa integración automática de tema y # requerirían configurarla a mano. + + gamescope # micro-compositor -- lo usa el wrapper davinci-resolve-gamescope + # (ver `let` arriba); también sirve suelto para debug + davinci-resolve-gamescope # editor de video, reemplaza a kdenlive (removido + # a pedido explícito). Es pkgs.davinci-resolve envuelto en gamescope (ver + # el bloque `let` al principio del módulo para el porqué). + # Paquete de nixpkgs (pkgs/by-name/da/davinci-resolve): + # es un FOD (fixed-output derivation) que descarga el instalador oficial + # Linux directo de blackmagicdesign.com durante el build/switch (sin + # cuenta/login -- la API pública de descargas alcanza), así que el + # primer `nixos-rebuild switch` con esta línea necesita red y baja unos + # cuantos GB. Corre en un buildFHSEnv (bubblewrap), no un paquete nativo. + # + # GPU: no hace falta tocar modules/graphics.nix. OpenCL (lo que Resolve + # usa para GPU compute en Linux, junto con CUDA) ya sale solo -- el + # módulo hardware.nvidia de NixOS mete `nvidia_x11.out` en + # hardware.graphics.extraPackages automáticamente, y ese output ya trae + # el ICD de OpenCL (etc/OpenCL/vendors/nvidia.icd, confirmado en + # builder.sh real de nixpkgs) visible bajo /run/opengl-driver, que es + # justo donde el loader de ocl-icd (ya en el FHS env del paquete) busca + # por default. CUDA tampoco necesita cudaPackages.cudatoolkit (que sigue + # comentado en graphics.nix): addDriverRunpath en postFixup del paquete + # ya engancha contra libcuda.so del propio driver propietario instalado + # (legacy_580), el toolkit completo no hace falta solo para correr. + # Verificar con `clinfo` (agregar temporalmente si hace falta) que + # aparece la GTX 1050 como plataforma OpenCL antes de asumir que Resolve + # ya la está usando -- confirmar también dentro de Resolve en + # Preferences → Memory and GPU → GPU Configuration. ]; # Necesario para que QT_QPA_PLATFORMTHEME=kde (de abajo) resuelva al plugin