diff --git a/flake.lock b/flake.lock index d1deb86..ad2b20c 100644 --- a/flake.lock +++ b/flake.lock @@ -1,48 +1,29 @@ { "nodes": { - "cerulean": { + "colmena": { "inputs": { - "deploy-rs": "deploy-rs", - "mix": "mix", - "nib": "nib", + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "nix-github-actions": "nix-github-actions", "nixpkgs": [ - "nixpkgs" - ], - "nixpkgs-unstable": [ "nixpkgs-unstable" ], - "systems": [ - "systems" + "stable": [ + "nixpkgs" ] }, "locked": { - "lastModified": 1770552327, - "narHash": "sha256-cVVPdC650MRP4tMSB9EcECUpc0U4HWSZzoQnpEHH0uE=", - "path": "/home/me/agribit/nexus/Cerulean", - "type": "path" - }, - "original": { - "path": "/home/me/agribit/nexus/Cerulean", - "type": "path" - } - }, - "deploy-rs": { - "inputs": { - "flake-compat": "flake-compat", - "nixpkgs": "nixpkgs", - "utils": "utils" - }, - "locked": { - "lastModified": 1766051518, - "narHash": "sha256-znKOwPXQnt3o7lDb3hdf19oDo0BLP4MfBOYiWkEHoik=", - "owner": "serokell", - "repo": "deploy-rs", - "rev": "d5eff7f948535b9c723d60cd8239f8f11ddc90fa", + "lastModified": 1734374287, + "narHash": "sha256-rINodqeUuezuCWOnpJgrH7u9vJ86fYT+Dj8Mu8T/IBc=", + "owner": "zhaofengli", + "repo": "colmena", + "rev": "47b6414d800c8471e98ca072bc0835345741a56a", "type": "github" }, "original": { - "owner": "serokell", - "repo": "deploy-rs", + "owner": "zhaofengli", + "repo": "colmena", + "rev": "47b6414d800c8471e98ca072bc0835345741a56a", "type": "github" } }, @@ -75,11 +56,11 @@ "flake-compat": { "flake": false, "locked": { - "lastModified": 1733328505, - "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", "owner": "edolstra", "repo": "flake-compat", - "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", "type": "github" }, "original": { @@ -120,6 +101,25 @@ "type": "github" } }, + "flake-utils": { + "inputs": { + "systems": [ + "systems" + ] + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "id": "flake-utils", + "type": "indirect" + } + }, "grub2-themes": { "inputs": { "nixpkgs": [ @@ -140,48 +140,6 @@ "type": "github" } }, - "mix": { - "inputs": { - "nib": [ - "cerulean", - "nib" - ] - }, - "locked": { - "lastModified": 1768525804, - "narHash": "sha256-jlpNb7Utqfdq2HESAB1mtddWHOsxKlTjPiLFRLd35r8=", - "owner": "emilelcb", - "repo": "mix", - "rev": "617d8915a6518a3d4e375b87c50ae34d9daee6c6", - "type": "github" - }, - "original": { - "owner": "emilelcb", - "repo": "mix", - "type": "github" - } - }, - "nib": { - "inputs": { - "systems": [ - "cerulean", - "systems" - ] - }, - "locked": { - "lastModified": 1768472076, - "narHash": "sha256-bdVRCDy6oJx/CZiyxkke783FgtBW//wDuOAITUsQcNc=", - "owner": "emilelcb", - "repo": "nib", - "rev": "42ac66dfc180a13af1cc8850397db66ec5556991", - "type": "github" - }, - "original": { - "owner": "emilelcb", - "repo": "nib", - "type": "github" - } - }, "nix-flatpak": { "locked": { "lastModified": 1767983141, @@ -198,6 +156,27 @@ "type": "github" } }, + "nix-github-actions": { + "inputs": { + "nixpkgs": [ + "colmena", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1729742964, + "narHash": "sha256-B4mzTcQ0FZHdpeWcpDYPERtyjJd/NIuaQ9+BV1h+MpA=", + "owner": "nix-community", + "repo": "nix-github-actions", + "rev": "e04df33f62cdcf93d73e9a04142464753a16db67", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nix-github-actions", + "type": "github" + } + }, "nixcord": { "inputs": { "flake-compat": "flake-compat_2", @@ -222,16 +201,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1743014863, - "narHash": "sha256-jAIUqsiN2r3hCuHji80U7NNEafpIMBXiwKlSrjWMlpg=", + "lastModified": 1770536720, + "narHash": "sha256-pbmbaQUuoG+v37b91lqcNcz05YUvVif7iWjIx9lF8R4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "bd3bac8bfb542dbde7ffffb6987a1a1f9d41699f", + "rev": "3c64ab24b22579c833895b6030c9563837e41a70", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", + "owner": "nixos", + "ref": "nixos-25.05", "repo": "nixpkgs", "type": "github" } @@ -267,32 +246,16 @@ "type": "github" } }, - "nixpkgs_2": { - "locked": { - "lastModified": 1770536720, - "narHash": "sha256-pbmbaQUuoG+v37b91lqcNcz05YUvVif7iWjIx9lF8R4=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "3c64ab24b22579c833895b6030c9563837e41a70", - "type": "github" - }, - "original": { - "owner": "nixos", - "ref": "nixos-25.05", - "repo": "nixpkgs", - "type": "github" - } - }, "root": { "inputs": { - "cerulean": "cerulean", + "colmena": "colmena", "dobutterfliescry-net": "dobutterfliescry-net", "grub2-themes": "grub2-themes", "nix-flatpak": "nix-flatpak", "nixcord": "nixcord", - "nixpkgs": "nixpkgs_2", + "nixpkgs": "nixpkgs", "nixpkgs-unstable": "nixpkgs-unstable", - "systems": "systems_2" + "systems": "systems" } }, "systems": { @@ -309,39 +272,6 @@ "repo": "default", "type": "github" } - }, - "systems_2": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "utils": { - "inputs": { - "systems": "systems" - }, - "locked": { - "lastModified": 1731533236, - "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 4534072..61e3e1d 100644 --- a/flake.nix +++ b/flake.nix @@ -1,5 +1,5 @@ { - description = "im gonna cry again ;-;"; + description = "Emile's Nix Dotfiles"; inputs = { systems.url = "github:nix-systems/default"; @@ -7,18 +7,12 @@ nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05"; nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable"; - home-manager = { - url = "github:nix-community/home-manager/release-25.05"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - - cerulean = { - # url = "github:emilelcb/Cerulean"; - url = "/home/me/agribit/nexus/Cerulean"; + colmena = { + url = "github:zhaofengli/colmena/?rev=47b6414d800c8471e98ca072bc0835345741a56a"; inputs = { - systems.follows = "systems"; - nixpkgs.follows = "nixpkgs"; - nixpkgs-unstable.follows = "nixpkgs-unstable"; + nixpkgs.follows = "nixpkgs-unstable"; + stable.follows = "nixpkgs"; + flake-utils.inputs.systems.follows = "systems"; }; }; @@ -44,63 +38,84 @@ }; outputs = { - cerulean, - home-manager, + self, + nixpkgs, + nixpkgs-unstable, grub2-themes, + colmena, ... - }: let - groups = { - cryde = {}; # oh frick i cried again - server = {}; + } @ inputs: let + system = "x86_64-linux"; + + pkgs = import nixpkgs { + inherit system; + config = { + allowUnfree = false; # sanity check + }; }; - in - cerulean.mkNexus ./. { - nexus = { - inherit groups; - overlays = import ./overlays; - nodes = { - # my laptop <3 :3 - lolcathost = { - system = "x86_64-linux"; - groups = [groups.cryde]; - extraModules = [ - home-manager.nixosModules.default - grub2-themes.nixosModules.default - ]; - }; + pkgs-unstable = import nixpkgs-unstable { + inherit system; + config = { + # allowUnfree = true; # TODO: bandaid solution... (for minecraft-server) + allowUnfree = false; + }; + }; + # TODO: come back to this its really cool + # this is just something I'm experimenting with + # ROOT = ./.; - # i be on my puter frfr - myputer = { - system = "x86_64-linux"; - groups = [groups.cryde]; - extraModules = [ - home-manager.nixosModules.default - grub2-themes.nixosModules.default - ]; - }; + specialArgs = {inherit inputs pkgs-unstable;}; + in { + devShells."x86_64-linux".default = pkgs.mkShell { + shell = "${pkgs.bash}/bin/bash"; - # courtesy of aurora <3 - butterfly = { - system = "x86_64-linux"; - groups = [groups.server]; - deploy.ssh.host = "dobutterfliescry.net"; - }; + packages = with pkgs; [ + # ./script/* dependencies + mkpasswd + ]; + }; - # pls dont sue me im broke - hyrule = { - system = "x86_64-linux"; - groups = [groups.server]; - deploy.ssh.host = "hyrule.dobutterfliescry.net"; - }; + nixosConfigurations = { + # i be on my puter fr + myputer = nixpkgs.lib.nixosSystem { + # nix passes these to every single module + inherit specialArgs; - # call me a statistician the way she spreads in my sheets - matcha = { + modules = [ + ./hosts/myputer + grub2-themes.nixosModules.default + ]; + }; + + # my laptop 0w0 + lolcathost = nixpkgs.lib.nixosSystem { + inherit specialArgs; + + modules = [ + ./hosts/lolcathost + grub2-themes.nixosModules.default + ]; + }; + }; + + # remote deployment to my servers!! + colmenaHive = colmena.lib.makeHive { + meta = { + nixpkgs = pkgs; + inherit specialArgs; + + # set nixpkgs per server + nodeNixpkgs = { + hyrule = import nixpkgs { system = "x86_64-linux"; - groups = [groups.server]; - deploy.ssh.host = "bedroom.dobutterfliescry.net"; + config.allowUnfree = false; }; }; }; + + # meine vps + hyrule = import ./hosts/hyrule; }; + }; } diff --git a/homes/me/default.nix b/homes/me/default.nix index c9a57cc..2c4e918 100755 --- a/homes/me/default.nix +++ b/homes/me/default.nix @@ -4,7 +4,7 @@ lib, config, pkgs, - upkgs, + pkgs-unstable, ... } @ args: { imports = [ @@ -16,9 +16,12 @@ ../modules/bat.nix ../modules/editor/helix.nix + (import ../modules/editor/vscode.nix args) ../modules/firefox.nix ../modules/apps/thunderbird.nix + + #../modules/wm/hypr/hypridle.nix ../modules/wm/hypr/hyprlock.nix ../modules/kanshi.nix ../modules/mako.nix diff --git a/homes/modules/editor/helix.nix b/homes/modules/editor/helix.nix index 4119cc5..1014cca 100755 --- a/homes/modules/editor/helix.nix +++ b/homes/modules/editor/helix.nix @@ -1,6 +1,6 @@ { pkgs, - upkgs, + pkgs-unstable, ... }: let lsps = { @@ -43,7 +43,7 @@ }; ty = { - pkg = upkgs.ty; + pkg = pkgs-unstable.ty; cmd = "ty"; }; diff --git a/homes/modules/term/foot.nix b/homes/modules/term/foot.nix index 8e40209..348eefa 100644 --- a/homes/modules/term/foot.nix +++ b/homes/modules/term/foot.nix @@ -1,7 +1,7 @@ -{upkgs, ...}: { +{pkgs-unstable, ...}: { programs.foot = { enable = true; - package = upkgs.foot; + package = pkgs-unstable.foot; server.enable = true; diff --git a/hosts/hyrule/default.nix b/hosts/hyrule/default.nix index beaa81d..459fd4e 100755 --- a/hosts/hyrule/default.nix +++ b/hosts/hyrule/default.nix @@ -1,6 +1,6 @@ { pkgs, - upkgs, + pkgs-unstable, ... }: let home-manager = builtins.fetchTarball { @@ -40,6 +40,17 @@ in { keyMap = "us"; }; + # colmena deployment configuration + deployment = { + targetHost = "imbored.dev"; + targetUser = "ae"; + targetPort = 22; + sshOptions = [ + "-A" # forward ssh-agent + ]; + buildOnTarget = false; # build locally then deploy + }; + # super duper minimum grub2 config boot.loader.grub = { enable = true; diff --git a/hosts/hyrule/services/minecraft-server.nix b/hosts/hyrule/services/minecraft-server.nix index 3bdb51c..43a4efd 100644 --- a/hosts/hyrule/services/minecraft-server.nix +++ b/hosts/hyrule/services/minecraft-server.nix @@ -1,11 +1,11 @@ { pkgs, - upkgs, + pkgs-unstable, ... }: { services.minecraft-server = { enable = true; - package = upkgs.minecraft-server; # use latest version only! + package = pkgs-unstable.minecraft-server; # use latest version only! declarative = true; eula = true; diff --git a/hosts/lolcathost/default.nix b/hosts/lolcathost/default.nix index 80b12fd..1517f52 100755 --- a/hosts/lolcathost/default.nix +++ b/hosts/lolcathost/default.nix @@ -1,20 +1,37 @@ { lib, pkgs, - upkgs, + pkgs-unstable, inputs, config, ... -}: { +}: let + home-manager = builtins.fetchTarball { + url = "https://github.com/nix-community/home-manager/archive/release-25.05.tar.gz"; + sha256 = "07pk5m6mxi666dclaxdwf7xrinifv01vvgxn49bjr8rsbh31syaq"; + }; +in { imports = [ ./hardware-configuration.nix + (import "${home-manager}/nixos") ../modules/bashistrans.nix ../modules/wm/hyprland.nix + # ../modules/wm/river.nix + ../modules/wm/crywl.nix ../modules/steam.nix ../modules/obsidian.nix + + ../modules/angryoxide.nix + # ../modules/flipperzero.nix + # ../modules/chameleonultragui.nix + + (import ../../overlays/default.nix { + inherit pkgs; + upkgs = pkgs-unstable; + }) ]; nix.settings.experimental-features = [ @@ -24,6 +41,7 @@ ]; nixpkgs.config.allowUnfreePredicate = let + vscext = pkgs.vscode-extensions; whitelist = with pkgs; map lib.getName [ discord @@ -35,6 +53,18 @@ obsidian gitkraken + + vscode + vscext.ms-dotnettools.csharp + vscext.ms-dotnettools.csdevkit + vscext.github.copilot + vscext.github.copilot-chat + + # XXX: DEBUG + # rider-override + # XXX: DEBUG + + # jetbrains.rider ]; in pkg: builtins.elem (lib.getName pkg) whitelist; @@ -207,7 +237,7 @@ home-manager = { users.me = import ../../homes/me; - extraSpecialArgs = {inherit inputs pkgs upkgs;}; + extraSpecialArgs = {inherit inputs pkgs pkgs-unstable;}; sharedModules = []; }; @@ -228,6 +258,7 @@ # ---- SYSTEM PACKAGES ----- environment.systemPackages = with pkgs; [ # User Environment + # crywl swww helvum easyeffects @@ -266,7 +297,7 @@ hexyl # ASM nasm - # x86-manpages # WARNING: cerulean doesn't allow overlays bruh + (callPackage ../packages/x86-manpages {}) # C Family gcc clang @@ -292,7 +323,7 @@ nix-prefetch-git nix-index nix-unit - deploy-rs.deploy-rs + deploy-rs # Python python312 # I use 3.12 since it's in a pretty stable state now @@ -358,13 +389,20 @@ # Games prismlauncher # minecraft - upkgs.olympus # celeste + pkgs-unstable.olympus # celeste discord discordo - # ekphos # WARNING: cerulean doesnt allow overlays yet + ekphos ]; programs = { + crywl = { + enable = true; + xwayland.enable = false; + defaultSession = false; + useUnmodifiedDWL = false; + }; + fish.enable = true; nix-ld.enable = true; diff --git a/hosts/modules/angryoxide.nix b/hosts/modules/angryoxide.nix new file mode 100644 index 0000000..ae4faa7 --- /dev/null +++ b/hosts/modules/angryoxide.nix @@ -0,0 +1,5 @@ +{pkgs, ...}: { + environment.systemPackages = with pkgs; [ + (callPackage ../packages/angryoxide {}) + ]; +} diff --git a/hosts/modules/apps/rider.nix b/hosts/modules/apps/rider.nix index b484f33..5a4edce 100644 --- a/hosts/modules/apps/rider.nix +++ b/hosts/modules/apps/rider.nix @@ -1,6 +1,6 @@ { pkgs, - upkgs, + pkgs-unstable, dotnetVersions ? [8 9 10], ... }: { @@ -10,7 +10,7 @@ environment.systemPackages = with pkgs; [ # Ensure latest stable Rider version (not necessarily stable on NixOS) - upkgs.jetbrains.rider + pkgs-unstable.jetbrains.rider # NOTE: Blazor requires a Chromium-based browser chromium diff --git a/hosts/modules/chameleonultragui.nix b/hosts/modules/chameleonultragui.nix new file mode 100644 index 0000000..6999022 --- /dev/null +++ b/hosts/modules/chameleonultragui.nix @@ -0,0 +1,5 @@ +{pkgs, ...}: { + environment.systemPackages = with pkgs; [ + (callPackage ../packages/chameleonultragui {}) + ]; +} diff --git a/hosts/modules/flakes/wishlist/README b/hosts/modules/flakes/wishlist/README new file mode 100644 index 0000000..5c662bb --- /dev/null +++ b/hosts/modules/flakes/wishlist/README @@ -0,0 +1,31 @@ +#### wishlist.nix +This is a simple Nix flake defining a service from which +wishlist can run automatically. This flake runs wishlist-0.15.1 +and lacks configurability unfortunately. However this was an +intentional choice, allowing wishlist to read from the user's +`~/.ssh/config` file, which can be configured seperately using +the something akin to the follow home-manager snippet: +```nix +programs.ssh = { + enable = true; + addKeysToAgent = "yes"; # always add keys to ssh-agent + + matchBlocks = { + hyrule = { + hostname = "imbored.dev"; + user = "ae"; + port = 22; + identityFile = "/home/me/.ssh/id_hyrule"; + }; + }; +}; + +``` + +This decision was mostly selfish as it was easiest... +But it comes at the cost of not being able to set the +port wishlist listens on. So for now you're stuck with `2222`. + +###### The Future!! (woooowwww) +Create an option for wishlist that is used to construct +the `config.yaml` file diff --git a/hosts/modules/flakes/wishlist/flake.nix b/hosts/modules/flakes/wishlist/flake.nix new file mode 100644 index 0000000..a98561a --- /dev/null +++ b/hosts/modules/flakes/wishlist/flake.nix @@ -0,0 +1,93 @@ +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { + self, + config, + nixpkgs, + lib, + flake-utils, + }: let + cfg = config.services.wishlist; + supportedSystems = ["x86_64-linux" "i686-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin"]; + in { + # TODO: 1. add options (ie one to set whether the server should be enabled), + # 2. create a systemd service + # 3. create a main program + # 4. celibrate + + # TODO: do I need to make this a home-manager option and set the yaml config? + + # define what settings a user can change + options = { + services.wishlist = with lib; { + enable = mkEnableOption "wishlist"; + + port = mkOption { + type = types.port; + default = 2222; + description = "Port to listen on"; + }; + + package = mkOption { + type = types.package; + default = self.packages.${nixpkgs.system}.default; + description = "Package to use"; + }; + }; + }; + + # define a systemd service for wishlist ^_^ + config = lib.mkIf cfg.enable { + systemd.services.wishlist = { + description = "Single entrypoint for multiple SSH endpoints"; + wantedBy = ["multi-user.target"]; + + serviceConfig = { + DynamicUser = "yes"; + ExecStart = "${cfg.package}/bin/wishlist serve"; + Restart = "always"; + RestartSec = "2s"; + }; + }; + }; + + packages = flake-utils.lib.eachSystem supportedSystems ( + system: let + version = "0.15.1"; + #pkgs = nixpkgs.legacyPackages.${system}; + pkgs = import nixpkgs { + inherit system; + config.allowUnfree = false; + }; + #lib = pkgs.lib; + in rec { + defaultPackage = self.packages.${system}.wishlist; + wishlist = pkgs.buildGoModule { + pname = "wishlist"; + inherit version; + meta = with lib; { + description = "Single entrypoint for multiple SSH endpoints"; + homepage = "https://github.com/charmbracelet/wishlist"; + changelog = "https://github.com/charmbracelet/wishlist/releases/tag/v${version}"; + license = licenses.mit; + maintainers = with maintainers; [caarlos0 penguwin]; + mainProgram = "wishlist"; + }; + + src = pkgs.fetchFromGitHub { + owner = "charmbracelet"; + repo = "wishlist"; + rev = "v${version}"; + # rev = "d7f058e115a8b4a4131406d01dde84fb4a8e93c4"; + hash = "53fojA+gdvpSVNjx6QncH16F8/x+lpY5SkNs7obW2XQ="; + }; + vendorSha256 = "0x6rss3fwv2398wrd5kyzkrqaphzvh4ykwfqai9glxm01y6fhxz7"; + }; + } + ); + }; +} diff --git a/hosts/modules/flakes/wishlist/wishlist.nix b/hosts/modules/flakes/wishlist/wishlist.nix new file mode 100644 index 0000000..1bdb24b --- /dev/null +++ b/hosts/modules/flakes/wishlist/wishlist.nix @@ -0,0 +1,99 @@ +# NOTE: Wishlist service fails on nix because of readonly file system +# and it can't find a config file for itself, it needs to write that +# itself I suppose :( +# So: +# 1. Get it to write that file, and +# 2. Allow it to inherit profiles from configured ssh +{ + self, + config, + pkgs, + lib, +}: let + cfg = config.services.wishlist; +in { + options = { + services.wishlist = with lib; { + enable = mkEnableOption "wishlist"; + + name = mkOption { + type = types.str; + default = + }; + + port = mkOption { + type = types.port; + default = 2222; + description = "Port to listen on"; + }; + + #configPath = mkOption { + # type = types.path; + # default = ; + # description = "Path to config file"; + #}; + + package = mkOption { + type = types.package; + default = self.packages.${nixpkgs.system}.default; + description = "Package to use"; + }; + }; + }; + + # define a systemd service for wishlist ^_^ + config = lib.mkIf cfg.enable { + systemd.services.wishlist = { + description = "Single entrypoint for multiple SSH endpoints"; + wantedBy = ["multi-user.target"]; + + serviceConfig = let + wishlistServiceConfig = pkgs.writeText "config.yaml" '' + hello world! + ''; + in { + DynamicUser = "yes"; + ExecStart = "${pkgs.wishlist}/bin/wishlist serve --config ${wishlistServiceConfig}"; + Restart = "always"; + RestartSec = "2s"; + }; + }; + }; + + /* + packages = flake-utils.lib.eachSystem supportedSystems ( + system: let + version = "0.15.1"; + #pkgs = nixpkgs.legacyPackages.${system}; + pkgs = import nixpkgs { + inherit system; + config.allowUnfree = false; + }; + #lib = pkgs.lib; + in rec { + defaultPackage = self.packages.${system}.wishlist; + wishlist = pkgs.buildGoModule { + pname = "wishlist"; + inherit version; + meta = with lib; { + description = "Single entrypoint for multiple SSH endpoints"; + homepage = "https://github.com/charmbracelet/wishlist"; + changelog = "https://github.com/charmbracelet/wishlist/releases/tag/v${version}"; + license = licenses.mit; + maintainers = with maintainers; [caarlos0 penguwin]; + mainProgram = "wishlist"; + }; + + src = pkgs.fetchFromGitHub { + owner = "charmbracelet"; + repo = "wishlist"; + rev = "v${version}"; + # rev = "d7f058e115a8b4a4131406d01dde84fb4a8e93c4"; + hash = "53fojA+gdvpSVNjx6QncH16F8/x+lpY5SkNs7obW2XQ="; + }; + vendorSha256 = "0x6rss3fwv2398wrd5kyzkrqaphzvh4ykwfqai9glxm01y6fhxz7"; + }; + } + ); + */ +} diff --git a/hosts/modules/flipperzero.nix b/hosts/modules/flipperzero.nix new file mode 100644 index 0000000..7c466ad --- /dev/null +++ b/hosts/modules/flipperzero.nix @@ -0,0 +1,6 @@ +{pkgs, ...}: { + environment.systemPackages = with pkgs; [ + # flipper zero desktop app + qflipper + ]; +} diff --git a/hosts/modules/langs/dotnet.nix b/hosts/modules/langs/dotnet.nix index 4a42f74..d9c3177 100644 --- a/hosts/modules/langs/dotnet.nix +++ b/hosts/modules/langs/dotnet.nix @@ -1,7 +1,7 @@ { lib, pkgs, - upkgs, + pkgs-unstable, ... }: let dotnetVersions = [8 9 10]; @@ -50,9 +50,9 @@ in { # Mono mono - # NOTE: nixupkgs uses .NET8 SDK + # NOTE: nixpkgs-unstable uses .NET8 SDK # WARNING: nixpkgs-25.05 uses .NET6 SDK (now marked insecure) - upkgs.msbuild + pkgs-unstable.msbuild # .NET Framework Tools/Services omnisharp-roslyn diff --git a/hosts/modules/wishlist.nix b/hosts/modules/wishlist.nix new file mode 100644 index 0000000..62cc408 --- /dev/null +++ b/hosts/modules/wishlist.nix @@ -0,0 +1,72 @@ +{ + description = "Wishlist: Your SSH directory." + + inputs = { + + }; + + outputs = { + self + }: let + nixosModule = { + config, + lib, + pkgs, + ... + }: { + options.services.wishlist = { + enable = lib.mkEnableOption "Your SSH directory."; + + port = lib.mkOption { + type = lib.types.port; + default = 22; + description = "Port to listen on"; + }; + }; + + config = lib.mkIf config.services.wishlist.enable { + # configure the systemd service + systemd.services.wishlist = { + description = "Your SSH directory."; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + serviceConfig = { + ExecStart = "${self.packages.${pkgs.system}.default}/bin/wishlist"; + Restart = "always"; + Type = "simple"; + DynamicUser = "yes"; + }; + # environment variables + environment = { + + }; + }; + }; + }; + in + (flake-utils.lib.eachDefaultSystem (system: let + gopkg = go-nixpkgs.legacyPackages.${system}; + in { + packages.default = gopkg.buildGoModule ############################ + })) + buildGoModule rec { # is rec necessary? + pname = "wishlist"; + version = "0.15.1" + + src = fetchFromGithub { + owner = "charmbracelet"; + repo = "wishlist"; + rev = "v${version}"; + hash = "0c9g1s8j9znzd1mw61d0klc6sqri0wx6hljibxdwzi3cabfy3ld6"; + }; + + vendorSha256 = lib.fakeSha256; + + meta = with lib; { + homepage = "https://github.com/charmbracelet/wishlist"; + description = "Your SSH directory."; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ caarlos0 ]; + }; + }; +} diff --git a/hosts/modules/wishlist.nix.bak b/hosts/modules/wishlist.nix.bak new file mode 100644 index 0000000..3f190ad --- /dev/null +++ b/hosts/modules/wishlist.nix.bak @@ -0,0 +1,22 @@ +{lib}: { + buildGoModule rec { # is rec necessary? + pname = "wishlist"; + version = "0.15.1" + + src = fetchFromGithub { + owner = "charmbracelet"; + repo = "wishlist"; + rev = "v${version}"; + hash = "0c9g1s8j9znzd1mw61d0klc6sqri0wx6hljibxdwzi3cabfy3ld6"; + }; + + vendorSha256 = lib.fakeSha256; + + meta = with lib; { + homepage = "https://github.com/charmbracelet/wishlist"; + description = "Your SSH directory."; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ caarlos0 ]; + }; + }; +} diff --git a/hosts/modules/wm/crywl.nix b/hosts/modules/wm/crywl.nix new file mode 100644 index 0000000..ed719a6 --- /dev/null +++ b/hosts/modules/wm/crywl.nix @@ -0,0 +1,117 @@ +{ + config, + lib, + pkgs, + ... +}: let + cfg = config.programs.crywl; +in { + options.programs.crywl = with lib; { + enable = mkEnableOption "CryWL"; + xwayland.enable = mkEnableOption "XWayland"; + defaultSession = mkEnableOption "CryWL as the default login session"; + + # currently DWL 0.7 (also beware I'll barely ever update the original DWL refs) + useUnmodifiedDWL = mkOption { + type = types.bool; + default = false; + description = "Whether to use unmodified DWL source code (latest stable release)"; + }; + }; + + config = lib.mkIf cfg.enable (let + xwaylandEnabled = cfg.xwayland.enable; + defaultSession = cfg.defaultSession; + useUnmodifiedDWL = cfg.useUnmodifiedDWL; + in { + services.displayManager = { + sessionPackages = [ + pkgs.crywl + ]; + + defaultSession = lib.mkIf defaultSession "crywl"; + }; + + environment.systemPackages = [ + pkgs.crywl + ]; + + nixpkgs.overlays = [ + (final: prev: { + crywl = prev.dwl.overrideAttrs (oldAttrs: rec { + pname = "crywl"; + version = "0.1-unstable"; + + src = let + dwl_0_70 = { + rev = "74e45c4014ae7048ecbb76eb6f54034b8b479480"; + hash = "sha256-7SoCITrbMrlfL4Z4hVyPpjB9RrrjLXHP9C5t1DVXBBA="; + }; + crywl_unstable = { + rev = "dc1260d3cfd14e8e5b243ec1d3d56e4b08c8c517"; + hash = "sha256-61R+xBYMzeEn93gLofcj8Y3VbJqW6g7GzCTujpAco90="; + }; + in + pkgs.fetchFromGitea ({ + domain = "forge.imbored.dev"; + owner = "emileclarkb"; + repo = pname; + } + // ( + if useUnmodifiedDWL + then dwl_0_70 + else crywl_unstable + )); + + buildInputs = with pkgs; + [ + libinput + xorg.libxcb + libxkbcommon + pixman + wayland + wayland-protocols + wlroots_0_19 + ] + ++ lib.optionals xwaylandEnabled [ + xorg.libX11 + xorg.xcbutilwm + xwayland + ]; + + makeFlags = + [ + "PKG_CONFIG=${pkgs.stdenv.cc.targetPrefix}pkg-config" + "WAYLAND_SCANNER=wayland-scanner" + "PREFIX=$(out)" + "MANDIR=$(man)/share/man" + ] + ++ lib.optionals xwaylandEnabled [ + ''XWAYLAND="-DXWAYLAND"'' + ''XLIBS="xcb xcb-icccm.pc"'' + ]; + + # Ensure `crywl.desktop` entry is registered + passthru = { + providedSessions = [pname]; + + tests.version = pkgs.testers.testVersion { + package = oldAttrs.finalPackage; + # `dwl -v` emits its version string to stderr and returns 1 + command = "crywl -v 2>&1; return 0"; + }; + }; + + meta = { + homepage = "https://forge.imbored.dev/emileclarkb/crywl"; + description = "Personal fork of DWL"; + license = lib.licenses.gpl3Only; + maintainers = [lib.maintainers.emileclarkb]; + inherit (pkgs.wayland.meta) platforms; + mainProgram = "crywl"; + }; + }); + }) + ]; + }); +} diff --git a/hosts/modules/wm/river.nix b/hosts/modules/wm/river.nix new file mode 100644 index 0000000..02721cc --- /dev/null +++ b/hosts/modules/wm/river.nix @@ -0,0 +1,5 @@ +{...}: { + programs = { + river.enable = true; + }; +} diff --git a/hosts/myputer/default.nix b/hosts/myputer/default.nix index 5cb8368..04b31d9 100755 --- a/hosts/myputer/default.nix +++ b/hosts/myputer/default.nix @@ -1,7 +1,7 @@ { lib, pkgs, - upkgs, + pkgs-unstable, inputs, config, ... @@ -230,7 +230,7 @@ in { home-manager = { users.me = import ../../homes/me; - extraSpecialArgs = {inherit inputs pkgs upkgs;}; + extraSpecialArgs = {inherit inputs pkgs pkgs-unstable;}; sharedModules = []; }; @@ -379,7 +379,7 @@ in { # Games prismlauncher # minecraft - upkgs.olympus + pkgs-unstable.olympus discord ]; diff --git a/packages/README b/hosts/packages/README similarity index 100% rename from packages/README rename to hosts/packages/README diff --git a/packages/angryoxide/default.nix b/hosts/packages/angryoxide/default.nix similarity index 100% rename from packages/angryoxide/default.nix rename to hosts/packages/angryoxide/default.nix diff --git a/packages/chameleonultragui/TODO.md b/hosts/packages/chameleonultragui/TODO similarity index 100% rename from packages/chameleonultragui/TODO.md rename to hosts/packages/chameleonultragui/TODO diff --git a/packages/chameleonultragui/default.nix b/hosts/packages/chameleonultragui/default.nix similarity index 100% rename from packages/chameleonultragui/default.nix rename to hosts/packages/chameleonultragui/default.nix diff --git a/hosts/packages/chameleonultragui/default.nix.bak1 b/hosts/packages/chameleonultragui/default.nix.bak1 new file mode 100644 index 0000000..158877a --- /dev/null +++ b/hosts/packages/chameleonultragui/default.nix.bak1 @@ -0,0 +1,474 @@ +{ + pkgs, + lib, + ... +}: +# ChameleonUltraGUI requires flutter sdk >3.0.0 +pkgs.flutter324.buildFlutterApplication +(self: { + pname = "ChameleonUltraGUI"; + version = "1.1.2"; + + src = pkgs.fetchFromGitHub { + owner = "GameTec-live"; + repo = "ChameleonUltraGUI"; + sha256 = "1mb6wkqk6vaamrhflfhsgp5gvqiw2qkvmy7j65abcx7sn5990i27"; + rev = "11424abaccb4a010fcbeab9799ae8f675d8afe99"; + }; + + desktopItems = [ + (pkgs.makeDesktopItem { + name = self.pname; + desktopName = "Chameleon Ultra GUI"; + icon = self.pname; + comment = self.meta.description; + + exec = "chameleonultragui"; + terminal = false; + + categories = [ + "Utility" + ]; + }) + ]; + + # path to application within fetched sources + sourceRoot = "source/chameleonultragui"; + + buildInputs = [ + pkgs.imagemagick # creating mipmaps for share/icons + pkgs.yj # converting pubspec.lock yaml->json + ]; + + buildArguments = ["--release"]; + + # source files compile with Flutter >3.29.0 but this + # derivation uses 3.24.0 (so we patch for compatability) + postPatch = let + argbPatch = '' + --- general.dart.old 2025-05-11 15:59:51.812132078 +1000 + +++ general.dart 2025-05-11 15:58:14.755856407 +1000 + @@ -211,7 +211,7 @@ + } + + String colorToHex(Color color) { + - return '#\''${color.toARGB32().toRadixString(16).padLeft(8, '0').substring(2)}'; + + return '#\''${color.value.toRadixString(16).padLeft(8, '0').substring(2)}'; + } + + Color hexToColor(String hex) { + ''; + in '' + # patch source files using Color.toARGB32 method (not defined in Flutter 3.24) + argbPatch="${argbPatch}" + patch lib/helpers/general.dart <(echo "$argbPatch") + ''; + + # installPhase = '' + # runHook preInstall + + # # create mipmaps of desktop logo + # logoOriginal="assets/logo-color-desktop.png" + # for i in 16 32 64 128 256 512; do + # res="$i"x"$i" + # logoOut="$out"/share/icons/hicolor/"$res"/apps + # mkdir -p $logoOut + # ${pkgs.imagemagick}/bin/magick $logoOriginal -resize $res $logoOut/${pname}.png + # done + + # runHook postInstall + # ''; + + # Nix doesn't natively have a fromYAML function (so I made this instead) + pubspecLock = let + appRoot = "${self.src}/chameleonultragui"; + + # when generating patch files use -u flag and then + # make sure to escape all " characters for Nix string + pubspecLockPatch = '' + --- pubspec.lock.bak2025-05-10 15:42:44.287730979 +1000 + +++ pubspec.lock2025-05-10 15:41:23.778480048 +1000 + @@ -5,18 +5,23 @@ + dependency: transitive + description: + name: _fe_analyzer_shared + - sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57 + + sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 + url: \"https://pub.dev\" + source: hosted + - version: \"80.0.0\" + + version: \"72.0.0\" + + _macros: + + dependency: transitive + + description: dart + + source: sdk + + version: \"0.3.2\" + analyzer: + dependency: transitive + description: + name: analyzer + - sha256: \"192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e\" + + sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 + url: \"https://pub.dev\" + source: hosted + - version: \"7.3.0\" + + version: \"6.7.0\" + archive: + dependency: \"direct main\" + description: + @@ -37,26 +42,26 @@ + dependency: \"direct main\" + description: + name: async + - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + + sha256: \"947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c\" + url: \"https://pub.dev\" + source: hosted + - version: \"2.12.0\" + + version: \"2.11.0\" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + - sha256: \"8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea\" + + sha256: \"6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66\" + url: \"https://pub.dev\" + source: hosted + - version: \"2.1.2\" + + version: \"2.1.1\" + characters: + dependency: transitive + description: + name: characters + - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + + sha256: \"04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605\" + url: \"https://pub.dev\" + source: hosted + - version: \"1.4.0\" + + version: \"1.3.0\" + checked_yaml: + dependency: transitive + description: + @@ -77,18 +82,18 @@ + dependency: transitive + description: + name: clock + - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: \"https://pub.dev\" + source: hosted + - version: \"1.1.2\" + + version: \"1.1.1\" + collection: + dependency: \"direct main\" + description: + name: collection + - sha256: \"2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76\" + + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: \"https://pub.dev\" + source: hosted + - version: \"1.19.1\" + + version: \"1.18.0\" + convert: + dependency: \"direct main\" + description: + @@ -157,10 +162,10 @@ + dependency: transitive + description: + name: fake_async + - sha256: \"6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc\" + + sha256: \"511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78\" + url: \"https://pub.dev\" + source: hosted + - version: \"1.3.2\" + + version: \"1.3.1\" + ffi: + dependency: \"direct main\" + description: + @@ -196,11 +201,10 @@ + file_saver: + dependency: \"direct main\" + description: + - path: \".\" + - ref: fix-windows + - resolved-ref: \"3038d74d5560dcca528423fffd745abf31eb88ae\" + - url: \"https://github.com/Foxushka/file_saver.git\" + - source: git + + name: file_saver + + sha256: \"017a127de686af2d2fbbd64afea97052d95f2a0f87d19d25b87e097407bf9c1e\" + + url: \"https://pub.dev\" + + source: hosted + version: \"0.2.14\" + fixnum: + dependency: transitive + @@ -234,11 +238,10 @@ + flutter_libserialport: + dependency: \"direct main\" + description: + - path: \".\" + - ref: main + - resolved-ref: \"6740aae075505a220a98492910b090824efc7910\" + - url: \"https://github.com/NeariX67/flutter_libserialport.git\" + - source: git + + name: flutter_libserialport + + sha256: d193b5ac819db6540d20cc8d20d9f5ec9e3396edb4d2c4a23c97863fa9132336 + + url: \"https://pub.dev\" + + source: hosted + version: \"0.5.0\" + flutter_lints: + dependency: \"direct dev\" + @@ -347,18 +350,18 @@ + dependency: transitive + description: + name: leak_tracker + - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + + sha256: \"3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05\" + url: \"https://pub.dev\" + source: hosted + - version: \"10.0.8\" + + version: \"10.0.5\" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + + sha256: \"932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806\" + url: \"https://pub.dev\" + source: hosted + - version: \"3.0.9\" + + version: \"3.0.5\" + leak_tracker_testing: + dependency: transitive + description: + @@ -399,14 +402,22 @@ + url: \"https://pub.dev\" + source: hosted + version: \"1.3.0\" + + macros: + + dependency: transitive + + description: + + name: macros + + sha256: \"0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536\" + + url: \"https://pub.dev\" + + source: hosted + + version: \"0.1.2-main.4\" + matcher: + dependency: transitive + description: + name: matcher + - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: \"https://pub.dev\" + source: hosted + - version: \"0.12.17\" + + version: \"0.12.16+1\" + material_color_utilities: + dependency: transitive + description: + @@ -419,10 +430,10 @@ + dependency: transitive + description: + name: meta + - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + url: \"https://pub.dev\" + source: hosted + - version: \"1.16.0\" + + version: \"1.15.0\" + mobile_scanner: + dependency: \"direct main\" + description: + @@ -467,10 +478,10 @@ + dependency: \"direct main\" + description: + name: path + - sha256: \"75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5\" + + sha256: \"087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af\" + url: \"https://pub.dev\" + source: hosted + - version: \"1.9.1\" + + version: \"1.9.0\" + path_provider: + dependency: transitive + description: + @@ -723,15 +734,15 @@ + dependency: transitive + description: flutter + source: sdk + - version: \"0.0.0\" + + version: \"0.0.99\" + source_span: + dependency: transitive + description: + name: source_span + - sha256: \"254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c\" + + sha256: \"53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c\" + url: \"https://pub.dev\" + source: hosted + - version: \"1.10.1\" + + version: \"1.10.0\" + sprintf: + dependency: transitive + description: + @@ -744,42 +755,42 @@ + dependency: transitive + description: + name: stack_trace + - sha256: \"8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1\" + + sha256: \"73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b\" + url: \"https://pub.dev\" + source: hosted + - version: \"1.12.1\" + + version: \"1.11.1\" + stream_channel: + dependency: transitive + description: + name: stream_channel + - sha256: \"969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d\" + + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: \"https://pub.dev\" + source: hosted + - version: \"2.1.4\" + + version: \"2.1.2\" + string_scanner: + dependency: transitive + description: + name: string_scanner + - sha256: \"921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43\" + + sha256: \"556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde\" + url: \"https://pub.dev\" + source: hosted + - version: \"1.4.1\" + + version: \"1.2.0\" + term_glyph: + dependency: transitive + description: + name: term_glyph + - sha256: \"7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e\" + + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: \"https://pub.dev\" + source: hosted + - version: \"1.2.2\" + + version: \"1.2.1\" + test_api: + dependency: transitive + description: + name: test_api + - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + + sha256: \"5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb\" + url: \"https://pub.dev\" + source: hosted + - version: \"0.7.4\" + + version: \"0.7.2\" + typed_data: + dependency: transitive + description: + @@ -855,12 +866,11 @@ + usb_serial: + dependency: \"direct main\" + description: + - path: \".\" + - ref: fix-usbserial + - resolved-ref: \"9fcbacc92bec19ea02d33a40d9f39e45d19cf637\" + - url: \"https://github.com/Foxushka/usbserial.git\" + - source: git + - version: \"0.5.1\" + + name: usb_serial + + sha256: a605a600e34e7f28d4e80851ca3999ef747e42e406138887b8a88b8c382a8b07 + + url: \"https://pub.dev\" + + source: hosted + + version: \"0.5.2\" + uuid: + dependency: \"direct main\" + description: + @@ -881,10 +891,10 @@ + dependency: transitive + description: + name: vm_service + - sha256: \"0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14\" + + sha256: \"5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d\" + url: \"https://pub.dev\" + source: hosted + - version: \"14.3.1\" + + version: \"14.2.5\" + wakelock_plus: + dependency: \"direct main\" + description: + @@ -958,5 +968,5 @@ + source: hosted + version: \"2.2.1\" + sdks: + - dart: \">=3.7.0-0 <4.0.0\" + + dart: \">=3.5.0 <4.0.0\" + flutter: \">=3.24.0\" + ''; + in + builtins.fromJSON + ( + builtins.readFile (pkgs.runCommand "${self.pname}-buildenv" { + inputs = [ + # DEBUG (both lines commented) + #pkgs.flutter324 # ChameleonUltraGUI requires sdk >3.0.0 + #pkgs.yj + ]; + } '' + # copy source files to a temporary path to rebuild the lockfile + buildPath=$(mktemp -d) + cp -r "${appRoot}/." "$buildPath/" + + outPubspecLock="$buildPath/pubspec.lock" + # MUST define variables to use multiline Nix string in bash scripting + pubspecLockPatch="${pubspecLockPatch}" + + # apply the pubspec.yaml patch and regenerate lock file + # (create a temporary home directory for flutter to play in) + #(cd $buildPath && chmod -R +w . \ + # && patch ./pubspec.yaml <(echo "$pubspecYamlPatch") \ + # && export HOME=$(mktemp -d) \ + # && flutter --disable-analytics \ + # && flutter config --no-cli-animations \ + # && ${pkgs.flutter}/bin/flutter pub get) + + # patch the lockfile + chmod +w $outPubspecLock + patch $outPubspecLock <(echo "$pubspecLockPatch") + + # convert new lockfile to json and return + ${pkgs.yj}/bin/yj < "$buildPath/pubspec.lock" > $out + '') + ); + + # TODO: try this instead of patching + # gitHashes = { + # dartssh2 = "sha256-2pypKwurziwGLZYuGaxlS2lzN3UvJp3bRTvvYYxEqRI="; + # hotkey_manager_linux = "sha256-aO0h94YZvgV/ggVupNw8GjyZsnXrq3qTHRDtuhNv3oI="; + # system_info2 = "sha256-fly7E2vG+bQ/+QGzXk+DYba73RZccltdW2LpZGDKX60="; + # tray_menu = "sha256-riiAiBEms+9ARog8i+MR1fto1Yqx+gwbBWyNbNq6VTM="; + # window_size = "sha256-71PqQzf+qY23hTJvcm0Oye8tng3Asr42E2vfF1nBmVA="; + # xterm = "sha256-h8vIonTPUVnNqZPk/A4ZV7EYCMyM0rrErL9ZOMe4ZBE="; + # }; + + meta = with lib; { + description = "A GUI for the Chameleon Ultra written in Flutter for crossplatform"; + homepage = "https://github.com/GameTec-live/ChameleonUltraGUI"; + license = licenses.gpl3; + maintainers = [maintainers.emileclarkb]; + platforms = platforms.linux; + }; +}) +.overrideAttrs ( + previousAttrs: { + installPhase = + previousAttrs.installPhase + + '' + # create mipmaps of desktop logo + logoOriginal="assets/logo-color-desktop.png" + for i in 16 32 64 128 256 512; do + res="$i"x"$i" + logoOut="$out"/share/icons/hicolor/"$res"/apps + mkdir -p $logoOut + ${pkgs.imagemagick}/bin/magick $logoOriginal -resize $res $logoOut/${previousAttrs.pname}.png + done + ''; + } +) diff --git a/packages/huggingface_hub/flake.nix b/hosts/packages/huggingface_hub/flake.nix similarity index 100% rename from packages/huggingface_hub/flake.nix rename to hosts/packages/huggingface_hub/flake.nix diff --git a/packages/huggingface_hub/hf-xet.nix b/hosts/packages/huggingface_hub/hf-xet.nix similarity index 100% rename from packages/huggingface_hub/hf-xet.nix rename to hosts/packages/huggingface_hub/hf-xet.nix diff --git a/packages/huggingface_hub/huggingface_hub.nix b/hosts/packages/huggingface_hub/huggingface_hub.nix similarity index 100% rename from packages/huggingface_hub/huggingface_hub.nix rename to hosts/packages/huggingface_hub/huggingface_hub.nix diff --git a/hosts/packages/tundra/README b/hosts/packages/tundra/README new file mode 100644 index 0000000..e44647c --- /dev/null +++ b/hosts/packages/tundra/README @@ -0,0 +1,12 @@ +**Tundra** is the name I'm giving my *desktop environment.* +Made primarily with Aylur's Astal library and the Vala +programming language (as an excuse to learn it). + +NOTE: Tundra is designed specifically to work on Hyprland, +I have no idea how it'll interact with other window managers :) + + +##### Meson Notes (temporary) +Setup meson like `meson setup ` ie `meson setup build src`. +Compile meson like `meson compile -C ` where is the relative path to it, +if you're in it already just use `meson compile` otherwise if in project root use `meson compile build`. diff --git a/hosts/packages/tundra/flake.lock b/hosts/packages/tundra/flake.lock new file mode 100644 index 0000000..85ad9ef --- /dev/null +++ b/hosts/packages/tundra/flake.lock @@ -0,0 +1,62 @@ +{ + "nodes": { + "astal": { + "inputs": { + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1745934282, + "narHash": "sha256-hgUd4yUYALHzzoEi/88BnsgrxZIqk+zyQVoI3CL61IU=", + "owner": "aylur", + "repo": "astal", + "rev": "07583deff8a486fad472718572c3248f0fbea1f3", + "type": "github" + }, + "original": { + "owner": "aylur", + "repo": "astal", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1737469691, + "narHash": "sha256-nmKOgAU48S41dTPIXAq0AHZSehWUn6ZPrUKijHAMmIk=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "9e4d5190a9482a1fb9d18adf0bdb83c6e506eaab", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1746663147, + "narHash": "sha256-Ua0drDHawlzNqJnclTJGf87dBmaO/tn7iZ+TCkTRpRc=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "dda3dcd3fe03e991015e9a74b22d35950f264a54", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "astal": "astal", + "nixpkgs": "nixpkgs_2" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/hosts/packages/tundra/flake.nix b/hosts/packages/tundra/flake.nix new file mode 100644 index 0000000..b6e0a36 --- /dev/null +++ b/hosts/packages/tundra/flake.nix @@ -0,0 +1,42 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; + astal.url = "github:aylur/astal"; + }; + + outputs = { + self, + nixpkgs, + astal, + }: let + system = "x86_64-linux"; + pkgs = nixpkgs.legacyPackages.${system}; + in { + packages.${system} = { + default = pkgs.stdenv.mkDerivation { + name = "tundra"; + src = ./.; + + nativeBuildInputs = with pkgs; [ + meson + ninja + pkg-config + vala + gobject-introspection + dart-sass + ]; + + buildInputs = [ + astal.packages.${system}.io + astal.packages.${system}.astal3 + astal.packages.${system}.battery + astal.packages.${system}.wireplumber + astal.packages.${system}.network + astal.packages.${system}.tray + astal.packages.${system}.mpris + astal.packages.${system}.hyprland + ]; + }; + }; + }; +} diff --git a/hosts/packages/tundra/src/app.in.vala b/hosts/packages/tundra/src/app.in.vala new file mode 100644 index 0000000..b3da69e --- /dev/null +++ b/hosts/packages/tundra/src/app.in.vala @@ -0,0 +1,31 @@ +class App : Astal.Application { + public static App instance; + + public override void request (string msg, SocketConnection conn) { + print(@"$msg\n"); + AstalIO.write_sock.begin(conn, "ok"); + } + + public override void activate () { + foreach (var mon in this.monitors) + add_window(new Bar(mon)); + + apply_css("@STYLE@"); + } + + public static void main(string[] args) { + var instance_name = "vala"; + + App.instance = new App() { + instance_name = instance_name + }; + + try { + App.instance.acquire_socket(); + App.instance.run(null); + } catch (Error err) { + print(AstalIO.send_request(instance_name, string.joinv(" ", args))); + } + } +} + diff --git a/hosts/packages/tundra/src/meson.build b/hosts/packages/tundra/src/meson.build new file mode 100644 index 0000000..1cc6b10 --- /dev/null +++ b/hosts/packages/tundra/src/meson.build @@ -0,0 +1,47 @@ +project('tundra', 'vala', 'c') + +bindir = get_option('prefix') / get_option('bindir') +# bindir = './bin' +libdir = get_option('prefix') / get_option('libdir') + +pkgconfig_deps = [ + dependency('glib-2.0'), + dependency('gobject-2.0'), + dependency('gtk+-3.0'), + dependency('libnm'), + dependency('astal-io-0.1'), + dependency('astal-3.0'), + dependency('astal-battery-0.1'), + dependency('astal-wireplumber-0.1'), + dependency('astal-network-0.1'), + dependency('astal-tray-0.1'), + dependency('astal-mpris-0.1'), + dependency('astal-hyprland-0.1'), +] + +# needed for GLib.Math +deps = pkgconfig_deps + meson.get_compiler('c').find_library('m') + +main = configure_file( + input: 'app.in.vala', + output: 'app.vala', + configuration: { + 'STYLE': run_command( + find_program('sass'), + meson.project_source_root() / 'style.scss', + ).stdout(), + }, +) + +sources = files( + 'widget/Bar.vala', +) + +executable( + 'tundra', + [sources, main], + dependencies: deps, + install: true, + install_dir: bindir, +) + diff --git a/hosts/packages/tundra/src/style.scss b/hosts/packages/tundra/src/style.scss new file mode 100644 index 0000000..5c20382 --- /dev/null +++ b/hosts/packages/tundra/src/style.scss @@ -0,0 +1,107 @@ +@use "sass:color"; + +$bg: #212223; +$fg: #f1f1f1; +$accent: #378DF7; +$radius: 7px; + +window.Bar { + border: none; + box-shadow: none; + background-color: $bg; + color: $fg; + font-size: 1.1em; + font-weight: bold; + + label { + margin: 0 8px; + } + + .Workspaces { + button { + all: unset; + background-color: transparent; + + &:hover label { + background-color: color.adjust($fg, $alpha: -0.84); + border-color: color.adjust($accent, $alpha: -0.8); + } + + &:active label { + background-color: color.adjust($fg, $alpha: -0.8) + } + } + + label { + transition: 200ms; + padding: 0 8px; + margin: 2px; + border-radius: $radius; + border: 1pt solid transparent; + } + + .focused label { + color: $accent; + border-color: $accent; + } + } + + .SysTray { + margin-right: 8px; + + button { + padding: 0 4px; + } + } + + .FocusedClient { + color: $accent; + } + + .Media .Cover { + min-height: 1.2em; + min-width: 1.2em; + border-radius: $radius; + background-position: center; + background-size: contain; + } + + .Battery label { + padding-left: 0; + margin-left: 0; + } + + .AudioSlider { + * { + all: unset; + } + + icon { + margin-right: .6em; + } + + & { + margin: 0 1em; + } + + trough { + background-color: color.adjust($fg, $alpha: -0.8); + border-radius: $radius; + } + + highlight { + background-color: $accent; + min-height: .8em; + border-radius: $radius; + } + + slider { + background-color: $fg; + border-radius: $radius; + min-height: 1em; + min-width: 1em; + margin: -.2em; + } + } +} + diff --git a/hosts/packages/tundra/src/widget/Bar.vala b/hosts/packages/tundra/src/widget/Bar.vala new file mode 100644 index 0000000..f1ba8eb --- /dev/null +++ b/hosts/packages/tundra/src/widget/Bar.vala @@ -0,0 +1,265 @@ +class Workspaces : Gtk.Box { + AstalHyprland.Hyprland hypr = AstalHyprland.get_default(); + public Workspaces() { + Astal.widget_set_class_names(this, {"Workspaces"}); + hypr.notify["workspaces"].connect(sync); + sync(); + } + + void sync() { + foreach (var child in get_children()) + child.destroy(); + + // TODO: create a copy of workspaces + // then create a list of tuples (map id to index in hypr.workspaces) + // then sort new list by id + // then iterate and use index on hypr.workspaces + // NEVERMIND: read `lib/hyprland/hyprland.vala` and see how the + // `_workspaces` property is defined as a HashTable + // basically just extend on that / create a wrapper + // that allows better organisation + + hypr.workspaces.sort((a, b) => { return a.id - b.id; }); + foreach (var ws in hypr.workspaces) { + // filter out special workspaces + if (!(ws.id >= -99 && ws.id <= -2)) { + add(button(ws)); + } + } + } + + Gtk.Button button(AstalHyprland.Workspace ws) { + var btn = new Gtk.Button() { + visible = true, + label = ws.id.to_string() + }; + + hypr.notify["focused-workspace"].connect(() => { + var focused = hypr.focused_workspace == ws; + if (focused) { + Astal.widget_set_class_names(btn, {"focused"}); + } else { + Astal.widget_set_class_names(btn, {}); + } + }); + + btn.clicked.connect(ws.focus); + return btn; + } +} + +class FocusedClient : Gtk.Box { + public FocusedClient() { + Astal.widget_set_class_names(this, {"Focused"}); + AstalHyprland.get_default().notify["focused-client"].connect(sync); + sync(); + } + + void sync() { + foreach (var child in get_children()) + child.destroy(); + + var client = AstalHyprland.get_default().focused_client; + if (client == null) + return; + + var label = new Gtk.Label(client.title) { visible = true }; + client.bind_property("title", label, "label", BindingFlags.SYNC_CREATE); + add(label); + } +} + +class Media : Gtk.Box { + AstalMpris.Mpris mpris = AstalMpris.get_default(); + + public Media() { + Astal.widget_set_class_names(this, {"Media"}); + mpris.notify["players"].connect(sync); + sync(); + } + + void sync() { + foreach (var child in get_children()) + child.destroy(); + + if (mpris.players.length() == 0) { + add(new Gtk.Label("Nothing Playing")); + return; + } + + var player = mpris.players.nth_data(0); + var label = new Gtk.Label(null); + var cover = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0) { + valign = Gtk.Align.CENTER + }; + + Astal.widget_set_class_names(cover, {"Cover"}); + player.bind_property("metadata", label, "label", BindingFlags.SYNC_CREATE, (_, src, ref trgt) => { + var title = player.title; + var artist = player.artist; + trgt.set_string(@"$artist - $title"); + return true; + }); + + var id = player.notify["cover-art"].connect(() => { + var art = player.cover_art; + Astal.widget_set_css(cover, @"background-image: url('$art')"); + }); + + cover.destroy.connect(() => player.disconnect(id)); + add(cover); + add(label); + } +} + +class SysTray : Gtk.Box { + HashTable items = new HashTable(str_hash, str_equal); + AstalTray.Tray tray = AstalTray.get_default(); + + public SysTray() { + Astal.widget_set_class_names(this, { "SysTray" }); + tray.item_added.connect(add_item); + tray.item_removed.connect(remove_item); + } + + void add_item(string id) { + if (items.contains(id)) + return; + + var item = tray.get_item(id); + var btn = new Gtk.MenuButton() { use_popover = false, visible = true }; + var icon = new Astal.Icon() { visible = true }; + + item.bind_property("tooltip-markup", btn, "tooltip-markup", BindingFlags.SYNC_CREATE); + item.bind_property("gicon", icon, "gicon", BindingFlags.SYNC_CREATE); + item.bind_property("menu-model", btn, "menu-model", BindingFlags.SYNC_CREATE); + btn.insert_action_group("dbusmenu", item.action_group); + item.notify["action-group"].connect(() => { + btn.insert_action_group("dbusmenu", item.action_group); + }); + + btn.add(icon); + add(btn); + items.set(id, btn); + } + + void remove_item(string id) { + if (items.contains(id)) { + items.remove(id); + } + } +} + +class Wifi : Astal.Icon { + public Wifi() { + Astal.widget_set_class_names(this, {"Wifi"}); + var wifi = AstalNetwork.get_default().wifi; + // var wifi = AstalNetwork.get_default().get_wifi(); + if (wifi != null) { + wifi.bind_property("ssid", this, "tooltip-text", BindingFlags.SYNC_CREATE); + wifi.bind_property("icon-name", this, "icon", BindingFlags.SYNC_CREATE); + } + } +} + +class AudioSlider : Gtk.Box { + Astal.Icon icon = new Astal.Icon(); + Astal.Slider slider = new Astal.Slider() { hexpand = true }; + + public AudioSlider() { + add(icon); + add(slider); + Astal.widget_set_class_names(this, {"AudioSlider"}); + Astal.widget_set_css(this, "min-width: 140px"); + + var speaker = AstalWp.get_default().audio.default_speaker; + speaker.bind_property("volume-icon", icon, "icon", BindingFlags.SYNC_CREATE); + speaker.bind_property("volume", slider, "value", BindingFlags.SYNC_CREATE); + slider.dragged.connect(() => speaker.volume = slider.value); + } +} + +class Battery : Gtk.Box { + Astal.Icon icon = new Astal.Icon(); + Astal.Label label = new Astal.Label(); + + public Battery() { + add(icon); + add(label); + Astal.widget_set_class_names(this, {"Battery"}); + + var bat = AstalBattery.get_default(); + bat.bind_property("is-present", this, "visible", BindingFlags.SYNC_CREATE); + bat.bind_property("battery-icon-name", icon, "icon", BindingFlags.SYNC_CREATE); + bat.bind_property("percentage", label, "label", BindingFlags.SYNC_CREATE, (_, src, ref trgt) => { + var p = Math.floor(src.get_double() * 100); + trgt.set_string(@"$p%"); + return true; + }); + } +} + +class Time : Astal.Label { + string format; + AstalIO.Time interval; + + void sync() { + label = new DateTime.now_local().format(format); + } + + public Time(string format = "%H:%M - %A %e.") { + this.format = format; + interval = AstalIO.Time.interval(1000, null); + interval.now.connect(sync); + destroy.connect(interval.cancel); + Astal.widget_set_class_names(this, {"Time"}); + } +} + +class Left : Gtk.Box { + public Left() { + Object(hexpand: true, halign: Gtk.Align.START); + add(new Workspaces()); + add(new FocusedClient()); + } +} + +class Center : Gtk.Box { + public Center() { + add(new Media()); + } +} + +class Right : Gtk.Box { + public Right() { + Object(hexpand: true, halign: Gtk.Align.END); + add(new SysTray()); + add(new Wifi()); + add(new AudioSlider()); + add(new Battery()); + add(new Time()); + } +} + +class Bar : Astal.Window { + public Bar(Gdk.Monitor monitor) { + Object( + anchor: Astal.WindowAnchor.TOP + | Astal.WindowAnchor.LEFT + | Astal.WindowAnchor.RIGHT, + exclusivity: Astal.Exclusivity.EXCLUSIVE, + gdkmonitor: monitor + ); + + Astal.widget_set_class_names(this, {"Bar"}); + + add(new Astal.CenterBox() { + start_widget = new Left(), + center_widget = new Center(), + end_widget = new Right(), + }); + + show_all(); + } +} + diff --git a/packages/x86-manpages/default.nix b/hosts/packages/x86-manpages/default.nix similarity index 100% rename from packages/x86-manpages/default.nix rename to hosts/packages/x86-manpages/default.nix diff --git a/overlays/default.nix b/overlays/default.nix index cecd3fc..b6445d9 100644 --- a/overlays/default.nix +++ b/overlays/default.nix @@ -1,17 +1,10 @@ -[ - (self: super: { - angry-oxide = import ../packages/angryoxide { - pkgs = super; - inherit - (super) - lib - ; - }; - ekphos = import ../packages/ekphos { - pkgs = super; - }; - x86-manpages = import ../packages/x86-manpages { - pkgs = super; - }; - }) -] +{upkgs, ...}: { + nixpkgs.overlays = [ + (self: super: { + ekphos = import ../packages/ekphos.nix { + inherit upkgs; + pkgs = super; + }; + }) + ]; +} diff --git a/packages/ekphos/default.nix b/packages/ekphos.nix similarity index 88% rename from packages/ekphos/default.nix rename to packages/ekphos.nix index 8e90cab..bf176d5 100644 --- a/packages/ekphos/default.nix +++ b/packages/ekphos.nix @@ -1,10 +1,14 @@ -{pkgs, ...}: let +{ + pkgs, + upkgs, + ... +}: let inherit (pkgs) lib ; in - pkgs.rustPackages.rustPlatform.buildRustPackage { + upkgs.rustPackages.rustPlatform.buildRustPackage { pname = "ekphos"; version = "v0.20.10"; src = pkgs.fetchFromGitHub {