Compare commits

..

No commits in common. "main" and "backup_pre_split" have entirely different histories.

487 changed files with 12866 additions and 4793 deletions

1
.gitignore vendored
View file

@ -7,4 +7,3 @@
__pycache__ __pycache__
.direnv .direnv
*.html *.html
/result

View file

@ -1,5 +0,0 @@
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.18.4
hooks:
- id: gitleaks

3
.stylua.toml Normal file
View file

@ -0,0 +1,3 @@
indent_type = "Spaces"
call_parentheses = "None"
collapse_simple_statement = "Always"

View file

@ -1,11 +0,0 @@
.PHONY: default build flathub
HOST := $(shell hostname)
default: build
build:
nix build --no-link --keep-going .#nixosConfigurations.$(HOST).config.system.build.toplevel
flathub:
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo

View file

@ -1,14 +1,6 @@
#+title: README #+title: README
#+author: Evie Litherland-Smith #+author: Evie Litherland-Smith
#+email: evie@xenia.me.uk #+email: evie@xenia.me.uk
My personal NixOS + home-manager configuration files.
To set up without cloning the repository (assuming an already running
NixOS system), run:
#+begin_src bash
sudo nixos-rebuild switch --flake "git+https://git.xenia.me.uk/pixelifytica/nixos.git?ref=main"\#$(hostname)
#+end_src
* Password store setup * Password store setup
** Transfer GPG key(s) ** Transfer GPG key(s)
#+begin_src bash #+begin_src bash
@ -16,31 +8,58 @@ NixOS system), run:
gpg -a --export > publickeys.asc gpg -a --export > publickeys.asc
gpg -a --export-secret-keys > privatekeys.asc gpg -a --export-secret-keys > privatekeys.asc
# Import key on new machine # Import key on new machine
gpg --import privatekeys.asc; gpg --import publickeys.asc gpg --import privatekeys.asc
gpg --import publickeys.asc
# Edit (for each key) to set trust # Edit (for each key) to set trust
gpg --edit-key evie@xenia.me.uk gpg --edit-key evie@xenia.me.uk
#+end_src #+end_src
** Clone password-store repository ** Clone password-store repository
#+begin_src bash #+begin_src bash
git clone https://git.xenia.me.uk/pixelifytica/pass $PASSWORD_STORE_DIR git -c credential.helper='' clone https://git.xenia.me.uk/pixelifytica/pass $PASSWORD_STORE_DIR
#+end_src #+end_src
* Email setup * Email setup
** Passwords for mbsync
Run src_bash{mbsync-ensure-pass} to check for passwords required by
~mbsync~, and query for missing passwords.
Static app-specific passwords are stored in ~password-store~, fetch from
there to add to secret service.
** Proton ** Proton
*** Bridge *** Bridge
Start Proton Mail Bridge application, if needed configure to store Run src_bash{protonmail-setup-bridge} to automate this process.
using =SecretService= and log in. Application will auto-start with
desktop session.
Use password from Bridge for ~mbsync~. Run bridge in CLI mode to login, wait for initial sync and get app password
#+begin_src bash
nix run nixpkgs#protonmail-bridge -- -c
# Follow prompts to login and get password
#+end_src
Restart using ~swaymsg~:
#+begin_src bash
nix shell nixpkgs#protonmail-bridge -c swaymsg exec "protonmail-bridge -n"
#+end_src
**** uidvalidity issue
+Remove uid lines from .mbsyncrc (in each mail directory) and delete .uidvalidity, re-run mbsync to fix+
Above might be duplicating mail, faster to just delete local maildirs and let them re-sync.
*** Password
Get password from ~protonmail-bridge~, save to ~password-store~:
#+begin_src bash
pass insert mbsync/$(hostname)/proton
# Insert pass at prompt
#+end_src
** iCloud
*** Password
If not already done, save password to ~password-store~:
#+begin_src bash
pass insert mbsync/$(hostname)/icloud
# Insert pass at prompt
#+end_src
This will be synced across devices so only needs doing once
** Outlook ** Outlook
*** Davmail *** Password
If not already done, save password to ~password-store~:
#+begin_src bash
pass insert mbsync/$(hostname)/outlook
# Insert pass at prompt
#+end_src
This will be synced across devices so only needs doing once
*** Configuration
Run src_bash{davmail-setup} to automate this process. Run src_bash{davmail-setup} to automate this process.
On first run (or if token expires), stop systemd service and run manually to complete manual auth. Token will stay valid for a little while (no idea how long specifically). On first run (or if token expires), stop systemd service and run manually to complete manual auth. Token will stay valid for a little while (no idea how long specifically).
@ -52,11 +71,3 @@ On first run (or if token expires), stop systemd service and run manually to com
# Restart again so that service picks up available ports # Restart again so that service picks up available ports
systemctl --user restart davmail.service systemctl --user restart davmail.service
#+end_src #+end_src
* Flathub setup
#+begin_src bash
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
#+end_src
* Further reading:
- https://nixos.org/

View file

@ -5,11 +5,11 @@
"fromYaml": "fromYaml" "fromYaml": "fromYaml"
}, },
"locked": { "locked": {
"lastModified": 1732200724, "lastModified": 1709025227,
"narHash": "sha256-+R1BH5wHhfnycySb7Sy5KbYEaTJZWm1h+LW1OtyhiTs=", "narHash": "sha256-KXcORItjYJTdEO/BlBd0Uym1Xa3eBu43uvpFiWjJOdY=",
"owner": "SenchoPens", "owner": "SenchoPens",
"repo": "base16.nix", "repo": "base16.nix",
"rev": "153d52373b0fb2d343592871009a286ec8837aec", "rev": "4e9b16c8b44958bc6bf46d99c3bb1b59c9c9c764",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -18,99 +18,14 @@
"type": "github" "type": "github"
} }
}, },
"base16-fish": {
"flake": false,
"locked": {
"lastModified": 1622559957,
"narHash": "sha256-PebymhVYbL8trDVVXxCvZgc0S5VxI7I1Hv4RMSquTpA=",
"owner": "tomyun",
"repo": "base16-fish",
"rev": "2f6dd973a9075dabccd26f1cded09508180bf5fe",
"type": "github"
},
"original": {
"owner": "tomyun",
"repo": "base16-fish",
"type": "github"
}
},
"base16-helix": {
"flake": false,
"locked": {
"lastModified": 1725860795,
"narHash": "sha256-Z2o8VBPW3I+KKTSfe25kskz0EUj7MpUh8u355Z1nVsU=",
"owner": "tinted-theming",
"repo": "base16-helix",
"rev": "7f795bf75d38e0eea9fed287264067ca187b88a9",
"type": "github"
},
"original": {
"owner": "tinted-theming",
"repo": "base16-helix",
"type": "github"
}
},
"base16-vim": {
"flake": false,
"locked": {
"lastModified": 1731949548,
"narHash": "sha256-XIDexXM66sSh5j/x70e054BnUsviibUShW7XhbDGhYo=",
"owner": "tinted-theming",
"repo": "base16-vim",
"rev": "61165b1632409bd55e530f3dbdd4477f011cadc6",
"type": "github"
},
"original": {
"owner": "tinted-theming",
"repo": "base16-vim",
"type": "github"
}
},
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1696426674,
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-utils": {
"inputs": {
"systems": [
"stylix",
"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"
}
},
"fromYaml": { "fromYaml": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1731966426, "lastModified": 1689549921,
"narHash": "sha256-lq95WydhbUTWig/JpqiB7oViTcHFP8Lv41IGtayokA8=", "narHash": "sha256-iX0pk/uB019TdBGlaJEWvBCfydT6sRq+eDcGPifVsCM=",
"owner": "SenchoPens", "owner": "SenchoPens",
"repo": "fromYaml", "repo": "fromYaml",
"rev": "106af9e2f715e2d828df706c386a685698f3223b", "rev": "11fbbbfb32e3289d3c631e0134a23854e7865c84",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -119,23 +34,6 @@
"type": "github" "type": "github"
} }
}, },
"gnome-shell": {
"flake": false,
"locked": {
"lastModified": 1732369855,
"narHash": "sha256-JhUWbcYPjHO3Xs3x9/Z9RuqXbcp5yhPluGjwsdE2GMg=",
"owner": "GNOME",
"repo": "gnome-shell",
"rev": "dadd58f630eeea41d645ee225a63f719390829dc",
"type": "github"
},
"original": {
"owner": "GNOME",
"ref": "47.2",
"repo": "gnome-shell",
"type": "github"
}
},
"home-manager": { "home-manager": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
@ -143,175 +41,92 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1734366194, "lastModified": 1714043624,
"narHash": "sha256-vykpJ1xsdkv0j8WOVXrRFHUAdp9NXHpxdnn1F4pYgSw=", "narHash": "sha256-Xn2r0Jv95TswvPlvamCC46wwNo8ALjRCMBJbGykdhcM=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "80b0fdf483c5d1cb75aaad909bd390d48673857f", "rev": "86853e31dc1b62c6eeed11c667e8cdd0285d4411",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nix-community", "owner": "nix-community",
"ref": "release-24.11", "ref": "release-23.11",
"repo": "home-manager", "repo": "home-manager",
"type": "github" "type": "github"
} }
}, },
"iosevka-custom": {
"inputs": {
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1710589819,
"narHash": "sha256-fm69qycthevGExpbudpuCCSEBPuCOk/+d15382c37oE=",
"ref": "refs/heads/main",
"rev": "6e305fa1d05a97343d47f0b6865e10a870fc8d4e",
"revCount": 10,
"type": "git",
"url": "https://git.xenia.me.uk/pixelifytica/iosevka.git"
},
"original": {
"type": "git",
"url": "https://git.xenia.me.uk/pixelifytica/iosevka.git"
}
},
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1734600368, "lastModified": 1710451336,
"narHash": "sha256-nbG9TijTMcfr+au7ZVbKpAhMJzzE2nQBYmRvSdXUD8g=", "narHash": "sha256-pP86Pcfu3BrAvRO7R64x7hs+GaQrjFes+mEPowCfkxY=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "b47fd6fa00c6afca88b8ee46cfdb00e104f50bca", "rev": "d691274a972b3165335d261cc4671335f5c67de9",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nixos", "owner": "nixos",
"ref": "nixos-24.11", "ref": "nixos-unstable",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
}, },
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1733097829, "lastModified": 1715106579,
"narHash": "sha256-9hbb1rqGelllb4kVUCZ307G2k3/UhmA8PPGBoyuWaSw=", "narHash": "sha256-gZMgKEGiK6YrwGBiccZ1gemiUwjsZ1Zv49KYOgmX2fY=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "2c15aa59df0017ca140d9ba302412298ab4bf22a", "rev": "8be0d8a1ed4f96d99b09aa616e2afd47acc3da89",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nixos", "owner": "nixos",
"ref": "nixpkgs-unstable", "ref": "nixos-23.11",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
}, },
"root": { "root": {
"inputs": {
"home-manager": "home-manager",
"nixpkgs": "nixpkgs",
"stylix": "stylix",
"treefmt-nix": "treefmt-nix"
}
},
"stylix": {
"inputs": { "inputs": {
"base16": "base16", "base16": "base16",
"base16-fish": "base16-fish", "home-manager": "home-manager",
"base16-helix": "base16-helix", "iosevka-custom": "iosevka-custom",
"base16-vim": "base16-vim", "nixpkgs": "nixpkgs_2",
"flake-compat": "flake-compat", "tt-schemes": "tt-schemes"
"flake-utils": "flake-utils",
"gnome-shell": "gnome-shell",
"home-manager": [
"home-manager"
],
"nixpkgs": [
"nixpkgs"
],
"systems": "systems",
"tinted-foot": "tinted-foot",
"tinted-kitty": "tinted-kitty",
"tinted-tmux": "tinted-tmux"
},
"locked": {
"lastModified": 1734110444,
"narHash": "sha256-fp1iV2JldCSvz+7ODzXYUkQ+H7zyiWw5E0MQ4ILC4vw=",
"owner": "danth",
"repo": "stylix",
"rev": "9015d5d0d5d100f849129c43d257b827d300b089",
"type": "github"
},
"original": {
"owner": "danth",
"ref": "release-24.11",
"repo": "stylix",
"type": "github"
} }
}, },
"systems": { "tt-schemes": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"tinted-foot": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1726913040, "lastModified": 1713388094,
"narHash": "sha256-+eDZPkw7efMNUf3/Pv0EmsidqdwNJ1TaOum6k7lngDQ=", "narHash": "sha256-wcotm0Ek2ISn8iJBzEujJQdcPLKWrPAOZ/dS/DLKafw=",
"owner": "tinted-theming", "owner": "tinted-theming",
"repo": "tinted-foot", "repo": "schemes",
"rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4", "rev": "abcf2a055ae69f1bf047463332f83db3125aa8a5",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "tinted-theming", "owner": "tinted-theming",
"repo": "tinted-foot", "repo": "schemes",
"rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4",
"type": "github"
}
},
"tinted-kitty": {
"flake": false,
"locked": {
"lastModified": 1716423189,
"narHash": "sha256-2xF3sH7UIwegn+2gKzMpFi3pk5DlIlM18+vj17Uf82U=",
"owner": "tinted-theming",
"repo": "tinted-kitty",
"rev": "eb39e141db14baef052893285df9f266df041ff8",
"type": "github"
},
"original": {
"owner": "tinted-theming",
"repo": "tinted-kitty",
"rev": "eb39e141db14baef052893285df9f266df041ff8",
"type": "github"
}
},
"tinted-tmux": {
"flake": false,
"locked": {
"lastModified": 1729501581,
"narHash": "sha256-1ohEFMC23elnl39kxWnjzH1l2DFWWx4DhFNNYDTYt54=",
"owner": "tinted-theming",
"repo": "tinted-tmux",
"rev": "f0e7f7974a6441033eb0a172a0342e96722b4f14",
"type": "github"
},
"original": {
"owner": "tinted-theming",
"repo": "tinted-tmux",
"type": "github"
}
},
"treefmt-nix": {
"inputs": {
"nixpkgs": "nixpkgs_2"
},
"locked": {
"lastModified": 1734704479,
"narHash": "sha256-MMi74+WckoyEWBRcg/oaGRvXC9BVVxDZNRMpL+72wBI=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "65712f5af67234dad91a5a4baee986a8b62dbf8f",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github" "type": "github"
} }
} }

288
flake.nix
View file

@ -2,83 +2,245 @@
description = "Evie's machine configurations"; description = "Evie's machine configurations";
nixConfig = { nixConfig = {
extra-substituters = [ "https://nix.xenia.me.uk" ]; extra-substituters = ["https://nix.xenia.me.uk"];
extra-trusted-public-keys = [ "nix.xenia.me.uk:tlgwOaG5KMLjQUk2YaErS8mAG69ZCr3PaHXZYi+Y5eI=" ]; extra-trusted-public-keys = ["nix.xenia.me.uk:tlgwOaG5KMLjQUk2YaErS8mAG69ZCr3PaHXZYi+Y5eI="];
}; };
inputs = { inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11"; nixpkgs.url = "github:nixos/nixpkgs/nixos-23.11";
treefmt-nix.url = "github:numtide/treefmt-nix";
home-manager = { home-manager = {
url = "github:nix-community/home-manager/release-24.11"; url = "github:nix-community/home-manager/release-23.11";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
stylix = { iosevka-custom.url = "git+https://git.xenia.me.uk/pixelifytica/iosevka.git";
url = "github:danth/stylix/release-24.11"; base16.url = "github:SenchoPens/base16.nix";
inputs = { tt-schemes = {
nixpkgs.follows = "nixpkgs"; url = "github:tinted-theming/schemes";
home-manager.follows = "home-manager"; flake = false;
};
}; };
}; };
outputs = outputs = {
inputs@{ nixpkgs,
self, home-manager,
nixpkgs, iosevka-custom,
treefmt-nix, base16,
... tt-schemes,
}: ...
let }: let
treefmt = treefmt-nix.lib.evalModule nixpkgs.legacyPackages.x86_64-linux ./treefmt.nix; systemConfig = {
in hostName ? "Atlas",
{ user ? "pixelifytica",
formatter.x86_64-linux = treefmt.config.build.wrapper; system ? "x86_64-linux",
checks.x86_64-linux.formatting = treefmt.config.build.check self; stateVersion ? "23.05",
nixosConfigurations = { systemModules ? [],
## Server homeModules ? [],
Legion = nixpkgs.lib.nixosSystem { }: let
specialArgs = { defaultUserShell = "zsh";
inherit inputs; specialArgs = {
username = "pixelifytica"; inherit hostName user;
hostName = "Legion"; accentColour = "base07"; # catppuccin lavender
catppuccinVariant = "Mocha";
fonts = with import nixpkgs {inherit system;};
with iosevka-custom.outputs; rec {
sizes = {
applications = 12;
desktop = 10;
popups = 14;
terminal = 12;
}; };
modules = [ ./system/default.nix ]; serif = sansSerif;
}; sansSerif = {
## Personal name = names."iosevka-custom-aile";
Vanguard = nixpkgs.lib.nixosSystem { package = packages.${system}."iosevka-custom-aile";
specialArgs = {
inherit inputs;
username = "pixelifytica";
hostName = "Vanguard";
}; };
modules = [ ./system/default.nix ]; monospace = {
}; name = names."iosevka-custom-nerdfont";
Northstar = nixpkgs.lib.nixosSystem { package = packages.${system}."iosevka-custom-nerdfont";
specialArgs = {
inherit inputs;
username = "pixelifytica";
hostName = "Northstar";
}; };
modules = [ ./system/default.nix ]; emoji = {
}; name = "Noto Color Emoji";
## Work package = noto-fonts-emoji;
Tone = nixpkgs.lib.nixosSystem {
specialArgs = {
inherit inputs;
username = "elitherl";
hostName = "Tone";
}; };
modules = [ ./system/default.nix ];
};
Monarch = nixpkgs.lib.nixosSystem {
specialArgs = {
inherit inputs;
username = "elitherl";
hostName = "Monarch";
};
modules = [ ./system/default.nix ];
}; };
}; };
in
nixpkgs.lib.nixosSystem {
inherit system specialArgs;
modules =
[
home-manager.nixosModules.home-manager
base16.nixosModule
./hosts/${hostName}/configuration.nix
./hosts/${hostName}/hardware-configuration.nix
./system/default.nix
({
config,
lib,
pkgs,
catppuccinVariant ? "Mocha",
...
}: {
scheme = "${tt-schemes}/base16/catppuccin-${lib.strings.toLower catppuccinVariant}.yaml";
nix = {
enable = true;
package = pkgs.nixVersions.unstable;
settings = {
cores = 0;
max-jobs = "auto";
trusted-users = ["root" user];
experimental-features = ["nix-command" "flakes"];
auto-optimise-store = true;
};
channel.enable = true;
nixPath = ["nixpkgs=${pkgs.path}"];
registry.nixpkgs.flake = nixpkgs;
gc = {
automatic = true;
options = "--delete-older-than 7d";
};
optimise.automatic = true;
extraOptions = ''
keep-outputs = false
keep-derivations = false
min-free = ${toString (100 * 1024 * 1024)}
max-free = ${toString (1024 * 1024 * 1024)}
'';
};
nixpkgs.config.allowUnfree = true;
networking = {inherit hostName;};
programs.${defaultUserShell}.enable = true;
system = {inherit stateVersion;};
users = {
defaultUserShell = pkgs.${defaultUserShell};
users = let
authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINI1dWlS16Keil0MGPWmMsBzx8F9ylfz+fRwxUr8/tZ/ ion"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC4M1zV3yLMMI1tYwdY9QDXJDlOBugm7UXKC+Xk89yHq pixelifytica@Vanguard"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICPypUUGVAdpl0SHrUDVw0RureuFNsljrXQvrf0uc055 pixelifytica@Northstar"
];
in {
root.openssh = {inherit authorizedKeys;};
${user} = {
group = "users";
isNormalUser = true;
description = "Evie Litherland-Smith";
extraGroups = ["networkmanager" "wheel" "video" "input" "uinput"];
initialHashedPassword = "$y$j9T$tHIPQt09Kf3KH2eIRze3g/$2mwSlcq27DTGvHNPJ5EP9/1CfL3bXP0F6oS/Vuffmn3";
openssh = {inherit authorizedKeys;};
};
};
};
home-manager = {
extraSpecialArgs = {inherit (config) scheme;} // specialArgs;
useGlobalPkgs = true;
useUserPackages = true;
users = {
root = {
imports = [./home/default.nix];
home = {
inherit stateVersion;
username = "root";
homeDirectory = "/root";
};
programs.home-manager.enable = true;
};
${user} = let
username = user;
homeDirectory = "/home/${user}";
in {
imports =
[./hosts/${hostName}/home.nix ./home/default.nix]
++ homeModules;
home = {inherit username homeDirectory stateVersion;};
programs.home-manager.enable = true;
xdg.userDirs = {
enable = true;
createDirectories = true;
extraConfig = {
XDG_PROJECTS_DIR = "${homeDirectory}/Projects";
};
};
};
};
};
})
]
++ systemModules;
};
in {
nixosConfigurations = {
## Server
Legion = systemConfig {
hostName = "Legion";
systemModules = [
./services/caddy.nix
./services/forgejo.nix
./services/grafana.nix
./services/minecraft.nix
./services/nix-serve.nix
./services/radicale.nix
./services/sshd.nix
./services/syncthing.nix
];
homeModules = [./home/default.nix];
};
## Personal
Northstar = systemConfig {
hostName = "Northstar";
systemModules = [
./system/laptop.nix
./system/sway.nix
];
homeModules = [
./home/sway/default.nix
./home/email/work.nix
];
};
Vanguard = systemConfig {
hostName = "Vanguard";
systemModules = [
./system/desktop.nix
./system/games.nix
./system/sway.nix
];
homeModules = [
./home/sway/default.nix
./home/email/work.nix
];
};
## Work
Ronin = systemConfig {
hostName = "Ronin";
user = "elitherl";
systemModules = [
./system/laptop.nix
./system/sway.nix
];
homeModules = [
./home/sway/default.nix
./home/email/work.nix
];
};
Scorch = systemConfig {
hostName = "Scorch";
user = "elitherl";
systemModules = [
./system/desktop.nix
./system/sway.nix
];
homeModules = [
./home/sway/default.nix
./home/email/work.nix
];
};
}; };
};
} }

