Skip to content

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

Description

@p0nczek

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

English

On NixOS (tested with Niri/Wayland, IPv6 disabled in networking.enableIPv6 = false), npm run dev fails or produces a blank gray window through a chain of unrelated issues that each need a separate fix:

  1. node-pty fails to build — no C/C++ toolchain in a bare nix-shell/default shell (node-gyp needs gcc/make/python3).
  2. node_modules/electron has no dist/ binary — the npm electron package's postinstall download step doesn't play well with NixOS's non-FHS filesystem, so electron-vite dev throws Error: Electron uninstall.
  3. Wayland/Ozone crash — with default Ozone auto-detection, Electron either fails to composite (blank/gray window) or throws Message 0 rejected by interface blink.mojom.WidgetHost, depending on the compositor (Niri here). Forcing X11/XWayland via ELECTRON_OZONE_PLATFORM_HINT=x11 fixes it.
  4. Preload object gets tree-shaken to {} — because contextIsolation: false is a compile-time-known constant, Vite's bundler treats if (process.contextIsolated) {...} else {...} as dead code and can strip the entire api object, leaving window.kadr undefined even though the file builds "successfully" (build output shrinks from ~8 KB to ~0.13 KB).
  5. ERR_NETWORK_CHANGED on first load — intermittent, timing/IPv6-related; the renderer's first loadURL sometimes races the Vite server or an IPv6-first resolution of localhost. Pinning the Vite dev server explicitly to host: '127.0.0.1' in electron.vite.config.ts (instead of the implicit localhost) resolves it reliably.

None of this is NixOS-specific in principle (bugs 3–5 likely also affect other non-FHS/Wayland-only Linux setups), but NixOS makes all five surface at once because of how it isolates the toolchain and filesystem paths.

A PR with fixes + a flake.nix devShell follows: NixOS support PR

Русский

На NixOS (проверено на Niri/Wayland, с отключённым IPv6 через networking.enableIPv6 = false) npm run dev либо падает, либо открывает пустое серое окно из-за цепочки независимых проблем, каждую из которых нужно чинить отдельно:

  1. node-pty не собирается — в обычном шелле NixOS нет C/C++ тулчейна (node-gyp требует gcc/make/python3).
  2. В node_modules/electron отсутствует бинарник в dist/ — постинсталл-скрипт npm-пакета electron плохо работает с не-FHS файловой системой NixOS, из-за чего electron-vite dev падает с Error: Electron uninstall.
  3. Краш Wayland/Ozone — при автоопределении Ozone Electron либо не может композитить (пустое/серое окно), либо кидает Message 0 rejected by interface blink.mojom.WidgetHost (зависит от компоузера, здесь — Niri). Принудительный X11/XWayland через ELECTRON_OZONE_PLATFORM_HINT=x11 решает проблему.
  4. Preload-объект вычищается tree-shaking'ом до {} — так как contextIsolation: false известна на этапе сборки, бандлер Vite считает if (process.contextIsolated) {...} else {...} мёртвым кодом и может выкинуть весь объект api, из-за чего window.kadr остаётся undefined, хотя сборка формально "успешна" (размер файла падает с ~8 КБ до ~0.13 КБ).
  5. ERR_NETWORK_CHANGED при первой загрузке — нестабильно, связано с таймингом/IPv6; первый loadURL в рендерере иногда опережает готовность Vite-сервера или сталкивается с IPv6-приоритетным резолвом localhost. Явное указание host: '127.0.0.1' для dev-сервера Vite в electron.vite.config.ts (вместо неявного localhost) стабильно решает проблему.

Ничего из этого не специфично для NixOS в принципе (баги 3–5, вероятно, затрагивают и другие не-FHS/Wayland-only Linux-окружения), но именно NixOS проявляет все пять сразу из-за изоляции тулчейна и путей файловой системы.

PR с фиксами + flake.nix devShell прилагается: NixOS support PR

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions