57 Commits

Author SHA1 Message Date
mjallen18
33385d5275 testing done 2025-08-21 20:54:43 -05:00
mjallen18
19bf815be8 end test 2025-08-21 20:52:13 -05:00
mjallen18
0152438472 more cleanup 2025-08-21 20:05:58 -05:00
mjallen18
f9b07deb19 cleanup 2025-08-21 19:45:03 -05:00
mjallen18
6e55d375d2 user updates 2025-08-21 19:40:32 -05:00
mjallen18
0e066cb4d7 move some apps to namespace 2025-08-21 19:06:51 -05:00
mjallen18
bd64283f04 idk 2025-08-21 16:17:17 -05:00
mjallen18
6025b6c4f1 bcfs root? 2025-08-21 16:10:04 -05:00
mjallen18
92b04773b2 move python-steam 2025-08-21 14:26:50 -05:00
mjallen18
783a7a3390 README 2025-08-21 14:17:33 -05:00
mjallen18
0ef4354c1a aarch 2025-08-21 13:24:04 -05:00
mjallen18
192a978d46 fix proxies 2025-08-21 11:45:06 -05:00
mjallen18
a4519904b6 fix pi4 hostname 2025-08-21 11:45:06 -05:00
mjallen18
83a6e45bf4 test 2025-08-20 22:02:24 -05:00
mjallen18
2ba6f3466f clev 2025-08-20 21:30:18 -05:00
mjallen18
b3f5b4b406 more pi stuff 2025-08-20 21:30:18 -05:00
mjallen18
2e680f2519 fix lol 2025-08-20 21:30:18 -05:00
mjallen18
445183f826 pi stuff 2025-08-20 21:30:18 -05:00
mjallen18
aec980e6fe sops but idk 2025-08-20 21:30:18 -05:00
mjallen18
68f732ec4b cleanup 2025-08-20 21:30:18 -05:00
mjallen18
dc382dcfcc cache 2025-08-20 21:30:18 -05:00
mjallen18
b1a06034f1 disable gnome 2025-08-20 21:30:18 -05:00
mjallen18
aa3e8cc263 finally update traefik 2025-08-20 21:30:18 -05:00
mjallen18
b680255bc5 macos 2025-08-20 21:30:18 -05:00
mjallen18
a3f7af4e39 sops 2025-08-20 21:30:18 -05:00
mjallen18
cd5c8a0034 no splash 2025-08-20 21:30:18 -05:00
mjallen18
1f14f020ed ssh 2025-08-20 21:30:18 -05:00
mjallen18
05affb6b1f test 2025-08-18 20:54:03 -05:00
mjallen18
2623efc997 update hass addons 2025-08-18 19:52:09 -05:00
mjallen18
c053da2e30 bcachefs 2025-08-17 21:01:59 -05:00
mjallen18
533d6a4170 pi5 upd 2025-08-17 20:58:54 -05:00
mjallen18
5b3e01820b desktop omnissa 2025-08-12 21:25:07 -05:00
5cef58ade0 fix 2025-08-12 17:04:25 +00:00
mjallen18
981b41f4c2 upd 2025-08-12 08:18:19 -05:00
mjallen18
ae8039dba0 weather 2025-08-07 22:30:20 -05:00
mjallen18
54f56c3f83 upd 2025-08-07 22:30:01 -05:00
mjallen18
ce142bb64a fix this package 2025-07-30 21:44:57 -05:00
mjallen18
fd3f61a0ac lsfg 2025-07-29 20:02:37 -05:00
mjallen18
d0ac22c211 bcachefs 2025-07-29 19:34:10 -05:00
mjallen18
caa326d496 test 2025-07-29 18:26:50 -05:00
mjallen18
04ef2a4b8c temp 2025-07-29 16:43:51 -05:00
mjallen18
7e35a27b2e lsfg-vk 2025-07-28 15:16:56 -05:00
mjallen18
48108e693a gnome home manager on steamdeck 2025-07-28 14:49:03 -05:00
mjallen18
8e3d3e4281 openhasp 2025-07-28 14:18:54 -05:00
mjallen18
c7c99b339b fix package 2025-07-28 11:27:06 -05:00
mjallen18
c8f5547727 openhasp 2025-07-28 11:27:00 -05:00
mjallen18
6f5e592d8c cleanup 2025-07-28 11:06:32 -05:00
mjallen18
5ae3f1a9ef desktop home sops 2025-07-28 09:33:54 -05:00
mjallen18
1a3b091588 desktop stuff 2025-07-28 09:32:31 -05:00
mjallen18
5b34456571 yamlfmt 2025-07-24 11:25:18 -05:00
mjallen18
5918611469 yamlfmt 2025-07-24 11:22:29 -05:00
mjallen18
f3aafffcaa deadnix 2025-07-24 11:19:19 -05:00
mjallen18
3d213c8769 nixfmt 2025-07-24 11:06:08 -05:00
mjallen18
f05972d6ae move commented file: 2025-07-24 10:38:13 -05:00
mjallen18
b77dda0e6f fix some stuff 2025-07-24 10:31:50 -05:00
mjallen18
3c1a956c81 cleanup 2025-07-24 10:19:32 -05:00
mjallen18
5dc1a96f6d cleanup 2025-07-23 19:36:06 -05:00
239 changed files with 4561 additions and 12348 deletions

View File

@@ -10,81 +10,81 @@ keys:
- &pi5 age1t2d5scrukk0guva5sr97a8tge5j8kd865adezrcru7p269pzwvpsamkgje - &pi5 age1t2d5scrukk0guva5sr97a8tge5j8kd865adezrcru7p269pzwvpsamkgje
- &deck age1c8qw59ffcq9l77gfmtyc3djtvt3md0u6dwhrjcgsm98ntyf72ufqugj7cg - &deck age1c8qw59ffcq9l77gfmtyc3djtvt3md0u6dwhrjcgsm98ntyf72ufqugj7cg
- &steamdeck age1er5qucsc2mugrzrr7n3xhzv7kemkrqrw4m84r544fkk7nkg5g5eswxkqj0 - &steamdeck age1er5qucsc2mugrzrr7n3xhzv7kemkrqrw4m84r544fkk7nkg5g5eswxkqj0
- &matt_macbook-pro age1xg6mvj3x6s3t8058c6rsk3q4kskvm6nsffwckxkkjzhyn7r6tczqgkj23p - &matt_macbook-pro age19daqsncuzeh3j6cwk8uxp6yfj8h0qtz02jxlwwy4v8j0mfgznsvq30440g
- &macbook-pro age1rdn39ywgzmc8wlsl5lrfe77e652wzjmjx58gx4k2ydghd35kdqvqscrf3h - &macbook-pro age19w4zafpwnq9yhzuf8r5te2yhq7xlqj76rcgzcz935hllyrz4yvws4jn6ca
- &nuc age1wurzgc20e6ye79wsg85vvqk4aj3mmc0llxshcy9532ex8f4c6dqql76c78 - &nuc age1wurzgc20e6ye79wsg85vvqk4aj3mmc0llxshcy9532ex8f4c6dqql76c78
- &admin_nuc age1luyejgmqjj0esydlr2jxqkg48vexmx57gdz7cy5gq7rz8kf5cups2rnfa9 - &admin_nuc age1luyejgmqjj0esydlr2jxqkg48vexmx57gdz7cy5gq7rz8kf5cups2rnfa9
creation_rules: creation_rules:
- path_regex: secrets/[^/]+\.(yaml|json|env|ini)$ - path_regex: secrets/[^/]+\.(yaml|json|env|ini)$
key_groups: key_groups:
- age: - age:
- *matt - *matt
- *matt_pi4 - *matt_pi4
- *matt_pi5 - *matt_pi5
- *desktop - *desktop
- *admin - *admin
- *jallen-nas - *jallen-nas
- *pi4 - *pi4
- *pi5 - *pi5
- *deck - *deck
- *steamdeck - *steamdeck
- *matt_macbook-pro - *matt_macbook-pro
- *macbook-pro - *macbook-pro
- *admin_nuc - *admin_nuc
- *nuc - *nuc
- path_regex: nas-secrets/[^/]+\.(yaml|json|env|ini)$ - path_regex: nas-secrets/[^/]+\.(yaml|json|env|ini)$
key_groups: key_groups:
- age: - age:
- *matt - *matt
- *desktop - *desktop
- *admin - *admin
- *jallen-nas - *jallen-nas
- path_regex: desktop-secrets/[^/]+\.(yaml|json|env|ini)$ - path_regex: desktop-secrets/[^/]+\.(yaml|json|env|ini)$
key_groups: key_groups:
- age: - age:
- *matt - *matt
- *desktop - *desktop
- *admin - *admin
- *jallen-nas - *jallen-nas
- path_regex: steamdeck-secrets/[^/]+\.(yaml|json|env|ini)$ - path_regex: steamdeck-secrets/[^/]+\.(yaml|json|env|ini)$
key_groups: key_groups:
- age: - age:
- *matt - *matt
- *desktop - *desktop
- *deck - *deck
- *steamdeck - *steamdeck
- *admin - *admin
- *jallen-nas - *jallen-nas
- path_regex: pi4-secrets/[^/]+\.(yaml|json|env|ini)$ - path_regex: pi4-secrets/[^/]+\.(yaml|json|env|ini)$
key_groups: key_groups:
- age: - age:
- *matt - *matt
- *matt_pi4 - *matt_pi4
- *matt_pi5 - *matt_pi5
- *desktop - *desktop
- *pi4 - *pi4
- *pi5 - *pi5
- *admin - *admin
- *jallen-nas - *jallen-nas
- path_regex: pi5-secrets/[^/]+\.(yaml|json|env|ini)$ - path_regex: pi5-secrets/[^/]+\.(yaml|json|env|ini)$
key_groups: key_groups:
- age: - age:
- *matt - *matt
- *matt_pi4 - *matt_pi4
- *matt_pi5 - *matt_pi5
- *desktop - *desktop
- *pi4 - *pi4
- *pi5 - *pi5
- *admin - *admin
- *jallen-nas - *jallen-nas
- path_regex: mac-secrets/[^/]+\.(yaml|json|env|ini)$ - path_regex: mac-secrets/[^/]+\.(yaml|json|env|ini)$
key_groups: key_groups:
- age: - age:
- *matt - *matt
- *matt_pi5 - *matt_pi5
- *desktop - *desktop
- *pi5 - *pi5
- *admin - *admin
- *jallen-nas - *jallen-nas
- *matt_macbook-pro - *matt_macbook-pro
- *macbook-pro - *macbook-pro

156
README.md
View File

