Compare commits

...

2 commits

Author SHA1 Message Date
a2192c9341 add cerulean compatability 2026-02-08 23:41:05 +10:00
e961180371 move hosts/packages -> packages 2026-02-08 20:22:39 +10:00
39 changed files with 239 additions and 1728 deletions

200
flake.lock generated
View file

@ -1,29 +1,48 @@
{
"nodes": {
"colmena": {
"cerulean": {
"inputs": {
"flake-compat": "flake-compat",
"flake-utils": "flake-utils",
"nix-github-actions": "nix-github-actions",
"deploy-rs": "deploy-rs",
"mix": "mix",
"nib": "nib",
"nixpkgs": [
"nixpkgs"
],
"nixpkgs-unstable": [
"nixpkgs-unstable"
],
"stable": [
"nixpkgs"
"systems": [
"systems"
]
},
"locked": {
"lastModified": 1734374287,
"narHash": "sha256-rINodqeUuezuCWOnpJgrH7u9vJ86fYT+Dj8Mu8T/IBc=",
"owner": "zhaofengli",
"repo": "colmena",
"rev": "47b6414d800c8471e98ca072bc0835345741a56a",
"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",
"type": "github"
},
"original": {
"owner": "zhaofengli",
"repo": "colmena",
"rev": "47b6414d800c8471e98ca072bc0835345741a56a",
"owner": "serokell",
"repo": "deploy-rs",
"type": "github"
}
},
@ -56,11 +75,11 @@
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1650374568,
"narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
"lastModified": 1733328505,
"narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "b4a34015c698c7793d592d66adbab377907a2be8",
"rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
"type": "github"
},
"original": {
@ -101,25 +120,6 @@
"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,6 +140,48 @@
"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,
@ -156,27 +198,6 @@
"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",
@ -201,16 +222,16 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1770536720,
"narHash": "sha256-pbmbaQUuoG+v37b91lqcNcz05YUvVif7iWjIx9lF8R4=",
"lastModified": 1743014863,
"narHash": "sha256-jAIUqsiN2r3hCuHji80U7NNEafpIMBXiwKlSrjWMlpg=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "3c64ab24b22579c833895b6030c9563837e41a70",
"rev": "bd3bac8bfb542dbde7ffffb6987a1a1f9d41699f",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-25.05",
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
@ -246,16 +267,32 @@
"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": {
"colmena": "colmena",
"cerulean": "cerulean",
"dobutterfliescry-net": "dobutterfliescry-net",
"grub2-themes": "grub2-themes",
"nix-flatpak": "nix-flatpak",
"nixcord": "nixcord",
"nixpkgs": "nixpkgs",
"nixpkgs": "nixpkgs_2",
"nixpkgs-unstable": "nixpkgs-unstable",
"systems": "systems"
"systems": "systems_2"
}
},
"systems": {
@ -272,6 +309,39 @@
"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",

139
flake.nix
View file

@ -1,5 +1,5 @@
{
description = "Emile's Nix Dotfiles";
description = "im gonna cry again ;-;";
inputs = {
systems.url = "github:nix-systems/default";
@ -7,12 +7,18 @@
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05";
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
colmena = {
url = "github:zhaofengli/colmena/?rev=47b6414d800c8471e98ca072bc0835345741a56a";
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";
inputs = {
nixpkgs.follows = "nixpkgs-unstable";
stable.follows = "nixpkgs";
flake-utils.inputs.systems.follows = "systems";
systems.follows = "systems";
nixpkgs.follows = "nixpkgs";
nixpkgs-unstable.follows = "nixpkgs-unstable";
};
};
@ -38,84 +44,63 @@
};
outputs = {
self,
nixpkgs,
nixpkgs-unstable,
cerulean,
home-manager,
grub2-themes,
colmena,
...
} @ inputs: let
system = "x86_64-linux";
pkgs = import nixpkgs {
inherit system;
config = {
allowUnfree = false; # sanity check
};
}: let
groups = {
cryde = {}; # oh frick i cried again
server = {};
};
in
cerulean.mkNexus ./. {
nexus = {
inherit groups;
overlays = import ./overlays;
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 = ./.;
specialArgs = {inherit inputs pkgs-unstable;};
in {
devShells."x86_64-linux".default = pkgs.mkShell {
shell = "${pkgs.bash}/bin/bash";
packages = with pkgs; [
# ./script/* dependencies
mkpasswd
];
};
nixosConfigurations = {
# i be on my puter fr
myputer = nixpkgs.lib.nixosSystem {
# nix passes these to every single module
inherit specialArgs;
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 {
nodes = {
# my laptop <3 :3
lolcathost = {
system = "x86_64-linux";
config.allowUnfree = false;
groups = [groups.cryde];
extraModules = [
home-manager.nixosModules.default
grub2-themes.nixosModules.default
];
};
# i be on my puter frfr
myputer = {
system = "x86_64-linux";
groups = [groups.cryde];
extraModules = [
home-manager.nixosModules.default
grub2-themes.nixosModules.default
];
};
# courtesy of aurora <3
butterfly = {
system = "x86_64-linux";
groups = [groups.server];
deploy.ssh.host = "dobutterfliescry.net";
};
# pls dont sue me im broke
hyrule = {
system = "x86_64-linux";
groups = [groups.server];
deploy.ssh.host = "hyrule.dobutterfliescry.net";
};
# call me a statistician the way she spreads in my sheets
matcha = {
system = "x86_64-linux";
groups = [groups.server];
deploy.ssh.host = "bedroom.dobutterfliescry.net";
};
};
};
# meine vps
hyrule = import ./hosts/hyrule;
};
};
}

View file

@ -4,7 +4,7 @@
lib,
config,
pkgs,
pkgs-unstable,
upkgs,
...
} @ args: {
imports = [
@ -16,12 +16,9 @@
../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

View file

@ -1,6 +1,6 @@
{
pkgs,
pkgs-unstable,
upkgs,
...
}: let
lsps = {
@ -43,7 +43,7 @@
};
ty = {
pkg = pkgs-unstable.ty;
pkg = upkgs.ty;
cmd = "ty";
};

View file

@ -1,7 +1,7 @@
{pkgs-unstable, ...}: {
{upkgs, ...}: {
programs.foot = {
enable = true;
package = pkgs-unstable.foot;
package = upkgs.foot;
server.enable = true;

View file

@ -1,6 +1,6 @@
{
pkgs,
pkgs-unstable,
upkgs,
...
}: let
home-manager = builtins.fetchTarball {
@ -40,17 +40,6 @@ 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;

View file

@ -1,11 +1,11 @@
{
pkgs,
pkgs-unstable,
upkgs,
...
}: {
services.minecraft-server = {
enable = true;
package = pkgs-unstable.minecraft-server; # use latest version only!
package = upkgs.minecraft-server; # use latest version only!
declarative = true;
eula = true;

View file

@ -1,37 +1,20 @@
{
lib,
pkgs,
pkgs-unstable,
upkgs,
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 = [
@ -41,7 +24,6 @@ in {
];
nixpkgs.config.allowUnfreePredicate = let
vscext = pkgs.vscode-extensions;
whitelist = with pkgs;
map lib.getName [
discord
@ -53,18 +35,6 @@ in {
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;
@ -237,7 +207,7 @@ in {
home-manager = {
users.me = import ../../homes/me;
extraSpecialArgs = {inherit inputs pkgs pkgs-unstable;};
extraSpecialArgs = {inherit inputs pkgs upkgs;};
sharedModules = [];
};
@ -258,7 +228,6 @@ in {
# ---- SYSTEM PACKAGES -----
environment.systemPackages = with pkgs; [
# User Environment
# crywl
swww
helvum
easyeffects
@ -297,7 +266,7 @@ in {
hexyl
# ASM
nasm
(callPackage ../packages/x86-manpages {})
# x86-manpages # WARNING: cerulean doesn't allow overlays bruh
# C Family
gcc
clang
@ -323,7 +292,7 @@ in {
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
@ -389,20 +358,13 @@ in {
# Games
prismlauncher # minecraft
pkgs-unstable.olympus # celeste
upkgs.olympus # celeste
discord
discordo
ekphos
# ekphos # WARNING: cerulean doesnt allow overlays yet
];
programs = {
crywl = {
enable = true;
xwayland.enable = false;
defaultSession = false;
useUnmodifiedDWL = false;
};
fish.enable = true;
nix-ld.enable = true;

View file

@ -1,5 +0,0 @@
{pkgs, ...}: {
environment.systemPackages = with pkgs; [
(callPackage ../packages/angryoxide {})
];
}

View file

@ -1,6 +1,6 @@
{
pkgs,
pkgs-unstable,
upkgs,
dotnetVersions ? [8 9 10],
...
}: {
@ -10,7 +10,7 @@
environment.systemPackages = with pkgs; [
# Ensure latest stable Rider version (not necessarily stable on NixOS)
pkgs-unstable.jetbrains.rider
upkgs.jetbrains.rider
# NOTE: Blazor requires a Chromium-based browser
chromium

View file

@ -1,5 +0,0 @@
{pkgs, ...}: {
environment.systemPackages = with pkgs; [
(callPackage ../packages/chameleonultragui {})
];
}

View file

@ -1,31 +0,0 @@
#### 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

View file

@ -1,93 +0,0 @@
{
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";
};
}
);
};
}

View file

@ -1,99 +0,0 @@
# 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";
};
}
);
*/
}

View file

@ -1,6 +0,0 @@
{pkgs, ...}: {
environment.systemPackages = with pkgs; [
# flipper zero desktop app
qflipper
];
}

View file

@ -1,7 +1,7 @@
{
lib,
pkgs,
pkgs-unstable,
upkgs,
...
}: let
dotnetVersions = [8 9 10];
@ -50,9 +50,9 @@ in {
# Mono
mono
# NOTE: nixpkgs-unstable uses .NET8 SDK
# NOTE: nixupkgs uses .NET8 SDK
# WARNING: nixpkgs-25.05 uses .NET6 SDK (now marked insecure)
pkgs-unstable.msbuild
upkgs.msbuild
# .NET Framework Tools/Services
omnisharp-roslyn

View file

@ -1,72 +0,0 @@
{
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 ];
};
};
}

View file

@ -1,22 +0,0 @@
{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 ];
};
};
}

View file

@ -1,117 +0,0 @@
{
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";
};
});
})
];
});
}

View file

@ -1,5 +0,0 @@
{...}: {
programs = {
river.enable = true;
};
}

View file

@ -1,7 +1,7 @@
{
lib,
pkgs,
pkgs-unstable,
upkgs,
inputs,
config,
...
@ -230,7 +230,7 @@ in {
home-manager = {
users.me = import ../../homes/me;
extraSpecialArgs = {inherit inputs pkgs pkgs-unstable;};
extraSpecialArgs = {inherit inputs pkgs upkgs;};
sharedModules = [];
};
@ -379,7 +379,7 @@ in {
# Games
prismlauncher # minecraft
pkgs-unstable.olympus
upkgs.olympus
discord
];

View file

@ -1,474 +0,0 @@
{
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
'';
}
)

View file

@ -1,12 +0,0 @@
**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 <BUILD-DIR> <SRC-DIR>` ie `meson setup build src`.
Compile meson like `meson compile -C <BUILD-DIR>` where <BUILD-DIR> 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`.

View file

@ -1,62 +0,0 @@
{
"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
}

View file

@ -1,42 +0,0 @@
{
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
];
};
};
};
}

View file

@ -1,31 +0,0 @@
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)));
}
}
}

View file

@ -1,47 +0,0 @@
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,
)

View file

@ -1,107 +0,0 @@
@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;
}
}
}

View file

@ -1,265 +0,0 @@
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<string, Gtk.Widget> items = new HashTable<string, Gtk.Widget>(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();
}
}

View file

@ -1,10 +1,17 @@
{upkgs, ...}: {
nixpkgs.overlays = [
(self: super: {
ekphos = import ../packages/ekphos.nix {
inherit upkgs;
pkgs = super;
};
})
];
}
[
(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;
};
})
]

View file

@ -1,14 +1,10 @@
{
pkgs,
upkgs,
...
}: let
{pkgs, ...}: let
inherit
(pkgs)
lib
;
in
upkgs.rustPackages.rustPlatform.buildRustPackage {
pkgs.rustPackages.rustPlatform.buildRustPackage {
pname = "ekphos";
version = "v0.20.10";
src = pkgs.fetchFromGitHub {