Compare commits

...

54 Commits

Author SHA1 Message Date
DerGrumpf d122263dfa Added workflow for automatic iso builds
CI / check (push) Successful in 3m55s
2026-06-22 22:56:47 +02:00
DerGrumpf 86e020936c Changed Workflow for not including darwin build due to catppuccin evaluation
CI / check (push) Successful in 4m1s
2026-06-22 22:48:08 +02:00
DerGrumpf c00b9dc204 Fixed workflow; removed unnecessary stuff; add iso builder
CI / check (push) Successful in 5m51s
2026-06-22 22:33:33 +02:00
DerGrumpf 2505485996 Aligned flake with workflow
CI / check (push) Failing after 2m41s
2026-06-22 22:16:53 +02:00
DerGrumpf f41ef34361 Nonsense on top of Nonsense!
CI / check (push) Failing after 57s
2026-06-22 21:16:47 +02:00
DerGrumpf 4cacb69c9c Nonsense on top of Nonsense!
CI / check (push) Failing after 24s
2026-06-22 21:14:33 +02:00
DerGrumpf 9880ba23aa Fixed gitea-runner user
CI / check (push) Failing after 0s
2026-06-22 21:03:17 +02:00
DerGrumpf 628dfaba31 Fixed gitea-runner user
CI / check (push) Failing after 0s
2026-06-22 21:01:28 +02:00
DerGrumpf 9a93834dbb Fixed activation ids
CI / check (push) Failing after 1s
2026-06-22 20:49:38 +02:00
DerGrumpf 81cfe4ff2b Merged
CI / check (push) Failing after 1s
2026-06-22 20:44:45 +02:00
DerGrumpf 7f3b6be59b Fixed CI Workflow 2026-06-22 20:43:56 +02:00
DerGrumpf c49a0f1420 Fixed CI Workflow
CI / check (push) Failing after 40s
2026-06-22 20:41:42 +02:00
DerGrumpf 323ed6ec9e Fixed gitea runner age key
CI / check (push) Failing after 57s
2026-06-22 20:37:44 +02:00
DerGrumpf 2eb594b625 Fixed gitea runner
CI / check (push) Failing after 58s
2026-06-22 20:27:54 +02:00
DerGrumpf 15f6a5d7d3 Added Gitea runner
CI / check (push) Failing after 59s
2026-06-22 19:53:09 +02:00
DerGrumpf a92ff8fe58 Changed OpenCode 2026-06-18 14:00:16 +02:00
DerGrumpf c242370ae8 Configured Ollama 2026-06-18 13:59:45 +02:00
DerGrumpf 3cbabde86a Changed llm to use groq with lg and ollama with l 2026-06-18 13:38:39 +02:00
DerGrumpf aa673196ff Changed llm to use groq with lg and ollama with l 2026-06-18 13:33:18 +02:00
DerGrumpf 8125de7ce6 Enabled Catppuccin for Opencode 2026-06-17 20:32:04 +02:00
DerGrumpf 42e80ea537 Added Package 2026-06-17 20:23:26 +02:00
DerGrumpf a24be3309b Merge branch 'main' of ssh://git.cyperpunk.de:12222/DerGrumpf/cyper-nix 2026-06-17 20:23:16 +02:00
DerGrumpf d2ad80da6f Configured Ollama 2026-06-17 20:22:53 +02:00
DerGrumpf 49606c8711 Merge branch 'main' of ssh://git.cyperpunk.de:12222/DerGrumpf/cyper-nix 2026-06-17 20:22:40 +02:00
DerGrumpf 48260c392b Added OpenCode 2026-06-17 20:22:32 +02:00
DerGrumpf e1cf4f3647 Configured Ollama 2026-06-17 18:41:54 +02:00
DerGrumpf 9640b433a4 Fixed Discord Bridge and neovim stupid stuff 2026-06-17 13:48:00 +02:00
DerGrumpf f9f9816fe9 Added netradiant overlay 2026-06-16 23:07:06 +02:00
DerGrumpf 297589362f Removed new nginx entry; fixed mautrix discord 2026-06-16 15:54:09 +02:00
DerGrumpf 9c3cb1f360 Added new host 2026-06-16 12:40:42 +02:00
DerGrumpf d8e6a816c9 Changed config 2026-06-16 12:17:21 +02:00
DerGrumpf 923cb64277 Merge branch 'main' of ssh://git.cyperpunk.de:12222/DerGrumpf/cyper-nix 2026-06-08 20:45:07 +02:00
DerGrumpf e9c223259b Added: nixpkgs-review 2026-06-08 20:45:01 +02:00
DerGrumpf b021b555eb Changed Shortcuts 2026-06-07 10:49:37 +02:00
DerGrumpf 59ebcab94f Changed Fonts 2026-06-06 21:07:45 +02:00
DerGrumpf 7a25ac669f Cleaned up darwin from noise; Moved overlays too a shared module 2026-06-06 21:04:49 +02:00
DerGrumpf 9f2dc8314a Finished: nixifyng floorp, tested and working, only bitwarden and stylus need to be manually configured 2026-05-31 18:26:59 +02:00
DerGrumpf aaf1a17b33 Removed: webcam.nix doesnt need it anymore 2026-05-31 16:52:14 +02:00
DerGrumpf 97f475f131 WIP: Nixifyng Floorp, Problems arise from setting Plugins on standard Enable; Solved: Obsidian Notes Vault now getting pulled as default 2026-05-31 16:17:47 +02:00
DerGrumpf 48eedcabd3 Removed: ToDos already done, Removed: Build VM Overrides for Server testing 2026-05-31 10:31:13 +02:00
DerGrumpf 0cf4401813 Moved: fonts management to home manager; Removed: dulicated fonts.nix for nixos & darwin configurations 2026-05-31 10:26:19 +02:00
DerGrumpf 888264a491 Fixed Package for Web live development 2026-05-31 10:05:42 +02:00
DerGrumpf c812ceb37f Added Vaultwarden Custom Theme -> Catppuccin Latte/Mocha 2026-05-31 09:54:39 +02:00
DerGrumpf 967bb17c28 Merge branch 'main' of ssh://git.cyperpunk.de:12222/DerGrumpf/cyper-nix 2026-05-31 09:06:31 +02:00
DerGrumpf c4e3b755ce Changed Overlays 2026-05-31 09:06:26 +02:00
DerGrumpf c335f105a5 WIP: Nixifyed Floorp Plugins, WIP: Created Custom Theme for Vaultwarden 2026-05-31 09:04:57 +02:00
DerGrumpf 289cc5f423 Removed Cinny Desktop for Floorp Web install 2026-05-31 05:39:40 +02:00
DerGrumpf 1ba87bb462 Added Meta Bridge; Exposed Grafana as widget 2026-05-27 23:22:24 +02:00
DerGrumpf d517e877f0 Added Secrets for discord 2026-05-27 22:06:56 +02:00
DerGrumpf e7267282b6 Changed Sketchybar Icons 2026-05-27 13:35:48 +02:00
DerGrumpf 93034af158 Changes Sketchybar 2026-05-27 10:31:04 +02:00
DerGrumpf 7f0bf6c219 Changed Hyprland from Hyprlang to Lua 2026-05-26 23:35:31 +02:00
DerGrumpf c344fbbe0e Merge branch 'main' of ssh://git.cyperpunk.de:12222/DerGrumpf/cyper-nix 2026-05-25 01:31:43 +02:00
DerGrumpf d84b2e882d WIP: Changed Hyprland from Hyprland to Lua 2026-05-25 01:31:36 +02:00
75 changed files with 26670 additions and 1344 deletions
+31
View File
@@ -0,0 +1,31 @@
name: CI
on:
push:
branches: ["main"]
pull_request:
jobs:
check:
runs-on: nix
env:
PATH: "/run/wrappers/bin:/nix/var/nix/profiles/default/bin:/run/current-system/sw/bin:/usr/bin:/bin"
NIXPKGS_ALLOW_UNFREE: "1"
steps:
- name: Checkout
run: git clone https://git.cyperpunk.de/DerGrumpf/cyper-nix.git .
- name: Format check
run: nix fmt -- --ci
- name: Nix flake check
run: nix flake check --impure
- name: Build NixOS configs (dry-run)
run: |
nix build .#nixosConfigurations.cyper-desktop.config.system.build.toplevel --dry-run
nix build .#nixosConfigurations.cyper-controller.config.system.build.toplevel --dry-run
nix build .#nixosConfigurations.cyper-proxy.config.system.build.toplevel --dry-run
nix build .#nixosConfigurations.cyper-node-1.config.system.build.toplevel --dry-run
nix build .#nixosConfigurations.cyper-node-2.config.system.build.toplevel --dry-run
+47
View File
@@ -0,0 +1,47 @@
name: Release ISOs
on:
workflow_run:
workflows: ["CI"]
types:
- completed
branches: ["main"]
jobs:
build-isos:
runs-on: nix
if: ${{ github.event.workflow_run.conclusion == 'success' }}
env:
NIXPKGS_ALLOW_UNFREE: "1"
steps:
- name: Checkout
run: git clone https://git.cyperpunk.de/DerGrumpf/cyper-nix.git .
- name: Build ISOs
run: |
nix build .#packages.x86_64-linux.cyper-desktop-iso --out-link result-desktop
nix build .#packages.x86_64-linux.cyper-controller-iso --out-link result-controller
nix build .#packages.x86_64-linux.cyper-proxy-iso --out-link result-proxy
nix build .#packages.x86_64-linux.cyper-node-1-iso --out-link result-node-1
nix build .#packages.x86_64-linux.cyper-node-2-iso --out-link result-node-2
- name: Create release and upload ISOs
run: |
TAG="iso-$(date +%Y%m%d-%H%M%S)"
COMMIT=$(git -C . rev-parse --short HEAD)
RELEASE=$(curl -s -X POST \
-H "Authorization: token ${{ secrets.CI_TOKEN }}" \
-H "Content-Type: application/json" \
-d "{\"tag_name\":\"${TAG}\",\"name\":\"ISOs ${TAG}\",\"body\":\"Automated ISO build from commit ${COMMIT}\"}" \
"https://git.cyperpunk.de/api/v1/repos/DerGrumpf/cyper-nix/releases")
RELEASE_ID=$(echo $RELEASE | grep -o '"id":[0-9]*' | head -1 | cut -d: -f2)
for result in result-desktop result-controller result-proxy result-node-1 result-node-2; do
iso=$(find $result -name "*.iso" | head -1)
curl -s -X POST \
-H "Authorization: token ${{ secrets.CI_TOKEN }}" \
-F "attachment=@${iso};filename=${result}.iso" \
"https://git.cyperpunk.de/api/v1/repos/DerGrumpf/cyper-nix/releases/${RELEASE_ID}/assets"
done
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