@@ -1,50 +1,118 @@
# nixOS Config # NixOS Configuration Repository
### Common Files This repository contains my personal NixOS configurations for multiple systems, managed using [Snowfall Lib](https://github.com/snowfallorg/lib) and the Nix Flakes system.
* [flake.nix](./flake.nix)
* [impermenance.nix](./share/impermanence/default.nix) ## Overview
* [share](./share)
* [overlays](./overlays) This repository provides a centralized, declarative configuration for all my systems, including:
- Desktop PC (AMD)
- NAS server
- Steam Deck
- Intel NUC
- Raspberry Pi 4
- Raspberry Pi 5
- MacBook Pro (NixOS on Apple Silicon)
- MacBook Pro (Darwin/macOS)
## Repository Structure
```
.
├── checks/ # Pre-commit hooks and other checks
├── flake.nix # Main flake configuration
├── homes/ # Home-manager configurations for users
│ ├── aarch64-darwin/ # macOS home configurations
│ ├── aarch64-linux/ # ARM Linux home configurations
│ └── x86_64-linux/ # x86 Linux home configurations
├── modules/ # Reusable configuration modules
│ ├── home/ # Home-manager modules
│ └── nixos/ # NixOS system modules
├── overlays/ # Nixpkgs overlays
├── packages/ # Custom package definitions
├── secrets/ # Encrypted secrets (managed with sops-nix)
└── systems/ # System-specific configurations
├── aarch64-darwin/ # macOS system configurations
├── aarch64-linux/ # ARM Linux system configurations
└── x86_64-linux/ # x86 Linux system configurations
```
## Key Features
- **Modular Design**: Reusable modules for various system components
- **Multi-System Support**: Configurations for different hardware platforms
- **Home Manager Integration**: User environment management
- **Secret Management**: Encrypted secrets with sops-nix
- **Disk Management**: Declarative disk partitioning with disko
- **State Management**: Persistent state management with impermanence
- **Desktop Environments**: Support for GNOME, Hyprland, and COSMIC
- **Hardware-Specific Optimizations**: Tailored configurations for different hardware
## Key Technologies
- [Nix](https://nixos.org/) and [NixOS](https://nixos.org/)
- [Nix Flakes](https://nixos.wiki/wiki/Flakes)
- [Snowfall Lib](https://github.com/snowfallorg/lib)
- [Home Manager](https://github.com/nix-community/home-manager)
- [sops-nix](https://github.com/Mic92/sops-nix)
- [disko](https://github.com/nix-community/disko)
- [impermanence](https://github.com/nix-community/impermanence)
- [lanzaboote](https://github.com/nix-community/lanzaboote) (Secure Boot)
## Notable System Configurations
### Desktop ### Desktop
* [boot.nix](./hosts/desktop/boot.nix)
* [configuration.nix](./hosts/desktop/configuration.nix) A powerful AMD-based desktop with gaming capabilities, featuring:
* [hardware-configuration.nix](./hosts/desktop/hardware-configuration.nix) - AMD CPU and GPU optimizations
* [filesystems.nix](./hosts/desktop/filesystems.nix) - Multiple desktop environment options (GNOME, Hyprland, COSMIC)
* [home.nix](./hosts/desktop/home.nix) - Gaming setup with Steam and related tools
* [sops.nix](./hosts/desktop/sops.nix)
* [specialisations.hyprland](./hosts/desktop/hyprland)
* [specialisations.gnome](./hosts/desktop/gnome)
* [specialisations.cosmic](./hosts/desktop/cosmic)
### NAS ### NAS
* [boot.nix](./hosts/nas/boot.nix)
* [configuration.nix](./hosts/nas/configuration.nix)
* [hardware-configuration.nix](./hosts/nas/hardware-configuration.nix)
* [impermenance.nix](./hosts/nas/impermenance.nix)
* [apps.nix](./hosts/desktop/apps.nix)
* [home.nix](./hosts/desktop/home.nix)
* [networking.nix](./hosts/desktop/networking.nix)
* [services.nix](./hosts/desktop/services.nix)
* [sops.nix](./hosts/desktop/sops.nix)
* [ups.nix](./hosts/desktop/ups.nix)
* [samba](./modules/samba)
* nas-apps
* [arrs](./hosts/nas/apps/arrs/default.nix)
* [free-games-claimer](./modules/apps/free-games-claimer)
* [jackett](./modules/apps/jackett)
* [jellyfin](./hosts/nas/apps/jellyfin/default.nix)
* [jellyseerr](./hosts/nas/apps/jellyseerr/default.nix)
* [jackett](./modules/apps/manyfold)
* [mariadb](./modules/apps/mariadb)
* [mealie](./modules/apps/mealie)
* [nextcloud+onlyoffice](./hosts/nas/apps/nextcloud/default.nix)
* [ollama](./hosts/nas/apps/ollama/default.nix)
* [paperless](./hosts/nas/apps/paperless/default.nix)
* [tdarr](./modules/apps/tdarr)
* [traefik](./hosts/nas/apps/traefik/default.nix)
* [wireguard](./modules/apps/your-spotify)
### Raspberry Pi 4 A home server with various self-hosted services:
* [configuration.nix](./hosts/pi4/configuration.nix) - Media management (Jellyfin, Jellyseerr)
* [hardware-configuration.nix](./hosts/pi4/hardware-configuration.nix) - Download automation (Sonarr, Radarr, etc.)
- Document management (Paperless)
- File sharing (Samba, Nextcloud)
- AI services (Ollama)
### Raspberry Pi
Configurations for both Pi 4 and Pi 5:
- Hardware-specific optimizations
- Disk partitioning suitable for ARM devices
- Bluetooth and wireless support
### Steam Deck
Custom NixOS configuration for the Steam Deck:
- Integration with Jovian for Steam Deck compatibility
- Gaming optimizations
- Steam ROM Manager
### MacBook Pro
Configurations for both:
- NixOS on Apple Silicon
- nix-darwin for macOS
## Usage
### Building a System Configuration
```bash
# Build and activate a system configuration
sudo nixos-rebuild switch --flake .#hostname
```
### Building a Home Configuration
```bash
# Build and activate a home configuration
home-manager switch --flake .#username@hostname
```
## License
This project is licensed under the MIT License - see the LICENSE file for details.

View File

@@ -1,19 +1,22 @@
{ {
inputs, inputs,
pkgs, pkgs,
lib,
... ...
}: }:
let let
inherit (inputs) git-hooks-nix; inherit (inputs) pre-commit-hooks-nix;
in in
git-hooks-nix.lib.${pkgs.system}.run { pre-commit-hooks-nix.lib.${pkgs.system}.run {
src = ../..; src = ../..;
hooks = { hooks = {
pre-commit-hook-ensure-sops.enable = true; pre-commit-hook-ensure-sops.enable = true;
treefmt = { treefmt = {
enable = true; enable = lib.mkForce true;
settings.fail-on-change = false; settings.fail-on-change = lib.mkForce false;
packageOverrides.treefmt = inputs.treefmt-nix.lib.mkWrapper pkgs ../../treefmt.nix; packageOverrides.treefmt = inputs.treefmt-nix.lib.mkWrapper pkgs (
lib.snowfall.fs.get-file "treefmt.nix"
);
}; };
}; };
} }

249
flake.lock generated
View File

@@ -30,11 +30,11 @@
"uv2nix": "uv2nix" "uv2nix": "uv2nix"
}, },
"locked": { "locked": {
"lastModified": 1751033152, "lastModified": 1753369162,
"narHash": "sha256-0ANu9OLQJszcEyvnfDB7G957uqskZwCrTzRXz/yfAmE=", "narHash": "sha256-pSAsUVueht3WyyFJ3K+QJKWqFZNbyvsXijHOAHApeLk=",
"owner": "nix-community", "owner": "nix-community",
"repo": "authentik-nix", "repo": "authentik-nix",
"rev": "1a4d6a5dd6fef39b99eb7ea4db79c5d5c7d7f1bf", "rev": "1361d269fe10c527528264185567a053252e22b0",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -46,16 +46,16 @@
"authentik-src": { "authentik-src": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1751031262, "lastModified": 1753187012,
"narHash": "sha256-SNgRMQUjL3DTlWkMyRMan+pY1FfIV+DMeq5BiTM0N0k=", "narHash": "sha256-bs/ThY3YixwBObahcS7BrOWj0gsaUXI664ldUQlJul8=",
"owner": "goauthentik", "owner": "goauthentik",
"repo": "authentik", "repo": "authentik",
"rev": "b34665fabd8d938d81ce871a4e86ca528c5f253b", "rev": "23ffad1c6be80bea223caf5f1cf265b984b76328",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "goauthentik", "owner": "goauthentik",
"ref": "version/2025.4.3", "ref": "version/2025.6.4",
"repo": "authentik", "repo": "authentik",
"type": "github" "type": "github"
} }
@@ -63,16 +63,16 @@
"brew-src": { "brew-src": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1751910772, "lastModified": 1753461463,
"narHash": "sha256-jQNdIkq2iRDNWskd5f8kX6q9BO/CBSXhMH41WNRft8E=", "narHash": "sha256-kGc7pRH0diLzKmOHsEFA8sZ9NJpgT+tqxAMsuqNd5Po=",
"owner": "Homebrew", "owner": "Homebrew",
"repo": "brew", "repo": "brew",
"rev": "700d67a85e0129ab8a893ff69246943479e33df1", "rev": "4d14be89e99a45181c18e96a5f19a5b43343cc0f",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "Homebrew", "owner": "Homebrew",
"ref": "4.5.9", "ref": "4.5.13",
"repo": "brew", "repo": "brew",
"type": "github" "type": "github"
} }
@@ -86,11 +86,11 @@
"rust-overlay": "rust-overlay" "rust-overlay": "rust-overlay"
}, },
"locked": { "locked": {
"lastModified": 1753146705, "lastModified": 1755444192,
"narHash": "sha256-WzmXODUzg8jeEsAhpmp55zk5I2fmv3kv+RofZ/+FYlg=", "narHash": "sha256-9eVUtk3ces32aJpHnsrO49UJNvMKNMxlV7NeNSAADLo=",
"owner": "chaotic-cx", "owner": "chaotic-cx",
"repo": "nyx", "repo": "nyx",
"rev": "02b3c2a45f6ddbd704f797c5730bc2d161f10ce0", "rev": "958ba486ee73019e3820b9ebd97a38660f736f40",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -160,11 +160,11 @@
"nixpkgs": "nixpkgs_5" "nixpkgs": "nixpkgs_5"
}, },
"locked": { "locked": {
"lastModified": 1751313918, "lastModified": 1755275010,
"narHash": "sha256-HsJM3XLa43WpG+665aGEh8iS8AfEwOIQWk3Mke3e7nk=", "narHash": "sha256-lEApCoWUEWh0Ifc3k1JdVjpMtFFXeL2gG1qvBnoRc2I=",
"owner": "LnL7", "owner": "LnL7",
"repo": "nix-darwin", "repo": "nix-darwin",
"rev": "e04a388232d9a6ba56967ce5b53a8a6f713cdfcf", "rev": "7220b01d679e93ede8d7b25d6f392855b81dd475",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -180,16 +180,15 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1742690494, "lastModified": 1755519972,
"narHash": "sha256-SFacEbSRMoTyWG5VXh4ieofJGge+cLq9lH8ifB+zjBg=", "narHash": "sha256-bU4nqi3IpsUZJeyS8Jk85ytlX61i4b0KCxXX9YcOgVc=",
"owner": "nvmd", "owner": "nix-community",
"repo": "disko", "repo": "disko",
"rev": "9dc58d4d49c9f74623a06e2fc20cdfd8bb3cbe8b", "rev": "4073ff2f481f9ef3501678ff479ed81402caae6d",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nvmd", "owner": "nix-community",
"ref": "gpt-attrs",
"repo": "disko", "repo": "disko",
"type": "github" "type": "github"
} }
@@ -244,11 +243,11 @@
}, },
"flake-compat_4": { "flake-compat_4": {
"locked": { "locked": {
"lastModified": 1688025799, "lastModified": 1746162366,
"narHash": "sha256-ktpB4dRtnksm9F5WawoIkEneh1nrEvuxb5lJFt1iOyw=", "narHash": "sha256-5SSSZ/oQkwfcAz/o/6TlejlVGqeK08wyREBQ5qFFPhM=",
"owner": "nix-community", "owner": "nix-community",
"repo": "flake-compat", "repo": "flake-compat",
"rev": "8bf105319d44f6b9f0d764efa4fdef9f1cc9ba1c", "rev": "0f158086a2ecdbb138cd0429410e44994f1b7e4b",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -260,11 +259,11 @@
"flake-compat_5": { "flake-compat_5": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1696426674, "lastModified": 1747046372,
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=",
"owner": "edolstra", "owner": "edolstra",
"repo": "flake-compat", "repo": "flake-compat",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -504,11 +503,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1753132348, "lastModified": 1755313937,
"narHash": "sha256-0i3jU9AHuNXb0wYGzImnVwaw+miE0yW13qfjC0F+fIE=", "narHash": "sha256-pQb7bNcolxYGRiylUCrTddiF+qW2wsUiM9+eRIDUrVU=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "e4bf85da687027cfc4a8853ca11b6b86ce41d732", "rev": "2a749f4790a14f7168be67cdf6e548ef1c944e10",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -524,11 +523,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1753180535, "lastModified": 1755442500,
"narHash": "sha256-KEtlzMs2O7FDvciFtjk9W4hyau013Pj9qZNK9a0PxEc=", "narHash": "sha256-RHK4H6SWzkAtW/5WBHsyugaXJX25yr5y7FAZznxcBJs=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "847711c7ffa9944b0c5c39a8342ac8eb6a9f9abc", "rev": "d2ffdedfc39c591367b1ddf22b4ce107f029dcc3",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -540,11 +539,11 @@
"homebrew-cask": { "homebrew-cask": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1753192390, "lastModified": 1755480455,
"narHash": "sha256-B/MI7F4IliXNY6QEKCmIEsO4A0Qt9jUZXfMfrX9/5hE=", "narHash": "sha256-cIMlCE5M5Zq1DjfS9mV4AepUv/hn9nrFj0klK7C784c=",
"owner": "homebrew", "owner": "homebrew",
"repo": "homebrew-cask", "repo": "homebrew-cask",
"rev": "4f64bf7953d412b473d1f459208c725861646a6d", "rev": "e1e54f7a14ae909bfefc1f0928c1f70fbfb31c84",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -556,11 +555,11 @@
"homebrew-core": { "homebrew-core": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1753194897, "lastModified": 1755480844,
"narHash": "sha256-jo7SLfGCgQbLKK9kbHXgLJY8bbzESn1K6Sr2x7EFzKY=", "narHash": "sha256-4Uz2TZckTG5dh2CPCj577BsmrGIEV8Ji3o/B8nv1tVE=",
"owner": "homebrew", "owner": "homebrew",
"repo": "homebrew-core", "repo": "homebrew-core",
"rev": "a427a5a802b98591899d4bda471a7a14ed5ff2fd", "rev": "be6e3ae8531ba128ec039d057f76078b1a1513be",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -593,11 +592,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1752755091, "lastModified": 1755151620,
"narHash": "sha256-H/k35QJLyQxkFnXR5ckMv/Z+ElNa5f22qNKdyGBMAn4=", "narHash": "sha256-fVMalQZ+tRXR8oue2SdWu4CdlsS2NII+++rI40XQ8rU=",
"owner": "Jovian-Experiments", "owner": "Jovian-Experiments",
"repo": "Jovian-NixOS", "repo": "Jovian-NixOS",
"rev": "0d09755fe1df1886e5f07dbb16f7ed373080f86a", "rev": "16e12d22754d97064867006acae6e16da7a142a6",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -612,11 +611,11 @@
"nixpkgs": "nixpkgs_6" "nixpkgs": "nixpkgs_6"
}, },
"locked": { "locked": {
"lastModified": 1752755091, "lastModified": 1755151620,
"narHash": "sha256-H/k35QJLyQxkFnXR5ckMv/Z+ElNa5f22qNKdyGBMAn4=", "narHash": "sha256-fVMalQZ+tRXR8oue2SdWu4CdlsS2NII+++rI40XQ8rU=",
"owner": "Jovian-Experiments", "owner": "Jovian-Experiments",
"repo": "Jovian-NixOS", "repo": "Jovian-NixOS",
"rev": "0d09755fe1df1886e5f07dbb16f7ed373080f86a", "rev": "16e12d22754d97064867006acae6e16da7a142a6",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -649,6 +648,27 @@
"type": "github" "type": "github"
} }
}, },
"lsfg-vk": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1753837013,
"narHash": "sha256-+kBJhOSS5S6gPp/pbTk1B3EL9Xr08yFuQoGGQ+SoQwQ=",
"owner": "mjallen18",
"repo": "lsfg-vk-flake",
"rev": "f7fc5f9d421d64d3cf24c8d0955a80718ef70bac",
"type": "github"
},
"original": {
"owner": "mjallen18",
"ref": "main",
"repo": "lsfg-vk-flake",
"type": "github"
}
},
"napalm": { "napalm": {
"inputs": { "inputs": {
"flake-utils": [ "flake-utils": [
@@ -725,11 +745,11 @@
"brew-src": "brew-src" "brew-src": "brew-src"
}, },
"locked": { "locked": {
"lastModified": 1752160973, "lastModified": 1754250993,
"narHash": "sha256-BCC8KB7TEtwv7vZN1WDu870tRbXtzUcmF9xNr6ws5Wc=", "narHash": "sha256-MEin+qoQKtFC1b0f4tnQ+Z82BQWSCgh6Ef7rpmH9gig=",
"owner": "zhaofengli", "owner": "zhaofengli",
"repo": "nix-homebrew", "repo": "nix-homebrew",
"rev": "69c1aa2f136f3c3326d9b6770e0eb54f12832971", "rev": "314d057294e79bc2596972126b84c6f9f144499a",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -745,11 +765,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1752985182, "lastModified": 1755404379,
"narHash": "sha256-sX8Neff8lp3TCHai6QmgLr5AD8MdsQQX3b52C1DVXR8=", "narHash": "sha256-Q6ZxZDBmD/B988Jjbx7/NchxOKIpOKBBrx9Yb0zMzpQ=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nix-index-database", "repo": "nix-index-database",
"rev": "fafdcb505ba605157ff7a7eeea452bc6d6cbc23c", "rev": "ebbc1c05f786ae39bb5e04e57bf2c10c44a649e3",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -764,11 +784,11 @@
"nixpkgs": "nixpkgs_8" "nixpkgs": "nixpkgs_8"
}, },
"locked": { "locked": {
"lastModified": 1753150460, "lastModified": 1755396877,
"narHash": "sha256-q2dkvuIfEb5fWBF6TJePJbcP1hqxARAUddfPGVGvD38=", "narHash": "sha256-92gZRDz3zEsodraI0ZxPzZrpjSqc2qjxTW9HOflzKFw=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nix-vscode-extensions", "repo": "nix-vscode-extensions",
"rev": "d13827556415f4050b510e9cfb9873c1ce9aaec4", "rev": "0cf076c0bafbe7cbd33a3b7377ed24827674e8be",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -783,11 +803,11 @@
"nixpkgs": "nixpkgs_9" "nixpkgs": "nixpkgs_9"
}, },
"locked": { "locked": {
"lastModified": 1751669768, "lastModified": 1755154580,
"narHash": "sha256-/WSZcdPwng24i8Z3LgrpZTBt94fvDknidtLQjohAnHg=", "narHash": "sha256-ADGapM7FrEgA3tDSYADtfy2EPeAmBzbL3pFvXNhD0D0=",
"owner": "olafkfreund", "owner": "olafkfreund",
"repo": "nix-ai-help", "repo": "nix-ai-help",
"rev": "b79e8cc14623d7ba5f6beea64cec32512997cd5a", "rev": "e71204cb39358ad1dc4c09202c3a17ede541c2d9",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -799,14 +819,15 @@
"nixos-apple-silicon": { "nixos-apple-silicon": {
"inputs": { "inputs": {
"flake-compat": "flake-compat_4", "flake-compat": "flake-compat_4",
"nixpkgs": "nixpkgs_10" "nixpkgs": "nixpkgs_10",
"treefmt-nix": "treefmt-nix"
}, },
"locked": { "locked": {
"lastModified": 1753175937, "lastModified": 1755124568,
"narHash": "sha256-DtDt87Gld0RCI2qHb7uUb1eWB16FFC4aNDfxZpic/Nw=", "narHash": "sha256-8fXTYruAwE6OiIz/99P5qknQYag7ZX985pNT+jhIIrU=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nixos-apple-silicon", "repo": "nixos-apple-silicon",
"rev": "5ddfff8387edf7c92ce36effb06fb2c52624fece", "rev": "2f873fc3ef373e59cd3a7dad4087685fc8ce02ca",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -817,11 +838,11 @@
}, },
"nixos-hardware": { "nixos-hardware": {
"locked": { "locked": {
"lastModified": 1753122741, "lastModified": 1755330281,
"narHash": "sha256-nFxE8lk9JvGelxClCmwuJYftbHqwnc01dRN4DVLUroM=", "narHash": "sha256-aJHFJWP9AuI8jUGzI77LYcSlkA9wJnOIg4ZqftwNGXA=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixos-hardware", "repo": "nixos-hardware",
"rev": "cc66fddc6cb04ab479a1bb062f4d4da27c936a22", "rev": "3dac8a872557e0ca8c083cdcfc2f218d18e113b0",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -864,11 +885,11 @@
"nixpkgs": "nixpkgs_11" "nixpkgs": "nixpkgs_11"
}, },
"locked": { "locked": {
"lastModified": 1753141210, "lastModified": 1755008580,
"narHash": "sha256-yV7+cv0q5XL7uv9gvSG7R0jktgXgB+forv3c7TfY2T8=", "narHash": "sha256-rh4OhOutko9W9COhhxQnqt9J22ZPj7gSZN7wrX0cYEs=",
"owner": "mjallen18", "owner": "mjallen18",
"repo": "nixos-raspberrypi", "repo": "nixos-raspberrypi",
"rev": "e0f487998cb4409408f03e019c71c21011edb84c", "rev": "7b5cf1ef3cf48ac1b43730eb366225f3dd0791cb",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -942,11 +963,11 @@
}, },
"nixpkgs-stable_3": { "nixpkgs-stable_3": {
"locked": { "locked": {
"lastModified": 1753115646, "lastModified": 1755274400,
"narHash": "sha256-yLuz5cz5Z+sn8DRAfNkrd2Z1cV6DaYO9JMrEz4KZo/c=", "narHash": "sha256-rTInmnp/xYrfcMZyFMH3kc8oko5zYfxsowaLv1LVobY=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "92c2e04a475523e723c67ef872d8037379073681", "rev": "ad7196ae55c295f53a7d1ec39e4a06d922f3b899",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -958,11 +979,11 @@
}, },
"nixpkgs_10": { "nixpkgs_10": {
"locked": { "locked": {
"lastModified": 1748460289, "lastModified": 1754725699,
"narHash": "sha256-7doLyJBzCllvqX4gszYtmZUToxKvMUrg45EUWaUYmBg=", "narHash": "sha256-iAcj9T/Y+3DBy2J0N+yF9XQQQ8IEb5swLFzs23CdP88=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "96ec055edbe5ee227f28cdbc3f1ddf1df5965102", "rev": "85dbfc7aaf52ecb755f87e577ddbe6dbbdbc1054",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -974,11 +995,11 @@
}, },
"nixpkgs_11": { "nixpkgs_11": {
"locked": { "locked": {
"lastModified": 1752372066, "lastModified": 1754432582,
"narHash": "sha256-d1oy2MNitnWBkIX/WedzG/WB8jCaqGjtIebQuVIlqSg=", "narHash": "sha256-oebayZREKV/4Fgy6drsj4M7URut4kQVics78DxL2imk=",
"owner": "nvmd", "owner": "nvmd",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "3699bec87ab236af2c45aa6d4539140a6342a77a", "rev": "81f9846bc3c9edbd2d4c92783e7bfb4b55db14c4",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -990,11 +1011,11 @@
}, },
"nixpkgs_12": { "nixpkgs_12": {
"locked": { "locked": {
"lastModified": 1752427638, "lastModified": 1755186698,
"narHash": "sha256-ANNyaXW/cnZLszjXB4LXGxaWZ2cRz7Ar06WjYoawgFo=", "narHash": "sha256-wNO3+Ks2jZJ4nTHMuks+cxAiVBGNuEBXsT29Bz6HASo=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "b2e5044b3e79793df83d01c9983c054cae5ea6ff", "rev": "fbcf476f790d8a217c3eab4e12033dc4a0f6d23c",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1006,11 +1027,11 @@
}, },
"nixpkgs_13": { "nixpkgs_13": {
"locked": { "locked": {
"lastModified": 1730768919, "lastModified": 1754340878,
"narHash": "sha256-8AKquNnnSaJRXZxc5YmF/WfmxiHX6MMZZasRP6RRQkE=", "narHash": "sha256-lgmUyVQL9tSnvvIvBp7x1euhkkCho7n3TMzgjdvgPoU=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "a04d33c0c3f1a59a2c1cb0c6e34cd24500e5a1dc", "rev": "cab778239e705082fe97bb4990e0d24c50924c04",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1038,11 +1059,11 @@
}, },
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1752950548, "lastModified": 1755186698,
"narHash": "sha256-NS6BLD0lxOrnCiEOcvQCDVPXafX1/ek1dfJHX1nUIzc=", "narHash": "sha256-wNO3+Ks2jZJ4nTHMuks+cxAiVBGNuEBXsT29Bz6HASo=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "c87b95e25065c028d31a94f06a62927d18763fdf", "rev": "fbcf476f790d8a217c3eab4e12033dc4a0f6d23c",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1101,11 +1122,11 @@
}, },
"nixpkgs_6": { "nixpkgs_6": {
"locked": { "locked": {
"lastModified": 1751984180, "lastModified": 1755027561,
"narHash": "sha256-LwWRsENAZJKUdD3SpLluwDmdXY9F45ZEgCb0X+xgOL0=", "narHash": "sha256-IVft239Bc8p8Dtvf7UAACMG5P3ZV+3/aO28gXpGtMXI=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "9807714d6944a957c2e036f84b0ff8caf9930bc0", "rev": "005433b926e16227259a1843015b5b2b7f7d1fc3",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1197,11 +1218,11 @@
"nixpkgs": "nixpkgs_13" "nixpkgs": "nixpkgs_13"
}, },
"locked": { "locked": {
"lastModified": 1750779888, "lastModified": 1755446520,
"narHash": "sha256-wibppH3g/E2lxU43ZQHC5yA/7kIKLGxVEnsnVK1BtRg=", "narHash": "sha256-I0Ok1OGDwc1jPd8cs2VvAYZsHriUVFGIUqW+7uSsOUM=",
"owner": "cachix", "owner": "cachix",
"repo": "pre-commit-hooks.nix", "repo": "pre-commit-hooks.nix",
"rev": "16ec914f6fb6f599ce988427d9d94efddf25fe6d", "rev": "4b04db83821b819bbbe32ed0a025b31e7971f22e",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1274,6 +1295,7 @@
"impermanence": "impermanence", "impermanence": "impermanence",
"jovian": "jovian_2", "jovian": "jovian_2",
"lanzaboote": "lanzaboote", "lanzaboote": "lanzaboote",
"lsfg-vk": "lsfg-vk",
"nix-homebrew": "nix-homebrew", "nix-homebrew": "nix-homebrew",
"nix-index-database": "nix-index-database", "nix-index-database": "nix-index-database",
"nix-vscode-extensions": "nix-vscode-extensions", "nix-vscode-extensions": "nix-vscode-extensions",
@@ -1287,7 +1309,7 @@
"snowfall-lib": "snowfall-lib", "snowfall-lib": "snowfall-lib",
"sops-nix": "sops-nix", "sops-nix": "sops-nix",
"steam-rom-manager": "steam-rom-manager", "steam-rom-manager": "steam-rom-manager",
"treefmt-nix": "treefmt-nix" "treefmt-nix": "treefmt-nix_2"
} }
}, },
"rust-overlay": { "rust-overlay": {
@@ -1298,11 +1320,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1753066249, "lastModified": 1755311859,
"narHash": "sha256-j2UBrfDRIePGx3532Bbb9UeosNX2F73hfOAHtmACfnM=", "narHash": "sha256-NspGtm0ZpihxlFD628pvh5ZEhL/Q6/Z9XBpe3n6ZtEw=",
"owner": "oxalica", "owner": "oxalica",
"repo": "rust-overlay", "repo": "rust-overlay",
"rev": "0751b65633a1785743ca44fd7c14a633c54c1f91", "rev": "07619500e5937cc4669f24fec355d18a8fec0165",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1380,11 +1402,11 @@
"nixpkgs": "nixpkgs_14" "nixpkgs": "nixpkgs_14"
}, },
"locked": { "locked": {
"lastModified": 1752544651, "lastModified": 1754988908,
"narHash": "sha256-GllP7cmQu7zLZTs9z0J2gIL42IZHa9CBEXwBY9szT0U=", "narHash": "sha256-t+voe2961vCgrzPFtZxha0/kmFSHFobzF00sT8p9h0U=",
"owner": "Mic92", "owner": "Mic92",
"repo": "sops-nix", "repo": "sops-nix",
"rev": "2c8def626f54708a9c38a5861866660395bb3461", "rev": "3223c7a92724b5d804e9988c6b447a0d09017d48",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1494,15 +1516,36 @@
"treefmt-nix": { "treefmt-nix": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
"nixos-apple-silicon",
"nixpkgs" "nixpkgs"
] ]
}, },
"locked": { "locked": {
"lastModified": 1753006367, "lastModified": 1754847726,
"narHash": "sha256-tzbhc4XttkyEhswByk5R38l+ztN9UDbnj0cTcP6Hp9A=", "narHash": "sha256-2vX8QjO5lRsDbNYvN9hVHXLU6oMl+V/PsmIiJREG4rE=",
"owner": "numtide", "owner": "numtide",
"repo": "treefmt-nix", "repo": "treefmt-nix",
"rev": "421b56313c65a0815a52b424777f55acf0b56ddf", "rev": "7d81f6fb2e19bf84f1c65135d1060d829fae2408",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
},
"treefmt-nix_2": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1754847726,
"narHash": "sha256-2vX8QjO5lRsDbNYvN9hVHXLU6oMl+V/PsmIiJREG4rE=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "7d81f6fb2e19bf84f1c65135d1060d829fae2408",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@@ -6,8 +6,8 @@
# The name "snowfall-lib" is required due to how Snowfall Lib processes your # The name "snowfall-lib" is required due to how Snowfall Lib processes your
# flake's inputs. # flake's inputs.
snowfall-lib = { snowfall-lib = {
url = "github:snowfallorg/lib"; url = "github:snowfallorg/lib";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable"; chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable";
@@ -18,7 +18,7 @@
}; };
impermanence.url = "github:nix-community/impermanence"; impermanence.url = "github:nix-community/impermanence";
lanzaboote.url = "github:nix-community/lanzaboote/v0.4.2"; lanzaboote.url = "github:nix-community/lanzaboote/v0.4.2";
nixos-hardware.url = "github:NixOS/nixos-hardware/master"; nixos-hardware.url = "github:NixOS/nixos-hardware/master";
@@ -43,8 +43,8 @@
disko = { disko = {
# the fork is needed for partition attributes support # the fork is needed for partition attributes support
url = "github:nvmd/disko/gpt-attrs"; # url = "github:nvmd/disko/gpt-attrs";
# url = "github:nix-community/disko"; url = "github:nix-community/disko";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
@@ -81,12 +81,17 @@
nixpkgs.follows = "nixpkgs"; nixpkgs.follows = "nixpkgs";
}; };
}; };
lsfg-vk = {
url = "github:mjallen18/lsfg-vk-flake/main";
inputs.nixpkgs.follows = "nixpkgs";
};
}; };
# We will handle this in the next section. # We will handle this in the next section.
outputs = inputs: outputs =
let inputs:
snowfall = inputs.snowfall-lib.mkFlake { inputs.snowfall-lib.mkFlake {
# You must provide our flake inputs to Snowfall Lib. # You must provide our flake inputs to Snowfall Lib.
inherit inputs; inherit inputs;
@@ -129,6 +134,7 @@
nixos-hardware.nixosModules.common-gpu-amd nixos-hardware.nixosModules.common-gpu-amd
nixos-hardware.nixosModules.common-hidpi nixos-hardware.nixosModules.common-hidpi
nixos-hardware.nixosModules.common-pc nixos-hardware.nixosModules.common-pc
lsfg-vk.nixosModules.default
]; ];
}; };
@@ -150,7 +156,7 @@
# ###################################################### # ######################################################
# Steamdeck # # Steamdeck #
# ###################################################### # ######################################################
deck = { steamdeck = {
modules = with inputs; [ modules = with inputs; [
disko.nixosModules.disko disko.nixosModules.disko
jovian.nixosModules.jovian jovian.nixosModules.jovian
@@ -160,6 +166,7 @@
nixos-hardware.nixosModules.common-gpu-amd nixos-hardware.nixosModules.common-gpu-amd
nixos-hardware.nixosModules.common-hidpi nixos-hardware.nixosModules.common-hidpi
nixos-hardware.nixosModules.common-pc nixos-hardware.nixosModules.common-pc
lsfg-vk.nixosModules.default
]; ];
}; };
@@ -209,6 +216,7 @@
macbook-pro-nixos = { macbook-pro-nixos = {
modules = with inputs; [ modules = with inputs; [
nixos-apple-silicon.nixosModules.default nixos-apple-silicon.nixosModules.default
lsfg-vk.nixosModules.default
]; ];
}; };
}; };
@@ -231,7 +239,7 @@
# sops-nix.homeManagerModules.sops # sops-nix.homeManagerModules.sops
# ]; # ];
# }; # };
"deck@deck" = { "deck@steamdeck" = {
modules = with inputs; [ modules = with inputs; [
steam-rom-manager.homeManagerModules.default steam-rom-manager.homeManagerModules.default
]; ];
@@ -248,11 +256,11 @@
# Add flake metadata that can be processed by tools like Snowfall Frost. # Add flake metadata that can be processed by tools like Snowfall Frost.
meta = { meta = {
# A slug to use in documentation when displaying things like file paths. # A slug to use in documentation when displaying things like file paths.
name = "mjallen"; name = "mjallen";
# A title to show for your flake, typically the name. # A title to show for your flake, typically the name.
title = "mjallen Flake"; title = "mjallen Flake";
}; };
}; };
@@ -260,8 +268,4 @@
formatter = inputs.treefmt-nix.lib.mkWrapper channels.nixpkgs ./treefmt.nix; formatter = inputs.treefmt-nix.lib.mkWrapper channels.nixpkgs ./treefmt.nix;
}; };
}; };
in }
snowfall // {
nixosConfigurations = snowfall.nixosConfigurations;
};
}

View File

@@ -1,4 +1,9 @@
{ lib, pkgs, home, ... }: {
lib,
pkgs,
home,
...
}:
let let
shellAliases = { shellAliases = {
update-switch = "darwin-rebuild switch --flake ~/nix-config"; update-switch = "darwin-rebuild switch --flake ~/nix-config";
@@ -17,12 +22,6 @@ let
]; ];
in in
{ {
# imports = [
# ../../modules/home/defaults.nix
# ../../modules/home/git.nix
# ../../modules/home/shell.nix
# ../../modules/home/vscode.nix
# ];
# Home Manager needs a bit of information about you and the # Home Manager needs a bit of information about you and the
# paths it should manage. # paths it should manage.
home = { home = {

View File

@@ -23,7 +23,7 @@ in
home.stateVersion = "23.11"; home.stateVersion = "23.11";
mjallen = { mjallen = {
desktop.hyprland = { desktop.hyprland = {
enable = true; enable = true;
primaryDisplay = "eDP-1"; primaryDisplay = "eDP-1";
@@ -41,7 +41,6 @@ in
"name:steam, monitor:${display.input}, default:false, special, class:(.*[Ss]team.*)" "name:steam, monitor:${display.input}, default:false, special, class:(.*[Ss]team.*)"
]; ];
windowRule = [ windowRule = [
"size 2160 3356, tag:horizonrdp" "size 2160 3356, tag:horizonrdp"
]; ];
@@ -76,7 +75,6 @@ in
layer = "bottom"; layer = "bottom";
modules-right = [ modules-right = [
"tray"
"temperature" "temperature"
"temperature#gpu" "temperature#gpu"
"keyboard-state#capslock" "keyboard-state#capslock"
@@ -95,7 +93,7 @@ in
tooltip = false; tooltip = false;
exec = "waybar-hass --get_light light.living_room_lights"; exec = "waybar-hass --get_light light.living_room_lights";
interval = "once"; interval = "once";
format = "{text}";#"󱉓"; format = "{text}"; # "󱉓";
on-click = "waybar-hass --toggle_light light.living_room_lights"; on-click = "waybar-hass --toggle_light light.living_room_lights";
return-type = "json"; return-type = "json";
}; };
@@ -113,6 +111,8 @@ in
background: ${theme.polarNight.nord3}; background: ${theme.polarNight.nord3};
} }
''; '';
windowOffset = 75;
}; };
wlogout.enable = true; wlogout.enable = true;
wofi.enable = true; wofi.enable = true;

View File

@@ -1,65 +1,66 @@
{ lib, ... }: { lib, ... }:
let
shellAliases = {
ll = "ls -alh";
update-boot = "sudo nixos-rebuild boot --max-jobs 10 --build-host admin@10.0.1.3";
update-switch = "sudo nixos-rebuild switch --max-jobs 10 --build-host admin@10.0.1.3";
update-flake = "nix flake update pi4-nixpkgs pi4-home-manager pi4-impermanence pi4-sops-nix pi4-nixos-hardware pi4-nixos-raspberrypi pi4-disko --flake /etc/nixos";
update-nas = "nixos-rebuild switch --use-remote-sudo --target-host admin@10.0.1.3 --build-host admin@10.0.1.3 --flake ~/nix-config#jallen-nas";
nas-ssh = "kitten ssh admin@10.0.1.3";
ducks = "du -cksh * | sort -hr | head -n 15";
};
in
{ {
imports = [
../../../modules/home/home
../../../modules/home/programs/git
../../../modules/home/programs/zsh
];
home.username = "matt"; home.username = "matt";
sops = { mjallen = {
age.keyFile = "/home/matt/.config/sops/age/keys.txt"; shell-aliases = {
defaultSopsFile = "/etc/nixos/secrets/secrets.yaml"; enable = true;
validateSopsFiles = false; flakeInputs = [
secrets = { "pi4-nixpkgs"
"ssh-keys-public/pi4" = { "pi4-home-manager"
path = "/home/matt/.ssh/id_ed25519.pub"; "pi4-impermanence"
mode = "0644"; "pi4-sops-nix"
}; "pi4-nixos-hardware"
"ssh-keys-private/pi4" = { "pi4-nixos-raspberrypi"
path = "/home/matt/.ssh/id_ed25519"; "pi4-disko"
mode = "0600"; ];
}; };
# "ssh-keys-public/desktop-nixos" = { };
# path = "/home/matt/.ssh/authorized_keys";
# mode = "0600";
# };
# "ssh-keys-public/desktop-nixos-root" = { sops = {
# path = "/home/matt/.ssh/authorized_keys2"; age.keyFile = "/home/matt/.config/sops/age/keys.txt";
# mode = "0600"; defaultSopsFile = "/etc/nixos/secrets/secrets.yaml";
# }; validateSopsFiles = false;
secrets = {
"ssh-keys-public/pi4" = {
path = "/home/matt/.ssh/id_ed25519.pub";
mode = "0644";
};
"ssh-keys-private/pi4" = {
path = "/home/matt/.ssh/id_ed25519";
mode = "0600";
};
# "ssh-keys-public/desktop-nixos" = {
# path = "/home/matt/.ssh/authorized_keys";
# mode = "0600";
# };
# "ssh-keys-public/desktop-windows" = { # "ssh-keys-public/desktop-nixos-root" = {
# path = "/home/matt/.ssh/authorized_keys3"; # path = "/home/matt/.ssh/authorized_keys2";
# mode = "0600"; # mode = "0600";
# }; # };
# "ssh-keys-public/macbook-macos" = { # "ssh-keys-public/desktop-windows" = {
# path = "/home/matt/.ssh/authorized_keys4"; # path = "/home/matt/.ssh/authorized_keys3";
# mode = "0600"; # mode = "0600";
# }; # };
};
}; # "ssh-keys-public/macbook-macos" = {
# path = "/home/matt/.ssh/authorized_keys4";
# mode = "0600";
# };
};
};
programs = { programs = {
mangohud.enable = lib.mkForce true; mangohud.enable = lib.mkForce true;
zsh.shellAliases = shellAliases;
}; };
services = { services = {
nextcloud-client.enable = lib.mkForce true; nextcloud-client.enable = lib.mkForce false;
kdeconnect = {
enable = false;
indicator = false;
};
}; };
} }

View File

@@ -1,4 +1,7 @@
{ pkgs, lib, config, namespace, ... }: {
config,
...
}:
let let
shellAliases = { shellAliases = {
update-boot = "sudo nixos-rebuild boot --max-jobs 10 --build-host admin@10.0.1.3"; update-boot = "sudo nixos-rebuild boot --max-jobs 10 --build-host admin@10.0.1.3";
@@ -54,4 +57,12 @@ in
programs = { programs = {
zsh.shellAliases = shellAliases; zsh.shellAliases = shellAliases;
}; };
services = {
nextcloud-client.enable = false;
kdeconnect = {
enable = false;
indicator = false;
};
};
} }

View File

@@ -15,4 +15,12 @@ in
programs = { programs = {
zsh.shellAliases = shellAliases; zsh.shellAliases = shellAliases;
}; };
}
services = {
nextcloud-client.enable = lib.mkForce false;
kdeconnect = {
enable = false;
indicator = false;
};
};
}

View File

@@ -1,16 +1,27 @@
{ pkgs, ... }: { pkgs, ... }:
let
shellAliases = {
update-boot = "sudo nixos-rebuild boot --max-jobs 10";
update-switch = "sudo nixos-rebuild switch --max-jobs 10";
update-flake = "nix flake update nas-nixpkgs nas-authentik-nix nas-cosmic nas-crowdsec nas-home-manager nas-impermanence nas-lanzaboote nas-nixos-hardware nas-sops-nix --flake /etc/nixos";
};
in
{ {
home.username = "admin"; home.username = "admin";
# mjallen.home.enable = true; # mjallen.home.enable = true;
mjallen = {
shell-aliases = {
enable = true;
buildHost = ""; # NAS builds locally
flakeInputs = [
"nas-nixpkgs"
"nas-authentik-nix"
"nas-cosmic"
"nas-crowdsec"
"nas-home-manager"
"nas-impermanence"
"nas-lanzaboote"
"nas-nixos-hardware"
"nas-sops-nix"
];
};
};
sops = { sops = {
age.keyFile = "/home/admin/.config/sops/age/keys.txt"; age.keyFile = "/home/admin/.config/sops/age/keys.txt";
defaultSopsFile = "/etc/nixos/secrets/secrets.yaml"; defaultSopsFile = "/etc/nixos/secrets/secrets.yaml";
@@ -60,8 +71,6 @@ in
} }
]; ];
}; };
zsh.shellAliases = shellAliases;
}; };
# services.nixai = { # services.nixai = {

View File

@@ -1,4 +1,4 @@
{ pkgs,... }: { ... }:
let let
shellAliases = { shellAliases = {
update-boot = "sudo nixos-rebuild boot --max-jobs 10"; update-boot = "sudo nixos-rebuild boot --max-jobs 10";

View File

@@ -10,6 +10,8 @@ in
{ {
home.username = "deck"; home.username = "deck";
mjallen.desktop.gnome.enable = true;
sops = { sops = {
age.keyFile = "/home/deck/.config/sops/age/keys.txt"; age.keyFile = "/home/deck/.config/sops/age/keys.txt";
defaultSopsFile = "/etc/nixos/secrets/secrets.yaml"; defaultSopsFile = "/etc/nixos/secrets/secrets.yaml";
@@ -30,13 +32,13 @@ in
steam-rom-manager = { steam-rom-manager = {
enable = true; enable = true;
steamUsername = "mjallen18"; steamUsername = "mjallen18";
# Optional: override default paths if needed # Optional: override default paths if needed
environmentVariables = { environmentVariables = {
romsDirectory = "/home/deck/Emulation/roms"; romsDirectory = "/home/deck/Emulation/roms";
steamDirectory = "/home/deck/.local/share/Steam"; steamDirectory = "/home/deck/.local/share/Steam";
}; };
emulators = { emulators = {
ryujinx.enable = true; ryujinx.enable = true;
@@ -44,13 +46,21 @@ in
enable = true; enable = true;
package = pkgs.dolphin-emu; package = pkgs.dolphin-emu;
romFolder = "gc"; romFolder = "gc";
fileTypes = [ ".iso" ".ISO" ".gcm" ".GCM" ".ciso" ".CISO" "rvz" ]; fileTypes = [
".iso"
".ISO"
".gcm"
".GCM"
".ciso"
".CISO"
"rvz"
];
extraArgs = "-b -e \"\${filePath}\""; extraArgs = "-b -e \"\${filePath}\"";
}; };
pcsx2.enable = true; pcsx2.enable = true;
mgba.enable = true; mgba.enable = true;
"Non-SRM Shortcuts" = { "Non-SRM Shortcuts" = {
enable = true; enable = true;
parserType = "Non-SRM Shortcuts"; parserType = "Non-SRM Shortcuts";
@@ -68,6 +78,6 @@ in
mgba mgba
prismlauncher prismlauncher
ryujinx-greemdev ryujinx-greemdev
vmware-horizon-client omnissa-horizon-client
]; ];
} }

View File

@@ -1,15 +1,26 @@
{ pkgs, namespace, ... }: { pkgs, ... }:
let
shellAliases = {
update-boot = "sudo nixos-rebuild boot --max-jobs 10 --build-host admin@10.0.1.3";
update-switch = "sudo nixos-rebuild switch --max-jobs 10 --build-host admin@10.0.1.3";
update-flake = "nix flake update desktop-nixpkgs desktop-chaotic desktop-home-manager desktop-impermanence desktop-lanzaboote desktop-nixos-hardware desktop-sops-nix desktop-steam-rom-manager --flake /etc/nixos";
update-nas = "nixos-rebuild switch --use-remote-sudo --target-host admin@10.0.1.3 --build-host admin@10.0.1.3 --flake ~/nix-config#jallen-nas";
};
in
{ {
home.username = "matt"; home.username = "matt";
mjallen = {
sops = {
enable = true;
};
shell-aliases = {
enable = true;
flakeInputs = [
"desktop-nixpkgs"
"desktop-chaotic"
"desktop-home-manager"
"desktop-impermanence"
"desktop-lanzaboote"
"desktop-nixos-hardware"
"desktop-sops-nix"
"desktop-steam-rom-manager"
];
};
};
services = { services = {
remmina = { remmina = {
enable = true; enable = true;
@@ -19,8 +30,6 @@ in
programs = { programs = {
password-store.enable = true; password-store.enable = true;
zsh.shellAliases = shellAliases;
}; };
home.packages = with pkgs; [ home.packages = with pkgs; [
@@ -29,7 +38,7 @@ in
discord discord
distrobox distrobox
heroic heroic
stable.vmware-horizon-client omnissa-horizon-client
jq jq
lutris lutris
lzip lzip
@@ -40,6 +49,7 @@ in
protontricks protontricks
protonvpn-gui protonvpn-gui
python3 python3
runelite
smile smile
unigine-heaven unigine-heaven
via via

View File

@@ -14,4 +14,4 @@ in
programs = { programs = {
zsh.shellAliases = shellAliases; zsh.shellAliases = shellAliases;
}; };
} }

View File

@@ -1,4 +1,9 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
let let
cfg = config.mjallen.desktop.gnome; cfg = config.mjallen.desktop.gnome;
in in
@@ -66,4 +71,4 @@ in
}; };
}; };
}; };
} }

View File

@@ -4,4 +4,4 @@ with lib;
options.mjallen.desktop.gnome = { options.mjallen.desktop.gnome = {
enable = mkEnableOption "enable gnome settings"; enable = mkEnableOption "enable gnome settings";
}; };
} }

View File

@@ -1,4 +1,9 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
with lib; with lib;
let let
cfg = config.mjallen.desktop.hyprland; cfg = config.mjallen.desktop.hyprland;
@@ -6,7 +11,7 @@ let
in in
{ {
imports = [ imports = [
./options.nix ./options.nix
./packages.nix ./packages.nix
./theme.nix ./theme.nix
./variables.nix ./variables.nix
@@ -21,7 +26,7 @@ in
programs = { programs = {
vscode.profiles.default.userSettings."window"."titleBarStyle" = "custom"; vscode.profiles.default.userSettings."window"."titleBarStyle" = "custom";
}; };
wayland.windowManager.hyprland = { wayland.windowManager.hyprland = {
enable = true; enable = true;
xwayland.enable = true; xwayland.enable = true;
@@ -151,7 +156,7 @@ in
render = { render = {
cm_fs_passthrough = 1; cm_fs_passthrough = 1;
}; };
misc = { misc = {
vrr = 1; vrr = 1;
}; };
@@ -231,7 +236,7 @@ in
"float, class:(.*nm-connection-editor.*)" "float, class:(.*nm-connection-editor.*)"
"move onscreen cursor 0% 0%, class:(.*nm-connection-editor.*)" "move onscreen cursor 0% 0%, class:(.*nm-connection-editor.*)"
"float, title:(Media viewer)" "float, title:(Media viewer)"
"float, class:(it.mijorus.smile),title:(Smile)" "float, class:(it.mijorus.smile),title:(Smile)"
"float, class:(.blueman-manager-wrapped)$,title:(Bluetooth Devices)" "float, class:(.blueman-manager-wrapped)$,title:(Bluetooth Devices)"
@@ -265,7 +270,7 @@ in
# this tag will set the below options to the vdi window # this tag will set the below options to the vdi window
# this will have it auto open as a 2160x7680 window # this will have it auto open as a 2160x7680 window
# and makes multi-monitor work # and makes multi-monitor work
"tag +horizonrdp, class:(.*[Vv][Mm]ware-view),title:(USPS Next VDI)" "tag +horizonrdp, class:(.*[Hh]orizon-client),title:(USPS Next VDI)"
"noanim, tag:horizonrdp" "noanim, tag:horizonrdp"
"noblur, tag:horizonrdp" "noblur, tag:horizonrdp"
@@ -282,12 +287,13 @@ in
# "size 2160 7680, tag:horizonrdp" # "size 2160 7680, tag:horizonrdp"
# "move onscreen 0 0, tag:horizonrdp" # "move onscreen 0 0, tag:horizonrdp"
# float the vmware window cause its annoying to use in fullscreen # float the vmware window cause its annoying to use in fullscreen
"float, class:(.*[Vv][Mm]ware-view),title:([Vv][Mm]ware [Hh]orizon [Cc]lient)" "float, class:(.*[Hh]orizon-client),title:([Oo]mnissa [Hh]orizon [Cc]lient)"
"tag +waydroid, class:([Ww]aydroid.*)" "tag +waydroid, class:([Ww]aydroid.*)"
"float, tag:waydroid" "float, tag:waydroid"
"pin, tag:waydroid" "pin, tag:waydroid"
] ++ cfg.windowRule; ]
++ cfg.windowRule;
plugin = { plugin = {
touch_gestures = { touch_gestures = {
@@ -326,7 +332,7 @@ in
# NOT recommended as it crashed a few times, once it's stabilized I'll make it the default # NOT recommended as it crashed a few times, once it's stabilized I'll make it the default
send_cancel = "0"; send_cancel = "0";
}; };
hyprgrass-bind = [ hyprgrass-bind = [
# swipe left from right edge # swipe left from right edge
", edge:r:l, workspace, +1" ", edge:r:l, workspace, +1"
@@ -345,7 +351,7 @@ in
", swipe:3:ld, exec, foot" ", swipe:3:ld, exec, foot"
# tap with 3 fingers # tap with 3 fingers
", tap:3, exec, foot" ", tap:3, exec, foot"
# longpress can trigger mouse binds: # longpress can trigger mouse binds:
", longpress:2, movewindow" ", longpress:2, movewindow"
@@ -397,7 +403,8 @@ in
exec-once = xhost +SI:localuser:root exec-once = xhost +SI:localuser:root
exec-once = nwg-look -a exec-once = nwg-look -a
exec-once = nwg-dock-hyprland -d exec-once = nwg-dock-hyprland -d
'' + cfg.extraConfig or ''''; ''
+ cfg.extraConfig or '''';
}; };
}; };
} }

View File

@@ -45,31 +45,31 @@ with lib;
wallpaper = mkOption { wallpaper = mkOption {
type = with types; listOf str; type = with types; listOf str;
default = []; default = [ ];
description = "list of hyprland wallpaper configs"; description = "list of hyprland wallpaper configs";
}; };
monitor = mkOption { monitor = mkOption {
type = with types; listOf str; type = with types; listOf str;
default = []; default = [ ];
description = "list of hyprland monitor configs"; description = "list of hyprland monitor configs";
}; };
monitorv2 = mkOption { monitorv2 = mkOption {
type = with types; listOf str; type = with types; listOf str;
default = []; default = [ ];
description = "list of hyprland monitorv2 configs"; description = "list of hyprland monitorv2 configs";
}; };
workspace = mkOption { workspace = mkOption {
type = with types; listOf str; type = with types; listOf str;
default = []; default = [ ];
description = "list of hyprland workspace definitions"; description = "list of hyprland workspace definitions";
}; };
windowRule = mkOption { windowRule = mkOption {
type = with types; listOf str; type = with types; listOf str;
default = []; default = [ ];
description = "list of hyprland window rules"; description = "list of hyprland window rules";
}; };
@@ -79,12 +79,12 @@ with lib;
description = "any extra options"; description = "any extra options";
}; };
iconThemeName = mkOption { iconThemeName = mkOption {
type = types.str; type = types.str;
default = "Colloid-Dark"; default = "Colloid-Dark";
}; };
gtkThemeName = mkOption { gtkThemeName = mkOption {
type = types.str; type = types.str;
default = "Colloid-Dark"; default = "Colloid-Dark";
}; };
@@ -92,14 +92,38 @@ with lib;
defaultApps = mkOption { defaultApps = mkOption {
type = types.submodule { type = types.submodule {
options = { options = {
browser = mkOption { type = types.package; default = pkgs.firefox; }; browser = mkOption {
editor = mkOption { type = types.package; default = pkgs.micro; }; type = types.package;
fileExplorer = mkOption { type = types.package; default = pkgs.nemo; }; default = pkgs.firefox;
visual = mkOption { type = types.package; default = pkgs.vscodium; }; };
terminal = mkOption { type = types.package; default = pkgs.kitty; }; editor = mkOption {
office = mkOption { type = types.package; default = pkgs.onlyoffice-bin_latest; }; type = types.package;
video = mkOption { type = types.package; default = pkgs.vlc; }; default = pkgs.micro;
imageViewer = mkOption { type = types.package; default = pkgs.nomacs; }; };
fileExplorer = mkOption {
type = types.package;
default = pkgs.nemo;
};
visual = mkOption {
type = types.package;
default = pkgs.vscodium;
};
terminal = mkOption {
type = types.package;
default = pkgs.kitty;
};
office = mkOption {
type = types.package;
default = pkgs.onlyoffice-bin_latest;
};
video = mkOption {
type = types.package;
default = pkgs.vlc;
};
imageViewer = mkOption {
type = types.package;
default = pkgs.nomacs;
};
}; };
}; };
description = "Default applications used across the system."; description = "Default applications used across the system.";
@@ -108,16 +132,16 @@ with lib;
hyprIdle = { hyprIdle = {
lockScreenTimer = mkOption { lockScreenTimer = mkOption {
type = with types; int; type = with types; int;
default = 5; default = 300;
}; };
screenOffTimer = mkOption { screenOffTimer = mkOption {
type = with types; int; type = with types; int;
default = 15; default = 900;
}; };
suspendTimer = mkOption { suspendTimer = mkOption {
type = with types; int; type = with types; int;
default = 30; default = 1800;
}; };
}; };
}; };
} }

View File

@@ -1,4 +1,9 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
with lib; with lib;
let let
cfg = config.mjallen.desktop.hyprland; cfg = config.mjallen.desktop.hyprland;
@@ -62,6 +67,8 @@ in
xorg.xhost xorg.xhost
xsettingsd xsettingsd
xwayland xwayland
pkgs.mjallen.pipewire-python
]; ];
}; };
} }