View file

@ -0,0 +1,75 @@
[colors.primary]
background = "#1E1E2E"
foreground = "#CDD6F4"
dim_foreground = "#CDD6F4"
bright_foreground = "#CDD6F4"
[colors.cursor]
text = "#1E1E2E"
cursor = "#F5E0DC"
[colors.vi_mode_cursor]
text = "#1E1E2E"
cursor = "#B4BEFE"
[colors.search.matches]
foreground = "#1E1E2E"
background = "#A6ADC8"
[colors.search.focused_match]
foreground = "#1E1E2E"
background = "#A6E3A1"
[colors.footer_bar]
foreground = "#1E1E2E"
background = "#A6ADC8"
[colors.hints.start]
foreground = "#1E1E2E"
background = "#F9E2AF"
[colors.hints.end]
foreground = "#1E1E2E"
background = "#A6ADC8"
[colors.selection]
text = "#1E1E2E"
background = "#F5E0DC"
[colors.normal]
black = "#45475A"
red = "#F38BA8"
green = "#A6E3A1"
yellow = "#F9E2AF"
blue = "#89B4FA"
magenta = "#F5C2E7"
cyan = "#94E2D5"
white = "#BAC2DE"
[colors.bright]
black = "#585B70"
red = "#F38BA8"
green = "#A6E3A1"
yellow = "#F9E2AF"
blue = "#89B4FA"
magenta = "#F5C2E7"
cyan = "#94E2D5"
white = "#A6ADC8"
[colors.dim]
black = "#45475A"
red = "#F38BA8"
green = "#A6E3A1"
yellow = "#F9E2AF"
blue = "#89B4FA"
magenta = "#F5C2E7"
cyan = "#94E2D5"
white = "#BAC2DE"
[[colors.indexed_colors]]
index = 16
color = "#FAB387"
[[colors.indexed_colors]]
index = 17
color = "#F5E0DC"

View file

@ -0,0 +1,30 @@
{fonts, ...}: {
programs.alacritty = let
catppuccin-mocha = builtins.fromTOML (builtins.readFile ./catppuccin-mocha.toml);
in {
enable = true;
settings =
{
font = {
size = fonts.sizes.applications;
normal = {
family = fonts.monospace.name;
style = "Regular";
};
};
window = {
opacity = 0.8;
dynamic_title = true;
padding = {
x = 10;
y = 10;
};
decorations = "none";
};
live_config_reload = false;
selection.save_to_clipboard = true;
mouse.hide_when_typing = false;
}
// catppuccin-mocha;
};
}

22
home/avizo/default.nix Normal file
View file

