diff --git a/nix/modules/hive-matrix.nix b/nix/modules/hive-matrix.nix
index 7e670aa6..c1575d9e 100644
--- a/nix/modules/hive-matrix.nix
+++ b/nix/modules/hive-matrix.nix
@@ -8,135 +8,6 @@ let
cfg = config.services.hyperhive.matrix;
hyperhiveDomain = config.services.hyperhive.domain;
effectiveServerName = if cfg.serverName != null then cfg.serverName else hyperhiveDomain;
-
- # Three files are missing from nixpkgs's `pkgs.fluffychat-web` dist
- # because `flutter341.buildFlutterApplication` doesn't run the dart
- # web-worker compile pass + doesn't run the native_imaging package's
- # emscripten build (#685):
- #
- # - native_executor.js ← flutter web worker entry, compiled
- # from web/native_executor.dart via
- # `dart compile js` (handled inline
- # in `fluffychat-web-fixed.postInstall`
- # below — dart SDK is already in the
- # flutter341 closure)
- #
- # - Imaging.js / Imaging.wasm ← emscripten-compiled C library from
- # the native_imaging dart package
- # (vendored by Famedly). The package
- # ships C source + a Makefile that
- # builds them via emcc; nixpkgs's
- # flutter builder doesn't run that
- # pipeline. Built from source via
- # `fluffychat-web-imaging` below
- # (per mara's #685 call: "fix the
- # compile … dont use the prebuilt
- # binary").
- #
- # When `flutter341.buildFlutterApplication` grows worker + emcc
- # support upstream, drop both this derivation and the postInstall.
-
- # Imaging.{js,wasm} built from source: native_imaging's `js/Makefile`
- # runs `emcmake cmake` → `make -C build` → `emcc` to produce the
- # emscripten-wrapped C library that fluffychat's main.dart.js
- # references at runtime.
- #
- # Source: the exact native_imaging derivation that `pkgs.fluffychat-web`
- # already pulls in via its `pubspecLock` (resolved by nixpkgs's flutter
- # pub-cache machinery), reached via `passthru.pubspecLock.dependencySources`.
- # This means **no parallel hash pin** — when nixpkgs bumps
- # `pkgs.fluffychat-web` (and with it the pubspec.lock-resolved
- # native_imaging version), our build automatically picks up the
- # matching source. Version is also pulled from passthru for the
- # derivation's `version` attr so it stays in lockstep.
- #
- # Closure cost: `pkgs.emscripten` is ~3.6 GiB build-time (LLVM +
- # toolchain). Runtime closure is only the two produced files —
- # nothing emscripten-shaped survives into the deployed dist.
- fluffychat-web-imaging = pkgs.stdenv.mkDerivation {
- pname = "fluffychat-web-imaging";
- version = pkgs.fluffychat-web.passthru.pubspecLock.dependencyVersions.native_imaging;
-
- # The pub-cache derivation that fluffychat-web's flutter build uses.
- # Already in the build closure; no `fetchurl` or own hash pin.
- src = pkgs.fluffychat-web.passthru.pubspecLock.dependencySources.native_imaging;
-
- nativeBuildInputs = with pkgs; [
- emscripten
- cmake
- gnumake
- jq
- ];
-
- # cmake config runs inside `js/Makefile` (via `emcmake cmake`) —
- # skip the default `configurePhase` which would try to invoke
- # cmake against the package root and fail (no CMakeLists at top).
- dontConfigure = true;
-
- buildPhase = ''
- runHook preBuild
- # emscripten needs HOME + a writable cache dir for its sysroot
- # build (libc, libc++, etc. compiled to wasm on demand).
- export HOME=$TMPDIR
- export EM_CACHE=$TMPDIR/.emscriptencache
- mkdir -p $EM_CACHE
- # `make -C js` keeps the build phase pwd at the source root so
- # installPhase doesn't have to know about the cd (argus 🟡 on
- # PR #697 v2 — robust against future reorders / `dontBuild`).
- make -C js Imaging.js Imaging.wasm
- runHook postBuild
- '';
-
- installPhase = ''
- runHook preInstall
- mkdir -p $out
- install -m 644 js/Imaging.js $out/Imaging.js
- install -m 644 js/Imaging.wasm $out/Imaging.wasm
- runHook postInstall
- '';
-
- meta = with pkgs.lib; {
- description = "Imaging.js + Imaging.wasm built from the native_imaging dart package for fluffychat-web (#685)";
- homepage = "https://pub.dev/packages/native_imaging";
- license = licenses.agpl3Plus;
- };
- };
-
- # `pkgs.fluffychat-web` with #685's three missing files patched
- # in via postInstall, plus the existing `--base-href "/matrix/"`
- # override (#634) for the sub-path mount.
- fluffychat-web-fixed = pkgs.fluffychat-web.overrideAttrs (old: {
- # `--base-href "/matrix/"` so relative asset paths resolve
- # under the sub-path mount (#634). Upstream default is `/`,
- # wrong for hyperhive's `/matrix/` location.
- flutterBuildFlags = (old.flutterBuildFlags or [ ]) ++ [
- "--base-href"
- "/matrix/"
- ];
-
- # `dart` from the flutter341 closure (already pulled, no
- # incremental closure cost) so we can compile the web-worker
- # entry point that buildFlutterApplication skips.
- nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ [ pkgs.flutter341.dart ];
-
- postInstall =
- (old.postInstall or "")
- + ''
- # #685: compile web/native_executor.dart → native_executor.js.
- # The flutter web bootstrap loads this from /matrix/native_executor.js
- # at startup; without it, main.dart.js logs a network-error and
- # the SPA renders blank (see #643 for the symptom).
- ${pkgs.flutter341.dart}/bin/dart compile js \
- -o $out/native_executor.js \
- $src/web/native_executor.dart
-
- # #685: install Imaging.{js,wasm} built from the native_imaging
- # dart package's C source via emscripten (see
- # `fluffychat-web-imaging` above for the build-time rationale).
- install -m 644 ${fluffychat-web-imaging}/Imaging.js $out/Imaging.js
- install -m 644 ${fluffychat-web-imaging}/Imaging.wasm $out/Imaging.wasm
- '';
- });
in
{
# Private Matrix homeserver (matrix-tuwunel — the official conduwuit
@@ -331,23 +202,32 @@ in
package = lib.mkOption {
type = lib.types.package;
- default = fluffychat-web-fixed;
- defaultText = lib.literalMD ''
- `pkgs.fluffychat-web` rebuilt with `--base-href /matrix/` (#634)
- and patched via `postInstall` to add the three files
- `flutter341.buildFlutterApplication` skips: `native_executor.js`
- (compiled via `dart compile js` from `web/native_executor.dart`),
- plus `Imaging.js` + `Imaging.wasm` (built from the
- `native_imaging` dart package's C source via `pkgs.emscripten`).
- See the `let` block in `nix/modules/hive-matrix.nix` for the
- full rationale (#685).
- '';
+ default = pkgs.fluffychat-web.overrideAttrs (old: {
+ # fluffychat-web ships with `` baked into its
+ # index.html — flutter's `--base-href` build flag replaces
+ # that placeholder. Default upstream build is `--base-href "/"`
+ # which is wrong for hyperhive's `/matrix/` sub-path mount:
+ # the browser resolves relative asset paths (`Imaging.js`,
+ # `flutter.js`, `splash/*`) against the document ROOT,
+ # producing 404s for every asset (#634). Inject the right
+ # base-href into the actual `flutter build web` invocation
+ # via the upstream derivation's `flutterBuildFlags` string
+ # (the buildPhase is literally
+ # `flutter build web -v $flutterBuildFlags`). When subdomain
+ # routing lands (#609 — `matrix.${hyperhiveDomain}`), drop
+ # this override; upstream's `/` base-href is correct at the
+ # root of a dedicated subdomain.
+ flutterBuildFlags = (old.flutterBuildFlags or [ ]) ++ [
+ "--base-href"
+ "/matrix/"
+ ];
+ });
+ defaultText = lib.literalMD "`pkgs.fluffychat-web` rebuilt with `--base-href /matrix/` via `flutterBuildFlags`.";
description = ''
Static web client dist to serve at `/matrix/`. Defaults to
`pkgs.fluffychat-web` rebuilt with `--base-href "/matrix/"`
so relative asset paths resolve under the sub-path mount
- (#634), plus a `postInstall` patch for #685's three missing
- files. Override to swap for `hydrogen-web` (lightest),
+ (#634). Override to swap for `hydrogen-web` (lightest),
`cinny` (no threads), `element-web` (heaviest, full
features), or an out-of-tree client dist — any replacement
also needs its `` aligned with the mount path.