View File

@@ -1,4 +1,9 @@
{ config, lib, namespace, ... }: {
config,
lib,
namespace,
...
}:
let let
cfg = config.${namespace}.desktop.hyprland; cfg = config.${namespace}.desktop.hyprland;
in in
@@ -7,7 +12,7 @@ in
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
services.hypridle = { services.hypridle = {
enable = false; enable = true;
settings = { settings = {
general = { general = {
before_sleep_cmd = "loginctl lock-session"; # lock before suspend. before_sleep_cmd = "loginctl lock-session"; # lock before suspend.

View File

@@ -1,4 +1,9 @@
{ config, lib, namespace, ... }: {
config,
lib,
namespace,
...
}:
let let
cfg = config.${namespace}.desktop.hyprland; cfg = config.${namespace}.desktop.hyprland;
in in
@@ -7,41 +12,41 @@ in
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
programs.hyprlock = { programs.hyprlock = {
enable = true; enable = true;
settings = { settings = {
background = [ background = [
{ {
monitor = ""; monitor = "";
path = cfg.wallpaper; # supports png, jpg, webp (no animations, though) path = cfg.wallpaper; # supports png, jpg, webp (no animations, though)
color = "rgba(25, 20, 20, 1.0)"; color = "rgba(25, 20, 20, 1.0)";
# all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations # all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations
blur_passes = "3"; # 0 disables blurring blur_passes = "3"; # 0 disables blurring
blur_size = "7"; blur_size = "7";
noise = "0.0117"; noise = "0.0117";
contrast = "0.8916"; contrast = "0.8916";
brightness = "0.8172"; brightness = "0.8172";
vibrancy = "0.1696"; vibrancy = "0.1696";
vibrancy_darkness = "0.0"; vibrancy_darkness = "0.0";
} }
]; ];
input-field = [ input-field = [
{ {
size = "200, 50"; size = "200, 50";
position = "0, -80"; position = "0, -80";
monitor = cfg.primaryDisplay; monitor = cfg.primaryDisplay;
dots_center = true; dots_center = true;
fade_on_empty = true; fade_on_empty = true;
font_color = "rgb(202, 211, 245)"; font_color = "rgb(202, 211, 245)";
inner_color = "rgb(91, 96, 120)"; inner_color = "rgb(91, 96, 120)";
outer_color = "rgb(24, 25, 38)"; outer_color = "rgb(24, 25, 38)";
bothlock_color = -1; bothlock_color = -1;
outline_thickness = 5; outline_thickness = 5;
placeholder_text = ''<span foreground="##cad3f5">Password...</span>''; placeholder_text = ''<span foreground="##cad3f5">Password...</span>'';
shadow_passes = 2; shadow_passes = 2;
} }
]; ];
};
}; };
};
}; };
} }

View File

@@ -1,4 +1,9 @@
{ config, lib, namespace, ... }: {
config,
lib,
namespace,
...
}:
let let
cfg = config.${namespace}.desktop.hyprland; cfg = config.${namespace}.desktop.hyprland;
in in
@@ -15,4 +20,4 @@ in
}; };
}; };
}; };
} }

