From b397f15e6163f401a2ab16a19e59a8a1ae5967bb Mon Sep 17 00:00:00 2001 From: Lukas Wurzinger Date: Sun, 8 Jun 2025 00:58:45 +0200 Subject: [PATCH 1/9] update --- README.md | 3 +- flake.lock | 36 +++---- packages/disk/disk | 196 -------------------------------------- packages/disk/package.nix | 19 ---- 4 files changed, 19 insertions(+), 235 deletions(-) delete mode 100755 packages/disk/disk delete mode 100644 packages/disk/package.nix diff --git a/README.md b/README.md index 7d3f85d..31b4b46 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@ This is my cobbled together NixOS configuration. There are many like it, but thi - common: Sane defaults that make sense to use for every host. - modules: Regular NixOS modules. - profiles: Higher-level NixOS modules that conform to different roles that a host may have. -- packages: Packages that I couldn't fit anywhere else. - secrets: Agenix secrets. - hosts: Hosts exposed in `nixosConfigurations`. - pubkeys.nix: Nix expression with all my SSH public keys, used for OpenSSH, Agenix and Restic. @@ -21,7 +20,7 @@ This is my cobbled together NixOS configuration. There are many like it, but thi ## Installation ```bash -nix run git+https://codeberg.org/helvetica/puter.git#disk /path/to/disk +nix run git+https://codeberg.org/helvetica/zap.git /path/to/disk # TODO: Configure additional disks mkdir -p /mnt/etc/ssh cat > /mnt/etc/ssh/ssh_host_ed25519_key diff --git a/flake.lock b/flake.lock index 9a70038..c827cde 100644 --- a/flake.lock +++ b/flake.lock @@ -358,11 +358,11 @@ }, "hardware": { "locked": { - "lastModified": 1748942041, - "narHash": "sha256-HEu2gTct7nY0tAPRgBtqYepallryBKR1U8B4v2zEEqA=", + "lastModified": 1749195551, + "narHash": "sha256-W5GKQHgunda/OP9sbKENBZhMBDNu2QahoIPwnsF6CeM=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "fc7c4714125cfaa19b048e8aaf86b9c53e04d853", + "rev": "4602f7e1d3f197b3cb540d5accf5669121629628", "type": "github" }, "original": { @@ -568,11 +568,11 @@ "rust-overlay": "rust-overlay_2" }, "locked": { - "lastModified": 1748948933, - "narHash": "sha256-Lc3YwAK/h+BdXWuiKV+dflWbYD3yObkrN/wugr8w+70=", + "lastModified": 1749252229, + "narHash": "sha256-zIXU2Z+OBmkI+qjryUtVILP6qgZo+0bnIEy3UAw0CAE=", "owner": "lilyinstarlight", "repo": "nixos-cosmic", - "rev": "a24e3123dab28fcc9b3e7b48f40e6e7ba12a6958", + "rev": "821627b7fe15013554cab4e9db4b8cb6fa9e8baf", "type": "github" }, "original": { @@ -705,11 +705,11 @@ }, "nixpkgs-stable_2": { "locked": { - "lastModified": 1748810746, - "narHash": "sha256-1na8blYvU1F6HLwx/aFjrhUqpqZ0SCsnqqW9n2vXvok=", + "lastModified": 1748995628, + "narHash": "sha256-bFufQGSAEYQgjtc4wMrobS5HWN0hDP+ZX+zthYcml9U=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "78d9f40fd6941a1543ffc3ed358e19c69961d3c1", + "rev": "8eb3b6a2366a7095939cd22f0dc0e9991313294b", "type": "github" }, "original": { @@ -817,11 +817,11 @@ }, "nixpkgs_8": { "locked": { - "lastModified": 1748693115, - "narHash": "sha256-StSrWhklmDuXT93yc3GrTlb0cKSS0agTAxMGjLKAsY8=", + "lastModified": 1748929857, + "narHash": "sha256-lcZQ8RhsmhsK8u7LIFsJhsLh/pzR9yZ8yqpTzyGdj+Q=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "910796cabe436259a29a72e8d3f5e180fc6dfacc", + "rev": "c2a03962b8e24e669fb37b7df10e7c79531ff1a4", "type": "github" }, "original": { @@ -978,11 +978,11 @@ ] }, "locked": { - "lastModified": 1748918260, - "narHash": "sha256-KhXNXQ5IDLvwwYfJ0pXDjwIuisZ2qM6F7fcXjIGZy/4=", + "lastModified": 1749177458, + "narHash": "sha256-9HNq3EHZIvvxXQyEn0sYOywcESF1Xqw2Q8J1ZewcXuk=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "c9736155bc1eb7c7cf3a925920850e61c07ab22a", + "rev": "d58933b88cef7a05e9677e94352fd6fedba402cd", "type": "github" }, "original": { @@ -1049,11 +1049,11 @@ ] }, "locked": { - "lastModified": 1748243702, - "narHash": "sha256-9YzfeN8CB6SzNPyPm2XjRRqSixDopTapaRsnTpXUEY8=", + "lastModified": 1749194973, + "narHash": "sha256-eEy8cuS0mZ2j/r/FE0/LYBSBcIs/MKOIVakwHVuqTfk=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "1f3f7b784643d488ba4bf315638b2b0a4c5fb007", + "rev": "a05be418a1af1198ca0f63facb13c985db4cb3c5", "type": "github" }, "original": { diff --git a/packages/disk/disk b/packages/disk/disk deleted file mode 100755 index 9b74435..0000000 --- a/packages/disk/disk +++ /dev/null @@ -1,196 +0,0 @@ -#!/usr/bin/env bash - -set -o errexit -set -o nounset -set -o pipefail - -progname="$0" - -warn() { - local line - for line in "$@"; do - echo "$progname: $line" 1>&2 - done -} - -error() { - warn "$@" - - exit 1 -} - -skip() { - if (($# < 1)); then - error 'name of value to be skipped is required' - fi - - if (($# > 1)); then - error 'too many arguments' - fi - - local skip=$1 - - for s in "${skips[@]}"; do - if [[ $s == "$skip" ]]; then - return 1 - fi - done - - return 0 -} - -args=$( - getopt \ - --options r:b:l:c:m:B:M:v \ - --longoptions root:,boot-label:,main-label:,cryptmain-label:,mapping:,boot-options:,main-options:,verbose \ - --name "$progname" \ - -- "$@" -) - -eval set -- "$args" - -root=/mnt -bootlbl=BOOT -mainlbl=main -cryptmainlbl=cryptmain -mapping=main -bootflags=() -mainflags=() -fatflags=() -ext4flags=() -skips=() -while true; do - case "$1" in - -r | --root) - root=$2 - shift 2 - ;; - -b | --boot-label) - skips+=(bootlbl) - bootlbl=${2^^} - shift 2 - ;; - -l | --main-label) - skips+=(mainlbl) - mainlbl=$2 - shift 2 - ;; - -c | --cryptmain-label) - skips+=(cryptmainlbl) - cryptmainlbl=$2 - shift 2 - ;; - -m | --mapping) - skips+=(mapping) - mapping=$2 - shift 2 - ;; - -B | --boot-options) - bootflags+=(--options "$2") - shift 2 - ;; - -M | --main-options) - mainflags+=(--options "$2") - shift 2 - ;; - -v | --verbose) - fatflags+=(-v) - ext4flags+=(-v) - shift - ;; - --) - shift - break - ;; - esac -done - -if (($# < 1)); then - error 'an argument specifying the block device is required' -fi - -if (($# > 1)); then - error 'too many arguments' -fi - -blkdev=$1 - -sfdisk --label gpt --quiet -- "$blkdev" </dev/null - -while true; do - read -rep 'Do you want your main partition to be encrypted? [y/N] ' input - case "$input" in - [Yy]*) - while true; do - read -rsp 'Enter password: ' password - warn '' - read -rsp 'Re-enter password: ' repassword - warn '' - if [[ $password == "$repassword" ]]; then - break - fi - done - - if ! skip cryptmainlbl; then - read -rep "Which label should the main LUKS partition have? [$cryptmainlbl] " input - if [[ -n $input ]]; then - cryptmainlbl=$input - fi - fi - - cryptsetup luksFormat --batch-mode --label "$cryptmainlbl" -- "$mainblkdev" <<<"$password" - - if ! skip mapping; then - read -rep "Which name should the main LUKS mapping have? [$mapping] " input - if [[ -n $input ]]; then - mapping=$input - fi - fi - - cryptsetup open -- "$mainblkdev" "$mapping" <<<"$password" - - mainfs=/dev/mapper/$mapping - break - ;; - '' | [Nn]*) - mainfs=$mainblkdev - break - ;; - *) warn 'Please answer with yes or no' ;; - esac -done - -if ! skip mainlbl; then - read -rep "Which label should the main file system have? [$mainlbl] " input - if [[ -n $input ]]; then - mainlbl=$input - fi -fi - -mkfs.ext4 -qFL "$mainlbl" "${ext4flags[@]}" -- "$mainfs" -mkdir --parents -- "$root" -mount "${mainflags[@]}" -- "$mainfs" "$root" - -mkdir -- "$root/boot" -mount "${bootflags[@]}" -- "$bootfs" "$root/boot" diff --git a/packages/disk/package.nix b/packages/disk/package.nix deleted file mode 100644 index a8466f7..0000000 --- a/packages/disk/package.nix +++ /dev/null @@ -1,19 +0,0 @@ -{ - writeShellApplication, - util-linux, - jq, - e2fsprogs, - dosfstools, -}: -writeShellApplication { - name = "disk"; - - runtimeInputs = [ - util-linux - jq - e2fsprogs - dosfstools - ]; - - text = builtins.readFile ./disk; -} From a026867c03c91cde29500544f7ffe4343c4c55b0 Mon Sep 17 00:00:00 2001 From: Lukas Wurzinger Date: Sun, 8 Jun 2025 19:35:48 +0200 Subject: [PATCH 2/9] fix --- flake.lock | 30 +++++++++++++++--------------- hosts/abacus/headscale.nix | 10 +++++++++- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/flake.lock b/flake.lock index c827cde..d017500 100644 --- a/flake.lock +++ b/flake.lock @@ -143,11 +143,11 @@ "nixpkgs-lib": "nixpkgs-lib" }, "locked": { - "lastModified": 1748821116, - "narHash": "sha256-F82+gS044J1APL0n4hH50GYdPRv/5JWm34oCJYmVKdE=", + "lastModified": 1749398372, + "narHash": "sha256-tYBdgS56eXYaWVW3fsnPQ/nFlgWi/Z2Ymhyu21zVM98=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "49f0870db23e8c1ca0b5259734a02cd9e1e371a1", + "rev": "9305fe4e5c2a6fcf5ba6a3ff155720fbe4076569", "type": "github" }, "original": { @@ -547,11 +547,11 @@ ] }, "locked": { - "lastModified": 1748751003, - "narHash": "sha256-i4GZdKAK97S0ZMU3w4fqgEJr0cVywzqjugt2qZPrScs=", + "lastModified": 1749355504, + "narHash": "sha256-L17CdJMD+/FCBOHjREQLXbe2VUnc3rjffenBbu2Kwpc=", "owner": "nix-community", "repo": "nix-index-database", - "rev": "2860bee699248d828c2ed9097a1cd82c2f991b43", + "rev": "40a6e15e44b11fbf8f2b1df9d64dbfc117625e94", "type": "github" }, "original": { @@ -568,11 +568,11 @@ "rust-overlay": "rust-overlay_2" }, "locked": { - "lastModified": 1749252229, - "narHash": "sha256-zIXU2Z+OBmkI+qjryUtVILP6qgZo+0bnIEy3UAw0CAE=", + "lastModified": 1749338348, + "narHash": "sha256-IBLKyOU55Kt1gSXL4dFQUQUVcYd5+qfSrVAL8lcE8QY=", "owner": "lilyinstarlight", "repo": "nixos-cosmic", - "rev": "821627b7fe15013554cab4e9db4b8cb6fa9e8baf", + "rev": "f2ac592313c51c9be981e45f56dc00714e103477", "type": "github" }, "original": { @@ -817,11 +817,11 @@ }, "nixpkgs_8": { "locked": { - "lastModified": 1748929857, - "narHash": "sha256-lcZQ8RhsmhsK8u7LIFsJhsLh/pzR9yZ8yqpTzyGdj+Q=", + "lastModified": 1749143949, + "narHash": "sha256-QuUtALJpVrPnPeozlUG/y+oIMSLdptHxb3GK6cpSVhA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c2a03962b8e24e669fb37b7df10e7c79531ff1a4", + "rev": "d3d2d80a2191a73d1e86456a751b83aa13085d7d", "type": "github" }, "original": { @@ -978,11 +978,11 @@ ] }, "locked": { - "lastModified": 1749177458, - "narHash": "sha256-9HNq3EHZIvvxXQyEn0sYOywcESF1Xqw2Q8J1ZewcXuk=", + "lastModified": 1749263796, + "narHash": "sha256-m52UsUrcNjAzgc0cwcg94INkiFyVPTn6KbFGr4x4cu8=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "d58933b88cef7a05e9677e94352fd6fedba402cd", + "rev": "6e1d910306edfe6e4b718878f222c5672500d6b2", "type": "github" }, "original": { diff --git a/hosts/abacus/headscale.nix b/hosts/abacus/headscale.nix index 4009020..ef08b0f 100644 --- a/hosts/abacus/headscale.nix +++ b/hosts/abacus/headscale.nix @@ -9,7 +9,15 @@ in port = 8010; settings = { server_url = "https://${virtualHostName}"; - dns.base_domain = "tailnet.helveticanonstandard.net"; + dns = { + base_domain = "tailnet.helveticanonstandard.net"; + nameservers.global = [ + "1.1.1.1" + "1.0.0.1" + "2606:4700:4700::1111" + "2606:4700:4700::1001" + ]; + }; logtail.enabled = false; }; }; From d1d7dd9c014d644424d4dc33cb0e92909c9de8e2 Mon Sep 17 00:00:00 2001 From: Lukas Wurzinger Date: Tue, 1 Jul 2025 19:02:19 +0200 Subject: [PATCH 3/9] stuff --- common/hardware.nix | 8 + common/xdg.nix | 3 + flake.lock | 325 +++++++++++++++--- flake.nix | 1 + hosts/glacier/profiles.nix | 2 + hosts/insomniac/README.md | 8 + hosts/insomniac/cage.nix | 47 +++ hosts/insomniac/freetube.nix | 6 - hosts/insomniac/profiles.nix | 4 - hosts/insomniac/steam.nix | 11 + profiles/desktop/default.nix | 8 + profiles/desktop/hardware.nix | 22 -- profiles/desktop/networking.nix | 20 -- .../xdg.nix => dynamic/bluetooth.nix} | 4 +- profiles/dynamic/default.nix | 18 + profiles/{desktop => dynamic}/location.nix | 2 +- profiles/dynamic/networking.nix | 15 + profiles/{desktop => headful}/clipboard.nix | 0 profiles/headful/default.nix | 18 + profiles/{desktop => headful}/fonts.nix | 2 +- profiles/{desktop => headful}/pipewire.nix | 2 +- profiles/{desktop => headful}/wayland.nix | 4 +- 22 files changed, 427 insertions(+), 103 deletions(-) create mode 100644 common/xdg.nix create mode 100644 hosts/insomniac/README.md create mode 100644 hosts/insomniac/cage.nix delete mode 100644 hosts/insomniac/freetube.nix create mode 100644 hosts/insomniac/steam.nix delete mode 100644 profiles/desktop/hardware.nix delete mode 100644 profiles/desktop/networking.nix rename profiles/{desktop/xdg.nix => dynamic/bluetooth.nix} (51%) create mode 100644 profiles/dynamic/default.nix rename profiles/{desktop => dynamic}/location.nix (77%) create mode 100644 profiles/dynamic/networking.nix rename profiles/{desktop => headful}/clipboard.nix (100%) create mode 100644 profiles/headful/default.nix rename profiles/{desktop => headful}/fonts.nix (96%) rename profiles/{desktop => headful}/pipewire.nix (89%) rename profiles/{desktop => headful}/wayland.nix (67%) diff --git a/common/hardware.nix b/common/hardware.nix index a62f709..e0dc596 100644 --- a/common/hardware.nix +++ b/common/hardware.nix @@ -1,3 +1,11 @@ { services.fwupd.enable = true; + + hardware = { + steam-hardware.enable = true; + xone.enable = true; + xpadneo.enable = true; + gcadapter.enable = true; + enableAllFirmware = true; + }; } diff --git a/common/xdg.nix b/common/xdg.nix new file mode 100644 index 0000000..a5a81d9 --- /dev/null +++ b/common/xdg.nix @@ -0,0 +1,3 @@ +{ + xdg.portal.xdgOpenUsePortal = true; +} diff --git a/flake.lock b/flake.lock index d017500..711e5ad 100644 --- a/flake.lock +++ b/flake.lock @@ -8,11 +8,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1747575206, - "narHash": "sha256-NwmAFuDUO/PFcgaGGr4j3ozG9Pe5hZ/ogitWhY+D81k=", + "lastModified": 1750173260, + "narHash": "sha256-9P1FziAwl5+3edkfFcr5HeGtQUtrSdk/MksX39GieoA=", "owner": "ryantm", "repo": "agenix", - "rev": "4835b1dc898959d8547a871ef484930675cb47f1", + "rev": "531beac616433bac6f9e2a19feb8e99a22a66baf", "type": "github" }, "original": { @@ -107,6 +107,22 @@ } }, "flake-compat_4": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_5": { "flake": false, "locked": { "lastModified": 1733328505, @@ -122,7 +138,7 @@ "type": "github" } }, - "flake-compat_5": { + "flake-compat_6": { "flake": false, "locked": { "lastModified": 1746162366, @@ -138,6 +154,22 @@ "type": "github" } }, + "flake-compat_7": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, "flake-parts": { "inputs": { "nixpkgs-lib": "nixpkgs-lib" @@ -179,11 +211,11 @@ "nixpkgs-lib": "nixpkgs-lib_3" }, "locked": { - "lastModified": 1743550720, - "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=", + "lastModified": 1749398372, + "narHash": "sha256-tYBdgS56eXYaWVW3fsnPQ/nFlgWi/Z2Ymhyu21zVM98=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "c621e8422220273271f52058f618c94e405bb0f5", + "rev": "9305fe4e5c2a6fcf5ba6a3ff155720fbe4076569", "type": "github" }, "original": { @@ -267,6 +299,24 @@ "type": "github" } }, + "flake-parts_8": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_7" + }, + "locked": { + "lastModified": 1749398372, + "narHash": "sha256-tYBdgS56eXYaWVW3fsnPQ/nFlgWi/Z2Ymhyu21zVM98=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "9305fe4e5c2a6fcf5ba6a3ff155720fbe4076569", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, "forgesync": { "inputs": { "flake-parts": "flake-parts_2", @@ -335,6 +385,28 @@ } }, "gitignore_3": { + "inputs": { + "nixpkgs": [ + "hxwrap", + "hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "gitignore_4": { "inputs": { "nixpkgs": [ "lanzaboote", @@ -356,13 +428,35 @@ "type": "github" } }, + "gitignore_5": { + "inputs": { + "nixpkgs": [ + "xenumenu", + "hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, "hardware": { "locked": { - "lastModified": 1749195551, - "narHash": "sha256-W5GKQHgunda/OP9sbKENBZhMBDNu2QahoIPwnsF6CeM=", + "lastModified": 1751379130, + "narHash": "sha256-TObxiGbuX/4FbOnzDRvznfMUjIgS+d71+BetT35EOB8=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "4602f7e1d3f197b3cb540d5accf5669121629628", + "rev": "8b1f894089789eb39eacf0d6891d1e17cc3a84ab", "type": "github" }, "original": { @@ -424,11 +518,57 @@ ] }, "locked": { - "lastModified": 1747372754, - "narHash": "sha256-2Y53NGIX2vxfie1rOW0Qb86vjRZ7ngizoo+bnXU9D9k=", + "lastModified": 1750779888, + "narHash": "sha256-wibppH3g/E2lxU43ZQHC5yA/7kIKLGxVEnsnVK1BtRg=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "80479b6ec16fefd9c1db3ea13aeb038c60530f46", + "rev": "16ec914f6fb6f599ce988427d9d94efddf25fe6d", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, + "hooks_3": { + "inputs": { + "flake-compat": "flake-compat_3", + "gitignore": "gitignore_3", + "nixpkgs": [ + "hxwrap", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1749636823, + "narHash": "sha256-WUaIlOlPLyPgz9be7fqWJA5iG6rHcGRtLERSCfUDne4=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "623c56286de5a3193aa38891a6991b28f9bab056", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, + "hooks_4": { + "inputs": { + "flake-compat": "flake-compat_7", + "gitignore": "gitignore_5", + "nixpkgs": [ + "xenumenu", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1749636823, + "narHash": "sha256-WUaIlOlPLyPgz9be7fqWJA5iG6rHcGRtLERSCfUDne4=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "623c56286de5a3193aa38891a6991b28f9bab056", "type": "github" }, "original": { @@ -440,14 +580,16 @@ "hxwrap": { "inputs": { "flake-parts": "flake-parts_3", - "nixpkgs": "nixpkgs_3" + "hooks": "hooks_3", + "nixpkgs": "nixpkgs_3", + "treefmt": "treefmt_2" }, "locked": { - "lastModified": 1745088587, - "narHash": "sha256-85AYHWayJVq/dxgk/S4RH7u6w59Akyr1fVttR8KBh8g=", + "lastModified": 1749852670, + "narHash": "sha256-MveNAj05dpNfOiK9uK6el6eWNG7r1SlMq45uZWgt20k=", "ref": "refs/heads/main", - "rev": "8fa5d5d550add7bf6cfd0a619dfac0e8a03b2bae", - "revCount": 21, + "rev": "1564605890b844183c2a9be9d3d7e71a0d12e367", + "revCount": 23, "type": "git", "url": "https://codeberg.org/helvetica/hxwrap.git" }, @@ -459,7 +601,7 @@ "lanzaboote": { "inputs": { "crane": "crane", - "flake-compat": "flake-compat_3", + "flake-compat": "flake-compat_4", "flake-parts": "flake-parts_4", "nixpkgs": [ "nixpkgs" @@ -547,11 +689,11 @@ ] }, "locked": { - "lastModified": 1749355504, - "narHash": "sha256-L17CdJMD+/FCBOHjREQLXbe2VUnc3rjffenBbu2Kwpc=", + "lastModified": 1751170039, + "narHash": "sha256-3EKpUmyGmHYA/RuhZjINTZPU+OFWko0eDwazUOW64nw=", "owner": "nix-community", "repo": "nix-index-database", - "rev": "40a6e15e44b11fbf8f2b1df9d64dbfc117625e94", + "rev": "9c932ae632d6b5150515e5749b198c175d8565db", "type": "github" }, "original": { @@ -562,17 +704,17 @@ }, "nixos-cosmic": { "inputs": { - "flake-compat": "flake-compat_5", + "flake-compat": "flake-compat_6", "nixpkgs": "nixpkgs_8", "nixpkgs-stable": "nixpkgs-stable_2", "rust-overlay": "rust-overlay_2" }, "locked": { - "lastModified": 1749338348, - "narHash": "sha256-IBLKyOU55Kt1gSXL4dFQUQUVcYd5+qfSrVAL8lcE8QY=", + "lastModified": 1751281697, + "narHash": "sha256-abHhTXGEGYhCKOc9vQbqHFG7dxwJ6AudIy1h4MUsjm0=", "owner": "lilyinstarlight", "repo": "nixos-cosmic", - "rev": "f2ac592313c51c9be981e45f56dc00714e103477", + "rev": "78b86e37713a1111d9e37c62b242d60be3013bd1", "type": "github" }, "original": { @@ -629,11 +771,11 @@ }, "nixpkgs-lib_3": { "locked": { - "lastModified": 1743296961, - "narHash": "sha256-b1EdN3cULCqtorQ4QeWgLMrd5ZGOjLSLemfa00heasc=", + "lastModified": 1748740939, + "narHash": "sha256-rQaysilft1aVMwF14xIdGS3sj1yHlI6oKQNBRTF40cc=", "owner": "nix-community", "repo": "nixpkgs.lib", - "rev": "e4822aea2a6d1cdd36653c134cacfd64c97ff4fa", + "rev": "656a64127e9d791a334452c6b6606d17539476e2", "type": "github" }, "original": { @@ -687,6 +829,21 @@ "type": "github" } }, + "nixpkgs-lib_7": { + "locked": { + "lastModified": 1748740939, + "narHash": "sha256-rQaysilft1aVMwF14xIdGS3sj1yHlI6oKQNBRTF40cc=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "656a64127e9d791a334452c6b6606d17539476e2", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, "nixpkgs-stable": { "locked": { "lastModified": 1730741070, @@ -705,11 +862,11 @@ }, "nixpkgs-stable_2": { "locked": { - "lastModified": 1748995628, - "narHash": "sha256-bFufQGSAEYQgjtc4wMrobS5HWN0hDP+ZX+zthYcml9U=", + "lastModified": 1751048012, + "narHash": "sha256-MYbotu4UjWpTsq01wglhN5xDRfZYLFtNk7SBY0BcjkU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "8eb3b6a2366a7095939cd22f0dc0e9991313294b", + "rev": "a684c58d46ebbede49f280b653b9e56100aa3877", "type": "github" }, "original": { @@ -737,11 +894,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1744932701, - "narHash": "sha256-fusHbZCyv126cyArUwwKrLdCkgVAIaa/fQJYFlCEqiU=", + "lastModified": 1749285348, + "narHash": "sha256-frdhQvPbmDYaScPFiCnfdh3B/Vh81Uuoo0w5TkWmmjU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "b024ced1aac25639f8ca8fdfc2f8c4fbd66c48ef", + "rev": "3e3afe5174c561dee0df6f2c2b2236990146329f", "type": "github" }, "original": { @@ -817,11 +974,27 @@ }, "nixpkgs_8": { "locked": { - "lastModified": 1749143949, - "narHash": "sha256-QuUtALJpVrPnPeozlUG/y+oIMSLdptHxb3GK6cpSVhA=", + "lastModified": 1751011381, + "narHash": "sha256-krGXKxvkBhnrSC/kGBmg5MyupUUT5R6IBCLEzx9jhMM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "d3d2d80a2191a73d1e86456a751b83aa13085d7d", + "rev": "30e2e2857ba47844aa71991daa6ed1fc678bcbb7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_9": { + "locked": { + "lastModified": 1750365781, + "narHash": "sha256-XE/lFNhz5lsriMm/yjXkvSZz5DfvKJLUjsS6pP8EC50=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "08f22084e6085d19bcfb4be30d1ca76ecb96fe54", "type": "github" }, "original": { @@ -833,7 +1006,7 @@ }, "phps": { "inputs": { - "flake-compat": "flake-compat_4", + "flake-compat": "flake-compat_5", "nixpkgs": "nixpkgs_6", "utils": "utils" }, @@ -857,7 +1030,7 @@ "lanzaboote", "flake-compat" ], - "gitignore": "gitignore_3", + "gitignore": "gitignore_4", "nixpkgs": [ "lanzaboote", "nixpkgs" @@ -946,7 +1119,8 @@ "nixos-cosmic", "nixpkgs" ], - "treefmt": "treefmt_2" + "treefmt": "treefmt_3", + "xenumenu": "xenumenu" } }, "rust-overlay": { @@ -978,11 +1152,11 @@ ] }, "locked": { - "lastModified": 1749263796, - "narHash": "sha256-m52UsUrcNjAzgc0cwcg94INkiFyVPTn6KbFGr4x4cu8=", + "lastModified": 1751251399, + "narHash": "sha256-y+viCuy/eKKpkX1K2gDvXIJI/yzvy6zA3HObapz9XZ0=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "6e1d910306edfe6e4b718878f222c5672500d6b2", + "rev": "b22d5ee8c60ed1291521f2dde48784edd6bf695b", "type": "github" }, "original": { @@ -1045,6 +1219,48 @@ "treefmt_2": { "inputs": { "nixpkgs": [ + "hxwrap", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1749194973, + "narHash": "sha256-eEy8cuS0mZ2j/r/FE0/LYBSBcIs/MKOIVakwHVuqTfk=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "a05be418a1af1198ca0f63facb13c985db4cb3c5", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt_3": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1750931469, + "narHash": "sha256-0IEdQB1nS+uViQw4k3VGUXntjkDp7aAlqcxdewb/hAc=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "ac8e6f32e11e9c7f153823abc3ab007f2a65d3e1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt_4": { + "inputs": { + "nixpkgs": [ + "xenumenu", "nixpkgs" ] }, @@ -1104,6 +1320,27 @@ "repo": "uv2nix", "type": "github" } + }, + "xenumenu": { + "inputs": { + "flake-parts": "flake-parts_8", + "hooks": "hooks_4", + "nixpkgs": "nixpkgs_9", + "treefmt": "treefmt_4" + }, + "locked": { + "lastModified": 1750544859, + "narHash": "sha256-OnSfoCCC6fYjAUdmZLwg3sRfgotO7bj55dUGV1BAKyY=", + "ref": "refs/heads/main", + "rev": "97ddcea8f30ecad4825f77260fa4e40e952262d1", + "revCount": 1, + "type": "git", + "url": "https://codeberg.org/helvetica/xenumenu.git" + }, + "original": { + "type": "git", + "url": "https://codeberg.org/helvetica/xenumenu.git" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 23271ff..c9627a1 100644 --- a/flake.nix +++ b/flake.nix @@ -26,6 +26,7 @@ myphps.url = "git+https://codeberg.org/helvetica/myphps.git"; forgesync.url = "git+https://codeberg.org/helvetica/forgesync.git"; nini.url = "git+https://codeberg.org/helvetica/nini.git"; + xenumenu.url = "git+https://codeberg.org/helvetica/xenumenu.git"; lanzaboote = { url = "github:nix-community/lanzaboote/v0.4.2"; inputs.nixpkgs.follows = "nixpkgs"; diff --git a/hosts/glacier/profiles.nix b/hosts/glacier/profiles.nix index b2f1fd3..1caf3d3 100644 --- a/hosts/glacier/profiles.nix +++ b/hosts/glacier/profiles.nix @@ -1,6 +1,8 @@ { profiles = { desktop.enable = true; + dynamic.enable = true; + headful.enable = true; emulation.enable = true; gaming.enable = true; piracy.enable = true; diff --git a/hosts/insomniac/README.md b/hosts/insomniac/README.md new file mode 100644 index 0000000..37baf7f --- /dev/null +++ b/hosts/insomniac/README.md @@ -0,0 +1,8 @@ +shell script that loops a launcher +basically + +while true; do +fuzzel with retroarch steam quit +if quit; then exit; fi +else run command (waiting) +done diff --git a/hosts/insomniac/cage.nix b/hosts/insomniac/cage.nix new file mode 100644 index 0000000..076c85f --- /dev/null +++ b/hosts/insomniac/cage.nix @@ -0,0 +1,47 @@ +{ + lib, + inputs, + pkgs, + ... +}: +let + spec = { + entries = [ + { + displayName = "RetroArch"; + program = "retroarch"; + } + { + displayName = "Steam"; + program = "steam"; + args = [ + "-tenfoot" + ]; + } + ]; + }; + + specFormat = pkgs.formats.json { }; + + launcher = pkgs.writeShellApplication { + name = "launcher"; + runtimeInputs = [ + inputs.xenumenu.packages.${pkgs.system}.default + ]; + text = '' + while true; do + xenumenu --rowcols 3 --exit ${specFormat.generate "spec.json" spec} + done + ''; + }; +in +{ + services.cage = { + enable = true; + program = lib.getExe launcher; + user = "insomniac"; + environment = { + WLR_LIBINPUT_NO_DEVICES = "1"; + }; + }; +} diff --git a/hosts/insomniac/freetube.nix b/hosts/insomniac/freetube.nix deleted file mode 100644 index b24fd0d..0000000 --- a/hosts/insomniac/freetube.nix +++ /dev/null @@ -1,6 +0,0 @@ -{ pkgs, ... }: -{ - environment.systemPackages = [ - pkgs.freetube - ]; -} diff --git a/hosts/insomniac/profiles.nix b/hosts/insomniac/profiles.nix index b2f1fd3..b0ec401 100644 --- a/hosts/insomniac/profiles.nix +++ b/hosts/insomniac/profiles.nix @@ -1,9 +1,5 @@ { profiles = { desktop.enable = true; - emulation.enable = true; - gaming.enable = true; - piracy.enable = true; - productivity.enable = true; }; } diff --git a/hosts/insomniac/steam.nix b/hosts/insomniac/steam.nix new file mode 100644 index 0000000..d39f536 --- /dev/null +++ b/hosts/insomniac/steam.nix @@ -0,0 +1,11 @@ +{ + programs.steam = { + enable = true; + extest.enable = true; + protontricks.enable = true; + dedicatedServer.openFirewall = true; + remotePlay.openFirewall = true; + localNetworkGameTransfers.openFirewall = true; + gamescopeSession.enable = true; # TODO + }; +} diff --git a/profiles/desktop/default.nix b/profiles/desktop/default.nix index 11e024f..2bcea45 100644 --- a/profiles/desktop/default.nix +++ b/profiles/desktop/default.nix @@ -13,6 +13,14 @@ in assertion = !config.profiles.server.enable; message = "The desktop profile is not compatible with the server profile."; } + { + assertion = config.profiles.headful.enable; + message = "The desktop profile depends on the headful profile."; + } + { + assertion = config.profiles.dynamic.enable; + message = "The desktop profile depends on the dynamic profile."; + } ]; }; } diff --git a/profiles/desktop/hardware.nix b/profiles/desktop/hardware.nix deleted file mode 100644 index 13163b5..0000000 --- a/profiles/desktop/hardware.nix +++ /dev/null @@ -1,22 +0,0 @@ -{ - config, - lib, - ... -}: -let - cfg = config.profiles.desktop; -in -{ - config = lib.mkIf cfg.enable { - hardware = { - bluetooth.enable = true; - steam-hardware.enable = true; - xone.enable = true; - xpadneo.enable = true; - opentabletdriver.enable = true; - gcadapter.enable = true; - graphics.enable = true; - enableAllFirmware = true; - }; - }; -} diff --git a/profiles/desktop/networking.nix b/profiles/desktop/networking.nix deleted file mode 100644 index bdc6911..0000000 --- a/profiles/desktop/networking.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - ... -}: -let - cfg = config.profiles.desktop; -in -{ - config = lib.mkIf cfg.enable { - services.resolved.enable = true; - - networking.networkmanager = { - enable = true; - dns = "systemd-resolved"; - }; - - users.groups.networkmanager.members = config.users.normalUsers; - }; -} diff --git a/profiles/desktop/xdg.nix b/profiles/dynamic/bluetooth.nix similarity index 51% rename from profiles/desktop/xdg.nix rename to profiles/dynamic/bluetooth.nix index 892a8dc..07a12d3 100644 --- a/profiles/desktop/xdg.nix +++ b/profiles/dynamic/bluetooth.nix @@ -4,10 +4,10 @@ ... }: let - cfg = config.profiles.desktop; + cfg = config.profiles.dynamic; in { config = lib.mkIf cfg.enable { - xdg.portal.xdgOpenUsePortal = true; + hardware.bluetooth.enable = true; }; } diff --git a/profiles/dynamic/default.nix b/profiles/dynamic/default.nix new file mode 100644 index 0000000..c97dc91 --- /dev/null +++ b/profiles/dynamic/default.nix @@ -0,0 +1,18 @@ +{ config, lib, ... }: +let + cfg = config.profiles.dynamic; +in +{ + options.profiles.dynamic = { + enable = lib.mkEnableOption "dynamic"; + }; + + config = lib.mkIf cfg.enable { + assertions = [ + { + assertion = !config.profiles.server.enable; + message = "The dynamic profile is not compatible with the server profile."; + } + ]; + }; +} diff --git a/profiles/desktop/location.nix b/profiles/dynamic/location.nix similarity index 77% rename from profiles/desktop/location.nix rename to profiles/dynamic/location.nix index fffcb56..508ee6f 100644 --- a/profiles/desktop/location.nix +++ b/profiles/dynamic/location.nix @@ -4,7 +4,7 @@ ... }: let - cfg = config.profiles.desktop; + cfg = config.profiles.dynamic; in { config = lib.mkIf cfg.enable { diff --git a/profiles/dynamic/networking.nix b/profiles/dynamic/networking.nix new file mode 100644 index 0000000..607153c --- /dev/null +++ b/profiles/dynamic/networking.nix @@ -0,0 +1,15 @@ +{ + config, + lib, + ... +}: +let + cfg = config.profiles.dynamic; +in +{ + config = lib.mkIf cfg.enable { + networking.networkmanager.enable = true; + + users.groups.networkmanager.members = config.users.normalUsers; + }; +} diff --git a/profiles/desktop/clipboard.nix b/profiles/headful/clipboard.nix similarity index 100% rename from profiles/desktop/clipboard.nix rename to profiles/headful/clipboard.nix diff --git a/profiles/headful/default.nix b/profiles/headful/default.nix new file mode 100644 index 0000000..b57a2b9 --- /dev/null +++ b/profiles/headful/default.nix @@ -0,0 +1,18 @@ +{ config, lib, ... }: +let + cfg = config.profiles.headful; +in +{ + options.profiles.headful = { + enable = lib.mkEnableOption "headful"; + }; + + config = lib.mkIf cfg.enable { + assertions = [ + { + assertion = !config.profiles.server.enable; + message = "The headful profile is not compatible with the server profile."; + } + ]; + }; +} diff --git a/profiles/desktop/fonts.nix b/profiles/headful/fonts.nix similarity index 96% rename from profiles/desktop/fonts.nix rename to profiles/headful/fonts.nix index 2a528be..1ca0466 100644 --- a/profiles/desktop/fonts.nix +++ b/profiles/headful/fonts.nix @@ -5,7 +5,7 @@ ... }: let - cfg = config.profiles.desktop; + cfg = config.profiles.headful; in { config = lib.mkIf cfg.enable { diff --git a/profiles/desktop/pipewire.nix b/profiles/headful/pipewire.nix similarity index 89% rename from profiles/desktop/pipewire.nix rename to profiles/headful/pipewire.nix index 7e6986f..b9605ff 100644 --- a/profiles/desktop/pipewire.nix +++ b/profiles/headful/pipewire.nix @@ -4,7 +4,7 @@ ... }: let - cfg = config.profiles.desktop; + cfg = config.profiles.headful; in { config = lib.mkIf cfg.enable { diff --git a/profiles/desktop/wayland.nix b/profiles/headful/wayland.nix similarity index 67% rename from profiles/desktop/wayland.nix rename to profiles/headful/wayland.nix index e76d7fc..28fb060 100644 --- a/profiles/desktop/wayland.nix +++ b/profiles/headful/wayland.nix @@ -4,13 +4,13 @@ ... }: let - cfg = config.profiles.desktop; + cfg = config.profiles.headful; in { config = lib.mkIf cfg.enable { environment.sessionVariables = { NIXOS_OZONE_WL = "1"; - SDL_VIDEODRIVER = "wayland"; + SDL_VIDEODRIVER = "wayland,x11"; }; }; } From 2ba2f3c6ff58d7ca28e55efcc0231b100a6169d7 Mon Sep 17 00:00:00 2001 From: Lukas Wurzinger Date: Tue, 1 Jul 2025 22:27:19 +0200 Subject: [PATCH 4/9] fixes --- flake.lock | 14 +++++++------- hosts/work/networking.nix | 3 +++ hosts/work/profiles.nix | 2 ++ hosts/work/tools.nix | 2 ++ secrets/secrets.nix | 1 + secrets/secure-boot/work.tar.age | Bin 0 -> 31262 bytes 6 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 hosts/work/networking.nix create mode 100644 secrets/secure-boot/work.tar.age diff --git a/flake.lock b/flake.lock index 711e5ad..434ac84 100644 --- a/flake.lock +++ b/flake.lock @@ -452,11 +452,11 @@ }, "hardware": { "locked": { - "lastModified": 1751379130, - "narHash": "sha256-TObxiGbuX/4FbOnzDRvznfMUjIgS+d71+BetT35EOB8=", + "lastModified": 1751393906, + "narHash": "sha256-I1x6K61ZcdFlqc07weRBy3erCAB0lVkX10i0c9eXjDI=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "8b1f894089789eb39eacf0d6891d1e17cc3a84ab", + "rev": "f49bb3b4107a0917ee144337bb02d311033ee1ba", "type": "github" }, "original": { @@ -650,11 +650,11 @@ "phps": "phps" }, "locked": { - "lastModified": 1746369841, - "narHash": "sha256-/k3MQPXdsXJ0FDEsT1YvBG9ugRXk1nuE9MCb1wAMGQc=", + "lastModified": 1751398370, + "narHash": "sha256-7TSTVtdZz2nhO5Gn/U3pjvENvQAKJWFJ799EWtx/O/s=", "ref": "refs/heads/main", - "rev": "dbe35541ef6923f411685434cc535d0854b55b6a", - "revCount": 5, + "rev": "18cc2db6cc507ff0123a7e7fc6936f9ea52dbc66", + "revCount": 7, "type": "git", "url": "https://codeberg.org/helvetica/myphps.git" }, diff --git a/hosts/work/networking.nix b/hosts/work/networking.nix new file mode 100644 index 0000000..3ada38d --- /dev/null +++ b/hosts/work/networking.nix @@ -0,0 +1,3 @@ +{ + networking.networkmanager.enableStrongSwan = true; +} diff --git a/hosts/work/profiles.nix b/hosts/work/profiles.nix index c901b18..130f555 100644 --- a/hosts/work/profiles.nix +++ b/hosts/work/profiles.nix @@ -1,6 +1,8 @@ { profiles = { desktop.enable = true; + dynamic.enable = true; + headful.enable = true; productivity.enable = true; }; } diff --git a/hosts/work/tools.nix b/hosts/work/tools.nix index 2dca47b..db6c616 100644 --- a/hosts/work/tools.nix +++ b/hosts/work/tools.nix @@ -7,5 +7,7 @@ pkgs.jq pkgs.mariadb pkgs.openssl + pkgs.kubectl + pkgs.awscli2 ]; } diff --git a/secrets/secrets.nix b/secrets/secrets.nix index 2251d3e..5567544 100644 --- a/secrets/secrets.nix +++ b/secrets/secrets.nix @@ -21,4 +21,5 @@ in "secure-boot/abacus.tar.age".publicKeys = (builtins.attrValues users) ++ [ hosts.abacus ]; "secure-boot/flamingo.tar.age".publicKeys = (builtins.attrValues users) ++ [ hosts.flamingo ]; "secure-boot/vessel.tar.age".publicKeys = (builtins.attrValues users) ++ [ hosts.vessel ]; + "secure-boot/work.tar.age".publicKeys = (builtins.attrValues users) ++ [ hosts.work ]; } diff --git a/secrets/secure-boot/work.tar.age b/secrets/secure-boot/work.tar.age new file mode 100644 index 0000000000000000000000000000000000000000..b76af37d77a0523f42fb23a0b9889401fdb94715 GIT binary patch literal 31262 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 R!L=*fzdZiL`FiKJ^8nGr>puVh literal 0 HcmV?d00001 From c1893dd3888395a4a29ffc7f8f94f07d806327dc Mon Sep 17 00:00:00 2001 From: Lukas Wurzinger Date: Tue, 1 Jul 2025 22:35:15 +0200 Subject: [PATCH 5/9] fixes --- profiles/desktop/spotify.nix | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 profiles/desktop/spotify.nix diff --git a/profiles/desktop/spotify.nix b/profiles/desktop/spotify.nix new file mode 100644 index 0000000..fe6ef29 --- /dev/null +++ b/profiles/desktop/spotify.nix @@ -0,0 +1,16 @@ +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.profiles.desktop; +in +{ + config = lib.mkIf cfg.enable { + environment.systemPackages = [ + pkgs.spotify + ]; + }; +} From 11c5757aa35906260097b5f100f8d8cb21cfe223 Mon Sep 17 00:00:00 2001 From: Lukas Wurzinger Date: Tue, 1 Jul 2025 22:50:57 +0200 Subject: [PATCH 6/9] fixes --- hosts/work/mattermost.nix | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 hosts/work/mattermost.nix diff --git a/hosts/work/mattermost.nix b/hosts/work/mattermost.nix new file mode 100644 index 0000000..9706837 --- /dev/null +++ b/hosts/work/mattermost.nix @@ -0,0 +1,6 @@ +{ pkgs, ... }: +{ + environment.systemPackages = [ + pkgs.mattermost-desktop + ]; +} From e1bc1f1252e5b0d2bf87e0bc95829eb693915373 Mon Sep 17 00:00:00 2001 From: Lukas Wurzinger Date: Wed, 2 Jul 2025 22:51:14 +0200 Subject: [PATCH 7/9] retroarch --- hosts/insomniac/retroarch.nix | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 hosts/insomniac/retroarch.nix diff --git a/hosts/insomniac/retroarch.nix b/hosts/insomniac/retroarch.nix new file mode 100644 index 0000000..8f06295 --- /dev/null +++ b/hosts/insomniac/retroarch.nix @@ -0,0 +1,13 @@ +{ pkgs, ... }: +{ + environment.systemPackages = + let + retroarch = pkgs.retroarch.withCores (cores: [ + cores.parallel-n64 + cores.dolphin + ]); + in + [ + retroarch + ]; +} From 7ace9772d64754351d22197cf3acd49ca826f805 Mon Sep 17 00:00:00 2001 From: Lukas Wurzinger Date: Thu, 3 Jul 2025 13:19:03 +0200 Subject: [PATCH 8/9] improvements --- common/hardware.nix | 1 + flake.lock | 44 +++++++++++++++++----------------- hosts/insomniac/profiles.nix | 2 ++ modules/gcadapter.nix | 7 +++--- profiles/dynamic/bluetooth.nix | 13 ---------- 5 files changed, 29 insertions(+), 38 deletions(-) delete mode 100644 profiles/dynamic/bluetooth.nix diff --git a/common/hardware.nix b/common/hardware.nix index e0dc596..c351994 100644 --- a/common/hardware.nix +++ b/common/hardware.nix @@ -2,6 +2,7 @@ services.fwupd.enable = true; hardware = { + bluetooth.enable = true; steam-hardware.enable = true; xone.enable = true; xpadneo.enable = true; diff --git a/flake.lock b/flake.lock index 434ac84..b72943e 100644 --- a/flake.lock +++ b/flake.lock @@ -175,11 +175,11 @@ "nixpkgs-lib": "nixpkgs-lib" }, "locked": { - "lastModified": 1749398372, - "narHash": "sha256-tYBdgS56eXYaWVW3fsnPQ/nFlgWi/Z2Ymhyu21zVM98=", + "lastModified": 1751413152, + "narHash": "sha256-Tyw1RjYEsp5scoigs1384gIg6e0GoBVjms4aXFfRssQ=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "9305fe4e5c2a6fcf5ba6a3ff155720fbe4076569", + "rev": "77826244401ea9de6e3bac47c2db46005e1f30b5", "type": "github" }, "original": { @@ -286,11 +286,11 @@ "nixpkgs-lib": "nixpkgs-lib_6" }, "locked": { - "lastModified": 1743550720, - "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=", + "lastModified": 1749398372, + "narHash": "sha256-tYBdgS56eXYaWVW3fsnPQ/nFlgWi/Z2Ymhyu21zVM98=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "c621e8422220273271f52058f618c94e405bb0f5", + "rev": "9305fe4e5c2a6fcf5ba6a3ff155720fbe4076569", "type": "github" }, "original": { @@ -452,11 +452,11 @@ }, "hardware": { "locked": { - "lastModified": 1751393906, - "narHash": "sha256-I1x6K61ZcdFlqc07weRBy3erCAB0lVkX10i0c9eXjDI=", + "lastModified": 1751432711, + "narHash": "sha256-136MeWtckSHTN9Z2WRNRdZ8oRP3vyx3L8UxeBYE+J9w=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "f49bb3b4107a0917ee144337bb02d311033ee1ba", + "rev": "497ae1357f1ac97f1aea31a4cb74ad0d534ef41f", "type": "github" }, "original": { @@ -669,11 +669,11 @@ "nixpkgs": "nixpkgs_7" }, "locked": { - "lastModified": 1747493683, - "narHash": "sha256-SEszNrbvTzxjFM7apKnL8LaarvDAzcuuQXj8r+ikJdk=", + "lastModified": 1751397212, + "narHash": "sha256-G9pjUEsde8bJl7TbTqTW2dADhI3FXLfb3Cvq8S1WTdo=", "ref": "refs/heads/main", - "rev": "a61825fc51a2b52cebd01ce58910707383e08b02", - "revCount": 2, + "rev": "a41850db1bb1d4f31a828cecf9387601b3f208c8", + "revCount": 3, "type": "git", "url": "https://codeberg.org/helvetica/nini.git" }, @@ -741,11 +741,11 @@ }, "nixpkgs-lib": { "locked": { - "lastModified": 1748740939, - "narHash": "sha256-rQaysilft1aVMwF14xIdGS3sj1yHlI6oKQNBRTF40cc=", + "lastModified": 1751159883, + "narHash": "sha256-urW/Ylk9FIfvXfliA1ywh75yszAbiTEVgpPeinFyVZo=", "owner": "nix-community", "repo": "nixpkgs.lib", - "rev": "656a64127e9d791a334452c6b6606d17539476e2", + "rev": "14a40a1d7fb9afa4739275ac642ed7301a9ba1ab", "type": "github" }, "original": { @@ -816,11 +816,11 @@ }, "nixpkgs-lib_6": { "locked": { - "lastModified": 1743296961, - "narHash": "sha256-b1EdN3cULCqtorQ4QeWgLMrd5ZGOjLSLemfa00heasc=", + "lastModified": 1748740939, + "narHash": "sha256-rQaysilft1aVMwF14xIdGS3sj1yHlI6oKQNBRTF40cc=", "owner": "nix-community", "repo": "nixpkgs.lib", - "rev": "e4822aea2a6d1cdd36653c134cacfd64c97ff4fa", + "rev": "656a64127e9d791a334452c6b6606d17539476e2", "type": "github" }, "original": { @@ -958,11 +958,11 @@ }, "nixpkgs_7": { "locked": { - "lastModified": 1743964447, - "narHash": "sha256-nEo1t3Q0F+0jQ36HJfbJtiRU4OI+/0jX/iITURKe3EE=", + "lastModified": 1751271578, + "narHash": "sha256-P/SQmKDu06x8yv7i0s8bvnnuJYkxVGBWLWHaU+tt4YY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "063dece00c5a77e4a0ea24e5e5a5bd75232806f8", + "rev": "3016b4b15d13f3089db8a41ef937b13a9e33a8df", "type": "github" }, "original": { diff --git a/hosts/insomniac/profiles.nix b/hosts/insomniac/profiles.nix index b0ec401..36ae810 100644 --- a/hosts/insomniac/profiles.nix +++ b/hosts/insomniac/profiles.nix @@ -1,5 +1,7 @@ { profiles = { desktop.enable = true; + headful.enable = true; + dynamic.enable = true; }; } diff --git a/modules/gcadapter.nix b/modules/gcadapter.nix index 3d3bba8..1c8c123 100644 --- a/modules/gcadapter.nix +++ b/modules/gcadapter.nix @@ -1,6 +1,7 @@ { config, lib, + pkgs, ... }: let @@ -10,9 +11,9 @@ in options.hardware.gcadapter.enable = lib.mkEnableOption "GameCube Adapter support"; config = lib.mkIf cfg.enable { - services.udev.extraRules = '' - ATTRS{idVendor}=="057e", ATTRS{idProduct}=="0337", MODE="666", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device" TAG+="uaccess" - ''; + services.udev.packages = [ + pkgs.dolphin-emu + ]; boot = { extraModulePackages = [ diff --git a/profiles/dynamic/bluetooth.nix b/profiles/dynamic/bluetooth.nix deleted file mode 100644 index 07a12d3..0000000 --- a/profiles/dynamic/bluetooth.nix +++ /dev/null @@ -1,13 +0,0 @@ -{ - config, - lib, - ... -}: -let - cfg = config.profiles.dynamic; -in -{ - config = lib.mkIf cfg.enable { - hardware.bluetooth.enable = true; - }; -} From 8ffe3278b3e8eda20ea35ec05f4674a3632c78be Mon Sep 17 00:00:00 2001 From: Lukas Wurzinger Date: Fri, 4 Jul 2025 21:16:55 +0200 Subject: [PATCH 9/9] improvements --- .gitignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitignore b/.gitignore index 55281ec..410621b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,2 @@ .direnv/ -.devenv/ - .pre-commit-config.yaml