Compare commits

..

126 Commits

Author SHA1 Message Date
a3c8995422 [btrfs] Add role and migrate nix-book 2025-07-29 16:14:29 -07:00
b9bb5d387f [nix-book] Update drive UUID 2025-07-29 15:48:04 -07:00
e3aff80a97 [nix-book] Add beesd 2025-07-29 15:48:04 -07:00
574c8e6482 [nix-book] Update file system type to btrfs 2025-07-29 15:48:04 -07:00
0f59a558cd [nix-book] Add btrfs migration plan 2025-07-29 15:48:04 -07:00
14b7de30f6 [live-usb] Clean up config
Also switched from trying to override the `nixos` user to instead just
installing home-manager _into_ the `nixos` user. It felt a bit like
fighting the tide otherwise.
2025-07-29 15:29:48 -07:00
8b676203e7 [live-usb] Add a build script 2025-07-29 12:15:36 -07:00
beeb7acefd [live-usb] Clean up the configuration 2025-07-29 12:15:25 -07:00
a512d9bc06 [live-usb] Add live-usb machine configuration 2025-07-29 12:01:38 -07:00
cc3d398963 [printing] Ensure Brother printer is found 2025-07-23 19:47:43 -07:00
f757ea7271 [kodi] Add kdeconnect 2025-07-19 14:55:35 -07:00
64149713d2 [home] Add k8s management apps 2025-07-16 22:38:19 -07:00
88b413e0af [nixbook] disable gaming 2025-07-16 18:52:51 -07:00
c5070eb4bf [home] Re-enable openscad-unstable 2025-07-13 12:07:01 -07:00
6b4dc1e6b7 Add CLAUDE.md 2025-07-13 12:06:55 -07:00
aadd8c7b6c [home] Add claude-code 2025-07-13 12:06:46 -07:00
f8d145b495 [secrets] Remove altogether
I'm standardizing on bitwarden and rbw for secrets. No need to build out
a separate secret management system. The complexity of this was just not
worth it for my effectively single-user workflows
2025-07-13 11:08:42 -07:00
9232d46f6a [wixos] Add users role 2025-07-13 11:06:49 -07:00
b2b34fc05f [flake] update 2025-07-13 10:44:00 -07:00
aa4dacb3af Add bootstrap script
Adds a very simple bootstrap script for setting up a new host. I'm not
exactly sure the best way to use this yet. Though I suppose it could be
run with some sort of "curl https://blahblah | bash" shenanigans. That
just seems like it would be about as much effort as just running the
nixos-rebuild command itself from a new host.

In any case though, this worked well for bootstrapping a new wixos
instance. So that was nice.
2025-07-13 10:28:52 -07:00
6dc4d6956a [doom] defer loading gptel
This prevents the rbw auth prompt from appearing until it is actually needed
2025-07-13 10:27:52 -07:00
be83fc566f [wixos] remove deprecated reference 2025-07-13 10:16:31 -07:00
485df44aea [home] Add snapcast 2025-06-07 09:41:39 -07:00
4861128de6 [doom] Add gptel 2025-05-28 18:45:20 -07:00
9fe7cfbbfc [home] Add codex 2025-05-27 19:35:26 -07:00
741e3a67d6 [doom] unset DOOMPROFILE 2025-05-27 19:35:16 -07:00
22254eb1f3 [doom] bump version 2025-05-27 19:02:34 -07:00
79dde1a0fe [flake] update 2025-05-26 11:28:26 -07:00
f4b3c36a4e [openscad] Disable for now 2025-05-26 11:27:27 -07:00
1fa7a2689c [home] Add openscad-unstable 2025-05-26 11:23:56 -07:00
c08c5e2486 [emacs] Remove doom-emacs-unstraightened 2025-05-26 11:23:50 -07:00
ecaa6dcb83 [flake] update 2025-03-16 15:44:01 -07:00
7729ff7434 [desktop] Fix moonlight package 2025-03-16 15:43:54 -07:00
52c110a505 [boxy] Enhance graphics drivers 2025-03-16 15:43:41 -07:00
d5997575df [boxy] Add sddm config 2025-03-16 14:34:19 -07:00
57bc35101e [kodi] Setup extra groups 2025-03-16 14:34:12 -07:00
6b09b1b0bc [desktop] Add moonlight 2025-03-16 14:33:58 -07:00
1851743a21 [desktop] Finish programs refactor 2025-03-16 14:33:44 -07:00
c6d787f9f5 [boxy] Enable bluetooth 2025-03-16 14:33:00 -07:00
f4a8f9d614 [home] Remove nixpkgs config
Need to find some better way of doing this so that it works across
home-manager-only installations as well as nixos home manager module
installations.
2025-03-08 14:46:47 -08:00
1e01d44f2f wip 2025-03-08 14:46:39 -08:00
39dbe6644c [kodi] Add moonlight-embedded 2025-03-07 14:51:39 -08:00
870e1073dc [home] Switch from gpg-agent to gnome-keyring 2025-03-05 13:30:32 -08:00
c1f132026a [home] Remove some accidental non-working update 2025-03-05 13:25:39 -08:00
5650125d7e Add .goosehints 2025-03-05 13:25:08 -08:00
6536213bd0 [home] Remove autoUpgrade
Flakes make this irrelevant
2025-03-05 13:24:51 -08:00
a0ce3b810e [home] Fix support for non-NixOS systems 2025-03-05 13:24:38 -08:00
abbcfebc97 [doom] Restore 2025-03-05 12:33:45 -08:00
495aba3fef [home] Support standalone home manager 2025-03-05 12:33:32 -08:00
f9bcec74d3 Revert "[audio] Setup squeezelite"
This reverts commit 1d0b3a0367.
2025-03-04 12:50:46 -08:00
97c4d7035c [squeezelite] Disable for now 2025-02-17 12:46:56 -08:00
8abd331619 [home] Add google-cookie-retrieval 2025-02-17 12:44:14 -08:00
aca0afa0dc [flake] Remove z790prors 2025-02-17 12:35:16 -08:00
1d0b3a0367 [audio] Setup squeezelite 2025-02-16 18:41:50 -08:00
50f9defdd5 [wixos] Add audio role 2025-02-16 18:40:07 -08:00
d71d7a1ffb Remove more gaming stuff 2025-02-16 11:21:20 -08:00
ee511f6ab8 [wixos] Get nvidia drivers working I think 2025-02-16 11:21:04 -08:00
e3dd0bdb30 [flake] Update 2025-02-16 11:20:12 -08:00
10300ed10b [desktop] Fix sddm import 2025-02-15 11:54:28 -08:00
8e72ef71d2 [machines] Remove z790prors 2025-02-15 10:24:02 -08:00
d6e031efd0 [desktop] Refactor into multiple components 2025-02-15 10:23:33 -08:00
16fa4a641c Add goosehints 2025-02-15 09:38:14 -08:00
7a5ec23cc5 [home] Add goose (honk) 2025-02-12 19:32:15 -08:00
ff1124fbe6 [doom] Disable unstraightened for now 2025-02-07 07:19:57 -08:00
53088f9536 [wixos] Add desktop role 2025-02-07 07:19:50 -08:00
68c04b43fd [default] Add glances 2025-02-07 07:19:42 -08:00
efbfffbb61 [gaming] Abandon for now 2025-02-07 07:18:09 -08:00
0e1a67b980 [flake] update 2025-02-07 07:17:30 -08:00
7d6e294340 [tmux] Change prefix to M-\ 2025-02-01 12:09:15 -08:00
8690a0289d [tmux] Remove shift+arrow window nav
This was conflicting with operations like manipulating dates in org-mode
2025-02-01 11:29:56 -08:00
e95f56e240 [z790prors] Remove kids accounts 2025-02-01 10:58:49 -08:00
2dffbb0a98 [packages] Use nixpkgs for nextcloud-talk-desktop 2025-02-01 10:58:25 -08:00
2ceaf78825 [default] Disable distributed builds (for now) 2025-01-30 20:37:32 -08:00
e164097f36 Add wixos 2025-01-30 14:17:43 -08:00
d1605e386d [tmux] Update default terminal and keyMode 2025-01-30 14:17:14 -08:00
4a41533ba8 [z790prors] Use local time for hardware clock 2025-01-03 13:50:51 -08:00
9d45449fce [desktop] Add ghostty 2025-01-03 13:40:09 -08:00
877bc2c739 [flake] update 2025-01-03 13:39:29 -08:00
cd6e028142 [z790prors] Support evil partition and OS 2025-01-03 12:24:18 -08:00
421b27f76f [modrinth] Remove modrinth 2025-01-03 12:18:51 -08:00
1f4a72d28c [tmux] Add tmux 2025-01-03 12:13:17 -08:00
a8f19af989 [nix-book] Compress swap 2025-01-03 10:44:51 -08:00
d4b0fe5b9e [emacs] Add org/projects agenda directory 2025-01-01 15:27:35 -08:00
09cff42222 [desktop] Add blender 2024-12-24 12:39:05 -08:00
0183e7c823 [default] Add tree 2024-12-22 08:40:01 -08:00
29cdd1e239 [desktop] Add bambu-studio 2024-12-22 08:39:06 -08:00
7ced8f11ba [hyprland] Remove completely 2024-12-16 12:15:32 -08:00
244b7c0888 [flake] Remove references to chaotic 2024-12-16 11:52:56 -08:00
80744bcbf1 [flake] update 2024-12-16 11:51:54 -08:00
56d03f4228 [desktop] Fix formatting 2024-12-16 11:51:54 -08:00
32d0c7fa5a [home] Set ENABLE_GAMESCOPE_WSI 2024-12-16 11:51:54 -08:00
1c2aae93b7 [desktop] Don't autostart sunshine 2024-12-16 11:51:54 -08:00
0ab6562694 [desktop] Add vulkan HDR layer, disabled 2024-12-16 11:51:49 -08:00
986ee06a46 [z790prors] Use latest kernel and nvidia driver 2024-12-16 11:51:05 -08:00
34abaeeec9 [users] Add video group 2024-12-16 11:51:05 -08:00
11638cfa1b [modrinth-nvidia] Install java versions 2024-12-16 11:51:05 -08:00
1ce431b0e5 [emacs] Use external module for doom config 2024-12-16 11:51:05 -08:00
98ef9b1443 [modrinth-nvidia] Fix build from update 2024-12-16 11:51:05 -08:00
4c779663df [nextcloud-talk-desktop] Update to 0.39.0 2024-12-16 11:51:05 -08:00
e2bb87fcf1 [emacs] Update nerd-fonts usage
This was changed in a new version of nix
2024-12-16 11:51:05 -08:00
ef47c5dc9a [flake] update 2024-12-16 11:51:05 -08:00
7da089daa3 [desktop] Add a waylandOnly option 2024-12-14 15:38:46 -08:00
8134d7cb33 [desktop] modrinth-nvidia for x11 only 2024-12-14 15:29:35 -08:00
24f1a64f3c [desktop] Add custom package modrinth-nvidia 2024-12-05 21:00:42 -08:00
19531074ca [desktop] Add modrinth-app 2024-12-05 19:59:46 -08:00
a30c130f21 [flake] update 2024-11-28 12:04:44 -08:00
e088ee2dc8 [desktop] Add protonup 2024-11-28 12:02:56 -08:00
366a7e2ea3 [plasma-manager] Dark theme 2024-11-28 12:02:37 -08:00
9116e44dfe [plasma-manager] Enable mouse acceleration 2024-11-14 14:43:16 -08:00
e3ef710bdb [default] Add some common utils 2024-11-12 08:01:49 -08:00
e1a804cfed [plasma-manager] Update comments 2024-11-10 10:29:17 -08:00
ec59936012 [defaults] Disable systemd emergency mode 2024-11-09 15:11:45 -08:00
844d17a855 [z790prors] Remove arch mount point
I had to boot into emergency mode and use systemd runtime masking:

```
systemd mask --runtime arch.mount
```