View File

@@ -1,12 +1,17 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
with lib; with lib;
let let
cfg = config.mjallen.desktop.hyprland; cfg = config.mjallen.desktop.hyprland;
themeSize = "compact"; # [ "standard" "compact" ] themeSize = "compact"; # [ "standard" "compact" ]
themeAccent = "all"; # [ "default" "purple" "pink" "red" "orange" "yellow" "green" "teal" "grey" "all" ] themeAccent = "all"; # [ "default" "purple" "pink" "red" "orange" "yellow" "green" "teal" "grey" "all" ]
themeVariant = "nord"; # [ "nord" "dracula" "gruvbox" "everforest" "catppuccin" "all" "black" "rimless" "normal" "float" ] themeVariant = "nord"; # [ "nord" "dracula" "gruvbox" "everforest" "catppuccin" "all" "black" "rimless" "normal" "float" ]
themeColor = "dark"; # [ "standard" "light" "dark" ] themeColor = "dark"; # [ "standard" "light" "dark" ]
iconThemeVariant = "all"; # [ "default" "purple" "pink" "red" "orange" "yellow" "green" "teal" "grey" "all" ] iconThemeVariant = "all"; # [ "default" "purple" "pink" "red" "orange" "yellow" "green" "teal" "grey" "all" ]
iconScheme = "nord"; # [ "default" "nord" "dracula" "gruvbox" "everforest" "catppuccin" "all" ] iconScheme = "nord"; # [ "default" "nord" "dracula" "gruvbox" "everforest" "catppuccin" "all" ]
@@ -95,4 +100,4 @@ in
}; };
}; };
}; };
} }

View File

@@ -6,34 +6,34 @@ in
{ {
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.sessionVariables = { home.sessionVariables = {
BROWSER = "${cfg.defaultApps.browser.pname}"; BROWSER = "${cfg.defaultApps.browser.pname}";
CLUTTER_BACKEND = "wayland"; CLUTTER_BACKEND = "wayland";
EDITOR = "${cfg.defaultApps.editor.pname}"; EDITOR = "${cfg.defaultApps.editor.pname}";
VISUAL = "${cfg.defaultApps.visual.pname}"; VISUAL = "${cfg.defaultApps.visual.pname}";
ICON_THEME = cfg.iconThemeName; ICON_THEME = cfg.iconThemeName;
GTK_CSD = "0"; GTK_CSD = "0";
GTK_THEME = cfg.gtkThemeName; GTK_THEME = cfg.gtkThemeName;
GTK_USE_PORTAL = "1"; GTK_USE_PORTAL = "1";
HYPRCURSOR_THEME = config.home.pointerCursor.name; HYPRCURSOR_THEME = config.home.pointerCursor.name;
HYPRCURSOR_SIZE = config.home.pointerCursor.size; HYPRCURSOR_SIZE = config.home.pointerCursor.size;
MOZ_ENABLE_WAYLAND = "1"; MOZ_ENABLE_WAYLAND = "1";
NIXOS_OZONE_WL = "1"; NIXOS_OZONE_WL = "1";
NIXOS_XDG_OPEN_USE_PORTAL = "1"; NIXOS_XDG_OPEN_USE_PORTAL = "1";
QT_AUTO_SCREEN_SCALE_FACTOR = "1"; QT_AUTO_SCREEN_SCALE_FACTOR = "1";
QT_QPA_PLATFORM = "wayland-egl"; QT_QPA_PLATFORM = "wayland-egl";
QT_QPA_PLATFORMTHEME = "gtk3"; QT_QPA_PLATFORMTHEME = "gtk3";
QT_SCALE_FACTOR = "1"; QT_SCALE_FACTOR = "1";
QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
SDL_VIDEODRIVER = "wayland"; SDL_VIDEODRIVER = "wayland";
TERMINAL = "${cfg.defaultApps.terminal.pname}"; TERMINAL = "${cfg.defaultApps.terminal.pname}";
XCURSOR_THEME = config.home.pointerCursor.name; XCURSOR_THEME = config.home.pointerCursor.name;
XCURSOR_SIZE = config.home.pointerCursor.size; XCURSOR_SIZE = config.home.pointerCursor.size;
XDG_CACHE_HOME = "\${HOME}/.cache"; XDG_CACHE_HOME = "\${HOME}/.cache";
XDG_CONFIG_HOME = "\${HOME}/.config"; XDG_CONFIG_HOME = "\${HOME}/.config";
XDG_CURRENT_DESKTOP = "Hyprland"; XDG_CURRENT_DESKTOP = "Hyprland";
XDG_DATA_HOME = "\${HOME}/.local/share"; XDG_DATA_HOME = "\${HOME}/.local/share";
XDG_SESSION_DESKTOP = "Hyprland"; XDG_SESSION_DESKTOP = "Hyprland";
XDG_SESSION_TYPE = "wayland"; XDG_SESSION_TYPE = "wayland";
}; };
}; };
} }

View File

@@ -59,4 +59,4 @@
border-radius: 1rem 0rem 0rem 1rem; border-radius: 1rem 0rem 0rem 1rem;
margin-left: 0.5rem; margin-left: 0.5rem;
''; '';
} }

View File

@@ -1,4 +1,9 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
{ {
home = { home = {
enableNixpkgsReleaseCheck = lib.mkDefault false; enableNixpkgsReleaseCheck = lib.mkDefault false;
@@ -47,10 +52,14 @@
nh = { nh = {
enable = true; enable = true;
flake = "/etc/nixos"; flake = "/etc/nixos";
clean = {
enable = true;
extraArgs = "--keep 5";
};
}; };
micro = { micro = {
enable = true; enable = lib.mkDefault true;
settings = { settings = {
autoindent = true; autoindent = true;
autosu = true; autosu = true;
@@ -61,7 +70,7 @@
}; };
tmux = { tmux = {
enable = true; enable = lib.mkDefault true;
terminal = "screen-256color"; terminal = "screen-256color";
sensibleOnTop = true; sensibleOnTop = true;
focusEvents = true; focusEvents = true;
@@ -104,8 +113,8 @@
nextcloud-client.enable = lib.mkDefault true; nextcloud-client.enable = lib.mkDefault true;
pass-secret-service.enable = lib.mkDefault true; pass-secret-service.enable = lib.mkDefault true;
kdeconnect = { kdeconnect = {
enable = true; enable = lib.mkDefault true;
indicator = true; indicator = lib.mkDefault true;
}; };
}; };
} }

View File

@@ -2,7 +2,7 @@
with lib; with lib;
let let
cfg = config.mjallen.programs.btop; cfg = config.mjallen.programs.btop;
nord = import ../../desktop/theme/nord.nix; nord = import (lib.snowfall.fs.get-file "modules/home/desktop/theme/nord.nix");
in in
{ {
imports = [ ./options.nix ]; imports = [ ./options.nix ];

View File

@@ -4,4 +4,4 @@ with lib;
options.mjallen.programs.btop = { options.mjallen.programs.btop = {
enable = mkEnableOption "enable btop"; enable = mkEnableOption "enable btop";
}; };
} }

View File

@@ -1,21 +1,16 @@
{ config, lib, pkgs, system, ... }: {
config,
pkgs,
system,
namespace,
...
}:
let let
isArm = "aarch64-linux" == system; isArm = "aarch64-linux" == system;
open-remote-ssh = pkgs.vscode-utils.buildVscodeExtension {
pname = "open-remote-ssh";
version = "0.0.49";
vscodeExtPublisher = "jeanp413";
vscodeExtName = "open-remote-ssh";
vscodeExtUniqueId = "jeanp413.open-remote-ssh";
src = pkgs.fetchurl {
url = "https://open-vsx.org/api/jeanp413/open-remote-ssh/0.0.49/file/jeanp413.open-remote-ssh-0.0.49.vsix";
sha256 = "sha256-QfJnAAx+kO2iJ1EzWoO5HLogJKg3RiC3hg1/u2Jm6t4";
name = "open-remote-ssh.zip";
};
};
x86_only = with pkgs; [ x86_only = with pkgs; [
vscode-extensions.redhat.vscode-xml vscode-extensions.redhat.vscode-xml
]; ];
open-remote-ssh = pkgs.${namespace}.open-remote-ssh;
in in
{ {
programs = { programs = {
@@ -27,44 +22,48 @@ in
default = { default = {
enableUpdateCheck = false; enableUpdateCheck = false;
enableExtensionUpdateCheck = false; enableExtensionUpdateCheck = false;
extensions = with pkgs; [ extensions =
vscode-extensions.arrterian.nix-env-selector with pkgs;
vscode-extensions.bbenoist.nix [
vscode-extensions.brettm12345.nixfmt-vscode vscode-extensions.arrterian.nix-env-selector
vscode-extensions.cweijan.vscode-database-client2 vscode-extensions.bbenoist.nix
vscode-extensions.dendron.dendron-markdown-preview-enhanced vscode-extensions.brettm12345.nixfmt-vscode
vscode-extensions.jnoortheen.nix-ide vscode-extensions.cweijan.vscode-database-client2
vscode-extensions.mkhl.direnv vscode-extensions.dendron.dendron-markdown-preview-enhanced
vscode-extensions.ms-python.debugpy vscode-extensions.jnoortheen.nix-ide
vscode-extensions.ms-python.pylint vscode-extensions.mkhl.direnv
vscode-extensions.ms-python.python vscode-extensions.ms-python.debugpy
# vscode-extensions.ms-python.vscode-pylance vscode-extensions.ms-python.pylint
vscode-extensions.redhat.vscode-yaml vscode-extensions.ms-python.python
vscode-extensions.yy0931.vscode-sqlite3-editor # vscode-extensions.ms-python.vscode-pylance
vscode-extensions.redhat.vscode-yaml
vscode-extensions.yy0931.vscode-sqlite3-editor
# open-remote-ssh # open-remote-ssh
# nix-vscode-extensions.open-vsx.jeanp413.open-remote-ssh # nix-vscode-extensions.open-vsx.jeanp413.open-remote-ssh
# open-vsx.jeanp413.open-remote-ssh open-remote-ssh
] ++ ( if !isArm then x86_only else [ ] ) ++ pkgs.vscode-utils.extensionsFromVscodeMarketplace [ ]
{ ++ (if !isArm then x86_only else [ ])
name = "copilot-mcp"; ++ pkgs.vscode-utils.extensionsFromVscodeMarketplace [
publisher = "automatalabs"; {
version = "0.0.49"; name = "copilot-mcp";
sha256 = "sha256-+G2OQl5SCN7bh7MzGdYiRclIZefBE7lWnGg1kNpCvnA="; publisher = "automatalabs";
} version = "0.0.49";
{ sha256 = "sha256-+G2OQl5SCN7bh7MzGdYiRclIZefBE7lWnGg1kNpCvnA=";
name = "mcp-server-runner"; }
publisher = "zebradev"; {
version = "0.1.0"; name = "mcp-server-runner";
sha256 = "sha256-StydVt3VzQUSS/pYp76jnIwtZlEj8gWAGzOARs93J+E="; publisher = "zebradev";
} version = "0.1.0";
{ sha256 = "sha256-StydVt3VzQUSS/pYp76jnIwtZlEj8gWAGzOARs93J+E=";
name = "claude-dev"; }
publisher = "saoudrizwan"; {
version = "3.17.9"; name = "claude-dev";
sha256 = "sha256-y3bFtMe5vZrO3DFb31KDvkzjD2jM76wK89mKhgJXC70="; publisher = "saoudrizwan";
} version = "3.17.9";
]; sha256 = "sha256-y3bFtMe5vZrO3DFb31KDvkzjD2jM76wK89mKhgJXC70=";
}
];
userSettings = { userSettings = {
@@ -79,7 +78,7 @@ in
"confirmDelete" = false; "confirmDelete" = false;
"confirmDragAndDrop" = false; "confirmDragAndDrop" = false;
}; };
"git" = { "git" = {
"confirmSync" = false; "confirmSync" = false;
"enableSmartCommit" = true; "enableSmartCommit" = true;
@@ -110,10 +109,12 @@ in
# You can write arbitary Nix expressions here, to produce valid "options" declaration result. # You can write arbitary Nix expressions here, to produce valid "options" declaration result.
# Tip: for flake-based configuration, utilize `builtins.getFlake` # Tip: for flake-based configuration, utilize `builtins.getFlake`
"nixos" = { "nixos" = {
"expr" = "(builtins.getFlake \"${config.home.homeDirectory}/nix-config\").nixosConfigurations.<name>.options"; "expr" =
"(builtins.getFlake \"${config.home.homeDirectory}/nix-config\").nixosConfigurations.<name>.options";
}; };
"home-manager" = { "home-manager" = {
"expr" = "(builtins.getFlake \"${config.home.homeDirectory}/nix-config\").homeConfigurations.<name>.options"; "expr" =
"(builtins.getFlake \"${config.home.homeDirectory}/nix-config\").homeConfigurations.<name>.options";
}; };
# # Tip: use ${workspaceFolder} variable to define path # # Tip: use ${workspaceFolder} variable to define path
# "nix-darwin" = { # "nix-darwin" = {
@@ -139,6 +140,8 @@ in
"*.db" = "default"; "*.db" = "default";
}; };
}; };
"enable-proposed-api" = [ "jeanp413.open-remote-ssh" ];
}; };
}; };
}; };
@@ -149,4 +152,4 @@ in
enableZshIntegration = true; enableZshIntegration = true;
}; };
}; };
} }

View File

@@ -18,4 +18,4 @@ in
userEmail = "matt.l.jallen@gmail.com"; userEmail = "matt.l.jallen@gmail.com";
aliases = gitAliases; aliases = gitAliases;
}; };
} }

View File

@@ -2,7 +2,7 @@
with lib; with lib;
let let
cfg = config.mjallen.programs.kitty; cfg = config.mjallen.programs.kitty;
nord = import ../../desktop/theme/nord.nix; nord = import (lib.snowfall.fs.get-file "modules/home/desktop/theme/nord.nix");
in in
{ {
imports = [ ./options.nix ]; imports = [ ./options.nix ];
@@ -29,33 +29,33 @@ in
background_opacity = "0.85"; background_opacity = "0.85";
# The basic colors # The basic colors
foreground = nord.snowStorm.nord6; foreground = nord.snowStorm.nord6;
background = nord.polarNight.nord0; background = nord.polarNight.nord0;
selection_foreground = nord.polarNight.nord0; selection_foreground = nord.polarNight.nord0;
selection_background = nord.aurora.nord15; selection_background = nord.aurora.nord15;
# Cursor colors # Cursor colors
cursor = nord.aurora.nord15; cursor = nord.aurora.nord15;
cursor_text_color = nord.polarNight.nord0; cursor_text_color = nord.polarNight.nord0;
# URL underline color when hovering with mouse # URL underline color when hovering with mouse
url_color = nord.aurora.nord15; url_color = nord.aurora.nord15;
# Kitty window border colors # Kitty window border colors
active_border_color = nord.frost.nord10; active_border_color = nord.frost.nord10;
inactive_border_color = nord.polarNight.nord1; inactive_border_color = nord.polarNight.nord1;
bell_border_color = nord.aurora.nord13; bell_border_color = nord.aurora.nord13;
# OS Window titlebar colors # OS Window titlebar colors
wayland_titlebar_color = nord.polarNight.nord0; wayland_titlebar_color = nord.polarNight.nord0;
macos_titlebar_color = nord.polarNight.nord0; macos_titlebar_color = nord.polarNight.nord0;
# Tab bar colors # Tab bar colors
active_tab_foreground = nord.polarNight.nord3; active_tab_foreground = nord.polarNight.nord3;
active_tab_background = nord.aurora.nord15; active_tab_background = nord.aurora.nord15;
inactive_tab_foreground = nord.snowStorm.nord6; inactive_tab_foreground = nord.snowStorm.nord6;
inactive_tab_background = nord.polarNight.nord1; inactive_tab_background = nord.polarNight.nord1;
tab_bar_background = nord.polarNight.nord3; tab_bar_background = nord.polarNight.nord3;
# Colors for marks (marked text in the terminal) # Colors for marks (marked text in the terminal)
mark1_foreground = nord.polarNight.nord0; mark1_foreground = nord.polarNight.nord0;
@@ -86,11 +86,11 @@ in
color11 = nord.aurora.nord13; color11 = nord.aurora.nord13;
# blue # blue
color4 = nord.frost.nord10; color4 = nord.frost.nord10;
color12 = nord.frost.nord10; color12 = nord.frost.nord10;
# magenta # magenta
color5 = nord.aurora.nord15; color5 = nord.aurora.nord15;
color13 = nord.aurora.nord15; color13 = nord.aurora.nord15;
# cyan # cyan
@@ -98,7 +98,7 @@ in
color14 = nord.frost.nord8; color14 = nord.frost.nord8;
# white # white
color7 = nord.snowStorm.nord5; color7 = nord.snowStorm.nord5;
color15 = nord.snowStorm.nord4; color15 = nord.snowStorm.nord4;
}; };
}; };

