atagen

malice

public
Star0
Watch0
973f8fbdaf80e2ef6679dd071233fe6b853344b2
2
ssh://brewery@pls.lobotomise.me:33/atagen/malice.git

Blame: flake.nix

973f8fbdaf80atagen2026-09-28 09:10 UTC1
{
973f8fbdaf80atagen2026-09-28 09:10 UTC2
  description = "Malice: a hosted Matrix client backed by macltok";
973f8fbdaf80atagen2026-09-28 09:10 UTC3
973f8fbdaf80atagen2026-09-28 09:10 UTC4
  inputs = {
973f8fbdaf80atagen2026-09-28 09:10 UTC5
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
973f8fbdaf80atagen2026-09-28 09:10 UTC6
    fenix = {
973f8fbdaf80atagen2026-09-28 09:10 UTC7
      url = "github:nix-community/fenix";
973f8fbdaf80atagen2026-09-28 09:10 UTC8
      inputs.nixpkgs.follows = "nixpkgs";
973f8fbdaf80atagen2026-09-28 09:10 UTC9
    };
973f8fbdaf80atagen2026-09-28 09:10 UTC10
  };
973f8fbdaf80atagen2026-09-28 09:10 UTC11
973f8fbdaf80atagen2026-09-28 09:10 UTC12
  outputs =
973f8fbdaf80atagen2026-09-28 09:10 UTC13
    { self, nixpkgs, fenix }:
973f8fbdaf80atagen2026-09-28 09:10 UTC14
    let
973f8fbdaf80atagen2026-09-28 09:10 UTC15
      systems = [
973f8fbdaf80atagen2026-09-28 09:10 UTC16
        "x86_64-linux"
973f8fbdaf80atagen2026-09-28 09:10 UTC17
        "aarch64-linux"
973f8fbdaf80atagen2026-09-28 09:10 UTC18
      ];
973f8fbdaf80atagen2026-09-28 09:10 UTC19
      forAllSystems = nixpkgs.lib.genAttrs systems;
973f8fbdaf80atagen2026-09-28 09:10 UTC20
      workerLock = builtins.fromTOML (builtins.readFile ./crates/malice-worker/Cargo.lock);
973f8fbdaf80atagen2026-09-28 09:10 UTC21
      lockedVersion =
973f8fbdaf80atagen2026-09-28 09:10 UTC22
        name: (nixpkgs.lib.findFirst (p: p.name == name) null workerLock.package).version;
973f8fbdaf80atagen2026-09-28 09:10 UTC23
      # wasm-bindgen-test-runner refuses a module built by any other wasm-bindgen version
973f8fbdaf80atagen2026-09-28 09:10 UTC24
      wasmBindgenCli =
973f8fbdaf80atagen2026-09-28 09:10 UTC25
        pkgs:
973f8fbdaf80atagen2026-09-28 09:10 UTC26
        pkgs.buildWasmBindgenCli rec {
973f8fbdaf80atagen2026-09-28 09:10 UTC27
          src = pkgs.fetchCrate {
973f8fbdaf80atagen2026-09-28 09:10 UTC28
            pname = "wasm-bindgen-cli";
973f8fbdaf80atagen2026-09-28 09:10 UTC29
            version = lockedVersion "wasm-bindgen";
973f8fbdaf80atagen2026-09-28 09:10 UTC30
            hash = "sha256-a7lcXJnnZkYReja+iUO7NqqrWyv3toxnUgQb8s4IS5s=";
973f8fbdaf80atagen2026-09-28 09:10 UTC31
          };
973f8fbdaf80atagen2026-09-28 09:10 UTC32
          cargoDeps = pkgs.rustPlatform.fetchCargoVendor {
973f8fbdaf80atagen2026-09-28 09:10 UTC33
            inherit src;
973f8fbdaf80atagen2026-09-28 09:10 UTC34
            inherit (src) pname version;
973f8fbdaf80atagen2026-09-28 09:10 UTC35
            hash = "sha256-R1Tas33Ursy8kqsxguAkG0ZhNed2n5uFTAhw1l2qlLY=";
973f8fbdaf80atagen2026-09-28 09:10 UTC36
          };
973f8fbdaf80atagen2026-09-28 09:10 UTC37
        };
973f8fbdaf80atagen2026-09-28 09:10 UTC38
      wasmToolchain =
973f8fbdaf80atagen2026-09-28 09:10 UTC39
        system:
973f8fbdaf80atagen2026-09-28 09:10 UTC40
        let
973f8fbdaf80atagen2026-09-28 09:10 UTC41
          toolchains = fenix.packages.${system};
973f8fbdaf80atagen2026-09-28 09:10 UTC42
        in
973f8fbdaf80atagen2026-09-28 09:10 UTC43
        toolchains.combine [
973f8fbdaf80atagen2026-09-28 09:10 UTC44
          toolchains.stable.cargo
973f8fbdaf80atagen2026-09-28 09:10 UTC45
          toolchains.stable.clippy
973f8fbdaf80atagen2026-09-28 09:10 UTC46
          toolchains.stable.rustc
973f8fbdaf80atagen2026-09-28 09:10 UTC47
          toolchains.stable.rustfmt
973f8fbdaf80atagen2026-09-28 09:10 UTC48
          toolchains.stable.rust-src
973f8fbdaf80atagen2026-09-28 09:10 UTC49
          toolchains.targets.wasm32-unknown-unknown.stable.rust-std
973f8fbdaf80atagen2026-09-28 09:10 UTC50
        ];
973f8fbdaf80atagen2026-09-28 09:10 UTC51
    in
973f8fbdaf80atagen2026-09-28 09:10 UTC52
    {
973f8fbdaf80atagen2026-09-28 09:10 UTC53
      packages = forAllSystems (
973f8fbdaf80atagen2026-09-28 09:10 UTC54
        system:
973f8fbdaf80atagen2026-09-28 09:10 UTC55
        let
973f8fbdaf80atagen2026-09-28 09:10 UTC56
          pkgs = nixpkgs.legacyPackages.${system};
973f8fbdaf80atagen2026-09-28 09:10 UTC57
          wasmPlatform = pkgs.makeRustPlatform {
973f8fbdaf80atagen2026-09-28 09:10 UTC58
            cargo = wasmToolchain system;
973f8fbdaf80atagen2026-09-28 09:10 UTC59
            rustc = wasmToolchain system;
973f8fbdaf80atagen2026-09-28 09:10 UTC60
          };
973f8fbdaf80atagen2026-09-28 09:10 UTC61
          web = pkgs.buildNpmPackage {
973f8fbdaf80atagen2026-09-28 09:10 UTC62
            pname = "malice-web";
973f8fbdaf80atagen2026-09-28 09:10 UTC63
            version = "0.1.0";
973f8fbdaf80atagen2026-09-28 09:10 UTC64
            src = ./web;
973f8fbdaf80atagen2026-09-28 09:10 UTC65
            npmDepsHash = "sha256-Q00XwHH/+kfZTAPBKUlkx3hAtYvSpDw2opj22nGTIMY=";
973f8fbdaf80atagen2026-09-28 09:10 UTC66
            installPhase = ''
973f8fbdaf80atagen2026-09-28 09:10 UTC67
              runHook preInstall
973f8fbdaf80atagen2026-09-28 09:10 UTC68
              mkdir -p $out/share/malice
973f8fbdaf80atagen2026-09-28 09:10 UTC69
              cp -R dist/. $out/share/malice/
973f8fbdaf80atagen2026-09-28 09:10 UTC70
              runHook postInstall
973f8fbdaf80atagen2026-09-28 09:10 UTC71
            '';
973f8fbdaf80atagen2026-09-28 09:10 UTC72
          };
973f8fbdaf80atagen2026-09-28 09:10 UTC73
          backend = pkgs.rustPlatform.buildRustPackage {
973f8fbdaf80atagen2026-09-28 09:10 UTC74
            pname = "malice-server";
973f8fbdaf80atagen2026-09-28 09:10 UTC75
            version = "0.1.0";
973f8fbdaf80atagen2026-09-28 09:10 UTC76
            src = ./.;
973f8fbdaf80atagen2026-09-28 09:10 UTC77
            cargoLock.lockFile = ./Cargo.lock;
973f8fbdaf80atagen2026-09-28 09:10 UTC78
            nativeBuildInputs = [ pkgs.pkg-config ];
973f8fbdaf80atagen2026-09-28 09:10 UTC79
            buildInputs = [ pkgs.sqlite ];
973f8fbdaf80atagen2026-09-28 09:10 UTC80
            # preBuild = "export NIX_BUILD_CORES=2";
973f8fbdaf80atagen2026-09-28 09:10 UTC81
            preCheck = ''
973f8fbdaf80atagen2026-09-28 09:10 UTC82
              cargo build --release --bin malice --target ${pkgs.stdenv.hostPlatform.rust.rustcTarget} --offline --locked
973f8fbdaf80atagen2026-09-28 09:10 UTC83
            '';
973f8fbdaf80atagen2026-09-28 09:10 UTC84
            SSL_CERT_FILE = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt";
973f8fbdaf80atagen2026-09-28 09:10 UTC85
          };
973f8fbdaf80atagen2026-09-28 09:10 UTC86
          server = pkgs.symlinkJoin {
973f8fbdaf80atagen2026-09-28 09:10 UTC87
            name = "malice";
973f8fbdaf80atagen2026-09-28 09:10 UTC88
            paths = [
973f8fbdaf80atagen2026-09-28 09:10 UTC89
              backend
973f8fbdaf80atagen2026-09-28 09:10 UTC90
              web
973f8fbdaf80atagen2026-09-28 09:10 UTC91
            ];
973f8fbdaf80atagen2026-09-28 09:10 UTC92
            nativeBuildInputs = [ pkgs.makeWrapper ];
973f8fbdaf80atagen2026-09-28 09:10 UTC93
            postBuild = ''
973f8fbdaf80atagen2026-09-28 09:10 UTC94
              wrapProgram $out/bin/malice --set MALICE_WEB_DIR ${web}/share/malice
973f8fbdaf80atagen2026-09-28 09:10 UTC95
            '';
973f8fbdaf80atagen2026-09-28 09:10 UTC96
          };
973f8fbdaf80atagen2026-09-28 09:10 UTC97
          # the wasm-bindgen `--target web` glue for malice-worker's `Host`, consumed by
973f8fbdaf80atagen2026-09-28 09:10 UTC98
          # web/src/worker/pkg (gitignored, worker-web's TS imports it as ./pkg/malice_worker.js)
973f8fbdaf80atagen2026-09-28 09:10 UTC99
          workerWasm = wasmPlatform.buildRustPackage {
973f8fbdaf80atagen2026-09-28 09:10 UTC100
            pname = "malice-worker-wasm";
973f8fbdaf80atagen2026-09-28 09:10 UTC101
            version = "0.1.0";
973f8fbdaf80atagen2026-09-28 09:10 UTC102
            src = self;
973f8fbdaf80atagen2026-09-28 09:10 UTC103
            cargoRoot = "crates/malice-worker";
973f8fbdaf80atagen2026-09-28 09:10 UTC104
            cargoLock.lockFile = ./crates/malice-worker/Cargo.lock;
973f8fbdaf80atagen2026-09-28 09:10 UTC105
            nativeBuildInputs = [ (wasmBindgenCli pkgs) ];
973f8fbdaf80atagen2026-09-28 09:10 UTC106
            buildPhase = ''
973f8fbdaf80atagen2026-09-28 09:10 UTC107
              runHook preBuild
973f8fbdaf80atagen2026-09-28 09:10 UTC108
              cd crates/malice-worker
973f8fbdaf80atagen2026-09-28 09:10 UTC109
              cargo build --offline --frozen --release --lib --target wasm32-unknown-unknown
973f8fbdaf80atagen2026-09-28 09:10 UTC110
              mkdir -p $out
973f8fbdaf80atagen2026-09-28 09:10 UTC111
              wasm-bindgen --target web --out-dir $out --out-name malice_worker \
973f8fbdaf80atagen2026-09-28 09:10 UTC112
                target/wasm32-unknown-unknown/release/malice_worker.wasm
973f8fbdaf80atagen2026-09-28 09:10 UTC113
              runHook postBuild
973f8fbdaf80atagen2026-09-28 09:10 UTC114
            '';
973f8fbdaf80atagen2026-09-28 09:10 UTC115
            doCheck = false;
973f8fbdaf80atagen2026-09-28 09:10 UTC116
            installPhase = "true";
973f8fbdaf80atagen2026-09-28 09:10 UTC117
          };
973f8fbdaf80atagen2026-09-28 09:10 UTC118
          web-device = pkgs.buildNpmPackage {
973f8fbdaf80atagen2026-09-28 09:10 UTC119
            pname = "malice-web-device";
973f8fbdaf80atagen2026-09-28 09:10 UTC120
            version = "0.1.0";
973f8fbdaf80atagen2026-09-28 09:10 UTC121
            src = ./web;
973f8fbdaf80atagen2026-09-28 09:10 UTC122
            npmDepsHash = "sha256-Q00XwHH/+kfZTAPBKUlkx3hAtYvSpDw2opj22nGTIMY=";
973f8fbdaf80atagen2026-09-28 09:10 UTC123
            postPatch = ''
973f8fbdaf80atagen2026-09-28 09:10 UTC124
              mkdir -p src/worker/pkg
973f8fbdaf80atagen2026-09-28 09:10 UTC125
              cp -R ${workerWasm}/. src/worker/pkg/
973f8fbdaf80atagen2026-09-28 09:10 UTC126
            '';
973f8fbdaf80atagen2026-09-28 09:10 UTC127
            npmBuildScript = "build:device";
973f8fbdaf80atagen2026-09-28 09:10 UTC128
            installPhase = ''
973f8fbdaf80atagen2026-09-28 09:10 UTC129
              runHook preInstall
973f8fbdaf80atagen2026-09-28 09:10 UTC130
              mkdir -p $out/share/malice
973f8fbdaf80atagen2026-09-28 09:10 UTC131
              cp -R dist-device/. $out/share/malice/
973f8fbdaf80atagen2026-09-28 09:10 UTC132
              runHook postInstall
973f8fbdaf80atagen2026-09-28 09:10 UTC133
            '';
973f8fbdaf80atagen2026-09-28 09:10 UTC134
          };
973f8fbdaf80atagen2026-09-28 09:10 UTC135
          local = pkgs.symlinkJoin {
973f8fbdaf80atagen2026-09-28 09:10 UTC136
            name = "malice-local";
973f8fbdaf80atagen2026-09-28 09:10 UTC137
            paths = [
973f8fbdaf80atagen2026-09-28 09:10 UTC138
              backend
973f8fbdaf80atagen2026-09-28 09:10 UTC139
              web-device
973f8fbdaf80atagen2026-09-28 09:10 UTC140
            ];
973f8fbdaf80atagen2026-09-28 09:10 UTC141
            nativeBuildInputs = [ pkgs.makeWrapper ];
973f8fbdaf80atagen2026-09-28 09:10 UTC142
            postBuild = ''
973f8fbdaf80atagen2026-09-28 09:10 UTC143
              wrapProgram $out/bin/malice \
973f8fbdaf80atagen2026-09-28 09:10 UTC144
                --set MALICE_WEB_DIR ${web-device}/share/malice \
973f8fbdaf80atagen2026-09-28 09:10 UTC145
                --set MALICE_STATIC_ONLY 1
973f8fbdaf80atagen2026-09-28 09:10 UTC146
            '';
973f8fbdaf80atagen2026-09-28 09:10 UTC147
          };
973f8fbdaf80atagen2026-09-28 09:10 UTC148
        in
973f8fbdaf80atagen2026-09-28 09:10 UTC149
        {
973f8fbdaf80atagen2026-09-28 09:10 UTC150
          inherit web server web-device local;
973f8fbdaf80atagen2026-09-28 09:10 UTC151
          default = server;
973f8fbdaf80atagen2026-09-28 09:10 UTC152
        }
973f8fbdaf80atagen2026-09-28 09:10 UTC153
      );
973f8fbdaf80atagen2026-09-28 09:10 UTC154
973f8fbdaf80atagen2026-09-28 09:10 UTC155
      devShells = forAllSystems (
973f8fbdaf80atagen2026-09-28 09:10 UTC156
        system:
973f8fbdaf80atagen2026-09-28 09:10 UTC157
        let
973f8fbdaf80atagen2026-09-28 09:10 UTC158
          pkgs = nixpkgs.legacyPackages.${system};
973f8fbdaf80atagen2026-09-28 09:10 UTC159
        in
973f8fbdaf80atagen2026-09-28 09:10 UTC160
        {
973f8fbdaf80atagen2026-09-28 09:10 UTC161
          default = pkgs.mkShell {
973f8fbdaf80atagen2026-09-28 09:10 UTC162
            packages = [
973f8fbdaf80atagen2026-09-28 09:10 UTC163
              (wasmToolchain system)
973f8fbdaf80atagen2026-09-28 09:10 UTC164
              (wasmBindgenCli pkgs)
973f8fbdaf80atagen2026-09-28 09:10 UTC165
              pkgs.rust-analyzer
973f8fbdaf80atagen2026-09-28 09:10 UTC166
              pkgs.nodejs_22
973f8fbdaf80atagen2026-09-28 09:10 UTC167
              pkgs.pkg-config
973f8fbdaf80atagen2026-09-28 09:10 UTC168
              pkgs.sqlite
973f8fbdaf80atagen2026-09-28 09:10 UTC169
              pkgs.firefox
973f8fbdaf80atagen2026-09-28 09:10 UTC170
              pkgs.geckodriver
973f8fbdaf80atagen2026-09-28 09:10 UTC171
              pkgs.matrix-continuwuity
973f8fbdaf80atagen2026-09-28 09:10 UTC172
              pkgs.nushell
973f8fbdaf80atagen2026-09-28 09:10 UTC173
            ];
973f8fbdaf80atagen2026-09-28 09:10 UTC174
            # fenix's rustc links through its bundled rust-lld, which skips nix's ld-wrapper and so
973f8fbdaf80atagen2026-09-28 09:10 UTC175
            # the store rpaths, leaving the native server unable to find libsqlite3 at run time
973f8fbdaf80atagen2026-09-28 09:10 UTC176
            "CARGO_TARGET_${nixpkgs.lib.toUpper (builtins.replaceStrings [ "-" ] [ "_" ] pkgs.stdenv.hostPlatform.config)}_RUSTFLAGS" =
973f8fbdaf80atagen2026-09-28 09:10 UTC177
              "-C linker-features=-lld";
973f8fbdaf80atagen2026-09-28 09:10 UTC178
          };
973f8fbdaf80atagen2026-09-28 09:10 UTC179
        }
973f8fbdaf80atagen2026-09-28 09:10 UTC180
      );
973f8fbdaf80atagen2026-09-28 09:10 UTC181
973f8fbdaf80atagen2026-09-28 09:10 UTC182
      nixosModules.malice = import ./nix/module.nix { inherit self; };
973f8fbdaf80atagen2026-09-28 09:10 UTC183
      nixosModules.default = self.nixosModules.malice;
973f8fbdaf80atagen2026-09-28 09:10 UTC184
      checks = forAllSystems (
973f8fbdaf80atagen2026-09-28 09:10 UTC185
        system:
973f8fbdaf80atagen2026-09-28 09:10 UTC186
        let
973f8fbdaf80atagen2026-09-28 09:10 UTC187
          pkgs = nixpkgs.legacyPackages.${system};
973f8fbdaf80atagen2026-09-28 09:10 UTC188
          wasmPlatform = pkgs.makeRustPlatform {
973f8fbdaf80atagen2026-09-28 09:10 UTC189
            cargo = wasmToolchain system;
973f8fbdaf80atagen2026-09-28 09:10 UTC190
            rustc = wasmToolchain system;
973f8fbdaf80atagen2026-09-28 09:10 UTC191
          };
973f8fbdaf80atagen2026-09-28 09:10 UTC192
          # continuwuity refuses to start without /etc/resolv.conf, which the build sandbox lacks, or with
973f8fbdaf80atagen2026-09-28 09:10 UTC193
          # stdenv's deliberately bogus SSL_CERT_FILE. no exec, run.nu launches through a shell that exits at
973f8fbdaf80atagen2026-09-28 09:10 UTC194
          # once and would trip --die-with-parent, so this shell stays as the parent run.nu kills
973f8fbdaf80atagen2026-09-28 09:10 UTC195
          sandboxedHomeserver = pkgs.writeShellScriptBin "conduwuit" ''
973f8fbdaf80atagen2026-09-28 09:10 UTC196
            export SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt
973f8fbdaf80atagen2026-09-28 09:10 UTC197
            ${pkgs.lib.getExe pkgs.bubblewrap} --die-with-parent --dev-bind / / --tmpfs /etc \
973f8fbdaf80atagen2026-09-28 09:10 UTC198
              --ro-bind ${pkgs.writeText "resolv.conf" "nameserver 127.0.0.1\n"} /etc/resolv.conf \
973f8fbdaf80atagen2026-09-28 09:10 UTC199
              ${pkgs.lib.getExe' pkgs.matrix-continuwuity "conduwuit"} "$@"
973f8fbdaf80atagen2026-09-28 09:10 UTC200
          '';
973f8fbdaf80atagen2026-09-28 09:10 UTC201
        in
973f8fbdaf80atagen2026-09-28 09:10 UTC202
        {
973f8fbdaf80atagen2026-09-28 09:10 UTC203
          default = self.packages.${system}.default;
973f8fbdaf80atagen2026-09-28 09:10 UTC204
          worker-wasm = self.packages.${system}.web-device;
973f8fbdaf80atagen2026-09-28 09:10 UTC205
          worker-browser = wasmPlatform.buildRustPackage {
973f8fbdaf80atagen2026-09-28 09:10 UTC206
            pname = "malice-worker-browser-check";
973f8fbdaf80atagen2026-09-28 09:10 UTC207
            version = "0.1.0";
973f8fbdaf80atagen2026-09-28 09:10 UTC208
            src = self;
973f8fbdaf80atagen2026-09-28 09:10 UTC209
            cargoRoot = "crates/malice-worker";
973f8fbdaf80atagen2026-09-28 09:10 UTC210
            cargoLock.lockFile = ./crates/malice-worker/Cargo.lock;
973f8fbdaf80atagen2026-09-28 09:10 UTC211
            nativeBuildInputs = [
973f8fbdaf80atagen2026-09-28 09:10 UTC212
              (wasmBindgenCli pkgs)
973f8fbdaf80atagen2026-09-28 09:10 UTC213
              pkgs.firefox
973f8fbdaf80atagen2026-09-28 09:10 UTC214
              pkgs.geckodriver
973f8fbdaf80atagen2026-09-28 09:10 UTC215
              sandboxedHomeserver
973f8fbdaf80atagen2026-09-28 09:10 UTC216
              pkgs.nushell
973f8fbdaf80atagen2026-09-28 09:10 UTC217
            ];
973f8fbdaf80atagen2026-09-28 09:10 UTC218
            buildPhase = ''
973f8fbdaf80atagen2026-09-28 09:10 UTC219
              runHook preBuild
973f8fbdaf80atagen2026-09-28 09:10 UTC220
              export HOME=$TMPDIR
973f8fbdaf80atagen2026-09-28 09:10 UTC221
              nu --no-config-file crates/malice-worker/run.nu
973f8fbdaf80atagen2026-09-28 09:10 UTC222
              runHook postBuild
973f8fbdaf80atagen2026-09-28 09:10 UTC223
            '';
973f8fbdaf80atagen2026-09-28 09:10 UTC224
            doCheck = false;
973f8fbdaf80atagen2026-09-28 09:10 UTC225
            installPhase = "touch $out";
973f8fbdaf80atagen2026-09-28 09:10 UTC226
          };
973f8fbdaf80atagen2026-09-28 09:10 UTC227
        }
973f8fbdaf80atagen2026-09-28 09:10 UTC228
      );
973f8fbdaf80atagen2026-09-28 09:10 UTC229
    };
973f8fbdaf80atagen2026-09-28 09:10 UTC230
}