This allowed the system to boot so that I could remove this entry and
run nixos-rebuild
2024-11-09 15:09:04 -08:00
b19dc65c6d [emacs] Upgrade doom 2024-11-09 13:51:25 -08:00
6db2c78e0b [emacs] Disable auto nix lsp
Especially on underpowered devices, my monolithic nixos config grinds
everything to a halt. I'll just manually enable this when the context
makes sense.
2024-11-03 11:11:23 -08:00
475aafa33e [kde] Remove polonium
Polonium has been frustrating to use. I'm unsure how much of this I can
blame polonium vs kde vs plasma-manager vs nix, but
1. keyboard shortcuts aren't working
2. tiling keeps going in and out for various windows
3. seemingly kde startup time takes forever with it installed

The more I'm starting to understand KDE's native window management
functions, the more I'm thinking that's the right way to go. I'm going
to abandom polonium for now, perhaps with some future return.
2024-11-03 11:08:03 -08:00
09562f0af9 [flake] update 2024-11-03 11:01:07 -08:00
ae543d9628 Revert "[spotifyd] Update to lean in on pulseaudio"
This reverts commit b9097e91d5.
2024-11-03 09:50:08 -08:00
c7716d2bca Revert "[audio] Switch to pulseaudio"
This reverts commit abf8fe9ad2.
2024-11-03 09:49:09 -08:00
54cf339d52 [plasma-manager] Update desktop switching shortcuts 2024-11-03 09:41:04 -08:00
b9097e91d5 [spotifyd] Update to lean in on pulseaudio 2024-10-21 12:31:36 -07:00
abf8fe9ad2 [audio] Switch to pulseaudio
This is an attempt to get spotifyd running as a system user working
2024-10-21 12:31:36 -07:00
926b47f07f [flake] update 2024-10-21 08:43:05 -07:00
749ef988f1 [z790prors] Enable HDR in plasma 6.2 2024-10-21 08:42:46 -07:00
dfa91d327f [nix] Enable automatic gc 2024-10-21 08:42:26 -07:00
37c455d75e [plasma-manager] Some shortcut improvements 2024-10-21 08:42:02 -07:00
50 changed files with 1267 additions and 805 deletions

21
.goosehints Normal file
View File

@@ -0,0 +1,21 @@
NixOS Configurations Repository
================================
Overview:
---------
This repository hosts modular and reproducible NixOS configurations managed via Nix flakes. It is structured to separate concerns across machine-specific setups, common roles, and custom packages.
Directory Structure:
----------------------
• packages/ - Custom Nix packages leveraged across various configurations.
• roles/ - Role-based configurations (e.g., kodi, bluetooth) each with its own module (default.nix) for inclusion in machine setups.
• machines/ - Machine-specific configurations (e.g., nix-book, z790prors, boxy, wixos) including configuration.nix and hardware-configuration.nix tailored for each hardware.
• home/ - Home-manager configurations for personal environments and application settings (e.g., home-nix-book.nix, home-z790prors.nix).
Design Principles:
------------------
• Modularity: Clear separation between roles, machines, and packages allows for flexible and reusable configurations.
• Declarative & Reproducible: Using Nix flakes guarantees a fully declarative setup that can be effortlessly reproduced across systems.
• Scalability: The structure is designed to accommodate adding new roles or machines with minimal disruption to existing configurations.
This file serves as a concise guide for navigating and understanding the repository from an advanced Nix perspective. Further documentation can be found within the respective directories or individual README files where applicable.

View File

@@ -1,11 +0,0 @@
keys:
- &admin_johno age1ls6a033d4p4u8h4rwazjwt8w4c4xg73wq0mdnm64jajxzcz4k9asvjnks3
- &host_z790prors age12l5u7sw59u5pkwp83qm8t3ff7uv0ld2c9k3zh5j4ame9k2szcynqu7ftqe
- &host_nixbook age1fa3zqavfmqk4ssa22yne9td90gyqv9q5a8y0s8jp3xak8q7p3yjqyn7rkg
creation_rules:
- path_regex: secrets/[^/]+\.(yaml|json|env|ini)$
key_groups:
- age:
- *admin_johno
- *host_z790prors
- *host_nixbook

110
CLAUDE.md Normal file
View File

@@ -0,0 +1,110 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Repository Overview
This is a NixOS configuration repository using flakes, managing multiple machines and home-manager configurations. The repository follows a modular architecture with reusable "roles" that can be composed for different machines.
## Architecture
### Flake Structure
- **flake.nix**: Main entry point defining inputs (nixpkgs, home-manager, plasma-manager, etc.) and outputs for multiple NixOS configurations
- **Machines**: `nix-book`, `boxy`, `wixos` (WSL configuration)
- **Home configurations**: Standalone home-manager configuration for user `johno`
### Directory Structure
- `machines/`: Machine-specific configurations with hardware-configuration.nix
- `roles/`: Modular system configurations (audio, bluetooth, desktop, users, etc.)
- `home/`: Home Manager configurations and user-specific modules
- `home/modules/`: User environment modules (emacs, i3+sway, plasma-manager, tmux)
- `packages/`: Custom package definitions
### Role-Based Configuration System
The repository uses a custom "roles" system where each role is a NixOS module with enable options:
- `roles.desktop`: Desktop environment with sub-options for X11, Wayland, KDE, gaming, SDDM
- `roles.audio`: Audio configuration
- `roles.bluetooth`: Bluetooth support
- `roles.users`: User account management
- `roles.virtualisation`: Virtualization setup
- `roles.kodi`: Kodi media center
Example role usage in machine configuration:
```nix
roles = {
audio.enable = true;
desktop = {
enable = true;
gaming = true;
kde = true;
wayland = true;
};
users.enable = true;
};
```
## Common Commands
### Building and Switching Configurations
```bash
# Build and switch to a specific machine configuration
sudo nixos-rebuild switch --flake .#<hostname>
# Build without switching
nixos-rebuild build --flake .#<hostname>
# Build home-manager configuration only
home-manager switch --flake .#johno
```
### Available Machine Configurations
- `nix-book`: Uses `home/home-nix-book.nix`
- `boxy`: Gaming desktop with AMD GPU, uses `home/home.nix`
- `wixos`: WSL configuration, uses `home/home.nix`
### Flake Operations
```bash
# Update flake inputs
nix flake update
# Check flake
nix flake check
# Show flake info
nix flake show
```
### Bootstrap New Machine
Use the provided bootstrap script:
```bash
sudo ./bootstrap.sh <hostname>
```
This script pulls from the remote git repository and applies the configuration.
## Development Workflow
### Adding New Machines
1. Create new directory in `machines/<hostname>/`
2. Add `configuration.nix` with role assignments
3. Include hardware-configuration.nix (generated by nixos-generate-config)
4. Add nixosConfiguration to flake.nix outputs
### Adding New Roles
1. Create directory in `roles/<role-name>/`
2. Create `default.nix` with module definition using mkEnableOption
3. Add role import to `roles/default.nix`
4. Configure role options in machine configurations
### Home Manager Modules
- Located in `home/modules/`
- Each module has its own `default.nix`
- Imported in main home configuration files
## Key Configuration Details
- **Experimental features**: nix-command and flakes are enabled
- **User**: Primary user is `johno` with trusted-user privileges
- **Locale**: en_US.UTF-8, America/Los_Angeles timezone
- **SSH**: OpenSSH enabled on all configurations
- **Garbage collection**: Automatic, deletes older than 10 days
- **Unfree packages**: Allowed globally

11
bootstrap.sh Executable file
View File

@@ -0,0 +1,11 @@
#!/usr/bin/env bash
# bootstrap.sh
# Usage: sudo ./bootstrap.sh <hostname>
set -euo pipefail
NEW_HOSTNAME="${1:?missing hostname}"
FLAKE_URI="git+https://git.johnogle.info/johno/nixos-configs.git#${NEW_HOSTNAME}"
export NIX_CONFIG="experimental-features = nix-command flakes"
nixos-rebuild switch --flake "$FLAKE_URI"

19
build-liveusb.sh Executable file
View File