View File

@@ -15,13 +15,13 @@ with lib;
}; };
size = mkOption { size = mkOption {
type = with types; int; type = with types; int;
default = 8; default = 12;
}; };
}; };
theme = mkOption { theme = mkOption {
type = types.attrs; type = types.attrs;
default = import ../../desktop/theme/nord.nix; default = import (lib.snowfall.fs.get-file "modules/home/desktop/theme/nord.nix");
}; };
}; };
} }

View File

@@ -36,7 +36,8 @@
"browser.newtabpage.activity-stream.topSitesRows" = 3; # Set number of rows for top sites on new tab page "browser.newtabpage.activity-stream.topSitesRows" = 3; # Set number of rows for top sites on new tab page
"layout.css.light-dark.enabled" = true; # Enable light/dark theme support "layout.css.light-dark.enabled" = true; # Enable light/dark theme support
"extensions.activeThemeID" = "default-theme@mozilla.org"; # Set active theme "extensions.activeThemeID" = "default-theme@mozilla.org"; # Set active theme
"extensions.webextensions.uuids" = "{\"formautofill@mozilla.org\" =\"851c83b7-26d5-449c-8cc9-d8951a0ce78d\",\"pictureinpicture@mozilla.org\" =\"42fa2650-5134-4bef-bafa-b73f9ae51bad\",\"screenshots@mozilla.org\" =\"efd2b692-43c4-433a-aea5-0cb79f8312d4\",\"webcompat-reporter@mozilla.org\" =\"c43a6be2-fb56-4253-b384-ce8e09a89999\",\"webcompat@mozilla.org\" =\"e25fd1bb-7c53-413f-9528-bb922c322a56\",\"default-theme@mozilla.org\" =\"610b67c3-9145-46f7-814f-d8ee2cc8edff\",\"addons-search-detection@mozilla.com\:\"caedb3ca-5cf5-4e23-a251-d742f23e6fc8\",\"uBlock0@raymondhill.net\" =\"7e7d9fd9-12bf-42d3-9c7c-9ffd05420ec7\",\"78272b6fa58f4a1abaac99321d503a20@proton.me\" =\"7242a067-06d8-430b-94a3-00d264cdd57b\",\"addon@darkreader.org\" =\"2f02b112-6acd-4bdc-af2c-1432eb527339\",\"jid1-xUfzOsOFlzSOXg@jetpack\" =\"d0c72046-9903-4118-8160-a028840bf928\",\"chrome-gnome-shell@gnome.org\" =\"a1ab53e6-b765-4f25-8349-383cc04682a0\",\"user-agent-switcher@ninetailed.ninja\" =\"259d07cc-bb32-4ed5-b90f-6d73abdeb7bb\",\"firefoxdav@icloud.com\" =\"110e6e2c-18f8-461d-9f26-b8f04482b6f1\",\"ciscowebexstart1@cisco.com\" =\"a4062240-e73a-4353-bddb-d608d84881f7\",\"{a6c4a591-f1b2-4f03-b3ff-767e5bedf4e7}\" =\"9164e437-812b-4a07-8dfd-2fd73b39329b\",\"{036a55b4-5e72-4d05-a06c-cba2dfcc134a}\" =\"648fc678-a6fb-47cd-9792-fb9520678c17\",\"{446900e4-71c2-419f-a6a7-df9c091e268b}\" =\"f0b43422-070e-466e-85c9-6543f209f075\",\"jid1-MnnxcxisBPnSXQ@jetpack\" =\"4c448202-c843-4cae-b5c3-d11f2da58fa3\",\"soundfixer@unrelenting.technology\" =\"59b35eb8-1c85-4919-a905-80d120993ddc\",\"floccus@handmadeideas.org\" =\"8ad2956c-8091-41af-a689-7d2108f5958d\",\"{79b9dbcf-cc5a-4cda-89ef-c4ab097eb074}\" =\"c2a223a7-32e0-4726-9f20-17236702b1f5\",\"linkgopher@oooninja.com\" =\"a257858c-0dce-415b-b123-6222876cf843\"}"; "extensions.webextensions.uuids" =
"{\"formautofill@mozilla.org\" =\"851c83b7-26d5-449c-8cc9-d8951a0ce78d\",\"pictureinpicture@mozilla.org\" =\"42fa2650-5134-4bef-bafa-b73f9ae51bad\",\"screenshots@mozilla.org\" =\"efd2b692-43c4-433a-aea5-0cb79f8312d4\",\"webcompat-reporter@mozilla.org\" =\"c43a6be2-fb56-4253-b384-ce8e09a89999\",\"webcompat@mozilla.org\" =\"e25fd1bb-7c53-413f-9528-bb922c322a56\",\"default-theme@mozilla.org\" =\"610b67c3-9145-46f7-814f-d8ee2cc8edff\",\"addons-search-detection@mozilla.com\:\"caedb3ca-5cf5-4e23-a251-d742f23e6fc8\",\"uBlock0@raymondhill.net\" =\"7e7d9fd9-12bf-42d3-9c7c-9ffd05420ec7\",\"78272b6fa58f4a1abaac99321d503a20@proton.me\" =\"7242a067-06d8-430b-94a3-00d264cdd57b\",\"addon@darkreader.org\" =\"2f02b112-6acd-4bdc-af2c-1432eb527339\",\"jid1-xUfzOsOFlzSOXg@jetpack\" =\"d0c72046-9903-4118-8160-a028840bf928\",\"chrome-gnome-shell@gnome.org\" =\"a1ab53e6-b765-4f25-8349-383cc04682a0\",\"user-agent-switcher@ninetailed.ninja\" =\"259d07cc-bb32-4ed5-b90f-6d73abdeb7bb\",\"firefoxdav@icloud.com\" =\"110e6e2c-18f8-461d-9f26-b8f04482b6f1\",\"ciscowebexstart1@cisco.com\" =\"a4062240-e73a-4353-bddb-d608d84881f7\",\"{a6c4a591-f1b2-4f03-b3ff-767e5bedf4e7}\" =\"9164e437-812b-4a07-8dfd-2fd73b39329b\",\"{036a55b4-5e72-4d05-a06c-cba2dfcc134a}\" =\"648fc678-a6fb-47cd-9792-fb9520678c17\",\"{446900e4-71c2-419f-a6a7-df9c091e268b}\" =\"f0b43422-070e-466e-85c9-6543f209f075\",\"jid1-MnnxcxisBPnSXQ@jetpack\" =\"4c448202-c843-4cae-b5c3-d11f2da58fa3\",\"soundfixer@unrelenting.technology\" =\"59b35eb8-1c85-4919-a905-80d120993ddc\",\"floccus@handmadeideas.org\" =\"8ad2956c-8091-41af-a689-7d2108f5958d\",\"{79b9dbcf-cc5a-4cda-89ef-c4ab097eb074}\" =\"c2a223a7-32e0-4726-9f20-17236702b1f5\",\"linkgopher@oooninja.com\" =\"a257858c-0dce-415b-b123-6222876cf843\"}";
}; };
}; };
} }

View File

@@ -2,7 +2,7 @@
with lib; with lib;
let let
cfg = config.mjallen.programs.mako; cfg = config.mjallen.programs.mako;
nord = import ../../desktop/theme/nord.nix; nord = import (lib.snowfall.fs.get-file "modules/home/desktop/theme/nord.nix");
in in
{ {
imports = [ ./options.nix ]; imports = [ ./options.nix ];

View File

@@ -9,4 +9,4 @@ with lib;
default = "DejaVu Sans"; default = "DejaVu Sans";
}; };
}; };
} }

View File

@@ -1,15 +1,20 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
with lib; with lib;
let let
cfg = config.mjallen.programs.nwg-dock; cfg = config.mjallen.programs.nwg-dock;
nord = import ../../desktop/theme/nord.nix; nord = import (lib.snowfall.fs.get-file "modules/home/desktop/theme/nord.nix");
in in
{ {
imports = [ ./options.nix ]; imports = [ ./options.nix ];
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = with pkgs; [ nwg-dock-hyprland ]; home.packages = with pkgs; [ nwg-dock-hyprland ];
home.file = { home.file = {
".config/nwg-dock-hyprland/drawer.css".text = '' ".config/nwg-dock-hyprland/drawer.css".text = ''
window { window {

View File

@@ -4,4 +4,4 @@ with lib;
options.mjallen.programs.nwg-dock = { options.mjallen.programs.nwg-dock = {
enable = mkEnableOption "enable nwg-dock"; enable = mkEnableOption "enable nwg-dock";
}; };
} }

View File

@@ -1,52 +1,57 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
with lib; with lib;
let let
cfg = config.mjallen.programs.nwg-drawer; cfg = config.mjallen.programs.nwg-drawer;
nord = import ../../desktop/theme/nord.nix; nord = import (lib.snowfall.fs.get-file "modules/home/desktop/theme/nord.nix");
in in
{ {
imports = [ ./options.nix ]; imports = [ ./options.nix ];
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = with pkgs; [ nwg-drawer ]; home.packages = with pkgs; [ nwg-drawer ];
home.file = { home.file = {
".config/nwg-drawer/drawer.css".text = '' ".config/nwg-drawer/drawer.css".text = ''
window { window {
background-color: ${nord.polarNight.nord0}bf; background-color: ${nord.polarNight.nord0}bf;
color: ${nord.snowStorm.nord5}00 color: ${nord.snowStorm.nord5}00
} }
/* search entry */ /* search entry */
entry { entry {
background-color: ${nord.polarNight.nord1}0f background-color: ${nord.polarNight.nord1}0f
} }
button, image { button, image {
background: none; background: none;
border: none border: none
} }
button:hover { button:hover {
background-color: ${nord.frost.nord10}1a background-color: ${nord.frost.nord10}1a
} }
/* in case you wanted to give category buttons a different look */ /* in case you wanted to give category buttons a different look */
#category-button { #category-button {
margin: 0 10px 0 10px margin: 0 10px 0 10px
} }
#pinned-box { #pinned-box {
padding-bottom: 5px; padding-bottom: 5px;
border-bottom: 1px dotted ${nord.polarNight.nord3} border-bottom: 1px dotted ${nord.polarNight.nord3}
} }
#files-box { #files-box {
padding: 5px; padding: 5px;
border: 1px dotted ${nord.polarNight.nord3}; border: 1px dotted ${nord.polarNight.nord3};
border-radius: 15px border-radius: 15px
} }
''; '';
}; };
}; };
} }

View File

@@ -4,4 +4,4 @@ with lib;
options.mjallen.programs.nwg-drawer = { options.mjallen.programs.nwg-drawer = {
enable = mkEnableOption "enable nwg-drawer"; enable = mkEnableOption "enable nwg-drawer";
}; };
} }

View File

@@ -1,4 +1,4 @@
{ config, lib, ... }: { config, lib, ... }:
with lib; with lib;
let let
cfg = config.mjallen.programs.nwg-panel; cfg = config.mjallen.programs.nwg-panel;
@@ -12,15 +12,15 @@ in
''; '';
".config/nwg-panel/preferred-apps.json".text = '' ".config/nwg-panel/preferred-apps.json".text = ''
{ {
"\\.pdf$": "${cfg.defaultApps.browser.pname}", "\\.pdf$": "${cfg.defaultApps.browser.pname}",
"\\.svg$": "inkscape", "\\.svg$": "inkscape",
"\\.(jpg|png|tiff|gif)$": "${cfg.defaultApps.imageViewer.pname}", "\\.(jpg|png|tiff|gif)$": "${cfg.defaultApps.imageViewer.pname}",
"\\.(mp3|ogg|flac|wav|wma)$": "audacious", "\\.(mp3|ogg|flac|wav|wma)$": "audacious",
"\\.(avi|mp4|mkv|mov|wav)$": "${cfg.defaultApps.video.pname}", "\\.(avi|mp4|mkv|mov|wav)$": "${cfg.defaultApps.video.pname}",
"\\.(doc|docx|xls|xlsx)$": "${cfg.defaultApps.office.pname}" "\\.(doc|docx|xls|xlsx)$": "${cfg.defaultApps.office.pname}"
} }
''; '';
}; };
}; };
} }

View File

@@ -7,17 +7,41 @@ with lib;
defaultApps = mkOption { defaultApps = mkOption {
type = types.submodule { type = types.submodule {
options = { options = {
browser = mkOption { type = types.package; default = pkgs.firefox; }; browser = mkOption {
editor = mkOption { type = types.package; default = pkgs.micro; }; type = types.package;
fileExplorer = mkOption { type = types.package; default = pkgs.nemo; }; default = pkgs.firefox;
visual = mkOption { type = types.package; default = pkgs.vscodium; }; };
terminal = mkOption { type = types.package; default = pkgs.kitty; }; editor = mkOption {
office = mkOption { type = types.package; default = pkgs.onlyoffice-bin_latest; }; type = types.package;
video = mkOption { type = types.package; default = pkgs.vlc; }; default = pkgs.micro;
imageViewer = mkOption { type = types.package; default = pkgs.gnome-photos; }; };
fileExplorer = mkOption {
type = types.package;
default = pkgs.nemo;
};
visual = mkOption {
type = types.package;
default = pkgs.vscodium;
};
terminal = mkOption {
type = types.package;
default = pkgs.kitty;
};
office = mkOption {
type = types.package;
default = pkgs.onlyoffice-bin_latest;
};
video = mkOption {
type = types.package;
default = pkgs.vlc;
};
imageViewer = mkOption {
type = types.package;
default = pkgs.gnome-photos;
};
}; };
}; };
description = "Default applications used across the system."; description = "Default applications used across the system.";
}; };
}; };
} }

View File

@@ -11,4 +11,4 @@ in
maximized = true; maximized = true;
}; };
}; };
} }

View File

@@ -2,7 +2,7 @@
with lib; with lib;
let let
cfg = config.mjallen.programs.waybar; cfg = config.mjallen.programs.waybar;
nord = import ../../desktop/theme/nord.nix; nord = import (lib.snowfall.fs.get-file "modules/home/desktop/theme/nord.nix");
defaultOpacity = "opacity: 0.85;"; defaultOpacity = "opacity: 0.85;";
defaultBorderRadius = "border-radius: 1rem;"; defaultBorderRadius = "border-radius: 1rem;";
@@ -33,7 +33,7 @@ let
''; '';
in in
{ {
imports = [ imports = [
./options.nix ./options.nix
./scripts/hass.nix ./scripts/hass.nix
./scripts/weather.nix ./scripts/weather.nix
@@ -61,7 +61,30 @@ in
modules-center = [ "hyprland/window" ]; modules-center = [ "hyprland/window" ];
modules-right = cfg.modules-right; modules-right = [
"tray"
"custom/left-end"
"temperature"
"temperature#gpu"
"keyboard-state#capslock"
"keyboard-state#numlock"
"wireplumber#sink"
"bluetooth"
"network"
"idle_inhibitor"
"custom/right-end"
"custom/left-end"
"clock"
"battery"
"custom/weather"
"custom/right-end"
];
# modules-right = [
# "tray"
# "custom/left-end" ] ++
# cfg.modules-right ++
# [ "custom/right-end" ];
# Module Definitions # Module Definitions
# Left # Left
@@ -91,7 +114,7 @@ in
critical-threshold = 110; critical-threshold = 110;
format-critical = "{temperatureC}°C "; format-critical = "{temperatureC}°C ";
format = "{temperatureC}°C {icon}"; format = "{temperatureC}°C {icon}";
format-icons = [ format-icons = [
"" # fa-temperature-empty "" # fa-temperature-empty
"" # fa-temperature-quarter "" # fa-temperature-quarter
"" # fa-temperature-half "" # fa-temperature-half
@@ -106,7 +129,7 @@ in
critical-threshold = 110; critical-threshold = 110;
format-critical = "{temperatureC}°C "; format-critical = "{temperatureC}°C ";
format = "{temperatureC}°C {icon}"; format = "{temperatureC}°C {icon}";
format-icons = [ format-icons = [
"" # fa-temperature-empty "" # fa-temperature-empty
"" # fa-temperature-quarter "" # fa-temperature-quarter
"" # fa-temperature-half "" # fa-temperature-half
@@ -193,7 +216,7 @@ in
connected = "󰂱"; connected = "󰂱";
}; };
}; };
network = { network = {
interface = cfg.networkInterface; interface = cfg.networkInterface;
on-click = "nm-connection-editor"; on-click = "nm-connection-editor";
@@ -234,10 +257,10 @@ in
calendar = { calendar = {
mode = "month"; mode = "month";
format = { format = {
months = "<span color='${nord.frost.nord9}'><b>{}</b></span>"; months = "<span color='${nord.frost.nord9}'><b>{}</b></span>";
days = "<span color='${nord.frost.nord10}'><b>{}</b></span>"; days = "<span color='${nord.frost.nord10}'><b>{}</b></span>";
weekdays = "<span color='${nord.frost.nord8}'><b>{}</b></span>"; weekdays = "<span color='${nord.frost.nord8}'><b>{}</b></span>";
today = "<span color='${nord.aurora.nord14}'><b><u>{}</u></b></span>"; today = "<span color='${nord.aurora.nord14}'><b><u>{}</u></b></span>";
}; };
}; };
}; };
@@ -247,8 +270,8 @@ in
interval = 60; interval = 60;
# statuses: 'Charging', 'Discharging' # statuses: 'Charging', 'Discharging'
states = { states = {
warning = 30; warning = 30;
critical = 15; critical = 15;
}; };
format = "{capacity}% {icon}"; format = "{capacity}% {icon}";
format-icons = { format-icons = {
@@ -290,7 +313,18 @@ in
return-type = "json"; return-type = "json";
markup = "pango"; markup = "pango";
}; };
} // cfg.extraModules;
"custom/left-end" = {
format = "&nbsp";
tooltip = false;
};
"custom/right-end" = {
format = "&nbsp";
tooltip = false;
};
}
// cfg.extraModules;
}; };
# * { font-size: 13px; } # * { font-size: 13px; }
@@ -306,7 +340,7 @@ in
color: ${nord.aurora.nord11}; color: ${nord.aurora.nord11};
} }
} }
* { * {
font-family: font-family:
Jetbrains Mono Nerd Font, Jetbrains Mono Nerd Font,
@@ -372,7 +406,7 @@ in
${defaultBorderRadius} ${defaultBorderRadius}
${defaultCenterOptions} ${defaultCenterOptions}
margin-left: 4rem; margin-left: 4rem;
margin-right: 4rem; margin-right: ${toString cfg.windowOffset}rem;
} }
/* make window module transparent when no windows present */ /* make window module transparent when no windows present */
@@ -384,7 +418,8 @@ in
color: ${nord.frost.nord10}; color: ${nord.frost.nord10};
background-color: ${nord.polarNight.nord0}; background-color: ${nord.polarNight.nord0};
${defaultOpacity} ${defaultOpacity}
${borderRight} ${defaultCenterOptions}
border-radius: 0;
} }
#battery { #battery {
@@ -400,7 +435,8 @@ in
color: ${nord.frost.nord9}; color: ${nord.frost.nord9};
background-color: ${nord.polarNight.nord0}; background-color: ${nord.polarNight.nord0};
${defaultOpacity} ${defaultOpacity}
${borderLeft} ${defaultCenterOptions}
border-radius: 0;
} }
/* ------------- */ /* ------------- */
@@ -409,7 +445,8 @@ in
color: ${nord.frost.nord10}; color: ${nord.frost.nord10};
background-color: ${nord.polarNight.nord0}; background-color: ${nord.polarNight.nord0};
${defaultOpacity} ${defaultOpacity}
${borderRight} ${defaultCenterOptions}
border-radius: 0;
padding-right: 1rem; padding-right: 1rem;
} }
@@ -528,7 +565,20 @@ in
} }
/* ------------- */ /* ------------- */
'' + cfg.extraModulesStyle or '''';
#custom-left-end {
background-color: ${nord.polarNight.nord0};
${defaultOpacity}
${borderLeft}
}
#custom-right-end {
background-color: ${nord.polarNight.nord0};
${defaultOpacity}
${borderRight}
}
''
+ cfg.extraModulesStyle or '''';
}; };
}; };
} }

