ATproto Nix User Repo

added working build for microcoms pkgs, based on work by @overby.me, added skeleton of modules too, began work on nuschtOS search docs generation

+131 -1
flake.lock
··· 15 15 "type": "github" 16 16 } 17 17 }, 18 + "flake-utils": { 19 + "inputs": { 20 + "systems": "systems" 21 + }, 22 + "locked": { 23 + "lastModified": 1731533236, 24 + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", 25 + "owner": "numtide", 26 + "repo": "flake-utils", 27 + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", 28 + "type": "github" 29 + }, 30 + "original": { 31 + "owner": "numtide", 32 + "repo": "flake-utils", 33 + "type": "github" 34 + } 35 + }, 36 + "flake-utils_2": { 37 + "inputs": { 38 + "systems": "systems_2" 39 + }, 40 + "locked": { 41 + "lastModified": 1731533236, 42 + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", 43 + "owner": "numtide", 44 + "repo": "flake-utils", 45 + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", 46 + "type": "github" 47 + }, 48 + "original": { 49 + "owner": "numtide", 50 + "repo": "flake-utils", 51 + "type": "github" 52 + } 53 + }, 54 + "ixx": { 55 + "inputs": { 56 + "flake-utils": [ 57 + "search", 58 + "flake-utils" 59 + ], 60 + "nixpkgs": [ 61 + "search", 62 + "nixpkgs" 63 + ] 64 + }, 65 + "locked": { 66 + "lastModified": 1754860581, 67 + "narHash": "sha256-EM0IE63OHxXCOpDHXaTyHIOk2cNvMCGPqLt/IdtVxgk=", 68 + "owner": "NuschtOS", 69 + "repo": "ixx", 70 + "rev": "babfe85a876162c4acc9ab6fb4483df88fa1f281", 71 + "type": "github" 72 + }, 73 + "original": { 74 + "owner": "NuschtOS", 75 + "ref": "v0.1.1", 76 + "repo": "ixx", 77 + "type": "github" 78 + } 79 + }, 18 80 "nixpkgs": { 19 81 "locked": { 20 82 "lastModified": 1758262103, ··· 47 109 "type": "github" 48 110 } 49 111 }, 112 + "nixpkgs_3": { 113 + "locked": { 114 + "lastModified": 1758035966, 115 + "narHash": "sha256-qqIJ3yxPiB0ZQTT9//nFGQYn8X/PBoJbofA7hRKZnmE=", 116 + "owner": "NixOS", 117 + "repo": "nixpkgs", 118 + "rev": "8d4ddb19d03c65a36ad8d189d001dc32ffb0306b", 119 + "type": "github" 120 + }, 121 + "original": { 122 + "owner": "NixOS", 123 + "ref": "nixos-unstable", 124 + "repo": "nixpkgs", 125 + "type": "github" 126 + } 127 + }, 50 128 "root": { 51 129 "inputs": { 52 130 "crane": "crane", 131 + "flake-utils": "flake-utils", 53 132 "nixpkgs": "nixpkgs", 54 - "rust-overlay": "rust-overlay" 133 + "rust-overlay": "rust-overlay", 134 + "search": "search" 55 135 } 56 136 }, 57 137 "rust-overlay": { ··· 69 149 "original": { 70 150 "owner": "oxalica", 71 151 "repo": "rust-overlay", 152 + "type": "github" 153 + } 154 + }, 155 + "search": { 156 + "inputs": { 157 + "flake-utils": "flake-utils_2", 158 + "ixx": "ixx", 159 + "nixpkgs": "nixpkgs_3" 160 + }, 161 + "locked": { 162 + "lastModified": 1758272005, 163 + "narHash": "sha256-1u3xTH+3kaHhztPmWtLAD8LF5pTYLR2CpsPFWTFnVtQ=", 164 + "owner": "NuschtOS", 165 + "repo": "search", 166 + "rev": "aa975a3757f28ce862812466c5848787b868e116", 167 + "type": "github" 168 + }, 169 + "original": { 170 + "owner": "NuschtOS", 171 + "repo": "search", 172 + "type": "github" 173 + } 174 + }, 175 + "systems": { 176 + "locked": { 177 + "lastModified": 1681028828, 178 + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 179 + "owner": "nix-systems", 180 + "repo": "default", 181 + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 182 + "type": "github" 183 + }, 184 + "original": { 185 + "owner": "nix-systems", 186 + "repo": "default", 187 + "type": "github" 188 + } 189 + }, 190 + "systems_2": { 191 + "locked": { 192 + "lastModified": 1681028828, 193 + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 194 + "owner": "nix-systems", 195 + "repo": "default", 196 + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 197 + "type": "github" 198 + }, 199 + "original": { 200 + "owner": "nix-systems", 201 + "repo": "default", 72 202 "type": "github" 73 203 } 74 204 }
+36 -22
flake.nix
··· 1 1 { 2 - description = "My personal NUR repository"; 3 - inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; 4 - inputs.rust-overlay.url = "github:oxalica/rust-overlay"; 5 - inputs.crane.url = "github:ipetkov/crane"; 2 + description = "ATproto NUR repository"; 3 + inputs = { 4 + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; 5 + flake-utils.url = "github:numtide/flake-utils"; 6 + crane.url = "github:ipetkov/crane"; 7 + rust-overlay.url = "github:oxalica/rust-overlay"; 8 + search.url = "github:NuschtOS/search"; 9 + }; 6 10 7 - outputs = { self, nixpkgs, rust-overlay, crane }@inputs: 8 - let 9 - forAllSystems = nixpkgs.lib.genAttrs nixpkgs.lib.systems.flakeExposed; 10 - in 11 - { 12 - legacyPackages = forAllSystems (system: 13 - let 14 - overlays = [ (import rust-overlay) ]; 15 - pkgs = import nixpkgs { inherit system overlays; }; 16 - rustToolchain = pkgs.rust-bin.stable.latest.default.override { 17 - extensions = [ "rust-src" ]; 18 - }; 19 - craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchain; 20 - in 21 - import ./default.nix { 11 + outputs = { self, nixpkgs, flake-utils, crane, rust-overlay, search }: 12 + flake-utils.lib.eachDefaultSystem (system: 13 + let 14 + overlays = [ (import rust-overlay) ]; 15 + pkgs = import nixpkgs { 16 + inherit system overlays; 17 + }; 18 + rustVersion = pkgs.rust-bin.stable.latest.default; 19 + craneLib = (crane.mkLib pkgs).overrideToolchain rustVersion; 20 + 21 + nurPackages = import ./default.nix { 22 22 inherit pkgs craneLib; 23 - }); 24 - packages = forAllSystems (system: nixpkgs.lib.filterAttrs (_: v: nixpkgs.lib.isDerivation v) self.legacyPackages.${system}); 25 - }; 23 + }; 24 + in 25 + { 26 + packages = nurPackages // { 27 + default = nurPackages.microcosm.default; 28 + search = search.packages.${system}.default; 29 + }; 30 + legacyPackages = nurPackages; 31 + nixosModules = { 32 + microcosm = import ./modules/microcosm; 33 + search = search.nixosModules.default; 34 + }; 35 + devShells.default = pkgs.mkShell { 36 + # todo? 37 + }; 38 + } 39 + ); 26 40 }
+1 -5
modules/default.nix
··· 1 - { 2 - # Add your NixOS modules here 3 - # 4 - # my-module = ./my-module; 5 - } 1 + {}
+47
modules/microcosm/constellation.nix
··· 1 + { config, lib, pkgs, ... }: 2 + 3 + with lib; 4 + 5 + let 6 + cfg = config.services.microcosm-constellation; 7 + microcosmPkgs = pkgs.microcosm; # Access the packages we built 8 + in 9 + { 10 + options.services.microcosm-constellation = { 11 + enable = mkEnableOption "Microcosm Constellation service"; 12 + package = mkOption { 13 + type = types.package; 14 + default = microcosmPkgs.constellation; 15 + description = "The Microcosm Constellation package to use."; 16 + }; 17 + port = mkOption { 18 + type = types.port; 19 + default = 8080; # Example default port 20 + description = "The port on which the Constellation service listens."; 21 + }; 22 + # Add other service-specific options here (e.g., databaseUrl, logLevel) 23 + }; 24 + 25 + config = mkIf cfg.enable { 26 + systemd.services.microcosm-constellation = { 27 + description = "Microcosm Constellation Service"; 28 + after = [ "network.target" ]; 29 + wantedBy = [ "multi-user.target" ]; 30 + serviceConfig = { 31 + ExecStart = "${cfg.package}/bin/constellation --port ${toString cfg.port}"; # Example command 32 + Restart = "always"; 33 + User = "microcosm-constellation"; # Create a dedicated user 34 + Group = "microcosm-constellation"; 35 + # Add other systemd options as needed (e.g., working directory, environment variables) 36 + }; 37 + # Create user and group 38 + users.users.microcosm-constellation = { 39 + isSystem = true; 40 + group = "microcosm-constellation"; 41 + }; 42 + users.groups.microcosm-constellation = { 43 + isSystem = true; 44 + }; 45 + }; 46 + }; 47 + }
+15
modules/microcosm/default.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + imports = [ 5 + ./constellation.nix 6 + ./spacedust.nix 7 + ./slingshot.nix 8 + ./ufos.nix 9 + ./jetstream.nix 10 + ./who-am-i.nix 11 + ./quasar.nix 12 + ./pocket.nix 13 + ./reflector.nix 14 + ]; 15 + }
+40
modules/microcosm/jetstream.nix
··· 1 + { config, lib, pkgs, ... }: 2 + 3 + with lib; 4 + 5 + let 6 + cfg = config.services.microcosm-jetstream; 7 + microcosmPkgs = pkgs.microcosm; 8 + in 9 + { 10 + options.services.microcosm-jetstream = { 11 + enable = mkEnableOption "Microcosm Jetstream service"; 12 + package = mkOption { 13 + type = types.package; 14 + default = microcosmPkgs.jetstream; 15 + description = "The Microcosm Jetstream package to use."; 16 + }; 17 + # Add other service-specific options here 18 + }; 19 + 20 + config = mkIf cfg.enable { 21 + systemd.services.microcosm-jetstream = { 22 + description = "Microcosm Jetstream Service"; 23 + after = [ "network.target" ]; 24 + wantedBy = [ "multi-user.target" ]; 25 + serviceConfig = { 26 + ExecStart = "${cfg.package}/bin/jetstream"; # This command likely needs adjustment 27 + Restart = "always"; 28 + User = "microcosm-jetstream"; 29 + Group = "microcosm-jetstream"; 30 + }; 31 + users.users.microcosm-jetstream = { 32 + isSystem = true; 33 + group = "microcosm-jetstream"; 34 + }; 35 + users.groups.microcosm-jetstream = { 36 + isSystem = true; 37 + }; 38 + }; 39 + }; 40 + }
+40
modules/microcosm/pocket.nix
··· 1 + { config, lib, pkgs, ... }: 2 + 3 + with lib; 4 + 5 + let 6 + cfg = config.services.microcosm-pocket; 7 + microcosmPkgs = pkgs.microcosm; 8 + in 9 + { 10 + options.services.microcosm-pocket = { 11 + enable = mkEnableOption "Microcosm Pocket service"; 12 + package = mkOption { 13 + type = types.package; 14 + default = microcosmPkgs.pocket; 15 + description = "The Microcosm Pocket package to use."; 16 + }; 17 + # Add other service-specific options here 18 + }; 19 + 20 + config = mkIf cfg.enable { 21 + systemd.services.microcosm-pocket = { 22 + description = "Microcosm Pocket Service"; 23 + after = [ "network.target" ]; 24 + wantedBy = [ "multi-user.target" ]; 25 + serviceConfig = { 26 + ExecStart = "${cfg.package}/bin/pocket"; # This command likely needs adjustment 27 + Restart = "always"; 28 + User = "microcosm-pocket"; 29 + Group = "microcosm-pocket"; 30 + }; 31 + users.users.microcosm-pocket = { 32 + isSystem = true; 33 + group = "microcosm-pocket"; 34 + }; 35 + users.groups.microcosm-pocket = { 36 + isSystem = true; 37 + }; 38 + }; 39 + }; 40 + }
+40
modules/microcosm/quasar.nix
··· 1 + { config, lib, pkgs, ... }: 2 + 3 + with lib; 4 + 5 + let 6 + cfg = config.services.microcosm-quasar; 7 + microcosmPkgs = pkgs.microcosm; 8 + in 9 + { 10 + options.services.microcosm-quasar = { 11 + enable = mkEnableOption "Microcosm Quasar service"; 12 + package = mkOption { 13 + type = types.package; 14 + default = microcosmPkgs.quasar; 15 + description = "The Microcosm Quasar package to use."; 16 + }; 17 + # Add other service-specific options here 18 + }; 19 + 20 + config = mkIf cfg.enable { 21 + systemd.services.microcosm-quasar = { 22 + description = "Microcosm Quasar Service"; 23 + after = [ "network.target" ]; 24 + wantedBy = [ "multi-user.target" ]; 25 + serviceConfig = { 26 + ExecStart = "${cfg.package}/bin/quasar"; # This command likely needs adjustment 27 + Restart = "always"; 28 + User = "microcosm-quasar"; 29 + Group = "microcosm-quasar"; 30 + }; 31 + users.users.microcosm-quasar = { 32 + isSystem = true; 33 + group = "microcosm-quasar"; 34 + }; 35 + users.groups.microcosm-quasar = { 36 + isSystem = true; 37 + }; 38 + }; 39 + }; 40 + }
+40
modules/microcosm/reflector.nix
··· 1 + { config, lib, pkgs, ... }: 2 + 3 + with lib; 4 + 5 + let 6 + cfg = config.services.microcosm-reflector; 7 + microcosmPkgs = pkgs.microcosm; 8 + in 9 + { 10 + options.services.microcosm-reflector = { 11 + enable = mkEnableOption "Microcosm Reflector service"; 12 + package = mkOption { 13 + type = types.package; 14 + default = microcosmPkgs.reflector; 15 + description = "The Microcosm Reflector package to use."; 16 + }; 17 + # Add other service-specific options here 18 + }; 19 + 20 + config = mkIf cfg.enable { 21 + systemd.services.microcosm-reflector = { 22 + description = "Microcosm Reflector Service"; 23 + after = [ "network.target" ]; 24 + wantedBy = [ "multi-user.target" ]; 25 + serviceConfig = { 26 + ExecStart = "${cfg.package}/bin/reflector"; # This command likely needs adjustment 27 + Restart = "always"; 28 + User = "microcosm-reflector"; 29 + Group = "microcosm-reflector"; 30 + }; 31 + users.users.microcosm-reflector = { 32 + isSystem = true; 33 + group = "microcosm-reflector"; 34 + }; 35 + users.groups.microcosm-reflector = { 36 + isSystem = true; 37 + }; 38 + }; 39 + }; 40 + }
+40
modules/microcosm/slingshot.nix
··· 1 + { config, lib, pkgs, ... }: 2 + 3 + with lib; 4 + 5 + let 6 + cfg = config.services.microcosm-slingshot; 7 + microcosmPkgs = pkgs.microcosm; 8 + in 9 + { 10 + options.services.microcosm-slingshot = { 11 + enable = mkEnableOption "Microcosm Slingshot service"; 12 + package = mkOption { 13 + type = types.package; 14 + default = microcosmPkgs.slingshot; 15 + description = "The Microcosm Slingshot package to use."; 16 + }; 17 + # Add other service-specific options here 18 + }; 19 + 20 + config = mkIf cfg.enable { 21 + systemd.services.microcosm-slingshot = { 22 + description = "Microcosm Slingshot Service"; 23 + after = [ "network.target" ]; 24 + wantedBy = [ "multi-user.target" ]; 25 + serviceConfig = { 26 + ExecStart = "${cfg.package}/bin/slingshot"; # This command likely needs adjustment 27 + Restart = "always"; 28 + User = "microcosm-slingshot"; 29 + Group = "microcosm-slingshot"; 30 + }; 31 + users.users.microcosm-slingshot = { 32 + isSystem = true; 33 + group = "microcosm-slingshot"; 34 + }; 35 + users.groups.microcosm-slingshot = { 36 + isSystem = true; 37 + }; 38 + }; 39 + }; 40 + }
+40
modules/microcosm/spacedust.nix
··· 1 + { config, lib, pkgs, ... }: 2 + 3 + with lib; 4 + 5 + let 6 + cfg = config.services.microcosm-spacedust; 7 + microcosmPkgs = pkgs.microcosm; 8 + in 9 + { 10 + options.services.microcosm-spacedust = { 11 + enable = mkEnableOption "Microcosm Spacedust service"; 12 + package = mkOption { 13 + type = types.package; 14 + default = microcosmPkgs.spacedust; 15 + description = "The Microcosm Spacedust package to use."; 16 + }; 17 + # Add other service-specific options here 18 + }; 19 + 20 + config = mkIf cfg.enable { 21 + systemd.services.microcosm-spacedust = { 22 + description = "Microcosm Spacedust Service"; 23 + after = [ "network.target" ]; 24 + wantedBy = [ "multi-user.target" ]; 25 + serviceConfig = { 26 + ExecStart = "${cfg.package}/bin/spacedust"; # This command likely needs adjustment 27 + Restart = "always"; 28 + User = "microcosm-spacedust"; 29 + Group = "microcosm-spacedust"; 30 + }; 31 + users.users.microcosm-spacedust = { 32 + isSystem = true; 33 + group = "microcosm-spacedust"; 34 + }; 35 + users.groups.microcosm-spacedust = { 36 + isSystem = true; 37 + }; 38 + }; 39 + }; 40 + }
+40
modules/microcosm/ufos.nix
··· 1 + { config, lib, pkgs, ... }: 2 + 3 + with lib; 4 + 5 + let 6 + cfg = config.services.microcosm-ufos; 7 + microcosmPkgs = pkgs.microcosm; 8 + in 9 + { 10 + options.services.microcosm-ufos = { 11 + enable = mkEnableOption "Microcosm UFOs service"; 12 + package = mkOption { 13 + type = types.package; 14 + default = microcosmPkgs.ufos; 15 + description = "The Microcosm UFOs package to use."; 16 + }; 17 + # Add other service-specific options here 18 + }; 19 + 20 + config = mkIf cfg.enable { 21 + systemd.services.microcosm-ufos = { 22 + description = "Microcosm UFOs Service"; 23 + after = [ "network.target" ]; 24 + wantedBy = [ "multi-user.target" ]; 25 + serviceConfig = { 26 + ExecStart = "${cfg.package}/bin/ufos"; # This command likely needs adjustment 27 + Restart = "always"; 28 + User = "microcosm-ufos"; 29 + Group = "microcosm-ufos"; 30 + }; 31 + users.users.microcosm-ufos = { 32 + isSystem = true; 33 + group = "microcosm-ufos"; 34 + }; 35 + users.groups.microcosm-ufos = { 36 + isSystem = true; 37 + }; 38 + }; 39 + }; 40 + }
+40
modules/microcosm/who-am-i.nix
··· 1 + { config, lib, pkgs, ... }: 2 + 3 + with lib; 4 + 5 + let 6 + cfg = config.services.microcosm-who-am-i; 7 + microcosmPkgs = pkgs.microcosm; 8 + in 9 + { 10 + options.services.microcosm-who-am-i = { 11 + enable = mkEnableOption "Microcosm Who-Am-I service"; 12 + package = mkOption { 13 + type = types.package; 14 + default = microcosmPkgs."who-am-i"; 15 + description = "The Microcosm Who-Am-I package to use."; 16 + }; 17 + # Add other service-specific options here 18 + }; 19 + 20 + config = mkIf cfg.enable { 21 + systemd.services.microcosm-who-am-i = { 22 + description = "Microcosm Who-Am-I Service"; 23 + after = [ "network.target" ]; 24 + wantedBy = [ "multi-user.target" ]; 25 + serviceConfig = { 26 + ExecStart = "${cfg.package}/bin/who-am-i"; # This command likely needs adjustment 27 + Restart = "always"; 28 + User = "microcosm-who-am-i"; 29 + Group = "microcosm-who-am-i"; 30 + }; 31 + users.users.microcosm-who-am-i = { 32 + isSystem = true; 33 + group = "microcosm-who-am-i"; 34 + }; 35 + users.groups.microcosm-who-am-i = { 36 + isSystem = true; 37 + }; 38 + }; 39 + }; 40 + }
+67 -26
pkgs/microcosm/default.nix
··· 8 8 sha256 = "sha256-swdAcsjRWnj9abmnrce5LzeKRK+LHm8RubCEIuk+53c="; 9 9 }; 10 10 11 - commonArgs = { 11 + commonEnv = { 12 + LIBCLANG_PATH = pkgs.lib.makeLibraryPath [ pkgs.llvmPackages.libclang.lib ]; 13 + OPENSSL_NO_VENDOR = "1"; 14 + OPENSSL_LIB_DIR = "${pkgs.lib.getLib pkgs.openssl}/lib"; 15 + OPENSSL_INCLUDE_DIR = "${pkgs.lib.getDev pkgs.openssl}/include"; 16 + BINDGEN_EXTRA_CLANG_ARGS = pkgs.lib.concatStringsSep " " [ 17 + "-I${pkgs.llvmPackages.libclang.lib}/lib/clang/${pkgs.lib.versions.major pkgs.llvmPackages.libclang.version}/include" 18 + "-I${pkgs.glibc.dev}" 19 + ]; 20 + ZSTD_SYS_USE_PKG_CONFIG = "1"; 21 + CC = "${pkgs.llvmPackages.clang}/bin/clang"; 22 + CXX = "${pkgs.llvmPackages.clang}/bin/clang++"; 23 + PKG_CONFIG_PATH = "${pkgs.zstd.dev}/lib/pkgconfig:${pkgs.lz4.dev}/lib/pkgconfig"; 24 + }; 25 + 26 + nativeInputs = with pkgs; [ 27 + pkg-config 28 + perl 29 + ]; 30 + 31 + buildInputs = with pkgs; [ 32 + zstd 33 + lz4 34 + rocksdb 35 + openssl 36 + ]; 37 + 38 + cargoArtifacts = craneLib.buildDepsOnly { 12 39 inherit src; 13 40 pname = "microcosm-rs-deps"; 14 - version = "0.1"; 15 - buildInputs = with pkgs; [ 16 - openssl 17 - zlib 18 - ]; 19 - nativeBuildInputs = with pkgs; [ 20 - pkg-config 21 - ]; 41 + nativeBuildInputs = nativeInputs; 42 + buildInputs = buildInputs; 43 + env = commonEnv; 22 44 }; 23 45 24 - cargoArtifacts = craneLib.buildDepsOnly commonArgs; 46 + members = [ 47 + "links" 48 + "constellation" 49 + "jetstream" 50 + "ufos" 51 + "ufos/fuzz" 52 + "spacedust" 53 + "who-am-i" 54 + "slingshot" 55 + "quasar" 56 + "pocket" 57 + "reflector" 58 + ]; 25 59 26 - buildPackage = pname: craneLib.buildPackage (commonArgs // { 27 - inherit pname; 28 - cargoArtifacts = cargoArtifacts; 29 - }); 60 + buildPackage = member: 61 + let 62 + packageName = if member == "ufos/fuzz" then "ufos-fuzz" else member; 63 + in 64 + craneLib.buildPackage { 65 + inherit src cargoArtifacts; 66 + pname = packageName; 67 + version = "0.1.0"; 68 + cargoExtraArgs = "--package ${packageName}"; 69 + nativeBuildInputs = nativeInputs; 70 + buildInputs = buildInputs ++ (pkgs.lib.optional (member == "pocket") pkgs.sqlite); 71 + env = commonEnv; 72 + }; 73 + 74 + packages = pkgs.lib.genAttrs members (member: buildPackage member); 30 75 31 76 in 32 - { 33 - constellation = buildPackage "constellation"; 34 - jetstream = buildPackage "jetstream"; 35 - links = buildPackage "links"; 36 - pocket = buildPackage "pocket"; 37 - quasar = buildPackage "quasar"; 38 - reflector = buildPackage "reflector"; 39 - slingshot = buildPackage "slingshot"; 40 - spacedust = buildPackage "spacedust"; 41 - ufos = buildPackage "ufos"; 42 - "who-am-i" = buildPackage "who-am-i"; 43 - } 77 + packages // { 78 + default = pkgs.linkFarm "microcosm-rs" (pkgs.lib.mapAttrsToList (name: value: 79 + let 80 + linkName = if name == "ufos/fuzz" then "ufos-fuzz" else name; 81 + in 82 + { name = linkName; path = value; } 83 + ) packages); 84 + }