@@ -0,0 +1,19 @@
#!/usr/bin/env bash
# Build Live USB ISO from flake configuration
# Creates an uncompressed ISO suitable for Ventoy and other USB boot tools
set -e
echo "Building Live USB ISO..."
nix build .#nixosConfigurations.live-usb.config.system.build.isoImage --show-trace
if [ -f "./result/iso/"*.iso ]; then
iso_file=$(ls ./result/iso/*.iso)
echo "✅ Build complete!"
echo "📁 ISO location: $iso_file"
echo "💾 Ready for Ventoy or dd to USB"
else
echo "❌ Build failed - no ISO file found"
exit 1
fi

120
flake.lock generated
View File

@@ -1,5 +1,41 @@
{ {
"nodes": { "nodes": {
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1747046372,
"narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"google-cookie-retrieval": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1752428473,
"narHash": "sha256-IsE7fdAYbRlZuc0H5FtPfhhuHvlxnDGoAxdlnjpVNCU=",
"ref": "refs/heads/main",
"rev": "1fad66b55144ab6beaecd900172a21ac3c34dc52",
"revCount": 10,
"type": "git",
"url": "https://git.johnogle.info/johno/google-cookie-retrieval.git"
},
"original": {
"type": "git",
"url": "https://git.johnogle.info/johno/google-cookie-retrieval.git"
}
},
"home-manager": { "home-manager": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
@@ -7,11 +43,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1728041527, "lastModified": 1752402455,
"narHash": "sha256-03liqiJtk9UP7YQHW4r8MduKCK242FQzud8iWvvlK+o=", "narHash": "sha256-mCHfZhQKdTj2JhCFcqfOfa3uKZbwUkPQbd0/zPnhOE8=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "509dbf8d45606b618e9ec3bbe4e936b7c5bc6c1e", "rev": "bf893ad4cbf46610dd1b620c974f824e266cd1df",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -20,34 +56,54 @@
"type": "github" "type": "github"
} }
}, },
"nixos-wsl": {
"inputs": {
"flake-compat": "flake-compat",
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1752199438,
"narHash": "sha256-xSBMmGtq8K4Qv80TMqREmESCAsRLJRHAbFH2T/2Bf1Y=",
"owner": "nix-community",
"repo": "NixOS-WSL",
"rev": "d34d9412556d3a896e294534ccd25f53b6822e80",
"type": "github"
},
"original": {
"owner": "nix-community",
"ref": "main",
"repo": "NixOS-WSL",
"type": "github"
}
},
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1727802920, "lastModified": 1751792365,
"narHash": "sha256-HP89HZOT0ReIbI7IJZJQoJgxvB2Tn28V6XS3MNKnfLs=", "narHash": "sha256-J1kI6oAj25IG4EdVlg2hQz8NZTBNYvIS0l4wpr9KcUo=",
"owner": "nixos", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "27e30d177e57d912d614c88c622dcfdb2e6e6515", "rev": "1fd8bada0b6117e6c7eb54aad5813023eed37ccb",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nixos", "owner": "NixOS",
"ref": "nixos-unstable", "ref": "nixos-unstable",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
}, },
"nixpkgs-stable": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1725762081, "lastModified": 1751984180,
"narHash": "sha256-vNv+aJUW5/YurRy1ocfvs4q/48yVESwlC/yHzjkZSP8=", "narHash": "sha256-LwWRsENAZJKUdD3SpLluwDmdXY9F45ZEgCb0X+xgOL0=",
"owner": "NixOS", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "dc454045f5b5d814e5862a6d057e7bb5c29edc05", "rev": "9807714d6944a957c2e036f84b0ff8caf9930bc0",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "NixOS", "owner": "nixos",
"ref": "release-24.05", "ref": "nixos-unstable",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
@@ -62,11 +118,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1728750492, "lastModified": 1748196248,
"narHash": "sha256-9IHlIsH4gLqQjS2lFbEnsl/ItdqzBBLWLsyXS0k0jf8=", "narHash": "sha256-1iHjsH6/5UOerJEoZKE+Gx1BgAoge/YcnUsOA4wQ/BU=",
"owner": "nix-community", "owner": "nix-community",
"repo": "plasma-manager", "repo": "plasma-manager",
"rev": "c6d4b6f3e0138c08f37d66fcfbcbe37dab08f108", "rev": "b7697abe89967839b273a863a3805345ea54ab56",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -77,31 +133,11 @@
}, },
"root": { "root": {
"inputs": { "inputs": {
"google-cookie-retrieval": "google-cookie-retrieval",
"home-manager": "home-manager", "home-manager": "home-manager",
"nixpkgs": "nixpkgs", "nixos-wsl": "nixos-wsl",
"plasma-manager": "plasma-manager", "nixpkgs": "nixpkgs_2",
"sops-nix": "sops-nix" "plasma-manager": "plasma-manager"
}
},
"sops-nix": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"nixpkgs-stable": "nixpkgs-stable"
},
"locked": {
"lastModified": 1727423009,
"narHash": "sha256-+4B/dQm2EnORIk0k2wV3aHGaE0WXTBjColXjj7qWh10=",
"owner": "Mic92",
"repo": "sops-nix",
"rev": "127a96f49ddc377be6ba76964411bab11ae27803",
"type": "github"
},
"original": {
"owner": "Mic92",
"repo": "sops-nix",
"type": "github"
} }
} }
}, },

View File

@@ -3,11 +3,7 @@
inputs = { inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
nixos-wsl.url = "github:nix-community/NixOS-WSL/main";
sops-nix = {
url = "github:Mic92/sops-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
home-manager = { home-manager = {
url = "github:nix-community/home-manager"; url = "github:nix-community/home-manager";
@@ -19,41 +15,36 @@
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
inputs.home-manager.follows = "home-manager"; inputs.home-manager.follows = "home-manager";
}; };
google-cookie-retrieval = {
url = "git+https://git.johnogle.info/johno/google-cookie-retrieval.git";
inputs.nixpkgs.follows = "nixpkgs";
};
}; };
outputs = { self, nixpkgs, ... } @ inputs: let outputs = { self, nixpkgs, nixos-wsl, ... } @ inputs: let
baseModules = [ baseModules = [
./roles ./roles
inputs.sops-nix.nixosModules.sops
inputs.home-manager.nixosModules.home-manager inputs.home-manager.nixosModules.home-manager
{ {
home-manager.useGlobalPkgs = true; home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true; home-manager.useUserPackages = true;
home-manager.sharedModules = [ inputs.plasma-manager.homeManagerModules.plasma-manager ]; home-manager.sharedModules = [
inputs.plasma-manager.homeManagerModules.plasma-manager
];
home-manager.extraSpecialArgs = {
globalInputs = inputs;
};
} }
]; ];
in { in {
nixosConfigurations.z790prors-nix = nixpkgs.lib.nixosSystem rec {
system = "x86_64-linux";
specialArgs = { inherit inputs; };
modules = baseModules ++ [
./machines/z790prors/configuration.nix
{
home-manager.users.johno = import ./home/home-z790prors.nix;
home-manager.extraSpecialArgs.customPkgs =
nixpkgs.legacyPackages."${system}".callPackage ./packages {};
}
];
};
nixosConfigurations.nix-book = nixpkgs.lib.nixosSystem rec { nixosConfigurations.nix-book = nixpkgs.lib.nixosSystem rec {
system = "x86_64-linux"; system = "x86_64-linux";
modules = baseModules ++ [ modules = baseModules ++ [
./machines/nix-book/configuration.nix ./machines/nix-book/configuration.nix
{ {
home-manager.users.johno = import ./home/home-nix-book.nix; home-manager.users.johno = import ./home/home-nix-book.nix;
home-manager.extraSpecialArgs.customPkgs = home-manager.extraSpecialArgs = { inherit system; };
nixpkgs.legacyPackages."${system}".callPackage ./packages {};
} }
]; ];
}; };
@@ -64,11 +55,51 @@
./machines/boxy/configuration.nix ./machines/boxy/configuration.nix
inputs.home-manager.nixosModules.home-manager inputs.home-manager.nixosModules.home-manager
{ {
home-manager.users.johno = import ./home/home-default.nix; home-manager.users.johno = import ./home/home.nix;
home-manager.extraSpecialArgs.customPkgs = home-manager.extraSpecialArgs = { inherit system; };
nixpkgs.legacyPackages."${system}".callPackage ./packages {};
} }
]; ];
}; };
nixosConfigurations.wixos = nixpkgs.lib.nixosSystem rec {
system = "x86_64-linux";
modules = baseModules ++ [
nixos-wsl.nixosModules.default
./machines/wixos/configuration.nix
inputs.home-manager.nixosModules.home-manager
{
home-manager.users.johno = import ./home/home.nix;
home-manager.extraSpecialArgs = { inherit system; };
}
];
};
# Live USB ISO configuration
nixosConfigurations.live-usb = nixpkgs.lib.nixosSystem rec {
system = "x86_64-linux";
modules = baseModules ++ [
./machines/live-usb/configuration.nix
{
home-manager.users.nixos = { ... }: {
imports = [ ./home/home.nix ];
home.username = nixpkgs.lib.mkForce "nixos";
home.homeDirectory = nixpkgs.lib.mkForce "/home/nixos";
};
home-manager.extraSpecialArgs = { inherit system; };
}
];
};
homeConfigurations."johno" = inputs.home-manager.lib.homeManagerConfiguration {
pkgs = inputs.nixpkgs.legacyPackages."x86_64-linux";
modules = [
inputs.plasma-manager.homeManagerModules.plasma-manager
./home/home.nix
];
extraSpecialArgs = {
system = "x86_64-linux";
globalInputs = inputs;
};
};
}; };
} }

View File

@@ -2,8 +2,7 @@
{ {
imports = [ imports = [
./home-default.nix ./home.nix
./modules/hyprland/nix-book.nix
]; ];
home.i3_sway.extraSwayConfig = { home.i3_sway.extraSwayConfig = {

View File

@@ -1,8 +0,0 @@
{ config, lib, pkgs, ... }:
{
imports = [
./home-default.nix
./modules/hyprland/z790prors.nix
];
}

View File

@@ -1,5 +1,8 @@
{ pkgs, customPkgs, ... }: { pkgs, customPkgs, globalInputs, system, ... }:
let
customPkgs = pkgs.callPackage ../packages {};
in
{ {
# Home Manager needs a bit of information about you and the paths it should # Home Manager needs a bit of information about you and the paths it should
# manage. # manage.
@@ -36,10 +39,13 @@
# '') # '')
pkgs.bitwarden pkgs.bitwarden
pkgs.claude-code
pkgs.codex
pkgs.dunst pkgs.dunst
pkgs.element-desktop pkgs.element-desktop
pkgs.fd pkgs.fd
#pkgs.fluffychat # security vulnerability in current version #pkgs.fluffychat # security vulnerability in current version
pkgs.goose-cli
pkgs.gzip pkgs.gzip
pkgs.htop pkgs.htop
pkgs.jellyfin-media-player pkgs.jellyfin-media-player
@@ -49,17 +55,24 @@
pkgs.less pkgs.less
pkgs.moonlight-qt pkgs.moonlight-qt
pkgs.ncdu pkgs.ncdu
pkgs.nextcloud-talk-desktop
pkgs.openscad-unstable
pkgs.pandoc pkgs.pandoc
pkgs.pinentry-qt #pkgs.pinentry-qt
#pkgs.pytest #pkgs.pytest
pkgs.shellcheck pkgs.shellcheck
pkgs.solaar # Logitech management software pkgs.solaar # Logitech management software
(pkgs.snapcast.override { pulseaudioSupport = true; })
pkgs.tmux pkgs.tmux
pkgs.waybar pkgs.waybar
pkgs.wofi pkgs.wofi
pkgs.vlc pkgs.vlc
customPkgs.nextcloudTalkDesktop ## Kubernetes cluster management
pkgs.kubectl
pkgs.kubernetes-helm
globalInputs.google-cookie-retrieval.packages.${system}.default
]; ];
# Home Manager is pretty good at managing dotfiles. The primary way to manage # Home Manager is pretty good at managing dotfiles. The primary way to manage
@@ -75,9 +88,10 @@
# org.gradle.console=verbose # org.gradle.console=verbose
# org.gradle.daemon.idletimeout=3600000 # org.gradle.daemon.idletimeout=3600000
# ''; # '';
}; };
targets.genericLinux.enable = true;
# Home Manager can also manage your environment variables through # Home Manager can also manage your environment variables through
# 'home.sessionVariables'. These will be explicitly sourced when using a # 'home.sessionVariables'. These will be explicitly sourced when using a
# shell provided by Home Manager. If you don't want to manage your shell # shell provided by Home Manager. If you don't want to manage your shell
@@ -100,21 +114,22 @@
home.sessionPath = [ home.sessionPath = [
]; ];
nixpkgs.config.allowUnfree = true;
imports = [ imports = [
./modules/emacs ./modules/emacs
./modules/i3+sway ./modules/i3+sway
./modules/lutris
./modules/plasma-manager ./modules/plasma-manager
./modules/tmux
]; ];
programs.bash.enable = true; programs.bash = {
enable = true;
nix = { initExtra = ''
gc = { codex() {
automatic = true; local key
}; key="$(rbw get openai-api-key-codex)"
OPENAI_API_KEY="$key" command codex "$@"
}
'';
}; };
# Let Home Manager install and manage itself. # Let Home Manager install and manage itself.
@@ -135,15 +150,6 @@
}; };
}; };
programs.gpg.enable = true;
services.gpg-agent = {
enable = true;
enableSshSupport = true;
defaultCacheTtl = 1800;
pinentryPackage = pkgs.pinentry-qt;
};
programs.jq.enable = true; programs.jq.enable = true;
programs.k9s.enable = true; programs.k9s.enable = true;
@@ -176,17 +182,16 @@
}; };
}; };
services.home-manager.autoUpgrade = {
enable = true;
frequency = "weekly";
};
services.kdeconnect = { services.kdeconnect = {
enable = true; enable = true;
indicator = true; indicator = true;
package = pkgs.kdePackages.kdeconnect-kde; package = pkgs.kdePackages.kdeconnect-kde;
}; };
services.gnome-keyring = {
enable = true;
};
services.syncthing = { services.syncthing = {
enable = true; enable = true;
tray = { tray = {

View File

@@ -3,20 +3,25 @@
with lib; with lib;
let let
doomSync = (let doomEmacs = pkgs.fetchFromGitHub {
git = pkgs.git; owner = "doomemacs";
in '' repo = "doomemacs";
export PATH=${pkgs.emacs}/bin:${git}/bin:$PATH rev = "8406c1ff22b95bd0f816de4a0223fa3ce3c82568";
${config.xdg.configHome}/emacs/bin/doom sync -u -j $((`nproc`/4*3)) sha256 = "sha256-rOkgOdmLESVAbOeEM9nJTzxyI+akdk48Ed2VlktOy3Q=";
''); };
in { in
{
config = { config = {
home.packages = [ home.packages = [
pkgs.emacs
pkgs.emacs-all-the-icons-fonts pkgs.emacs-all-the-icons-fonts
pkgs.fira-code
pkgs.fontconfig pkgs.fontconfig
pkgs.graphviz pkgs.graphviz
pkgs.isort pkgs.isort
pkgs.nerdfonts pkgs.nerd-fonts.fira-code
pkgs.nerd-fonts.droid-sans-mono
pkgs.nil # nix lsp language server pkgs.nil # nix lsp language server
pkgs.nixfmt-rfc-style pkgs.nixfmt-rfc-style
(pkgs.ripgrep.override {withPCRE2 = true;}) (pkgs.ripgrep.override {withPCRE2 = true;})
@@ -27,41 +32,16 @@ in {
fonts.fontconfig.enable = true; fonts.fontconfig.enable = true;
home.file = { home.file."${config.xdg.configHome}/emacs".source = doomEmacs;
".config/emacs" = {
source = fetchGit {
url = "https://github.com/doomemacs/doomemacs.git";
# When updating me, remember to run `doom sync`
rev = "5ad99220b86ae1bf421861dfad24492d768ac4d9";
};
# We need to use recursive mode here or else doom fails to sync for
# some reason related to the permissions on the synced path. I'm not
# quite sure of everything that's going on here.
recursive = true;
# Because `recursive = true` will cause this to sync every single
# activation, we turn this off here.
#
# There's probably a way we could do better detection of this within
# our onChange shell?
#
# onChange = doomSync;
};
};
home.sessionVariables = {
DOOMLOCALDIR = "${config.xdg.dataHome}/doom";
EDITOR = "emacs -nw";
};
home.sessionPath = [ home.sessionPath = [
"${config.xdg.configHome}/emacs/bin" "${config.xdg.configHome}/emacs/bin"
]; ];
xdg.configFile."doom" = { home.sessionVariables = {
source = ./doom; DOOMDIR = "${config.xdg.configHome}/doom";
# Sync doom if we updated the config DOOMLOCALDIR = "${config.xdg.dataHome}/doom";
onChange = doomSync;
}; };
home.file."${config.xdg.configHome}/doom".source = ./doom;
}; };
} }

View File

@@ -28,6 +28,7 @@
;; up, `M-x eval-region' to execute elisp code, and 'M-x doom/reload-font' to ;; up, `M-x eval-region' to execute elisp code, and 'M-x doom/reload-font' to
;; refresh your font settings. If Emacs still can't find your font, it likely ;; refresh your font settings. If Emacs still can't find your font, it likely
;; wasn't installed correctly. Font issues are rarely Doom issues! ;; wasn't installed correctly. Font issues are rarely Doom issues!
(setq doom-font (font-spec :family "Fira Code"))
;; There are two ways to load a theme. Both assume the theme is installed and ;; There are two ways to load a theme. Both assume the theme is installed and
;; available. You can either set `doom-theme' or manually load a theme with the ;; available. You can either set `doom-theme' or manually load a theme with the
@@ -43,7 +44,11 @@
(setq org-directory "~/org/") (setq org-directory "~/org/")
(after! org (after! org
(setq org-agenda-span 'week (setq org-agenda-span 'week
org-agenda-files `(,org-directory ,(concat org-directory "roam/")) my-agenda-dirs '("projects" "roam")
org-agenda-files (cons org-directory (mapcan (lambda (x) (directory-files-recursively
(expand-file-name x org-directory)
"\.org$"))
my-agenda-dirs))
org-log-done 'time org-log-done 'time
org-agenda-custom-commands '(("n" "Agenda" org-agenda-custom-commands '(("n" "Agenda"
((agenda "") ((agenda "")
@@ -67,6 +72,16 @@
;; org-caldav-files nil ;; org-caldav-files nil
;; org-caldav-sync-direction 'cal->org)) ;; org-caldav-sync-direction 'cal->org))
(defun my/get-rbw-password (alias)
"Return the password for ALIAS via rbw, unlocking the vault only if needed."
(let* ((cmd (format "rbw get %s 2>&1" alias))
(output (shell-command-to-string cmd)))
(string-trim output)))
(use-package! gptel
:defer t
:config
(setq! gptel-api-key (my/get-rbw-password "openai-api-key-chatgpt-el")))
;; Whenever you reconfigure a package, make sure to wrap your config in an ;; Whenever you reconfigure a package, make sure to wrap your config in an
;; `after!' block, otherwise Doom's defaults may override your settings. E.g. ;; `after!' block, otherwise Doom's defaults may override your settings. E.g.

View File

@@ -108,7 +108,7 @@
:os :os
(:if (featurep :system 'macos) macos) ; improve compatibility with macOS (:if (featurep :system 'macos) macos) ; improve compatibility with macOS
;;tty ; improve the terminal Emacs experience tty ; improve the terminal Emacs experience
:lang :lang
;;agda ; types of types of types of types... ;;agda ; types of types of types of types...
@@ -149,7 +149,7 @@
;;lua ; one-based indices? one-based indices ;;lua ; one-based indices? one-based indices
markdown ; writing docs for people to ignore markdown ; writing docs for people to ignore
;;nim ; python + lisp at the speed of c ;;nim ; python + lisp at the speed of c
(nix +tree-sitter +lsp) ; I hereby declare "nix geht mehr!" (nix +tree-sitter) ; I hereby declare "nix geht mehr!"
;;ocaml ; an objective camel ;;ocaml ; an objective camel
(org +roam2) ; organize your plain life in plain text (org +roam2) ; organize your plain life in plain text
;;php ; perl's insecure younger brother ;;php ; perl's insecure younger brother

View File

@@ -50,3 +50,5 @@
;; (unpin! t) ;; (unpin! t)
;; (package! org-caldav) ;; (package! org-caldav)
(package! gptel :recipe (:nonrecursive t))

View File

@@ -1,94 +0,0 @@
{ inputs, ... }:
{
imports = [
./hyprpaper.nix
];
wayland.windowManager.hyprland = {
enable = true;
plugins = [ inputs.hy3.packages.x86_64-linux.hy3 ];
settings = {
"$mod" = "SUPER";
"$terminal" = "kitty";
"$fileManager" = "dolphin";
"$menu" = "wofi --show drun";
exec-once = [
"waybar"
"dunst"
];
xwayland = {
force_zero_scaling = true;
};
input = {
kb_layout = "us";
kb_options = "caps:escape";
follow_mouse = 1;
touchpad.natural_scroll = false;
};
windowrulev2 = [
# I can guess, but I should figure out what this actually does
"suppressevent maximize, class:.*"
];
general.layout = "hy3";
bind =
[
"SHIFT_$mod, Q, killactive"
"SHIFT_$mod, M, exit"
"$mod, D, exec, $menu"
"$mod, Return, exec, $terminal"
"$mod, H, hy3:movefocus, l"
"$mod, L, hy3:movefocus, r"
"$mod, K, hy3:movefocus, u"
"$mod, J, hy3:movefocus, d"
"SHIFT_$mod, H, hy3:movewindow, l"
"SHIFT_$mod, L, hy3:movewindow, r"
"SHIFT_$mod, K, hy3:movewindow, u"
"SHIFT_$mod, J, hy3:movewindow, d"
"$mod, V, hy3:makegroup, opposite"
"$mod, W, hy3:changegroup, toggletab"
"$mod, A, hy3:changefocus, raise"
"SHIFT_$mod, A, hy3:changefocus, lower"
"$mod, M, fullscreen, 0"
"$mod, E, hy3:expand, expand"
"SHIFT_$mod, E, hy3:expand, base"
"$mod, Q, hy3:warpcursor"
]
++ (
# workspaces
# binds $mod + [shift +] {1..10} to [move to] workspace {1..10}
builtins.concatLists (builtins.genList (
x: let
ws = let
c = (x + 1) / 10;
in
builtins.toString (x + 1 - (c * 10));
in [
"$mod, ${ws}, workspace, ${toString (x + 1)}"
"$mod SHIFT, ${ws}, hy3:movetoworkspace, ${toString (x + 1)}"
]
)
10)
);
bindm =
[
"$mod, mouse:272, movewindow"
"$mod, mouse:273, resizewindow"
];
};
};
}

View File

@@ -1,21 +0,0 @@
{ config, lib, pkgs, ... }:
{
services.hyprpaper = {
enable = true;
settings = {
ipc = "on";
splash = false;
preload = [
"${config.xdg.dataHome}/wallpaper.jpg"
];
wallpaper = [
",${config.xdg.dataHome}/wallpaper.jpg"
];
};
};
xdg.dataFile."wallpaper.jpg" = {
source = ./wallpaper.jpg;
};
}

View File

@@ -1,5 +0,0 @@
{ config, lib, pkgs, ... }:
{
wayland.windowManager.hyprland.settings.monitor = ",preferred,2880x1800@90.00Hz,1.33333";
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 842 KiB

View File

@@ -1,16 +0,0 @@
{ config, lib, pkgs, ... }:
{
wayland.windowManager.hyprland.settings.monitor = "DP-1,3440x1440@164.90,0x0,1.33333,vrr,1";
wayland.windowManager.hyprland.settings.env = [
"LIBVA_DRIVER_NAME,nvidia"
"XDG_SESSION_TYPE,wayland"
"GBM_BACKEND,nvidia-drm"
"__GLX_VENDOR_LIBRARY_NAME,nvidia"
"NVD_BACKEND,direct"
"ELECTRON_OZONE_PLATFORM_HINT,auto"
"NIXOS_OZONE_WL,1"
];
wayland.windowManager.hyprland.settings.cursor.no_hardware_cursors = true;
}

View File

@@ -1,9 +0,0 @@
{ config, lib, pkgs, ... }:
{
home.packages = [
pkgs.gamescope
pkgs.lutris
pkgs.mangohud
];
}

View File

@@ -1,30 +1,21 @@
{ config, lib, pkgs, ... }: { config, lib, pkgs, ... }:
# The following can be generated with the command: # The current KDE config can be output with the command:
# nix run github:nix-community/plasma-manager # nix run github:nix-community/plasma-manager
# #
# Plasma-manager options documentation # Plasma-manager options documentation
# https://nix-community.github.io/plasma-manager/options.xhtml # https://nix-community.github.io/plasma-manager/options.xhtml
# #
# Polonium usage # TODO: (ambitious) Add Kmail support to plasma-manager
# https://github.com/zeroxoneafour/polonium/blob/master/docs/usage.md
#
# TODO: Extract this configuration into something that's a bit easier to manage
# TODO: Update shortcuts for better window/tiling/desktop management akin to i3wm
# TODO(ambitious): Add Kmail support to plasma-manager
{ {
programs.plasma = { programs.plasma = {
enable = true; enable = true;
overrideConfig = true; overrideConfig = true;
kwin = {
scripts.polonium.enable = true;
};
hotkeys.commands."launch-konsole" = { hotkeys.commands."launch-konsole" = {
name = "Launch Konsole"; name = "Launch Konsole";
key = "Meta+Enter"; key = "Meta+Return";
command = "konsole"; command = "konsole";
}; };
@@ -52,7 +43,7 @@
}; };
ksmserver = { ksmserver = {
"Lock Session" = ["Meta+Ctrl+Q" "Screensaver,Meta+L" "Screensaver,Lock Session"]; "Lock Session" = ["Meta+Ctrl+Q" "Screensaver" "Screensaver,Lock Session"];
}; };
kwin = { kwin = {
@@ -67,46 +58,7 @@
"Activate Window Demanding Attention" = "Meta+Ctrl+A"; "Activate Window Demanding Attention" = "Meta+Ctrl+A";
"PoloniumCycleEngine" = "Meta+|,none,Polonium: Cycle Engine";
"PoloniumFocusAbove" = "Meta+K,none,Polonium: Focus Above";
"PoloniumFocusBelow" = "Meta+J,none,Polonium: Focus Below";
"PoloniumFocusLeft" = "Meta+H,none,Polonium: Focus Left";
"PoloniumFocusRight" = "Meta+L,none,Polonium: Focus Right";
"PoloniumInsertAbove" = "Meta+Shift+K,none,Polonium: Insert Above";
"PoloniumInsertBelow" = "Meta+Shift+J,none,Polonium: Insert Below";
"PoloniumInsertLeft" = "Meta+Shift+H,none,Polonium: Insert Left";
"PoloniumInsertRight" = "Meta+Shift+L,none,Polonium: Insert Right";
"PoloniumOpenSettings" = "Meta+\\\\,none,Polonium: Open Settings Dialog";
"PoloniumResizeAbove" = "Meta+Ctrl+K,none,Polonium: Resize Above";
"PoloniumResizeBelow" = "Meta+Ctrl+J,none,Polonium: Resize Below";
"PoloniumResizeLeft" = "Meta+Ctrl+H,none,Polonium: Resize Left";
"PoloniumResizeRight" = "Meta+Ctrl+L,none,Polonium: Resize Right";
"PoloniumRetileWindow" = "Meta+Shift+Space,none,Polonium: Retile Window";
"PoloniumSwitchBTree" = [ ];
"PoloniumSwitchHalf" = [ ];
"PoloniumSwitchKwin" = [ ];
"PoloniumSwitchMonocle" = [ ];
"PoloniumSwitchThreeColumn" = [ ];
"Show Desktop" = "Meta+D"; "Show Desktop" = "Meta+D";
"Switch to Desktop 1" = "Meta+1,,Switch to Desktop 1";
"Switch to Desktop 2" = "Meta+2,,Switch to Desktop 2";
"Switch to Desktop 3" = "Meta+3,,Switch to Desktop 3";
"Switch to Desktop 4" = "Meta+4,,Switch to Desktop 4";
"Switch to Desktop 5" = "Meta+5,,Switch to Desktop 5";
"Switch to Desktop 6" = "none,,Switch to Desktop 6";
"Switch to Desktop 7" = "none,,Switch to Desktop 7";
"Switch to Desktop 8" = "none,,Switch to Desktop 8";
"Switch to Desktop 9" = "none,,Switch to Desktop 9";
"Window to Desktop 1" = "Meta+!,,Window to Desktop 1";
"Window to Desktop 2" = "Meta+@,,Window to Desktop 2";
"Window to Desktop 3" = "Meta+#,,Window to Desktop 3";
"Window to Desktop 4" = "Meta+$,,Window to Desktop 4";
"Window to Desktop 5" = "Meta+%,,Window to Desktop 5";
"Window to Desktop 6" = "none,,Window to Desktop 6";
"Window to Desktop 7" = "none,,Window to Desktop 7";
"Window to Desktop 8" = "none,,Window to Desktop 8";
"Window to Desktop 9" = "none,,Window to Desktop 9";
"Walk Through Windows" = "Alt+Tab"; "Walk Through Windows" = "Alt+Tab";
"Walk Through Windows (Reverse)" = "Alt+Shift+Tab"; "Walk Through Windows (Reverse)" = "Alt+Shift+Tab";
@@ -137,14 +89,39 @@
"org_kde_powerdevil"."Turn Off Screen" = [ ]; "org_kde_powerdevil"."Turn Off Screen" = [ ];
"org_kde_powerdevil"."powerProfile" = ["Battery" "Meta+B,Battery" "Meta+B,Switch Power Profile"]; "org_kde_powerdevil"."powerProfile" = ["Battery" "Meta+B,Battery" "Meta+B,Switch Power Profile"];
"plasmashell"."activate application launcher" = ["Meta" "Alt+F1,Meta" "Alt+F1,Activate Application Launcher"]; plasmashell = {
"activate application launcher" = ["Meta" "Alt+F1,Meta" "Alt+F1,Activate Application Launcher"];
"activate task manager entry 1" = "none,,";
"activate task manager entry 2" = "none,,";
"activate task manager entry 3" = "none,,";
"activate task manager entry 4" = "none,,";
"activate task manager entry 5" = "none,,";
"activate task manager entry 6" = "none,,";
"activate task manager entry 7" = "none,,";
"activate task manager entry 8" = "none,,";
"activate task manager entry 9" = "none,,";
"activate task manager entry 10" = "none,,";
"show activity switcher" = "none,,";
};
}; };
configFile = { configFile = {
kwinrc.Desktops.Number = { kwinrc.Desktops.Number = {
value = 9; value = 10;
immutable = true; immutable = true;
}; };
kcminputrc.Libinput = {
AccelerationProfile = "adaptive";
PointerAcceleration = 0.5;
};
kcminputrc.Mouse = {
X11LibInputXAccelProfileFlat = false;
XLbInptAccelProfileFlat = false;
};
kdeglobals.KDE.LookAndFeelPackage = "org.kde.breezedark.desktop";
}; };
}; };
} }

View File

@@ -0,0 +1,52 @@
{ config, lib, pkgs, ... }:
let
tokyo-night = pkgs.tmuxPlugins.mkTmuxPlugin {
pluginName = "tokyo-night";
rtpFilePath = "tokyo-night.tmux";
version = "1.6.1";
src = pkgs.fetchFromGitHub {
owner = "janoamaral";
repo = "tokyo-night-tmux";
rev = "d610ced20d5f602a7995854931440e4a1e0ab780";
sha256 = "sha256-17vEgkL7C51p/l5gpT9dkOy0bY9n8l0/LV51mR1k+V8=";
};
};
in
{
programs.tmux.enable = true;
programs.tmux.terminal = "tmux-direct";
programs.tmux.keyMode = "vi";
programs.tmux.escapeTime = 0;
programs.tmux.mouse = true;
programs.tmux.newSession = true;
programs.tmux.historyLimit = 50000;
programs.tmux.clock24 = true;
programs.tmux.baseIndex = 1;
programs.tmux.prefix = "M-\\\\";
programs.tmux.plugins = with pkgs; [
tmuxPlugins.cpu
tmuxPlugins.battery
tmuxPlugins.better-mouse-mode
tmuxPlugins.net-speed
tmuxPlugins.online-status
tmuxPlugins.pain-control
tmuxPlugins.tilish
tmuxPlugins.yank
{
plugin = tmuxPlugins.resurrect;
extraConfig = "set -g @resurrect-strategy-nvim 'session'";
}
{
plugin = tmuxPlugins.continuum;
extraConfig = ''
set -g @continuum-restore 'on'
set -g @continuum-save-interval '15' # minutes
'';
}
tokyo-night
];
}

View File

@@ -2,7 +2,7 @@
# your system. Help is available in the configuration.nix(5) man page, on # your system. Help is available in the configuration.nix(5) man page, on
# https://search.nixos.org/options and in the NixOS manual (`nixos-help`). # https://search.nixos.org/options and in the NixOS manual (`nixos-help`).
{ lib, ... }: { lib, pkgs, ... }:
with lib; with lib;
@@ -14,9 +14,17 @@ with lib;
roles = { roles = {
audio.enable = true; audio.enable = true;
bluetooth.enable = true;
desktop = {
enable = true;
gaming = true;
kde = true;
sddm = true;
wayland = true;
};
kodi = { kodi = {
enable = true; enable = true;
autologin = true; autologin = false;
wayland = true; wayland = true;
}; };
users.enable = true; users.enable = true;
@@ -28,9 +36,15 @@ with lib;
networking.hostName = "boxy"; # Define your hostname. networking.hostName = "boxy"; # Define your hostname.
services.xserver.videoDrivers = [ "amdgpu" ];
hardware.graphics.enable = true; hardware.graphics.enable = true;
hardware.graphics.enable32Bit = true;
services.displayManager.enable = mkForce false; hardware.graphics.extraPackages = with pkgs; [
amdvlk
];
hardware.graphics.extraPackages32 = with pkgs; [
driversi686Linux.amdvlk
];
# This option defines the first version of NixOS you have installed on this particular machine, # This option defines the first version of NixOS you have installed on this particular machine,
# and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions. # and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions.

View File

@@ -9,7 +9,7 @@
]; ];
boot.initrd.availableKernelModules = [ "xhci_pci" "nvme" "thunderbolt" "usb_storage" "usbhid" "sd_mod" ]; boot.initrd.availableKernelModules = [ "xhci_pci" "nvme" "thunderbolt" "usb_storage" "usbhid" "sd_mod" ];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [ "amdgpu" ];
boot.kernelModules = [ "kvm-amd" ]; boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [ ];

View File

@@ -0,0 +1,89 @@
# Live USB ISO configuration for recovery and installation
{ pkgs, modulesPath, ... }:
{
imports = [
# Use minimal installation CD as base
(modulesPath + "/installer/cd-dvd/installation-cd-minimal.nix")
];
# Use roles structure for consistent configuration
roles = {
audio.enable = true;
bluetooth.enable = true;
desktop = {
enable = true;
kde = true;
x11 = true;
wayland = true;
sddm = true;
};
};
# Allow unfree packages for broader hardware support
nixpkgs.config.allowUnfree = true;
# Essential packages for system recovery and installation
environment.systemPackages = with pkgs; [
# Text editors
neovim
nano
# System tools
git
curl
wget
htop
tree
lsof
strace
# Filesystem tools
btrfs-progs
e2fsprogs
xfsprogs
ntfs3g
dosfstools
# Network tools
networkmanager
wirelesstools
# Hardware tools
pciutils
usbutils
smartmontools
# Archive tools
unzip
p7zip
# Development tools (for quick fixes)
gcc
binutils
];
# Enable NetworkManager for easy wifi setup
networking.networkmanager.enable = true;
# Enable SSH daemon for remote access
services.openssh = {
enable = true;
settings = {
PermitRootLogin = "yes";
PasswordAuthentication = true;
};
};
# ISO customization
isoImage = {
volumeID = "NIXOS-LIVE";
};
# Enable some useful services
services.udisks2.enable = true; # For mounting USB drives
# Hardware support
hardware.enableAllFirmware = true;
hardware.enableRedistributableFirmware = true;
}

View File

@@ -12,7 +12,13 @@
roles = { roles = {
audio.enable = true; audio.enable = true;
bluetooth.enable = true; bluetooth.enable = true;
desktop.enable = true; desktop = {
enable = true;
wayland = true;
gaming = false;
kde = true;
sddm = true;
};
nfs-mounts.enable = true; nfs-mounts.enable = true;
printing.enable = true; printing.enable = true;
spotifyd.enable = true; spotifyd.enable = true;
@@ -33,6 +39,7 @@
boot.kernelPackages = pkgs.linuxPackages_latest; boot.kernelPackages = pkgs.linuxPackages_latest;
# Enable networking # Enable networking
networking.networkmanager.enable = true; networking.networkmanager.enable = true;

View File

@@ -10,15 +10,27 @@
boot.initrd.availableKernelModules = [ "xhci_pci" "thunderbolt" "vmd" "nvme" "sdhci_pci" ]; boot.initrd.availableKernelModules = [ "xhci_pci" "thunderbolt" "vmd" "nvme" "sdhci_pci" ];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [ ];
boot.initrd.luks.devices."luks-4126fbd4-bd09-4ece-af0d-6fff414c21b3".device = "/dev/disk/by-uuid/4126fbd4-bd09-4ece-af0d-6fff414c21b3";
boot.kernelModules = [ "kvm-intel" ]; boot.kernelModules = [ "kvm-intel" ];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [ ];
fileSystems."/" = roles.btrfs = {
{ device = "/dev/disk/by-uuid/bd396529-e2c4-47cb-b844-8d6ed841f81a"; enable = true;
fsType = "ext4"; filesystems."/dev/disk/by-uuid/223a44e5-91e2-4272-830e-129166042a1d" = {
mountpoints = {
"/" = {
compression = "zstd";
extraOptions = [ "noatime" ];
};
};
scrub.enable = true;
deduplication = {
enable = true;
hashTableSizeMB = 32;
verbosity = "err";
};
}; };
};
boot.initrd.luks.devices."luks-4126fbd4-bd09-4ece-af0d-6fff414c21b3".device = "/dev/disk/by-uuid/4126fbd4-bd09-4ece-af0d-6fff414c21b3";
fileSystems."/boot" = fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/7A0B-CF88"; { device = "/dev/disk/by-uuid/7A0B-CF88";
@@ -29,6 +41,7 @@
swapDevices = swapDevices =
[ { device = "/dev/disk/by-uuid/ec1f70ea-27b6-4646-ad3b-eac41bd83e3e"; } [ { device = "/dev/disk/by-uuid/ec1f70ea-27b6-4646-ad3b-eac41bd83e3e"; }
]; ];
zramSwap.enable = true;
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's

View File

@@ -0,0 +1,223 @@
# NixBook ext4 to btrfs Migration Guide
## Overview
This guide converts your nixbook machine from ext4 to btrfs with zstd compression and beesd deduplication while preserving your LUKS encryption and all data.
## Current System Info
- **Hostname**: nix-book
- **Root filesystem**: ext4 on `/dev/disk/by-uuid/bd396529-e2c4-47cb-b844-8d6ed841f81a`
- **Encryption**: LUKS with two devices configured
- **Current usage**: 138GB used / 225GB total (65% full)
- **Free space**: 76GB available (sufficient for conversion)
## Pre-Migration Checklist
### 1. Create Full System Backup (CRITICAL)
```bash
# Boot from NixOS live USB
# Mount encrypted filesystem
cryptsetup luksOpen /dev/disk/by-uuid/4126fbd4-bd09-4ece-af0d-6fff414c21b3 luks-nixbook
mount /dev/mapper/luks-nixbook /mnt
# Create backup to external drive (adjust target as needed)
rsync -avxHAX --progress /mnt/ /path/to/backup/nixbook-backup/
```
### 2. Verify Configuration Changes
The following files have been updated for btrfs:
- `machines/nix-book/configuration.nix` - Added beesd service
- `machines/nix-book/hardware-configuration.nix` - Changed fsType to btrfs with compression
## Migration Process
### Phase 1: Boot to Live Environment
1. **Create NixOS live USB**:
```bash
# Download latest NixOS ISO
# Flash to USB drive
dd if=nixos-minimal-xx.xx-x86_64-linux.iso of=/dev/sdX bs=4M status=progress
```
2. **Boot from live USB** and ensure you can access the encrypted drives
### Phase 2: Filesystem Conversion
3. **Unlock LUKS volumes**:
```bash
cryptsetup luksOpen /dev/disk/by-uuid/4126fbd4-bd09-4ece-af0d-6fff414c21b3 luks-nixbook
cryptsetup luksOpen /dev/disk/by-uuid/b614167b-9045-4234-a441-ac6f60a96d81 luks-nixbook2
```
4. **Check filesystem before conversion**:
```bash
fsck.ext4 -f /dev/mapper/luks-nixbook
```
5. **Convert ext4 to btrfs** (this preserves all data):
```bash
# Install btrfs-progs if not available
nix-shell -p btrfs-progs
# Convert the filesystem (takes 15-45 minutes depending on data)
btrfs-convert /dev/mapper/luks-nixbook
# Verify conversion succeeded
mount /dev/mapper/luks-nixbook /mnt
ls -la /mnt # Should show your normal filesystem
btrfs filesystem show /mnt
```
6. **Get new filesystem UUID** (may have changed):
```bash
blkid /dev/mapper/luks-nixbook
# Note the new UUID if it changed
```
### Phase 3: Configuration Update
7. **Mount and chroot into system**:
```bash
mount -o compress=zstd,noatime /dev/mapper/luks-nixbook /mnt
mount /dev/disk/by-uuid/7A0B-CF88 /mnt/boot
nixos-enter --root /mnt
```
8. **Update hardware-configuration.nix** if UUID changed:
```bash
# Edit /etc/nixos/hardware-configuration.nix if needed
# Update the UUID in fileSystems."/" section
```
9. **Rebuild system with btrfs configuration**:
```bash
cd /home/johno/nixos-configs
nixos-rebuild switch --flake .#nix-book
```
### Phase 4: Enable Compression and Deduplication
10. **Reboot into new btrfs system**:
```bash
exit # Exit chroot
umount -R /mnt
reboot
```
11. **Verify btrfs is working**:
```bash
mount | grep btrfs
btrfs filesystem usage /
```
12. **Enable and start beesd**:
```bash
systemctl status beesd-root
systemctl start beesd-root
systemctl enable beesd-root
```
13. **Force compression on existing files** (optional but recommended):
```bash
# This will compress existing files with zstd
btrfs filesystem defragment -r -czstd /
```
## Post-Migration Verification
### Check System Health
```bash
# Verify btrfs health
btrfs scrub start /
btrfs scrub status /
# Check compression effectiveness
compsize /
# Monitor beesd deduplication
journalctl -u beesd-root -f
# Check filesystem usage
btrfs filesystem usage /
df -h /
```
### Performance Monitoring
```bash
# Monitor beesd hash table
ls -lh /.beeshash
# Check compression ratio over time
compsize /home /nix /var
```
## Expected Benefits
### Space Savings
- **Compression**: 20-30% reduction in disk usage from zstd
- **Deduplication**: Additional 10-20% savings on duplicate files
- **Combined**: Potentially 30-40% total space savings
### Performance Impact
- **Compression**: Minimal CPU overhead, often improves I/O performance
- **Deduplication**: Background process, minimal impact during normal use
- **Overall**: Should be neutral to positive performance impact
## Rollback Plan (Emergency)
If something goes wrong:
1. **Boot from live USB**
2. **Restore from backup**:
```bash
cryptsetup luksOpen /dev/disk/by-uuid/4126fbd4-bd09-4ece-af0d-6fff414c21b3 luks-nixbook
mkfs.ext4 /dev/mapper/luks-nixbook
mount /dev/mapper/luks-nixbook /mnt
rsync -avxHAX --progress /path/to/backup/nixbook-backup/ /mnt/
```
3. **Restore original hardware-configuration.nix** with ext4 settings
4. **Rebuild and reboot**
## Troubleshooting
### Common Issues
**"Device busy" during conversion**:
- Ensure no processes are accessing the filesystem
- Check with `lsof` and `fuser`
**UUID changed after conversion**:
- Update hardware-configuration.nix with new UUID
- Regenerate initrd: `nixos-rebuild switch`
**Beesd service fails to start**:
- Check disk space for hash table
- Verify filesystem is btrfs: `mount | grep btrfs`
- Check logs: `journalctl -u beesd-root`
**Boot issues after conversion**:
- Boot from live USB
- Check /boot partition is mounted correctly
- Verify LUKS UUIDs match in configuration
- Rebuild bootloader: `nixos-rebuild switch --install-bootloader`
## Maintenance
### Regular Tasks
```bash
# Monthly scrub (checks for corruption)
btrfs scrub start /
# Monitor compression effectiveness
compsize /
# Check beesd deduplication status
systemctl status beesd-root
```
### Space Management
```bash
# Balance filesystem (defragments and optimizes)
btrfs balance start -dusage=50 /
# Check for space issues
btrfs filesystem usage /
```
This migration preserves all your data while gaining the benefits of modern btrfs features including transparent compression and automatic deduplication.

View File

@@ -0,0 +1,62 @@
# Edit this configuration file to define what should be installed on
# your system. Help is available in the configuration.nix(5) man page, on
# https://search.nixos.org/options and in the NixOS manual (`nixos-help`).
# NixOS-WSL specific options are documented on the NixOS-WSL repository:
# https://github.com/nix-community/NixOS-WSL
{ config, lib, pkgs, ... }:
{
imports = [
];
roles = {
audio.enable = true;
desktop = {
enable = true;
wayland = true;
};
users.enable = true;
};
networking.hostName = "wixos";
wsl.enable = true;
wsl.defaultUser = "johno";
wsl.startMenuLaunchers = true;
wsl.useWindowsDriver = true;
wsl.wslConf.network.hostname = "wixos";
wsl.wslConf.user.default = "johno";
services.xserver.videoDrivers = [ "nvidia" ];
hardware.graphics = {
enable = true;
extraPackages = with pkgs; [
mesa
libvdpau-va-gl
vaapiVdpau
];
};
environment.sessionVariables = {
LD_LIBRARY_PATH = [
"/usr/lib/wsl/lib"
"/run/opengl-driver/lib"
];
};
hardware.nvidia = {
modesetting.enable = true;
nvidiaSettings = true;
open = true;
package = config.boot.kernelPackages.nvidiaPackages.latest;
};
# This value determines the NixOS release from which the default
# settings for stateful data, like file locations and database versions
# on your system were taken. It's perfectly fine and recommended to leave
# this value at the release version of the first install of this system.
# Before changing this value read the documentation for this option
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
system.stateVersion = "24.05"; # Did you read the comment?
}

View File

@@ -1,63 +0,0 @@
# Edit this configuration file to define what should be installed on
# your system. Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running nixos-help).
{ ... }:
{
imports =
[ # Include the results of the hardware scan.
./hardware-configuration.nix
];
roles = {
audio.enable = true;
desktop = {
enable = true;
x11Only = true;
};
kodi.enable = true;
nfs-mounts.enable = true;
printing.enable = true;
spotifyd.enable = true;
users = {
enable = true;
extraGroups = [ "input" "libvirtd" ];
kids = true;
};
virtualisation.enable = true;
};
# Use the systemd-boot EFI boot loader.
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
boot.loader.grub.useOSProber = true;
networking = {
hostName = "z790prors-nix"; # Define your hostname.
domain = "oglehome";
defaultGateway = "10.0.0.1";
nameservers = [ "10.0.0.1" ];
# The global useDHCP flag is deprecated, therefore explicitly set to false here.
# Per-interface useDHCP will be mandatory in the future, so this generated config
# replicates the default behaviour.
useDHCP = false;
interfaces.enp3s0.ipv4.addresses = [{
address = "10.0.0.37";
prefixLength = 24;
}];
};
# TODO: Figure out something with this
nix.settings.secret-key-files = /root/cache-priv-key.pem;
# This value determines the NixOS release from which the default
# settings for stateful data, like file locations and database versions
# on your system were taken. Its perfectly fine and recommended to leave
# this value at the release version of the first install of this system.
# Before changing this value read the documentation for this option
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
system.stateVersion = "21.11"; # Did you read the comment?
}

View File

@@ -1,65 +0,0 @@
# Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, modulesPath, ... }:
{
imports =
[ (modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ];
boot.initrd.kernelModules = [
"nvidia"
"nvidia_modeset"
"nvidia_uvm"
"nvidia_drm"
];
boot.kernelParams = [
"nvidia_drm.fbdev=1"
"nvidia_drm.modeset=1"
];
boot.kernelModules = [ "kvm-intel" ];
boot.extraModulePackages = [ ];
hardware.graphics.enable = true;
services.xserver.videoDrivers = ["nvidia"];
services.xserver.screenSection = ''Option "metamodes" "3440x1440_165 +0+0"'';
services.xserver.enableTearFree = true;
hardware.nvidia = {
modesetting.enable = true;
powerManagement.enable = false;
powerManagement.finegrained = false;
open = false;
nvidiaSettings = true;
package = config.boot.kernelPackages.nvidiaPackages.production;
};
fileSystems."/" =
{ device = "/dev/disk/by-uuid/8d996d13-6d55-4524-83a2-6f6fb47a09ea";
fsType = "btrfs";
};
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/7445-C336";
fsType = "vfat";
};
fileSystems."/arch" =
{ device = "/dev/disk/by-label/endeavouros";
fsType = "btrfs";
};
swapDevices = [ ];
services.beesd.filesystems = {
root = {
spec = "LABEL=nixos";
hashTableSizeMB = 4096;
verbosity = "crit";
};
};
powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}

View File

@@ -1,4 +1,4 @@
{ pkgs, ... }: { pkgs, ... }:
{ {
nextcloudTalkDesktop = pkgs.callPackage ./nextcloud-talk-desktop {}; vulkanHDRLayer = pkgs.callPackage ./vulkan-hdr-layer {};
} }

View File

@@ -1,79 +0,0 @@
{ lib
, stdenv
, fetchzip
, autoPatchelfHook
, nss
, cairo
, xorg
, libxkbcommon
, alsa-lib
, at-spi2-core
, mesa
, pango
, libdrm
, vivaldi-ffmpeg-codecs
, gtk3
, libGL
, libglvnd
, systemd
}:
stdenv.mkDerivation (finalAttrs: {
pname = "nextcloud-talk-desktop";
version = "0.29.0";
# Building from source would require building also building Server and Talk components
# See https://github.com/nextcloud/talk-desktop?tab=readme-ov-file#%EF%B8%8F-prerequisites
src = fetchzip {
url = "https://github.com/nextcloud-releases/talk-desktop/releases/download/v${finalAttrs.version}/Nextcloud.Talk-linux-x64-${finalAttrs.version}.zip";
hash = "sha256-fBIeNv8tfrVTFExLQDBPhIazvbsJ7a76+W9G0cuQDlw=";
stripRoot = false;
};
nativeBuildInputs = [ autoPatchelfHook ];
buildInputs = [
nss
cairo
alsa-lib
at-spi2-core
pango
libdrm
libxkbcommon
gtk3
vivaldi-ffmpeg-codecs
mesa
libGL
libglvnd
] ++ (with xorg; [libX11 libXcomposite libXdamage libXrandr libXfixes libXcursor]);
# Required to launch the application and proceed past the zygote_linux fork() process
# Fixes `Zygote could not fork`
runtimeDependencies = [ systemd ];
preInstall = ''
mkdir -p $out/bin
mkdir -p $out/opt
cp -r $src/* $out/opt/
'';
installPhase = ''
runHook preInstall
# Link the application in $out/bin away from contents of `preInstall`
ln -s "$out/opt/Nextcloud Talk-linux-x64/Nextcloud Talk" $out/bin/${finalAttrs.pname}
runHook postInstall
'';
meta = with lib; {
description = "Nextcloud Talk Desktop Client Preview";
homepage = "https://github.com/nextcloud/talk-desktop";
changelog = "https://github.com/nextcloud/talk-desktop/blob/${finalAttrs.version}/CHANGELOG.md";
license = licenses.agpl3Only;
maintainers = with maintainers; [ kashw2 ];
mainProgram = finalAttrs.pname;
};
})

View File

@@ -0,0 +1,34 @@
{ lib, stdenv, fetchFromGitHub, meson, pkg-config, vulkan-loader, ninja, writeText, vulkan-headers, vulkan-utility-libraries, jq, libX11, libXrandr, libxcb, wayland, wayland-scanner }:
stdenv.mkDerivation rec {
pname = "vulkan-hdr-layer";
version = "63d2eec";
src = (fetchFromGitHub {
owner = "Zamundaaa";
repo = "VK_hdr_layer";
rev = "869199cd2746e7f69cf19955153080842b6dacfc";
fetchSubmodules = true;
hash = "sha256-xfVYI+Aajmnf3BTaY2Ysg5fyDO6SwDFGyU0L+F+E3is=";
}).overrideAttrs (_: {
GIT_CONFIG_COUNT = 1;
GIT_CONFIG_KEY_0 = "url.https://github.com/.insteadOf";
GIT_CONFIG_VALUE_0 = "git@github.com:";
});
nativeBuildInputs = [ vulkan-headers meson ninja pkg-config jq ];
buildInputs = [ vulkan-headers vulkan-loader vulkan-utility-libraries libX11 libXrandr libxcb wayland wayland-scanner ];
# Help vulkan-loader find the validation layers
setupHook = writeText "setup-hook" ''
addToSearchPath XDG_DATA_DIRS @out@/share
'';
meta = with lib; {
description = "Layers providing Vulkan HDR";
homepage = "https://github.com/Zamundaaa/VK_hdr_layer";
platforms = platforms.linux;
license = licenses.mit;
};
}

View File

@@ -22,11 +22,19 @@ in
enable = true; enable = true;
pulse.enable = true; pulse.enable = true;
}; };
hardware.pulseaudio.package = pkgs.pulseaudioFull;
hardware.pulseaudio.extraConfig = " services.pulseaudio = {
load-module module-combine-sink package = pkgs.pulseaudioFull;
load-module module-switch-on-connect extraConfig = ''
"; load-module module-combine-sink
load-module module-switch-on-connect
'';
};
services.squeezelite = {
#enable = true;
pulseAudio = true;
};
}; };
} }

168
roles/btrfs/default.nix Normal file
View File

@@ -0,0 +1,168 @@
{ lib, config, pkgs, ... }:
with lib;
let
cfg = config.roles.btrfs;
in
{
options.roles.btrfs = {
enable = mkEnableOption "Enable btrfs filesystem management";
filesystems = mkOption {
type = types.attrsOf (types.submodule {
options = {
# Filesystem-level maintenance options
scrub = {
enable = mkOption {
type = types.bool;
default = true;
description = "Enable automatic scrubbing for this filesystem";
};
interval = mkOption {
type = types.str;
default = "weekly";
description = "Scrub interval (systemd timer format)";
};
};
deduplication = {
enable = mkOption {
type = types.bool;
default = false;
description = "Enable beesd deduplication for this filesystem";
};
hashTableSizeMB = mkOption {
type = types.int;
default = 1024;
description = "Hash table size in MB (should be multiple of 16)";
};
verbosity = mkOption {
type = types.str;
default = "info";
description = "Logging verbosity level";
};
};
balance = {
enable = mkOption {
type = types.bool;
default = false;
description = "Enable periodic balance operations";
};
interval = mkOption {
type = types.str;
default = "monthly";
description = "Balance interval (systemd timer format)";
};
dataUsage = mkOption {
type = types.int;
default = 50;
description = "Data usage threshold for balance";
};
metadataUsage = mkOption {
type = types.int;
default = 50;
description = "Metadata usage threshold for balance";
};
};
# Mountpoint-based configuration
mountpoints = mkOption {
type = types.attrsOf (types.submodule {
options = {
subvolume = mkOption {
type = types.nullOr types.str;
default = null;
description = "Subvolume name. If null, uses default subvolume.";
};
compression = mkOption {
type = types.str;
default = "zstd";
description = "Compression algorithm (zstd, lzo, lz4, none)";
};
autodefrag = mkOption {
type = types.bool;
default = false;
description = "Enable automatic defragmentation";
};
extraOptions = mkOption {
type = types.listOf types.str;
default = [];
description = "Additional mount options";
};
};
});
default = {};
description = "Mountpoint configurations for this filesystem";
};
};
});
default = {};
description = "Btrfs filesystems configuration";
};
};
config = mkIf cfg.enable {
# Generate fileSystems configuration from mountpoints
fileSystems = mkMerge (flatten (mapAttrsToList (device: fsCfg:
mapAttrsToList (mountpoint: mountCfg:
{
${mountpoint} = {
device = device;
fsType = "btrfs";
options =
(optional (mountCfg.subvolume != null) "subvol=${mountCfg.subvolume}") ++
[ "compress=${mountCfg.compression}" ] ++
(optional mountCfg.autodefrag "autodefrag") ++
mountCfg.extraOptions;
};
}
) fsCfg.mountpoints
) cfg.filesystems));
# Configure scrub service using NixOS built-in
services.btrfs.autoScrub = mkIf (any (fs: fs.scrub.enable) (attrValues cfg.filesystems)) {
enable = true;
interval = "weekly"; # TODO: Make this configurable per filesystem
fileSystems = attrNames (filterAttrs (_: fs: fs.scrub.enable) cfg.filesystems);
};
# Configure beesd for filesystems with deduplication enabled
services.beesd.filesystems = mapAttrs' (device: fsCfg:
nameValuePair (replaceStrings ["/"] ["_"] (replaceStrings ["-"] ["_"] device)) {
spec = device;
hashTableSizeMB = fsCfg.deduplication.hashTableSizeMB;
verbosity = fsCfg.deduplication.verbosity;
}
) (filterAttrs (_: fs: fs.deduplication.enable) cfg.filesystems);
# Custom balance services for filesystems with balance enabled
systemd.services = mkMerge (mapAttrsToList (device: fsCfg: mkIf fsCfg.balance.enable {
"btrfs-balance-${replaceStrings ["/"] ["-"] (replaceStrings ["-"] ["_"] device)}" = {
description = "Balance btrfs filesystem ${device}";
script = ''
${pkgs.btrfs-progs}/bin/btrfs balance start \
-dusage=${toString fsCfg.balance.dataUsage} \
-musage=${toString fsCfg.balance.metadataUsage} \
${device}
'';
serviceConfig = {
Type = "oneshot";
Nice = 19;
IOSchedulingClass = "idle";
};
};
}) cfg.filesystems);
# Balance timers
systemd.timers = mkMerge (mapAttrsToList (device: fsCfg: mkIf fsCfg.balance.enable {
"btrfs-balance-${replaceStrings ["/"] ["-"] (replaceStrings ["-"] ["_"] device)}" = {
description = "Periodic balance for ${device}";
wantedBy = [ "timers.target" ];
timerConfig = {
OnCalendar = fsCfg.balance.interval;
Persistent = true;
};
};
}) cfg.filesystems);
};
}

View File

@@ -6,11 +6,11 @@ with lib;
imports = [ imports = [
./audio ./audio
./bluetooth ./bluetooth
./btrfs
./desktop ./desktop
./kodi ./kodi
./nfs-mounts ./nfs-mounts
./printing ./printing
./secrets
./spotifyd ./spotifyd
./users ./users
./virtualisation ./virtualisation
@@ -31,34 +31,56 @@ with lib;
}; };
time.timeZone = "America/Los_Angeles"; time.timeZone = "America/Los_Angeles";
services.xserver.xkb = {
layout = "us";
variant = "";
options = "caps:escape";
};
# Don't go to emergency mode if we aren't able to mount filesystems.
# This is silly if you have multiple hard drives or partitions
# configured on a machine and then one goes away intentionally or
# unintentionally. If the system is already booting, let it continue
# to try and boot.
systemd.enableEmergencyMode = false;
# Enable the OpenSSH daemon. # Enable the OpenSSH daemon.
services.openssh.enable = true; services.openssh.enable = true;
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
git git
glances
pciutils
tree
usbutils
vim
]; ];
nix = { nix = {
package = pkgs.nixFlakes; package = pkgs.nix;
distributedBuilds = true; # distributedBuilds = true;
buildMachines = [{ # buildMachines = [{
hostName = "z790prors.oglehome"; # hostName = "z790prors.oglehome";
system = "x86_64-linux"; # system = "x86_64-linux";
protocol = "ssh-ng"; # protocol = "ssh-ng";
sshUser = "johno"; # sshUser = "johno";
sshKey = "/root/.ssh/id_ed25519"; # sshKey = "/root/.ssh/id_ed25519";
maxJobs = 3; # maxJobs = 3;
speedFactor = 2; # speedFactor = 2;
}]; # }];
settings = { settings = {
experimental-features = [ "nix-command" "flakes" ]; experimental-features = [ "nix-command" "flakes" ];
max-jobs = "auto"; max-jobs = "auto";
trusted-users = [ "johno" ]; trusted-users = [ "johno" ];
substituters = [ substituters = [
"https://hyprland.cachix.org"
]; ];
}; };
gc = {
automatic = true;
randomizedDelaySec = "14m";
options = "--delete-older-than 10d";
};
}; };
nixpkgs.config.allowUnfree = true; nixpkgs.config.allowUnfree = true;

View File

@@ -2,133 +2,23 @@
with lib; with lib;
let
cfg = config.roles.desktop;
basePackages = with pkgs; [
brightnessctl
mangohud # Should probably get refactored with steam/gamescope out to a gaming role
polonium # auto tiling kwin addon
];
x11BasePackages = with pkgs; [
];
x11OnlyPackages = with pkgs; [
emacs
];
waylandBasePackages = with pkgs; [
grim
slurp
wl-clipboard
mako
];
waylandOnlyPackages = with pkgs; [
emacs-gtk
];
in
{ {
options.roles.desktop = { options.roles.desktop = {
enable = mkEnableOption "Enable the desktop role"; enable = mkEnableOption "Enable the desktop role.";
x11Only = mkOption {
type = types.bool; x11 = mkOption { type = types.bool; default = false; description = "Enable X11 support."; };
default = false; wayland = mkOption { type = types.bool; default = false; description = "Enable Wayland support."; };
}; kde = mkOption { type = types.bool; default = false; description = "Enable KDE."; };
gaming = mkOption { type = types.bool; default = false; description = "Enable gaming support."; };
sddm = mkOption { type = types.bool; default = false; description = "Enable SDDM greeter."; };
}; };
config = mkIf cfg.enable imports = [
{ ./x11.nix
services.xserver.xkb = { ./wayland.nix
layout = "us"; ./gaming.nix
variant = ""; ./kde.nix
options = "caps:escape"; ./programs.nix
}; ./sddm.nix
services.xserver.enable = true; ];
services.displayManager.sddm = {
enable = true;
wayland.enable = !cfg.x11Only;
};
services.desktopManager.plasma6.enable = true;
services.xserver.windowManager.i3 = {
enable = true;
extraPackages = with pkgs; [
dmenu
i3status
i3lock
];
};
programs.dconf.enable = true;
services.gnome.gnome-keyring.enable = true;
programs.sway = mkIf (!cfg.x11Only) {
enable = true;
wrapperFeatures.gtk = true;
};
programs.light.enable = mkIf (!cfg.x11Only) true;
programs.kdeconnect.enable = true;
programs.java.enable = true;
programs.gamemode = {
enable = true;
};
programs.gamescope = {
enable = true;
#capSysNice = true;
args = [
#"--adaptive-sync"
#"--nested-refresh 165"
#"--backend wayland"
"--hdr-enabled"
"--hdr-itm-enable"
"--hdr-debug-force-output"
"--mangoapp"
"--rt"
"--steam"
#"--xwayland-count 2"
];
env = {
#PROTON_DISABLE_NVAPI = "1";
MANGOHUD = "1";
#MANGOHUD_CONFIG = "cpu_temp gpu_temp ram vram";
};
};
programs.steam = {
enable = true;
remotePlay.openFirewall = true;
localNetworkGameTransfers.openFirewall = true;
gamescopeSession = {
enable = true;
};
#package = pkgs.steam.override {
#withJava = true;
#withPrimus = true;
#extraPkgs = pkgs: [ bumblebee glxinfo ];
#};
};
services.sunshine = {
enable = true;
autoStart = true;
capSysAdmin = true;
openFirewall = true;
};
virtualisation.docker.enable = true;
users.extraGroups.docker.members = [ "johno" ];
environment.systemPackages = with pkgs; mkMerge [
basePackages
x11BasePackages
(mkIf cfg.x11Only x11OnlyPackages)
# TODO: Do we need a "wayland only" mode?
(mkIf (!cfg.x11Only) waylandBasePackages)
(mkIf (!cfg.x11Only) waylandOnlyPackages)
];
};
} }

18
roles/desktop/gaming.nix Normal file
View File

@@ -0,0 +1,18 @@
{ lib, config, pkgs, ... }:
with lib;
let
cfg = config.roles.desktop;
in
{
config = mkIf (cfg.enable && cfg.gaming) {
environment.systemPackages = with pkgs; [
steam
lutris
moonlight
];
# Possibly other gaming specific services or settings
};
}

12
roles/desktop/kde.nix Normal file
View File

@@ -0,0 +1,12 @@
{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.roles.desktop;
in
{
config = mkIf (cfg.enable && cfg.kde) {
services.desktopManager.plasma6.enable = true;
};
}

View File

@@ -0,0 +1,20 @@
{ lib, config, pkgs, ... }:
with lib;
let
cfg = config.roles.desktop;
in
{
config = mkIf cfg.enable {
environment.systemPackages = with pkgs; [
brightnessctl
emacs-nox
moonlight-qt
];
programs.dconf.enable = true;
services.gnome.gnome-keyring.enable = true;
programs.kdeconnect.enable = true;
};
}

15
roles/desktop/sddm.nix Normal file
View File

@@ -0,0 +1,15 @@
{ lib, config, pkgs, ... }:
with lib;
let
cfg = config.roles.desktop;
in
{
config = mkIf (cfg.enable && cfg.sddm) {
services.displayManager.sddm = {
enable = true;
wayland.enable = (!cfg.x11 && cfg.wayland);
};
};
}

23
roles/desktop/wayland.nix Normal file
View File

@@ -0,0 +1,23 @@
{ lib, config, pkgs, ... }:
with lib;
let
cfg = config.roles.desktop;
in
{
config = mkIf (cfg.enable && cfg.wayland) {
programs.sway = {
enable = true;
wrapperFeatures.gtk = true;
};
programs.light.enable = true;
environment.systemPackages = with pkgs; [
grim
slurp
wl-clipboard
mako
];
};
}

19
roles/desktop/x11.nix Normal file
View File

@@ -0,0 +1,19 @@
{ lib, config, pkgs, ... }:
with lib;
let
cfg = config.roles.desktop;
in
{
config = mkIf (cfg.enable && cfg.x11) {
services.xserver = {
enable = true;
windowManager.i3 = {
enable = true;
extraPackages = with pkgs; [ dmenu i3status i3lock ];
};
};
};
}

View File

@@ -27,45 +27,30 @@ in
]); ]);
in mkIf cfg.enable in mkIf cfg.enable
{ {
users.extraUsers.kodi.isNormalUser = true; users.extraUsers.kodi = {
isNormalUser = true;
extraGroups = [ "wheel" "networkmanager" "audio" "video" ];
};
networking.firewall = { networking.firewall = {
allowedTCPPorts = [ 8080 ]; allowedTCPPorts = [ 8080 ];
allowedUDPPorts = [ 8080 ]; allowedUDPPorts = [ 8080 ];
}; };
services = if cfg.autologin then mkMerge [ environment.systemPackages = with pkgs; [
(mkIf cfg.wayland { kodiPkg
cage = mkIf cfg.wayland { wget
user = "kodi"; ];
program = "${kodiPkg}/bin/kodi-standalone";
enable = true;
};
xserver = {
enable = false;
autorun = false;
};
})
(mkIf (!cfg.wayland) { programs.kdeconnect.enable = true;
xserver = {
enable = true; services = if cfg.autologin then {
desktopManager.kodi = {
enable = true;
package = kodiPkg;
};
displayManager.lightdm = {
enable = true;
greeter.enable = false;
};
};
displayManager = { displayManager = {
autoLogin.enable = true; autoLogin.enable = true;
autoLogin.user = "kodi"; autoLogin.user = "kodi";
defaultSession = "kodi"; defaultSession = "kodi";
sessionData.autologinSession = "kodi"; sessionData.autologinSession = "plasma";
}; };
}) } else {};
] else {};
}; };
} }

View File

@@ -19,5 +19,12 @@ in
nssmdns4 = true; nssmdns4 = true;
openFirewall = true; openFirewall = true;
}; };
hardware.printers.ensurePrinters = [{
name = "MFC-L8900CDW_series";
deviceUri = "dnssd://Brother%20MFC-L8900CDW%20series._ipp._tcp.local/?uuid=e3248000-80ce-11db-8000-b422006699d8";
model = "everywhere";
}];
hardware.printers.ensureDefaultPrinter = "MFC-L8900CDW_series";
}; };
} }

View File

@@ -1,8 +0,0 @@
{ config, lib, pkgs, inputs, ... }:
{
sops.defaultSopsFile = ../../secrets/secrets.yaml;
sops.defaultSopsFormat = "yaml";
sops.age.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" "/home/johno/.ssh/id_ed25519" ];
sops.secrets.example_key = {};
}

View File

@@ -25,7 +25,7 @@ in
users.users.johno = { users.users.johno = {
isNormalUser = true; isNormalUser = true;
description = "John Ogle"; description = "John Ogle";
extraGroups = [ "wheel" "networkmanager" "audio" ] ++ cfg.extraGroups; extraGroups = [ "wheel" "networkmanager" "audio" "video" ] ++ cfg.extraGroups;
}; };
users.users.eli = mkIf cfg.kids { users.users.eli = mkIf cfg.kids {

View File

@@ -14,5 +14,7 @@ in
{ {
virtualisation.libvirtd.enable = true; virtualisation.libvirtd.enable = true;
programs.virt-manager.enable = true; programs.virt-manager.enable = true;
virtualisation.docker.enable = true;
users.extraGroups.docker.members = [ "johno" ];
}; };
} }

View File

@@ -1,48 +0,0 @@
hello: ENC[AES256_GCM,data:5ZpbPx3D8gQc1fOhViUqiCr0zLWYotB+vIBixqTbqP9XLS52y6tr5DXus0aV9mTgka5deqc=,iv:yPJaCqDD9WD56swfBjSm7A62ZTTIQDqyAKOgP1ese+U=,tag:bo8+7Ne2f9aEZSvpkt1fzA==,type:str]
example_key: ENC[AES256_GCM,data:v15bEcb0H3vaj13blg==,iv:9P3IA7ChBamo41VE8G8tj46sZqeijsO1LcvwLtEPVPA=,tag:o/lAyAYYGNLP9EjQNa/K8Q==,type:str]
example_array:
- ENC[AES256_GCM,data:3Vwa7dfNfKzRc/xpk6I=,iv:IevBgxwWdaBvZY1ywteWcfWwDIA8lK3FTWs67lLBKxw=,tag:Mx5lzUeNZ/3wJBWAl5XSBw==,type:str]
- ENC[AES256_GCM,data:epkT6WPGW5Oe/S+4HtU=,iv:N0yoDuieAaEi+NuCoCL4zrkhaDDdkttboI89m+UccjQ=,tag:OoERRByb0OM4un9oGLJQgA==,type:str]
#ENC[AES256_GCM,data:YzMFXxn3sbbHpGB4jPRtRw==,iv:TN6ogQuH7c6xtDoWt0Ew9B2f7wuaipJynvscZmaJYoU=,tag:No0UwEktEyMNBg/46P+Zmg==,type:comment]
example_number: ENC[AES256_GCM,data:jmLoVC+8YIlB2A==,iv:u9GztD/aE9UN5zWq3Am2nhYwmYt3sf8sy65MHbhVoD0=,tag:wKuf1mMr5XBJveJrz0uHPA==,type:float]
example_booleans:
- ENC[AES256_GCM,data:ZacILA==,iv:xo+7aFFQXzbJzKDY0mYTeFLf10AlnHkywDRAMHeprEM=,tag:F/OnJdqjrZP02sTLWLmnbg==,type:bool]
- ENC[AES256_GCM,data:NaFrvrs=,iv:kKDmGs9u/w5qrZ/379Jlx8AotUVADvH+eHwHCqykmkE=,tag:nD9TsmkXUm4ABaT1ABWmcg==,type:bool]
sops:
kms: []
gcp_kms: []
azure_kv: []
hc_vault: []
age:
- recipient: age1ls6a033d4p4u8h4rwazjwt8w4c4xg73wq0mdnm64jajxzcz4k9asvjnks3
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBjak9vRVJtVmJoanhEZ0hQ
MFJwMEE4UDcrRkdPRmZ6R09FSDY1aTk3Y1dNClZJYXRLNU5senR3Qzh6VmZGMlhu
bnl6VjlaUEFISnBtSTVrcEd0ZjI5Q2MKLS0tIFl1b3A5ZWVqc1gvWVZnZis0ZHFk
bWhnNVB2TUJ4YzY4NHdSVXhPc3dReTgKWRYBbBE3+oGsRNw1CROhFY+btENbShfv
gw3IdW7OoZV6JpJBOcI82eOuOkIxrmgSGDGeyy10/a5MA/cB1umm+w==
-----END AGE ENCRYPTED FILE-----
- recipient: age12l5u7sw59u5pkwp83qm8t3ff7uv0ld2c9k3zh5j4ame9k2szcynqu7ftqe
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGcmV3TDlNL2Zxb0h5QTYx
QkVmczA0MDc2ZnpNNU1YeFVzSXJwc3RWUmk4CjF4bHIrVU9VM3htTUxGZ2FUR256
UEovdVV2cmNIbkloS1VobTNFSDVyRG8KLS0tIEFhUk5kL3hCNGs4MGJBTmNJaVFm
b2ZBUGJ1K0lKTitKYTRUMWszQzhBU0UKBaM6t6JmWfiG+wPorGea1gqvV5RSIPyw
6yb2PcH2oZ0HrjJM5sjfu7XOWY3KneiZZikR1BpD5KvevfagWTSR/w==
-----END AGE ENCRYPTED FILE-----
- recipient: age1fa3zqavfmqk4ssa22yne9td90gyqv9q5a8y0s8jp3xak8q7p3yjqyn7rkg
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBaMFJiNjVOb0lTcmJ3VnhH
WlRKZERRZFM3TFZBZGNSZC9GdHlHakMza21zClJ3SDdFUkVRc3oyVVU3WEtDQzBu
OEFqS3NwbHZFUlpCYlN6RW84N0F1amcKLS0tIHFZK21aTHdwZ2dWbVRrWEZDWFZj
aU1IQzdTMVhnbHhsNENwMG05dXhOU2MK8fEJea9sL5JLgltVlTI6mRDb+Tl83Iz7
4wPYvo68cn8vimXqSk45ldHRrNa3zhYai3CalQaGtDT3fkWGvSq0zQ==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2024-09-28T15:44:39Z"
mac: ENC[AES256_GCM,data:YUi+AbS6DQTmrSyOXsbkZWfWaMyKGR8fYm/MHcxmqChi8hng+UWHBZjsLBe6ef/FLH3rnP6bhfwK8KYnVS6fHvHahoqIq/BHydTsqrclnSgRAGl8Lh0yuhwISNRvP1AuW5pd50sdQaS0uGOtzOCharI/pZ9H+cmt2SB5WOCdeLs=,iv:2nBG6it3tNSLSia8hGzCcesuK9QwzB9EzfjWegjQ2kw=,tag:RGGPAPw/rQKhWA2OqLjTJw==,type:str]
pgp: []
unencrypted_suffix: _unencrypted
version: 3.9.0