View File

@@ -11,7 +11,7 @@ with lib;
modules-right = mkOption { modules-right = mkOption {
type = with types; listOf str; type = with types; listOf str;
default = []; default = [ ];
}; };
networkInterface = mkOption { networkInterface = mkOption {
@@ -28,5 +28,42 @@ with lib;
type = types.str; type = types.str;
default = ""; default = "";
}; };
windowOffset = mkOption {
type = types.int;
default = 4;
};
# Waybar modules config
# modules = mkOption {
# type = types.submodule {
# options = {
# # Modules
# window = mkOption {
# type = types.submodule {
# options = {
# # Waybar Module CSS
# margin-right = mkOption {
# type = types.str;
# default = "4";
# };
# };
# };
# };
# temperature = mkOption {
# type = types.submodule {
# options = {
# # Waybar Module CSS
# margin-right = mkOption {
# type = types.str;
# default = "4";
# };
# };
# };
# };
# };
# };
# default = { };
# };
}; };
} }

View File

@@ -1,8 +1,14 @@
{ config, lib, namespace, pkgs, ... }: {
config,
lib,
namespace,
pkgs,
...
}:
let let
cfg = config.mjallen.programs.waybar; cfg = config.mjallen.programs.waybar;
pythonEnv = pkgs.python3.withPackages (ps: [ pythonEnv = pkgs.python3.withPackages (_ps: [
pkgs.${namespace}.homeassistant-api pkgs.${namespace}.homeassistant-api
]); ]);

View File

@@ -1,4 +1,9 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
let let
cfg = config.mjallen.programs.waybar; cfg = config.mjallen.programs.waybar;
@@ -7,7 +12,6 @@ let
#! nix-shell -i python3 --pure #! nix-shell -i python3 --pure
#! nix-shell -p python3 python3Packages.requests #! nix-shell -p python3 python3Packages.requests
"""get waybar weather"""
import os import os
import json import json
import shutil import shutil
@@ -93,12 +97,16 @@ let
WIND_DIRECTION = { WIND_DIRECTION = {
"S": "", "S": "",
"SW": "", "SW": "",
"SSW": "",
"W": "", "W": "",
"NW": "", "NW": "",
"NNW": "",
"N": "", "N": "",
"NE": "", "NE": "",
"NNE": "",
"E": "", "E": "",
"SE": "", "SE": "",
"SSE": "",
} }
MOON_PHASES = ( MOON_PHASES = (
@@ -334,11 +342,13 @@ let
moon_phase = astronomy['moon_phase'] moon_phase = astronomy['moon_phase']
wego = WEATHER_CODES_WEGO[current_condition['weatherCode']] wego = WEATHER_CODES_WEGO[current_condition['weatherCode']]
tooltip = f"{wego[0]}{weather_description} {temp_f}°\n" current = f"{wego[0]}{weather_description} {temp_f}°\n"
tooltip += f"{wego[1]}Feels like: {feels_like_f}°\n" feels = f"{wego[1]}Feels like: {feels_like_f}°\n"
tooltip += f"{wego[2]}Wind: {wind_speed}mph {WIND_DIRECTION[wind_dir]}\n" wind = f"{wego[2]}Wind: {wind_speed}mph {WIND_DIRECTION[wind_dir]}\n"
tooltip += f"{wego[3]}Humidity: {humidity}%\n" humidityl = f"{wego[3]}Humidity: {humidity}%\n"
tooltip += f"{wego[4]}Moon phase: {moon_phase} " + moon_icon + "\n" moon = f"{wego[4]}Moon phase: {moon_phase} " + moon_icon + "\n"
tooltip = current + feels + wind + humidityl + moon
return tooltip return tooltip
@@ -414,9 +424,12 @@ let
current_condition = weather["current_condition"][0] current_condition = weather["current_condition"][0]
astronomy = weather["weather"][0]['astronomy'][0] astronomy = weather["weather"][0]['astronomy'][0]
data["text"] = build_text(current_condition) text = build_text(current_condition)
data["tooltip"] = build_tooltip(current_condition, astronomy, moon_icon)
data["tooltip"] += build_forecast(weather["weather"]) tooltip = build_tooltip(current_condition, astronomy, moon_icon) + build_forecast(weather["weather"])
data["text"] = text
data["tooltip"] = tooltip
return json.dumps(data) return json.dumps(data)
@@ -425,6 +438,7 @@ let
try: try:
print(get_wttr_json()) print(get_wttr_json())
except Exception as e: except Exception as e:
print("error")
print(e) print(e)
main() main()

View File

@@ -2,10 +2,10 @@
with lib; with lib;
let let
cfg = config.mjallen.programs.wlogout; cfg = config.mjallen.programs.wlogout;
nord = import ../../desktop/theme/nord.nix; nord = import (lib.snowfall.fs.get-file "modules/home/desktop/theme/nord.nix");
in in
{ {
imports = [ ./options.nix ]; imports = [ ./options.nix ];
config = mkIf cfg.enable { config = mkIf cfg.enable {
programs.wlogout = { programs.wlogout = {
enable = false; enable = false;
@@ -101,4 +101,4 @@ in
''; '';
}; };
}; };
} }

View File

@@ -9,4 +9,4 @@ with lib;
default = "Deja Vu Sans"; default = "Deja Vu Sans";
}; };
}; };
} }

View File

@@ -2,7 +2,7 @@
with lib; with lib;
let let
cfg = config.mjallen.programs.wofi; cfg = config.mjallen.programs.wofi;
nord = import ../../desktop/theme/nord.nix; nord = import (lib.snowfall.fs.get-file "modules/home/desktop/theme/nord.nix");
in in
{ {
imports = [ ./options.nix ]; imports = [ ./options.nix ];

View File

@@ -9,4 +9,4 @@ with lib;
default = "Deja Vu Sans"; default = "Deja Vu Sans";
}; };
}; };
} }

View File

@@ -26,4 +26,4 @@ in
# fi # fi
# ''; # '';
}; };
} }

View File

@@ -0,0 +1,57 @@
{
config,
lib,
...
}:
let
cfg = config.mjallen.shell-aliases;
in
{
options.mjallen.shell-aliases = {
enable = lib.mkEnableOption "Common shell aliases";
buildHost = lib.mkOption {
type = lib.types.str;
default = "admin@10.0.1.3";
description = "Build host for nixos-rebuild commands";
};
flakeInputs = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ ];
description = "List of flake inputs to update";
};
extraAliases = lib.mkOption {
type = lib.types.attrsOf lib.types.str;
default = { };
description = "Additional host-specific aliases";
};
};
config = lib.mkIf cfg.enable {
programs.zsh.shellAliases = {
# Common file operations
ll = "ls -alh";
ducks = "du -cksh * | sort -hr | head -n 15";
# NixOS rebuild commands
update-boot =
"sudo nixos-rebuild boot --max-jobs 10"
+ lib.optionalString (cfg.buildHost != "") " --build-host ${cfg.buildHost}";
update-switch =
"sudo nixos-rebuild switch --max-jobs 10"
+ lib.optionalString (cfg.buildHost != "") " --build-host ${cfg.buildHost}";
# Flake update command
update-flake = lib.mkIf (
cfg.flakeInputs != [ ]
) "nix flake update ${lib.concatStringsSep " " cfg.flakeInputs} --flake /etc/nixos";
# NAS management
update-nas = "nixos-rebuild switch --use-remote-sudo --target-host admin@10.0.1.3 --build-host admin@10.0.1.3 --flake ~/nix-config#jallen-nas";
nas-ssh = "kitten ssh admin@10.0.1.3";
}
// cfg.extraAliases;
};
}

View File

@@ -1,9 +1,13 @@
{ config, lib, namespace, ... }: {
config,
lib,
namespace,
...
}:
let let
cfg = config.mjallen.sops; cfg = config.mjallen.sops;
user = config.${namespace}.user.name; user = config.${namespace}.user.name;
hostname = config.${namespace}.network.hostname;
in in
{ {
imports = [ ./options.nix ]; imports = [ ./options.nix ];
@@ -25,4 +29,4 @@ in
}; };
}; };
}; };
} }

View File

@@ -9,4 +9,4 @@ with lib;
default = null; default = null;
}; };
}; };
} }

View File

@@ -34,7 +34,7 @@ in
default = "Austin Horstman"; default = "Austin Horstman";
description = "The full name of the user."; description = "The full name of the user.";
}; };
home = mkOption { home = mkOption {
type = (types.nullOr types.str); type = (types.nullOr types.str);
default = home-directory; default = home-directory;
description = "The user's home directory."; description = "The user's home directory.";
@@ -65,20 +65,19 @@ in
]; ];
home = { home = {
file = file = {
{ "Desktop/.keep".text = "";
"Desktop/.keep".text = ""; "Documents/.keep".text = "";
"Documents/.keep".text = ""; "Downloads/.keep".text = "";
"Downloads/.keep".text = ""; "Music/.keep".text = "";
"Music/.keep".text = ""; "Pictures/.keep".text = "";
"Pictures/.keep".text = ""; "Videos/.keep".text = "";
"Videos/.keep".text = ""; }
} // lib.optionalAttrs (cfg.icon != null) {
// lib.optionalAttrs (cfg.icon != null) { ".face".source = cfg.icon;
".face".source = cfg.icon; ".face.icon".source = cfg.icon;
".face.icon".source = cfg.icon; "Pictures/${cfg.icon.fileName or (builtins.baseNameOf cfg.icon)}".source = cfg.icon;
"Pictures/${cfg.icon.fileName or (builtins.baseNameOf cfg.icon)}".source = cfg.icon; };
};
homeDirectory = mkDefault cfg.home; homeDirectory = mkDefault cfg.home;
@@ -154,4 +153,4 @@ in
}; };
} }
]); ]);
} }

View File

