Skip to content

fix(nixos): add NixOS support (flake devShell + preload/network fixes)#5

Open
p0nczek wants to merge 3 commits into
HelpFreedom:mainfrom
p0nczek:nixos-support
Open

fix(nixos): add NixOS support (flake devShell + preload/network fixes)#5
p0nczek wants to merge 3 commits into
HelpFreedom:mainfrom
p0nczek:nixos-support

Conversation

@p0nczek

@p0nczek p0nczek commented Jul 11, 2026

Copy link
Copy Markdown

Add NixOS support (flake devShell + Wayland/preload/network fixes)

Fixes #4.

English

What's in this PR

  • flake.nix — provides a devShell with gcc, gnumake, python3 (for building node-pty), electron, ffmpeg; sets ELECTRON_OZONE_PLATFORM_HINT=x11 and points node_modules/electron at the nixpkgs Electron binary automatically, so nix develop + npm install + npm run dev just works.
  • electron/preload.ts — replaced the tree-shakeable if (process.contextIsolated) {...} else {...} with an unconditional assignment guarded by Object.keys(api) so the bundler can't strip the API object when contextIsolation: false is statically known. Falls back correctly if contextIsolation is ever re-enabled.
  • electron/main.ts — delay loadURL/loadFile slightly and normalize ELECTRON_RENDERER_URL to 127.0.0.1 instead of localhost, avoiding a race/IPv6-resolution issue that surfaced as ERR_NETWORK_CHANGED.
  • electron.vite.config.ts — pin the renderer dev server to host: '127.0.0.1' explicitly.
  • docs/nixos.md — short doc on running dev builds on NixOS, with or without the flake.

Why not just document it?

Steps 1–3 below (toolchain, electron binary, Ozone platform) are genuinely NixOS-specific and are fully solved by nix develop. Steps 4–5 (preload tree-shaking, network binding) are general correctness bugs that happen to only bite non-FHS/Wayland-only setups today, but could affect any environment with an aggressive bundler or IPv6-first resolver — so those two are fixed in the app code itself, not just documented as a workaround.

Testing

  • nix developnpm installnpm run dev launches Kadr with a working UI, no gray screen, no ERR_NETWORK_CHANGED, on NixOS + Niri (Wayland compositor), IPv6 disabled.
  • Verified window.kadr methods (onProxyProgress, etc.) are present in the built preload bundle (out/preload/preload.js size ~8.4 KB vs. previous ~0.13 KB).
  • Did not touch the macOS packaging path (electron-builder, fixUserPath, etc.) — this PR is dev-workflow only, no packaging changes.

Out of scope / follow-ups

  • Production packaging (electron-builder) for NixOS (AppImage/Nix package) is not covered here — happy to open a follow-up if there's interest.
  • Didn't test on non-Niri compositors (Sway, Hyprland, GNOME/Wayland); ELECTRON_OZONE_PLATFORM_HINT=x11 should generalize but feedback welcome.
Русский

Что входит в этот PR

  • flake.nix — предоставляет devShell с gcc, gnumake, python3 (для сборки node-pty), electron, ffmpeg; выставляет ELECTRON_OZONE_PLATFORM_HINT=x11 и автоматически линкует node_modules/electron на бинарник Electron из nixpkgs — так что nix develop + npm install + npm run dev просто работает.
  • electron/preload.ts — заменил вычищаемый tree-shaking'ом if (process.contextIsolated) {...} else {...} на безусловное присваивание, защищённое Object.keys(api), чтобы бандлер не мог выкинуть объект API при статически известном contextIsolation: false. При этом корректно работает и если изоляцию контекста снова включат.
  • electron/main.ts — небольшая задержка перед loadURL/loadFile и нормализация ELECTRON_RENDERER_URL к 127.0.0.1 вместо localhost, что убирает гонку/проблему резолва IPv6, проявлявшуюся как ERR_NETWORK_CHANGED.
  • electron.vite.config.ts — явно закрепил dev-сервер рендерера на host: '127.0.0.1'.
  • docs/nixos.md — короткая документация по запуску dev-сборки на NixOS, с флейком и без него.

Почему не просто задокументировать?

Пункты 1–3 (тулчейн, бинарник electron, платформа Ozone) — действительно специфичны для NixOS и полностью решаются через nix develop. Пункты 4–5 (tree-shaking preload'а, привязка к сети) — это общие баги корректности, которые сегодня проявляются только в не-FHS/Wayland-only окружениях, но потенциально могут задеть любое окружение с агрессивным бандлером или IPv6-приоритетным резолвером — поэтому эти два фикса сделаны в самом коде приложения, а не просто описаны как обходной путь.

Тестирование

  • nix developnpm installnpm run dev запускает Kadr с рабочим UI, без серого экрана и без ERR_NETWORK_CHANGED, на NixOS + Niri (Wayland-компоузер), с отключённым IPv6.
  • Проверено, что методы window.kadr (onProxyProgress и т.д.) присутствуют в собранном preload-бандле (out/preload/preload.js ~8.4 КБ против прежних ~0.13 КБ).
  • Пакетинг под macOS (electron-builder, fixUserPath и т.д.) не затронут — этот PR касается только dev-воркфлоу, без изменений в пакетинге.

Вне рамок / дальнейшие шаги

  • Продакшн-пакетинг (electron-builder) под NixOS (AppImage/Nix-пакет) здесь не рассматривается — готов открыть отдельный PR, если будет интерес.
  • Не тестировалось на других компоузерах (Sway, Hyprland, GNOME/Wayland); ELECTRON_OZONE_PLATFORM_HINT=x11 должен обобщаться, но фидбек приветствуется.

- Add flake.nix devShell: gcc/make/python3 for node-pty, electron binary
  linked from nixpkgs, ELECTRON_OZONE_PLATFORM_HINT=x11 for Niri/Wayland
- electron/preload.ts: assign window.kadr unconditionally so Vite can't
  tree-shake the api object when contextIsolation is statically false
- electron/main.ts: delay initial loadURL and normalize to 127.0.0.1 to
  avoid an intermittent ERR_NETWORK_CHANGED
- electron.vite.config.ts: pin renderer dev server to host 127.0.0.1
- docs/nixos.md: setup instructions with and without the flake
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Kadr fails to run out of the box on NixOS (electron-vite dev)

1 participant