@ -0,0 +1,22 @@
{
scheme,
accentColour ? "base07",
...
}: {
services.avizo = {
enable = true;
settings.default = with scheme; let
accent = {
r = scheme."${accentColour}-rgb-r";
g = scheme."${accentColour}-rgb-g";
b = scheme."${accentColour}-rgb-b";
};
in {
background = "rgba(${base00-rgb-r}, ${base00-rgb-g}, ${base00-rgb-b}, 0.8)";
bar-bg-color = "rgba(${base00-rgb-r}, ${base00-rgb-g}, ${base00-rgb-b}, 0.8)";
bar-fg-color = "rgba(${base05-rgb-r}, ${base05-rgb-g}, ${base05-rgb-b}, 1.0)";
border-color = "rgba(${accent.r}, ${accent.g}, ${accent.b}, 1.0)";
image-opacity = "1.0";
};
};
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

21
home/bat/default.nix Normal file
View file

@ -0,0 +1,21 @@
{
lib,
catppuccinVariant ? "Mocha",
...
}: {
xdg.configFile = let
variants = ["Latte" "Frappe" "Macchiato" "Mocha"];
mkVariant = variant: let
fname = "catppuccin${variant}.tmTheme";
in {
name = "bat/themes/${fname}";
value = {source = ./. + "/${fname}";};
};
in
builtins.listToAttrs
(lib.lists.forEach variants mkVariant);
programs.bat = {
enable = true;
config.theme = "catppuccin${catppuccinVariant}";
};
}

35
home/bottom/default.nix Normal file
View file

@ -0,0 +1,35 @@
{
scheme,
accentColour ? "base07",
...
}: {
programs.bottom = {
enable = true;
settings.colors = with scheme.withHashtag; let
rainbow = [red yellow green cyan blue magenta];
in {
table_header_color = base05;
all_cpu_color = base05;
avg_cpu_color = base05;
cpu_core_colors = rainbow;
ram_color = red;
cache_color = green;
swap_color = blue;
rx_color = green;
tx_color = blue;
widget_title_color = scheme.withHashtag.${accentColour};
border_color = base02;
highlighted_border_color = scheme.withHashtag.${accentColour};
text_color = base05;
graph_color = base04;
cursor_color = base02;
selected_text_color = base05;
selected_bg_color = base01;
high_battery_color = green;
medium_battery_color = yellow;
low_battery_color = red;
gpu_core_colors = rainbow;
arc_color = cyan;
};
};
}

17
home/cava/default.nix Normal file
View file

@ -0,0 +1,17 @@
{scheme, ...}: {
programs.cava = {
enable = true;
settings = {
color = with scheme.withHashtag; {
gradient = 1;
gradient_count = 6;
gradient_color_1 = "'${red}'";
gradient_color_2 = "'${yellow}'";
gradient_color_3 = "'${green}'";
gradient_color_4 = "'${cyan}'";
gradient_color_5 = "'${blue}'";
gradient_color_6 = "'${magenta}'";
};
};
};
}

40
home/default.nix Normal file
View file

@ -0,0 +1,40 @@
{pkgs, ...}: {
imports = [
./bat/default.nix
./git/default.nix
./ssh/default.nix
./zsh/default.nix
./starship/default.nix
./bottom/default.nix
./emacs/default.nix
./scripts/default.nix
];
programs = {
bash.enable = true;
carapace.enable = true;
eza = {
enable = true;
enableAliases = true;
git = true;
icons = true;
extraOptions = ["--octal-permissions"];
};
readline = {
enable = true;
includeSystemConfig = true;
extraConfig = ''
set completion-ignore-case On
'';
};
direnv = {
enable = true;
nix-direnv.enable = true;
};
fzf = {
enable = true;
defaultCommand = "${pkgs.fd}/bin/fd --type f";
changeDirWidgetCommand = "${pkgs.fd}/bin/fd --type d";
fileWidgetCommand = "${pkgs.fd}/bin/fd --type f";
};
};
}

87
home/desktop.nix Normal file
View file

@ -0,0 +1,87 @@
{
lib,
config,
pkgs,
scheme,
catppuccinVariant ? "Mocha",
...
}: {
imports = [
./default.nix
./email/default.nix
./password-store/default.nix
./wlogout/default.nix
./waybar/default.nix
./rofi/default.nix
./swaylock/default.nix
./swaync/default.nix
./avizo/default.nix
./alacritty/default.nix
./emacs/default.nix
./nyxt/default.nix
./obs/default.nix
./cava/default.nix
./prog/default.nix
];
programs.rofi.terminal = "${config.programs.alacritty.package}/bin/alacritty";
services = {
gpg-agent.pinentryFlavor = "gtk2";
avizo.enable = true;
syncthing.enable = true;
udiskie = {
enable = true;
notify = true;
automount = true;
tray = "never";
};
};
gtk = with lib.strings; let
accent = "Lavender";
size = "Standard";
in {
enable = true;
iconTheme = {
package = pkgs.catppuccin-papirus-folders.override {
accent = toLower accent;
flavor = toLower catppuccinVariant;
};
name = "Papirus-Dark";
};
cursorTheme = let
variant = "${lib.strings.toLower catppuccinVariant}Dark";
in {
package = pkgs.catppuccin-cursors.${variant};
name = "Catppuccin-${catppuccinVariant}-Dark-Cursors";
size = 32;
};
theme = {
package = with lib.strings;
pkgs.catppuccin-gtk.override {
accents = [(toLower accent)];
size = toLower size;
variant = toLower catppuccinVariant;
};
name = "Catppuccin-${catppuccinVariant}-${size}-${accent}-Dark";
};
};
xresources.properties = with scheme.withHashtag; {
"*background" = base00;
"*foreground" = base05;
"*color0" = base00;
"*color1" = red;
"*color2" = green;
"*color3" = yellow;
"*color4" = blue;
"*color5" = magenta;
"*color6" = cyan;
"*color7" = base04;
"*color8" = base01;
"*color9" = red;
"*color10" = green;
"*color11" = yellow;
"*color12" = blue;
"*color13" = magenta;
"*color14" = cyan;
"*color15" = base05;
};
}

172
home/emacs/default.nix Normal file
View file

@ -0,0 +1,172 @@
{
config,
pkgs,
fonts,
...
}: {
imports = [../git/default.nix];
programs.git.extraConfig.core.editor = "$EDITOR";
programs.emacs = {
# Clone emacs config from https://git.xenia.me.uk/pixelifytica/emacs.git
# git clone https://git.xenia.me.uk/pixelifytica/emacs.git ~/.config/emacs
enable = true;
package = pkgs.emacs29-pgtk;
extraConfig = let
shell = "${pkgs.zsh}/bin/zsh";
font = "${fonts.monospace.name}-${toString fonts.sizes.applications}";
fixed-font-family = "${fonts.monospace.name}";
variable-font-family = "${fonts.sansSerif.name}";
alpha = "80";
in ''
(customize-set-variable 'shell-file-name "${shell}")
(add-to-list 'initial-frame-alist '(font . "${font}"))
(add-to-list 'default-frame-alist '(font . "${font}"))
(set-face-attribute 'fixed-pitch nil :family "${fixed-font-family}")
(set-face-attribute 'fixed-pitch-serif nil :family "${fixed-font-family}")
(set-face-attribute 'variable-pitch nil :family "${variable-font-family}")
(add-to-list 'initial-frame-alist '(alpha-background . ${alpha}))
(add-to-list 'default-frame-alist '(alpha-background . ${alpha}))
(scroll-bar-mode -1)
(tab-bar-mode -1)
(menu-bar-mode -1)
'';
extraPackages = epkgs:
with epkgs; [
# Theme
base16-theme
# UI
all-the-icons
nerd-icons
nerd-icons-completion
nerd-icons-corfu
nerd-icons-dired
nerd-icons-ibuffer
doom-modeline
diminish
ligature
page-break-lines
helpful
which-key
link-hint
diff-hl
# Completion
cape
consult
consult-eglot
consult-flyspell
corfu
corfu-terminal
embark
embark-consult
marginalia
orderless
vertico
# Snippets
tempel
tempel-collection
# spell-checking
flyspell-correct
# password-store
pass
password-store
password-store-otp
# IDE
treesit-grammars.with-all-grammars
treesit-auto
flymake-popon
flymake-collection
flymake-eslint
flymake-shellcheck
apheleia
direnv
rainbow-delimiters
aggressive-indent
nix-mode
python-docstring
# Media
emms
# org-mode
org-roam
org-noter
org-journal
# org-cite
citar
citar-embark
# org-plot
gnuplot
# org-mode HTML export
htmlize
# Projects
ibuffer-project
magit
forge
# Writing
markdown-mode
pandoc-mode
auctex
auctex-latexmk
latex-preview-pane
# Email
mu4e
# RSS feeds
elfeed
elfeed-org
elfeed-tube
];
};
services = {
emacs = {
enable = true;
package = config.programs.emacs.finalPackage;
defaultEditor = true;
client.enable = true;
socketActivation.enable = true;
startWithUserSession = false;
};
git-sync.repositories = with config.xdg.userDirs; {
org = {
path = "${documents}/Org";
uri = "git+https://git.xenia.me.uk/xenia/org.git";
};
references = {
path = "${documents}/References";
uri = "git+https://git.xenia.me.uk/xenia/references.git";
};
};
};
home.packages = with pkgs; [
# Emacs requirements
imagemagick
languagetool
wordnet
gnuplot # For org-plot
graphviz # For org-roam graph
mp3info # For EMMS
# Language-specific requirements
sqlite
pandoc
ghostscript
poppler_utils
# Customised LaTeX install
(texlive.combine {
inherit (pkgs.texlive) scheme-medium dvisvgm dvipng wrapfig amsmath ulem hyperref capt-of;
})
];
}

81
home/email/default.nix Normal file
View file

@ -0,0 +1,81 @@
{
pkgs,
hostName,
...
}: {
accounts.email = {
maildirBasePath = "Mail";
accounts = let
realName = "Evie Litherland-Smith";
in {
proton = let
host = "127.0.0.1";
tls.enable = false;
in rec {
inherit realName;
primary = true;
maildir.path = "Proton";
imap = {
inherit host tls;
port = 1143;
};
smtp = {
inherit host tls;
port = 1025;
};
address = "e.litherlandsmith@proton.me";
aliases = ["evie@xenia.me.uk" "evie@litherlandsmith.slmail.me"];
userName = address;
passwordCommand = "${pkgs.pass}/bin/pass show mbsync/${hostName}/proton | head -n1";
mu.enable = true;
msmtp = {
enable = true;
extraConfig = {
tls = "off";
auth = "login";
};
};
mbsync = {
enable = true;
create = "both";
expunge = "both";
remove = "both";
patterns = ["*" "!All Mail" "!Labels*" "!Starred" "!Recovered Messages"];
subFolders = "Verbatim";
extraConfig.account.AuthMechs = "LOGIN";
};
};
icloud = rec {
inherit realName;
primary = false;
maildir.path = "iCloud";
imap.host = "imap.mail.me.com";
smtp.host = "smtp.mail.me.com";
address = "e.litherlandsmith@icloud.com";
userName = address;
passwordCommand = "${pkgs.pass}/bin/pass show mbsync/${hostName}/icloud | head -n1";
mu.enable = true;
msmtp.enable = true;
mbsync = {
enable = true;
create = "both";
expunge = "both";
remove = "both";
patterns = ["*" "!Notes"];
subFolders = "Verbatim";
};
};
};
};
programs = {
mu.enable = true;
msmtp.enable = true;
mbsync = {
enable = true;
groups.inboxes = {
proton = ["INBOX"];
icloud = ["INBOX"];
};
};
};
}

69
home/email/work.nix Normal file
View file

@ -0,0 +1,69 @@
{
config,
pkgs,
hostName,
...
}: {
imports = [./default.nix];
accounts.email.accounts.outlook = let
host = "127.0.0.1";
tls.enable = false;
in rec {
inherit (config.accounts.email.accounts.proton) realName;
primary = false;
maildir.path = "Outlook";
imap = {
inherit host tls;
port = 1144;
};
smtp = {
inherit host tls;
port = 1026;
};
address = "evie.litherland-smith@ukaea.uk";
aliases = ["elitherl@jet.uk"];
userName = address;
passwordCommand = "${pkgs.pass}/bin/pass show mbsync/${hostName}/outlook | head -n1";
mu.enable = true;
msmtp = {
enable = true;
extraConfig = {
tls = "off";
auth = "login";
};
};
mbsync = {
enable = true;
create = "both";
expunge = "both";
remove = "both";
patterns = [
"*"
"!Conversation History"
"!Snoozed"
"!Social Activity Notifications"
"!Sync Issues*"
"!Unsent Messages"
];
subFolders = "Verbatim";
extraConfig.account.AuthMechs = "LOGIN";
};
};
programs.mbsync.groups.inboxes.outlook = ["INBOX"];
systemd.user.services.davmail = {
Unit = {
Description = "Davmail server";
Wants = ["network-online.target"];
After = ["network-online.target"];
};
Service = {
Environment = ["PATH=/run/current-system/sw/bin/:$PATH"];
Restart = "always";
ExecStartPre = with config.home; ''
/bin/sh -c "if [ ! -f ${homeDirectory}/.davmail.properties ]; then cp ${./davmail.properties} ${homeDirectory}/.davmail.properties; fi; chmod 644 ${homeDirectory}/.davmail.properties"
'';
ExecStart = "${pkgs.davmail}/bin/davmail -notray ${config.home.homeDirectory}/.davmail.properties";
};
Install.WantedBy = ["default.target"];
};
}

0
home/eww/config/eww.scss Normal file
View file

13
home/eww/config/eww.yuck Normal file
View file

@ -0,0 +1,13 @@
(defwindow example
:monitor 0
:geometry (geometry :x "0%"
:y "20px"
:width "90%"
:height "30px"
:anchor "top center")
:stacking "overlay"
:reserve (struts :distance "40px" :side "top")
:windowtype "dock"
:wm-ignore false
:namespace eww-example
"example content")

12
home/eww/default.nix Normal file
View file

@ -0,0 +1,12 @@
{
config,
lib,
pkgs,
...
}: {
programs.eww = {
enable = true;
package = pkgs.eww-wayland;
configDir = ./config;
};
}

48
home/foot/default.nix Normal file
View file

@ -0,0 +1,48 @@
{
fonts,
scheme,
...
}: {
programs.foot = {
enable = true;
server.enable = true;
settings = {
main = {
# term = "xterm-256color";
title = "foot";
locked-title = "no";
font = with fonts; "${monospace.name}:size=${toString sizes.applications}";
dpi-aware = "no";
pad = "10x10";
};
bell = {
urgent = "no";
notify = "no";
visual = "no";
};
cursor = {blink = "yes";};
mouse = {hide-when-typing = "no";};
colors = with scheme; rec {
alpha = 0.8;
background = base00;
foreground = base05;
regular0 = base02;
regular1 = red;
regular2 = green;
regular3 = yellow;
regular4 = blue;
regular5 = magenta;
regular6 = cyan;
regular7 = base05;
bright0 = base03;
bright1 = regular1;
bright2 = regular2;
bright3 = regular3;
bright4 = regular4;
bright5 = regular5;
bright6 = regular6;
bright7 = base04;
};
};
};
}

39
home/git/default.nix Normal file
View file

@ -0,0 +1,39 @@
{
config,
lib,
...
}: {
services.git-sync.enable = false; # Can't find pass for some reason...
programs.git = {
enable = true;
userName = "Evie Litherland-Smith";
userEmail = lib.mkDefault "evie@xenia.me.uk";
delta = {
enable = true;
options = {
line-numbers = true;
hyprlinks = true;
navigate = true;
side-by-side = true;
syntax-theme = with config.programs; lib.mkIf bat.enable bat.config.theme;
};
};
attributes = [
"*.gpg filter=gpg diff=gpg"
"*.asc filter=gpg diff=gpg"
];
extraConfig = let
user = "pixelifytica";
in {
github = {inherit user;};
gitea = {inherit user;};
pull.rebase = false;
init.defaultBranch = "main";
merge.conflictstyle = "diff3";
diff = {
colorMoved = "default";
gpg.textconv = "gpg --no-tty --decrypt";
};
};
};
}

398
home/hyprland/default.nix Normal file
View file

@ -0,0 +1,398 @@
{
config,
lib,
pkgs,
fonts,
scheme,
accentColour ? "base07",
...
}: {
imports = [../desktop.nix];
home.packages = with pkgs; [
(writeShellScriptBin "protonmail-setup-bridge" ''
pkill -9 -f protonmail-bridge
${protonmail-bridge}/bin/protonmail-bridge -c
${config.wayland.windowManager.hyprland.finalPackage}/bin/hyprctl dispatch exec "${protonmail-bridge}/bin/protonmail-bridge -n"
'')
];
wayland.windowManager.hyprland = {
enable = true;
xwayland.enable = true;
systemd.enable = true;
settings = {
monitor = [",preferred,auto,auto"];
env = with config; [
"XDG_CURRENT_DESKTOP=Hyprland"
"XDG_SESSION_TYPE=wayland"
"XDG_SESSION_DESKTOP=Hyprland"
"GDK_BACKEND=wayland,x11"
"GTK_THEME,${gtk.theme.name}"
"XCURSOR_THEME,${gtk.cursorTheme.name}"
"XCURSOR_SIZE,${toString gtk.cursorTheme.size}"
"QT_AUTO_SCREEN_SCALE_FACTOR,1"
"QT_QPA_PLATFORM,wayland"
"QT_WAYLAND_DISABLE_WINDOWDECORATION,1"
"MOZ_ENABLE_WAYLAND,1"
"GRIM_DEFAULT_DIR=${xdg.userDirs.pictures}/Grim"
];
exec-once = with config; [
"systemctl --user import-environment WAYLAND_DISPLAY QT_QPA_PLATFORMTHEME"
"${wayland.windowManager.hyprland.finalPackage}/bin/hyprctl setcursor ${gtk.cursorTheme.name} ${toString gtk.cursorTheme.size}"
"${pkgs.swaynotificationcenter}/bin/swaync"
"${pkgs.libsForQt5.polkit-kde-agent}/libexec/polkit-kde-authentication-agent-1"
"${pkgs.protonmail-bridge}/bin/protonmail-bridge -n"
"${pkgs.waybar}/bin/waybar"
"${pkgs.hyprpaper}/bin/hyprpaper"
];
gestures.workspace_swipe = true;
input = {
kb_layout = "gb";
kb_options = "ctrl:nocaps";
follow_mouse = 1;
touchpad.natural_scroll = "yes";
};
dwindle = {
force_split = 2;
preserve_split = false;
smart_split = false;
smart_resizing = false;
special_scale_factor = 0.95;
no_gaps_when_only = 0;
use_active_for_splits = true;
default_split_ratio = 1.0;
};
master = {
allow_small_split = true;
special_scale_factor = 0.95;
mfact = 0.5;
new_is_master = false;
new_on_top = false;
no_gaps_when_only = 0;
orientation = "left";
inherit_fullscreen = false;
smart_resizing = false;
drop_at_cursor = true;
};
general = with scheme; {
"col.active_border" = "rgb(${scheme.${accentColour}})";
"col.inactive_border" = "rgb(${base03})";
gaps_in = 5;
gaps_out = 10;
border_size = 1;
cursor_inactive_timeout = 0;
layout = "dwindle";
};
decoration = with scheme; {
rounding = 10;
"col.shadow" = "rgba(0d${base00})";
drop_shadow = "yes";
shadow_ignore_window = true;
shadow_range = 4;
shadow_render_power = 3;
blur = {
enabled = true;
size = 5;
passes = 3;
new_optimizations = true;
brightness = 1.0;
noise = 2.0e-2;
};
};
animations = {
enabled = true;
bezier = "myBezier, 0.05, 0.9, 0.1, 1.05";
animation = [
"windows, 1, 7, myBezier"
"windowsOut, 1, 7, default, popin 80%"
"border, 1, 10, default"
"borderangle, 1, 8, default"
"fade, 1, 7, default"
"workspaces, 1, 6, default"
];
};
misc = {
disable_splash_rendering = true;
disable_autoreload = true;
mouse_move_enables_dpms = true;
key_press_enables_dpms = true;
};
xwayland.force_zero_scaling = true;
layerrule = let
blur = x: "blur, ^(${x})$";
ignorealpha = x: "ignorealpha 0.3, ^(${x})$";
layers = [
"waybar"
"system-menu"
"rofi"
"gtk-layer-shell"
"notifications"
"swaync-.*"
"avizo"
];
in
(lib.lists.forEach layers blur)
++ (lib.lists.forEach layers ignorealpha);
windowrule = [
# Workspace binds
"workspace 3, (libreoffice|soffice)(.*)"
"workspace 4, (WebCord|signal)"
"workspace 5, org.prismlauncher.PrismLauncher"
"workspace 5 silent, steam" # Keep silent to avoid popups taking focus
# Float + move system windows
"float, org.kde.polkit-kde-authentication-agent-1|Pinentry"
"center, org.kde.polkit-kde-authentication-agent-1|Pinentry"
"pin, org.kde.polkit-kde-authentication-agent-1|Pinentry"
"dimaround, org.kde.polkit-kde-authentication-agent-1|Pinentry"
"stayfocused, org.kde.polkit-kde-authentication-agent-1|Pinentry"
"float, pavucontrol|.blueman-manager-wrapped|nm-connection-editor"
"size 800 600, pavucontrol|.blueman-manager-wrapped|nm-connection-editor"
"move onscreen 100%-820 60,pavucontrol|.blueman-manager-wrapped|nm-connection-editor"
# PrismLauncher / Minecraft
"float, org.prismlauncher.PrismLauncher"
"center, org.prismlauncher.PrismLauncher"
"size 800 600, org.prismlauncher.PrismLauncher"
];
windowrulev2 = [
# Firefox PIP
"float, title:Picture-in-Picture|Library,class:firefox"
"size 750 400, title:Picture-in-Picture,class:firefox"
"size 800 800, title:Library,class:firefox"
"move onscreen 100%-775 100%-425, title:Picture-in-Picture,class:firefox"
"center, title:Library,class:firefox"
"pin, title:Picture-in-Picture,class:firefox"
# Thunar extra windows
"float, title:File Operation Progress,class:thunar"
"size 800 600, title:File Operation Progress,class:thunar"
"center, title:File Operation Progress,class:thunar"
# LibreOffice
"nofullscreenrequest, class:(libreoffice|soffice)(.*)"
"nomaximizerequest, class:(libreoffice|soffice)(.*)"
"float, title:Open,class:(libreoffice|soffice)(.*)"
# Steam
"float, title:Friends List,class:steam"
"size 400 600, title:Friends List,class:steam"
"float, title:(.*)(Chat),class:steam"
"size 800 600, title:(.*)(Chat),class:steam"
"float, title:Steam Settings,class:steam"
"size 800 600, title:Steam Settings,class:steam"
# X2Go / Remmina / NoMachine
"nofullscreenrequest, class:x2goclient|org.remmina.Remmina|Nxplayer.bin"
"nomaximizerequest, class:x2goclient|org.remmina.Remmina|Nxplayer.bin"
"float, title:(X2Go Client|Freia|Heimdall), class:x2goclient"
"float, title:Remmina Remote Desktop Client, class:org.remmina.Remmina"
"float, title:(NoMachine)(.*), class:Nxplayer.bin"
"center, title:(X2Go Client|Freia|Heimdall), class:x2goclient"
"center, title:Remmina Remote Desktop Client, class:org.remmina.Remmina"
"center, title:(NoMachine)(.*), class:Nxplayer.bin"
"size 800 600, title:X2Go Client, class:x2goclient"
"size 1920 1080, title:Freia|Heimdall, class:x2goclient"
"size 1920 1080, title:(NoMachine)(.*), class:Nxplayer.bin"
];
bind = let
withTerm = {
term ? "alacritty",
package ? config.programs.${term}.package,
progname,
args ? "",
}: "${package}/bin/${term} -T ${progname} -e ${progname} ${args}";
workspace = w: [
"SUPER, ${toString w}, moveworkspacetomonitor, ${toString w} current"
"SUPER, ${toString w}, workspace, ${toString w}"
"SUPER SHIFT, ${toString w}, movetoworkspace, ${toString w}"
];
in
with config.programs;
with lib.lists;
flatten (forEach (range 1 9) workspace)
++ (let
btm_args = "--autohide_time --battery --celsius --enable_cache_memory --enable_gpu_memory --group --hide_avg_cpu --hide_table_gap --retention=3m --show_table_scroll_position";
in [
# See https://wiki.hyprland.org/Configuring/Keywords/ for more
# Open Hyprland wiki at correct version number
"CTRL_SHIFT, H, exec, xdg-open \"https://wiki.hyprland.org/$(hyprctl version -j | ${pkgs.jq}/bin/jq $args.commit | ${pkgs.gnused}/bin/sed s/v// | ${pkgs.gnused}/bin/sed s/\\\"//g)\""
# "SUPER, F1, exec, ${pkgs.hyprlock}/bin/hyprlock" # Until added to nixpkgs
"SUPER, F1, exec, ${swaylock.package}/bin/swaylock --screenshots --clock --indicator --grace-no-mouse"
"SUPER, Q, killactive,"
"SUPER SHIFT, Q, exec, pkill rofi || ${rofi.finalPackage}/bin/rofi -show powermenu -modi powermenu:${pkgs.rofi-power-menu}/bin/rofi-power-menu"
"SUPER, V, togglefloating"
# "SUPER SHIFT, V, setfloating" ## TODO setfloating exists
# in newer version of Hyprland than mine
"SUPER SHIFT, V, moveactive, exact 1% 4%"
"SUPER SHIFT, V, resizeactive, exact 800 600"
"SUPER SHIFT, V, pin"
"SUPER, M, fullscreen, 1" # Maximise window
"SUPER SHIFT, M, fullscreen, 0" # Actual fullscreen
"SUPER, Z, exec, ${pkgs.swaynotificationcenter}/bin/swaync-client -t -sw"
"SUPER SHIFT, Z, exec, ${pkgs.swaynotificationcenter}/bin/swaync-client -d -sw"
# Common program shortcuts
"SUPER, Return, exec, ${alacritty.package}/bin/alacritty"
"SUPER, E, exec, ${emacs.finalPackage}/bin/emacsclient -c"
"SUPER, W, exec, ${firefox.package}/bin/firefox"
"SUPER, F, exec, ${pkgs.xfce.thunar}/bin/thunar"
# Rofi binds
"SUPER, Space, exec, pkill rofi || ${rofi.finalPackage}/bin/rofi -show drun"
"SUPER, tab, exec, pkill rofi || ${rofi.finalPackage}/bin/rofi -show window"
"SUPER, A, exec, pkill rofi || ${rofi.finalPackage}/bin/rofi -show emoji"
# rofi-pass binds
"SUPER, P, exec, pkill rofi || ${rofi.pass.package}/bin/rofi-pass"
"SUPER SHIFT, P, exec, pkill rofi || ${rofi.pass.package}/bin/rofi-pass --last-used"
"SUPER ALT, P, exec, pkill rofi || ${rofi.pass.package}/bin/rofi-pass --insert"
# Terminal utilities
"SUPER, S, exec, ${withTerm {
progname = "btm";
args = btm_args;
}}"
"SUPER SHIFT, S, exec, ${withTerm {
progname = "btm";
args = btm_args + " --basic";
}}"
"SUPER, C, exec, ${withTerm {progname = "cava";}}"
# Misc useful binds
'',Print,exec,${pkgs.grim}/bin/grim -g "$(${pkgs.slurp}/bin/slurp)"''
",XF86Calculator,exec,pkill rofi || ${rofi.finalPackage}/bin/rofi -show calc"
# Movement binds
"SUPER, H, movefocus, l"
"SUPER, L, movefocus, r"
"SUPER, K, movefocus, u"
"SUPER, J, movefocus, d"
"SUPER SHIFT, H, movewindow, l"
"SUPER SHIFT, L, movewindow, r"
"SUPER SHIFT, K, movewindow, u"
"SUPER SHIFT, J, movewindow, d"
# Special workspaces
"SUPER, comma, workspace, m-1"
"SUPER SHIFT, comma, movetoworkspace, r-1"
"SUPER, period, workspace, m+1"
"SUPER SHIFT, period, movetoworkspace, r+1"
"SUPER, N, workspace, empty"
"SUPER SHIFT, N, movetoworkspace, empty"
"SUPER, minus, togglespecialworkspace"
"SUPER SHIFT, minus, movetoworkspace, special"
"SUPER, bracketright, focusmonitor, +1"
"SUPER SHIFT, bracketright, movecurrentworkspacetomonitor, +1"
"SUPER, bracketleft, focusmonitor, -1"
"SUPER SHIFT, bracketleft, movecurrentworkspacetomonitor, -1"
"SUPER, O, focusurgentorlast"
]);
bindl = with config.services; [
# Sound
",XF86AudioMute,exec,${avizo.package}/bin/volumectl %"
",XF86AudioMicMute,exec,${avizo.package}/bin/volumectl -m %"
# Playback
",XF86AudioPlay,exec,${pkgs.playerctl}/bin/playerctl play-pause"
",XF86AudioStop,exec,${pkgs.playerctl}/bin/playerctl play-pause"
",XF86AudioPrev,exec,${pkgs.playerctl}/bin/playerctl previous"
",XF86AudioNext,exec,${pkgs.playerctl}/bin/playerctl next"
];
bindle = with config.services; [
# Sound
",XF86AudioRaiseVolume,exec,${avizo.package}/bin/volumectl -u + 5"
",XF86AudioLowerVolume,exec,${avizo.package}/bin/volumectl -u - 5"
# Brightness
",XF86MonBrightnessUp,exec,${avizo.package}/bin/lightctl + 5"
",XF86MonBrightnessDown,exec,${avizo.package}/bin/lightctl - 5"
];
bindm = [
# Move/resize windows with mainMod + LMB/RMB and dragging
"SUPER, mouse:272, movewindow"
"SUPER, mouse:273, resizewindow"
];
};
};
xdg.configFile = {
"hypr/hyprpaper.conf".text = let
image = ../../wallpapers/waves/cat-waves.png;
in ''
preload = ${image}
wallpaper = ,${image}
'';
"hypr/hyprlock.conf".text = with scheme; let
font = fonts.sansSerif.name;
accent = scheme.${accentColour};
in ''
# GENERAL
general {
disable_loading_bar = true
hide_cursor = true
}
# BACKGROUND
background {
monitor =
path = screenshot
blur_passes = 3
color = 0xff${accent}
}
# TIME
label {
monitor =
text = cmd[update:30000] echo "$(date +"%R")"
color = 0xff${base05}
font_size = 90
font_family = ${font}
position = -30, 0
halign = right
valign = top
}
# DATE
label {
monitor =
text = cmd[update:43200000] echo "$(date +"%A,%e %B %Y")"
color = 0xff${base05}
font_size = 25
font_family = ${font}
position = -30, -150
halign = right
valign = top
}
# USER
image {
monitor =
path = ${../../picrew.png}
size = 100
border_color = 0xff${accent}
position = 0, 75
halign = center
valign = center
}
# INPUT FIELD
input-field {
monitor =
size = 300, 60
outline_thickness = 2
dots_size = 0.2 # Scale of input-field height, 0.2 - 0.8
dots_spacing = 0.2 # Scale of dots' absolute size, 0.0 - 1.0
dots_center = true
outer_color = 0xff${accent}
inner_color = 0xff${base00}
font_color = 0xff${base05}
fade_on_empty = false
placeholder_text = <span foreground="##${base04}"><i>󰌾 Logged in as </i><span foreground="##${accent}">$USER</span></span>
hide_input = false
position = 0, -50
halign = center
valign = center
}
'';
};
}

7
home/nushell/config.nu Normal file
View file

@ -0,0 +1,7 @@
$env.config = {
show_banner: false,
edit_mode: emacs,
table: {
mode: rounded,
},
}

7
home/nushell/default.nix Normal file
View file

@ -0,0 +1,7 @@
{...}: {
programs.nushell = {
enable = true;
envFile.source = ./env.nu;
configFile.source = ./config.nu;
};
}

2
home/nushell/env.nu Normal file
View file

@ -0,0 +1,2 @@
$env.TRANSIENT_PROMPT_COMMAND = "> "
$env.PAGER = "bat"

122
home/nyxt/bookmarks.lisp Normal file
View file

@ -0,0 +1,122 @@
(
;; Personal
;; Messaging
( :url "https://web.whatsapp.com/"
:title "WhatApp Web"
:tags ("personal" "messaging"))
( :url "https://discord.com/app"
:title "Discord"
:tags ("personal" "messaging"))
;; Server
( :url "https://xenia.me.uk"
:title "Home Page"
:tags ("personal" "server"))
( :url "https://git.xenia.me.uk"
:title "Forgejo"
:tags ("personal" "server" "dev" "git"))
( :url "https://blog.xenia.me.uk"
:title "Blog"
:tags ("personal" "server"))
;; Dev
( :url "https://github.com"
:title "GitHub"
:tags ("personal" "dev" "git"))
;; EV
( :url "https://abetterrouteplanner.com/"
:title "ABRP - A Better Route Planner"
:tags ("personal" "ev" "map"))
;; Documentation
( :url "https://nixos-and-flakes.thiscute.world/"
:title "NixOS and Flakes"
:tags ("personal" "documentation"))
( :url "https://nix-community.github.io/home-manager/options.xhtml"
:title "Home Manager Configuration Options"
:tags ("personal" "documentation"))
( :url "https://mipmip.github.io/home-manager-option-search/"
:title "Home Manager Option Search"
:tags ("personal" "documentation"))
;; Awesome Repos
( :url "https://github.com/emacs-tw/awesome-emacs"
:title "Awesome Emacs"
:tags ("personal" "awesome" "git"))
;; Miscellaneous
( :url "https://www.colorhexa.com/"
:title "Colour Encyclopedia"
:tags ("personal" "miscellaneous"))
;; Work
( :url "https://nucleus.ukaea.uk/"
:title "Nucleus"
:tags ("work"))
( :url "https://marval.service.ukaea.uk/MSMSelfService/Index.aspx"
:title "Marval Helpdesk"
:tags ("work"))
( :url "https://ubw.unit4cloud.com/uk_aea_prod_web/Login/Login.aspx"
:title "Unit4 Business World"
:tags ("work"))
;; Dev
( :url "https://git.ccfe.ac.uk/"
:title "GitLab (CCFE)"
:tags ("work" "dev" "git"))
;; JET
( :url "http://w3.jet.uk/"
:title "JET Homepage"
:tags ("work" "jet"))
( :url "https://users.euro-fusion.org/pages/physics-summary/LatestSession.php"
:title "JET Physics Summary"
:tags ("work" "jet"))
( :url "https://www.jspo.jet.uk/pages/operations/jpecreports_2023.html"
:title "JSPO JPEC Reports"
:tags ("work" "jet"))
( :url "https://dvcm.jetdata.eu/"
:title "DVCM Homepage"
:tags ("work" "jet"))
;; JET Data Services
( :url "https://data.jet.uk/"
:title "JET Data Services"
:tags ("work" "jet" "data"))
( :url "https://data.jet.uk/ppf/browse/ppfquery"
:title "PPF Query"
:tags ("work" "jet" "data"))
( :url "https://data.jet.uk/reqco/myrequests"
:title "ReqCo"
:tags ("work" "jet" "data"))
;; MAST-U
( :url "https://users.mastu.ukaea.uk/home"
:title "MAST-U Users Page"
:tags ("work" "mast-u"))
( :url "https://intranet.ccfe.ac.uk/mastu-handbook"
:title "MAST-U Diagnostic Handbook"
:tags ("work" "mast-u"))
;; OpenWiki
( :url "https://wiki.jetdata.eu/open/index.php?title=Main_Page"
:title "OpenWiki Homepage"
:tags ("work" "openwiki"))
( :url "https://wiki.jetdata.eu/open/index.php?title=Diagnostic_Coordinator_Wiki"
:title "Diagnostic Coordinator Wiki"
:tags ("work" "openwiki"))
( :url "https://wiki.jetdata.eu/open/index.php?title=Spectroscopy_Group:index"
:title "Spectroscopy Group Wiki"
:tags ("work" "openwiki"))
( :url "https://wiki.jetdata.eu/open/index.php?title=CXS:Topic3"
:title "KS5 Wiki"
:tags ("work" "openwiki"))
( :url "https://wiki.jetdata.eu/open/index.php?title=KT3_Journals"
:title "KT3 Wiki"
:tags ("work" "openwiki"))
;; Office
( :url "https://outlook.office.com/calendar/view/workweek"
:title "Outlook Calendar"
:tags ("work" "microsoft" "office"))
( :url "https://teams.microsoft.com/v2"
:title "Microsoft Teams"
:tags ("work" "microsoft" "office"))
( :url "https://ukaeauk-my.sharepoint.com/personal/evie_litherland-smith_ukaea_uk/"
:title "OneDrive"
:tags ("work" "microsoft" "office"))
( :url "https://ukaeauk.sharepoint.com/"
:title "Sharepoint"
:tags ("work" "microsoft" "office"))
)

View file

@ -10,12 +10,10 @@
(define-configuration :emacs-mode ((glyph "ε"))) (define-configuration :emacs-mode ((glyph "ε")))
(define-configuration :force-https-mode ((glyph "ϕ"))) (define-configuration :force-https-mode ((glyph "ϕ")))
(define-configuration :no-script-mode ((glyph "j")))
(define-configuration :user-script-mode ((glyph "u"))) (define-configuration :user-script-mode ((glyph "u")))
(define-configuration :blocker-mode ((glyph "β"))) (define-configuration :blocker-mode ((glyph "β")))
(define-configuration :proxy-mode ((glyph "π"))) (define-configuration :proxy-mode ((glyph "π")))
(define-configuration :reduce-tracking-mode ((glyph "τ"))) (define-configuration :reduce-tracking-mode ((glyph "τ")))
(define-configuration :reduce-bandwidth-mode ((glyph "r")))
(define-configuration :certificate-exception-mode ((glyph "χ"))) (define-configuration :certificate-exception-mode ((glyph "χ")))
(define-configuration :style-mode ((glyph "ϕ"))) (define-configuration :style-mode ((glyph "ϕ")))
(define-configuration :cruise-control-mode ((glyph "σ"))) (define-configuration :cruise-control-mode ((glyph "σ")))
@ -41,18 +39,17 @@
(defvar *my-search-engines* (defvar *my-search-engines*
(list (list
'("osm" "https://www.openstreetmap.org/search?query=~a" "https://www.openstreetmap.org/")
'("rust" "https://doc.rust-lang.org/std/index.html?search=~a" "https://doc.rust-lang.org/std/index.html") '("rust" "https://doc.rust-lang.org/std/index.html?search=~a" "https://doc.rust-lang.org/std/index.html")
'("crates" "https://crates.io/search?q=~a" "https://crates.io/") '("crates" "https://crates.io/search?q=~a" "https://crates.io/")
'("py" "https://docs.python.org/3/search.html?q=~a" "https://docs.python.org/3") '("python" "https://docs.python.org/3/search.html?q=~a" "https://docs.python.org/3")
'("pypi" "https://pypi.org/search/?q=~a" "https://pypi.org/") '("pypi" "https://pypi.org/search/?q=~a" "https://pypi.org/")
'("mynix" "https://mynixos.com/search?q=~a" "https://mynixos.com/")
'("nixwiki" "https://nixos.wiki/index.php?search=~a&go=Go" "https://nixos.wiki/") '("nixwiki" "https://nixos.wiki/index.php?search=~a&go=Go" "https://nixos.wiki/")
'("archwiki" "https://wiki.archlinux.org/index.php?search=~a" "https://wiki.archlinux.org/") '("archwiki" "https://wiki.archlinux.org/index.php?search=~a" "https://wiki.archlinux.org/")
'("github" "https://github.com/search?utf8=✓&q=~a&type=repositories" "https://github.com/") '("github" "https://github.com/search?utf8=✓&q=~a&type=repositories" "https://github.com/")
'("flathub" "https://flathub.org/apps/search?q=~a" "https://flathub.org/")
'("doi" "https://dx.doi.org/~a" "https://dx.doi.org/") '("doi" "https://dx.doi.org/~a" "https://dx.doi.org/")
'("wiki" "https://en.wikipedia.org/w/index.php?search=~a" "https://en.wikipedia.org/") '("wiki" "https://en.wikipedia.org/w/index.php?search=~a" "https://en.wikipedia.org/")
'("ddg" "https://html.duckduckgo.com/html/?q=~a" "https://html.duckduckgo.com/")) '("ddg" "https://duckduckgo.com/?q=~a" "https://duckduckgo.com/"))
"List of search engines.") "List of search engines.")
(define-configuration context-buffer (define-configuration context-buffer
@ -62,6 +59,6 @@
*my-search-engines*)))) *my-search-engines*))))
(define-configuration browser (define-configuration browser
((restore-session-on-startup-p nil))) ((restore-session-on-startup-p t)))
(setf (uiop/os:getenv "GTK_THEME") "Adwaita:light") (setf (uiop/os:getenv "GTK_THEME") "Adwaita:dark")