-9
View File
@@ -8,14 +8,8 @@
./settings.nix ./settings.nix
./homebrew.nix ./homebrew.nix
./yabai.nix ./yabai.nix
./fonts.nix
]; ];
home-manager.users.${primaryUser}.targets.darwin = {
linkApps.enable = true;
copyApps.enable = false;
};
# nix config # nix config
nix = { nix = {
settings = { settings = {
@@ -56,9 +50,6 @@
info.enable = false; # Skip info pages info.enable = false; # Skip info pages
}; };
nixpkgs.config = {
allowUnfree = true;
};
# homebrew installation manager # homebrew installation manager
nix-homebrew = { nix-homebrew = {
user = primaryUser; user = primaryUser;
+26 -25
View File
@@ -1,28 +1,28 @@
{ self, ... }: { self, primaryUser, ... }:
let
hmApps = app: "/Users/${primaryUser}/Applications/Home Manager Apps/${app}.app";
sysApps = app: "/System/Applications/${app}.app";
apps = app: "/Applications/${app}.app";
in
{ {
# touch ID for sudo
security.pam.services.sudo_local.touchIdAuth = true; security.pam.services.sudo_local.touchIdAuth = true;
# system defaults and preferences
system = { system = {
stateVersion = 6; stateVersion = 6;
configurationRevision = self.rev or self.dirtyRev or null; configurationRevision = self.rev or self.dirtyRev or null;
startup.chime = false; startup.chime = false;
activationScripts = { activationScripts.setWallpaper.text = ''
setWallpaper.text = ''
/usr/bin/osascript <<EOF /usr/bin/osascript <<EOF
tell application "System Events" tell application "System Events"
tell every desktop tell every desktop
set picture to "/Users/phil/Pictures/Wallpapers/Ghost_in_the_Shell.png" set picture to "/Users/${primaryUser}/Pictures/Wallpapers/Ghost_in_the_Shell.png"
end tell end tell
end tell end tell
EOF EOF
''; '';
};
defaults = { defaults = {
ActivityMonitor = { ActivityMonitor = {
IconType = 5; IconType = 5;
@@ -37,20 +37,21 @@
launchanim = true; launchanim = true;
mru-spaces = false; mru-spaces = false;
orientation = "left"; orientation = "left";
persistent-apps = [
{ app = "/Users/phil/Applications/Home Manager Apps/kitty.app"; }
{ app = "/Users/phil/Applications/Home Manager Apps/Vesktop.app"; }
{ app = "/Users/phil/Applications/Home Manager Apps/Spotify.app"; }
{ app = "/Users/phil/Applications/Home Manager Apps/Floorp.app"; }
{ app = "/Users/phil/Applications/Home Manager Apps/Obsidian.app"; }
{ app = "/Users/phil/Applications/Home Manager Apps/OpenSCAD.app"; }
{ app = "/Applications/okular.app"; }
{ app = "/Applications/Affinity.app"; }
{ app = "/System/Applications/Mail.app"; }
{ app = "/System/Applications/Launchpad.app"; }
];
show-recents = false; show-recents = false;
mineffect = "genie"; mineffect = "genie";
persistent-apps = map (app: { inherit app; }) [
(hmApps "kitty")
(hmApps "Vesktop")
(hmApps "Spotify")
(hmApps "Floorp")
(hmApps "Obsidian")
(hmApps "OpenSCAD")
(apps "okular")
(apps "Affinity")
(apps "Element")
(sysApps "Mail")
(sysApps "Launchpad")
];
}; };
loginwindow = { loginwindow = {
@@ -59,11 +60,11 @@
}; };
finder = { finder = {
AppleShowAllFiles = true; # hidden files AppleShowAllFiles = true;
AppleShowAllExtensions = true; # file extensions AppleShowAllExtensions = true;
_FXShowPosixPathInTitle = true; # title bar full path _FXShowPosixPathInTitle = true;
ShowPathbar = true; # breadcrumb nav at bottom ShowPathbar = true;
ShowStatusBar = true; # file count & disk space ShowStatusBar = true;
}; };
NSGlobalDomain = { NSGlobalDomain = {
+1 -64
View File
@@ -1,4 +1,4 @@
{ pkgs, ... }: { _: {
services = { services = {
yabai = { yabai = {
enable = true; enable = true;
@@ -38,68 +38,5 @@
mouse_drop_action = "swap"; mouse_drop_action = "swap";
}; };
}; };
# skhd = {
# enable = true;
# skhdConfig = ''
# Application Bindings
# cmd - q : open -a kitty
# cmd - e : ${pkgs.kitty}/bin/kitty yazi
# cmd - o : open -a "Obsidian"
# cmd - i : open -a "Floorp"
# cmd - g : open -a "Mail"
# Window Management (using yabai if installed, otherwise basic macOS)
#cmd + shift - c : yabai -m window --close || osascript -e 'tell application "System Events" to keystroke "w" using command down'
#cmd + shift - v : yabai -m window --toggle float
# Focus windows (vim-like)
# cmd - left : yabai -m window --focus west
# cmd - right : yabai -m window --focus east
# cmd - up : yabai -m window --focus north
# cmd - down : yabai -m window --focus south
# Move windows to spaces (workspaces)
# cmd + shift - 1 : yabai -m window --space 1
# cmd + shift - 2 : yabai -m window --space 2
# cmd + shift - 3 : yabai -m window --space 3
# cmd + shift - 4 : yabai -m window --space 4
# cmd + shift - 5 : yabai -m window --space 5
# cmd + shift - 6 : yabai -m window --space 6
# cmd + shift - 7 : yabai -m window --space 7
# cmd + shift - 8 : yabai -m window --space 8
# cmd + shift - 9 : yabai -m window --space 9
# cmd + shift - 0 : yabai -m window --space 10
# Switch to spaces (workspaces)
# cmd - 1 : yabai -m space --focus 1
# cmd - 2 : yabai -m space --focus 2
# cmd - 3 : yabai -m space --focus 3
# cmd - 4 : yabai -m space --focus 4
# cmd - 5 : yabai -m space --focus 5
# cmd - 6 : yabai -m space --focus 6
# cmd - 7 : yabai -m space --focus 7
# cmd - 8 : yabai -m space --focus 8
# cmd - 9 : yabai -m space --focus 9
# cmd - 0 : yabai -m space --focus 10
# Screenshot (macOS native)
# cmd - z : screencapture -i ~/Pictures/Screenshots/$(date +%s).png
# cmd - u : screencapture ~/Pictures/Screenshots/$(date +%s).png
# Launcher (using Raycast or Spotlight as Rofi alternative)
# cmd - r : open -a "Raycast" || osascript -e 'tell application "System Events" to keystroke space using command down'
# Lock screen
# cmd - m : pmset displaysleepnow
# Toggle layout (if using yabai)
# cmd - j : yabai -m space --layout $(yabai -m query --spaces --space | jq -r 'if .type == "bsp" then "float" else "bsp" end')
# cmd - p : yabai -m window --toggle split
# Reload skhd config
# cmd + shift - r : skhd --reload
# '';
# };
}; };
} }
Generated
+129 -71
View File
@@ -20,11 +20,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1777499565, "lastModified": 1780756231,
"narHash": "sha256-nU55VWk99Pn1QzQDDjFISocC4SgDZ3Xp+zb6ji3JclM=", "narHash": "sha256-tXQxKdG5716uB9/LIkLQqQwHKf5mRSpHoZhz3lyI2Cg=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "aquamarine", "repo": "aquamarine",
"rev": "813c1e8981893c11e118b19c125d6bc282f51765", "rev": "6ecde03f47172753fe5a2f334f9d3facfb7e6784",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -36,16 +36,16 @@
"brew-src": { "brew-src": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1776478798, "lastModified": 1781226006,
"narHash": "sha256-ERStG27tf83VbCfYMxtDSs+sa8FUMJ/3jSu/QfX9rKE=", "narHash": "sha256-w4ZTuOnhYiDxjaynrMTASzp802QblBWmo3wpB8wVN4Y=",
"owner": "Homebrew", "owner": "Homebrew",
"repo": "brew", "repo": "brew",
"rev": "3aae056b8d072624255bc8fd27febb7f327b2265", "rev": "109191be4988470b51a60a5ef1998520aa24c01b",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "Homebrew", "owner": "Homebrew",
"ref": "5.1.7", "ref": "6.0.1",
"repo": "brew", "repo": "brew",
"type": "github" "type": "github"
} }
@@ -57,11 +57,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1777734189, "lastModified": 1781255309,
"narHash": "sha256-kbIhdhDPaTP6gxAPkcRYeB+cqPFDpTM/bnw+m+26vkI=", "narHash": "sha256-n2P5xkAYGylrJ3feu7L6uaCUw/+jW8rk+HO127gDbFA=",
"owner": "catppuccin", "owner": "catppuccin",
"repo": "nix", "repo": "nix",
"rev": "e68cf5deaf1a7afed2e548835dba2ae99f5a3ccb", "rev": "036c78ea4cd8a42c8546c6316a944fd7d59d4341",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -77,11 +77,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1777780666, "lastModified": 1781761792,
"narHash": "sha256-8wURyQMdDkGUarSTKOGdCuFfYiwa3HbzwscUfn3STDE=", "narHash": "sha256-rCPytmKNjctLloB6UgK5CRrHSwV4b0ygxtJLPPp8R14=",
"owner": "lnl7", "owner": "lnl7",
"repo": "nix-darwin", "repo": "nix-darwin",
"rev": "8c62fba0854ba15c8917aed18894dbccb48a3777", "rev": "a1fa429e945becaf60468600daf649be4ba0350c",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -125,11 +125,11 @@
"nixpkgs-lib": "nixpkgs-lib" "nixpkgs-lib": "nixpkgs-lib"
}, },
"locked": { "locked": {
"lastModified": 1777678872, "lastModified": 1778716662,
"narHash": "sha256-EPIFsulyon7Z1vLQq5Fk64GR8L7cQsT+IPhcsukVbgk=", "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
"owner": "hercules-ci", "owner": "hercules-ci",
"repo": "flake-parts", "repo": "flake-parts",
"rev": "5250617bffd85403b14dbf43c3870e7f255d2c16", "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -146,11 +146,32 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1777932387, "lastModified": 1778716662,
"narHash": "sha256-nUYVPiqrzr36ThiQOAr5MKeGHDBSDM3OFWkz0uDjOvc=", "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
"owner": "hercules-ci", "owner": "hercules-ci",
"repo": "flake-parts", "repo": "flake-parts",
"rev": "71a3a77326609675e9f8b51084cf23d5d1945899", "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"flake-parts_3": {
"inputs": {
"nixpkgs-lib": [
"nur",
"nixpkgs"
]
},
"locked": {
"lastModified": 1733312601,
"narHash": "sha256-4pDvzqnegAfRkPwO3wmwBhVi/Sye1mzps0zHWYnP88c=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "205b12d8b7cd4802fbcb8e8ef6a0f1408781a4f9",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -188,11 +209,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1778144356, "lastModified": 1781788787,
"narHash": "sha256-dGM+QCstz/DyLB68+JK5GWyMx4QSqmOJEVgZmy63d/g=", "narHash": "sha256-YqlTCRRhGvNjcJejPeMuHrYQ/TVhOO2MV/nEGMWb8nk=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "e4419d3123b780d5f4c0bceeace450424387638c", "rev": "d456f483f157d4b706416005da226234b9c116ff",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -293,19 +314,17 @@
"hyprutils": "hyprutils_2", "hyprutils": "hyprutils_2",
"hyprwayland-scanner": "hyprwayland-scanner", "hyprwayland-scanner": "hyprwayland-scanner",
"hyprwire": "hyprwire", "hyprwire": "hyprwire",
"nixpkgs": [ "nixpkgs": "nixpkgs",
"nixpkgs"
],
"pre-commit-hooks": "pre-commit-hooks", "pre-commit-hooks": "pre-commit-hooks",
"systems": "systems_2", "systems": "systems_2",
"xdph": "xdph" "xdph": "xdph"
}, },
"locked": { "locked": {
"lastModified": 1778199997, "lastModified": 1781796010,
"narHash": "sha256-vmCYnK7/iRQGWj+s0l3+cf/IVoUcCTrlFtgUCTwRdjU=", "narHash": "sha256-bIqjZgUfp3vba/C1UJLVqTo8zdpfqMDvuwWrHmqDWm4=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "Hyprland", "repo": "Hyprland",
"rev": "de9f8dc9831d921cd1ee30d5d14f45f0e345a8ca", "rev": "ae1690c2138313d988c81f5c25a9d0b6fadfd3b1",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -377,11 +396,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1777937752, "lastModified": 1781442805,
"narHash": "sha256-QDc78DC6xhWKpPJzsPEJBBFYpTb+g4kO6+ydRYLU4f4=", "narHash": "sha256-Kt56e6Bq2sfqN8yq1RHsS6z+8QKCZelmhaeQQRtZyqU=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprland-plugins", "repo": "hyprland-plugins",
"rev": "b6e080577daf6575b95e6733dd2e2aef714bcf10", "rev": "1f90c674d51a1ef83c725cd6d02280b4c969fdf7",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -561,11 +580,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1778179779, "lastModified": 1780251518,
"narHash": "sha256-Ri6rVf54CRD3aISHLhSY6H4tBScVjm9ebkv7rF2lcZM=", "narHash": "sha256-fG9xbb1SOAAJ+2kJRakp3ch+BmA/3dEg/K3PoAZTKkw=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprutils", "repo": "hyprutils",
"rev": "3e170e5ad010602671f5f25b327e8bdb8fdd532c", "rev": "40ede2e7bdec80ba5d4c443160d905e9f841ae5f",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -615,11 +634,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1777388329, "lastModified": 1778410714,
"narHash": "sha256-40YxVGF2rA9iH3D7am5fy4EOSBbMgpJtJ9yhl0Cx+qI=", "narHash": "sha256-o6RzFj4nJXaPRY7EM01siuCQeT41RfwwmcmFQqwFJJg=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprwire", "repo": "hyprwire",
"rev": "04be2897e05f9b271d532b5ae56ca088d2eeac02", "rev": "85148a8e612808cf5ddb25d0b3c5840f3498a7dc",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -633,11 +652,11 @@
"brew-src": "brew-src" "brew-src": "brew-src"
}, },
"locked": { "locked": {
"lastModified": 1777250621, "lastModified": 1781389246,
"narHash": "sha256-WynkkG0hdZ5niYPJUbVg7oMfu8MVwGGzKZ6lKmfa+O8=", "narHash": "sha256-ORqLAo/hoJdsZC7UPAuEHev6S0+XIqKEC7vjo5prz1k=",
"owner": "zhaofengli", "owner": "zhaofengli",
"repo": "nix-homebrew", "repo": "nix-homebrew",
"rev": "aeb2069920742d0d6570089e8b3b8620050bacf2", "rev": "de7953a08ed4bb9245be043e468561c17b89130d",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -656,11 +675,11 @@
"nixpkgs-nixcord": "nixpkgs-nixcord" "nixpkgs-nixcord": "nixpkgs-nixcord"
}, },
"locked": { "locked": {
"lastModified": 1778202527, "lastModified": 1781775854,
"narHash": "sha256-Yn0A4iYFtVNYIf1IXfT1R7gYNbJ5UEqvExii2aK4VAY=", "narHash": "sha256-0eb1+zKSTwgD3qsBm7UiuRabahHQNkTP94Z/s3nMK60=",
"owner": "kaylorben", "owner": "kaylorben",
"repo": "nixcord", "repo": "nixcord",
"rev": "471c6da493cb642bbc941a4bc5c10c22595ed013", "rev": "b92ceb7923c87dfcfcf84415407b0ca63e17548b",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -707,15 +726,15 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1777954456, "lastModified": 1780749050,
"narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=", "narHash": "sha256-3av0pIjlOWQ6rDbNOmpUSvbNnJkGORQKKjb4LtCZsIY=",
"owner": "nixos", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1", "rev": "a799d3e3886da994fa307f817a6bc705ae538eeb",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nixos", "owner": "NixOS",
"ref": "nixos-unstable", "ref": "nixos-unstable",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
@@ -738,16 +757,32 @@
}, },
"nixpkgs-nixcord": { "nixpkgs-nixcord": {
"locked": { "locked": {
"lastModified": 1777428379, "lastModified": 1780453794,
"narHash": "sha256-ypxFOeDz+CqADEQNL72haqGjvZQdBR5Vc7pyx2JDttI=", "narHash": "sha256-bXMRa9VTsHSPXL4Cw8R6JJLQeY3Y/IP4+YJCYVmQ7FY=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "755f5aa91337890c432639c60b6064bb7fe67769", "rev": "6b316287bae2ee04c9b93c8c858d930fd07d7338",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "NixOS", "owner": "NixOS",
"ref": "nixos-25.11", "ref": "nixos-26.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1781577229,
"narHash": "sha256-lrp67w8AulE9Ks53n27I45ADSzbOCn4H+CNW1Ck8B+8=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "567a49d1913ce81ac6e9582e3553dd90a955875f",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
@@ -761,11 +796,11 @@
"systems": "systems_3" "systems": "systems_3"
}, },
"locked": { "locked": {
"lastModified": 1777991353, "lastModified": 1781713417,
"narHash": "sha256-DFwjggMV+nzCZpwK6Obxj9F+P59rbLVowGqHETfctBk=", "narHash": "sha256-Kaj44jTNmnaFhKrcADx8nXmUYPa7l2HYfb7m6lEPy7Q=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nixvim", "repo": "nixvim",
"rev": "7986a276960b4dfaed9bb2c3c438b5ba71ae08f1", "rev": "caee4e5d4161778815f522d9ea1c9e3dc42462b7",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -774,6 +809,27 @@
"type": "github" "type": "github"
} }
}, },
"nur": {
"inputs": {
"flake-parts": "flake-parts_3",
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1781800183,
"narHash": "sha256-NcRZr/JQiAvqC2qCyMxcfx/98Hf1epwdtjcbwKHeMf8=",
"owner": "nix-community",
"repo": "NUR",
"rev": "0559d992b12ee209570bb325d79e90007b13da52",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "NUR",
"type": "github"
}
},
"pre-commit-hooks": { "pre-commit-hooks": {
"inputs": { "inputs": {
"flake-compat": "flake-compat", "flake-compat": "flake-compat",
@@ -784,11 +840,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1776796298, "lastModified": 1778507602,
"narHash": "sha256-PcRvlWayisPSjd0UcRQbhG8Oqw78AcPE6x872cPRHN8=", "narHash": "sha256-kTwur1wV+01SdqskVMSo6JMEpg71ps3HpbFY2GsflKs=",
"owner": "cachix", "owner": "cachix",
"repo": "git-hooks.nix", "repo": "git-hooks.nix",
"rev": "3cfd774b0a530725a077e17354fbdb87ea1c4aad", "rev": "61ab0e80d9c7ab14c256b5b453d8b3fb0189ba0a",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -808,8 +864,9 @@
"nix-homebrew": "nix-homebrew", "nix-homebrew": "nix-homebrew",
"nixcord": "nixcord", "nixcord": "nixcord",
"nixos-generators": "nixos-generators", "nixos-generators": "nixos-generators",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs_2",
"nixvim": "nixvim", "nixvim": "nixvim",
"nur": "nur",
"sops-nix": "sops-nix", "sops-nix": "sops-nix",
"spicetify-nix": "spicetify-nix" "spicetify-nix": "spicetify-nix"
} }
@@ -821,11 +878,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1777944972, "lastModified": 1780547341,
"narHash": "sha256-VfGRo1qTBKOe3s2gOv8LSoA6Fk19PvBlwQ1ECN0Evn8=", "narHash": "sha256-Gq8KNx5A7hBB3uGJaj6eQfLDIz5YdLu92gqBcvHvoUo=",
"owner": "Mic92", "owner": "Mic92",
"repo": "sops-nix", "repo": "sops-nix",
"rev": "c591bf665727040c6cc5cb409079acb22dcce33c", "rev": "9ed65852b6257fbeae4355bc24ecfea307ca759a",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -842,11 +899,11 @@
"systems": "systems_4" "systems": "systems_4"
}, },
"locked": { "locked": {
"lastModified": 1777789800, "lastModified": 1781425310,
"narHash": "sha256-XHCvLGu/bEEZRzXVKFu1i+2YB102Nr00n8e7xrzsfVs=", "narHash": "sha256-GTBka4Df/ZOacmisI/DI2LICyNChEqn/giah83LucdM=",
"owner": "Gerg-L", "owner": "Gerg-L",
"repo": "spicetify-nix", "repo": "spicetify-nix",
"rev": "d0e921cc48aab6137d203a3eab19601dc2bdc0c3", "rev": "aeaf7c81a45d3761da61cb05bfc370ac6d1b0441",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -887,15 +944,16 @@
}, },
"systems_3": { "systems_3": {
"locked": { "locked": {
"lastModified": 1681028828, "lastModified": 1774449309,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", "narHash": "sha256-brhZ8DmuGtzkCYHJg4HEd602amKm89Y9ytsFZ5uWD1w=",
"owner": "nix-systems", "owner": "nix-systems",
"repo": "default", "repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", "rev": "c29398b59d2048c4ab79345812849c9bd15e9150",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nix-systems", "owner": "nix-systems",
"ref": "future-26.11",
"repo": "default", "repo": "default",
"type": "github" "type": "github"
} }
@@ -943,11 +1001,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1777585783, "lastModified": 1780133819,
"narHash": "sha256-JTeWRy42VElroJ0rVdZuVXSoTLsx+NzQfGPKMbtn3SU=", "narHash": "sha256-0YPKIY3dlnR7SPq7Z8ekFVvzFsfeiAtEj+QUI3KHrlI=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "xdg-desktop-portal-hyprland", "repo": "xdg-desktop-portal-hyprland",
"rev": "fa50d6fbaff8f42c61071b87b034a90d82a33558", "rev": "4a170c0ba96fd37374f93d8f91c9ed91814828ac",
"type": "github" "type": "github"
}, },
"original": { "original": {
+83 -26
View File
@@ -16,10 +16,15 @@
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
# NIX User Repositorys
nur = {
url = "github:nix-community/NUR";
inputs.nixpkgs.follows = "nixpkgs";
};
# declarative Hyprland # declarative Hyprland
hyprland = { hyprland = {
url = "github:hyprwm/Hyprland"; url = "github:hyprwm/Hyprland";
inputs.nixpkgs.follows = "nixpkgs";
}; };
hyprland-plugins = { hyprland-plugins = {
@@ -85,10 +90,66 @@
hyprland, hyprland,
sops-nix, sops-nix,
nixos-generators, nixos-generators,
nur,
... ...
}@inputs: }@inputs:
let let
primaryUser = "phil"; primaryUser = "phil";
mkIso =
{
hostName,
isDarwin ? false,
isServer ? false,
}:
nixos-generators.nixosGenerate {
system = "x86_64-linux";
format = "iso";
specialArgs = {
inherit
inputs
primaryUser
self
hostName
isDarwin
isServer
;
};
modules = [
{
nixpkgs.overlays = [
inputs.nur.overlays.default
(import ./overlays { inherit (inputs) nur; })
];
}
{ nixpkgs.config.allowUnfree = true; }
{ nixpkgs.hostPlatform = "x86_64-linux"; }
{ networking.hostName = hostName; }
./hosts/${hostName}/configuration.nix
./nixos
inputs.sops-nix.nixosModules.sops
inputs.home-manager.nixosModules.home-manager
{
home-manager = {
extraSpecialArgs = {
inherit
inputs
primaryUser
self
hostName
isDarwin
isServer
;
};
users.${primaryUser} = import ./home;
backupFileExtension = "backup";
useGlobalPkgs = true;
useUserPackages = true;
};
}
];
};
mkSystem = mkSystem =
{ {
hostName, hostName,
@@ -113,6 +174,12 @@
sharedModules = [ sharedModules = [
{ networking.hostName = hostName; } { networking.hostName = hostName; }
{
nixpkgs = {
overlays = [ (import ./overlays { inherit (inputs) nur; }) ];
config.allowUnfree = true;
};
}
./hosts/${hostName}/configuration.nix ./hosts/${hostName}/configuration.nix
inputs.sops-nix.${platformModuleSet}.sops inputs.sops-nix.${platformModuleSet}.sops
inputs.home-manager.${platformModuleSet}.home-manager inputs.home-manager.${platformModuleSet}.home-manager
@@ -120,7 +187,7 @@
home-manager = { home-manager = {
extraSpecialArgs = sharedSpecialArgs; extraSpecialArgs = sharedSpecialArgs;
users.${primaryUser} = import ./home; users.${primaryUser} = import ./home;
backupFileExtension = "backup"; backupFileExtension = "hm-backup";
useGlobalPkgs = true; useGlobalPkgs = true;
useUserPackages = true; useUserPackages = true;
}; };
@@ -184,36 +251,26 @@
isDarwin = true; isDarwin = true;
}; };
# NEW: flashable image for cyper-controller packages.x86_64-linux = {
packages.x86_64-linux.cyper-controller-image = nixos-generators.nixosGenerate { cyper-desktop-iso = mkIso { hostName = "cyper-desktop"; };
system = "x86_64-linux"; cyper-controller-iso = mkIso {
format = "raw-efi";
specialArgs = {
inherit inputs primaryUser self;
hostName = "cyper-controller"; hostName = "cyper-controller";
isDarwin = false;
isServer = true; isServer = true;
}; };
modules = [ cyper-proxy-iso = mkIso {
{ nixpkgs.hostPlatform = "x86_64-linux"; } hostName = "cyper-proxy";
{ networking.hostName = "cyper-controller"; }
./hosts/cyper-controller/configuration.nix
./nixos
inputs.sops-nix.nixosModules.sops
inputs.home-manager.nixosModules.home-manager
{
home-manager = {
extraSpecialArgs = {
inherit inputs primaryUser self;
hostName = "cyper-controller";
isDarwin = false;
isServer = true; isServer = true;
}; };
users.${primaryUser} = import ./home; cyper-node-1-iso = mkIso {
backupFileExtension = "backup"; hostName = "cyper-node-1";
isServer = true;
}; };
} cyper-node-2-iso = mkIso {
]; hostName = "cyper-node-2";
isServer = true;
}; };
}; };
formatter.x86_64-linux = nixpkgs.legacyPackages.x86_64-linux.nixfmt-tree;
};
} }
+4 -2
View File
@@ -8,7 +8,8 @@
imports = [ inputs.catppuccin.homeModules.catppuccin ]; imports = [ inputs.catppuccin.homeModules.catppuccin ];
catppuccin = { catppuccin = {
enable = false; enable = true;
autoEnable = false;
accent = "sky"; accent = "sky";
flavor = "mocha"; flavor = "mocha";
eza.enable = true; eza.enable = true;
@@ -31,7 +32,7 @@
enable = true; enable = true;
accent = "sapphire"; accent = "sapphire";
}; };
hyprland = lib.mkIf (!isDarwin) { enable = true; }; hyprland = lib.mkIf (!isDarwin) { enable = false; };
hyprlock = lib.mkIf (!isDarwin) { hyprlock = lib.mkIf (!isDarwin) {
enable = true; enable = true;
useDefaultConfig = false; useDefaultConfig = false;
@@ -49,5 +50,6 @@
enable = true; enable = true;
apply = true; apply = true;
}; };
opencode.enable = true;
}; };
} }
+6 -1
View File
@@ -17,12 +17,16 @@
./xdg.nix ./xdg.nix
./neovim ./neovim
./python.nix ./python.nix
./fonts.nix
inputs.sops-nix.homeManagerModules.sops inputs.sops-nix.homeManagerModules.sops
] ]
++ lib.optionals (!isDarwin && !isServer) [ ++ lib.optionals (!isDarwin && !isServer) [
./desktop ./desktop
./catppuccin.nix ./catppuccin.nix
] ]
++ lib.optionals (!isDarwin) [
./opencode.nix
]
++ lib.optionals isDarwin [ ++ lib.optionals isDarwin [
./desktop/sketchybar ./desktop/sketchybar
./catppuccin.nix ./catppuccin.nix
@@ -30,12 +34,13 @@
++ lib.optionals (!isServer) [ ++ lib.optionals (!isServer) [
./nixcord.nix ./nixcord.nix
./spicetify.nix ./spicetify.nix
./floorp.nix ./floorp
./obsidian.nix ./obsidian.nix
]; ];
home = { home = {
username = primaryUser; username = primaryUser;
enableNixpkgsReleaseCheck = false;
stateVersion = "26.05"; stateVersion = "26.05";
sessionVariables = lib.mkIf (!isDarwin && !isServer) { sessionVariables = lib.mkIf (!isDarwin && !isServer) {
GROQ_API_KEY = config.sops.secrets.GROQ_API_KEY.path; GROQ_API_KEY = config.sops.secrets.GROQ_API_KEY.path;
+1 -7
View File
@@ -1,5 +1,4 @@
{ pkgs, ... }: _: {
{
imports = [ imports = [
./hyprland ./hyprland
./rofi ./rofi
@@ -10,11 +9,6 @@
_module.args.compositor = "hyprland"; _module.args.compositor = "hyprland";
home.packages = with pkgs; [
waypaper
awww
onlyoffice-desktopeditors
];
home.file.".config/waypaper/config.ini".source = ./waypaper.ini; home.file.".config/waypaper/config.ini".source = ./waypaper.ini;
programs = { programs = {
+5 -267
View File
@@ -1,16 +1,5 @@
{ inputs, pkgs, ... }: { pkgs, ... }:
let
super = "SUPER";
terminal = "kitty";
fileManager = "yazi";
theme = "-theme $HOME/.config/rofi/custom.rasi";
menu = "rofi -show drun ${theme}";
filebrowser = "rofi -show filebrowser ${theme}";
power = "rofi -show p -modi p:rofi-power-menu -theme $HOME/.config/rofi/power.rasi";
apps = "rofi -show window ${theme}";
in
{ {
imports = [ imports = [
./hypridle.nix ./hypridle.nix
./hyprlock.nix ./hyprlock.nix
@@ -30,8 +19,10 @@ in
systemd.user.targets.hyprland-session.Unit.Wants = [ "xdg-desktop-autostart.target" ]; systemd.user.targets.hyprland-session.Unit.Wants = [ "xdg-desktop-autostart.target" ];
services.awww.enable = true;
wayland.windowManager.hyprland = { wayland.windowManager.hyprland = {
package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; package = null;
enable = true; enable = true;
xwayland.enable = true; xwayland.enable = true;
@@ -42,259 +33,6 @@ in
enableXdgAutostart = false; enableXdgAutostart = false;
}; };
plugins = with inputs.hyprland-plugins.packages.${pkgs.stdenv.hostPlatform.system}; [ extraConfig = builtins.readFile ./hyprland-scrolling.lua;
#hyprbars
# hyprexpo
];
settings = {
env = [
"NIXOS_OZONE_WL,1"
"MOZ_ENABLE_WAYLAND,1"
"MOZ_WEBRENDER,1"
"_JAVA_AWT_WM_NONREPARENTING,1"
"QT_WAYLAND_DISABLE_WINDOWDECORATION,1"
"QT_QPA_PLATFORM,wayland"
"SDL_VIDEODRIVER,wayland"
"GDK_BACKEND,wayland,x11"
"XCURSOR_SIZE,24"
"EDITOR,nvim"
"GSK_RENDERER,gl"
"HYPRCURSOR_THEME,catppuccin-mocha-dark"
"HYPRCURSOR_SIZE,24"
"XCURSOR_THEME,catppuccin-mocha-dark"
"XCURSOR_SIZE,24"
];
debug = {
disable_logs = false;
enable_stdout_logs = false;
};
monitor = [
"DP-1, 1920x1080@60, 1920x0, 1"
"HDMI-A-2, 1920x1080@60, 0x0, 1"
];
input = {
kb_layout = "de";
kb_variant = "mac";
kb_options = "apple:fn_lock";
repeat_rate = 50;
repeat_delay = 300;
accel_profile = "flat";
follow_mouse = 1;
mouse_refocus = false;
sensitivity = 0; # -1.0 to 1.0, 0 means no modification.
numlock_by_default = 1;
touchpad = {
natural_scroll = true;
tap-to-click = true;
};
};
general = {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
gaps_in = 2;
gaps_out = 0;
border_size = 4;
"col.active_border" = "$green";
"col.inactive_border" = "$red";
layout = "dwindle";
# Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
allow_tearing = false;
};
decoration = {
rounding = 1;
shadow = {
enabled = false;
range = 16;
render_power = 4;
color = "$green";
color_inactive = "$red";
};
blur = {
enabled = false;
size = 1;
passes = 3;
new_optimizations = 1;
noise = 4.0e-2;
};
};
animations = {
enabled = "yes";
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"
];
};
# layerrule = [
# "ignorezero,notifications"
# "ignorezero,rofi"
# ];
dwindle = {
preserve_split = "yes";
};
# gestures = {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
# workspace_swipe = true;
# workspace_swipe_fingers = 3;
# workspace_swipe_distance = 300;
# workspace_swipe_invert = false;
# workspace_swipe_cancel_ratio = 0.5;
# };
misc = {
force_default_wallpaper = 0;
disable_hyprland_logo = true;
disable_splash_rendering = true;
mouse_move_enables_dpms = true;
key_press_enables_dpms = true;
# vfr = true;
vrr = 0;
};
device = {
name = "usb-optical-mouse-";
sensitivity = 0;
};
#deprecated
# windowrulev2 = [
# "suppressevent maximize, class:.*"
# "float, class:^(com.obsproject.Studio)$"
# "size 1280 800, class:^(com.obsproject.Studio)$"
# "float, class:^(xdg-desktop-portal-gtk)$"
# "center, class:^(xdg-desktop-portal-gtk)$"
# ];
# windowrule = [
# "opacity 0.0 override, class:^(xwaylandvideobridge)$"
# "noanim, class:^(xwaylandvideobridge)$"
# "noinitialfocus, class:^(xwaylandvideobridge)$"
# "maxsize 1 1, class:^(xwaylandvideobridge)$"
# "noblur, class:^(xwaylandvideobridge)$"
# "nofocus, class:^(xwaylandvideobridge)$"
# "noblur, class:^(org\\.gnome\\.|io\\.github\\.|org\\.gtk\\.)"
# ];
exec-once = [
"awww-daemon --no-cache & disown"
"awww img ~/Pictures/Wallpapers/Ghost_in_the_Shell.png"
"waybar &"
];
# Keybindings
bind = [
# Application Bindings
"${super}, Q, exec, ${terminal}"
"${super}, E, exec, ${fileManager}"
"${super}, O, exec, obsidian"
"${super}, I, exec, floorp"
"${super}, G, exec, thunderbird"
", XF86Mail, exec, thunderbird"
"${super}, N, exec, nautilus"
", XF86Search, exec, nautilus"
# Lock Screen
"${super}, M, exit, "
# Rofi bindings
"${super}, F, exec, ${filebrowser}"
"${super}, A, exec, ${apps}"
", Menu, exec, ${apps}"
"${super}, R, exec, ${menu}"
", XF86LaunchA, exec, ${menu}"
"${super}, S, exec, ${power}"
", XF86LaunchB, exec, ${power}"
# Move focus with mainMod + arrow keys
"${super}, left, movefocus, l"
"${super}, right, movefocus, r"
"${super}, up, movefocus, u"
"${super}, down, movefocus, d"
# Window Modifiers
"${super}, P, pseudo, " # dwindle
# "${super}, J, togglesplit, " # dwindle doenst exist
"${super}, V, togglefloating, " # dwindle
"${super}, C, killactive, "
# Switch workspaces with mainMod + [0-9]
"${super}, 1, workspace, 1"
"${super}, 2, workspace, 2"
"${super}, 3, workspace, 3"
"${super}, 4, workspace, 4"
"${super}, 5, workspace, 5"
"${super}, 6, workspace, 6"
"${super}, 7, workspace, 7"
"${super}, 8, workspace, 8"
"${super}, 9, workspace, 9"
"${super}, 0, workspace, 10"
# Move active window to a workspace with mainMod + SHIFT + [0-9]
"${super} SHIFT, 1, movetoworkspace, 1"
"${super} SHIFT, 2, movetoworkspace, 2"
"${super} SHIFT, 3, movetoworkspace, 3"
"${super} SHIFT, 4, movetoworkspace, 4"
"${super} SHIFT, 5, movetoworkspace, 5"
"${super} SHIFT, 6, movetoworkspace, 6"
"${super} SHIFT, 7, movetoworkspace, 7"
"${super} SHIFT, 8, movetoworkspace, 8"
"${super} SHIFT, 9, movetoworkspace, 9"
"${super} SHIFT, 0, movetoworkspace, 10"
# Example special workspace (scratchpad)
#"${super}, S, togglespecialworkspace, magic"
"${super} SHIFT, S, movetoworkspace, special:magic"
# Scroll through existing workspaces with mainMod + scroll
"${super}, mouse_down, workspace, e+1"
"${super}, mouse_up, workspace, e-1"
# Screenshot
''${super}, Z, exec, grim -g "$(slurp)" $HOME/Pictures/Screenshots/$(date +'%s_grim.png')''
"${super}, U, exec, grim $HOME/Pictures/Screenshots/$(date +'%s_grim.png')"
];
bindl = [
#", XF86AudioMute, exec, amixer set Master toggle
", XF86AudioMute, exec, pamixer -t"
", XF86AudioPlay, exec, playerctl play-pause" # the stupid key is called play , but it toggles
", XF86AudioNext, exec, playerctl next"
", XF86AudioPrev, exec, playerctl previous"
];
bindle = [
# Multi Media Control
", XF86AudioRaiseVolume, exec, pamixer -i 5"
", XF86AudioLowerVolume, exec, pamixer -d 5"
", XF86MonBrightnessUp, exec, brightnessctl set +5%"
", XF86MonBrightnessDown, exec, brightnessctl set 5%-"
];
bindm = [
"${super}, mouse:272, movewindow"
"${super}, mouse:273, resizewindow"
];
};
}; };
} }
@@ -0,0 +1,310 @@
-- hyprland.lua — migrated from hyprlang for Hyprland 0.55+
-- https://wiki.hypr.land/Configuring/Start/
-- ── Variables ────────────────────────────────────────────────────────────────
local super = "SUPER"
local terminal = "kitty"
local fileManager = "yazi"
local theme = "-theme $HOME/.config/rofi/custom.rasi"
local menu = "rofi -show drun " .. theme
local filebrowser = "rofi -show filebrowser " .. theme
local power = "rofi -show p -modi p:rofi-power-menu -theme $HOME/.config/rofi/power.rasi"
local apps = "rofi -show window " .. theme
local screenshot = "$HOME/Pictures/Screenshots/$(date +'%s_grim.png')"
-- ── Helpers ───────────────────────────────────────────────────────────────────
-- Bind a list of { key, action [, opts] } entries
local function bind_all(list)
for _, b in ipairs(list) do
hl.bind(b[1], b[2], b[3])
end
end
-- Bind a list of { key, cmd [, opts] } entries as exec_cmd actions
local function bind_exec(list)
for _, b in ipairs(list) do
hl.bind(b[1], hl.dsp.exec_cmd(b[2]), b[3])
end
end
-- Bind a list of { key, layout_msg } entries as layout actions
local function bind_layout(list)
for _, b in ipairs(list) do
hl.bind(b[1], hl.dsp.layout(b[2]))
end
end
-- ── Monitors ─────────────────────────────────────────────────────────────────
local monitors = {
{ output = "DP-1", mode = "1920x1080@60", position = "1920x0", scale = 1 },
{ output = "HDMI-A-2", mode = "1920x1080@60", position = "0x0", scale = 1 },
}
for _, m in ipairs(monitors) do
hl.monitor(m)
end
-- ── Environment ──────────────────────────────────────────────────────────────
local env_vars = {
NIXOS_OZONE_WL = "1",
MOZ_ENABLE_WAYLAND = "1",
MOZ_WEBRENDER = "1",
_JAVA_AWT_WM_NONREPARENTING = "1",
QT_WAYLAND_DISABLE_WINDOWDECORATION = "1",
QT_QPA_PLATFORM = "wayland",
SDL_VIDEODRIVER = "wayland",
GDK_BACKEND = "wayland,x11",
XCURSOR_SIZE = "24",
XCURSOR_THEME = "catppuccin-mocha-dark",
EDITOR = "nvim",
GSK_RENDERER = "gl",
HYPRCURSOR_THEME = "catppuccin-mocha-dark",
HYPRCURSOR_SIZE = "24",
}
for k, v in pairs(env_vars) do
hl.env(k, v)
end
-- ── Autostart ────────────────────────────────────────────────────────────────
local wallpaper = "$HOME/Pictures/Wallpapers/Ghost_in_the_Shell.png"
local autostart = {
"sleep 2 && waybar & disown",
}
hl.on("hyprland.start", function()
for _, cmd in ipairs(autostart) do
hl.exec_cmd(cmd)
end
end)
-- ── Config ───────────────────────────────────────────────────────────────────
hl.config({
debug = {
disable_logs = false,
enable_stdout_logs = false,
},
input = {
kb_layout = "de",
kb_variant = "mac",
kb_options = "apple:fn_lock",
repeat_rate = 50,
repeat_delay = 300,
accel_profile = "flat",
follow_mouse = 1,
mouse_refocus = false,
sensitivity = 0,
numlock_by_default = true,
touchpad = {
natural_scroll = true,
tap_to_click = true,
},
},
general = {
gaps_in = 2,
gaps_out = 0,
border_size = 4,
col = {
active_border = "rgba(a6e3a1ff)",
inactive_border = "rgba(f38ba8ff)",
},
layout = "scrolling",
allow_tearing = false,
},
decoration = {
rounding = 1,
shadow = {
enabled = false,
range = 16,
render_power = 4,
color = "rgba(a6e3a1ff)",
color_inactive = "rgba(f38ba8ff)",
},
blur = {
enabled = false,
size = 1,
passes = 3,
new_optimizations = true,
noise = 0.04,
},
},
animations = {
enabled = true,
},
scrolling = {
column_width = 0.5,
fullscreen_on_one_column = true,
focus_fit_method = 1,
follow_focus = true,
follow_min_visible = 0.4,
explicit_column_widths = "0.333, 0.5, 0.667, 1.0",
wrap_focus = true,
wrap_swapcol = true,
direction = "right",
},
misc = {
force_default_wallpaper = 0,
disable_hyprland_logo = true,
disable_splash_rendering = true,
mouse_move_enables_dpms = true,
key_press_enables_dpms = true,
vrr = 0,
},
})
-- ── Animations ───────────────────────────────────────────────────────────────
hl.curve("myBezier", { type = "bezier", points = { { 0.05, 0.9 }, { 0.1, 1.05 } } })
hl.curve("mySpring", { type = "spring", mass = 0.6, stiffness = 70.00, dampening = 10.00 })
local animations = {
{ leaf = "windows", enabled = true, speed = 10, spring = "mySpring" },
{ leaf = "windowsOut", enabled = true, speed = 10, spring = "mySpring", style = "popin 80%" },
{ leaf = "border", enabled = true, speed = 10, spring = "mySpring" },
{ leaf = "borderangle", enabled = true, speed = 10, spring = "mySpring" },
{ leaf = "fade", enabled = true, speed = 10, spring = "mySpring" },
{ leaf = "workspaces", enabled = true, speed = 10, spring = "mySpring" },
}
for _, anim in ipairs(animations) do
hl.animation(anim)
end
-- ── Devices ──────────────────────────────────────────────────────────────────
local devices = {
{ name = "usb-optical-mouse-", sensitivity = 0 },
}
for _, d in ipairs(devices) do
hl.device(d)
end
-- ── Window Rules ─────────────────────────────────────────────────────────────
local window_rules = {
{ name = "kitty_width", match = { class = "kitty" }, scrolling_width = 0.5 },
{ name = "browser_width", match = { class = "floorp" }, scrolling_width = 0.667 },
{ name = "obsidian_width", match = { class = "obsidian" }, scrolling_width = 0.5 },
{ name = "nautilus_width", match = { class = "nautilus" }, scrolling_width = 0.333 },
{ name = "thunderbird_width", match = { class = "thunderbird" }, scrolling_width = 0.667 },
}
for _, rule in ipairs(window_rules) do
hl.window_rule(rule)
end
-- ── Binds ────────────────────────────────────────────────────────────────────
-- Applications & launchers
bind_exec({
{ super .. " + Q", terminal },
{ super .. " + E", fileManager },
{ super .. " + O", "obsidian" },
{ super .. " + I", "floorp" },
{ super .. " + G", "thunderbird" },
{ "XF86Mail", "thunderbird" },
{ super .. " + N", "nautilus" },
{ "XF86Search", "nautilus" },
-- Rofi
{ super .. " + F", filebrowser },
{ super .. " + A", apps },
{ "Menu", apps },
{ super .. " + R", menu },
{ "XF86LaunchA", menu },
{ super .. " + S", power },
{ "XF86LaunchB", power },
-- Screenshots
{ super .. " + Z", 'grim -g "$(slurp)" ' .. screenshot },
{ super .. " + U", "grim " .. screenshot },
-- Media & brightness (locked = works on lockscreen, repeating = held key)
{ "XF86AudioMute", "pamixer -t", { locked = true } },
{ "XF86AudioPlay", "playerctl play-pause", { locked = true } },
{ "XF86AudioNext", "playerctl next", { locked = true } },
{ "XF86AudioPrev", "playerctl previous", { locked = true } },
{ "XF86AudioRaiseVolume", "pamixer -i 5", { locked = true, repeating = true } },
{ "XF86AudioLowerVolume", "pamixer -d 5", { locked = true, repeating = true } },
{ "XF86MonBrightnessUp", "brightnessctl set +5%", { locked = true, repeating = true } },
{ "XF86MonBrightnessDown", "brightnessctl set 5%-", { locked = true, repeating = true } },
})
-- Window actions
bind_all({
{ super .. " + M", hl.dsp.exit() },
{ super .. " + V", hl.dsp.window.float({ action = "toggle" }) },
{ super .. " + C", hl.dsp.window.close() },
-- Mouse move/resize
{ super .. " + mouse:272", hl.dsp.window.drag() },
{ super .. " + mouse:273", hl.dsp.window.drag({ resize = true }) },
-- Switch workspaces with mouse wheel
{ super .. " + mouse_down", hl.dsp.focus({ workspace = "e+1" }) },
{ super .. " + mouse_up", hl.dsp.focus({ workspace = "e-1" }) },
})
-- Directional focus (up/down move within a column; left/right scroll between columns)
for _, dir in ipairs({ "left", "right", "up", "down" }) do
hl.bind(super .. " + " .. dir, hl.dsp.layout("focus " .. dir))
end
-- Scrolling layout commands
bind_layout({
-- Column navigation
{ super .. " + period", "move +col" },
{ super .. " + comma", "move -col" },
-- Column swap
{ super .. " + SHIFT + period", "swapcol r" },
{ super .. " + SHIFT + comma", "swapcol l" },
-- Column resize (cycle through explicit_column_widths)
{ super .. " + equal", "colresize +conf" },
{ super .. " + minus", "colresize -conf" },
-- Fine-grained resize
{ super .. " + SHIFT + equal", "colresize +0.05" },
{ super .. " + SHIFT + minus", "colresize -0.05" },
-- Fit operations
{ super .. " + F1", "fit active" },
{ super .. " + F2", "fit visible" },
{ super .. " + F3", "fit all" },
-- Promote window to its own column / consume into previous
{ super .. " + RETURN", "promote" },
{ super .. " + SHIFT + RETURN", "consume_or_expel prev" },
-- Expel/consume explicitly
{ super .. " + bracketright", "expel" },
{ super .. " + bracketleft", "consume" },
-- Toggle scroll lock for active workspace
{ super .. " + SHIFT + S", "inhibit_scroll" },
})
-- Workspaces 110 (key 0 maps to workspace 10)
for i = 1, 10 do
local key = tostring(i % 10)
hl.bind(super .. " + " .. key, hl.dsp.focus({ workspace = i }))
hl.bind(super .. " + SHIFT + " .. key, hl.dsp.window.move({ workspace = i }))
end
-- Special workspace (scratchpad)
hl.bind(super .. " + grave", hl.dsp.window.move({ workspace = "special:magic" }))
-- ── Workspace Rules ───────────────────────────────────────────────────────────
local workspace_rules = {
{ workspace = "1", layout_opts = { direction = "right" } },
{ workspace = "2", layout_opts = { direction = "right" } },
{ workspace = "3", layout_opts = { direction = "right" } },
}
for _, rule in ipairs(workspace_rules) do
hl.workspace_rule(rule)
end
+282
View File
@@ -0,0 +1,282 @@
-- hyprland.lua — migrated from hyprlang for Hyprland 0.55+
-- https://wiki.hypr.land/Configuring/Start/
-- ── Variables ────────────────────────────────────────────────────────────────
local super = "SUPER"
local terminal = "kitty"
local fileManager = "yazi"
local theme = "-theme $HOME/.config/rofi/custom.rasi"
local menu = "rofi -show drun " .. theme
local filebrowser = "rofi -show filebrowser " .. theme
local power = "rofi -show p -modi p:rofi-power-menu -theme $HOME/.config/rofi/power.rasi"
local apps = "rofi -show window " .. theme
local screenshot = "$HOME/Pictures/Screenshots/$(date +'%s_grim.png')"
-- ── Helpers ───────────────────────────────────────────────────────────────────
-- Bind a list of { key, action [, opts] } entries
local function bind_all(list)
for _, b in ipairs(list) do
hl.bind(b[1], b[2], b[3])
end
end
-- Bind a list of { key, cmd [, opts] } entries as exec_cmd actions
local function bind_exec(list)
for _, b in ipairs(list) do
hl.bind(b[1], hl.dsp.exec_cmd(b[2]), b[3])
end
end
-- Bind a list of { key, layout_cmd } entries as layout actions
local function bind_layout(list)
for _, b in ipairs(list) do
hl.bind(b[1], hl.dsp.layout(b[2]))
end
end
-- ── Monitors ─────────────────────────────────────────────────────────────────
local monitors = {
{ output = "DP-1", mode = "1920x1080@60", position = "1920x0", scale = 1 },
{ output = "HDMI-A-2", mode = "1920x1080@60", position = "0x0", scale = 1 },
}
for _, m in ipairs(monitors) do
hl.monitor(m)
end
-- ── Environment ──────────────────────────────────────────────────────────────
local env_vars = {
NIXOS_OZONE_WL = "1",
MOZ_ENABLE_WAYLAND = "1",
MOZ_WEBRENDER = "1",
_JAVA_AWT_WM_NONREPARENTING = "1",
QT_WAYLAND_DISABLE_WINDOWDECORATION = "1",
QT_QPA_PLATFORM = "wayland",
SDL_VIDEODRIVER = "wayland",
GDK_BACKEND = "wayland,x11",
XCURSOR_SIZE = "24",
XCURSOR_THEME = "catppuccin-mocha-dark",
EDITOR = "nvim",
GSK_RENDERER = "gl",
HYPRCURSOR_THEME = "catppuccin-mocha-dark",
HYPRCURSOR_SIZE = "24",
}
for k, v in pairs(env_vars) do
hl.env(k, v)
end
-- ── Autostart ────────────────────────────────────────────────────────────────
local autostart = {
"awww-daemon --no-cache & disown",
"awww img ~/Pictures/Wallpapers/Ghost_in_the_Shell.png",
"waybar &",
}
hl.on("hyprland.start", function()
for _, cmd in ipairs(autostart) do
hl.exec_cmd(cmd)
end
end)
-- ── Config ───────────────────────────────────────────────────────────────────
hl.config({
debug = {
disable_logs = false,
enable_stdout_logs = false,
},
input = {
kb_layout = "de",
kb_variant = "mac",
kb_options = "apple:fn_lock",
repeat_rate = 50,
repeat_delay = 300,
accel_profile = "flat",
follow_mouse = 1,
mouse_refocus = false,
sensitivity = 0,
numlock_by_default = true,
touchpad = {
natural_scroll = true,
tap_to_click = true,
},
},
general = {
gaps_in = 2,
gaps_out = 0,
border_size = 4,
col = {
active_border = "rgba(a6e3a1ff)",
inactive_border = "rgba(f38ba8ff)",
},
layout = "master",
allow_tearing = false,
},
decoration = {
rounding = 1,
shadow = {
enabled = false,
range = 16,
render_power = 4,
color = "rgba(a6e3a1ff)",
color_inactive = "rgba(f38ba8ff)",
},
blur = {
enabled = false,
size = 1,
passes = 3,
new_optimizations = true,
noise = 0.04,
},
},
animations = {
enabled = true,
},
master = {
new_status = "slave",
new_on_top = false,
new_on_active = "after",
orientation = "left",
mfact = 0.55,
allow_small_split = false,
smart_resizing = true,
drop_at_cursor = true,
focus_master_on_close = false,
},
misc = {
force_default_wallpaper = 0,
disable_hyprland_logo = true,
disable_splash_rendering = true,
mouse_move_enables_dpms = true,
key_press_enables_dpms = true,
vrr = 0,
},
})
-- ── Animations ───────────────────────────────────────────────────────────────
hl.curve("myBezier", { type = "bezier", points = { { 0.05, 0.9 }, { 0.1, 1.05 } } })
local animations = {
{ leaf = "windows", enabled = true, speed = 7, bezier = "myBezier" },
{ leaf = "windowsOut", enabled = true, speed = 7, bezier = "default", style = "popin 80%" },
{ leaf = "border", enabled = true, speed = 10, bezier = "default" },
{ leaf = "borderangle", enabled = true, speed = 8, bezier = "default" },
{ leaf = "fade", enabled = true, speed = 7, bezier = "default" },
{ leaf = "workspaces", enabled = true, speed = 6, bezier = "default" },
}
for _, anim in ipairs(animations) do
hl.animation(anim)
end
-- ── Devices ──────────────────────────────────────────────────────────────────
local devices = {
{ name = "usb-optical-mouse-", sensitivity = 0 },
}
for _, d in ipairs(devices) do
hl.device(d)
end
-- ── Binds ────────────────────────────────────────────────────────────────────
-- Applications & launchers
bind_exec({
{ super .. " + Q", terminal },
{ super .. " + E", fileManager },
{ super .. " + O", "obsidian" },
{ super .. " + I", "floorp" },
{ super .. " + G", "thunderbird" },
{ "XF86Mail", "thunderbird" },
{ super .. " + N", "nautilus" },
{ "XF86Search", "nautilus" },
-- Rofi
{ super .. " + F", filebrowser },
{ super .. " + A", apps },
{ "Menu", apps },
{ super .. " + R", menu },
{ "XF86LaunchA", menu },
{ super .. " + S", power },
{ "XF86LaunchB", power },
-- Screenshots
{ super .. " + Z", 'grim -g "$(slurp)" ' .. screenshot },
{ super .. " + U", "grim " .. screenshot },
-- Media & brightness (locked = works on lockscreen, repeating = held key)
{ "XF86AudioMute", "pamixer -t", { locked = true } },
{ "XF86AudioPlay", "playerctl play-pause", { locked = true } },
{ "XF86AudioNext", "playerctl next", { locked = true } },
{ "XF86AudioPrev", "playerctl previous", { locked = true } },
{ "XF86AudioRaiseVolume", "pamixer -i 5", { locked = true, repeating = true } },
{ "XF86AudioLowerVolume", "pamixer -d 5", { locked = true, repeating = true } },
{ "XF86MonBrightnessUp", "brightnessctl set +5%", { locked = true, repeating = true } },
{ "XF86MonBrightnessDown", "brightnessctl set 5%-", { locked = true, repeating = true } },
})
-- Window actions
bind_all({
{ super .. " + M", hl.dsp.exit() },
{ super .. " + P", hl.dsp.window.pseudo() },
{ super .. " + V", hl.dsp.window.float({ action = "toggle" }) },
{ super .. " + C", hl.dsp.window.close() },
-- Mouse move/resize
{ super .. " + mouse:272", hl.dsp.window.drag() },
{ super .. " + mouse:273", hl.dsp.window.drag({ resize = true }) },
-- Scroll through workspaces
{ super .. " + mouse_down", hl.dsp.focus({ workspace = "e+1" }) },
{ super .. " + mouse_up", hl.dsp.focus({ workspace = "e-1" }) },
})
-- Directional focus
for _, dir in ipairs({ "left", "right", "up", "down" }) do
hl.bind(super .. " + " .. dir, hl.dsp.focus({ direction = dir }))
end
-- Master layout commands
bind_layout({
{ super .. " + RETURN", "swapwithmaster auto" },
{ super .. " + SHIFT + RETURN", "focusmaster auto" },
{ super .. " + TAB", "cyclenext" },
{ super .. " + SHIFT + TAB", "cycleprev" },
{ super .. " + bracketright", "swapnext" },
{ super .. " + bracketleft", "swapprev" },
{ super .. " + period", "addmaster" },
{ super .. " + comma", "removemaster" },
{ super .. " + SHIFT + O", "orientationcycle left top right bottom" },
{ super .. " + equal", "mfact +0.05" },
{ super .. " + minus", "mfact -0.05" },
})
-- Workspaces 110 (key 0 maps to workspace 10)
for i = 1, 10 do
local key = tostring(i % 10)
hl.bind(super .. " + " .. key, hl.dsp.focus({ workspace = i }))
hl.bind(super .. " + SHIFT + " .. key, hl.dsp.window.move({ workspace = i }))
end
-- Special workspace (scratchpad)
hl.bind(super .. " + SHIFT + S", hl.dsp.window.move({ workspace = "special:magic" }))
-- ── Workspace Rules ───────────────────────────────────────────────────────────
local workspace_rules = {
{ workspace = "1", layout_opts = { orientation = "left" } },
{ workspace = "2", layout_opts = { orientation = "top" } },
}
for _, rule in ipairs(workspace_rules) do
hl.workspace_rule(rule)
end
View File
View File
View File
-110
View File
@@ -1,110 +0,0 @@
{ ... }:
{
services.swaync = {
enable = true;
settings = {
positionX = "center";
positionY = "center";
layer = "overlay";
control-center-layer = "top";
layer-shell = true;
cssPriority = "user";
control-center-margin-top = 100;
control-center-margin-bottom = 200;
control-center-margin-right = 0;
control-center-margin-left = 0;
notification-2fa-action = true;
notification-inline-replies = false;
notification-icon-size = 64;
notification-body-image-height = 100;
notification-body-image-width = 200;
widgets = [
"mpris"
"volume"
"inhibitors"
"title"
"dnd"
"notifications"
];
widget-config = {
mpris = {
blacklist = [ ];
autohide = false;
show-album-art = "always";
loop-carousel = false;
image-size = 96;
image-radius = 12;
};
volume = {
label = "gain";
show-per-app = false;
empty-list-label = "Nothin' is playin'";
expand-button-label = "";
collaps-button-label = "";
};
title = {
text = "Hollerin'";
clear-all-button = true;
button-text = "Sheriff's Pardon";
};
dnd = {
text = "Let'er rest";
};
menubar = {
"menu#power" = {
label = "Power";
position = "right";
animation-type = "slide_down";
animation-duration = 250;
actions = [
{
label = "Bolt It";
command = "hyprlock";
}
{
label = "Ride Out";
command = "hyprctl dispatch exit";
}
{
label = "Circle Back";
command = "systemctl reboot";
}
{
label = "Bet Down the Horses";
command = "systemctl poweroff";
}
];
};
"buttons#media" = {
position = "left";
actions = [
{
label = "Play/Pause";
command = "playerctl play-pause";
}
{
label = "Next";
command = "playerctl next";
}
{
label = "Previous";
command = "playerctl previous";
}
];
};
};
notifications = {
vexpand = true;
};
};
};
};
}
+7 -2
View File
@@ -1,6 +1,11 @@
{ pkgs, lib, ... }: { { pkgs, lib, ... }: {
home.packages = home.packages = lib.mkIf (!pkgs.stdenv.isDarwin) (
lib.mkIf (!pkgs.stdenv.isDarwin) (with pkgs; [ rofi-power-menu rofi-calc ]); with pkgs;
[
rofi-power-menu
rofi-calc
]
);
programs.rofi = lib.mkIf (!pkgs.stdenv.isDarwin) { programs.rofi = lib.mkIf (!pkgs.stdenv.isDarwin) {
enable = true; enable = true;
+7 -1
View File
@@ -1,4 +1,10 @@
{ pkgs, lib, isDarwin, ... }: { {
pkgs,
lib,
isDarwin,
...
}:
{
programs.sketchybar = lib.mkIf isDarwin { programs.sketchybar = lib.mkIf isDarwin {
enable = true; enable = true;
configType = "lua"; configType = "lua";
+8 -8
View File
@@ -2,7 +2,7 @@
-- Save this in ~/.config/sketchybar/ -- Save this in ~/.config/sketchybar/
-- SketchyBar Lua API -- SketchyBar Lua API
sbar = require("sketchybar") local sbar = require("sketchybar")
-- Colors (Catppuccin Mocha theme) -- Colors (Catppuccin Mocha theme)
local colors = { local colors = {
@@ -52,8 +52,8 @@ sbar.default({
background = { background = {
border_width = 2, border_width = 2,
corner_radius = 9, corner_radius = 9,
border_color = colors.accent, border_color = colors.pink,
color = colors.bg, color = colors.base,
padding_right = 12, padding_right = 12,
}, },
}, },
@@ -67,14 +67,14 @@ sbar.bar({
padding_left = 12, padding_left = 12,
padding_right = 12, padding_right = 12,
margin = 12, margin = 12,
color = colors.bg, color = colors.base,
border_color = colors.accent, border_color = colors.pink,
border_width = 2, border_width = 2,
corner_radius = 60, corner_radius = 60,
}) })
-- Apple logo menu -- Apple logo menu
local apple_logo = sbar.add("item", "apple.logo", { sbar.add("item", "apple.logo", {
icon = { icon = {
string = "", string = "",
padding_left = 6, padding_left = 6,
@@ -125,7 +125,7 @@ sbar.add("item", "apple.lock", {
}) })
-- Spaces -- Spaces
local space_icons = { "󰖟 ", "", " ", "", "", "", "7", "8", "9", "10" } local space_icons = { "󰖟 ", "", "󰭻 ", "", "", "", "7", "8", "9", "10" }
for i = 1, #space_icons do for i = 1, #space_icons do
local space = sbar.add("space", "space." .. i, { local space = sbar.add("space", "space." .. i, {
space = i, space = i,
@@ -133,7 +133,7 @@ for i = 1, #space_icons do
string = space_icons[i], string = space_icons[i],
padding_left = 2, padding_left = 2,
padding_right = 2, padding_right = 2,
highlight_color = colors.green, highlight_color = colors.red,
}, },
label = { drawing = false }, label = { drawing = false },
padding_right = 4, padding_right = 4,
+2 -2
View File
@@ -150,11 +150,11 @@
format = "{}"; format = "{}";
return-type = "json"; return-type = "json";
exec = '' exec = ''
curl -s -X GET "https://api.openweathermap.org/data/2.5/weather?lat=52.281311&lon=10.527029&appid=$(cat $OPENWEATHER_API_KEY)&units=metric&lang=en" | jq -c '{text: "\(.name) \(.main.temp)C°"}' curl -sf --max-time 10 "https://api.openweathermap.org/data/2.5/weather?lat=52.281311&lon=10.527029&appid=$(cat ~/.config/sops-nix/secrets/OPENWEATHER_API_KEY)&units=metric&lang=en" | jq -c '{text: "\(.name) \(.main.temp)C°"}'
''; '';
interval = 120; interval = 120;
on-click = '' on-click = ''
data=$(curl -s -X GET "https://api.openweathermap.org/data/2.5/weather?lat=52.281311&lon=10.527029&appid=$(cat $OPENWEATHER_API_KEY)&units=metric&lang=en") data=$(curl -sf --max-time 10 "https://api.openweathermap.org/data/2.5/weather?lat=52.281311&lon=10.527029&appid=$(cat ~/.config/sops-nix/secrets/OPENWEATHER_API_KEY)&units=metric&lang=en")
city=$(echo "$data" | jq -r '.name') city=$(echo "$data" | jq -r '.name')
temp=$(echo "$data" | jq -r '.main.temp') temp=$(echo "$data" | jq -r '.main.temp')
feels=$(echo "$data" | jq -r '.main.feels_like') feels=$(echo "$data" | jq -r '.main.feels_like')
+12 -3
View File
@@ -1,8 +1,17 @@
{ pkgs, lib, compositor ? "hyprland", ... }: { {
programs.waybar = lib.mkIf (!pkgs.stdenv.isDarwin) ({ pkgs,
lib,
compositor ? "hyprland",
...
}:
{
programs.waybar = lib.mkIf (!pkgs.stdenv.isDarwin) (
{
enable = true; enable = true;
package = pkgs.waybar; package = pkgs.waybar;
} // (import ./dual.nix { inherit compositor; })); }
// (import ./dual.nix { inherit compositor; })
);
home.packages = lib.mkIf (!pkgs.stdenv.isDarwin) (with pkgs; [ cava ]); home.packages = lib.mkIf (!pkgs.stdenv.isDarwin) (with pkgs; [ cava ]);
-5
View File
@@ -1,5 +0,0 @@
_: {
programs.floorp = {
enable = true;
};
}
+168
View File
@@ -0,0 +1,168 @@
{ pkgs, ... }:
let
addons = pkgs.nur.repos.rycee.firefox-addons;
readJson = path: builtins.readFile path;
buildXpi =
{
name,
addonId,
version,
url,
sha256,
}:
pkgs.nur.repos.rycee.firefox-addons.buildFirefoxXpiAddon {
pname = name;
inherit
addonId
version
url
sha256
;
meta = { };
};
in
{
programs.floorp = {
enable = true;
policies.ExtensionSettings = {
"adguardadblocker@adguard.com" = {
installation_mode = "force_installed";
install_url = "https://addons.mozilla.org/firefox/downloads/file/4805625/adguard_adblocker-5.4.3.1.xpi";
default_area = "navbar";
};
"{446900e4-71c2-419f-a6a7-df9c091e268b}" = {
installation_mode = "force_installed";
default_area = "navbar";
}; # Bitwarden
"{7a7a4a92-a2a0-41d1-9fd7-1e92480d612d}" = {
installation_mode = "force_installed";
default_area = "navbar";
}; # Stylus
"newtaboverride@agenedia.com" = {
installation_mode = "force_installed";
};
"{3c078156-979c-498b-8990-85f7987dd929}" = {
installation_mode = "force_installed";
};
"firefox@tampermonkey.net" = {
installation_mode = "force_installed";
};
"{7aa7c68a-141f-45c9-a1c6-6e7382debbe1}" = {
installation_mode = "force_installed";
install_url = "https://addons.mozilla.org/firefox/downloads/file/4147586/catppuccin_mocha-1.0.xpi";
};
};
profiles.default = {
isDefault = true;
extraConfig = ''
user_pref("extensions.activeThemeID", "{7aa7c68a-141f-45c9-a1c6-6e7382debbe1}");
'';
settings = {
# Startup
"browser.startup.homepage" = "https://www.cyperpunk.de";
# UI
"browser.ctrlTab.sortByRecentlyUsed" = true;
"browser.tabs.closeWindowWithLastTab" = false;
"browser.toolbars.bookmarks.visibility" = "never";
"browser.toolbars.bookmarks.showOtherBookmarks" = false;
"browser.download.useDownloadDir" = false;
"general.autoScroll" = true;
"intl.locale.requested" = "en";
"browser.search.region" = "DE";
# New tab
"browser.newtabpage.activity-stream.feeds.topsites" = false;
"browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
"browser.newtabpage.activity-stream.showSponsoredCheckboxes" = false;
"browser.newtab.extensionControlled" = true;
# Privacy
"signon.rememberSignons" = false;
"privacy.clearOnShutdown_v2.formdata" = true;
"dom.disable_open_during_load" = false;
# Devtools
"devtools.cache.disabled" = true;
# Media
"media.eme.enabled" = true;
# Font
"font.name.serif.x-western" = "FiraMono Nerd Font";
# URL bar
"browser.urlbar.shortcuts.actions" = false;
"browser.urlbar.shortcuts.bookmarks" = false;
"browser.urlbar.shortcuts.history" = false;
"browser.urlbar.suggest.bookmark" = false;
# Extensions — skip manual enable prompt on fresh install
"extensions.autoDisableScopes" = 0;
# Floorp specific
"floorp.browser.tabs.openNewTabPosition" = -1;
"floorp.commandPalette.enabled" = true;
"floorp.mousegesture.enabled" = false;
"floorp.panelSidebar.enabled" = true;
"floorp.workspaces.enabled" = true;
"floorp.zenmode.enabled" = false;
"floorp.design.configs" = readJson ./design.json;
"floorp.panelSidebar.config" = readJson ./panel-sidebar.json;
"floorp.panelSidebar.data" = readJson ./panel-sidebar-data.json;
"floorp.tabs.sleep.exclusion" = readJson ./tabs-sleep-exclusion.json;
};
search = {
force = true;
default = "SearXNG";
engines = {
"SearXNG" = {
urls = [ { template = "https://search.cyperpunk.de/search?q={searchTerms}"; } ];
definedAliases = [ "@sx" ];
};
};
};
extensions = {
force = true;
packages = [
addons.bitwarden
addons.sidebery
addons.tampermonkey
addons.stylus
addons.new-tab-override
(buildXpi {
name = "adguard-adblocker";
addonId = "adguardadblocker@adguard.com";
version = "5.4.3.1";
url = "https://addons.mozilla.org/firefox/downloads/file/4805625/adguard_adblocker-5.4.3.1.xpi";
sha256 = "1rqp8qcc0p6qgqfgpshiqnll5mrl9jyfnks4zygzim436k0k781l";
})
(buildXpi {
name = "catppuccin-mocha";
addonId = "{7aa7c68a-141f-45c9-a1c6-6e7382debbe1}";
version = "1.0";
url = "https://addons.mozilla.org/firefox/downloads/file/4147586/catppuccin_mocha-1.0.xpi";
sha256 = "04lw5dirdv5636i52gfgyd5l0mkd74qjs2p23mimga3xv8hk1dzl";
})
];
settings = {
"{3c078156-979c-498b-8990-85f7987dd929}".settings = builtins.fromJSON (
builtins.readFile ./sidebery.json
);
"newtaboverride@agenedia.com".settings = {
type = "custom_url";
url = "https://www.cyperpunk.de/";
};
};
};
};
};
}
+1
View File
@@ -0,0 +1 @@
{"globalConfigs":{"userInterface":"fluerial","faviconColor":true,"appliedUserJs":""},"tabbar":{"tabbarStyle":"horizontal","tabbarPosition":"optimise-to-vertical-tabbar","multiRowTabBar":{"maxRowEnabled":false,"maxRow":3}},"tab":{"tabScroll":{"enabled":false,"reverse":false,"wrap":false},"tabMinHeight":30,"tabMinWidth":76,"tabPinTitle":false,"tabDubleClickToClose":false,"tabOpenPosition":-1},"uiCustomization":{"navbar":{"position":"top","searchBarTop":false},"display":{"disableFullscreenNotification":false,"deleteBrowserBorder":false},"special":{"optimizeForTreeStyleTab":false,"hideForwardBackwardButton":false,"stgLikeWorkspaces":false},"multirowTab":{"newtabInsideEnabled":false},"bookmarkBar":{"focusExpand":false,"position":"bottom"},"qrCode":{"disableButton":false},"disableFloorpStart":true}}
+1
View File
@@ -0,0 +1 @@
{"data":[{"id":"default-panel-history","url":"floorp//history","width":0,"type":"static"},{"id":"default-panel-downloads","url":"floorp//downloads","width":0,"type":"static"},{"id":"default-panel-notes","url":"floorp//notes","width":0,"type":"static"},{"type":"web","id":"18849706-ce97-41ce-b6c0-007436e81dad","width":450,"url":"https://cinny.cyperpunk.de/home/","userContextId":0,"userAgent":false}]}
+1
View File
@@ -0,0 +1 @@
{"autoUnload":false,"position_start":true,"globalWidth":400,"displayed":true,"webExtensionRunningEnabled":false}
+1
View File
@@ -0,0 +1 @@
{"sidebarCSS":"#root.root {--nav-btn-width: 32px;}\n#root.root {--nav-btn-height: 32px;}\n#root.root {--nav-btn-margin: 4px;}\n#root.root {--nav-btn-len-margin: 0px;}\n#root.root {--nav-btn-border-radius: 5px;}\n#root.root {--toolbar-scrollbar-color: #cdd6f4;}\n#root.root {--general-margin: 4px;}\n#root.root {--general-border-radius: 5px;}","ver":"5.5.2","keybindings":{"_execute_sidebar_action":"Ctrl+E","activate":"Alt+Space","reset_selection":"Alt+R","next_panel":"Alt+Period","prev_panel":"Alt+Comma","new_tab_on_panel":"Ctrl+Space","new_tab_in_group":"Ctrl+Shift+Space","up":"Alt+Up","down":"Alt+Down","up_shift":"Alt+Shift+Up","down_shift":"Alt+Shift+Down"}}
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
{"enabled":true,"patterns":["cyperpunk.de"]}
+3 -2
View File
@@ -1,7 +1,8 @@
# TODO: Duplicate file
{ pkgs, ... }: { pkgs, ... }:
{ {
fonts.packages = with pkgs; [ fonts.fontconfig.enable = true;
home.packages = with pkgs; [
nerd-fonts.fira-code nerd-fonts.fira-code
nerd-fonts.fira-mono nerd-fonts.fira-mono
nerd-fonts.hack nerd-fonts.hack
+37 -8
View File
@@ -46,10 +46,14 @@
{ {
type = "button"; type = "button";
val = "[+] New file"; val = "[+] New file";
on_press.__raw = on_press.__raw = "function() vim.cmd[[ene]] vim.cmd[[startinsert]] end";
"function() vim.cmd[[ene]] vim.cmd[[startinsert]] end";
opts = { opts = {
keymap = [ "n" "e" ":ene <BAR> startinsert <CR>" { } ]; keymap = [
"n"
"e"
":ene <BAR> startinsert <CR>"
{ }
];
shortcut = "e"; shortcut = "e";
position = "center"; position = "center";
cursor = 3; cursor = 3;
@@ -63,7 +67,12 @@
val = "[?] Find file"; val = "[?] Find file";
on_press.__raw = "function() vim.cmd[[Telescope find_files]] end"; on_press.__raw = "function() vim.cmd[[Telescope find_files]] end";
opts = { opts = {
keymap = [ "n" "f" ":Telescope find_files <CR>" { } ]; keymap = [
"n"
"f"
":Telescope find_files <CR>"
{ }
];
shortcut = "f"; shortcut = "f";
position = "center"; position = "center";
cursor = 3; cursor = 3;
@@ -77,7 +86,12 @@
val = "[~] Recent files"; val = "[~] Recent files";
on_press.__raw = "function() vim.cmd[[Telescope oldfiles]] end"; on_press.__raw = "function() vim.cmd[[Telescope oldfiles]] end";
opts = { opts = {
keymap = [ "n" "r" ":Telescope oldfiles <CR>" { } ]; keymap = [
"n"
"r"
":Telescope oldfiles <CR>"
{ }
];
shortcut = "r"; shortcut = "r";
position = "center"; position = "center";
cursor = 3; cursor = 3;
@@ -91,7 +105,12 @@
val = "[Y] Yazi"; val = "[Y] Yazi";
on_press.__raw = "function() require('yazi').yazi() end"; on_press.__raw = "function() require('yazi').yazi() end";
opts = { opts = {
keymap = [ "n" "y" ":Yazi<CR>" { } ]; keymap = [
"n"
"y"
":Yazi<CR>"
{ }
];
shortcut = "y"; shortcut = "y";
position = "center"; position = "center";
cursor = 3; cursor = 3;
@@ -105,7 +124,12 @@
val = "[A] Open Prompt"; val = "[A] Open Prompt";
#on_press.__raw = "function() require('yazi').yazi() end"; #on_press.__raw = "function() require('yazi').yazi() end";
opts = { opts = {
keymap = [ "n" "a" ":AvanteChatNew<CR>" { } ]; keymap = [
"n"
"a"
":AvanteChatNew<CR>"
{ }
];
shortcut = "a"; shortcut = "a";
position = "center"; position = "center";
cursor = 3; cursor = 3;
@@ -119,7 +143,12 @@
val = "[X] Quit"; val = "[X] Quit";
on_press.__raw = "function() vim.cmd[[qa]] end"; on_press.__raw = "function() vim.cmd[[qa]] end";
opts = { opts = {
keymap = [ "n" "q" ":qa<CR>" { } ]; keymap = [
"n"
"q"
":qa<CR>"
{ }
];
shortcut = "q"; shortcut = "q";
position = "center"; position = "center";
cursor = 3; cursor = 3;
+19 -16
View File
@@ -5,21 +5,18 @@
plugins = { plugins = {
markdown-preview.enable = true; markdown-preview.enable = true;
render-markdown.enable = true; render-markdown.enable = true;
#extraConfigLuaPre = ''
# vim.env.GROQ_API_KEY = os.getenv("GROQ_API_KEY")
#'';
# TODO: Integrate CoPilot https://github.com/settings/copilot/features
avante = { avante = {
enable = true; enable = true;
autoLoad = true; autoLoad = true;
settings = { settings = {
provider = "groq"; provider = "ollama";
providers.groq = { providers = {
groq = {
__inherited_from = "openai"; __inherited_from = "openai";
api_key_name = "cmd:cat /home/phil/.config/sops-nix/secrets/GROQ_API_KEY"; api_key_name = "cmd:cat /home/phil/.config/sops-nix/secrets/GROQ_API_KEY";
endpoint = "https://api.groq.com/openai/v1/"; endpoint = "https://api.groq.com/openai/v1/";
model = "qwen/qwen3-32b"; # "llama-3.3-70b-versatile"; model = "qwen/qwen3-32b";
system_promt = "You are a helpful coding assistant. Always respond in plain markdown format without using tool calls or JSON structures."; system_promt = "You are a helpful coding assistant. Always respond in plain markdown format without using tool calls or JSON structures.";
disable_tools = true; disable_tools = true;
extra_request_body = { extra_request_body = {
@@ -31,7 +28,21 @@
}; };
}; };
# auto_suggestions_provider = "copilot"; ollama = {
endpoint = "http://100.109.179.25:11434"; # tailscale IP, no /v1 suffix
model = "qwen2.5:3b"; # swap for "llama3.2:3b" or "deepseek-r1:1.5b"
timeout = 60000; # local + small model can be slow on first load
disable_tools = true; # these small models aren't reliable at tool calling
is_env_set.__raw = ''require("avante.providers.ollama").check_endpoint_alive'';
extra_request_body = {
options = {
temperature = 0.7;
num_ctx = 8192;
keep_alive = "5m";
};
};
};
};
render = { render = {
markdown = true; markdown = true;
@@ -40,7 +51,6 @@
code = true; code = true;
link = true; link = true;
}; };
behaviour = { behaviour = {
enable_cursor_planning_mode = false; enable_cursor_planning_mode = false;
auto_suggestions = false; auto_suggestions = false;
@@ -51,7 +61,6 @@
use_selection_as_context = true; use_selection_as_context = true;
max_context_tokens = 2000; max_context_tokens = 2000;
}; };
mappings = { mappings = {
ask = "<leader>aa"; ask = "<leader>aa";
edit = "<leader>ae"; edit = "<leader>ae";
@@ -84,11 +93,9 @@
reverse_switch_windows = "<S-Tab>"; reverse_switch_windows = "<S-Tab>";
}; };
}; };
hints = { hints = {
enabled = true; enabled = true;
}; };
windows = { windows = {
position = "right"; position = "right";
wrap = true; wrap = true;
@@ -98,22 +105,18 @@
rounded = true; rounded = true;
}; };
}; };
highlights = { highlights = {
diff = { diff = {
current = "DiffText"; current = "DiffText";
incoming = "DiffAdd"; incoming = "DiffAdd";
}; };
}; };
diff = { diff = {
autojump = true; autojump = true;
list_opener = "copen"; list_opener = "copen";
}; };
}; };
}; };
extraPackages = with pkgs; [ curl ];
}; };
}; };
} }
+7 -1
View File
@@ -1,4 +1,8 @@
{ pkgs, inputs, ... }: {
pkgs,
inputs,
...
}:
{ {
imports = [ imports = [
inputs.nixvim.homeModules.nixvim inputs.nixvim.homeModules.nixvim
@@ -17,6 +21,7 @@
#./molten.nix #./molten.nix
./which-key.nix ./which-key.nix
./diffview.nix ./diffview.nix
./live-server.nix
]; ];
home.packages = with pkgs; [ home.packages = with pkgs; [
@@ -28,6 +33,7 @@
programs.nixvim = { programs.nixvim = {
enable = true; enable = true;
defaultEditor = true; defaultEditor = true;
enableMan = false;
# Leader key # Leader key
globals.mapleader = " "; globals.mapleader = " ";
+26 -6
View File
@@ -2,12 +2,32 @@ _: {
programs.nixvim = { programs.nixvim = {
plugins.diffview = { plugins.diffview = {
enable = true; enable = true;
keymaps = { settings.keymaps.view = [
"]x" = "<cmd>DiffviewConflictNext<CR>"; {
"[x" = "<cmd>DiffviewConflictPrev<CR>"; mode = "n";
"do" = "<cmd>DiffviewFocusOurs<CR>"; key = "]x";
"dt" = "<cmd>DiffviewFocusTheirs<CR>"; action = "<cmd>DiffviewConflictNext<CR>";
}; description = "Next conflict";
}
{
mode = "n";
key = "[x";
action = "<cmd>DiffviewConflictPrev<CR>";
description = "Previous conflict";
}
{
mode = "n";
key = "do";
action = "<cmd>DiffviewFocusOurs<CR>";
description = "Focus ours";
}
{
mode = "n";
key = "dt";
action = "<cmd>DiffviewFocusTheirs<CR>";
description = "Focus theirs";
}
];
}; };
}; };
} }
+1 -2
View File
@@ -1,4 +1,3 @@
# TODO: Remove; nodePackages is unmaintained inside nixpkgs
{ pkgs, ... }: { pkgs, ... }:
{ {
# Live Server: Auto-reload browser for web development # Live Server: Auto-reload browser for web development
@@ -13,6 +12,6 @@
} }
]; ];
extraPackages = with pkgs; [ nodePackages.browser-sync ]; extraPackages = with pkgs; [ browser-sync ];
}; };
} }
+2 -2
View File
@@ -2,8 +2,8 @@
programs.nixvim = lib.mkIf (!isDarwin) { programs.nixvim = lib.mkIf (!isDarwin) {
plugins.molten = { plugins.molten = {
enable = true; enable = true;
python3Dependencies = p: python3Dependencies =
with p; [ p: with p; [
pynvim pynvim
jupyter-client jupyter-client
cairosvg cairosvg
+1 -1
View File
@@ -4,7 +4,7 @@
# cheatsheet, snippets, offline manual and fuzzy help # cheatsheet, snippets, offline manual and fuzzy help
programs.nixvim = { programs.nixvim = {
plugins.openscad = { plugins.openscad = {
enable = true; enable = false;
autoLoad = true; autoLoad = true;
settings = { settings = {
fuzzy_finder = "fzf"; fuzzy_finder = "fzf";
+1 -1
View File
@@ -15,7 +15,7 @@
settings = { settings = {
highlight = { highlight = {
enable = true; enable = false;
additional_vim_regex_highlighting = false; additional_vim_regex_highlighting = false;
}; };
}; };
+44 -3
View File
@@ -1,4 +1,45 @@
_: { {
# TODO: Add Automatic Vault pull and detection config,
programs.obsidian.enable = true; pkgs,
lib,
...
}:
let
vaultRepo = "ssh://gitea@git.cyperpunk.de:12222/DerGrumpf/Notes.git";
vaultPath = "${config.home.homeDirectory}/Notes";
sshBinary = "${pkgs.openssh}/bin/ssh";
gitBin = "${pkgs.git}/bin";
gitLfsBin = "${pkgs.git-lfs}/bin";
in
{
programs.obsidian = {
enable = true;
vaults.notes = {
target = "Notes";
settings = { };
};
};
home.packages = with pkgs; [
git
git-lfs
openssh
];
home.activation.obsidianVault = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
export PATH="${gitBin}:${gitLfsBin}:$PATH"
export GIT_SSH_COMMAND="${sshBinary} -o StrictHostKeyChecking=accept-new"
export GIT_LFS_SKIP_SMUDGE=1
if [ ! -d "${vaultPath}/.git" ]; then
echo "Cloning Obsidian vault (LFS objects will be pulled separately)..."
${gitBin}/git clone "${vaultRepo}" "${vaultPath}"
${gitLfsBin}/git-lfs install --local "${vaultPath}"
${gitBin}/git -C "${vaultPath}" lfs pull
else
echo "Pulling latest changes for Obsidian vault..."
${gitBin}/git -C "${vaultPath}" pull
${gitBin}/git -C "${vaultPath}" lfs pull
fi
'';
} }
+1 -2
View File
@@ -1,4 +1,3 @@
{ pkgs, ... }: { { pkgs, ... }: {
programs.onlyoffice = programs.onlyoffice = pkgs.lib.mkIf (!pkgs.stdenv.isDarwin) { enable = true; };
pkgs.lib.mkIf (!pkgs.stdenv.isDarwin) { enable = true; };
} }
+35
View File
@@ -0,0 +1,35 @@
_: {
programs.opencode = {
enable = true;
settings = {
enabled_providers = [ "ollama" ];
model = "ollama/llama3.2:3b";
provider = {
ollama = {
npm = "@ai-sdk/openai-compatible";
name = "Ollama (tailscale)";
options = {
baseURL = "http://100.109.179.25:11434/v1";
};
models = {
"llama3.2:3b" = {
name = "Llama 3.2 3B";
};
"qwen2.5:3b" = {
name = "Qwen 2.5 3B";
};
"deepseek-r1:1.5b" = {
name = "DeepSeek-R1 1.5B";
};
"gemma4:e2b" = {
name = "Gemma 4 2B Edge";
};
};
};
};
};
};
}
+6 -3
View File
@@ -18,7 +18,7 @@
jq jq
yq-go yq-go
# GUI # GUI
openscad # openscad
fstl fstl
# PDF Tools # PDF Tools
pandoc pandoc
@@ -33,8 +33,11 @@
gnutar gnutar
unrar unrar
sops sops
age
# Nix tools # Nix tools
nix-index nix-index
ncdu
tty-solitaire
] ]
++ lib.optionals (!pkgs.stdenv.isDarwin) [ ++ lib.optionals (!pkgs.stdenv.isDarwin) [
# dev tools # dev tools
@@ -48,7 +51,6 @@
which which
libnotify libnotify
# encryption # encryption
age
ssh-to-age ssh-to-age
] ]
++ lib.optionals (!pkgs.stdenv.isDarwin && !isServer) [ ++ lib.optionals (!pkgs.stdenv.isDarwin && !isServer) [
@@ -64,7 +66,8 @@
xonotic xonotic
irssi irssi
blender blender
cinny-desktop nixpkgs-review
netradiant-custom
] ]
++ lib.optionals pkgs.stdenv.isDarwin [ graphite-cli ]; ++ lib.optionals pkgs.stdenv.isDarwin [ graphite-cli ];
}; };
+9 -7
View File
@@ -1,17 +1,19 @@
{ pkgs, ... }: { { pkgs, ... }:
{
home.packages = with pkgs; [ home.packages = with pkgs; [
# Python 3.14 (newest stable)
python314 python314
python314Packages.pip python314Packages.pip
python314Packages.virtualenv python314Packages.virtualenv
# Additional useful tools (python314Packages.pipx.overridePythonAttrs (_: {
python314Packages.pipx # Install Python apps in isolated environments doCheck = false;
uv # Fast Python package installer (alternative to pip) }))
uv
]; ];
# Set up default Python version home.sessionVariables = {
home.sessionVariables = { PYTHON = "${pkgs.python313}/bin/python3"; }; PYTHON = "${pkgs.python313}/bin/python3";
};
programs.fish.shellAliases = { programs.fish.shellAliases = {
venv = "python3 -m venv"; venv = "python3 -m venv";
+30 -102
View File
@@ -15,19 +15,16 @@
fd # find alternative fd # find alternative
bat # cat alternative bat # cat alternative
ripgrep # grep alternative ripgrep # grep alternative
doas # sudo alternative
dnsutils dnsutils
# LLM in the Terminal
(pkgs.llm.withPlugins { llm-groq = true; })
# Fun stuff # Fun stuff
zoxide zoxide
lolcat lolcat
cmatrix cmatrix
]; ];
programs.kitty = { programs = {
kitty = {
enable = true; enable = true;
font = { font = {
@@ -77,60 +74,9 @@
}; };
}; };
# Doenst work cava = lib.mkIf (!isDarwin) { enable = true; };
programs.iamb = {
enable = false;
settings = {
default_profile = "personal";
settings = {
notifications.enabled = true;
image_preview.protocol = {
type = "kitty";
size = {
height = 10;
width = 66;
};
};
};
};
};
programs.newsboat = { yazi = {
enable = true;
autoReload = true;
browser = if isDarwin then "open" else "xdg-open";
urls = [
{
url = "https://www.tagesschau.de/xml/rss2";
tags = [
"news"
"de"
];
}
{
url = "https://www.spiegel.de/schlagzeilen/index.rss";
tags = [
"news"
"de"
];
}
{
url = "https://www.focus.de/rss";
tags = [
"news"
"de"
];
}
{
url = "https://feeds.feedburner.com/blogspot/rkEL";
tags = [ "blog" ];
}
];
};
programs.cava = lib.mkIf (!isDarwin) { enable = true; };
programs.yazi = {
enable = true; enable = true;
enableBashIntegration = true; enableBashIntegration = true;
enableZshIntegration = true; enableZshIntegration = true;
@@ -145,7 +91,7 @@
}; };
}; };
programs.fzf = { fzf = {
enable = true; enable = true;
enableBashIntegration = true; enableBashIntegration = true;
enableZshIntegration = true; enableZshIntegration = true;
@@ -161,43 +107,31 @@
]; ];
}; };
# TODO: Install OpenCode nushell = {
programs.nushell = {
enable = true; enable = true;
shellAliases = { shellAliases = {
# ls = "eza --icons=always";
la = "ls -la"; la = "ls -la";
#tree = "eza --icons=always -T";
i = "kitty +kitten icat"; i = "kitty +kitten icat";
# cat = "bat --color=always --style=numbers";
grep = "rg"; grep = "rg";
}; };
extraConfig = '' extraConfig = ''
$env.config = { $env.config = {
show_banner: false show_banner: false
} }
# Starship # Starship
$env.STARSHIP_SHELL = "nu" $env.STARSHIP_SHELL = "nu"
mkdir ~/.cache/starship mkdir ~/.cache/starship
starship init nu | save -f ~/.cache/starship/init.nu starship init nu | save -f ~/.cache/starship/init.nu
# fzf picker for nvim # fzf picker for nvim
def f [] { nvim (fzf) } def f [] { nvim (fzf) }
# llm | glow
def l [...args] { llm prompt -m groq/llama-3.3-70b-versatile -t std ...$args | glow }
''; '';
extraEnv = '' extraEnv = ''
starship init nu | save -f ~/.cache/starship/init.nu starship init nu | save -f ~/.cache/starship/init.nu
use ~/.cache/starship/init.nu use ~/.cache/starship/init.nu
''; '';
}; };
programs.fish = { fish = {
enable = true; enable = true;
shellAliases = { shellAliases = {
@@ -237,36 +171,9 @@
echo " |___/|_| |_| "; echo " |___/|_| |_| ";
end end
''; '';
functions.l = {
body = ''
if test -f "$GROQ_API_KEY"
set -x GROQ_API_KEY (cat $GROQ_API_KEY)
end
llm prompt -m groq/llama-3.3-70b-versatile -t std $argv | glow
'';
};
}; };
# Link LLM std template starship = {
home.file.".config/io.datasette.llm/templates/std.yaml".text = ''
system: |
You are a concise technical assistant running on an Intel Mac (x86_64-darwin)
with nix-darwin and home-manager.
Rules:
- Always respond in valid markdown
- Be concise and direct, no unnecessary explanation
- Prefer code blocks for commands and code
- You have access to these tools in the shell: nvim, fish, git,
eza, bat, ripgrep, fzf, yazi, glow, llm, zoxide, fastfetch,
nix, darwin-rebuild, brew
- When suggesting nix config changes, use the nix language
- nix-switch rebuilds the system config
- nix-check validates the flake without building
'';
programs.starship = {
enable = true; enable = true;
settings = { settings = {
add_newline = true; add_newline = true;
@@ -334,11 +241,32 @@
}; };
}; };
}; };
};
home.file = { home = {
file = {
".config/fastfetch/config.jsonc".source = ./fastfetch.jsonc; ".config/fastfetch/config.jsonc".source = ./fastfetch.jsonc;
".config/tabiew/theme.toml".source = ./tabiew.toml; ".config/tabiew/theme.toml".source = ./tabiew.toml;
".config/kitty/tab_bar.py".source = ./tab_bar.py; ".config/kitty/tab_bar.py".source = ./tab_bar.py;
".hushlogin" = lib.mkIf isDarwin { text = ""; }; # Suppress Login ".hushlogin" = lib.mkIf isDarwin { text = ""; }; # Suppress Login
# Link LLM std template
".config/io.datasette.llm/templates/std.yaml".text = ''
system: |
You are a concise technical assistant running on an Intel Mac (x86_64-darwin)
with nix-darwin and home-manager.
Rules:
- Always respond in valid markdown
- Be concise and direct, no unnecessary explanation
- Prefer code blocks for commands and code
- You have access to these tools in the shell: nvim, fish, git,
eza, bat, ripgrep, fzf, yazi, glow, llm, zoxide, fastfetch,
nix, darwin-rebuild, brew
- When suggesting nix config changes, use the nix language
- nix-switch rebuilds the system config
- nix-check validates the flake without building
'';
};
}; };
} }
+12 -13
View File
@@ -3,35 +3,34 @@
programs.ssh = { programs.ssh = {
enable = true; enable = true;
enableDefaultConfig = false; enableDefaultConfig = false;
matchBlocks = { settings = {
"*" = { "*" = {
addKeysToAgent = "yes"; AddKeysToAgent = "yes";
}; };
"*.cyperpunk.de" = { "*.cyperpunk.de" = {
identityFile = IdentityFile =
if isDarwin then "/Users/${primaryUser}/.ssh/ssh" else "/home/${primaryUser}/.ssh/ssh"; if isDarwin then "/Users/${primaryUser}/.ssh/ssh" else "/home/${primaryUser}/.ssh/ssh";
user = primaryUser; User = primaryUser;
}; };
"github.com" = { "github.com" = {
identityFile = IdentityFile =
if isDarwin then "/Users/${primaryUser}/.ssh/github" else "/home/${primaryUser}/.ssh/github"; if isDarwin then "/Users/${primaryUser}/.ssh/github" else "/home/${primaryUser}/.ssh/github";
user = "git"; User = "git";
}; };
"git.rz.tu-bs.de" = { "git.rz.tu-bs.de" = {
identityFile = IdentityFile =
if isDarwin then "/Users/${primaryUser}/.ssh/github" else "/home/${primaryUser}/.ssh/github"; if isDarwin then "/Users/${primaryUser}/.ssh/github" else "/home/${primaryUser}/.ssh/github";
User = "git";
user = "git";
}; };
"git.cyperpunk.de" = { "git.cyperpunk.de" = {
hostname = "git.cyperpunk.de"; HostName = "git.cyperpunk.de";
port = 12222; Port = 12222;
user = "gitea"; User = "gitea";
identityFile = IdentityFile =
if isDarwin then "/Users/${primaryUser}/.ssh/ssh" else "/home/${primaryUser}/.ssh/ssh"; if isDarwin then "/Users/${primaryUser}/.ssh/ssh" else "/home/${primaryUser}/.ssh/ssh";
}; };
}; };
+2 -1
View File
@@ -11,10 +11,11 @@
../../nixos/roles/gitea.nix ../../nixos/roles/gitea.nix
../../nixos/roles/vaultwarden.nix ../../nixos/roles/vaultwarden.nix
../../nixos/roles/frontpage ../../nixos/roles/frontpage
../../nixos/roles/paperless-ngx.nix #../../nixos/roles/paperless-ngx.nix
../../nixos/roles/octoprint.nix ../../nixos/roles/octoprint.nix
../../nixos/roles/matrix/postgres-backup.nix ../../nixos/roles/matrix/postgres-backup.nix
../../nixos/roles/kanidm.nix ../../nixos/roles/kanidm.nix
../../nixos/roles/ollama.nix
]; ];
networking = { networking = {
@@ -38,7 +38,6 @@
]; ];
}; };
# TODO: Add External Devices as by-label with no necessity for boot
"/storage/internal" = { "/storage/internal" = {
device = "/dev/disk/by-label/STORAGE"; device = "/dev/disk/by-label/STORAGE";
fsType = "btrfs"; fsType = "btrfs";
+8 -3
View File
@@ -33,16 +33,21 @@
efi.canTouchEfiVariables = true; efi.canTouchEfiVariables = true;
}; };
services.desktopManager.plasma6.enable = false; services = {
services.displayManager.sddm = { desktopManager.plasma6.enable = false;
displayManager.sddm = {
enable = false; enable = false;
wayland.enable = true; wayland.enable = true;
}; };
};
environment.pathsToLink = [ environment.pathsToLink = [
"/share/applications" "/share/applications"
"/share/xdg-desktop-portal" "/share/xdg-desktop-portal"
]; ];
system.stateVersion = "26.05"; system.stateVersion = "26.11";
virtualisation.docker.enable = true;
users.users.phil.extraGroups = [ "docker" ];
} }
-5
View File
@@ -1,11 +1,6 @@
{ {
imports = [ imports = [
./hardware-configuration.nix ./hardware-configuration.nix
../../nixos/roles/monitoring.nix
../../nixos/roles/matrix.nix
../../nixos/roles/postgresql.nix
../../nixos/roles/wyl.nix
../../nixos/roles/adguard.nix
]; ];
networking = { networking = {
-2
View File
@@ -1,8 +1,6 @@
{ {
imports = [ imports = [
./hardware-configuration.nix ./hardware-configuration.nix
../../nixos/roles/gitea.nix
../../nixos/roles/filebrowser.nix
]; ];
networking = { networking = {
+5 -2
View File
@@ -34,9 +34,12 @@
"/boot" = { "/boot" = {
device = "/dev/disk/by-label/NIXBOOT"; device = "/dev/disk/by-label/NIXBOOT";
fsType = "vfat"; fsType = "vfat";
options = [ "fmask=0022" "dmask=0022" ]; options = [
"fmask=0022"
"dmask=0022"
];
};
}; };
};
swapDevices = [ ]; swapDevices = [ ];
+1 -4
View File
@@ -4,6 +4,7 @@
catppuccin = { catppuccin = {
enable = true; enable = true;
autoEnable = false;
accent = "sky"; accent = "sky";
flavor = "mocha"; flavor = "mocha";
cache.enable = true; cache.enable = true;
@@ -11,9 +12,5 @@
enable = true; enable = true;
accent = "sapphire"; accent = "sapphire";
}; };
fcitx5.enable = false;
forgejo.enable = false;
gitea.enable = false;
sddm.enable = false;
}; };
} }
+10 -38
View File
@@ -9,7 +9,6 @@
}: }:
{ {
imports = [ imports = [
./fonts.nix
./sops.nix ./sops.nix
./locale.nix ./locale.nix
./tailscale.nix ./tailscale.nix
@@ -19,7 +18,6 @@
./regreet.nix ./regreet.nix
./plymouth.nix ./plymouth.nix
./audio.nix ./audio.nix
# ./webcam.nix
./virt.nix ./virt.nix
./catppuccin.nix ./catppuccin.nix
]; ];
@@ -50,6 +48,7 @@
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
"cyper-cache.cachix.org-1:pOpeWFEjGHg9XvqRg+DQpYnGRQNp+z+QEF8Ev2mbSoM=" "cyper-cache.cachix.org-1:pOpeWFEjGHg9XvqRg+DQpYnGRQNp+z+QEF8Ev2mbSoM="
]; ];
auto-optimise-store = true;
}; };
gc = { gc = {
automatic = true; automatic = true;
@@ -58,33 +57,9 @@
}; };
}; };
# TODO: Get rid of this nixpkgs.config = {
virtualisation = lib.mkIf isServer { allowUnfree = true;
vmVariant = { permittedInsecurePackages = [ "olm-3.2.16" ];
virtualisation = {
forwardPorts = [
{
from = "host";
host.port = 2222;
guest.port = 22;
}
];
qemu.networkingOptions = [
"-device virtio-net-pci,netdev=net0"
"-netdev user,id=net0,net=10.0.2.0/24,dhcpstart=10.0.2.15"
];
};
systemd.network.networks."10-ethernet" = lib.mkForce {
matchConfig.Name = "ens*";
networkConfig = {
Address = "10.0.2.15/24";
Gateway = "10.0.2.2";
DNS = "8.8.8.8";
DHCP = "no";
};
};
};
}; };
documentation = { documentation = {
@@ -94,26 +69,23 @@
info.enable = false; info.enable = false;
}; };
nixpkgs = {
overlays = [ (import ./packages/overlays.nix) ];
config.allowUnfree = true;
};
programs = { programs = {
fish.enable = true; fish.enable = true;
} }
// lib.optionalAttrs (!isServer) { // lib.optionalAttrs (!isServer) {
dconf.enable = true; dconf.enable = true;
hyprland = {
enable = false;
package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
};
steam.enable = true; steam.enable = true;
appimage = { appimage = {
enable = true; enable = true;
binfmt = true; binfmt = true;
}; };
hyprland = {
enable = true;
package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
}; };
};
environment.systemPackages = with pkgs; [ git ];
security = lib.mkIf (!isServer) { security = lib.mkIf (!isServer) {
pam.services.swaylock = { }; pam.services.swaylock = { };
-9
View File
@@ -1,9 +0,0 @@
# TODO: Duplicate file
{ pkgs, ... }:
{
fonts.packages = with pkgs; [
nerd-fonts.fira-code
nerd-fonts.fira-mono
nerd-fonts.hack
];
}
-4
View File
@@ -1,4 +0,0 @@
final: prev: {
gs1200-exporter = final.callPackage ./gs1200-exporter.nix { };
oidcwarden = final.callPackage ./oidcwarden.nix { inherit (prev) vaultwarden; };
}
+2 -2
View File
@@ -1,4 +1,4 @@
{ ... }: { lib, ... }:
{ {
boot = { boot = {
plymouth = { plymouth = {
@@ -15,6 +15,6 @@
"udev.log_priority=3" "udev.log_priority=3"
"rd.systemd.show_status=auto" "rd.systemd.show_status=auto"
]; ];
loader.timeout = 0; loader.timeout = lib.mkDefault 0;
}; };
} }
+65 -31
View File
@@ -2,6 +2,7 @@
pkgs, pkgs,
lib, lib,
config, config,
primaryUser,
... ...
}: }:
@@ -36,6 +37,9 @@ in
owner = "gitea"; owner = "gitea";
group = "gitea"; group = "gitea";
}; };
"gitea/runnerToken" = {
mode = "0444";
};
"kanidm_gitea_secret" = { "kanidm_gitea_secret" = {
owner = "gitea"; owner = "gitea";
group = "gitea"; group = "gitea";
@@ -43,24 +47,8 @@ in
}; };
}; };
services.postgresql = { systemd.services = {
enable = true; gitea-db-password = {
package = pkgs.postgresql_14;
ensureDatabases = [ "gitea" ];
ensureUsers = [
{
name = "gitea";
ensureDBOwnership = true;
}
];
authentication = lib.mkOverride 10 ''
local all all trust
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
'';
};
systemd.services.gitea-db-password = {
description = "Set gitea postgres user password"; description = "Set gitea postgres user password";
requires = [ "postgresql.service" ]; requires = [ "postgresql.service" ];
after = [ "postgresql.service" ]; after = [ "postgresql.service" ];
@@ -78,7 +66,35 @@ in
''; '';
}; };
services.gitea = { gitea.preStart = lib.mkAfter ''
themeDir="${config.services.gitea.stateDir}/custom/public/assets/css"
mkdir -p "$themeDir"
for f in ${giteaTheme}/*.css; do
name=$(basename "$f")
ln -sf "$f" "$themeDir/$name"
done
'';
};
services = {
postgresql = {
enable = true;
package = pkgs.postgresql_14;
ensureDatabases = [ "gitea" ];
ensureUsers = [
{
name = "gitea";
ensureDBOwnership = true;
}
];
authentication = lib.mkOverride 10 ''
local all all trust
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
'';
};
gitea = {
enable = true; enable = true;
package = pkgs.gitea; package = pkgs.gitea;
user = "gitea"; user = "gitea";
@@ -188,24 +204,42 @@ in
}; };
}; };
# symlink catppuccin css files into gitea's custom dir on every service start gitea-actions-runner.instances."cyper_nix" = {
systemd.services.gitea.preStart = lib.mkAfter '' enable = true;
themeDir="${config.services.gitea.stateDir}/custom/public/assets/css" url = "https://git.cyperpunk.de";
mkdir -p "$themeDir" tokenFile = config.sops.secrets."gitea/runnerToken".path;
for f in ${giteaTheme}/*.css; do name = "cyper-controller";
name=$(basename "$f") labels = [ "nix:host" ];
ln -sf "$f" "$themeDir/$name"
done
'';
users.users.gitea = { hostPackages = with pkgs; [
bash
coreutils
curl
gawk
gitMinimal
gnused
nodejs
wget
nix
];
};
};
users = {
users = {
gitea = {
isSystemUser = true; isSystemUser = true;
group = "gitea"; group = "gitea";
home = "/var/lib/gitea"; home = "/var/lib/gitea";
createHome = true; createHome = true;
}; };
users.groups.gitea = { };
users.users.postgres.extraGroups = [ "gitea" ]; postgres.extraGroups = [ "gitea" ];
};
groups = {
gitea = { };
};
};
networking.firewall.allowedTCPPorts = [ networking.firewall.allowedTCPPorts = [
httpPort httpPort
+1
View File
@@ -11,5 +11,6 @@
./maubot.nix ./maubot.nix
./discord-bridge.nix ./discord-bridge.nix
./whatsapp-bridge.nix ./whatsapp-bridge.nix
./meta-bridge.nix
]; ];
} }
+35 -9
View File
@@ -1,17 +1,23 @@
{ config, lib, ... }: { config, lib, ... }:
{ {
nixpkgs.config.permittedInsecurePackages = [ "olm-3.2.16" ]; sops.secrets = {
discord_bot_token = {
sops.secrets.discord_bot_token = {
owner = "mautrix-discord"; owner = "mautrix-discord";
group = "mautrix-discord"; group = "mautrix-discord";
}; };
sops.secrets.discord_client_id = { discord_client_id = {
owner = "mautrix-discord"; owner = "mautrix-discord";
group = "mautrix-discord"; group = "mautrix-discord";
}; };
discord_pickle_key = {
owner = "mautrix-discord";
group = "mautrix-discord";
};
};
systemd.services.mautrix-discord-env = { systemd = {
services = {
mautrix-discord-env = {
before = [ "mautrix-discord-registration.service" ]; before = [ "mautrix-discord-registration.service" ];
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
serviceConfig = { serviceConfig = {
@@ -22,12 +28,21 @@
mkdir -p /run/mautrix-discord mkdir -p /run/mautrix-discord
echo "DISCORD_BOT_TOKEN=$(cat ${config.sops.secrets.discord_bot_token.path})" > /run/mautrix-discord/env echo "DISCORD_BOT_TOKEN=$(cat ${config.sops.secrets.discord_bot_token.path})" > /run/mautrix-discord/env
echo "DISCORD_CLIENT_ID=$(cat ${config.sops.secrets.discord_client_id.path})" >> /run/mautrix-discord/env echo "DISCORD_CLIENT_ID=$(cat ${config.sops.secrets.discord_client_id.path})" >> /run/mautrix-discord/env
echo "DISCORD_PICKLE_KEY=$(cat ${config.sops.secrets.discord_pickle_key.path})" >> /run/mautrix-discord/env
chmod 600 /run/mautrix-discord/env chmod 600 /run/mautrix-discord/env
chown mautrix-discord:mautrix-discord /run/mautrix-discord/env chown mautrix-discord:mautrix-discord /run/mautrix-discord/env
''; '';
}; };
services.postgresql = { mautrix-discord-registration.serviceConfig.UMask = lib.mkForce "0750";
};
tmpfiles.rules = [
"z /var/lib/mautrix-discord/discord-registration.yaml 0640 mautrix-discord mautrix-discord -"
];
};
services = {
postgresql = {
ensureUsers = [ ensureUsers = [
{ {
name = "mautrix-discord"; name = "mautrix-discord";
@@ -37,7 +52,7 @@
ensureDatabases = [ "mautrix-discord" ]; ensureDatabases = [ "mautrix-discord" ];
}; };
services.mautrix-discord = { mautrix-discord = {
enable = true; enable = true;
environmentFile = "/run/mautrix-discord/env"; environmentFile = "/run/mautrix-discord/env";
settings = { settings = {
@@ -66,7 +81,16 @@
}; };
}; };
}; };
encryption = {
allow = true;
default = true;
pickle_key = "$DISCORD_PICKLE_KEY";
verification_levels = {
receive = "unverified";
send = "unverified";
share = "cross-signed-tofu";
};
};
}; };
discord = { discord = {
client_id = "$DISCORD_CLIENT_ID"; client_id = "$DISCORD_CLIENT_ID";
@@ -74,5 +98,7 @@
}; };
}; };
}; };
systemd.services.mautrix-discord-registration.serviceConfig.UMask = lib.mkForce "0022"; };
users.users.matrix-synapse.extraGroups = [ "mautrix-discord" ];
} }
+125
View File
@@ -0,0 +1,125 @@
{ config, lib, ... }:
{
sops.secrets = {
meta_as_token = {
owner = "mautrix-meta-facebook";
group = "mautrix-meta";
};
meta_hs_token = {
owner = "mautrix-meta-facebook";
group = "mautrix-meta";
};
instagram_as_token = {
owner = "mautrix-meta-instagram";
group = "mautrix-meta";
};
instagram_hs_token = {
owner = "mautrix-meta-instagram";
group = "mautrix-meta";
};
};
systemd.services = {
mautrix-meta-facebook-env = {
before = [ "mautrix-meta-facebook-registration.service" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
script = ''
mkdir -p /run/mautrix-meta-facebook
echo "META_AS_TOKEN=$(cat ${config.sops.secrets.meta_as_token.path})" > /run/mautrix-meta-facebook/env
echo "META_HS_TOKEN=$(cat ${config.sops.secrets.meta_hs_token.path})" >> /run/mautrix-meta-facebook/env
chmod 600 /run/mautrix-meta-facebook/env
chown mautrix-meta-facebook:mautrix-meta /run/mautrix-meta-facebook/env
'';
};
mautrix-meta-instagram-env = {
before = [ "mautrix-meta-instagram-registration.service" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
script = ''
mkdir -p /run/mautrix-meta-instagram
echo "INSTAGRAM_AS_TOKEN=$(cat ${config.sops.secrets.instagram_as_token.path})" > /run/mautrix-meta-instagram/env
echo "INSTAGRAM_HS_TOKEN=$(cat ${config.sops.secrets.instagram_hs_token.path})" >> /run/mautrix-meta-instagram/env
chmod 600 /run/mautrix-meta-instagram/env
chown mautrix-meta-instagram:mautrix-meta /run/mautrix-meta-instagram/env
'';
};
mautrix-meta-facebook-registration.serviceConfig.UMask = lib.mkForce "0022";
mautrix-meta-instagram-registration.serviceConfig.UMask = lib.mkForce "0022";
};
services = {
postgresql = {
ensureUsers = [
{
name = "mautrix-meta-facebook";
ensureDBOwnership = true;
}
{
name = "mautrix-meta-instagram";
ensureDBOwnership = true;
}
];
ensureDatabases = [
"mautrix-meta-facebook"
"mautrix-meta-instagram"
];
};
mautrix-meta.instances = {
facebook = {
enable = true;
environmentFile = "/run/mautrix-meta-facebook/env";
settings = {
homeserver = {
address = "http://127.0.0.1:8008";
domain = "cyperpunk.de";
};
database = {
type = "postgres";
uri = "postgres:///mautrix-meta-facebook?host=/run/postgresql&sslmode=disable";
};
appservice = {
as_token = "$META_AS_TOKEN";
hs_token = "$META_HS_TOKEN";
};
bridge.permissions = {
"cyperpunk.de" = "user";
"@dergrumpf:cyperpunk.de" = "admin";
};
};
};
instagram = {
enable = true;
environmentFile = "/run/mautrix-meta-instagram/env";
settings = {
homeserver = {
address = "http://127.0.0.1:8008";
domain = "cyperpunk.de";
};
database = {
type = "postgres";
uri = "postgres:///mautrix-meta-instagram?host=/run/postgresql&sslmode=disable";
};
appservice = {
as_token = "$INSTAGRAM_AS_TOKEN";
hs_token = "$INSTAGRAM_HS_TOKEN";
};
bridge.permissions = {
"cyperpunk.de" = "user";
"@dergrumpf:cyperpunk.de" = "admin";
};
};
};
};
};
}
+7 -1
View File
@@ -62,7 +62,7 @@ in
}; };
settings = { settings = {
server = { server = {
domain = "www.cyperpunk.de"; # serverIP; # "grafana.cyperpunk.de"; domain = "www.cyperpunk.de";
http_port = 2342; http_port = 2342;
http_addr = "0.0.0.0"; http_addr = "0.0.0.0";
root_url = "https://www.cyperpunk.de/grafana/"; root_url = "https://www.cyperpunk.de/grafana/";
@@ -71,6 +71,8 @@ in
security = { security = {
secret_key = "$__file{${config.sops.secrets.grafana_secret_key.path}}"; secret_key = "$__file{${config.sops.secrets.grafana_secret_key.path}}";
allow_embedding = true; allow_embedding = true;
cookie_samesite = "none";
cookie_secure = true;
}; };
auth = { auth = {
disable_login_form = false; disable_login_form = false;
@@ -92,6 +94,10 @@ in
auto_assign_org_role = "Admin"; auto_assign_org_role = "Admin";
skip_org_role_sync = true; skip_org_role_sync = true;
}; };
"auth.anonymous" = {
enabled = true;
org_role = "Viewer";
};
}; };
}; };
+19
View File
@@ -36,6 +36,10 @@ in
12222 12222
]; ];
systemd.tmpfiles.rules = [
"d /var/www/home.cyperpunk.de 0755 nginx nginx -"
];
security.acme = { security.acme = {
acceptTerms = true; acceptTerms = true;
defaults.email = "phil.keier@hotmail.com"; defaults.email = "phil.keier@hotmail.com";
@@ -70,6 +74,17 @@ in
"calvin.cyperpunk.de" = mkWsProxy 15006; "calvin.cyperpunk.de" = mkWsProxy 15006;
"auth.cyperpunk.de" = mkHttpsProxy 8444; "auth.cyperpunk.de" = mkHttpsProxy 8444;
#"home.cyperpunk.de" = {
# forceSSL = true;
# enableACME = true;
# locations."/" = {
# root = "/var/www/home.cyperpunk.de";
# extraConfig = ''
# try_files $uri $uri/ =404;
# '';
# };
#};
"www.cyperpunk.de" = { "www.cyperpunk.de" = {
forceSSL = true; forceSSL = true;
enableACME = true; enableACME = true;
@@ -81,6 +96,10 @@ in
"/grafana" = { "/grafana" = {
proxyPass = "http://${upstream}:2342"; proxyPass = "http://${upstream}:2342";
proxyWebsockets = true; proxyWebsockets = true;
extraConfig = ''
add_header X-Frame-Options "";
add_header Content-Security-Policy "frame-ancestors *";
'';
}; };
}; };
}; };
+23
View File
@@ -0,0 +1,23 @@
_: {
services.ollama = {
enable = true;
host = "0.0.0.0";
port = 11434;
openFirewall = true;
loadModels = [
"llama3.2:3b"
"qwen2.5:3b"
"deepseek-r1:1.5b"
"gemma4:e2b"
];
syncModels = true;
environmentVariables = {
OLLAMA_CONTEXT_LENGTH = "16384";
};
};
}
-2
View File
@@ -1,8 +1,6 @@
{ pkgs, ... }: { pkgs, ... }:
{ {
nixpkgs.config.allowUnfree = true;
services.unifi = { services.unifi = {
enable = true; enable = true;
unifiPackage = pkgs.unifi; unifiPackage = pkgs.unifi;
+374
View File
@@ -0,0 +1,374 @@
/* ===== Catppuccin for Vaultwarden ===== */
/* Light: Latte | Dark: Mocha */
:root {
/* ---------- Palette ---------- */
--ctp-rosewater: #dc8a78;
--ctp-flamingo: #dd7878;
--ctp-pink: #ea76cb;
--ctp-mauve: #8839ef;
--ctp-red: #d20f39;
--ctp-maroon: #e64553;
--ctp-peach: #fe640b;
--ctp-yellow: #df8e1d;
--ctp-green: #40a02b;
--ctp-teal: #179299;
--ctp-sky: #04a5e5;
--ctp-sapphire: #209fb5;
--ctp-blue: #1e66f5;
--ctp-lavender: #7287fd;
--ctp-text: #4c4f69;
--ctp-subtext1: #5c5f77;
--ctp-subtext0: #6c6f85;
--ctp-overlay2: #7c7f93;
--ctp-overlay1: #8c8fa1;
--ctp-overlay0: #9ca0b0;
--ctp-surface2: #acb0be;
--ctp-surface1: #bcc0cc;
--ctp-surface0: #ccd0da;
--ctp-base: #eff1f5;
--ctp-mantle: #e6e9ef;
--ctp-crust: #dce0e8;
/* ---------- Semantic mappings ---------- */
--color-white: #ffffff;
--color-black: #000000;
--color-white-rgb: 255, 255, 255;
--color-black-rgb: 0, 0, 0;
/* Grays (using Catppuccin surface hierarchy) */
--color-gray-050: var(--ctp-base);
--color-gray-100: var(--ctp-mantle);
--color-gray-200: var(--ctp-crust);
--color-gray-300: var(--ctp-surface0);
--color-gray-400: var(--ctp-surface1);
--color-gray-400-rgb: 188, 192, 204; /* approx surface1 */
--color-gray-500: var(--ctp-surface2);
--color-gray-600: var(--ctp-overlay0);
--color-gray-700: var(--ctp-overlay1);
--color-gray-800: var(--ctp-overlay2);
--color-gray-900: var(--ctp-text);
--color-gray-950: var(--ctp-subtext0);
--color-gray-950-rgb: 108, 111, 133; /* subtext0 */
/* Brand / Primary (using Blue) */
--color-brand-050: #eef6ff; /* keep similar, but well use surface tints? We'll just leave as is or tint */
--color-brand-100: var(--ctp-surface0);
--color-brand-200: var(--ctp-surface1);
--color-brand-300: #8ec5ff;
--color-brand-400: #6baefa;
--color-brand-500: var(--ctp-blue);
--color-brand-600: var(--ctp-blue);
--color-brand-700: var(--ctp-blue);
--color-brand-800: #0d43af; /* keep a dark blue for contrast */
--color-brand-900: #0c3276;
--color-brand-950: #162455;
--color-brand-950-rgb: 22, 36, 85;
/* Red */
--color-red-050: var(--ctp-surface0);
--color-red-100: var(--ctp-mantle);
--color-red-200: var(--ctp-crust);
--color-red-300: var(--ctp-red);
--color-red-400: var(--ctp-red);
--color-red-500: var(--ctp-red);
--color-red-600: var(--ctp-red);
--color-red-700: var(--ctp-red);
--color-red-800: var(--ctp-maroon);
--color-red-900: var(--ctp-maroon);
--color-red-950: var(--ctp-maroon);
/* Orange / Warning */
--color-orange-050: var(--ctp-surface0);
--color-orange-100: var(--ctp-mantle);
--color-orange-200: var(--ctp-crust);
--color-orange-300: var(--ctp-peach);
--color-orange-400: var(--ctp-peach);
--color-orange-500: var(--ctp-peach);
--color-orange-600: var(--ctp-peach);
--color-orange-700: var(--ctp-peach);
--color-orange-800: var(--ctp-yellow);
--color-orange-900: var(--ctp-yellow);
--color-orange-950: var(--ctp-yellow);
/* Yellow */
--color-yellow-050: var(--ctp-surface0);
--color-yellow-100: var(--ctp-mantle);
--color-yellow-200: var(--ctp-crust);
--color-yellow-300: var(--ctp-yellow);
--color-yellow-400: var(--ctp-yellow);
--color-yellow-500: var(--ctp-yellow);
--color-yellow-600: var(--ctp-yellow);
--color-yellow-700: var(--ctp-yellow);
--color-yellow-800: var(--ctp-yellow);
--color-yellow-900: var(--ctp-yellow);
--color-yellow-950: var(--ctp-yellow);
/* Green / Success */
--color-green-050: var(--ctp-surface0);
--color-green-100: var(--ctp-mantle);
--color-green-200: var(--ctp-crust);
--color-green-300: var(--ctp-green);
--color-green-400: var(--ctp-green);
--color-green-500: var(--ctp-green);
--color-green-600: var(--ctp-green);
--color-green-700: var(--ctp-green);
--color-green-800: var(--ctp-teal);
--color-green-900: var(--ctp-teal);
--color-green-950: var(--ctp-teal);
/* Pink */
--color-pink-050: var(--ctp-surface0);
--color-pink-100: var(--ctp-mantle);
--color-pink-200: var(--ctp-crust);
--color-pink-300: var(--ctp-pink);
--color-pink-400: var(--ctp-pink);
--color-pink-500: var(--ctp-pink);
--color-pink-600: var(--ctp-pink);
--color-pink-700: var(--ctp-mauve);
--color-pink-800: var(--ctp-mauve);
--color-pink-900: var(--ctp-mauve);
--color-pink-950: var(--ctp-mauve);
/* Coral (use Peach) */
--color-coral-050: var(--ctp-surface0);
--color-coral-100: var(--ctp-mantle);
--color-coral-200: var(--ctp-crust);
--color-coral-300: var(--ctp-peach);
--color-coral-400: var(--ctp-peach);
--color-coral-500: var(--ctp-peach);
--color-coral-600: var(--ctp-peach);
--color-coral-700: var(--ctp-peach);
--color-coral-800: var(--ctp-peach);
--color-coral-900: var(--ctp-peach);
--color-coral-950: var(--ctp-peach);
/* Teal */
--color-teal-050: var(--ctp-surface0);
--color-teal-100: var(--ctp-mantle);
--color-teal-200: var(--ctp-crust);
--color-teal-300: var(--ctp-teal);
--color-teal-400: var(--ctp-teal);
--color-teal-500: var(--ctp-teal);
--color-teal-600: var(--ctp-teal);
--color-teal-700: var(--ctp-teal);
--color-teal-800: var(--ctp-sky);
--color-teal-900: var(--ctp-sky);
--color-teal-950: var(--ctp-sky);
/* Purple (use Mauve) */
--color-purple-050: var(--ctp-surface0);
--color-purple-100: var(--ctp-mantle);
--color-purple-200: var(--ctp-crust);
--color-purple-300: var(--ctp-mauve);
--color-purple-400: var(--ctp-mauve);
--color-purple-500: var(--ctp-mauve);
--color-purple-600: var(--ctp-mauve);
--color-purple-700: var(--ctp-mauve);
--color-purple-800: var(--ctp-mauve);
--color-purple-900: var(--ctp-mauve);
--color-purple-950: var(--ctp-mauve);
/* Semantic foreground / background aliases */
--color-fg-heading: var(--ctp-text);
--color-fg-body: var(--ctp-text);
--color-fg-body-subtle: var(--ctp-subtext1);
--color-fg-disabled: var(--ctp-overlay0);
--color-fg-brand: var(--ctp-blue);
--color-fg-success: var(--ctp-green);
--color-fg-danger: var(--ctp-red);
--color-fg-warning: var(--ctp-peach);
--color-fg-sensitive: var(--ctp-pink);
--color-bg-primary: var(--ctp-base);
--color-bg-secondary: var(--ctp-mantle);
--color-bg-tertiary: var(--ctp-crust);
--color-bg-quaternary: var(--ctp-surface0);
--color-bg-disabled: var(--ctp-surface0);
--color-bg-gray: var(--ctp-surface1);
--color-bg-gray-strong: var(--ctp-surface2);
--color-bg-contrast-soft: var(--ctp-overlay1);
--color-bg-contrast: var(--ctp-overlay2);
--color-bg-contrast-strong: var(--ctp-text);
--color-border-muted: var(--ctp-mantle);
--color-border-light: var(--ctp-crust);
--color-border-base: var(--ctp-surface0);
--color-border-strong: var(--ctp-surface1);
--color-border-stronger: var(--ctp-overlay0);
--color-bg-hover: rgba(var(--color-gray-950-rgb), 0.05);
--color-bg-hover-contrast: rgba(255, 255, 255, 0.05);
--color-bg-overlay: rgba(2, 6, 24, 0.3); /* keep dark overlay */
/* Navigation (primary sidebar) */
--color-nav-fg-primary: var(--ctp-text);
--color-nav-bg-primary: var(--ctp-mantle);
--color-nav-bg-primary-strong: var(--ctp-crust);
--color-nav-bg-primary-hover: rgba(0,0,0,0.05);
--color-nav-bg-primary-hover-strong: rgba(0,0,0,0.1);
--color-nav-border-primary: var(--ctp-blue);
--color-nav-border-primary-focus: var(--ctp-text);
/* Misc */
--color-transparent-hover: rgb(0 0 0 / 0.02);
--color-shadow: 108 111 133; /* subtext0 */
--color-background: 239 241 245; /* base */
--color-background-alt: 230 233 239; /* mantle */
--color-background-alt2: 23 92 219; /* keep as original? We'll set to blue */
--color-background-alt3: 33 37 41; /* we map to crust rgb */
--color-background-alt4: 16 18 21;
--color-primary-100: 219 229 246; /* we map to surface0 */
--color-primary-300: 108 117 125;
--color-primary-600: 30 102 245; /* blue */
--color-primary-700: 13 60 119;
--color-secondary-100: 188 192 204;
--color-secondary-300: 156 160 176;
--color-secondary-500: 124 127 147;
--color-secondary-600: 108 111 133;
--color-secondary-700: 92 95 119;
--color-info-100: 219 229 246;
--color-info-600: 30 102 245;
--color-info-700: 13 36 123;
--color-warning-100: 255 244 212;
--color-warning-600: 254 100 11; /* peach */
--color-warning-700: 223 142 29; /* yellow */
--color-danger-100: 255 236 239;
--color-danger-600: 210 15 57; /* red */
--color-danger-700: 149 27 42;
--color-success-100: 213 243 216;
--color-success-600: 64 160 43; /* green */
--color-success-700: 8 81 15;
--color-notification-100: 255 225 247;
--color-notification-600: 192 17 118;
--color-text-main: 27 32 41; /* will be overridden by CT-Text */
--color-text-muted: 108 111 133;
--color-text-contrast: 255 255 255;
--color-text-alt2: 255 255 255;
--color-text-code: 234 118 203; /* pink */
--color-hover-default: rgba(30 102 245 / 0.1);
--color-hover-contrast: rgba(255 255 255 / 0.15);
}
/* ===== Dark Theme (Mocha) ===== */
html.theme_dark {
--ctp-rosewater: #f5e0dc;
--ctp-flamingo: #f2cdcd;
--ctp-pink: #f5c2e7;
--ctp-mauve: #cba6f7;
--ctp-red: #f38ba8;
--ctp-maroon: #eba0ac;
--ctp-peach: #fab387;
--ctp-yellow: #f9e2af;
--ctp-green: #a6e3a1;
--ctp-teal: #94e2d5;
--ctp-sky: #89dceb;
--ctp-sapphire: #74c7ec;
--ctp-blue: #89b4fa;
--ctp-lavender: #b4befe;
--ctp-text: #cdd6f4;
--ctp-subtext1: #bac2de;
--ctp-subtext0: #a6adc8;
--ctp-overlay2: #9399b2;
--ctp-overlay1: #7f849c;
--ctp-overlay0: #6c7086;
--ctp-surface2: #585b70;
--ctp-surface1: #45475a;
--ctp-surface0: #313244;
--ctp-base: #1e1e2e;
--ctp-mantle: #181825;
--ctp-crust: #11111b;
/* Grays */
--color-gray-050: var(--ctp-base);
--color-gray-100: var(--ctp-mantle);
--color-gray-200: var(--ctp-crust);
--color-gray-300: var(--ctp-surface0);
--color-gray-400: var(--ctp-surface1);
--color-gray-500: var(--ctp-surface2);
--color-gray-600: var(--ctp-overlay0);
--color-gray-700: var(--ctp-overlay1);
--color-gray-800: var(--ctp-overlay2);
--color-gray-900: var(--ctp-text);
--color-gray-950: var(--ctp-subtext0);
--color-gray-400-rgb: 69, 71, 90; /* surface1 */
--color-gray-950-rgb: 166, 173, 200; /* subtext0 */
/* Adjust semantic mappings for dark */
--color-fg-heading: var(--ctp-text);
--color-fg-body: var(--ctp-text);
--color-fg-body-subtle: var(--ctp-subtext1);
--color-fg-disabled: var(--ctp-overlay0);
--color-fg-brand: var(--ctp-blue);
--color-fg-success: var(--ctp-green);
--color-fg-danger: var(--ctp-red);
--color-fg-warning: var(--ctp-peach);
--color-fg-sensitive: var(--ctp-pink);
--color-bg-primary: var(--ctp-base);
--color-bg-secondary: var(--ctp-mantle);
--color-bg-tertiary: var(--ctp-crust);
--color-bg-quaternary: var(--ctp-surface0);
--color-bg-disabled: var(--ctp-surface0);
--color-bg-gray: var(--ctp-surface1);
--color-bg-gray-strong: var(--ctp-surface2);
--color-bg-contrast-soft: var(--ctp-overlay1);
--color-bg-contrast: var(--ctp-overlay2);
--color-bg-contrast-strong: var(--ctp-text);
--color-border-muted: var(--ctp-mantle);
--color-border-light: var(--ctp-crust);
--color-border-base: var(--ctp-surface0);
--color-border-strong: var(--ctp-surface1);
--color-border-stronger: var(--ctp-overlay0);
--color-bg-hover: rgba(166, 173, 200, 0.1);
--color-bg-hover-contrast: rgba(255, 255, 255, 0.05);
--color-bg-overlay: rgba(17, 17, 27, 0.7); /* crust with opacity */
--color-nav-fg-primary: var(--ctp-text);
--color-nav-bg-primary: var(--ctp-mantle);
--color-nav-bg-primary-strong: var(--ctp-crust);
--color-nav-bg-primary-hover: rgba(255,255,255,0.05);
--color-nav-bg-primary-hover-strong: rgba(255,255,255,0.1);
--color-nav-border-primary: var(--ctp-blue);
--color-nav-border-primary-focus: var(--ctp-text);
/* Misc rgb values */
--color-shadow: 166 173 200;
--color-background: 30 30 46; /* base */
--color-background-alt: 24 24 37; /* mantle */
--color-background-alt2: 137 180 250; /* blue */
--color-background-alt3: 17 17 27; /* crust */
--color-background-alt4: 17 17 27;
--color-primary-100: 49 50 68;
--color-primary-300: 69 71 90;
--color-primary-600: 137 180 250; /* blue */
--color-primary-700: 137 180 250;
--color-secondary-100: 69 71 90;
--color-secondary-300: 88 91 112;
--color-secondary-500: 108 112 134;
--color-secondary-600: 124 128 150;
--color-secondary-700: 147 153 178;
--color-info-100: 49 50 68;
--color-info-600: 137 180 250;
--color-info-700: 137 180 250;
--color-warning-100: 49 50 68;
--color-warning-600: 250 179 135; /* peach */
--color-warning-700: 249 226 175; /* yellow */
--color-danger-100: 49 50 68;
--color-danger-600: 243 139 168; /* red */
--color-danger-700: 235 160 172; /* maroon */
--color-success-100: 49 50 68;
--color-success-600: 166 227 161; /* green */
--color-success-700: 148 226 213; /* teal */
--color-notification-100: 49 50 68;
--color-notification-600: 245 194 231; /* pink */
--color-text-main: 205 214 244; /* text */
--color-text-muted: 166 173 200;
--color-text-contrast: 30 30 46;
--color-text-alt2: 30 30 46;
--color-text-code: 245 194 231;
--color-hover-default: rgba(137 180 250 / 0.1);
--color-hover-contrast: rgba(30 30 46 / 0.15);
}
+8
View File
@@ -5,6 +5,7 @@
}: }:
let let
port = 8222; port = 8222;
userScss = builtins.readFile ./user.vaultwarden.scss.hbs;
in in
{ {
sops.secrets.vaultwarden_env = { sops.secrets.vaultwarden_env = {
@@ -39,6 +40,7 @@ in
ExecStart = "${pkgs.findutils}/bin/find /var/lib/vaultwarden/backup -mtime +30 -delete"; ExecStart = "${pkgs.findutils}/bin/find /var/lib/vaultwarden/backup -mtime +30 -delete";
}; };
}; };
timers.vaultwarden-backup-rotate = { timers.vaultwarden-backup-rotate = {
wantedBy = [ "timers.target" ]; wantedBy = [ "timers.target" ];
timerConfig = { timerConfig = {
@@ -46,5 +48,11 @@ in
Persistent = true; Persistent = true;
}; };
}; };
tmpfiles.rules = [
"d /var/lib/vaultwarden/templates 0750 vaultwarden vaultwarden -"
"d /var/lib/vaultwarden/templates/scss 0750 vaultwarden vaultwarden -"
"L+ /var/lib/vaultwarden/templates/scss/user.vaultwarden.scss.hbs 0640 vaultwarden vaultwarden - ${pkgs.writeText "user.vaultwarden.scss.hbs" userScss}"
];
}; };
} }
-28
View File
@@ -1,28 +0,0 @@
{ pkgs, ... }: {
# TODO: This need to be tested against the cam and kernel rules need to be refined
services.udev.extraRules = ''
ACTION=="add", \
SUBSYSTEM=="usb", \
ATTR{idVendor}=="04a9", \
ATTR{idProduct}=="31ea", \
RUN+="${pkgs.systemd}/bin/systemctl restart webcam"
'';
systemd.services.webcam = {
enable = true;
description = "Canon Camera Webcam";
script = ''
${pkgs.gphoto2}/bin/gphoto2 --stdout --capture-movie | \
${pkgs.ffmpeg}/bin/ffmpeg \
-i - \
-vcodec rawvideo \
-pix_fmt yuv420p \
-threads 0 \
-framerate 30 \
-f v4l2 \
/dev/video0
'';
wantedBy = [ "multi-user.target" ];
};
}
+10
View File
@@ -0,0 +1,10 @@
{ nur }:
final: prev:
(nur.overlays.default final prev)
// {
gs1200-exporter = final.callPackage ./gs1200-exporter.nix { };
oidcwarden = final.callPackage ./oidcwarden.nix {
inherit (prev) vaultwarden;
};
netradiant-custom = final.callPackage ./netradiant-custom.nix { };
}
+100
View File
@@ -0,0 +1,100 @@
{
lib,
stdenv,
fetchFromGitHub,
fetchgit,
pkg-config,
makeWrapper,
subversion,
git,
unzip,
wget,
qt5,
glib,
libxml2,
zlib,
libpng,
assimp,
}:
let
xonoticPack = fetchgit {
url = "https://gitlab.com/xonotic/netradiant-xonoticpack.git";
rev = "b9b95499e6bd1082a4eaff78664f9243cbcbb2e1";
hash = "sha256-boSWipgiQzXHFJ0KGpd8xbwik3hKQK3IKSNByUaUHBk=";
};
in
stdenv.mkDerivation rec {
pname = "netradiant-custom";
version = "20260114";
__structuredAttrs = true;
src = fetchFromGitHub {
owner = "Garux";
repo = "netradiant-custom";
rev = version;
hash = "sha256-dlJn10Y45mx3UwxvB8mzw5Ok8LvvxVpMwDAdHXSt5dk=";
};
nativeBuildInputs = [
pkg-config
makeWrapper
subversion
git
unzip
wget
];
buildInputs = [
qt5.qtbase
qt5.qtsvg
glib
libxml2
zlib
libpng
assimp
];
makeFlags = [
"DOWNLOAD_GAMEPACKS=no"
"DEPENDENCIES_CHECK=off"
"BUILD=release"
];
enableParallelBuilding = true;
dontWrapQtApps = true;
installPhase = ''
runHook preInstall
mkdir -p $out/opt/netradiant-custom
cp -r install/* $out/opt/netradiant-custom/
# Replicates what upstream's install-gamepack.sh does:
# - files in <pack>/games/*.game go into gamepacks/games/
# - directories named <pack>/*.game go into gamepacks/ directly
mkdir -p $out/opt/netradiant-custom/gamepacks/games
if [ -d "${xonoticPack}/games" ]; then
cp -r ${xonoticPack}/games/*.game $out/opt/netradiant-custom/gamepacks/games/
fi
for d in ${xonoticPack}/*.game; do
cp -r "$d" $out/opt/netradiant-custom/gamepacks/
done
mkdir -p $out/bin
makeWrapper $out/opt/netradiant-custom/radiant.x86_64 $out/bin/netradiant-custom \
--chdir "$out/opt/netradiant-custom" \
--prefix QT_PLUGIN_PATH : "${qt5.qtbase}/${qt5.qtbase.qtPluginPrefix}" \
--set QT_QPA_PLATFORM xcb
runHook postInstall
'';
meta = {
description = "Cross-platform level editor for id Tech based games (NetRadiant fork)";
homepage = "https://github.com/Garux/netradiant-custom";
license = lib.licenses.gpl2Plus;
mainProgram = "netradiant-custom";
platforms = lib.platforms.linux;
};
}
@@ -15,8 +15,9 @@ in
vaultwarden.overrideAttrs (old: { vaultwarden.overrideAttrs (old: {
pname = "oidcwarden"; pname = "oidcwarden";
inherit src; inherit src;
cargoDeps = rustPlatform.importCargoLock { cargoDeps = rustPlatform.fetchCargoVendor {
lockFile = "${src}/Cargo.lock"; inherit src;
hash = "sha256-eGsYNaLYRCrTRaoyfhxnoeA2ytYeyGGvHnAbpEIayzs=";
}; };
postInstall = (old.postInstall or "") + '' postInstall = (old.postInstall or "") + ''
mv $out/bin/oidcwarden $out/bin/vaultwarden mv $out/bin/oidcwarden $out/bin/vaultwarden
+11 -5
View File
@@ -18,6 +18,11 @@ mjolnir_access_token: ENC[AES256_GCM,data:vvrAY9CAkEIGEzah+TQiwa6PahGuXVvU7wzBpT
coturn_static_auth_secret: ENC[AES256_GCM,data:7AI0E8Hu4WxI5q4j1GqBMSQ+evE006uPMtwIfGn4eFz+XB2JA6fhhiGMPPxSkqOyK+3eZJ5ahiG05JpmBmmAbw==,iv:hQJQQDVo43U7lvV754PC1THeFCpZZEyag+BslXyoDos=,tag:Vkm+IXr1h8ZNpah6UYaKng==,type:str] coturn_static_auth_secret: ENC[AES256_GCM,data:7AI0E8Hu4WxI5q4j1GqBMSQ+evE006uPMtwIfGn4eFz+XB2JA6fhhiGMPPxSkqOyK+3eZJ5ahiG05JpmBmmAbw==,iv:hQJQQDVo43U7lvV754PC1THeFCpZZEyag+BslXyoDos=,tag:Vkm+IXr1h8ZNpah6UYaKng==,type:str]
discord_bot_token: ENC[AES256_GCM,data:j37Qo3FCyRwNFqWSWpnQKCs+AxH5HlQ8U5If7ylHilQoORp8Pb3TtNETTJSjZyvUXllldevAbHrbAEEKnNfoUJx1U8/wl6H0,iv:WQqxFXTE+0LIB2lSvVcnr4LNXPE7uzNc0Kk8NU6Z/aE=,tag:fNeQLhoThEgfa4sSGKLZCw==,type:str] discord_bot_token: ENC[AES256_GCM,data:j37Qo3FCyRwNFqWSWpnQKCs+AxH5HlQ8U5If7ylHilQoORp8Pb3TtNETTJSjZyvUXllldevAbHrbAEEKnNfoUJx1U8/wl6H0,iv:WQqxFXTE+0LIB2lSvVcnr4LNXPE7uzNc0Kk8NU6Z/aE=,tag:fNeQLhoThEgfa4sSGKLZCw==,type:str]
discord_client_id: ENC[AES256_GCM,data:U/iUKXT6Nsl6LRN9lPh1xaIaqw==,iv:k7kQ8rJBrMs3YwD9aDfZ6qhd7H3aVsSPTOwEIxVTw2Y=,tag:2wKhxGbf+P+h3BYeWUSczA==,type:str] discord_client_id: ENC[AES256_GCM,data:U/iUKXT6Nsl6LRN9lPh1xaIaqw==,iv:k7kQ8rJBrMs3YwD9aDfZ6qhd7H3aVsSPTOwEIxVTw2Y=,tag:2wKhxGbf+P+h3BYeWUSczA==,type:str]
discord_pickle_key: ENC[AES256_GCM,data:6j1pBQxmK8kFELSBBeJ0FwzAHz1GTGhxQwrvhlLtiU9+HICBBJqmFra1veZSO4yLchye/yPZ9Ha7oau+SgOI6w==,iv:YcTQQFcfLK33CpZnhEiKkt71e4ziarGKPyt7mmdQ+NA=,tag:AJRD4xYvYOZ0L1Xo+O+aGg==,type:str]
meta_as_token: ENC[AES256_GCM,data:WNkfHIRl9bGdzGRgjE2C9fymA0nX/ginNqRldyygaWw=,iv:BTVB+sf46mEQ/+FXCe4SRgmkfpnO2wnWlpKr/4uQbe0=,tag:qP42MN2qm1Tn6physjLK5g==,type:str]
meta_hs_token: ENC[AES256_GCM,data:BG7sSy0dIxf8EwjIA3rXxRZ+6IRPc2sJKSFXw+aldvY=,iv:gjk3pl/iV6rivxxrnR0jjEiSkmj0Jl5ojsudepKpxtY=,tag:n+BGaHRD+CqfXCbRPtFmfw==,type:str]
instagram_as_token: ENC[AES256_GCM,data:zKAv60IezEYqDEZNOFS5aKgNztBL9JUM9sfTZCD+vkg=,iv:3xCkVfT0S947LzpDzC0N1kuHOBhVaveK3m0cay0DlGc=,tag:NgJq8YN2r6NKj8pwlsgkXA==,type:str]
instagram_hs_token: ENC[AES256_GCM,data:+Lp9PQLUxyn/xS+L/hFcsufF0UxQJTiEd/7su8NmobI=,iv:ad9Urc8CwTfLWWRpUL6/TxfTB7LU8XoPq3kp8ifhfr0=,tag:0KkcdDAB/9rcuIgbLBZAkQ==,type:str]
pg_replication_password: ENC[AES256_GCM,data:w2h07D+j3LNkcbvoKQ2Qp3HSvC2Wf5HRAPAo/HNhmUkHBOaDyILNxo7IDjqajv0jytpG7q4joCJQhS7tEUlA9Q==,iv:26ZurAq61IDqGdAl0yPpoTJElo93hJJIEUlza4DGDNc=,tag:a46FOKgeqEEZE+rC+H9NbQ==,type:str] pg_replication_password: ENC[AES256_GCM,data:w2h07D+j3LNkcbvoKQ2Qp3HSvC2Wf5HRAPAo/HNhmUkHBOaDyILNxo7IDjqajv0jytpG7q4joCJQhS7tEUlA9Q==,iv:26ZurAq61IDqGdAl0yPpoTJElo93hJJIEUlza4DGDNc=,tag:a46FOKgeqEEZE+rC+H9NbQ==,type:str]
kanidm_gitea_secret: ENC[AES256_GCM,data:RavtSb5BaJGwwLB/oGzG/KK2AyV+IzEjihVxnD3/dVnxmxcG+CITIYPLvFUJjmvY,iv:Cg8dAhtJXDvRGULIkpWAyuhhlLEdvN+4lyjHPR/740I=,tag:8kMGrOjXEA4GWSLlP7oIkA==,type:str] kanidm_gitea_secret: ENC[AES256_GCM,data:RavtSb5BaJGwwLB/oGzG/KK2AyV+IzEjihVxnD3/dVnxmxcG+CITIYPLvFUJjmvY,iv:Cg8dAhtJXDvRGULIkpWAyuhhlLEdvN+4lyjHPR/740I=,tag:8kMGrOjXEA4GWSLlP7oIkA==,type:str]
gitea: gitea:
@@ -25,12 +30,12 @@ gitea:
internalToken: ENC[AES256_GCM,data:7N8TkPNb1YdCk2uAcCvVd2pKRVOf85//DYxAvz0UCg1E8ccEI5630xVyKafDFiSTM4ER7xiYelartzXL0jLWSf3QNOjSHUP8TIAz4bJRAZUJPxO917bURSLGGe7WEOfONzqy3Ts5QhrJ,iv:DiIs1ytlwLvqD/Ejep6m2fmpSqdFZkxBcgLNt6+29jY=,tag:8jsEcOkH0p+1mP9cnVjiDQ==,type:str] internalToken: ENC[AES256_GCM,data:7N8TkPNb1YdCk2uAcCvVd2pKRVOf85//DYxAvz0UCg1E8ccEI5630xVyKafDFiSTM4ER7xiYelartzXL0jLWSf3QNOjSHUP8TIAz4bJRAZUJPxO917bURSLGGe7WEOfONzqy3Ts5QhrJ,iv:DiIs1ytlwLvqD/Ejep6m2fmpSqdFZkxBcgLNt6+29jY=,tag:8jsEcOkH0p+1mP9cnVjiDQ==,type:str]
lfsJwtSecret: ENC[AES256_GCM,data:L20mFZ6zwsF3ZUoodarTJV+vhUdLlBrUbHz7FpEzJ2/C6AdFc1ZZcioN3g==,iv:E2C3gg1OYQ46Ae2bGnhF+3uw+q77l+yph3Kd2fxwW9M=,tag:VQkQ4R9S8Dr39rSLhL/X1w==,type:str] lfsJwtSecret: ENC[AES256_GCM,data:L20mFZ6zwsF3ZUoodarTJV+vhUdLlBrUbHz7FpEzJ2/C6AdFc1ZZcioN3g==,iv:E2C3gg1OYQ46Ae2bGnhF+3uw+q77l+yph3Kd2fxwW9M=,tag:VQkQ4R9S8Dr39rSLhL/X1w==,type:str]
mailerPassword: "" mailerPassword: ""
runnerToken: ENC[AES256_GCM,data:giY3e3oHqWytgIWfnuKxOfrp8R+u7I0lMzEGnLWXnZWL9aQkVsM1kiF1FNKn/A==,iv:YsQrAKU8pncPeSSosOFn9BjU676KCh956FGC2hnCuac=,tag:+eZ1y6P/85XNPD9gVVNMgA==,type:str]
ssh_private_key: ENC[AES256_GCM,data:R511mVFVk1ogAd5CKk/2P6rtT4NnHIFfKyqeCen545QgcvDqDFmW0rFBmPJyipaya2srJNoWvKJbnvxWtTYeJh2tPAybRMoUicStIFMUn3FPNfjx/WuQFLhKLoU3UOHHPJnkFqkQ9MBqLq2k5K7MVsNNFTxIDCKS1jPgkTmAWjRZ0EFiRXLa+Gvnz3GP5ltgfjDwdPeb5xp0/AqKPD8jea9w5ClR6ckrRHCLsfXhL2e9IaF4B96JlIv4rICLX3HmeIgM2PKl2MnSt8we5z39bBoLSA0yWG6BvpiMBaFqbo7jeHf1SxI6R404/emHhwW3pwSCDrq2ZE1ATG2UmA5NssFcVuaBPBoQer+n5haVYMNpNUp6rtKZeAIbf5JEOXJ6CJqiInfnnzOMNGhGFkGUYkhsy3p6Ti/lmNMPX/xtY+8ZqMwXf5drssm5KgnQ5nDbVqnTWAhoT/D3t+cJVAaXGTGw88fU0X95dZr8vaL/5nBCj1uUdv5cRBJ8PGhqbBX8PoiXrtGooBGhxf6nHbxIneSzG1++MZGo3e1G,iv:D1lgCnZKm3Gyv6cZpQ7zGW7JXN5RCwoaas+LroTkhPc=,tag:WI6Nr1cX8gm5pjFpu/Ok0w==,type:str] ssh_private_key: ENC[AES256_GCM,data:R511mVFVk1ogAd5CKk/2P6rtT4NnHIFfKyqeCen545QgcvDqDFmW0rFBmPJyipaya2srJNoWvKJbnvxWtTYeJh2tPAybRMoUicStIFMUn3FPNfjx/WuQFLhKLoU3UOHHPJnkFqkQ9MBqLq2k5K7MVsNNFTxIDCKS1jPgkTmAWjRZ0EFiRXLa+Gvnz3GP5ltgfjDwdPeb5xp0/AqKPD8jea9w5ClR6ckrRHCLsfXhL2e9IaF4B96JlIv4rICLX3HmeIgM2PKl2MnSt8we5z39bBoLSA0yWG6BvpiMBaFqbo7jeHf1SxI6R404/emHhwW3pwSCDrq2ZE1ATG2UmA5NssFcVuaBPBoQer+n5haVYMNpNUp6rtKZeAIbf5JEOXJ6CJqiInfnnzOMNGhGFkGUYkhsy3p6Ti/lmNMPX/xtY+8ZqMwXf5drssm5KgnQ5nDbVqnTWAhoT/D3t+cJVAaXGTGw88fU0X95dZr8vaL/5nBCj1uUdv5cRBJ8PGhqbBX8PoiXrtGooBGhxf6nHbxIneSzG1++MZGo3e1G,iv:D1lgCnZKm3Gyv6cZpQ7zGW7JXN5RCwoaas+LroTkhPc=,tag:WI6Nr1cX8gm5pjFpu/Ok0w==,type:str]
ssh_github_key: ENC[AES256_GCM,data:vZAH4cRDsgGXLAppQKOyUPOvmBJZ27bujMGz4hQ8tt0xhGFUP28llwGZz/VRuU02Yv4alLgVWBAIPuyhZT9f35KnjIR1Mmb7HXk/6oaNM59/lBiISLrnOpC10WmJ9O5krKdxwP8ZDvHA34B0s+oYNkTNXiU0S8AVg3icploax7ylKH5Dorj53kjdYSTjd8KN6ZsgCKmcz97+GnP0IgdmauyNL7e+kv9WIfE8Xx1kGvC8WVnidX2YhSxm6vt8l60eUj9etRigU88oFYTDZ+mIf4lucSpzaLZutz2fM/16D/o9SS7mmTrEllj2S+IXc9ZZTRKKDLbW+yv0XUi0XZi+OHAdZScjS54NZKyT9uWrc/IDJHammGsoHRQpHZtbGhkeFi/KdJsYBsWItslXjM0xJVtFIM2tMnd10kv9UGuXsSl9J4NC0rpz3aXnQqG4ZAhMjN9D/DTJpB4K0pcFyd2FDWdrbKq5iPfnU/V6ecnHPML6wCt6gua/LdK1MWoG3l2SqwMLYj1r7UW5fQZqSw1EK0BAtp9cQMLBL/2w8ykMfWpLekE=,iv:gcinU7xOoXQkFVkLNB3sQYHAcZy3pZN+bDRIq4sspys=,tag:yawgAHBKIkGpnKPHsRId4g==,type:str] ssh_github_key: ENC[AES256_GCM,data:vZAH4cRDsgGXLAppQKOyUPOvmBJZ27bujMGz4hQ8tt0xhGFUP28llwGZz/VRuU02Yv4alLgVWBAIPuyhZT9f35KnjIR1Mmb7HXk/6oaNM59/lBiISLrnOpC10WmJ9O5krKdxwP8ZDvHA34B0s+oYNkTNXiU0S8AVg3icploax7ylKH5Dorj53kjdYSTjd8KN6ZsgCKmcz97+GnP0IgdmauyNL7e+kv9WIfE8Xx1kGvC8WVnidX2YhSxm6vt8l60eUj9etRigU88oFYTDZ+mIf4lucSpzaLZutz2fM/16D/o9SS7mmTrEllj2S+IXc9ZZTRKKDLbW+yv0XUi0XZi+OHAdZScjS54NZKyT9uWrc/IDJHammGsoHRQpHZtbGhkeFi/KdJsYBsWItslXjM0xJVtFIM2tMnd10kv9UGuXsSl9J4NC0rpz3aXnQqG4ZAhMjN9D/DTJpB4K0pcFyd2FDWdrbKq5iPfnU/V6ecnHPML6wCt6gua/LdK1MWoG3l2SqwMLYj1r7UW5fQZqSw1EK0BAtp9cQMLBL/2w8ykMfWpLekE=,iv:gcinU7xOoXQkFVkLNB3sQYHAcZy3pZN+bDRIq4sspys=,tag:yawgAHBKIkGpnKPHsRId4g==,type:str]
sops: sops:
age: age:
- recipient: age10pyhca0jy75wtqv5hrn0gf0jcam5272zx9h73a8xwwaxyfq89c0qs5dr9t - enc: |
enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBMMVVaazhud2paM29JbEJx YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBMMVVaazhud2paM29JbEJx
aUFnajhSd3NxTzB0MndhRk03WjNvV3BVc0NNCnpxR1pjbXVrZ3RPQkppNHJpQ3pX aUFnajhSd3NxTzB0MndhRk03WjNvV3BVc0NNCnpxR1pjbXVrZ3RPQkppNHJpQ3pX
@@ -38,7 +43,8 @@ sops:
N3I5dzUwc3JtYzczMUhyT04vSHlZamMKT+FzYcDLmlEFYxm/XoBpJb8XaZzBH1v9 N3I5dzUwc3JtYzczMUhyT04vSHlZamMKT+FzYcDLmlEFYxm/XoBpJb8XaZzBH1v9
6fuez+zApathZfl14w41kAUojPWBznnxDqYtNvzVVLXwnpp3BMx+7w== 6fuez+zApathZfl14w41kAUojPWBznnxDqYtNvzVVLXwnpp3BMx+7w==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
lastmodified: "2026-05-20T08:25:30Z" recipient: age10pyhca0jy75wtqv5hrn0gf0jcam5272zx9h73a8xwwaxyfq89c0qs5dr9t
mac: ENC[AES256_GCM,data:rh4FcdDtUVvEvv/0XR/J62SgRlv/c0Wve4IIjlr3jItdPkIIkncX+ychxwSIqQEzcQD4BO6MJ7Ex1HXcOP0+5pg3Qvysj+J8y5JGpoIi2dAGh9A7uzMG/cOQD4TuUAQl+HsO6U9b/hrJg6qwyqxrvsupEkH4c7zCb7WbpZfn0o0=,iv:ZQ59dQXJqvLIqlyJmHCByF12Oi6e9vp9ikGGIERIyQE=,tag:Mgbxhu7rOdiHFv+EoYAPuA==,type:str] lastmodified: "2026-06-22T18:17:22Z"
mac: ENC[AES256_GCM,data:nIGjfBCia9y1+f0dE6TRK6pBLo3B+vqmK88t5xrCY9j+SIzPvCc2Iv6h8AXSfunvIZpxODhn+PmX2FBwa9TtNVePi/Iywu43fRGHz67gSVYTyTBoLRAxqW/7hEvRMXu0ECUfAPzQCq3rd4iWjMXyIYU/FsX9g4NlIno0zcCV5cs=,iv:M4FBoxzojH01hScrRoET3AwmG3qevhkxiET+W94drh0=,tag:rHf7wbkp64FKybjZL0EDDQ==,type:str]
unencrypted_suffix: _unencrypted unencrypted_suffix: _unencrypted
version: 3.12.2 version: 3.13.1