@@ -1,7 +1,13 @@
{ config, pkgs, lib, ... }: {
config,
pkgs,
lib,
namespace,
...
}:
with lib; with lib;
let let
cfg = config.nas-apps.actual; cfg = config.${namespace}.services.actual;
dataDir = "/data"; dataDir = "/data";
hostAddress = "10.0.1.3"; hostAddress = "10.0.1.3";
actualUserId = config.users.users.nix-apps.uid; actualUserId = config.users.users.nix-apps.uid;
@@ -24,7 +30,8 @@ in
}; };
}; };
config = { lib, ... }: config =
{ lib, ... }:
{ {
services.actual = { services.actual = {
enable = true; enable = true;
@@ -63,13 +70,13 @@ in
''; '';
systemd.services = { systemd.services = {
actual = { actual = {
environment.ACTUAL_CONFIG_PATH = lib.mkForce "${dataDir}/config.json"; environment.ACTUAL_CONFIG_PATH = lib.mkForce "${dataDir}/config.json";
serviceConfig = { serviceConfig = {
ExecStart = lib.mkForce "${pkgs.actual-server}/bin/actual-server --config ${dataDir}/config.json"; ExecStart = lib.mkForce "${pkgs.actual-server}/bin/actual-server --config ${dataDir}/config.json";
WorkingDirectory = lib.mkForce dataDir; WorkingDirectory = lib.mkForce dataDir;
StateDirectory = lib.mkForce dataDir; StateDirectory = lib.mkForce dataDir;
StateDirectoryMode = lib.mkForce 0700; StateDirectoryMode = lib.mkForce 700;
DynamicUser = lib.mkForce false; DynamicUser = lib.mkForce false;
ProtectSystem = lib.mkForce null; ProtectSystem = lib.mkForce null;
}; };

View File

@@ -1,7 +1,7 @@
{ lib, ... }: { lib, namespace, ... }:
with lib; with lib;
{ {
options.nas-apps.actual = { options.${namespace}.services.actual = {
enable = mkEnableOption "actual service"; enable = mkEnableOption "actual service";
port = mkOption { port = mkOption {

View File

@@ -6,7 +6,7 @@
}: }:
let let
cfg = config.share.hardware.amd; cfg = config.share.hardware.amd;
pkgsVersion = pkgs;#.unstable; pkgsVersion = pkgs; # .unstable;
in in
{ {
imports = [ ./options.nix ]; imports = [ ./options.nix ];

View File

@@ -11,4 +11,4 @@
magicOrExtension = "\\x7fELF....AI\\x02"; magicOrExtension = "\\x7fELF....AI\\x02";
}; };
}; };
} }

View File

@@ -1,7 +1,12 @@
{ lib, config, ... }: {
lib,
config,
namespace,
...
}:
with lib; with lib;
let let
cfg = config.nas-apps.free-games-claimer; cfg = config.${namespace}.services.free-games-claimer;
in in
{ {
imports = [ ./options.nix ]; imports = [ ./options.nix ];

View File

@@ -1,7 +1,7 @@
{ lib, ... }: { lib, namespace, ... }:
with lib; with lib;
{ {
options.nas-apps.free-games-claimer = { options.${namespace}.services.free-games-claimer = {
enable = mkEnableOption "free-games-claimer docker service"; enable = mkEnableOption "free-games-claimer docker service";
autoStart = mkOption { autoStart = mkOption {
@@ -26,7 +26,7 @@ with lib;
dataPath = mkOption { dataPath = mkOption {
type = types.str; type = types.str;
default = "/media/nas/ssd/nix-app-data/free-games-claimer"; default = "/media/nas/main/nix-app-data/free-games-claimer";
}; };
puid = mkOption { puid = mkOption {

View File

@@ -1,7 +1,12 @@
{ lib, config, ... }: {
lib,
config,
namespace,
...
}:
with lib; with lib;
let let
cfg = config.nas-apps.manyfold; cfg = config.${namespace}.services.manyfold;
in in
{ {
imports = [ ./options.nix ]; imports = [ ./options.nix ];

View File

@@ -1,7 +1,7 @@
{ lib, ... }: { lib, namespace, ... }:
with lib; with lib;
{ {
options.nas-apps.manyfold = { options.${namespace}.services.manyfold = {
enable = mkEnableOption "manyfold docker service"; enable = mkEnableOption "manyfold docker service";
autoStart = mkOption { autoStart = mkOption {
@@ -26,7 +26,7 @@ with lib;
configPath = mkOption { configPath = mkOption {
type = types.str; type = types.str;
default = "/media/nas/ssd/nix-app-data/manyfold"; default = "/media/nas/main/nix-app-data/manyfold";
}; };
dataPath = mkOption { dataPath = mkOption {

View File

@@ -1,7 +1,12 @@
{ lib, config, ... }: {
lib,
config,
namespace,
...
}:
with lib; with lib;
let let
cfg = config.nas-apps.mongodb; cfg = config.${namespace}.services.mongodb;
in in
{ {
imports = [ ./options.nix ]; imports = [ ./options.nix ];

View File

@@ -1,7 +1,7 @@
{ lib, ... }: { lib, namespace, ... }:
with lib; with lib;
{ {
options.nas-apps.mongodb = { options.${namespace}.services.mongodb = {
enable = mkEnableOption "mongodb docker service"; enable = mkEnableOption "mongodb docker service";
autoStart = mkOption { autoStart = mkOption {
@@ -26,7 +26,7 @@ with lib;
configPath = mkOption { configPath = mkOption {
type = types.str; type = types.str;
default = "/media/nas/ssd/mongodb"; default = "/media/nas/main/mongodb";
}; };
puid = mkOption { puid = mkOption {

View File

@@ -1,7 +1,12 @@
{ lib, config, ... }: {
lib,
config,
namespace,
...
}:
with lib; with lib;
let let
cfg = config.nas-apps.tdarr; cfg = config.${namespace}.services.tdarr;
in in
{ {
imports = [ ./options.nix ]; imports = [ ./options.nix ];

View File

@@ -1,7 +1,7 @@
{ lib, ... }: { lib, namespace, ... }:
with lib; with lib;
{ {
options.nas-apps.tdarr = { options.${namespace}.services.tdarr = {
enable = mkEnableOption "tdarr docker service"; enable = mkEnableOption "tdarr docker service";
autoStart = mkOption { autoStart = mkOption {
@@ -31,22 +31,22 @@ with lib;
configPath = mkOption { configPath = mkOption {
type = types.str; type = types.str;
default = "/media/nas/ssd/nix-app-data/tdarr/config"; default = "/media/nas/main/nix-app-data/tdarr/config";
}; };
serverPath = mkOption { serverPath = mkOption {
type = types.str; type = types.str;
default = "/media/nas/ssd/nix-app-data/tdarr/server"; default = "/media/nas/main/nix-app-data/tdarr/server";
}; };
logPath = mkOption { logPath = mkOption {
type = types.str; type = types.str;
default = "/media/nas/ssd/nix-app-data/tdarr/logs"; default = "/media/nas/main/nix-app-data/tdarr/logs";
}; };
transcodePath = mkOption { transcodePath = mkOption {
type = types.str; type = types.str;
default = "/media/nas/ssd/nix-app-data/tdarr/transcode"; default = "/media/nas/main/nix-app-data/tdarr/transcode";
}; };
moviesPath = mkOption { moviesPath = mkOption {

View File

@@ -1,7 +1,12 @@
{ lib, config, ... }: {
lib,
config,
namespace,
...
}:
with lib; with lib;
let let
cfg = config.nas-apps.your_spotify; cfg = config.${namespace}.services.your_spotify;
in in
{ {
imports = [ ./options.nix ]; imports = [ ./options.nix ];

View File

@@ -1,7 +1,7 @@
{ lib, ... }: { lib, namespace, ... }:
with lib; with lib;
{ {
options.nas-apps.your_spotify = { options.${namespace}.services.your_spotify = {
enable = mkEnableOption "your_spotify docker service"; enable = mkEnableOption "your_spotify docker service";
autoStart = mkOption { autoStart = mkOption {
@@ -36,7 +36,7 @@ with lib;
configPath = mkOption { configPath = mkOption {
type = types.str; type = types.str;
default = "/media/nas/ssd/nix-app-data/your_spotify"; default = "/media/nas/main/nix-app-data/your_spotify";
}; };
puid = mkOption { puid = mkOption {

View File

@@ -2,11 +2,12 @@
config, config,
pkgs, pkgs,
lib, lib,
namespace,
... ...
}: }:
with lib; with lib;
let let
cfg = config.nas-apps.arrs; cfg = config.${namespace}.services.arrs;
radarrDataDir = "/var/lib/radarr"; radarrDataDir = "/var/lib/radarr";
downloadDir = "/downloads"; downloadDir = "/downloads";
incompleteDir = "/downloads-incomplete"; incompleteDir = "/downloads-incomplete";
@@ -40,9 +41,11 @@ in
{ {
nixpkgs.config = { nixpkgs.config = {
allowUnfree = lib.mkForce true; allowUnfree = lib.mkForce true;
allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ allowUnfreePredicate =
"unrar" pkg:
]; builtins.elem (lib.getName pkg) [
"unrar"
];
}; };
# Enable radarr service # Enable radarr service
@@ -207,7 +210,7 @@ in
}; };
networking = { networking = {
nat = { nat = {
forwardPorts = [ forwardPorts = [
{ {
destination = "${cfg.localAddress}:${toString cfg.radarr.port}"; destination = "${cfg.localAddress}:${toString cfg.radarr.port}";
@@ -232,8 +235,22 @@ in
]; ];
}; };
firewall = { firewall = {
allowedTCPPorts = [ cfg.radarr.port cfg.sonarr.port cfg.sabnzbd.port 8080 cfg.deluge.port cfg.jackett.port ]; allowedTCPPorts = [
allowedUDPPorts = [ cfg.radarr.port cfg.sonarr.port cfg.sabnzbd.port 8080 cfg.deluge.port cfg.jackett.port ]; cfg.radarr.port
cfg.sonarr.port
cfg.sabnzbd.port
8080
cfg.deluge.port
cfg.jackett.port
];
allowedUDPPorts = [
cfg.radarr.port
cfg.sonarr.port
cfg.sabnzbd.port
8080
cfg.deluge.port
cfg.jackett.port
];
}; };
}; };
}; };

View File

@@ -1,7 +1,7 @@
{ lib, ... }: { lib, namespace, ... }:
with lib; with lib;
{ {
options.nas-apps.arrs = { options.${namespace}.services.arrs = {
enable = mkEnableOption "arrs services"; enable = mkEnableOption "arrs services";
radarr = { radarr = {

View File

@@ -1,10 +1,32 @@
{ ... }: {
pkgs,
system,
lib,
...
}:
let
isArm = ("aarch64-linux" == system);
in
{ {
boot = { boot = {
kernelParams = [ kernelParams = [
"quiet" "quiet"
]; ];
binfmt = lib.mkIf isArm {
registrations."x86_64-linux" = {
magicOrExtension = ''\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00'';
mask = ''\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'';
openBinary = true;
interpreter = "${pkgs.box64}/bin/box64";
preserveArgvZero = true;
matchCredentials = true;
fixBinary = false;
};
};
supportedFilesystems = [ "bcachefs" ];
}; };
zramSwap.enable = true; zramSwap.enable = true;
} }

View File

@@ -1,4 +1,9 @@
{ config, lib, namespace, inputs, ... }: {
config,
lib,
namespace,
...
}:
with lib; with lib;
let let
cfg = config.${namespace}.bootloader.lanzaboote; cfg = config.${namespace}.bootloader.lanzaboote;
@@ -15,4 +20,4 @@ in
configurationLimit = cfg.configLimit; configurationLimit = cfg.configLimit;
}; };
}; };
} }

View File

@@ -9,4 +9,4 @@ with lib;
default = 10; default = 10;
}; };
}; };
} }

View File

@@ -3,4 +3,4 @@
boot.plymouth = { boot.plymouth = {
enable = true; enable = true;
}; };
} }

View File

@@ -1,29 +1,37 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
namespace,
...
}:
with lib; with lib;
let let
cfg = config.nas-apps.crowdsec; cfg = config.${namespace}.services.crowdsec;
in in
{ {
imports = [ ./options.nix ]; imports = [ ./options.nix ];
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
services = { services = {
crowdsec = let crowdsec =
yaml = (pkgs.formats.yaml {}).generate; let
acquisitions_file = yaml "acquisitions.yaml" { yaml = (pkgs.formats.yaml { }).generate;
source = "journalctl"; acquisitions_file = yaml "acquisitions.yaml" {
journalctl_filter = ["_SYSTEMD_UNIT=sshd.service"]; source = "journalctl";
labels.type = "syslog"; journalctl_filter = [ "_SYSTEMD_UNIT=sshd.service" ];
}; labels.type = "syslog";
in { };
enable = true; in
enrollKeyFile = "${cfg.dataDir}/enroll.key"; {
settings = { enable = true;
crowdsec_service.acquisition_path = acquisitions_file; enrollKeyFile = "${cfg.dataDir}/enroll.key";
api.server = { settings = {
listen_uri = "0.0.0.0:${toString cfg.port}"; crowdsec_service.acquisition_path = acquisitions_file;
api.server = {
listen_uri = "0.0.0.0:${toString cfg.port}";
};
}; };
}; };
};
crowdsec-firewall-bouncer = { crowdsec-firewall-bouncer = {
enable = true; enable = true;
@@ -35,17 +43,19 @@ in
}; };
systemd.services.crowdsec.serviceConfig = { systemd.services.crowdsec.serviceConfig = {
ExecStartPre = let ExecStartPre =
script = pkgs.writeScriptBin "register-bouncer" '' let
#!${pkgs.runtimeShell} script = pkgs.writeScriptBin "register-bouncer" ''
set -eu #!${pkgs.runtimeShell}
set -o pipefail set -eu
set -o pipefail
if ! cscli bouncers list | grep -q "nas-bouncer"; then if ! cscli bouncers list | grep -q "nas-bouncer"; then
cscli bouncers add "nas-bouncer" --key "${cfg.apiKey}" cscli bouncers add "nas-bouncer" --key "${cfg.apiKey}"
fi fi
''; '';
in ["${script}/bin/register-bouncer"]; in
[ "${script}/bin/register-bouncer" ];
}; };
networking = { networking = {
@@ -55,4 +65,4 @@ in
}; };
}; };
}; };
} }

View File

@@ -1,7 +1,7 @@
{ lib, ... }: { lib, namespace, ... }:
with lib; with lib;
{ {
options.nas-apps.crowdsec = { options.${namespace}.services.crowdsec = {
enable = mkEnableOption "crowdsec service"; enable = mkEnableOption "crowdsec service";
port = mkOption { port = mkOption {

View File

@@ -1,4 +1,9 @@
{ config, lib, namespace, ... }: {
config,
lib,
namespace,
...
}:
let let
cfg = config.${namespace}.desktop.cosmic; cfg = config.${namespace}.desktop.cosmic;
in in

View File

@@ -4,4 +4,4 @@ with lib;
options.${namespace}.desktop.cosmic = { options.${namespace}.desktop.cosmic = {
enable = mkEnableOption "enable cosmic settings"; enable = mkEnableOption "enable cosmic settings";
}; };
} }

View File

@@ -1,4 +1,10 @@
{ config, lib, pkgs, namespace, ... }: {
config,
lib,
pkgs,
namespace,
...
}:
let let
cfg = config.${namespace}.desktop.gnome; cfg = config.${namespace}.desktop.gnome;
in in
@@ -17,14 +23,14 @@ in
gnome.gnome-remote-desktop.enable = true; gnome.gnome-remote-desktop.enable = true;
}; };
xdg.portal.extraPortals = [ pkgs.xdg-desktop-portal-gtk ]; xdg.portal.extraPortals = [ pkgs.xdg-desktop-portal-gtk ];
programs = { programs = {
kdeconnect = { kdeconnect = {
enable = true; enable = lib.mkDefault true;
package = pkgs.gnomeExtensions.gsconnect; package = pkgs.gnomeExtensions.gsconnect;
}; };
}; };
}; };
} }

View File

@@ -1,4 +1,10 @@
{ config, pkgs, lib, namespace, ... }: {
config,
pkgs,
lib,
namespace,
...
}:
let let
cfg = config.${namespace}.desktop.hyprland; cfg = config.${namespace}.desktop.hyprland;
@@ -26,7 +32,10 @@ in
imports = [ ../../../home/desktop/hyprland/options.nix ]; imports = [ ../../../home/desktop/hyprland/options.nix ];
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
environment.systemPackages = [ bing-wallpaper pkgs.jq ]; environment.systemPackages = [
bing-wallpaper
pkgs.jq
];
services = { services = {
displayManager = { displayManager = {
@@ -66,7 +75,7 @@ in
xwayland.enable = true; xwayland.enable = true;
portalPackage = lib.mkDefault pkgs.xdg-desktop-portal-hyprland; portalPackage = lib.mkDefault pkgs.xdg-desktop-portal-hyprland;
}; };
nm-applet.enable = true; nm-applet.enable = true;
}; };
@@ -121,19 +130,16 @@ in
reload-bing-wallpaper = { reload-bing-wallpaper = {
description = "Timer for reload-bing-wallpaper"; description = "Timer for reload-bing-wallpaper";
wantedBy = [ "timers.target" ]; wantedBy = [ "timers.target" ];
# Timer configuration # Timer configuration
timerConfig = { timerConfig = {
OnCalendar = "daily"; # Check every day OnCalendar = "daily"; # Check every day
Persistent = true; # Run immediately if last run was missed Persistent = true; # Run immediately if last run was missed
Unit = "reload-bing-wallpaper.service"; Unit = "reload-bing-wallpaper.service";
}; };
}; };
}; };
}; };
extraConfig = ''
DefaultTimeoutStopSec=10s
'';
}; };
security = { security = {

View File

@@ -1,10 +1,10 @@
{ pkgs, ... }: { pkgs, ... }:
let let
nord = import ./theme.nix; nord = import ./theme.nix;
themeSize = "compact"; # [ "standard" "compact" ] themeSize = "compact"; # [ "standard" "compact" ]
themeAccent = "all"; # [ "default" "purple" "pink" "red" "orange" "yellow" "green" "teal" "grey" "all" ] themeAccent = "all"; # [ "default" "purple" "pink" "red" "orange" "yellow" "green" "teal" "grey" "all" ]
themeVariant = "nord"; # [ "nord" "dracula" "gruvbox" "everforest" "catppuccin" "all" "black" "rimless" "normal" "float" ] themeVariant = "nord"; # [ "nord" "dracula" "gruvbox" "everforest" "catppuccin" "all" "black" "rimless" "normal" "float" ]
themeColor = "dark"; # [ "standard" "light" "dark" ] themeColor = "dark"; # [ "standard" "light" "dark" ]
iconThemeVariant = "all"; # [ "default" "purple" "pink" "red" "orange" "yellow" "green" "teal" "grey" "all" ] iconThemeVariant = "all"; # [ "default" "purple" "pink" "red" "orange" "yellow" "green" "teal" "grey" "all" ]
iconScheme = "nord"; # [ "default" "nord" "dracula" "gruvbox" "everforest" "catppuccin" "all" ] iconScheme = "nord"; # [ "default" "nord" "dracula" "gruvbox" "everforest" "catppuccin" "all" ]
@@ -105,4 +105,4 @@ in
}; };
theme = nord; theme = nord;
} }

View File

@@ -0,0 +1,92 @@
{
config,
lib,
pkgs,
namespace,
...
}:
let
cfg = config.${namespace}.development;
in
{
options.${namespace}.development = {
enable = lib.mkEnableOption "Common development tools and packages";
includeLanguages = lib.mkOption {
type = lib.types.listOf (
lib.types.enum [
"python"
"c"
"rust"
"nodejs"
]
);
default = [
"python"
"c"
];
description = "Programming languages to include tools for";
};
includeContainers = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Include container development tools";
};
};
config = lib.mkIf cfg.enable {
environment.systemPackages =
with pkgs;
[
# Version control
git
# Build tools
cmake
ninja
binutils
# System utilities
jq
# Text processing
]
++ lib.optionals (builtins.elem "python" cfg.includeLanguages) [
python3
python3Packages.pip
]
++ lib.optionals (builtins.elem "c" cfg.includeLanguages) [
gcc
gdb
]
++ lib.optionals (builtins.elem "rust" cfg.includeLanguages) [
rustc
cargo
]
++ lib.optionals (builtins.elem "nodejs" cfg.includeLanguages) [
nodejs
npm
]
++ lib.optionals cfg.includeContainers [
docker-compose
podman-compose
];
# Enable container support if requested
virtualisation.podman = lib.mkIf cfg.includeContainers {
enable = true;
dockerCompat = true;
autoPrune.enable = true;
defaultNetwork.settings = {
dns_enabled = true;
};
};
# Common development programs
programs = {
nix-ld.enable = lib.mkDefault true;
};
};
}

View File

@@ -1,19 +1,79 @@
{ config, lib, system, ... }: {
config,
lib,
system,
namespace,
...
}:
let let
cfg = config.${namespace}.hardware.disko;
isArm = builtins.match "aarch64*" system != null; isArm = builtins.match "aarch64*" system != null;
rootDisk = "/dev/nvme0n1"; rootDisk = "/dev/nvme0n1";
# BTRFS root partition configuration
btrfsRoot = {
name = "btrfs-root";
size = "100%";
content = {
type = "btrfs";
extraArgs = [ "-f" ]; # Override existing partition
# Subvolumes must set a mountpoint in order to be mounted,
# unless their parent is mounted
subvolumes = {
"home" = {
mountOptions = [ "compress=zstd" ];
mountpoint = "/home";
};
"root" = {
mountOptions = [
"compress=zstd"
"noatime"
];
mountpoint = "/root";
};
"nix" = {
mountOptions = [
"compress=zstd"
"noatime"
];
mountpoint = "/nix";
};
"etc" = {
mountOptions = [
"compress=zstd"
"noatime"
];
mountpoint = "/etc";
};
"log" = {
mountOptions = [
"compress=zstd"
"noatime"
];
mountpoint = "/var/log";
};
};
};
};
# BCacheFS root partition configuration
bcachefsRoot = {
size = "100%";
content = {
type = "bcachefs";
# This refers to a filesystem in the `bcachefs_filesystems` attrset below.
filesystem = "mounted_subvolumes_in_multi";
label = "ssd.ssd1";
extraFormatArgs = [
"--discard"
];
};
};
in in
{ {
config = lib.mkIf isArm { imports = [ ../options.nix ];
config = lib.mkIf (isArm && cfg.enable) {
disko.devices = { disko.devices = {
nodev."/" = {
fsType = "tmpfs";
mountOptions = [
"mode=755"
"defaults"
"size=2G"
];
};
# root disk setup # root disk setup
disk.main = { disk.main = {
type = "disk"; type = "disk";
@@ -53,58 +113,33 @@ in
}; };
}; };
root = { root = if cfg.filesystem == "btrfs" then btrfsRoot else bcachefsRoot;
name = "btrfs-root"; };
size = "100%"; };
content = { };
type = "btrfs";
extraArgs = [ "-f" ]; # Override existing partition bcachefs_filesystems = lib.mkIf (cfg.filesystem == "bcachefs") {
# Subvolumes must set a mountpoint in order to be mounted, mounted_subvolumes_in_multi = {
# unless their parent is mounted type = "bcachefs_filesystem";
subvolumes = { # passwordFile = "/etc/nixos/pool.jwe";
"home" = { extraFormatArgs = [
mountOptions = [ "compress=zstd" ]; "--compression=zstd"
mountpoint = "/home"; ];
}; subvolumes = {
"root" = { "/root" = {
mountOptions = [ mountpoint = "/";
"compress=zstd" };
"noatime" "/persistent" = {
]; mountpoint = "/persistent";
mountpoint = "/root"; };
}; "/nix" = {
"nix" = { mountOptions = [
mountOptions = [ "noatime"
"compress=zstd" ];
"noatime" mountpoint = "/nix";
];
mountpoint = "/nix";
};
"etc" = {
mountOptions = [
"compress=zstd"
"noatime"
];
mountpoint = "/etc";
};
"tmp" = {
mountOptions = [
"compress=zstd"
"noatime"
];
mountpoint = "/tmp";
};
"log" = {
mountOptions = [
"compress=zstd"
"noatime"
];
mountpoint = "/var/log";
};
};
};
}; };
}; };
mountpoint = "/partition-root";
}; };
}; };
}; };

View File

@@ -3,5 +3,13 @@ with lib;
{ {
options.${namespace}.hardware.disko = { options.${namespace}.hardware.disko = {
enable = mkEnableOption "enable disko"; enable = mkEnableOption "enable disko";
filesystem = mkOption {
type = types.enum [
"bcachefs"
"btrfs"
];
default = "btrfs";
description = "Filesystem to use for the root partition";
};
}; };
} }

View File

@@ -1,93 +1,142 @@
{ config, lib, system, namespace, ... }: {
config,
lib,
system,
namespace,
...
}:
let let
cfg = config.${namespace}.hardware.disko; cfg = config.${namespace}.hardware.disko;
isArm = builtins.match "aarch64*" system != null; isArm = builtins.match "aarch64*" system != null;
rootDisk = "/dev/nvme0n1"; rootDisk = "/dev/nvme0n1";
in
{
imports = [ ../options.nix ];
config = lib.mkIf (cfg.enable && !isArm) { # BTRFS root partition configuration
disko.devices = { btrfsRoot = {
nodev."/" = { name = "btrfs-root";
fsType = "tmpfs"; size = "100%";
mountOptions = [ content = {
"mode=755" type = "btrfs";
"defaults" extraArgs = [ "-f" ]; # Override existing partition
"size=25%" # Subvolumes must set a mountpoint in order to be mounted,
]; # unless their parent is mounted
}; subvolumes = {
# root disk setup "home" = {
disk.main = { mountOptions = [ "compress=zstd" ];
type = "disk"; mountpoint = "/home";
device = rootDisk; };
imageSize = "32G"; "root" = {
content = { mountOptions = [
type = "gpt"; "compress=zstd"
# specify partitions "noatime"
partitions = { ];
# /boot mountpoint = "/root";
ESP = { };
priority = 1; "nix" = {
name = "ESP"; mountOptions = [
start = "1M"; "compress=zstd"
end = "1G"; "noatime"
type = "EF00"; ];
content = { mountpoint = "/nix";
type = "filesystem"; };
format = "vfat"; "etc" = {
mountpoint = "/boot"; mountOptions = [
mountOptions = [ "umask=0077" ]; "compress=zstd"
}; "noatime"
}; ];
mountpoint = "/etc";
root = { };
name = "btrfs-root"; "log" = {
size = "100%"; mountOptions = [
content = { "compress=zstd"
type = "btrfs"; "noatime"
extraArgs = [ "-f" ]; # Override existing partition ];
# Subvolumes must set a mountpoint in order to be mounted, mountpoint = "/var/log";
# unless their parent is mounted
subvolumes = {
"home" = {
mountOptions = [ "compress=zstd" ];
mountpoint = "/home";
};
"root" = {
mountOptions = [
"compress=zstd"
"noatime"
];
mountpoint = "/root";
};
"nix" = {
mountOptions = [
"compress=zstd"
"noatime"
];
mountpoint = "/nix";
};
"etc" = {
mountOptions = [
"compress=zstd"
"noatime"
];
mountpoint = "/etc";
};
"log" = {
mountOptions = [
"compress=zstd"
"noatime"
];
mountpoint = "/var/log";
};
};
};
};
};
}; };
}; };
}; };
}; };
# BCacheFS root partition configuration
bcachefsRoot = {
size = "100%";
content = {
type = "bcachefs";
# This refers to a filesystem in the `bcachefs_filesystems` attrset below.
filesystem = "mounted_subvolumes_in_multi";
label = "ssd.ssd1";
extraFormatArgs = [
"--discard"
];
};
};
in
{
imports = [ ../options.nix ];
config = lib.mkIf (!isArm && cfg.enable) {
disko.devices = lib.mkMerge [
{
disk = {
main = {
device = rootDisk;
type = "disk";
imageSize = "32G";
content = {
type = "gpt";
partitions = {
ESP = {
type = "EF00";
size = "100M";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
mountOptions = [ "umask=0077" ];
};
};
root = if cfg.filesystem == "btrfs" then btrfsRoot else bcachefsRoot;
};
};
};
};
bcachefs_filesystems = lib.mkIf (cfg.filesystem == "bcachefs") {
mounted_subvolumes_in_multi = {
type = "bcachefs_filesystem";
# passwordFile = "/etc/nixos/pool.jwe";
extraFormatArgs = [
"--compression=zstd"
];
subvolumes = {
"subvolumes/root" = {
mountpoint = "/";
mountOptions = [
"verbose"
];
};
"subvolumes/persistent" = {
mountpoint = "/persistent";
};
"subvolumes/nix" = {
mountOptions = [
"noatime"
];
mountpoint = "/nix";
};
};
};
};
}
(lib.mkIf (cfg.filesystem == "btrfs") {
nodev."/" = {
fsType = "tmpfs";
mountOptions = [
"mode=755"
"defaults"
"size=25%"
];
};
})
];
};
} }

View File

@@ -1,11 +1,14 @@
{ lib, pkgs, ... }: { lib, pkgs, ... }:
{ {
fonts.packages = with pkgs; [ fonts.packages =
font-awesome with pkgs;
noto-fonts [
noto-fonts-color-emoji font-awesome
meslo-lgs-nf noto-fonts
] ++ builtins.filter lib.attrsets.isDerivation (builtins.attrValues pkgs.nerd-fonts); noto-fonts-color-emoji
meslo-lgs-nf
]
++ builtins.filter lib.attrsets.isDerivation (builtins.attrValues pkgs.nerd-fonts);
fonts.fontconfig.defaultFonts = { fonts.fontconfig.defaultFonts = {
emoji = [ emoji = [

View File

@@ -1,7 +1,12 @@
{ lib, config, pkgs, ... }: {
lib,
config,
pkgs,
...
}:
let let
cfg = config.share.gaming; cfg = config.share.gaming;
pkgsVersion = pkgs; #.unstable; pkgsVersion = pkgs; # .unstable;
in in
{ {
imports = [ ./options.nix ]; imports = [ ./options.nix ];
@@ -17,7 +22,7 @@ in
remotePlay.openFirewall = true; remotePlay.openFirewall = true;
# Open ports in the firewall for Source Dedicated Server # Open ports in the firewall for Source Dedicated Server
dedicatedServer.openFirewall = true; dedicatedServer.openFirewall = true;
extraCompatPackages = with pkgsVersion; [ proton-ge-bin]; extraCompatPackages = with pkgsVersion; [ proton-ge-bin ];
gamescopeSession = { gamescopeSession = {
enable = true; enable = true;
args = [ args = [
@@ -57,7 +62,7 @@ in
nixpkgs.config.packageOverrides = pkgs: { nixpkgs.config.packageOverrides = pkgs: {
steam = pkgs.steam.override { steam = pkgs.steam.override {
extraPkgs = extraPkgs =
pkgs: with pkgsVersion; [ _pkgs: with pkgsVersion; [
xorg.libXcursor xorg.libXcursor
xorg.libXi xorg.libXi
xorg.libXinerama xorg.libXinerama

View File

@@ -1,13 +1,18 @@
{ config, lib, ... }: {
config,
lib,
namespace,
...
}:
with lib; with lib;
let let
cfg = config.nas-apps.gitea; cfg = config.${namespace}.services.gitea;
hostAddress = "10.0.1.3"; hostAddress = "10.0.1.3";
# localAddress = "10.0.4.18"; # localAddress = "10.0.4.18";
# httpPort = 3000; # httpPort = 3000;
# sshPort = 2222; # sshPort = 2222;
rootUrl = "https://gitea.mjallen.dev/"; rootUrl = "https://gitea.mjallen.dev/";
# stateDir = "/media/nas/ssd/nix-app-data/gitea"; # stateDir = "/media/nas/main/nix-app-data/gitea";
dataDir = "/var/lib/gitea"; dataDir = "/var/lib/gitea";
secretsDir = "/run/secrets/jallen-nas/gitea"; secretsDir = "/run/secrets/jallen-nas/gitea";
mailerPasswordFile = config.sops.secrets."jallen-nas/gitea/mail-key".path; mailerPasswordFile = config.sops.secrets."jallen-nas/gitea/mail-key".path;
@@ -34,7 +39,8 @@ in
}; };
}; };
config = { lib, ... }: config =
{ lib, ... }:
{ {
services.gitea = { services.gitea = {
enable = true; enable = true;
@@ -71,7 +77,10 @@ in
networking = { networking = {
firewall = { firewall = {
enable = true; enable = true;
allowedTCPPorts = [ cfg.httpPort cfg.sshPort ]; allowedTCPPorts = [
cfg.httpPort
cfg.sshPort
];
}; };
# Use systemd-resolved inside the container # Use systemd-resolved inside the container
# Workaround for bug https://github.com/NixOS/nixpkgs/issues/162686 # Workaround for bug https://github.com/NixOS/nixpkgs/issues/162686
@@ -122,8 +131,14 @@ in
]; ];
}; };
firewall = { firewall = {
allowedTCPPorts = [ cfg.httpPort cfg.sshPort ]; allowedTCPPorts = [
allowedUDPPorts = [ cfg.httpPort cfg.sshPort ]; cfg.httpPort
cfg.sshPort
];
allowedUDPPorts = [
cfg.httpPort
cfg.sshPort
];
}; };
}; };
}; };

View File

@@ -1,7 +1,7 @@
{ lib, ... }: { lib, namespace, ... }:
with lib; with lib;
{ {
options.nas-apps.gitea = { options.${namespace}.services.gitea = {
enable = mkEnableOption "gitea service"; enable = mkEnableOption "gitea service";
httpPort = mkOption { httpPort = mkOption {

View File

@@ -11,4 +11,4 @@
"/home" "/home"
]; ];
}; };
} }

View File

@@ -1,6 +1,6 @@
{ lib, system, ... }: { lib, system, ... }:
let let
isArm = "aarch64-linux" == system; isArm = "aarch64-linux" == system;
in in
{ {
hardware = { hardware = {

View File

@@ -4,8 +4,12 @@
options, options,
namespace, namespace,
inputs, inputs,
system,
... ...
}: }:
let
isArm = ("aarch64-linux" == system);
in
{ {
options.${namespace}.home = with lib.types; { options.${namespace}.home = with lib.types; {
@@ -41,22 +45,26 @@
useGlobalPkgs = true; useGlobalPkgs = true;
useUserPackages = true; useUserPackages = true;
# Pass inputs so external modules can access them # Pass inputs so external modules can access them
extraSpecialArgs = { extraSpecialArgs = {
inherit inputs; inherit inputs;
}; };
# Make ALL external HM modules available globally
sharedModules = with inputs; [
sops-nix.homeManagerModules.sops
steam-rom-manager.homeManagerModules.default
# Add any other external HM modules here
];
users.${config.${namespace}.user.name} = lib.mkAliasDefinitions options.${namespace}.home.extraOptions; # Make ALL external HM modules available globally
sharedModules =
with inputs;
[
sops-nix.homeManagerModules.sops
# Add any other external HM modules here
]
++ (if (!isArm) then with inputs; [ steam-rom-manager.homeManagerModules.default ] else [ ]);
users.${config.${namespace}.user.name} =
lib.mkAliasDefinitions
options.${namespace}.home.extraOptions;
# users.admin = lib.mkAliasDefinitions options.${namespace}.home.extraOptions; # users.admin = lib.mkAliasDefinitions options.${namespace}.home.extraOptions;
verbose = true; verbose = true;
}; };
}; };
} }

View File

@@ -1,23 +1,14 @@
{ config, lib, pkgs, namespace, ... }: {
config,
lib,
pkgs,
namespace,
...
}:
let let
cfg = config.${namespace}.services.home-assistant; cfg = config.${namespace}.services.home-assistant;
mosquittoPort = 1883; mosquittoPort = 1883;
zigbee2mqttPort = 8080; zigbee2mqttPort = 8080;
# In configuration.nix or a separate file
python-steam = pkgs.python3Packages.buildPythonPackage rec {
pname = "steam";
version = "1.4.4";
pyproject = false;
src = pkgs.fetchPypi {
inherit pname version;
sha256 = "sha256-K1vWkRwNSnMS9EG40WK52NR8i+u478bIhnOTsDI/pS4=";
};
buildInputs = with pkgs.python3Packages; [ setuptools ];
doCheck = false; # no tests in the PyPI tarball
};
in in
{ {
imports = [ ./options.nix ]; imports = [ ./options.nix ];
@@ -60,6 +51,7 @@ in
"nws" "nws"
"ollama" "ollama"
"onedrive" "onedrive"
"open_router"
"ping" "ping"
"radio_browser" "radio_browser"
"samsungtv" "samsungtv"
@@ -74,7 +66,7 @@ in
"wyoming" "wyoming"
"zha" "zha"
]; ];
customComponents = with pkgs.home-assistant-custom-components; [ customComponents = with pkgs.home-assistant-custom-components; [
# nixpkgs # nixpkgs
auth-header auth-header
@@ -87,6 +79,7 @@ in
pkgs.${namespace}.ha-icloud3 pkgs.${namespace}.ha-icloud3
pkgs.${namespace}.ha-mail-and-packages pkgs.${namespace}.ha-mail-and-packages
pkgs.${namespace}.ha-nanokvm pkgs.${namespace}.ha-nanokvm
pkgs.${namespace}.ha-openhasp
pkgs.${namespace}.ha-overseerr pkgs.${namespace}.ha-overseerr
pkgs.${namespace}.ha-petlibro pkgs.${namespace}.ha-petlibro
pkgs.${namespace}.ha-wyzeapi pkgs.${namespace}.ha-wyzeapi
@@ -106,113 +99,114 @@ in
zigbee2mqtt-networkmap zigbee2mqtt-networkmap
]; ];
# use postgresql instead of sqlite # use postgresql instead of sqlite
extraPackages = ps: with ps; [ extraPackages =
# Core functionality ps: with ps; [
aiohttp # Core functionality
aiodns aiohttp
paho-mqtt aiodns
pillow paho-mqtt
pytz pillow
pyyaml pytz
sqlalchemy pyyaml
sqlalchemy
# Discovery & networking
zeroconf
netdisco
ifaddr
ssdp
# Device protocols
pyserial # Serial communications
bluepy # Bluetooth LE
# Smart home ecosystems
mutagen # Media file metadata
pysonos # Sonos
pywemo # Belkin WeMo
python-miio # Xiaomi devices
python-kasa # TP-Link
# Sensors & monitoring
meteocalc # Weather calculations
speedtest-cli # Internet speed
# Visualization & UI
matplotlib # Graphing
# Security
bcrypt
cryptography
pyjwt
# Media
ha-ffmpeg # Camera streams
# Specialized integrations
python-matter-server # Matter protocol
# System integrations
psutil # System monitoring
psycopg2
numpy
hassil
pyturbojpeg
paho-mqtt
pychromecast
pyatv
python-otbr-api
brother
pyipp
govee-ble
adguardhome
nextcord
aiogithubapi
jellyfin-apiclient-python
pylitterbot
dateparser
aionut
nextcloudmonitor
ollama
pynecil
aiopyarr
pysabnzbd
getmac
zigpy
bellows # For Zigbee EmberZNet-based adapters
zigpy-xbee # For XBee adapters
zigpy-deconz # For ConBee/RaspBee adapters
pyicloud # iCloud
pyatv # Apple TV
opencv-python
face-recognition
ibeacon-ble
gehomesdk
onedrive-personal-sdk
python-roborock
python-steam
apple-weatherkit
samsungctl # Discovery & networking
samsungtvws zeroconf
netdisco
ifaddr
ssdp
aiohomekit # Device protocols
pyserial # Serial communications
bluepy # Bluetooth LE
# Smart home ecosystems
mutagen # Media file metadata
pysonos # Sonos
pywemo # Belkin WeMo
python-miio # Xiaomi devices
python-kasa # TP-Link
# Sensors & monitoring
meteocalc # Weather calculations
speedtest-cli # Internet speed
# Visualization & UI
matplotlib # Graphing
# Security
bcrypt
cryptography
pyjwt
# Media
ha-ffmpeg # Camera streams
# Specialized integrations
python-matter-server # Matter protocol
# System integrations
psutil # System monitoring
psycopg2
numpy
hassil
pyturbojpeg
paho-mqtt
pychromecast
pyatv
python-otbr-api
brother
pyipp
govee-ble
adguardhome
nextcord
aiogithubapi
jellyfin-apiclient-python
pylitterbot
dateparser
aionut
nextcloudmonitor
ollama
pynecil
aiopyarr
pysabnzbd
getmac
zigpy
bellows # For Zigbee EmberZNet-based adapters
zigpy-xbee # For XBee adapters
zigpy-deconz # For ConBee/RaspBee adapters
pyicloud # iCloud
pyatv # Apple TV
opencv-python
face-recognition
ibeacon-ble
gehomesdk
onedrive-personal-sdk
python-roborock
pkgs.${namespace}.python-steam
apple-weatherkit
samsungctl
samsungtvws
aiohomekit
icmplib
aioelectricitymaps
wyoming
pysmartthings
wakeonlan
ephem
];
icmplib
aioelectricitymaps
wyoming
pysmartthings
wakeonlan
ephem
];
config = { config = {
# Includes dependencies for a basic setup # Includes dependencies for a basic setup
# https://www.home-assistant.io/integrations/default_config/ # https://www.home-assistant.io/integrations/default_config/
default_config = {}; default_config = { };
cloud = false; cloud = false;
frontend = { frontend = {
themes = "!include_dir_merge_named themes"; themes = "!include_dir_merge_named themes";
}; };
@@ -226,7 +220,7 @@ in
trusted_proxies = [ trusted_proxies = [
"172.30.33.0/24" "172.30.33.0/24"
"10.0.1.4" "10.0.1.4"
"10.0.4.2" "10.0.1.3"
"10.0.1.18" "10.0.1.18"
"10.0.1.0/24" "10.0.1.0/24"
]; ];
@@ -244,6 +238,43 @@ in
# https://www.home-assistant.io/integrations/ota_updater/ # https://www.home-assistant.io/integrations/ota_updater/
zha.zigpy_config.ota.z2m_remote_index = "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/index.json"; zha.zigpy_config.ota.z2m_remote_index = "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/index.json";
openhasp = {
plate = {
objects = [
{
obj = "p0b1"; # temperature label on all pages
properties = {
"text" = ''{{ states("sensor.thermostat_current_temperature") }}°F'';
};
}
{
obj = "p1b2"; # light-switch toggle button
properties = {
"val" = ''{{ 1 if states("light.living_room_lights") == "on" else 0 }}'';
"text" = ''{{ "\uE6E8" if is_state("light.living_room_lights", "on") else "\uE335" | e }}'';
};
event = {
"up" = {
service = "homeassistant.toggle";
entity_id = "light.living_room_lights";
};
};
}
{
obj = "p1b3"; # dropdown
event = {
"changed" = {
service = "persistent_notification.create";
data = {
message = "I like {{ text }}";
};
};
};
}
];
};
};
}; };
}; };
@@ -262,10 +293,12 @@ in
postgresql = { postgresql = {
enable = true; enable = true;
ensureDatabases = [ "hass" ]; ensureDatabases = [ "hass" ];
ensureUsers = [{ ensureUsers = [
name = "hass"; {
ensureDBOwnership = true; name = "hass";
}]; ensureDBOwnership = true;
}
];
}; };
# Enable and configure Mosquitto MQTT broker # Enable and configure Mosquitto MQTT broker
@@ -303,7 +336,7 @@ in
permit_join = true; permit_join = true;
# Web interface # Web interface
frontend = { frontend = {
port = zigbee2mqttPort; # Choose an available port port = zigbee2mqttPort; # Choose an available port
}; };
# MQTT configuration # MQTT configuration
mqtt = { mqtt = {
@@ -380,24 +413,24 @@ in
}; };
# Enable required hardware support for the Zigbee adapter # Enable required hardware support for the Zigbee adapter
hardware.bluetooth.enable = true; # Some adapters use Bluetooth hardware.bluetooth.enable = true; # Some adapters use Bluetooth
# Ensure proper permissions for Zigbee USB devices # Ensure proper permissions for Zigbee USB devices
# services.udev.extraRules = '' # services.udev.extraRules = ''
# # For CC2531, CC2530, CC1352P-2, CC2538 and similar adapters # # For CC2531, CC2530, CC1352P-2, CC2538 and similar adapters
# SUBSYSTEM=="tty", ATTRS{idVendor}=="0451", ATTRS{idProduct}=="16a8", SYMLINK+="zigbee", MODE="0666" # SUBSYSTEM=="tty", ATTRS{idVendor}=="0451", ATTRS{idProduct}=="16a8", SYMLINK+="zigbee", MODE="0666"
# SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="zigbee", MODE="0666" # SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="zigbee", MODE="0666"
# # For ConBee/RaspBee by Dresden Elektronik # # For ConBee/RaspBee by Dresden Elektronik
# SUBSYSTEM=="tty", ATTRS{idVendor}=="1cf1", ATTRS{idProduct}=="0030", SYMLINK+="zigbee", MODE="0666" # SUBSYSTEM=="tty", ATTRS{idVendor}=="1cf1", ATTRS{idProduct}=="0030", SYMLINK+="zigbee", MODE="0666"
# # For Electrolama zig-a-zig-ah (zzh!) # # For Electrolama zig-a-zig-ah (zzh!)
# SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="zigbee", MODE="0666" # SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="zigbee", MODE="0666"
# ''; # '';
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
mosquitto # MQTT command-line tools mosquitto # MQTT command-line tools
usbutils # For lsusb to help identify your adapter usbutils # For lsusb to help identify your adapter
]; ];
networking.firewall.allowedTCPPorts = [ networking.firewall.allowedTCPPorts = [

View File

@@ -4,4 +4,4 @@ with lib;
options.${namespace}.services.home-assistant = { options.${namespace}.services.home-assistant = {
enable = mkEnableOption "enable home-assistant"; enable = mkEnableOption "enable home-assistant";
}; };
} }

View File

@@ -1,4 +1,9 @@
{ config, lib, namespace, ... }: {
config,
lib,
namespace,
...
}:
with lib; with lib;
let let
cfg = config.${namespace}.services.immich; cfg = config.${namespace}.services.immich;
@@ -8,7 +13,7 @@ let
dbPassword = config.sops.secrets."jallen-nas/immich/db-password".path; dbPassword = config.sops.secrets."jallen-nas/immich/db-password".path;
in in
{ {
imports = [ ./options.nix ]; imports = [ ./options.nix ];
config = mkIf cfg.enable { config = mkIf cfg.enable {
# Enable immich service # Enable immich service

View File

@@ -4,4 +4,4 @@ with lib;
options.${namespace}.services.immich = { options.${namespace}.services.immich = {
enable = mkEnableOption "enable immich"; enable = mkEnableOption "enable immich";
}; };
} }

View File

@@ -1,73 +1,196 @@
{ ... }:
{ {
# Set up impernance configuration for things like bluetooth config,
# In this configuration with /etc and /var/log being persistent, only directories outside of that need to be done here. See hardware configuration for all mountpoints. lib,
namespace,
...
}:
with lib;
let
cfg = config.${namespace}.impermanence;
in
{
imports = [ ./options.nix ];
environment.persistence."/nix/persist/system" = { config = mkIf cfg.enable {
hideMounts = true; security.sudo.extraConfig = ''
directories = [ # rollback results in sudo lectures after each reboot
"/var/lib/bluetooth" Defaults lecture = never
"/var/lib/iwd" '';
"/var/lib/nixos"
"/var/lib/libvirt" system.activationScripts = {
"/var/lib/waydroid" "var-lib-private-permissions" = {
"/var/lib/systemd/coredump" deps = [ "createPersistentStorageDirs" ];
"/etc/NetworkManager/system-connections" text = ''
"/var/lib/tailscale" mkdir -p /var/lib/private
"/var/lib/homeassistant" chmod 0700 /var/lib/private
"/var/lib/mosquitto" '';
"/var/lib/music-assistant" };
"/var/lib/postgresql" };
"/var/lib/zigbee2mqtt"
boot.initrd.systemd.services.rootfs-cleanup = {
description = "Clean file system root";
wantedBy = [
"initrd.target"
];
after = [
"initrd-root-device.target"
];
before = [
"sysroot.mount"
];
unitConfig.DefaultDependencies = "no";
serviceConfig.Type = "oneshot";
script =
if (hasAttr "/" config.fileSystems) && (config.fileSystems."/".fsType == "btrfs") then
''
# workaround for machines without working rtc battery
# The time may not yet be correctly set, so wait until it is
if [[ $(date '+%s') -lt 1730469314 ]]; then
sleep 30 # this should hopefully be enough
fi
mkdir /btrfs_tmp
mount ${config.fileSystems."/".device} -t btrfs /btrfs_tmp
if [[ -e /btrfs_tmp/root ]]; then
mkdir -p /btrfs_tmp/old_roots
timestamp=$(date --date="@$(stat -c %X /btrfs_tmp/root)" "+%Y-%m-%d_%H:%M:%S")
mv /btrfs_tmp/root "/btrfs_tmp/old_roots/$timestamp"
fi
delete_subvolume_recursively() {
IFS=$'\n'
for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do
delete_subvolume_recursively "/btrfs_tmp/$i"
done
btrfs subvolume delete "$1" || rm -rf "$1"
}
for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -atime +30); do
delete_subvolume_recursively "$i"
done
btrfs subvolume create /btrfs_tmp/root
umount /btrfs_tmp
''
else if (hasAttr "/" config.fileSystems) && (config.fileSystems."/".fsType == "bcachefs") then
''
# workaround for machines without working rtc battery
# The time may not yet be correctly set, so wait until it is
if [[ $(date '+%s') -lt 1730469314 ]]; then
sleep 30 # this should hopefully be enough
fi
if [[ -e /root_tmp/root ]]; then
mkdir -p /root_tmp/old_roots
timestamp=$(date --date="@$(stat -c %X /root_tmp/root)" "+%Y-%m-%d_%H:%M:%S")
mv /root_tmp/root "/root_tmp/old_roots/$timestamp"
fi
for i in $(find /root_tmp/old_roots/ -maxdepth 1 -atime +30); do
bcachefs subvolume delete $i
done
bcachefs subvolume create /root_tmp/root
''
else
# For tmpfs or other filesystems, do nothing
"";
};
assertions = [
{ {
directory = "/var/lib/colord"; assertion = hasAttr "/" config.fileSystems;
user = "colord"; message = "To use impermanence, you need to define a root volume";
group = "colord"; }
mode = "u=rwx,g=rx,o=";
{
assertion =
if hasAttr "/" config.fileSystems then
config.fileSystems."/".fsType == "btrfs"
|| config.fileSystems."/".fsType == "bcachefs"
|| config.fileSystems."/".fsType == "tmpfs"
else
false;
message = "rootfs must be btrfs, bcachefs, or tmpfs; not " + config.fileSystems."/".fsType;
}
{
assertion =
if
hasAttr "/" config.fileSystems
&& (config.fileSystems."/".fsType == "btrfs" || config.fileSystems."/".fsType == "bcachefs")
then
any (
t: t == "subvol=root" || t == "subvol=/root" || t == "X-mount.subdir=subvolumes/root"
) config.fileSystems."/".options
else
true;
message = "btrfs or bcachefs rootfs must mount subvolume root";
} }
{ {
directory = "/etc/nix"; assertion = !config.boot.isContainer;
user = "root"; message = "impermanence is not supported in containers";
group = "root";
mode = "u=rwx,g=rx,o=rx";
}
{
directory = "/var/lib/private/authentik/media";
user = "authentik";
group = "authentik";
mode = "u=rwx,g=,o=";
}
{
directory = "/var/lib/private";
mode = "u=rwx,g=rx,o=";
}
{
directory = "/media/nas";
user = "nas-apps";
group = "jallen-nas";
mode = "u=rwx,g=rx,o=rx";
}
{
directory = "/var/lib/crowdsec";
user = "crowdsec";
group = "crowdsec";
mode = "u=rwx,g=rwx,o=rx";
}
{
directory = "/plugins-storage";
user = "traefik";
group = "traefik";
mode = "u=rwx,g=rwx,o=rx";
} }
]; ];
files = [
"/etc/machine-id" environment.persistence.${cfg.persistencePath} = {
]; hideMounts = true;
directories = [
"/var/lib/bluetooth"
"/var/lib/iwd"
"/var/lib/nixos"
"/var/lib/libvirt"
"/var/lib/waydroid"
"/var/lib/systemd/coredump"
"/etc/NetworkManager/system-connections"
"/var/lib/tailscale"
"/var/lib/homeassistant"
"/var/lib/mosquitto"
"/var/lib/music-assistant"
"/var/lib/postgresql"
"/var/lib/zigbee2mqtt"
{
directory = "/var/lib/colord";
user = "colord";
group = "colord";
mode = "u=rwx,g=rx,o=";
}
{
directory = "/etc/nix";
user = "root";
group = "root";
mode = "u=rwx,g=rx,o=rx";
}
{
directory = "/var/lib/private/authentik/media";
user = "authentik";
group = "authentik";
mode = "u=rwx,g=,o=";
}
{
directory = "/var/lib/private";
mode = "u=rwx,g=rx,o=";
}
{
directory = "/media/nas";
user = "nas-apps";
group = "jallen-nas";
mode = "u=rwx,g=rx,o=rx";
}
{
directory = "/var/lib/crowdsec";
user = "crowdsec";
group = "crowdsec";
mode = "u=rwx,g=rwx,o=rx";
}
{
directory = "/plugins-storage";
user = "traefik";
group = "traefik";
mode = "u=rwx,g=rwx,o=rx";
}
];
files = [
"/etc/machine-id"
];
};
}; };
security.sudo.extraConfig = ''
# rollback results in sudo lectures after each reboot
Defaults lecture = never
'';
} }

View File

@@ -0,0 +1,12 @@
{ lib, namespace, ... }:
with lib;
{
options.${namespace}.impermanence = {
enable = mkEnableOption "enable impermanence";
persistencePath = mkOption {
type = types.str;
default = "/nix/persist/system";
description = "Path to the persistence directory";
};
};
}

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