41
home/nyxt/default.nix Normal file
View file

@ -0,0 +1,41 @@
{
pkgs,
fonts,
scheme,
accentColour ? "base07",
...
}: {
xdg = {
configFile = {
"nyxt/config.lisp".text = with scheme.withHashtag; ''
;; Import custom configuration
(nyxt::load-lisp "${./config.lisp}")
;; Define custom theme
(define-configuration browser
((theme (make-instance 'theme:theme
:dark-p t
:font-family "${fonts.sansSerif.name}"
:monospace-font-family "${fonts.monospace.name}"
:background-color "${base00}"
:on-background-color "${base05}"
:primary-color "${scheme.withHashtag.${accentColour}}"
:on-primary-color "${base01}"
:secondary-color "${base03}"
:on-secondary-color "${base05}"
:accent-color "${cyan}"
:on-accent-color "${base01}"
:action-color "${cyan}"
:on-action-color "${base01}"
:success-color "${green}"
:on-success-color "${base01}"
:highlight-color "${magenta}"
:on-highlight-color "${base01}"
:warning-color "${yellow}"
:on-warning-color "${base01}"
:codeblock-color "${base02}"
:on-codeblock-color "${base05}"))))
'';
};
dataFile."nyxt/bookmarks.lisp".source = ./bookmarks.lisp;
};
}

12
home/obs/default.nix Normal file
View file

@ -0,0 +1,12 @@
{pkgs, ...}: {
home.packages = with pkgs; [helvum];
programs.obs-studio = {
enable = true;
plugins = with pkgs.obs-studio-plugins; [
wlrobs
obs-vkcapture
obs-pipewire-audio-capture
input-overlay
];
};
}

View file

@ -0,0 +1,41 @@
{
config,
lib,
pkgs,
...
}: {
xdg.configFile."pass-git-helper/git-pass-mapping.ini".source =
./git-pass-mapping.ini;
programs = {
gpg.enable = true;
password-store = {
enable = true;
package =
pkgs.pass-nodmenu.withExtensions
(exts: with exts; [pass-otp pass-update pass-import]); # pass-audit
settings = {
PASSWORD_STORE_DIR = "${config.home.homeDirectory}/.password-store";
PASSWORD_STORE_ENABLE_EXTENSIONS = "true";
};
};
git.extraConfig.credential = {
helper = "${pkgs.pass-git-helper}/bin/pass-git-helper";
};
};
services = {
gpg-agent = rec {
enable = true;
maxCacheTtl = 86400;
defaultCacheTtl = maxCacheTtl;
defaultCacheTtlSsh = maxCacheTtl;
pinentryFlavor = lib.mkDefault "curses";
extraConfig = ''
no-allow-external-cache
'';
};
git-sync.repositories.password-store = {
path = "${config.home.homeDirectory}/.password-store";
uri = "git+https://git.xenia.me.uk/xenia/pass.git";
};
};
}

View file

@ -0,0 +1,6 @@
[DEFAULT]
username_extractor=regex_search
regex_username=^login: (.*)$
[*]
target=git/${host}

View file

@ -0,0 +1,38 @@
{
stdenvNoCC,
fetchFromGitHub,
gtk3,
libsForQt5,
gnome,
hicolor-icon-theme,
}:
stdenvNoCC.mkDerivation rec {
pname = "candy-icon-theme";
version = "6a35be5cb133c6be8314807f55da3d795e24fb86";
dontBuild = true;
src = fetchFromGitHub {
owner = "EliverLara";
repo = "candy-icons";
rev = version;
sha256 = "sha256-M58ts/xyVf+ZDidd4MEp/LlU3vk2imEwOnb0/sVJUYo=";
};
nativeBuildInputs = [gtk3];
buildInputs = [libsForQt5.breeze-icons gnome.adwaita-icon-theme hicolor-icon-theme];
dontDropIconThemeCache = true;
installPhase = ''
runHook preInstall
mkdir -p $out/share/icons/Sweet-folders
mv * $out/share/icons/Sweet-folders
for theme in $out/share/icons/*; do
gtk-update-icon-cache --force $theme
done
runHook postInstall
'';
}

View file

@ -0,0 +1,46 @@
{
stdenvNoCC,
fetchFromGitHub,
gtk3,
candy-icon-theme,
gnome-icon-theme,
ubuntu-themes,
cinnamon,
elementary-xfce-icon-theme,
}:
stdenvNoCC.mkDerivation rec {
pname = "sweet-folder-theme";
version = "b2192ff1412472f036fdf9778c6b9dbcb6c044ec";
dontBuild = true;
src = fetchFromGitHub {
owner = "EliverLara";
repo = "Sweet-folders";
rev = version;
sha256 = "sha256-QexfqXH5a1IEhKBRjWSMdrEvThvLRzd4M32Xti1DCGE=";
};
nativeBuildInputs = [gtk3];
buildInputs = [
candy-icon-theme
gnome-icon-theme
ubuntu-themes
cinnamon.mint-x-icons
elementary-xfce-icon-theme
];
dontDropIconThemeCache = true;
installPhase = ''
runHook preInstall
mkdir -p $out/share/icons
mv Sweet-Rainbow $out/share/icons
for theme in $out/share/icons/*; do
gtk-update-icon-cache --force $theme
done
runHook postInstall
'';
}

25
home/prog/default.nix Normal file
View file

@ -0,0 +1,25 @@
{pkgs, ...}: {
xdg.configFile = {
"ruff/pyproject.toml".source = ./ruff.toml;
"pypoetry/config.toml".source = ./pypoetry.toml;
};
home.packages = with pkgs; [
# Nix
nil
alejandra
# Shell
shfmt
shellcheck
nodePackages.prettier
# Python
(python3.withPackages
(ps: with ps; [python-lsp-server flake8 mypy]))
black
isort
# FORTRAN
fortls
];
}

View file

@ -0,0 +1,17 @@
{
"Application": { "log_datefmt": "%Y-%m-%d %H:%M:%S" },
"InteractiveShell": {
"colors": "Linux",
"color_info": true
},
"InteractiveShellApp": {
"exec_PYTHONSTARTUP": false,
"exec_lines": ["%load_ext autoreload", "%autoreload 2 --print"]
},
"TerminalIPythonApp": { "display_banner": false },
"TerminalInteractiveShell": {
"editing_mode": "emacs",
"mouse_support": false,
"true_color": true
}
}

View file

@ -0,0 +1,3 @@
c.SlidesExporter.exclude_input = True
c.SlidesExporter.reveal_scroll = True
c.PDFExporter.latex_command = ["pdflatex", "{filename}"]

View file

@ -0,0 +1,17 @@
import os
from pathlib import Path
root_dir = Path(os.getenv("HOME", Path("~/").expanduser().resolve()))
c.ServerApp.port = 8888
c.ServerApp.root_dir = str(root_dir)
c.FileCheckpoints.checkpoint_dir = str(root_dir / ".ipynb_checkpoints")
c.ServerApp.use_redirect_file = False
c.ServerApp.open_browser = False
# Set password for remote access login
c.PasswordIdentityProvider.hashed_password = (
"sha1:005773a53a70:a5c53a779fa0e1498ada0f8fdb48ad1fef1257ff"
)
c.PasswordIdentityProvider.password_required = True
c.PasswordIdentityProvider.allow_password_change = False

View file

@ -0,0 +1,41 @@
{
agg,
freetype,
buildLuarocksPackage,
fetchgit,
fetchurl,
lua,
luaOlder,
}:
buildLuarocksPackage {
pname = "graph-toolkit";
version = "scm-1";
knownRockspec =
(fetchurl {
url = "mirror://luarocks/graph-toolkit-scm-1.rockspec";
sha256 = "0hsrf7k45w8ri18mdrx44mv1kr4zfr5mg76cxi8nnr30ssrblvgb";
})
.outPath;
src = fetchgit (removeAttrs (builtins.fromJSON '' {
"url": "https://github.com/franko/graph-toolkit",
"rev": "126a11bdbb98faf785c373516a288b7fa609f824",
"date": "2015-01-02T08:44:01-08:00",
"path": "/nix/store/gbwbjrl4j42kaqk3pjzvmckmr6dimkd0-graph-toolkit",
"sha256": "1pqjpqfandi7brk2213vlq891bl8drb0q32m5wmf0l21li0l4zrp",
"hash": "sha256-N39CQaRBUOAqL1UMDFZuiK6QEKZ7BCFmXic2qxy+Et8=",
"fetchLFS": false,
"fetchSubmodules": true,
"deepClone": false,
"leaveDotGit": false
}
'') ["date" "path" "sha256"]);
disabled = luaOlder "5.1";
propagatedBuildInputs = [lua agg freetype];
meta = {
homepage = "http://franko.github.io/graph-toolkit/";
description = "Lua Graphics Toolkit";
license.fullName = "GPL-3";
};
}

View file

@ -0,0 +1,33 @@
{
buildLuarocksPackage,
fetchurl,
lua,
luaAtLeast,
luaOlder,
luaPackages,
}: let
xsys = luaPackages.callPackage ./xsys.nix {};
in
buildLuarocksPackage {
pname = "sci";
version = "1.0.0.beta12-1";
knownRockspec =
(fetchurl {
url = "mirror://luarocks/sci-1.0.0.beta12-1.rockspec";
sha256 = "0lprn9x4zw767hdz8lyxmwrrfyn5xj3x50pm9b4qiwy8992mg00r";
})
.outPath;
src = fetchurl {
url = "https://github.com/stepelu/lua-sci/archive/v1.0.0-beta12.tar.gz";
sha256 = "0a45r7n13gfqckpdp1bmizqvjadn8nc5d6ff9gjw860g3i75sy2h";
};
disabled = (luaOlder "5.1") || (luaAtLeast "5.4");
propagatedBuildInputs = [lua xsys];
meta = {
homepage = "https://github.com/stepelu/lua-sci";
description = "Scientific Computing with LuaJIT";
license.fullName = "MIT";
};
}

View file

@ -1,9 +1,9 @@
{ {
buildLuarocksPackage, buildLuarocksPackage,
fetchurl, fetchurl,
lua,
luaAtLeast, luaAtLeast,
luaOlder, luaOlder,
luajit,
}: }:
buildLuarocksPackage { buildLuarocksPackage {
pname = "xsys"; pname = "xsys";
@ -12,14 +12,15 @@ buildLuarocksPackage {
(fetchurl { (fetchurl {
url = "mirror://luarocks/xsys-1.0.2-1.rockspec"; url = "mirror://luarocks/xsys-1.0.2-1.rockspec";
sha256 = "0jlyrwbzh6fi68msdynp4bbihyww4i3yk0qh859xlwqhfy5cza7p"; sha256 = "0jlyrwbzh6fi68msdynp4bbihyww4i3yk0qh859xlwqhfy5cza7p";
}).outPath; })
.outPath;
src = fetchurl { src = fetchurl {
url = "https://github.com/stepelu/lua-xsys/archive/v1.0.2.tar.gz"; url = "https://github.com/stepelu/lua-xsys/archive/v1.0.2.tar.gz";
sha256 = "1zwrlp6bghq8c12kyqc1ic7mrn8lf3d42755h8q2wxwhy1i3xqyh"; sha256 = "1zwrlp6bghq8c12kyqc1ic7mrn8lf3d42755h8q2wxwhy1i3xqyh";
}; };
disabled = (luaOlder "5.1") || (luaAtLeast "5.4"); disabled = (luaOlder "5.1") || (luaAtLeast "5.4");
propagatedBuildInputs = [ luajit ]; propagatedBuildInputs = [lua];
meta = { meta = {
homepage = "http://scilua.org/xsys.html"; homepage = "http://scilua.org/xsys.html";

9
home/prog/pypoetry.toml Normal file
View file

@ -0,0 +1,9 @@
[virtualenvs]
create = true
in-project = true
[virtualenvs.options]
always-copy = true
no-pip = true
no-setuptools = true
system-site-packages = true

View file

@ -5,7 +5,6 @@ select = [
"B", # Flake8 bugbear rules "B", # Flake8 bugbear rules
"PD", # Pandas vet rules "PD", # Pandas vet rules
"NPY", # NumPy specific rules "NPY", # NumPy specific rules
"NPY201", # NumPy 2.0 deprecation warnings
"RUF", # Ruff specific rules "RUF", # Ruff specific rules
"PERF1", "PERF2", # Performance lints from Perflint "PERF1", "PERF2", # Performance lints from Perflint
"E101", # Mixed spaces and tabs "E101", # Mixed spaces and tabs
@ -34,5 +33,5 @@ ignore = [
] ]
unfixable = ["W", "B", "PD", "NPY", "RUF", "E101", "E501", "C901", "I001", "I002"] unfixable = ["W", "B", "PD", "NPY", "RUF", "E101", "E501", "C901", "I001", "I002"]
[format] # [format]
docstring-code-format = false # docstring-code-format = true

51
home/river/default.nix Normal file
View file

@ -0,0 +1,51 @@
{config, ...}: {
imports = [../desktop.nix];
wayland.windowManager.river = {
enable = true;
xwayland.enable = true;
extraSessionVariables = {
QT_AUTO_SCREEN_SCALE_FACTOR = "1";
QT_QPA_PLATFORM = "wayland";
QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
MOZ_ENABLE_WAYLAND = "1";
};
systemd = {
enable = true;
variables = [
"DISPLAY"
"WAYLAND_DISPLAY"
"XDG_CURRENT_DESKTOP"
"NIXOS_OZONE_WL"
"XCURSOR_THEME"
"XCURSOR_SIZE"
];
};
settings = {
# These are currently example settings
border-width = 2;
declare-mode = [
"locked"
"normal"
"passthrough"
];
input = {
pointer-foo-bar = {
accel-profile = "flat";
events = true;
pointer-accel = -0.3;
tap = false;
};
};
map = {
normal = {
"Alt Q" = "close";
};
};
rule-add = {};
set-cursor-warp = "on-output-change";
set-repeat = "50 300";
spawn = [];
xcursor-theme = with config.gtk.cursorTheme; "${name} ${toString size}";
};
};
}

141
home/rofi/default.nix Normal file
View file

@ -0,0 +1,141 @@
{
config,
pkgs,
fonts,
scheme,
accentColour ? "base07",
...
}: {
programs.rofi = {
enable = true;
package = pkgs.rofi-wayland;
font = fonts.monospace.name;
location = "center";
plugins = with pkgs; [rofi-emoji];
pass = {
enable = true;
extraConfig = ''
USERNAME_field='login'
'';
};
extraConfig = {
modi = "run,drun,ssh,window,emoji,combi";
combi-modi = "drun,ssh,window,emoji";
sidebar-mode = true;
sort = true;
sorting-method = "fzf";
matching = "fuzzy";
icon-theme = config.gtk.iconTheme.name;
show-icons = true;
application-fallback-icon = "application-x-addon";
drun-display-format = "{icon} {name} ({categories})";
disable-history = false;
hide-scrollbar = true;
display-run = " 󰅴 Run ";
display-drun = " 󱓞 Apps ";
display-ssh = " 󰢹 SSH ";
display-window = " 󰧨 Move ";
display-emoji = " 󰞅 Emoji ";
display-combi = " 󰛡 Combi ";
};
theme = with builtins;
with scheme; let
inherit (config.lib.formats.rasi) mkLiteral;
bg = mkLiteral "rgba (${base00-rgb-r}, ${base00-rgb-g}, ${base00-rgb-b}, 80%)";
bg2 = mkLiteral "rgba (${base01-rgb-r}, ${base01-rgb-g}, ${base01-rgb-b}, 100%)";
fg = mkLiteral withHashtag.base05;
fg2 = mkLiteral withHashtag.base04;
border = mkLiteral withHashtag.${accentColour};
blue = mkLiteral withHashtag.blue;
in {
"*" = {
background-color = mkLiteral "transparent";
text-color = fg;
font = with fonts; "${monospace.name} ${toString sizes.popups}";
};
window = {
height = mkLiteral "75%";
width = mkLiteral "75%";
border = mkLiteral "1px";
border-color = border;
border-radius = mkLiteral "10px";
background-color = bg;
};
inputbar = {
children = map mkLiteral ["prompt" "entry"];
padding = mkLiteral "2px";
};
prompt = {
background-color = bg2;
padding = mkLiteral "6px";
text-color = blue;
border-radius = mkLiteral "10px";
margin = mkLiteral "20px 0px 0px 20px";
};
textbox-prompt-colon = {
expand = false;
str = "=";
};
entry = {
padding = mkLiteral "6px";
margin = mkLiteral "20px 0px 0px 10px";
};
listview = {
border = mkLiteral "0px 0px 0px";
padding = mkLiteral "6px 0px 0px";
margin = mkLiteral "10px 0px 0px 20px";
columns = 2;
lines = 5;
};
element = {
padding = mkLiteral "5px";
};
"element-icon" = {
size = mkLiteral "25px";
};
"element selected" = {
background-color = bg2;
text-color = blue;
border-radius = mkLiteral "10px";
};
mode-switcher = {
spacing = 0;
};
button = {
padding = mkLiteral "10px";
text-color = fg2;
border-radius = mkLiteral "10px";
vertical-align = mkLiteral "0.5";
horizontal-align = mkLiteral "0.5";
};
"button selected" = {
background-color = bg2;
text-color = blue;
};
message = {
margin = mkLiteral "2px";
padding = mkLiteral "2px";
border-radius = mkLiteral "5px";
};
textbox = {
padding = mkLiteral "6px";
margin = mkLiteral "20px 0px 0px 20px";
text-color = blue;
};
};
};
}

10
home/scripts/default.nix Normal file
View file

@ -0,0 +1,10 @@
{pkgs, ...}: {
home.packages = [
(pkgs.writeShellScriptBin "git-sync-all"
(builtins.readFile ./git-sync-all.sh))
(pkgs.writeShellScriptBin "rsync-local-config"
(builtins.readFile ./rsync-local-config.sh))
(pkgs.writeShellScriptBin "xdg-query-program"
(builtins.readFile ./xdg-query-program.sh))
];
}

55
home/scripts/git-sync-all.sh Executable file
View file

@ -0,0 +1,55 @@
# Sync common directories, setting url to ensure it's up-to-date first
SYNC_DIRS=(
"$HOME/.password-store/"
"$HOME/.elfeed/"
"$HOME/Documents/Org/"
"$HOME/Documents/References/"
)
SYNC_URLS=(
"https://git.xenia.me.uk/pixelifytica/pass.git"
"https://git.xenia.me.uk/pixelifytica/elfeed.git"
"https://git.xenia.me.uk/pixelifytica/org.git"
"https://git.xenia.me.uk/pixelifytica/references.git"
)
for i in "${!SYNC_DIRS[@]}"; do
DIRECTORY="${SYNC_DIRS[$i]}"
URL="${SYNC_URLS[$i]}"
echo "--- sync: $DIRECTORY ---"
if [ ! -d "$DIRECTORY" ]; then
git clone "$URL" "$DIRECTORY"
fi
(
cd "$DIRECTORY" || exit
git remote set-url origin "$URL"
git-sync -ns
)
done
# Pull NixOS and Emacs config if simple fast-forward
PULL_DIRS=(
"/etc/nixos"
"${XDG_CONFIG_HOME:-$HOME/.config}/emacs"
)
PULL_URLS=(
"https://git.xenia.me.uk/pixelifytica/nixos.git"
"https://git.xenia.me.uk/pixelifytica/emacs.git"
)
for i in "${!PULL_DIRS[@]}"; do
DIRECTORY="${PULL_DIRS[$i]}"
URL="${PULL_URLS[$i]}"
echo "--- pull: $DIRECTORY ---"
if [ ! -d "$DIRECTORY" ]; then
git clone "$URL" "$DIRECTORY"
fi
(
cd "$DIRECTORY" || exit
if [ "$(git branch --show-current)" = "main" ]; then
git remote set-url origin "$URL"
git pull --ff-only
git push
else
echo "Not syncing repo $DIRECTORY on branch $(git branch --show-current)"
fi
)
done

View file

@ -0,0 +1,25 @@
HOST=$1
# Config files
for TARGET in bat bottom git starship.toml; do
SOURCE="$HOME/.config/$TARGET"
echo "--- $SOURCE ---"
TMP_TARGET=/tmp/rsync-local-config
TMP_SOURCE=$TMP_TARGET
NIX_SED="sed -i 's|/nix/.*/bin/||g'"
NIX_REPLACE="$NIX_SED $TMP_TARGET"
if [[ -e $SOURCE ]]; then
if [[ -d $SOURCE ]]; then
SOURCE=$SOURCE/
TMP_SOURCE=$TMP_SOURCE/
NIX_REPLACE="fd -g '**' $TMP_TARGET -tfile -x $NIX_SED {};"
fi
rsync -avzL --exclude=".git*" --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r "$SOURCE" $TMP_TARGET
sh -c "$NIX_REPLACE"
rsync -avzL --delete --exclude=".git*" $TMP_SOURCE "$HOST:.config/$TARGET"
rm -rf $TMP_SOURCE
fi
done
# Fonts
rsync -avzL --delete --exclude=".git*" --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r "$(nix path-info flake:iosevka#packages.x86_64-linux.iosevka-custom-nerdfont)/share/fonts/truetype/" "$HOST:.fonts/IosevkaCustomNerdFont"
rsync -avzL --delete --exclude=".git*" --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r "$(nix path-info flake:iosevka#packages.x86_64-linux.iosevka-custom-aile)/share/fonts/truetype/" "$HOST:.fonts/IosevkaCustomAile"

38
home/scripts/sync-all.lua Executable file
View file

@ -0,0 +1,38 @@
#!/usr/bin/env nix-shell
--[[
#!nix-shell -i lua -p git git-sync
]]
local config_home
if os.getenv("XDG_CONFIG_HOME") then
config_home = os.getenv("XDG_CONFIG_HOME")
else
config_home = "~/.config/"
end
local sync_mapping = {
["~/.password-store"] = "https://git.xenia.me.uk/pixelifytica/pass.git",
["~/.elfeed"] = "https://git.xenia.me.uk/pixelifytica/elfeed.git",
["~/Documents/Org"] = "https://git.xenia.me.uk/pixelifytica/org.git",
["~/Documents/References"] = "https://git.xenia.me.uk/pixelifytica/references.git",
}
local pull_mapping = {
["/etc/nixos"] = "https://git.xenia.me.uk/pixelifytica/nixos.git",
[config_home .. "/emacs"] = "https://git.xenia.me.uk/pixelifytica/emacs.git",
}
local function git_sync(directory, url)
print("--- sync: " .. directory .. " ---")
end
local function git_pull(directory, url, ff_only)
print("--- pull: " .. directory .. " ---")
end
for directory, url in pairs(sync_mapping) do
git_sync(directory, url)
end
for directory, url in pairs(pull_mapping) do
git_pull(directory, url, true)
end

68
home/scripts/sync-all.py Executable file
View file

@ -0,0 +1,68 @@
#!/usr/bin/env nix-shell
#!nix-shell -i python3 -p git git-sync
import os
import queue
import subprocess
from pathlib import Path
from typing import Dict
HOME = Path("~").expanduser().resolve()
SYNC_MAPPING: Dict[Path, str] = {
Path(
"~/.password-store"
).expanduser(): "https://git.xenia.me.uk/pixelifytica/pass.git",
Path("~/.elfeed").expanduser(): "https://git.xenia.me.uk/pixelifytica/elfeed.git",
Path(
"~/Documents/Org"
).expanduser(): "https://git.xenia.me.uk/pixelifytica/org.git",
Path(
"~/Documents/References"
).expanduser(): "https://git.xenia.me.uk/pixelifytica/references.git",
}
PULL_MAPPINGS: Dict[Path, str] = {
Path("/etc/nixos"): "https://git.xenia.me.uk/pixelifytica/nixos.git",
Path(os.getenv("XDG_CONFIG_HOME", "~/.config")).expanduser()
/ "emacs": "https://git.xenia.me.uk/pixelifytica/emacs.git",
}
def git_set_url(directory: Path, url: str) -> None:
"""Set url for directory"""
comp = subprocess.run(f"git remote set-url origin {url}".split(), cwd=directory)
if comp.returncode != 0:
raise UserWarning(f"{comp.returncode} from {' '.join(comp.args)}")
subprocess.run("git remote -v".split(), cwd=directory)
def git_sync(directory: Path, url: str) -> subprocess.CompletedProcess:
"""Sync status of repository"""
print(f"--- sync: ${directory} ---")
if not directory.exists():
return subprocess.run("exit 1".split()) # TODO
git_set_url(directory, url)
return subprocess.run("git-sync -ns".split(), cwd=directory)
def git_pull(
directory: Path, url: str, ff_only: bool = True
) -> subprocess.CompletedProcess:
"""Pull updates for directory from url"""
print(f"--- pull: {directory} ---")
if not directory.exists():
return subprocess.run("exit 1".split()) # TODO
git_set_url(directory, url)
return subprocess.run("git pull --ff-only".split(), cwd=directory)
def main(*args, **kwargs) -> None:
for directory, url in SYNC_MAPPING.items():
print(git_sync(directory, url))
for directory, url in PULL_MAPPINGS.items():
print(git_pull(directory, url))
if __name__ == "__main__":
main()

View file

@ -0,0 +1,3 @@
FILETYPE=$(xdg-mime query filetype $@)
DEFAULT=$(xdg-mime query default $FILETYPE)
echo "$FILETYPE -> $DEFAULT"

View file

@ -1,20 +1,14 @@
{ pkgs, ... }: {...}: {
{
home.packages = with pkgs; [
rclone
sshfs
(writeShellScriptBin "ssh-keygen-defaults" ''ssh-keygen -t ed25519 -C "$(whoami)@$(hostname)"'')
];
programs.ssh = { programs.ssh = {
enable = true; enable = true;
addKeysToAgent = "yes";
forwardAgent = true; forwardAgent = true;
compression = true; compression = true;
serverAliveInterval = 15; serverAliveInterval = 15;
serverAliveCountMax = 5; serverAliveCountMax = 3;
controlMaster = "auto"; controlMaster = "auto";
controlPersist = "10s"; controlPersist = "10s";
extraConfig = '' extraConfig = ''
AddKeysToAgent=yes
SetEnv TERM=xterm-256color SetEnv TERM=xterm-256color
''; '';
matchBlocks = { matchBlocks = {
@ -33,13 +27,13 @@
}; };
"freia" = { "freia" = {
user = "elitherl"; user = "elitherl";
hostname = "freia027.hpc.l"; hostname = "freia020.hpc.l";
compression = true; forwardX11Trusted = true;
}; };
"heimdall" = { "heimdall" = {
user = "elitherl"; user = "elitherl";
hostname = "heimdall003.jet.uk"; hostname = "heimdall003.jet.uk";
compression = true; forwardX11Trusted = true;
}; };
}; };
}; };

75
home/starship/default.nix Normal file
View file

@ -0,0 +1,75 @@
{...}: {
programs.starship = {
enable = true;
enableTransience = true;
settings = {
add_newline = false;
character = {
success_symbol = "[󰁔 ](bold green)";
error_symbol = "[󰁔 ](bold red)";
};
command_timeout = 2000;
container = {symbol = " ";};
directory = {
truncation_length = 2;
fish_style_pwd_dir_length = 1;
truncate_to_repo = false;
};
direnv = {disabled = false;};
git_branch = {
symbol = " ";
only_attached = true;
ignore_branches = ["master" "main"];
};
git_commit = {
format = "[ $hash | $tag]($style) ";
tag_symbol = " ";
tag_disabled = false;
};
git_metrics = {disabled = false;};
git_status = {
stashed = " ";
ahead = " ";
behind = " ";
up_to_date = "";
diverged = " ";
conflicted = " ";
deleted = " ";
renamed = " ";
modified = " ";
staged = " ";
untracked = " ";
typechanged = " ";
};
hostname = {
ssh_only = true;
ssh_symbol = "󰢹 ";
};
jobs = {symbol = "󰈏 ";};
line_break = {disabled = false;};
localip = {disabled = false;};
memory_usage = {disabled = false;};
os = {
disabled = false;
format = "on [$symbol]($style) ";
};
python = {python_binary = "python3";};
shell = {
disabled = false;
format = "using [$indicator ]($style)";
};
status = {
disabled = false;
map_symbol = true;
pipestatus = true;
symbol = " ";
success_symbol = "";
not_executable_symbol = " ";
not_found_symbol = " ";
sigint_symbol = " ";
signal_symbol = " ";
};
sudo = {disabled = false;};
};
};
}

181
home/sway/default.nix Normal file
View file

@ -0,0 +1,181 @@
{
config,
lib,
pkgs,
fonts,
scheme,
accentColour ? "base07",
...
}: {
imports = [../desktop.nix];
home.packages = with pkgs; [
(writeShellScriptBin "protonmail-setup-bridge" ''
pkill -9 -f protonmail-bridge
${protonmail-bridge}/bin/protonmail-bridge -c
swaymsg exec "${protonmail-bridge}/bin/protonmail-bridge -n"
'')
(writeShellScriptBin "davmail-setup" ''
systemctl --user restart davmail # Ensure config file is present
systemctl --user stop davmail
${davmail}/bin/davmail -n ~/.davmail.properties
systemctl --user restart davmail
'')
];
wayland.windowManager.sway = {
enable = true;
package = null;
swaynag.enable = true;
systemd.enable = true;
xwayland = true;
config = {
input = {
"*" = {
xkb_layout = "gb";
xkb_options = "ctrl:nocaps";
};
"type:touchpad" = {
tap = "enabled";
natural_scroll = "enabled";
};
};
seat = {
"seat0" = {
xcursor_theme = with config.gtk.cursorTheme; "${name} ${toString size}";
};
};
modifier = "Mod4";
terminal = "${config.programs.alacritty.package}/bin/alacritty";
menu = "${config.programs.rofi.finalPackage}/bin/rofi -show drun";
workspaceAutoBackAndForth = true;
bars = [];
gaps = {
inner = 5;
outer = 0;
};
fonts = {
names = [fonts.monospace.name];
style = "regular";
size = fonts.sizes.desktop * 1.0;
};
colors = with scheme.withHashtag; let
text = toString base05;
indicator = toString cyan;
in rec {
background = toString base00;
focused = rec {
inherit background text indicator;
border = toString scheme.withHashtag.${accentColour};
childBorder = border;
};
focusedInactive = rec {
inherit background text indicator;
border = toString base04;
childBorder = border;
};
unfocused = rec {
inherit background text indicator;
border = toString base03;
childBorder = border;
};
urgent = rec {
inherit background text indicator;
border = toString red;
childBorder = border;
};
};
startup = [
{command = "${pkgs.swaynotificationcenter}/bin/swaync";}
{command = "${pkgs.swaybg}/bin/swaybg -m fill -i ${../../wallpapers/waves/cat-waves.png}";}
{command = "${pkgs.libsForQt5.polkit-kde-agent}/libexec/polkit-kde-authentication-agent-1";}
{command = "${pkgs.protonmail-bridge}/bin/protonmail-bridge -n";}
];
window = {
border = 1;
commands = [
{
criteria = {app_id = "org.kde.polkit-kde-authentication-agent-1";};
command = "floating enable";
}
{
criteria = {app_id = "Pinentry";};
command = "floating enable";
}
{
criteria = {app_id = "pavucontrol";};
command = "floating enable";
}
{
criteria = {app_id = ".blueman-manager-wrapped";};
command = "floating enable";
}
{
criteria = {app_id = "nm-connection-editor";};
command = "floating enable";
}
{
criteria = {class = "steam";};
command = "layout tabbed";
}
];
};
floating.border = 1;
keybindings = with config; let
modifier = wayland.windowManager.sway.config.modifier;
in
lib.mkOptionDefault {
# Movement
"${modifier}+comma" = "workspace prev";
"${modifier}+period" = "workspace next";
"${modifier}+shift+comma" = "move workspace prev";
"${modifier}+shift+period" = "move workspace next";
"${modifier}+bracketleft" = "move workspace to output left";
"${modifier}+bracketright" = "move workspace to output right";
# Function keys
## Sound
"XF86AudioMute" = "exec ${services.avizo.package}/bin/volumectl %";
"XF86AudioMicMute" = "exec ${services.avizo.package}/bin/volumectl -m %";
"XF86AudioRaiseVolume" = "exec ${services.avizo.package}/bin/volumectl -u + 5";
"XF86AudioLowerVolume" = "exec ${services.avizo.package}/bin/volumectl -u - 5";
## Playback
"XF86AudioPlay" = "exec ${pkgs.playerctl}/bin/playerctl play-pause";
"XF86AudioStop" = "exec ${pkgs.playerctl}/bin/playerctl play-pause";
"XF86AudioPrev" = "exec ${pkgs.playerctl}/bin/playerctl previous";
"XF86AudioNext" = "exec ${pkgs.playerctl}/bin/playerctl next";
## Brightness
"XF86MonBrightnessUp" = "exec ${services.avizo.package}/bin/lightctl + 5";
"XF86MonBrightnessDown" = "exec ${services.avizo.package}/bin/lightctl - 5";
# System utilities
"${modifier}+F1" = "exec ${programs.swaylock.package}/bin/swaylock --screenshots --clock --indicator --grace-no-mouse";
"${modifier}+p" = "exec ${programs.wlogout.package}/bin/wlogout";
"${modifier}+z" = "exec ${pkgs.swaynotificationcenter}/bin/swaync-client -t -sw";
"${modifier}+Shift+z" = "exec ${pkgs.swaynotificationcenter}/bin/swaync-client -d -sw";
"${modifier}+Shift+Return" = "exec ${programs.emacs.finalPackage}/bin/emacsclient -c";
};
};
extraConfig = ''
bindgesture swipe:right workspace prev
bindgesture swipe:left workspace next
corner_radius 10
blur enable
blur_xray disable
blur_passes 3
blur_radius 5
corner_radius 10
shadows enable
shadow_blur_radius 4
layer_effects "system-menu" blur enable; blur_ignore_transparent enable; shadows disable
layer_effects "gtk-layer-shell" blur enable; blur_ignore_transparent enable; shadows disable
layer_effects "waybar" blur enable; blur_ignore_transparent enable; shadows disable
layer_effects "rofi" blur enable; blur_ignore_transparent enable; shadows disable
layer_effects "avizo" blur enable; blur_ignore_transparent enable; shadows disable
layer_effects "swaync-notification-window" blur enable; blur_ignore_transparent enable; shadows disable
layer_effects "swaync-control-center" blur enable; blur_ignore_transparent enable; shadows disable
titlebar_separator enable
scratchpad_minimize enable
'';
};
}

18
home/swaylock/default.nix Normal file
View file

@ -0,0 +1,18 @@
{pkgs, ...}: {
programs.swaylock = {
enable = true;
package = pkgs.swaylock-effects;
# Settings are specifically for swaylock-effects
settings = {
indicator-radius = 100;
indicator-thickness = 10;
indicator-caps-lock = true;
ignore-empty-password = true;
show-failed-attempts = true;
effect-blur = "5x3";
effect-vignette = "0.5:0.5";
grace = 2;
fade-in = 0.2;
};
};
}

355
home/swaync/default.nix Normal file
View file

@ -0,0 +1,355 @@
{
pkgs,
fonts,
scheme,
accentColour ? "base07",
...
}: {
home.packages = [pkgs.swaynotificationcenter];
xdg.configFile."swaync/style.css".text = with scheme; ''
* {
all: unset;
font-size: 1.2rem;
font-family: "${fonts.monospace.name}";
transition: 200ms;
}
.floating-notifications.background .notification-row .notification-background {
border-radius: 10px;
border: 1px solid ${withHashtag.${accentColour}};
margin: 18px;
background-color: rgba(${base00-rgb-r}, ${base00-rgb-g}, ${base00-rgb-b}, 0.8);
color: ${withHashtag.base05};
padding: 0;
}
.floating-notifications.background
.notification-row
.notification-background
.notification {
padding: 7px;
border-radius: 10px;
}
.floating-notifications.background
.notification-row
.notification-background
.notification
.notification-content {
margin: 7px;
}
.floating-notifications.background
.notification-row
.notification-background
.notification
.notification-content
.summary {
color: ${withHashtag.base05};
}
.floating-notifications.background
.notification-row
.notification-background
.notification
.notification-content
.time {
color: ${withHashtag.base04};
}
.floating-notifications.background
.notification-row
.notification-background
.notification
.notification-content
.body {
color: ${withHashtag.base05};
}
.floating-notifications.background
.notification-row
.notification-background
.notification
> *:last-child
> * {
min-height: 3.4em;
}
.floating-notifications.background
.notification-row
.notification-background
.notification
> *:last-child
> *
.notification-action {
border-radius: 10px;
background-color: ${withHashtag.base01};
color: ${withHashtag.base05};
margin: 7px;
}
.floating-notifications.background
.notification-row
.notification-background
.notification
> *:last-child
> *
.notification-action:hover {
background-color: ${withHashtag.base01};
color: ${withHashtag.base05};
}
.floating-notifications.background
.notification-row
.notification-background
.notification
> *:last-child
> *
.notification-action:active {
background-color: ${withHashtag.blue};
color: ${withHashtag.base00};
}
.floating-notifications.background
.notification-row
.notification-background
.close-button {
margin: 7px;
padding: 2px;
border-radius: 10px;
background-color: ${withHashtag.red};
color: ${withHashtag.base00};
}
.floating-notifications.background
.notification-row
.notification-background
.close-button:hover {
background-color: ${withHashtag.red};
color: ${withHashtag.base00};
}
.floating-notifications.background
.notification-row
.notification-background
.close-button:active {
background-color: ${withHashtag.red};
color: ${withHashtag.base00};
}
.control-center {
border-radius: 10px;
border: 1px solid ${withHashtag.${accentColour}};
margin: 18px;
background-color: rgba(${base00-rgb-r}, ${base00-rgb-g}, ${base00-rgb-b}, 0.8);
color: ${withHashtag.base05};
padding: 14px;
}
.control-center .widget-title {
color: ${withHashtag.base05};
font-size: 1.3em;
}
.control-center .widget-title button {
border-radius: 7px;
background-color: ${withHashtag.base01};
color: ${withHashtag.base05};
padding: 8px;
}
.control-center .widget-title button:hover {
background-color: ${withHashtag.base02};
color: ${withHashtag.base05};
}
.control-center .widget-title button:active {
background-color: ${withHashtag.base03};
color: ${withHashtag.base05};
}
.control-center .notification-row .notification-background {
border-radius: 10px;
background-color: ${withHashtag.base01};
color: ${withHashtag.base05};
margin-top: 14px;
}
.control-center .notification-row .notification-background .notification {
padding: 7px;
border-radius: 7px;
}
.control-center
.notification-row
.notification-background
.notification
.notification-content {
margin: 7px;
}
.control-center
.notification-row
.notification-background
.notification
.notification-content
.summary {
color: ${withHashtag.base05};
}
.control-center
.notification-row
.notification-background
.notification
.notification-content
.time {
color: ${withHashtag.base04};
}
.control-center
.notification-row
.notification-background
.notification
.notification-content
.body {
color: ${withHashtag.base05};
}
.control-center
.notification-row
.notification-background
.notification
> *:last-child
> * {
min-height: 3.4em;
}
.control-center
.notification-row
.notification-background
.notification
> *:last-child
> *
.notification-action {
border-radius: 7px;
background-color: ${withHashtag.base00};
color: ${withHashtag.base05};
margin: 7px;
}
.control-center
.notification-row
.notification-background
.notification
> *:last-child
> *
.notification-action:hover {
background-color: ${withHashtag.base01};;
color: ${withHashtag.base05};
}
.control-center
.notification-row
.notification-background
.notification
> *:last-child
> *
.notification-action:active {
background-color: ${withHashtag.blue};
color: ${withHashtag.base05};
}
.control-center .notification-row .notification-background .close-button {
margin: 7px;
padding: 2px;
border-radius: 6.3px;
background-color: ${withHashtag.red};
color: ${withHashtag.base00};
}
.control-center .notification-row .notification-background .close-button:hover {
background-color: ${withHashtag.red};
color: ${withHashtag.base00};
}
.control-center
.notification-row
.notification-background
.close-button:active {
background-color: ${withHashtag.red};
color: ${withHashtag.base00};
}
.control-center .notification-row .notification-background:hover {
background-color: ${withHashtag.base00};
color: ${withHashtag.base05};
}
.control-center .notification-row .notification-background:active {
background-color: ${withHashtag.blue};
color: ${withHashtag.base05};
}
progressbar,
progress,
trough {
border-radius: 12.6px;
}
.notification.critical progress {
background-color: ${withHashtag.red};
}
.notification.low progress,
.notification.normal progress {
background-color: ${withHashtag.blue};
}
trough {
background-color: ${withHashtag.base00};
}
.control-center trough {
background-color: ${withHashtag.base03};
}
.control-center-dnd {
margin-top: 5px;
border-radius: 8px;
background: ${withHashtag.base00};
border: 1px solid ${withHashtag.base03};
}
.control-center-dnd:checked {
background: ${withHashtag.base00};
}
.control-center-dnd slider {
background: ${withHashtag.base03};
border-radius: 8px;
}
.widget-dnd {
margin: 0px;
font-size: 1.1rem;
}
.widget-dnd > switch {
font-size: initial;
border-radius: 8px;
background: ${withHashtag.base00};
border: 1px solid ${withHashtag.base03};
}
.widget-dnd > switch:checked {
background: ${withHashtag.base00};
}
.widget-dnd > switch slider {
background: ${withHashtag.base01};
border-radius: 8px;
border: 1px solid ${withHashtag.${accentColour}};
}
'';
}

354
home/waybar/default.nix Normal file
View file

@ -0,0 +1,354 @@
{
config,
lib,
pkgs,
hostName,
fonts,
scheme,
accentColour ? "base07",
...
}: {
systemd.user.targets.tray.Unit = {
Description = "Home Manager System Tray";
Requires = ["graphical-session-pre.target"];
};
programs.waybar = {
enable = true;
systemd = {
enable = true;
target = "sway-session.target";
};
settings = rec {
main = {
name = "main";
layer = "top";
position = "top";
# Layout
"modules-left" = ["mpris"];
"modules-center" = ["sway/workspaces"];
"modules-right" = [
"custom/notification"
"pulseaudio"
"network"
"bluetooth"
"clock#calendar"
"clock"
"backlight"
"battery"
"custom/weather"
"tray"
];
# Module config
"sway/workspaces" = {
format = "{icon}";
format-icons = {
"1" = "󰫃 ";
"2" = "󰫄 ";
"3" = "󰫅 ";
"4" = "󰫆 ";
"5" = "󰫇 ";
"6" = "󰫈 ";
default = "󰋙 ";
urgent = "󰁡 ";
};
# show-special = false;
# sort-by-number = true;
all-outputs = false;
persistent-workspaces = {
"1" = [];
"2" = [];
"3" = [];
"4" = [];
"5" = [];
"6" = [];
};
};
"sway/window" = {
"format" = "{title}";
"max-length" = 50;
"rewrite" = {
"(.*) - GNU Emacs at (.*)" = " $1 [$2]";
"(Alacritty.*)" = " $1";
"(.*) - mpv" = "󰦟 $1";
"swayimg: (.*)" = "󰋩 $1";
"(btm)" = " Resource Usage [$1]";
"(cava)" = "󰝚 Music Visualiser [$1]";
"(.*) - Thunar" = "󰝰 $1";
"Mozilla Firefox" = "󰈹 $1";
"(.*) Mozilla Firefox" = "󰈹 $1";
"Nyxt - (.*)" = "󰀹 $1";
"(.*) - Chromium" = "󰊯 $1";
"((?:.*)WebCord.*)" = "󰙯 $1";
"(Signal.*)" = "󰭹 $1";
"([Ss]team)" = "󰓓 $1";
"(Prism Launcher.*)" = "󰍳 Minecraft ($1)";
"(X2Go Client)" = "󰢹 $1";
"(NoMachine|Nxplayer.bin) (.*)" = "󰢹 $1 $2";
};
};
mpris = {
"format" = "{status_icon} {player_icon} {artist} - {title}";
"tooltip-format" = "{player_icon} ({player}) {dynamic}";
"title-len" = 64;
"interval" = 1;
"dynamic-order" = [
"album"
"artist"
"title"
"position"
"length"
];
"player-icons" = {
"default" = "󰲸 ";
"emms" = " ";
"firefox" = "󰈹 ";
"mpv" = "󰦟 ";
};
"status-icons" = {
"playing" = "󰐊";
"paused" = "󰏤";
"stopped" = "󰓛";
};
"ignored-players" = [];
};
pulseaudio = {
scroll-step = 5;
format = "{format_source}{icon}{volume}%";
format-muted = "{format_source} 󰝟 ";
format-source = "󰍬 ";
format-source-muted = "󰍭 ";
format-icons = {
car = "󰄍 ";
default = ["󰕿 " "󰖀 " "󰕾 "];
hands-free = "󰥰 ";
headset = "󰋎 ";
phone = "󰏲 ";
portable = "󰏳 ";
headphone = "󰋋 ";
};
on-click = "${pkgs.pavucontrol}/bin/pavucontrol";
on-click-right = "${pkgs.pamixer}/bin/pamixer -t";
on-scroll-up = "${pkgs.pamixer}/bin/pamixer -i 5";
on-scroll-down = "${pkgs.pamixer}/bin/pamixer -d 5";
};
disk = {
format = "󰋊 {percentage_used}%";
path = config.home.homeDirectory;
};
cpu = {
format = "󰻠 {usage}%";
tooltip = false;
};
memory = {format = "󰍛 {}%";};
temperature = {
critical-threshold = 80;
format = "{icon} {temperatureC}°C";
format-icons = ["󱃃" "󰔏" "󱃂"];
};
network = {
format-icons = ["󰤟 " "󰤢 " "󰤥 " "󰤨 "];
format-wifi = "{icon}";
format-ethernet = "󰈁 ";
tooltip-format = "{essid} ({signalStrength}%)";
format-linked = "󰈂 ";
format-disconnected = "󰈂 ";
};
bluetooth = {
format = "󰂯";
format-disabled = "󰂲";
format-off = "󰂲";
format-on = "󰂯";
format-connected = "󰂱";
tooltip-format = "{status} | {device_alias}";
on-click = "${pkgs.bluez}/bin/bluetoothctl power on";
on-click-right = "${pkgs.bluez}/bin/bluetoothctl power off";
};
"clock#calendar" = {
# format = "{:󰃭 %Y-%m-%d}";
format = "{:%Y-%m-%d}"; # TEMP, see https://github.com/Alexays/Waybar/issues/3021
tooltip-format = "<tt><small>{calendar}</small></tt>";
calendar = {
mode = "month";
mode-mon-col = 3;
weeks-pos = "left";
on-scroll = 1;
on-click-right = "mode";
format = {
months = "<span color='#ffead3'><b>{}</b></span>";
days = "<span color='#ecc6d9'><b>{}</b></span>";
weeks = "<span color='#99ffdd'><b>W{}</b></span>";
weekdays = "<span color='#ffcc66'><b>{}</b></span>";
today = "<span color='#ff6699'><b><u>{}</u></b></span>";
};
};
actions = {
on-click-right = "mode";
on-scroll-up = "shift_up";
on-scroll-down = "shift_down";
};
};
clock = {
# format = "{:󰥔 %R}";
format = "{:%R}"; # TEMP, see https://github.com/Alexays/Waybar/issues/3021
};
backlight = {
format = "{icon}";
tooltip-format = "{percent}%";
format-icons = [" " " " " " " " " " " " " " " " " "];
};
battery = {
states = {
warning = 30;
critical = 20;
};
format = "{icon}";
format-charging = "󰂄 ";
format-plugged = "󰚥 ";
tooltip-format = "{capacity}% {time}";
format-icons = ["󱃍 " "󰁺 " "󰁻 " "󰁼 " "󰁽 " "󰁾 " "󰁿 " "󰂀 " "󰂁 " "󰂂 " "󰁹 "];
};
"custom/notification" = let
swaync = pkgs.swaynotificationcenter;
in {
"tooltip" = false;
"format" = "{icon}{}";
"format-icons" = {
"notification" = "󱅫 ";
"none" = "󰂚 ";
"dnd-notification" = "󰅸 ";
"dnd-none" = "󰂜 ";
"inhibited-notification" = "󰅸 ";
"inhibited-none" = "󰂜 ";
"dnd-inhibited-notification" = "󰅸 ";
"dnd-inhibited-none" = "󰂜 ";
};
"return-type" = "json";
"exec-if" = "which ${swaync}/bin/swaync-client";
"exec" = "${swaync}/bin/swaync-client -swb";
"on-click" = "${swaync}/bin/swaync-client -t -sw";
"on-click-right" = "${swaync}/bin/swaync-client -d -sw";
"escape" = true;
};
"custom/weather" = let
date-format = "%Y-%m-%d";
custom-indicator = "{ICON}{temp_C}({FeelsLikeC})";
in {
"format" = "{}°";
"tooltip" = true;
"interval" = 900; # Every 15 minutes
"exec" = ''${pkgs.wttrbar}/bin/wttrbar --location Didcot --date-format "${date-format}" --custom-indicator "${custom-indicator}"'';
"return-type" = "json";
};
tray = {
icon-size = builtins.floor fonts.sizes.popups;
show-passive-items = true;
spacing = 5;
};
};
# TEMP FIX
alt = lib.mkIf (hostName == "Vanguard") {
inherit (main) layer position "sway/workspaces";
name = "alt";
"modules-left" = [];
"modules-center" = ["sway/workspaces"];
"modules-right" = [];
};
};
style = with scheme.withHashtag; let
accent = scheme.withHashtag.${accentColour};
in ''
* {
all: unset;
font-size: 1em;
font-family: ${fonts.monospace.name};
}
window {
background: transparent;
}
window > box {
color: ${base05};
background: alpha(${base00}, 0.8);
margin: 5px 5px 0px;
padding: 0px;
border: 1px solid ${accent};
border-radius: 10px;
}
tooltip {
background: alpha(${base00}, 0.8);
border: 1px solid ${accent};
border-radius: 10px;
}
tooltip label {
color: ${base05};
border: none;
padding: 5px;
margin: 0px;
}
#workspaces,
#window,
#mpris,
#pulseaudio,
#network,
#bluetooth,
#backlight,
#battery,
#clock,
#custom-notification,
#custom-weather,
#tray {
margin: 0px;
padding: 1px 5px;
}
#workspaces,
#window,
#mpris,
#tray,
#backlight,
#battery,
#custom-weather {
color: ${base05};
}
#workspaces button {
background: transparent;
color: ${base05};
margin: 0px;
padding: 0px 5px;
}
#workspaces button.persistent {
color: ${base03};
}
#workspaces button.focused {
color: ${accent};
}
#workspaces button.urgent {
color: ${base09};
}
#custom-notification {
color: ${base08};
}
#pulseaudio {
color: ${base09};
}
#network {
color: ${base0A};
}
#bluetooth {
color: ${base0B};
}
#clock.calendar {
color: ${base0C};
}
#clock {
color: ${base0D};
}
'';
};
}

79
home/wlogout/default.nix Normal file
View file

@ -0,0 +1,79 @@
{
fonts,
scheme,
accentColour ? "base07",
...
}: {
programs.wlogout = {
enable = true;
layout = [
{
label = "reboot";
action = "systemctl reboot";
text = "Reboot";
keybind = "r";
}
{
label = "shutdown";
action = "systemctl poweroff";
text = "Shutdown";
keybind = "s";
}
{
label = "logout";
action = "swaymsg exit";
text = "Logout";
keybind = "l";
}
];
style = with scheme.withHashtag; let
accent = scheme.withHashtag.${accentColour};
shutdownIcon = ./icons/shutdown.png;
rebootIcon = ./icons/reboot.png;
logoutIcon = ./icons/logout.png;
in ''
* {
font-size: ${toString fonts.sizes.popups}px;
font-family: "${fonts.sansSerif.name}";
}
window {
border: none;
background-color: transparent;
}
button {
border: ${accent};
background-color: ${base00};
background-repeat: no-repeat;
background-position: center;
background-size: 25%;
box-shadow: none;
margin: 5px;
color: ${base05};
}
button:hover {
background-color: ${base01};
color: ${base05};
}
button:focus {
background-color: ${base03};
color: ${base05};
}
#shutdown {
background-image: url("${shutdownIcon}");
}
#reboot {
background-image: url("${rebootIcon}");
}
#logout {
background-image: url("${logoutIcon}");
}
'';
};
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
home/wlogout/icons/lock.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

4
home/zathura/default.nix Normal file
View file

@ -0,0 +1,4 @@
{pkgs, ...}: {
# TODO add colour scheme and emacs keybinds
programs.zathura = {enable = true;};
}

View file

@ -0,0 +1,208 @@
# Being an Emacs user, it is natural for me to use emacs-like and info-like keybindings for zathura.
#
# Zathura configuration documentation is available at
# https://git.pwmt.org/pwmt/zathura/-/blob/e5d2ca487147e79d0bb7acbf5174cd9dcc92a86c/doc/man/zathurarc.5.rst
# A full list of available functions and default keybindings is available at
# https://git.pwmt.org/pwmt/zathura/-/blob/e5d2ca487147e79d0bb7acbf5174cd9dcc92a86c/zathura/config.c#L301
#
# If you want to integrate Zathura with Emacs AUCTeX mode, see
# [emacs wiki](https://www.emacswiki.org/emacs/AUCTeX).
#
# Put the following inside `$XDG_CONFIG_HOME/zathura/zathurarc
## niceties
# when selecting text with mouse,
# copy to clipboard
set selection-clipboard clipboard
# keep several lines of text when
# scrolling a screenful
set scroll-full-overlap 0.2
# see documentation for details
set scroll-page-aware true
set window-title-basename true
set adjust-open width
set statusbar-home-tilde true
set vertical-center true
set synctex true
# large bold font easier on the eyes in index mode
# status bar can be disabled with A-s
set font "FreeSans bold 16"
set zoom-step 3
map [normal] <C-b> scroll left
map [normal] <C-n> scroll down
map [normal] <C-p> scroll up
map [normal] <C-f> scroll right
map [normal] <C-g> abort
map [insert] <C-g> abort
map [normal] <C-[> abort
map [normal] <A-\<> goto top
map [normal] <A-\>> goto bottom
map [normal] a adjust_window best-fit
map [normal] s adjust_window width
map [normal] F display_link
map [normal] <C-c> copy_link
map [normal] f follow
map [normal] m mark_add
map [normal] \' mark_evaluate
map [normal] \, navigate next
map [normal] \. navigate previous
map [normal] <A-Right> navigate next
map [normal] <A-Left> navigate previous
map [normal] <PageDown> scroll full-down
map [normal] <PageUp> scroll full-up
map [normal] <C-P> print
map [normal] c recolor
map [normal] R reload
map [normal] v rotate rotate_cw
map [normal] V rotate rotate_ccw
map [normal] <Left> scroll left
map [normal] <Up> scroll up
map [normal] <Down> scroll down
map [normal] <Right> scroll right
map [normal] <A-a> scroll half-left
map [normal] <C-V> scroll half-down
map [normal] <A-V> scroll half-up
map [normal] <A-e> scroll half-right
map [normal] <C-a> scroll full-left
map [normal] <C-v> scroll full-down
map [normal] <Return> scroll full-down
map [normal] <A-v> scroll full-up
map [normal] <C-e> scroll full-right
map [normal] <Space> scroll full-down
map [normal] <C-h> scroll full-up
map [normal] <BackSpace> scroll full-up
map [normal] <S-Space> scroll full-up
map [normal] l jumplist backward
map [normal] r jumplist forward
map [normal] <A-r> bisect forward
map [normal] <A-l> bisect backward
# still need to use '/' to trigger search
map [normal] <C-s> search forward
map [normal] <C-r> search backward
map [normal] p snap_to_page
map [normal] <C-i> toggle_index
map [normal] i toggle_index
map [normal] <Tab> toggle_index
map [normal] <A-s> toggle_statusbar
map [normal] <A-i> focus_inputbar
map [normal] d toggle_page_mode
map [normal] q quit
map [normal] + zoom in
map [normal] - zoom out
map [normal] = zoom in
map [normal] <A-P> toggle_presentation
map [normal] <A-F> toggle_fullscreen
map [normal] j toggle_fullscreen
map [fullscreen] j toggle_fullscreen
map [fullscreen] q toggle_fullscreen
map [fullscreen] <C-b> scroll left
map [fullscreen] <C-n> scroll down
map [fullscreen] <C-p> scroll up
map [fullscreen] <C-f> scroll right
map [fullscreen] <C-g> abort
map [fullscreen] <C-[> abort
map [fullscreen] <A-\<> goto top
map [fullscreen] <A-\>> goto bottom
map [fullscreen] a adjust_window best-fit
map [fullscreen] s adjust_window width
map [fullscreen] F display_link
map [fullscreen] <C-c> copy_link
map [fullscreen] f follow
map [fullscreen] m mark_add
map [fullscreen] \' mark_evaluate
map [fullscreen] \, navigate next
map [fullscreen] \. navigate previous
map [fullscreen] <A-Right> navigate next
map [fullscreen] <A-Left> navigate previous
map [fullscreen] <PageDown> scroll full-down
map [fullscreen] <PageUp> scroll full-up
map [fullscreen] <C-P> print
map [fullscreen] c recolor
map [fullscreen] R reload
map [fullscreen] v rotate rotate_cw
map [fullscreen] V rotate rotate_ccw
map [fullscreen] <Left> scroll left
map [fullscreen] <Up> scroll up
map [fullscreen] <Down> scroll down
map [fullscreen] <Right> scroll right
map [fullscreen] <A-a> scroll half-left
map [fullscreen] <C-V> scroll half-down
map [fullscreen] <A-V> scroll half-up
map [fullscreen] <A-e> scroll half-right
map [fullscreen] <C-a> scroll full-left
map [fullscreen] <C-v> scroll full-down
map [fullscreen] <Return> scroll full-down
map [fullscreen] <A-v> scroll full-up
map [fullscreen] <C-e> scroll full-right
map [fullscreen] <Space> scroll full-down
map [fullscreen] <C-h> scroll full-up
map [fullscreen] <BackSpace> scroll full-up
map [fullscreen] <S-Space> scroll full-up
map [fullscreen] l jumplist backward
map [fullscreen] r jumplist forward
map [fullscreen] <A-r> bisect forward
map [fullscreen] <A-l> bisect backward
map [fullscreen] <C-s> search forward
map [fullscreen] <C-r> search backward
map [fullscreen] p snap_to_page
map [fullscreen] i toggle_index
map [fullscreen] <C-i> toggle_index
map [fullscreen] <Tab> toggle_index
map [fullscreen] <A-s> toggle_statusbar
map [fullscreen] <A-i> focus_inputbar
map [fullscreen] d toggle_page_mode
map [fullscreen] + zoom in
map [fullscreen] - zoom out
map [fullscreen] = zoom in
# status bar will obscure last item in index mode
map [index] <A-s> toggle_statusbar
map [index] q toggle_index
map [index] i toggle_index
map [index] <C-p> navigate_index up
map [index] <C-h> navigate_index up
map [index] <BackSpace> navigate_index up
map [index] <C-n> navigate_index down
map [index] <A-v> navigate_index up
map [index] <C-v> navigate_index down
map [index] \< navigate_index top
map [index] \> navigate_index bottom
map [index] <A-\<> navigate_index top
map [index] <A-\>> navigate_index bottom
map [index] <C-b> navigate_index collapse
map [index] <C-f> navigate_index expand
map [index] <C-i> navigate_index expand-all
map [index] <A-i> navigate_index collapse-all
map [index] <Up> navigate_index up
map [index] <Down> navigate_index down
map [index] <Left> navigate_index collapse
map [index] <Right> navigate_index expand
map [index] <C-m> navigate_index select
map [index] <Space> navigate_index select
map [index] <Return> navigate_index select
map [index] <C-j> navigate_index select
map [index] <Esc> toggle_index
map [index] <C-[> toggle_index
map [index] <C-g> toggle_index
map [index] <C-c> toggle_index
map [presentation] i toggle_index
map [presentation] r navigate next
map [presentation] <Down> navigate next
map [presentation] <Right> navigate next
map [presentation] <PageDown> navigate next
map [presentation] <Space> navigate next
map [presentation] l navigate previous
map [presentation] <Left> navigate previous
map [presentation] <Up> navigate previous
map [presentation] <PageUp> navigate previous
map [presentation] <S-Space> navigate previous
map [presentation] <BackSpace> navigate previous
map [presentation] <F5> toggle_presentation
map [presentation] q toggle_presentation
map [presentation] <C-h> navigate previous
map [presentation] <M-v> navigate previous
map [presentation] <C-v> navigate next
map [presentation] <A-\<> goto top
map [presentation] <A-\>> goto bottom

38
home/zsh/default.nix Normal file
View file

@ -0,0 +1,38 @@
{...}: {
programs.zsh = {
enable = true;
enableCompletion = true;
enableAutosuggestions = true;
syntaxHighlighting.enable = true;
enableVteIntegration = true;
autocd = true;
historySubstringSearch.enable = true;
history = {
extended = true;
ignoreDups = true;
ignoreSpace = true;
};
shellAliases = {
nixos-repl = "nixos-rebuild repl";
nixos-test = "sudo nixos-rebuild test";
nixos-boot = "sudo nixos-rebuild boot";
nixos-switch = "sudo nixos-rebuild switch";
nixos-reboot = "sudo nixos-rebuild boot && sudo reboot now";
nixos-shutdown = "sudo nixos-rebuild boot && sudo shutdown now";
gsa = "git-sync-all";
};
oh-my-zsh = {
enable = true;
plugins = ["colored-man-pages" "lol" "rand-quote"];
theme = "";
};
completionInit = ''
autoload -Uz +X compinit && compinit
## case insensitive path-completion
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'
zstyle ':completion:*' menu select
'';
initExtra = "source ${./transient.zsh}\n";
};
}

31
home/zsh/transient.zsh Executable file
View file

@ -0,0 +1,31 @@
#!/usr/bin/env zsh
zle-line-init() {
emulate -L zsh
[[ $CONTEXT == start ]] || return 0
while true; do
zle .recursive-edit
local -i ret=$?
[[ $ret == 0 && $KEYS == $'\4' ]] || break
[[ -o ignore_eof ]] || exit 0
done
local saved_prompt=$PROMPT
local saved_rprompt=$RPROMPT
PROMPT='󰁔 '
RPROMPT=''
zle .reset-prompt
PROMPT=$saved_prompt
RPROMPT=$saved_rprompt
if ((ret)); then
zle .send-break
else
zle .accept-line
fi
return ret
}
zle -N zle-line-init

View file

@ -0,0 +1,22 @@
{
config,
pkgs,
...
}: {
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
users.mutableUsers = false;
system.autoUpgrade = {
enable = true;
flake = "git+${config.nix.registry.nixos.to.url}";
flags = ["-L"]; # Print build logs
dates = "02:00";
randomizedDelaySec = "15min";
allowReboot = true;
rebootWindow = {
lower = "02:00";
upper = "05:00";
};
};
environment.systemPackages = with pkgs; [nil];
}

View file

@ -1,44 +1,32 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ { config, lib, pkgs, modulesPath, ... }:
config,
lib,
pkgs,
modulesPath,
...
}:
{ {
imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; imports =
[ (modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ];
"xhci_pci"
"ahci"
"nvme"
"usbhid"
"usb_storage"
"sd_mod"
];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-intel" ]; boot.kernelModules = [ "kvm-intel" ];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [ ];
fileSystems."/" = { fileSystems."/" =
device = "/dev/disk/by-uuid/b9d4ba04-a867-4ca6-88f9-79dc6a982e94"; { device = "/dev/disk/by-uuid/b9d4ba04-a867-4ca6-88f9-79dc6a982e94";
fsType = "ext4"; fsType = "ext4";
}; };
fileSystems."/boot" = { fileSystems."/boot" =
device = "/dev/disk/by-uuid/8F05-4C3A"; { device = "/dev/disk/by-uuid/8F05-4C3A";
fsType = "vfat"; fsType = "vfat";
options = [ options = [ "fmask=0022" "dmask=0022" ];
"fmask=0022" };
"dmask=0022"
swapDevices =
[ { device = "/dev/disk/by-uuid/a10ee1da-3b0d-4f6b-b20a-d6a32ae1f668"; }
]; ];
};
swapDevices = [ { device = "/dev/disk/by-uuid/a10ee1da-3b0d-4f6b-b20a-d6a32ae1f668"; } ];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's

1
hosts/Legion/home.nix Normal file
View file

@ -0,0 +1 @@
{}

View file

@ -0,0 +1,13 @@
{
config,
pkgs,
...
}: {
boot.extraModulePackages = with config.boot.kernelPackages; [v4l2loopback];
boot.extraModprobeConfig = ''
options v4l2loopback devices=1 video_nr=1 card_label="OBS Cam" exclusive_caps=1
'';
hardware.opengl.driSupport32Bit = true;
hardware.opengl.extraPackages = with pkgs; [amdvlk rocmPackages.clr.icd];
hardware.opengl.extraPackages32 = [pkgs.driversi686Linux.amdvlk];
}

View file

@ -1,44 +1,34 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ { config, lib, pkgs, modulesPath, ... }:
config,
lib,
pkgs,
modulesPath,
...
}:
{ {
imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; imports =
[ (modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "rtsx_pci_sdmmc" ];
"nvme"
"xhci_pci"
"rtsx_pci_sdmmc"
];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-amd" ]; boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [ ];
fileSystems."/" = { fileSystems."/" =
device = "/dev/disk/by-uuid/84b28760-3643-4ad8-9ff6-ff78b57067f8"; { device = "/dev/disk/by-uuid/84b28760-3643-4ad8-9ff6-ff78b57067f8";
fsType = "ext4"; fsType = "ext4";
}; };
boot.initrd.luks.devices."luks-d1062931-ee58-4848-adf9-09452daeb6eb".device = boot.initrd.luks.devices."luks-d1062931-ee58-4848-adf9-09452daeb6eb".device = "/dev/disk/by-uuid/d1062931-ee58-4848-adf9-09452daeb6eb";
"/dev/disk/by-uuid/d1062931-ee58-4848-adf9-09452daeb6eb";
fileSystems."/boot" = { fileSystems."/boot" =
device = "/dev/disk/by-uuid/ABE3-88E7"; { device = "/dev/disk/by-uuid/ABE3-88E7";
fsType = "vfat"; fsType = "vfat";
options = [ options = [ "fmask=0022" "dmask=0022" ];
"fmask=0022" };
"dmask=0022"
swapDevices =
[ { device = "/dev/disk/by-uuid/ba43345c-a652-497f-84d0-86064805446b"; }
]; ];
};
swapDevices = [ { device = "/dev/disk/by-uuid/ba43345c-a652-497f-84d0-86064805446b"; } ];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's

7
hosts/Northstar/home.nix Normal file
View file

@ -0,0 +1,7 @@
{...}: {
wayland.windowManager.sway.config.output = {
"eDP-1" = {
scale = "1.25";
};
};
}

View file

@ -0,0 +1,16 @@
{pkgs, ...}: {
# Setup keyfile
boot.initrd.secrets = {"/crypto_keyfile.bin" = null;};
# Enable swap on luks
boot.initrd.luks.devices."luks-761eeb11-3091-4142-9232-4fb33165eccd".device = "/dev/disk/by-uuid/761eeb11-3091-4142-9232-4fb33165eccd";
boot.initrd.luks.devices."luks-761eeb11-3091-4142-9232-4fb33165eccd".keyFile = "/crypto_keyfile.bin";
environment = {
etc."ppp/options".text = ''
ipcp-accept-remote
'';
systemPackages = with pkgs; [openfortivpn samba];
};
services.ollama.enable = true;
}

View file

@ -1,45 +1,33 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ { config, lib, pkgs, modulesPath, ... }:
config,
lib,
pkgs,
modulesPath,
...
}:
{ {
imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; imports =
[ (modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ boot.initrd.availableKernelModules = [ "xhci_pci" "thunderbolt" "vmd" "nvme" "usbhid" "usb_storage" "sd_mod" "rtsx_pci_sdmmc" ];
"xhci_pci"
"thunderbolt"
"vmd"
"nvme"
"usbhid"
"usb_storage"
"sd_mod"
"rtsx_pci_sdmmc"
];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-intel" ]; boot.kernelModules = [ "kvm-intel" ];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [ ];
fileSystems."/" = { fileSystems."/" =
device = "/dev/disk/by-uuid/44c11386-0af8-4954-93bc-963a8e071672"; { device = "/dev/disk/by-uuid/44c11386-0af8-4954-93bc-963a8e071672";
fsType = "ext4"; fsType = "ext4";
}; };
boot.initrd.luks.devices."luks-bf1eab3a-6d92-430d-a282-8dd4c9efe2c7".device = boot.initrd.luks.devices."luks-bf1eab3a-6d92-430d-a282-8dd4c9efe2c7".device = "/dev/disk/by-uuid/bf1eab3a-6d92-430d-a282-8dd4c9efe2c7";
"/dev/disk/by-uuid/bf1eab3a-6d92-430d-a282-8dd4c9efe2c7";
fileSystems."/boot" = { fileSystems."/boot" =
device = "/dev/disk/by-uuid/85D5-B6EC"; { device = "/dev/disk/by-uuid/85D5-B6EC";
fsType = "vfat"; fsType = "vfat";
}; };
swapDevices = [ { device = "/dev/disk/by-uuid/e65e5e4d-2084-4e6b-9255-3b36cba1529f"; } ]; swapDevices =
[ { device = "/dev/disk/by-uuid/e65e5e4d-2084-4e6b-9255-3b36cba1529f"; }
];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's

46
hosts/Ronin/home.nix Normal file
View file

@ -0,0 +1,46 @@
{
config,
lib,
pkgs,
...
}: {
home.packages = [(pkgs.writeShellScriptBin "ukaea-vpn-connect" "sudo ${pkgs.openfortivpn}/bin/openfortivpn -c ${./ukaea-vpn.conf}")];
programs.git.userEmail = config.accounts.email.accounts.outlook.address;
accounts.email.accounts = {
proton.primary = lib.mkForce false;
outlook.primary = lib.mkForce true;
};
wayland.windowManager.sway.config.output = {
"eDP-1".scale = "1.25";
"Dell Inc. DELL P3223QE CCG8YN3".scale = "1.5";
};
xresources.properties."Xft.dpi" = toString (builtins.mul 96 1.5);
services.kanshi = {
enable = true;
systemdTarget = "sway-session.target";
profiles = {
undocked = {
outputs = [
{
criteria = "eDP-1";
status = "enable";
scale = 1.25;
}
];
};
docked = {
outputs = [
{
criteria = "Dell Inc. DELL P3223QE CCG8YN3";
status = "enable";
scale = 1.5;
}
{
criteria = "eDP-1";
status = "disable";
}
];
};
};
};
}

View file

@ -1,5 +1,3 @@
host = vpn.ukaea.uk host = vpn.ukaea.uk
port = 943 port = 943
username = elitherl username = elitherl
set-dns = 1
set-routes = 1

View file

@ -0,0 +1,18 @@
{pkgs, ...}: {
boot.loader.efi.efiSysMountPoint = "/boot/efi";
# Setup keyfile
boot.initrd.secrets = {"/crypto_keyfile.bin" = null;};
# Enable swap on luks
boot.initrd.luks.devices."luks-47d34268-5100-4eba-b34d-220f4239c1cb".device = "/dev/disk/by-uuid/47d34268-5100-4eba-b34d-220f4239c1cb";
boot.initrd.luks.devices."luks-47d34268-5100-4eba-b34d-220f4239c1cb".keyFile = "/crypto_keyfile.bin";
environment = {
etc."ppp/options".text = ''
ipcp-accept-remote
'';
systemPackages = with pkgs; [openfortivpn samba];
};
services.ollama.enable = true;
}

View file

@ -1,24 +1,13 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ { config, lib, pkgs, modulesPath, ... }:
config,
lib,
pkgs,
modulesPath,
...
}:
{ {
imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; imports = [ (modulesPath + "/installer/scan/not-detected.nix") ];
boot.initrd.availableKernelModules = [ boot.initrd.availableKernelModules =
"xhci_pci" [ "xhci_pci" "ahci" "usb_storage" "usbhid" "sd_mod" ];
"ahci"
"usb_storage"
"usbhid"
"sd_mod"
];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-intel" ]; boot.kernelModules = [ "kvm-intel" ];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [ ];
@ -36,7 +25,8 @@
fsType = "vfat"; fsType = "vfat";
}; };
swapDevices = [ { device = "/dev/disk/by-uuid/ff9627a7-820c-4628-a040-2b665688b893"; } ]; swapDevices =
[{ device = "/dev/disk/by-uuid/ff9627a7-820c-4628-a040-2b665688b893"; }];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's
@ -47,5 +37,6 @@
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
powerManagement.cpuFreqGovernor = lib.mkDefault "powersave"; powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; hardware.cpu.intel.updateMicrocode =
lib.mkDefault config.hardware.enableRedistributableFirmware;
} }

18
hosts/Scorch/home.nix Normal file
View file

@ -0,0 +1,18 @@
{
config,
lib,
...
}: {
programs.git.userEmail = config.accounts.email.accounts.outlook.address;
accounts.email.accounts = {
proton.primary = lib.mkForce false;
outlook.primary = lib.mkForce true;
};
wayland.windowManager.sway.config.output = {
"Dell Inc. DELL P3223QE CCG8YN3" = {
pos = "0 0";
scale = "1.5";
};
};
xresources.properties."Xft.dpi" = toString (builtins.mul 96 1.5);
}

View file

@ -0,0 +1,14 @@
{config, ...}: {
boot = {
initrd.kernelModules = ["amdgpu"];
extraModulePackages = with config.boot.kernelPackages; [v4l2loopback];
extraModprobeConfig = ''
options v4l2loopback devices=1 video_nr=1 card_label="OBS Cam" exclusive_caps=1
'';
};
hardware.opengl = {
driSupport = true;
driSupport32Bit = true;
};
services.ollama.enable = true;
}

View file

@ -1,52 +1,39 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ { config, lib, pkgs, modulesPath, ... }:
config,
lib,
pkgs,
modulesPath,
...
}:
{ {
imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; imports =
[ (modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "sd_mod" "sr_mod" ];
"xhci_pci"
"ahci"
"nvme"
"usbhid"
"sd_mod"
"sr_mod"
];
boot.initrd.kernelModules = [ "dm-snapshot" ]; boot.initrd.kernelModules = [ "dm-snapshot" ];
boot.kernelModules = [ "kvm-amd" ]; boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [ ];
fileSystems."/" = { fileSystems."/" =
device = "/dev/disk/by-uuid/379a999a-0753-4cbf-b868-e275902f0f73"; { device = "/dev/disk/by-uuid/379a999a-0753-4cbf-b868-e275902f0f73";
fsType = "ext4"; fsType = "ext4";
}; };
boot.initrd.luks.devices."luks-0d50df5f-9456-4296-9156-f5b818e11552".device = boot.initrd.luks.devices."luks-0d50df5f-9456-4296-9156-f5b818e11552".device = "/dev/disk/by-uuid/0d50df5f-9456-4296-9156-f5b818e11552";
"/dev/disk/by-uuid/0d50df5f-9456-4296-9156-f5b818e11552";
fileSystems."/boot" = { fileSystems."/boot" =
device = "/dev/disk/by-uuid/3297-A70D"; { device = "/dev/disk/by-uuid/3297-A70D";
fsType = "vfat"; fsType = "vfat";
options = [ options = [ "fmask=0022" "dmask=0022" ];
"fmask=0022" };
"dmask=0022"
fileSystems."/mnt/secondary" =
{ device = "/dev/disk/by-uuid/036f1fcb-0674-4ae5-a2fe-cb4f7ada001d";
fsType = "ext4";
};
swapDevices =
[ { device = "/dev/disk/by-uuid/26a8690a-70f9-4701-b224-b212f76a7035"; }
]; ];
};
fileSystems."/mnt/secondary" = {
device = "/dev/disk/by-uuid/036f1fcb-0674-4ae5-a2fe-cb4f7ada001d";
fsType = "ext4";
};
swapDevices = [ { device = "/dev/disk/by-uuid/26a8690a-70f9-4701-b224-b212f76a7035"; } ];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's

22
hosts/Vanguard/home.nix Normal file
View file

@ -0,0 +1,22 @@
{pkgs, ...}: {
wayland.windowManager.sway.config = {
startup = [
{command = "${pkgs.xorg.xrandr}/bin/xrandr --output DP-2 --primary";}
];
output = {
"Acer Technologies ED270R TJMEE0043W01" = {
mode = "1920x1080@165Hz";
pos = "1080 420";
adaptive_sync = "off";
};
"Ancor Communications Inc VS278 FALMQS032358" = {
pos = "0 0";
transform = "270";
};
};
};
programs.waybar.settings = {
main.output = ["DP-2"];
alt.output = ["HDMI-A-1"];
};
}

View file

Before

Width:  |  Height:  |  Size: 178 KiB

After

Width:  |  Height:  |  Size: 178 KiB

View file

@ -0,0 +1,20 @@
system: "base16"
name: "Modus Vivendi Tinted"
author: "https://protesilaos.com/emacs/modus-themes"
variant: "dark"
base00: "0d0e1c"
base01: "2b3045"
base02: "4a4f69"
base03: "61647a"
base04: "c6daff"
base05: "ffffff"
base06: "ffffff"
base07: "ffffff"
base08: "ff5f59" # red (err / red-warmer)
base09: "ff9f80" # orange (comment / red-faint)
base0A: "fec43f" # yellow (warning / yellow-warmer)
base0B: "00c06f" # green (rx-construct / green-cooler)
base0C: "00d3d0" # cyan (variable / cyan)
base0D: "79a8ff" # blue (string / blue-warmer)
base0E: "f78fe7" # magenta (cursor / magenta-warmer)
base0F: "d2b580" # brown (identifier / yellow-faint)

View file

@ -0,0 +1,20 @@
system: "base16"
name: "Modus Vivendi"
author: "https://protesilaos.com/emacs/modus-themes"
variant: "dark"
base00: "000000"
base01: "303030"
base02: "535353"
base03: "646464"
base04: "c6daff"
base05: "ffffff"
base06: "ffffff"
base07: "ffffff"
base08: "ff5f59" # red (err / red-warmer)
base09: "ff9f80" # orange (comment / red-faint)
base0A: "fec43f" # yellow (warning / yellow-warmer)
base0B: "00c06f" # green (rx-construct / green-cooler)
base0C: "00d3d0" # cyan (variable / cyan)
base0D: "79a8ff" # blue (string / blue-warmer)
base0E: "f78fe7" # magenta (cursor / magenta-warmer)
base0F: "d2b580" # brown (identifier / yellow-faint)

43
services/adguardhome.nix Normal file
View file

@ -0,0 +1,43 @@
{
config,
lib,
pkgs,
...
}: {
services.adguardhome = {
enable = true;
mutableSettings = false;
settings = rec {
http.address = "0.0.0.0:3200";
dns = {
bind_hosts = ["127.0.0.1" "192.168.1.230"];
bootstrap_dns = ["9.9.9.9" "149.112.112.10"];
ratelimit = 0;
safe_search.enabled = true;
rewrites = [
{
domain = "xenia.me.uk";
answer = "192.168.1.230";
}
{
domain = "*.xenia.me.uk";
answer = "192.168.1.230";
}
];
blocked_services.ids = [];
};
filtering = {inherit (dns) safe_search rewrites blocked_services;};
querylog.ignored = [
"discovery.syncthing.net"
"discovery-v6.syncthing.net"
"matrix.tchncs.de"
];
statistics = {inherit (querylog) ignored;};
};
openFirewall = true;
};
networking.firewall = {
allowedTCPPorts = [53];
allowedUDPPorts = [53];
};
}

5
services/astroneer.nix Normal file
View file

@ -0,0 +1,5 @@
{pkgs, ...}: {
environment.systemPackages = with pkgs; [steamcmd];
networking.firewall.allowedTCPPorts = [8777];
services.caddy.virtualHosts."astro.xenia.me.uk".extraConfig = "reverse_proxy http://localhost:8777";
}

22
services/caddy.nix Normal file
View file

@ -0,0 +1,22 @@
{...}: {
networking.firewall.allowedTCPPorts = [80 443];
services.caddy = {
enable = true;
email = "evie@xenia.me.uk";
virtualHosts = {
"xenia.me.uk".extraConfig = ''
redir https://www.xenia.me.uk
'';
"www.xenia.me.uk".extraConfig = ''
file_server * {
root /var/www/xenia.me.uk/
}
'';
};
};
services.fail2ban = {
enable = true;
ignoreIP = ["127.0.0.1/8" "::1" "192.168.1.0/16"];
bantime-increment = {enable = true;};
};
}

21
services/forgejo.nix Normal file
View file

@ -0,0 +1,21 @@
{...}: {
imports = [./caddy.nix];
services = {
forgejo = {
enable = true;
settings = {
server = {
ROOT_URL = "https://git.xenia.me.uk";
DOMAIN = "git.xenia.me.uk";
HTTP_ADDR = "127.0.0.1";
HTTP_PORT = 3100;
DISABLE_SSH = true;
};
ui = {DEFAULT_THEME = "forgejo-auto";};
admin = {DISABLE_REGULAR_ORG_CREATION = true;};
service = {DISABLE_REGISTRATION = true;};
};
};
caddy.virtualHosts."git.xenia.me.uk".extraConfig = "reverse_proxy http://localhost:3100";
};
}

22
services/gitea.nix Normal file
View file

@ -0,0 +1,22 @@
{...}: {
imports = [./caddy.nix];
services.gitea = {
enable = true;
settings = {
server = {
ROOT_URL = "https://git.xenia.me.uk";
DOMAIN = "git.xenia.me.uk";
HTTP_ADDR = "127.0.0.1";
HTTP_PORT = 3100;
DISABLE_SSH = true;
};
service.DISABLE_REGISTRATION = true;
ui = {
DEFAULT_THEME = "auto";
THEMES = "auto,gitea,arc-greenw,catppuccin-latte-rosewater,catppuccin-latte-flamingo,catppuccin-latte-pink,catppuccin-latte-mauve,catppuccin-latte-red,catppuccin-latte-maroon,catppuccin-latte-peach,catppuccin-latte-yellow,catppuccin-latte-green,catppuccin-latte-teal,catppuccin-latte-sky,catppuccin-latte-sapphire,catppuccin-latte-blue,catppuccin-latte-lavender,catppuccin-frappe-rosewater,catppuccin-frappe-flamingo,catppuccin-frappe-pink,catppuccin-frappe-mauve,catppuccin-frappe-red,catppuccin-frappe-maroon,catppuccin-frappe-peach,catppuccin-frappe-yellow,catppuccin-frappe-green,catppuccin-frappe-teal,catppuccin-frappe-sky,catppuccin-frappe-sapphire,catppuccin-frappe-blue,catppuccin-frappe-lavender,catppuccin-macchiato-rosewater,catppuccin-macchiato-flamingo,catppuccin-macchiato-pink,catppuccin-macchiato-mauve,catppuccin-macchiato-red,catppuccin-macchiato-maroon,catppuccin-macchiato-peach,catppuccin-macchiato-yellow,catppuccin-macchiato-green,catppuccin-macchiato-teal,catppuccin-macchiato-sky,catppuccin-macchiato-sapphire,catppuccin-macchiato-blue,catppuccin-macchiato-lavender,catppuccin-mocha-rosewater,catppuccin-mocha-flamingo,catppuccin-mocha-pink,catppuccin-mocha-mauve,catppuccin-mocha-red,catppuccin-mocha-maroon,catppuccin-mocha-peach,catppuccin-mocha-yellow,catppuccin-mocha-green,catppuccin-mocha-teal,catppuccin-mocha-sky,catppuccin-mocha-sapphire,catppuccin-mocha-blue,catppuccin-mocha-lavender";
};
};
appName = "Gitea";
};
services.caddy.virtualHosts."git.xenia.me.uk".extraConfig = "reverse_proxy http://localhost:3100";
}

Some files were not shown because too many files have changed in this diff Show more