diff --git a/.sops.yaml b/.sops.yaml
index bc47ed3..4f904da 100644
--- a/.sops.yaml
+++ b/.sops.yaml
@@ -3,28 +3,12 @@ keys:
- &tux age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4
- &hosts
- - &sirius age1f860dfewlx5jtt9ejr47gywx70p3dmyc8mat29gpr75psljwjv8q5xyxkq
+ - &sirius age1maxsx5tq2h3d92rfyl8ekcdan5gu5cpch4qs3c56cu7qag02xgvs3h0gqc
- &canopus age1x36yr8h993srfj29sfpzt4wyz52nztvncpmhgmfs0j26qvfecq3qvcm0an
- - &homelab age1jg642q775gmnmxeu29gcf3lph8vem4xr8t84cxe809dpd0myrussh49h60
- - &arcturus age1zsl5d4vj6gl3h96y5p53sq5y4vr4vtlwp727h7rp9a4xfkxm53lqrh6r50
- - &alpha age1zujp5gxy7suv8ysnygv43cmzuvv36nxfg0ch7r3xg2emc6fz3vmqqujheq
- - &vega age1ydkclhk9kwqdq74utesqdfupt43lz64d5k65gz2z9uyljcqq9fcq3hv28l
- - &node age1put942dyhly8nk9c8n0h8tq0x6xplrg3uw5q0d2jmvwez3zq79qsapl7he
- - &capella age1y4luzn2jls7rvgphej23srvdlx563lxq29tvf66vhwwzaf7c3f3qzvresh
+ - &arcturus age1huqa3hc7wcxk4dpelrzny437nzrx4fnll3d8g9ahznzk268yju5qufapxy
+ - &alpha age1mzxxxzhy3us3rd960ufqv7vlxj5cnug86md6x69llg9ujzw2pqws057llf
creation_rules:
- - path_regex: hosts/common/secrets.yaml$
- key_groups:
- - age:
- - *tux
- - *sirius
- - *canopus
- - *homelab
- - *arcturus
- - *alpha
- - *vega
- - *node
- - *capella
- path_regex: hosts/sirius/secrets.yaml$
key_groups:
- age:
@@ -45,13 +29,3 @@ creation_rules:
- age:
- *tux
- *alpha
- - path_regex: hosts/capella/secrets.yaml$
- key_groups:
- - age:
- - *tux
- - *capella
- - path_regex: hosts/homelab/secrets.yaml$
- key_groups:
- - age:
- - *tux
- - *homelab
diff --git a/README.md b/README.md
index a560371..180bc9d 100644
--- a/README.md
+++ b/README.md
@@ -15,196 +15,48 @@
## Table of Contents
- [Hosts](#hosts)
-- [Installation](#installation)
- [Components](#components)
- [Showcase](#showcase)
- [Pain](#spent-weeks-on-this-system-configuration-)
## Hosts
-| | Hostname | Board | CPU | RAM | GPU | Purpose |
-| --- | ---------- | ----------------- | ------------------ | ----- | ------------------------- | -------------------------------------------------------------------------------- |
-| 🖥️ | `sirius` | MSI X570-A Pro | Ryzen 7 5700X3D | 64GB | RTX 3080 TI + RTX 3060 TI | Triple-monitor desktop running Windows Subsystem for Linux. |
-| 💻 | `canopus` | Asus Zephyrus G15 | Ryzen 9 5900HS | 16GB | RTX 3060 | Optimized for productivity on the go and some gaming. |
-| ☁️ | `homelab` | Minisforum MS-A1 | Ryzen 7 8700G | 32GB | Radeon 780M | WIP |
-| ☁️ | `arcturus` | KVM | 4 Core | 8GB | | Primary server responsible for exposing my homelab applications to the internet. |
-| ☁️ | `alpha` | KVM | 4 Core | 4GB | | Monitors uptime and health status of all services across the infrastructure. |
-| 🥔 | `vega` | Raspberry Pi 3B+ | Cortex A53 | 1GB | | Running AdGuard Home for network-wide ad blocking. |
-| 📱 | `capella` | Samsung S25 Ultra | Snapdragon 8 Elite | 12GB | Adreno 830 | Primary mobile for daily usage. (Locked) |
-| 📱 | `rigel` | Motorola Edge 30 | Snapdragon 778G+ | 8GB | Adreno 642L | Secondary mobile for some fun. (Rooted) |
-| ☁️ | `node` | ASRock B565D4 | Ryzen 9 5950X | 128GB | | Running Ethereum and BSC nodes. |
-
-## Installation
-
-> [!NOTE]
-> This will get your base system ready, but keep in mind that many things might not work correctly — such as monitor resolution, font size, and more.
-
-### Prerequisites
-
-Boot into the NixOS bootable USB before proceeding with the installation steps.
-
-### Installation Steps
-
-#### 1. Clone the repository
-
-```bash
-git clone https://github.com/tuxdotrs/nix-config.git
-cd nix-config
-```
-
-#### 2. Gain root privileges
-
-```bash
-sudo su
-
-```
-
-#### 3. Set up disk partitioning
-
-Install the required tools:
-
-```bash
-nix-shell -p disko neovim
-```
-
-Partition your disk using disko. **This will wipe your drive.** Replace `DISK_PATH` with your actual disk path (e.g., `/dev/vda` or `/dev/nvme0n1`):
-
-```bash
-disko --mode disko ./hosts/canopus/disko.nix --arg device '"DISK_PATH"'
-```
-
-#### 4. Configure your disk
-
-Edit the configuration file:
-
-```bash
-nvim ./hosts/canopus/default.nix
-```
-
-In the imports statement, replace:
-
-```nix
-(import ./disko.nix {device = "/dev/nvme0n1";})
-```
-
-with:
-
-```nix
-(import ./disko.nix {device = "DISK_PATH";})
-```
-
-Make sure to replace `DISK_PATH` with your actual disk path.
-
-#### 5. Generate hardware configuration
-
-```bash
-nixos-generate-config --no-filesystems --root /mnt
-```
-
-Copy the generated hardware configuration to the repository:
-
-```bash
-cp /mnt/etc/nixos/hardware-configuration.nix ./hosts/canopus/hardware.nix
-```
-
-#### 6. Install NixOS
-
-```bash
-nixos-install --root /mnt --flake .#canopus
-```
-
-#### 7. Enter into the new system
-
-```bash
-nixos-enter --root /mnt
-```
-
-#### 8. Set up directories and permissions
-
-```bash
-mkdir -p /persist/home
-chown -R tux:users /persist/home
-```
-
-#### 9. Set passwords
-
-Set the root password:
-
-```bash
-passwd root
-```
-
-Set the user password:
-
-```bash
-passwd tux
-```
-
-#### 10. Reboot
-
-```bash
-reboot
-```
-
-Your NixOS system should now boot into a beautiful DE.
+| | Hostname | Board | CPU | RAM | GPU | Purpose |
+| --- | ---------- | ----------------- | ------------------ | ---- | ------------------------- | --------------------------------------------------------------------- |
+| 🖥️ | `sirius` | MSI X570-A Pro | Ryzen 7 5700X3D | 64GB | RTX 3080 TI + RTX 3060 TI | Triple-monitor desktop for work, gaming, and media consumption. |
+| 💻 | `canopus` | Asus Zephyrus G15 | Ryzen 9 5900HS | 16GB | RTX 3060 | Portable workstation for work, gaming, and media on the go. |
+| ☁️ | `arcturus` | Minisforum MS-A1 | Ryzen 7 8700G | 32GB | Radeon 780M | Homelab server for self-hosted services and infrastructure workloads. |
+| ☁️ | `alpha` | KVM | 2 Core | 4GB | | Public-facing server for exposing homelab services to the internet. |
+| 📱 | `vega` | Samsung S25 Ultra | Snapdragon 8 Elite | 12GB | Adreno 830 | Primary mobile for daily usage. (Locked) |
+| 📱 | `capella` | Motorola Edge 30 | Snapdragon 778G+ | 8GB | Adreno 642L | Secondary mobile for tinkering and experimentation. (Rooted) |
## Components
-| | Wayland | Xorg |
-| ------------- | -------- | ---------------- |
-| DM | ly | ly |
-| WM/DE | Hyprland | AwesomeWM |
-| Compositor | Hyprland | Picom (Jonaburg) |
-| Bar | tPanel | Wibar |
-| Hotkeys | Hyprland | Awful |
-| Launcher | tPanel | Rofi |
-| Notifications | tPanel | Naughty |
-| Terminal | Wezterm | Wezterm |
-| Editor | Neovim | Neovim |
+| | Wayland | Xorg |
+| ------------- | -------- | ---- |
+| DM | ly | - |
+| WM/DE | Hyprland | - |
+| Compositor | Hyprland | - |
+| Bar | Tshell | - |
+| Hotkeys | Hyprland | - |
+| Launcher | Tshell | - |
+| Notifications | Tshell | - |
+| Terminal | Wezterm | - |
+| Editor | Neovim | - |
## Showcase
-### Desktop Hyprland
+| **Desktop** | **Tshell** |
+| --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
+|
|
|
+| **Workflow** | **Neovim** |
+|
|
|
+| **Floating Terminal** | **Lazygit** |
+|
|
|
+| **Telescope** | **Firefox** |
+|
|
|
-
-
-### tPanel
-
-
-
-### Workflow
-
-
-
-## Showcase
-
-### Desktop AwesomeWM
-
-
-
-
-
-### Neovim
-
-
-
-### Floating Terminal
-
-
-
-### Lazygit
-
-
-
-### Telescope
-
-
-
-### Firefox
-
-
-
-## Spent weeks on this system configuration 😢
+## Spent months on this system configuration 😢

diff --git a/flake.lock b/flake.lock
old mode 100755
new mode 100644
index 6a1ac9f..086a898
--- a/flake.lock
+++ b/flake.lock
@@ -1,27 +1,5 @@
{
"nodes": {
- "ags": {
- "inputs": {
- "astal": "astal",
- "nixpkgs": [
- "tpanel",
- "nixpkgs"
- ]
- },
- "locked": {
- "lastModified": 1764289441,
- "narHash": "sha256-ak+lgFiYE5PHByN1/BRkO5JP498hno6Ix24C1Qf/vec=",
- "owner": "aylur",
- "repo": "ags",
- "rev": "e169694390548dfd38ff40f1ef2163d6c3ffe3ea",
- "type": "github"
- },
- "original": {
- "owner": "aylur",
- "repo": "ags",
- "type": "github"
- }
- },
"aquamarine": {
"inputs": {
"hyprutils": [
@@ -42,11 +20,11 @@
]
},
"locked": {
- "lastModified": 1776876344,
- "narHash": "sha256-Ubqb/agkuMJK+k19gjQgHux/eOYRc1sRGoOZOho8+VY=",
+ "lastModified": 1788016784,
+ "narHash": "sha256-RO90Fk+Rn2Yy+I8oL4ePTLLKLgOAr8hrTx7tlpwdLaA=",
"owner": "hyprwm",
"repo": "aquamarine",
- "rev": "648a13d0ee1e03a843b3e145b8ece15393058701",
+ "rev": "783bfd9ae441d1d0519b979ac68b73ddd6e81df0",
"type": "github"
},
"original": {
@@ -55,28 +33,6 @@
"type": "github"
}
},
- "astal": {
- "inputs": {
- "nixpkgs": [
- "tpanel",
- "ags",
- "nixpkgs"
- ]
- },
- "locked": {
- "lastModified": 1764173295,
- "narHash": "sha256-Jh4VtPcK2Ov+RTcV9FtyQRsxiJmXFQGfqX6jjM7/mgc=",
- "owner": "aylur",
- "repo": "astal",
- "rev": "7d1fac8a4b2a14954843a978d2ddde86168c75ef",
- "type": "github"
- },
- "original": {
- "owner": "aylur",
- "repo": "astal",
- "type": "github"
- }
- },
"awww": {
"inputs": {
"flake-compat": "flake-compat",
@@ -84,11 +40,11 @@
"rust-overlay": "rust-overlay"
},
"locked": {
- "lastModified": 1777136912,
- "narHash": "sha256-owyQdC2vi0kYC119fzyVQp0J4G0t1n4xXUwryhlBbqA=",
+ "lastModified": 1784030954,
+ "narHash": "sha256-MPMVSBhSEl+ShSrWVN5qH3FiX2gg8LbYA8L3nuQw5VE=",
"ref": "refs/heads/main",
- "rev": "f66e12a76dbc4c669b2f1375f78bce49f5b19d66",
- "revCount": 1363,
+ "rev": "25ea4fd7a42359379da9ddadedda1c477caa4ae0",
+ "revCount": 1376,
"type": "git",
"url": "https://codeberg.org/LGFae/awww"
},
@@ -97,6 +53,62 @@
"url": "https://codeberg.org/LGFae/awww"
}
},
+ "cardwire": {
+ "inputs": {
+ "fenix": "fenix",
+ "git-hooks": "git-hooks",
+ "nixpkgs": [
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1788457722,
+ "narHash": "sha256-UjAKoLsc+W837eDeA0XqLX3I1drmJMvEESKB0glHSps=",
+ "owner": "opengamingcollective",
+ "repo": "cardwire",
+ "rev": "db92fe8540aecdf9860df087485666a03b0c00ad",
+ "type": "github"
+ },
+ "original": {
+ "owner": "opengamingcollective",
+ "repo": "cardwire",
+ "type": "github"
+ }
+ },
+ "copyparty": {
+ "inputs": {
+ "flake-utils": "flake-utils",
+ "nixpkgs": "nixpkgs_4"
+ },
+ "locked": {
+ "lastModified": 1788296568,
+ "narHash": "sha256-k0oAChIZU2ycgJQX6fup9ncSvvOU1K93ZcDZYGiBhuA=",
+ "owner": "9001",
+ "repo": "copyparty",
+ "rev": "4e318d516531e6a9c683b21e58b9cb48131eb175",
+ "type": "github"
+ },
+ "original": {
+ "owner": "9001",
+ "repo": "copyparty",
+ "type": "github"
+ }
+ },
+ "crane": {
+ "locked": {
+ "lastModified": 1781825982,
+ "narHash": "sha256-SlXKwIRIhrOSAcTjCB3ftPLzJWZStQIPS7J1FlZPnKk=",
+ "owner": "ipetkov",
+ "repo": "crane",
+ "rev": "469fd08d0bcf6926321fa973c6777fbc87785dd7",
+ "type": "github"
+ },
+ "original": {
+ "owner": "ipetkov",
+ "repo": "crane",
+ "type": "github"
+ }
+ },
"cyber-tux": {
"inputs": {
"nixpkgs": [
@@ -119,16 +131,16 @@
},
"deploy-rs": {
"inputs": {
- "flake-compat": "flake-compat_2",
- "nixpkgs": "nixpkgs_2",
+ "flake-compat": "flake-compat_3",
+ "nixpkgs": "nixpkgs_5",
"utils": "utils"
},
"locked": {
- "lastModified": 1770019181,
- "narHash": "sha256-hwsYgDnby50JNVpTRYlF3UR/Rrpt01OrxVuryF40CFY=",
+ "lastModified": 1788395115,
+ "narHash": "sha256-7sprixDLchHgjQt1yNoc91d0L0lnbd1VUb3OPZpsIJk=",
"owner": "serokell",
"repo": "deploy-rs",
- "rev": "77c906c0ba56aabdbc72041bf9111b565cdd6171",
+ "rev": "a591d4600e8ada8b22489093ebf50337f4d98065",
"type": "github"
},
"original": {
@@ -144,11 +156,11 @@
]
},
"locked": {
- "lastModified": 1776613567,
- "narHash": "sha256-gC9Cp5ibBmGD5awCA9z7xy6MW6iJufhazTYJOiGlCUI=",
+ "lastModified": 1781152676,
+ "narHash": "sha256-RxWs5ND31KzTG7wvMM+PMfUjyNpmIEr999lqNARaM5o=",
"owner": "nix-community",
"repo": "disko",
- "rev": "32f4236bfc141ae930b5ba2fb604f561fed5219d",
+ "rev": "ff8702b4de27f72b4c78573dfb89ec74e36abdf1",
"type": "github"
},
"original": {
@@ -157,44 +169,22 @@
"type": "github"
}
},
- "emacs": {
- "inputs": {
- "nixpkgs": "nixpkgs_9",
- "nixpkgs-stable": "nixpkgs-stable"
- },
- "locked": {
- "lastModified": 1777171226,
- "narHash": "sha256-nEH9cLA1CRj5JAIjNHBqIam3SCetPNNVCqs8pc1SRao=",
- "owner": "nix-community",
- "repo": "emacs-overlay",
- "rev": "ef37c2288f4e1f709f0317757527f52c8563651b",
- "type": "github"
- },
- "original": {
- "owner": "nix-community",
- "repo": "emacs-overlay",
- "type": "github"
- }
- },
"fenix": {
"inputs": {
- "nixpkgs": [
- "nixpkgs-f2k",
- "nixpkgs-fmt",
- "nixpkgs"
- ],
+ "nixpkgs": "nixpkgs_2",
"rust-analyzer-src": "rust-analyzer-src"
},
"locked": {
- "lastModified": 1637475807,
- "narHash": "sha256-E3nzOvlzZXwyo8Stp5upKsTCDcqUTYAFj4EC060A31c=",
+ "lastModified": 1785572837,
+ "narHash": "sha256-7HLoqxURizfu1Gs5Xg0OTwi9s9Ewh7JpBeE2xVoZHAU=",
"owner": "nix-community",
"repo": "fenix",
- "rev": "960e7fef45692a4fffc6df6d6b613b0399bbdfd5",
+ "rev": "e6dc05cac3bc08fc8b00cc1571a456a47d7ca782",
"type": "github"
},
"original": {
"owner": "nix-community",
+ "ref": "monthly",
"repo": "fenix",
"type": "github"
}
@@ -218,15 +208,15 @@
"flake-compat_2": {
"flake": false,
"locked": {
- "lastModified": 1733328505,
- "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
- "owner": "edolstra",
+ "lastModified": 1767039857,
+ "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
+ "owner": "NixOS",
"repo": "flake-compat",
- "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
+ "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
"type": "github"
},
"original": {
- "owner": "edolstra",
+ "owner": "NixOS",
"repo": "flake-compat",
"type": "github"
}
@@ -234,11 +224,11 @@
"flake-compat_3": {
"flake": false,
"locked": {
- "lastModified": 1761588595,
- "narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=",
+ "lastModified": 1733328505,
+ "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
"owner": "edolstra",
"repo": "flake-compat",
- "rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5",
+ "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
"type": "github"
},
"original": {
@@ -264,36 +254,22 @@
}
},
"flake-compat_5": {
- "locked": {
- "lastModified": 1733328505,
- "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
- "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
- "revCount": 69,
- "type": "tarball",
- "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.1.0/01948eb7-9cba-704f-bbf3-3fa956735b52/source.tar.gz"
- },
- "original": {
- "type": "tarball",
- "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"
- }
- },
- "flake-compat_6": {
"flake": false,
"locked": {
"lastModified": 1767039857,
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
- "owner": "edolstra",
+ "owner": "NixOS",
"repo": "flake-compat",
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
"type": "github"
},
"original": {
- "owner": "edolstra",
+ "owner": "NixOS",
"repo": "flake-compat",
"type": "github"
}
},
- "flake-compat_7": {
+ "flake-compat_6": {
"flake": false,
"locked": {
"lastModified": 1767039857,
@@ -311,14 +287,16 @@
},
"flake-parts": {
"inputs": {
- "nixpkgs-lib": "nixpkgs-lib"
+ "nixpkgs-lib": [
+ "nixpkgs"
+ ]
},
"locked": {
- "lastModified": 1749398372,
- "narHash": "sha256-tYBdgS56eXYaWVW3fsnPQ/nFlgWi/Z2Ymhyu21zVM98=",
+ "lastModified": 1788450739,
+ "narHash": "sha256-glZLQlzIn1fXH6PazR2iUmTo7kzzyYSshrWhLS9TqCU=",
"owner": "hercules-ci",
"repo": "flake-parts",
- "rev": "9305fe4e5c2a6fcf5ba6a3ff155720fbe4076569",
+ "rev": "31729ca8cbdb4fa927b34e5f4353e6a83f39e993",
"type": "github"
},
"original": {
@@ -329,14 +307,17 @@
},
"flake-parts_2": {
"inputs": {
- "nixpkgs-lib": "nixpkgs-lib_2"
+ "nixpkgs-lib": [
+ "hermes-agent",
+ "nixpkgs"
+ ]
},
"locked": {
- "lastModified": 1775087534,
- "narHash": "sha256-91qqW8lhL7TLwgQWijoGBbiD4t7/q75KTi8NxjVmSmA=",
+ "lastModified": 1782949081,
+ "narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=",
"owner": "hercules-ci",
"repo": "flake-parts",
- "rev": "3107b77cd68437b9a76194f0f7f9c55f2329ca5b",
+ "rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e",
"type": "github"
},
"original": {
@@ -346,6 +327,42 @@
}
},
"flake-parts_3": {
+ "inputs": {
+ "nixpkgs-lib": "nixpkgs-lib"
+ },
+ "locked": {
+ "lastModified": 1782949081,
+ "narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=",
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "type": "github"
+ }
+ },
+ "flake-parts_4": {
+ "inputs": {
+ "nixpkgs-lib": "nixpkgs-lib_2"
+ },
+ "locked": {
+ "lastModified": 1785627969,
+ "narHash": "sha256-4dtXQk/NMePegK/nWp5NSeuZKLATItOq61lpEvmXqGw=",
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "rev": "427bf4bd9435fdf21321c8cc628c24efc14c0f7a",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "type": "github"
+ }
+ },
+ "flake-parts_5": {
"inputs": {
"nixpkgs-lib": [
"nur",
@@ -366,13 +383,31 @@
"type": "github"
}
},
+ "flake-parts_6": {
+ "inputs": {
+ "nixpkgs-lib": "nixpkgs-lib_3"
+ },
+ "locked": {
+ "lastModified": 1788450739,
+ "narHash": "sha256-glZLQlzIn1fXH6PazR2iUmTo7kzzyYSshrWhLS9TqCU=",
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "rev": "31729ca8cbdb4fa927b34e5f4353e6a83f39e993",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "type": "github"
+ }
+ },
"flake-utils": {
"locked": {
- "lastModified": 1637014545,
- "narHash": "sha256-26IZAc5yzlD9FlDT54io1oqG/bBoyka+FJk5guaX4x4=",
+ "lastModified": 1678901627,
+ "narHash": "sha256-U02riOqrKKzwjsxc/400XnElV+UtPUQWpANPlyazjH0=",
"owner": "numtide",
"repo": "flake-utils",
- "rev": "bba5dcc8e0b20ab664967ad83d24d64cb64ec4f4",
+ "rev": "93a2b84fc4b70d9e089d029deacc3583435c2ed6",
"type": "github"
},
"original": {
@@ -382,6 +417,28 @@
}
},
"flake-utils_2": {
+ "inputs": {
+ "systems": [
+ "mango",
+ "scenefx",
+ "systems"
+ ]
+ },
+ "locked": {
+ "lastModified": 1731533236,
+ "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "type": "github"
+ }
+ },
+ "flake-utils_3": {
"inputs": {
"systems": "systems_5"
},
@@ -399,6 +456,24 @@
"type": "github"
}
},
+ "flake-utils_4": {
+ "inputs": {
+ "systems": "systems_6"
+ },
+ "locked": {
+ "lastModified": 1731533236,
+ "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "type": "github"
+ }
+ },
"freetype2": {
"flake": false,
"locked": {
@@ -416,34 +491,30 @@
"type": "github"
}
},
- "ghostty": {
+ "git-hooks": {
"inputs": {
- "flake-compat": "flake-compat_3",
- "home-manager": "home-manager",
- "nixpkgs": "nixpkgs_3",
- "systems": "systems_2",
- "zig": "zig",
- "zon2nix": "zon2nix"
+ "flake-compat": "flake-compat_2",
+ "nixpkgs": "nixpkgs_3"
},
"locked": {
- "lastModified": 1777175394,
- "narHash": "sha256-O85asIMCDEZotzFUzgQ+6neoIxEgotjOKvmfNg1fkq0=",
- "owner": "ghostty-org",
- "repo": "ghostty",
- "rev": "c74f6d56d1feef473033057bc0ff7e3f00cf6421",
+ "lastModified": 1787424939,
+ "narHash": "sha256-O2tBn84NNuHrnqNVxx/XqsXwfYvS1YwBh+7CBnbCYsk=",
+ "owner": "cachix",
+ "repo": "git-hooks.nix",
+ "rev": "809414f0cdadf82cf11b06c2b29ba9b3168b3297",
"type": "github"
},
"original": {
- "owner": "ghostty-org",
- "repo": "ghostty",
+ "owner": "cachix",
+ "repo": "git-hooks.nix",
"type": "github"
}
},
"gitignore": {
"inputs": {
"nixpkgs": [
- "hyprland",
- "pre-commit-hooks",
+ "lanzaboote",
+ "pre-commit",
"nixpkgs"
]
},
@@ -478,19 +549,43 @@
"type": "github"
}
},
+ "hermes-agent": {
+ "inputs": {
+ "flake-parts": "flake-parts_2",
+ "home-manager": "home-manager",
+ "nixpkgs": "nixpkgs_6",
+ "npm-lockfile-fix": "npm-lockfile-fix",
+ "pyproject-build-systems": "pyproject-build-systems",
+ "pyproject-nix": "pyproject-nix",
+ "uv2nix": "uv2nix"
+ },
+ "locked": {
+ "lastModified": 1788438011,
+ "narHash": "sha256-3qXLnmqe4wU8eMDPcS0JKMVYJ+rfAE57gJIwE/arW08=",
+ "owner": "NousResearch",
+ "repo": "hermes-agent",
+ "rev": "63279301bcbdc185c1b07b98a9312eb0c862f26d",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NousResearch",
+ "repo": "hermes-agent",
+ "type": "github"
+ }
+ },
"home-manager": {
"inputs": {
"nixpkgs": [
- "ghostty",
+ "hermes-agent",
"nixpkgs"
]
},
"locked": {
- "lastModified": 1770586272,
- "narHash": "sha256-Ucci8mu8QfxwzyfER2DQDbvW9t1BnTUJhBmY7ybralo=",
+ "lastModified": 1786487128,
+ "narHash": "sha256-ad60hrRVhH/bo3Jl1YLzO+QcS3mUNZr9LNJdzhMO2P4=",
"owner": "nix-community",
"repo": "home-manager",
- "rev": "b1f916ba052341edc1f80d4b2399f1092a4873ca",
+ "rev": "f404edbfa4117810c96b97048299242fc50e5362",
"type": "github"
},
"original": {
@@ -506,11 +601,11 @@
]
},
"locked": {
- "lastModified": 1777218285,
- "narHash": "sha256-d2FY71SBVKVbT1PsfXA71jz0vD520NijS4lrcvUMeGk=",
+ "lastModified": 1788487777,
+ "narHash": "sha256-Ro/e1N4ZR8/XaFF+sF9SgfPK79HM5YNEppzFj8p+0Ak=",
"owner": "nix-community",
"repo": "home-manager",
- "rev": "c55c498c9aa205b16cca78b57a7275625726d532",
+ "rev": "693e8ce0fb240a73c116a03cfd7b19269c87af88",
"type": "github"
},
"original": {
@@ -556,11 +651,11 @@
]
},
"locked": {
- "lastModified": 1776511930,
- "narHash": "sha256-fCpwFiTW0rT7oKJqr3cqHMnkwypSwQKpbtUEtxdkgrM=",
+ "lastModified": 1786464181,
+ "narHash": "sha256-2alOMkLjXANh7unkZnYnCF2K2rApZaOLMoQ3o+VX2CY=",
"owner": "hyprwm",
"repo": "hyprcursor",
- "rev": "39435900785d0c560c6ae8777d29f28617d031ef",
+ "rev": "e4ed7c08123df5af460a0a70961380cbfb872f76",
"type": "github"
},
"original": {
@@ -585,11 +680,11 @@
]
},
"locked": {
- "lastModified": 1776426399,
- "narHash": "sha256-RUESLKNikIeEq9ymGJ6nmcDXiSFQpUW1IhJ245nL3xM=",
+ "lastModified": 1786464367,
+ "narHash": "sha256-k58p4wbzIXWyRWrW84pP8tD+iaZSSYiiM+fr0Auk4oU=",
"owner": "hyprwm",
"repo": "hyprgraphics",
- "rev": "68d064434787cf1ed4a2fe257c03c5f52f33cf84",
+ "rev": "7c895c44e3ca6d28ed68ddd80ec02b02b925e7fc",
"type": "github"
},
"original": {
@@ -609,17 +704,17 @@
"hyprutils": "hyprutils",
"hyprwayland-scanner": "hyprwayland-scanner",
"hyprwire": "hyprwire",
- "nixpkgs": "nixpkgs_4",
+ "nixpkgs": "nixpkgs_7",
"pre-commit-hooks": "pre-commit-hooks",
- "systems": "systems_3",
+ "systems": "systems_2",
"xdph": "xdph"
},
"locked": {
- "lastModified": 1777227673,
- "narHash": "sha256-nORN5YGU0T2PnvgpMc7ukPWza27oVtTTquCGOhpEV+A=",
+ "lastModified": 1788467157,
+ "narHash": "sha256-bDcUf8uUQWmbXCJE5crKTt4Sz5d85Hxi+RW2vBeg6BA=",
"owner": "hyprwm",
"repo": "Hyprland",
- "rev": "84d45bd13acce0b16c8f86e83144f22b18d9398e",
+ "rev": "cb537a387e32dc8abe5e8f2a1cec4572427e5c37",
"type": "github"
},
"original": {
@@ -661,11 +756,11 @@
]
},
"locked": {
- "lastModified": 1776426575,
- "narHash": "sha256-KI6nIfVihn/DPaeB5Et46Xg3dkNHrrEtUd5LBBVomB0=",
+ "lastModified": 1786464504,
+ "narHash": "sha256-7sHwM86KILQyHDHDuE2SDBlQ2jvZ0EW3hY7sW009/cg=",
"owner": "hyprwm",
"repo": "hyprland-guiutils",
- "rev": "a968d211048e3ed538e47b84cb3649299578f19d",
+ "rev": "4c30cf3097ea963c0e250749ee0c59f8b08816d6",
"type": "github"
},
"original": {
@@ -674,36 +769,6 @@
"type": "github"
}
},
- "hyprland-plugins": {
- "inputs": {
- "hyprland": [
- "hyprland"
- ],
- "nixpkgs": [
- "hyprland-plugins",
- "hyprland",
- "nixpkgs"
- ],
- "systems": [
- "hyprland-plugins",
- "hyprland",
- "systems"
- ]
- },
- "locked": {
- "lastModified": 1777220105,
- "narHash": "sha256-M9JZK+8GVKAIVdQpcCG/49zBF3ylxO8zxW+hVjM5QpE=",
- "owner": "hyprwm",
- "repo": "hyprland-plugins",
- "rev": "dbe221941a5095e1b381ac460a152cf173b108b8",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "repo": "hyprland-plugins",
- "type": "github"
- }
- },
"hyprland-protocols": {
"inputs": {
"nixpkgs": [
@@ -745,11 +810,11 @@
]
},
"locked": {
- "lastModified": 1776426736,
- "narHash": "sha256-rl7i4aY+9p8LysJp7o8uRWahCkpFznCgGHXszlTw7b0=",
+ "lastModified": 1786464129,
+ "narHash": "sha256-339AkTlpMYSIvFuG0rnR+8Yg4/AZKeJalshJavlnKfg=",
"owner": "hyprwm",
"repo": "hyprlang",
- "rev": "7833ff33b2e82d3406337b5dcf0d1cec595d83e9",
+ "rev": "9508458be316a0d70d37ebed1ab725ccd10411ff",
"type": "github"
},
"original": {
@@ -797,11 +862,11 @@
]
},
"locked": {
- "lastModified": 1772462885,
- "narHash": "sha256-5pHXrQK9zasMnIo6yME6EOXmWGFMSnCITcfKshhKJ9I=",
+ "lastModified": 1785930473,
+ "narHash": "sha256-DitTu625BhEYpZjtjxtGpjrEJwPwW+X/+jJvhSZNSJM=",
"owner": "hyprwm",
"repo": "hyprtoolkit",
- "rev": "9af245a69fa6b286b88ddfc340afd288e00a6998",
+ "rev": "af515b69dfbe366dc7873aa1475cb2f4db3ebad7",
"type": "github"
},
"original": {
@@ -822,11 +887,11 @@
]
},
"locked": {
- "lastModified": 1777148223,
- "narHash": "sha256-PTf7kRFFzCW6rIYxLH2fWfVJmj86FSYe3k6L8B+IM9o=",
+ "lastModified": 1786903207,
+ "narHash": "sha256-QTwMqLLONRhv9iz6CVeuX6BqQNQCIqI8hL/cPYlR/24=",
"owner": "hyprwm",
"repo": "hyprutils",
- "rev": "fa3992be2dfebe4ab06d753c6ca59bea298e798f",
+ "rev": "6cf50415e06dc6bd9f1252f1b745eac6b4a1cc39",
"type": "github"
},
"original": {
@@ -847,11 +912,11 @@
]
},
"locked": {
- "lastModified": 1777148232,
- "narHash": "sha256-Uv0WZLhu89SafuSOmYDA7akrPt4wBRmsa1ucasO5aXg=",
+ "lastModified": 1786464033,
+ "narHash": "sha256-QM8Qe4/L8lpdVN4bgwahmi+jyyc4fisseDMe4afcDxA=",
"owner": "hyprwm",
"repo": "hyprwayland-scanner",
- "rev": "fec9cf1abcc1011e46f0a0986f46bf93c6bf8b92",
+ "rev": "62e62c1ca23da17612c6890d4ad2064f575643db",
"type": "github"
},
"original": {
@@ -876,11 +941,11 @@
]
},
"locked": {
- "lastModified": 1776728575,
- "narHash": "sha256-z9eGphrArEBpl1O/GCH0wlY6z4K9vA6yWh2gAS6qytU=",
+ "lastModified": 1786464294,
+ "narHash": "sha256-ZQsZ2WvBdkboCIyh8LStDPdAIARmxzn0XMNxxoOhjPE=",
"owner": "hyprwm",
"repo": "hyprwire",
- "rev": "f3a80888783702a39691b684d099e16b83ed4702",
+ "rev": "4ce7cd6b6128c1ac41caf23c58a30a26b327f9dd",
"type": "github"
},
"original": {
@@ -892,7 +957,7 @@
"impermanence": {
"inputs": {
"home-manager": "home-manager_3",
- "nixpkgs": "nixpkgs_5"
+ "nixpkgs": "nixpkgs_8"
},
"locked": {
"lastModified": 1769548169,
@@ -908,33 +973,32 @@
"type": "github"
}
},
- "infuse": {
- "flake": false,
+ "import-tree": {
"locked": {
- "lastModified": 1768766368,
- "narHash": "sha256-GW7S5dsFiQChSbGESrkFyNSzDLKGNH3H0EMeY+NLefY=",
- "ref": "refs/heads/trunk",
- "rev": "e837ece1b9de6ebcb7abd261f54a09bad3a2f820",
- "revCount": 49,
- "type": "git",
- "url": "https://codeberg.org/amjoseph/infuse.nix.git"
+ "lastModified": 1788467110,
+ "narHash": "sha256-ljEMTXP/rH0tOvDzc9gzwww6KcHRPRnEHzd9lK48V7s=",
+ "owner": "vic",
+ "repo": "import-tree",
+ "rev": "eb1b52eaecc57f7c136d07ae8a93e724dfecac46",
+ "type": "github"
},
"original": {
- "type": "git",
- "url": "https://codeberg.org/amjoseph/infuse.nix.git"
+ "owner": "vic",
+ "repo": "import-tree",
+ "type": "github"
}
},
"lan-mouse": {
"inputs": {
- "nixpkgs": "nixpkgs_6",
+ "nixpkgs": "nixpkgs_9",
"rust-overlay": "rust-overlay_2"
},
"locked": {
- "lastModified": 1775729061,
- "narHash": "sha256-3MotJ2seD7IXvyGpvBhzgEbERBHrWxeCrtGtOcdjEGQ=",
+ "lastModified": 1788178270,
+ "narHash": "sha256-396Ghde4Ux1h/HUiqlaajbcGSgtYAFeP8Bg2He8QUBQ=",
"owner": "feschber",
"repo": "lan-mouse",
- "rev": "a878c985f0633a12b00a363883fd56385c2368e7",
+ "rev": "6b1eddef7ab3ae0b06f2ed3d9b21165e03ea4cad",
"type": "github"
},
"original": {
@@ -943,6 +1007,28 @@
"type": "github"
}
},
+ "lanzaboote": {
+ "inputs": {
+ "crane": "crane",
+ "nixpkgs": "nixpkgs_10",
+ "pre-commit": "pre-commit",
+ "rust-overlay": "rust-overlay_3"
+ },
+ "locked": {
+ "lastModified": 1782141370,
+ "narHash": "sha256-hqijVSEETttmo8Okql9/LG0Ua34hdciKW1a5zzlj8mU=",
+ "owner": "nix-community",
+ "repo": "lanzaboote",
+ "rev": "7c9a54a7f87b4539ddbd8bda09a8a5f5f9361aa9",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "ref": "v1.1.0",
+ "repo": "lanzaboote",
+ "type": "github"
+ }
+ },
"libpng": {
"flake": false,
"locked": {
@@ -962,18 +1048,18 @@
},
"mango": {
"inputs": {
- "flake-parts": "flake-parts",
+ "flake-parts": "flake-parts_3",
"nixpkgs": [
"nixpkgs"
],
"scenefx": "scenefx"
},
"locked": {
- "lastModified": 1776999768,
- "narHash": "sha256-RP7eVqbnQ/uNCXh0HH8SXRIerMlkyHco+wpI9oxon0U=",
+ "lastModified": 1788490924,
+ "narHash": "sha256-tymTjjNKWohVzXycg2mN7cSApQ6NDmn9k4LklNq/WGo=",
"owner": "DreamMaoMao",
"repo": "mango",
- "rev": "b9c6a2c1964cb59536c5d3e02d2ff981a7eb36d2",
+ "rev": "7b4266f1d8df09f83283574ba61dba51656d4791",
"type": "github"
},
"original": {
@@ -988,7 +1074,10 @@
"nix-on-droid",
"nixpkgs"
],
- "nmd": "nmd",
+ "nmd": [
+ "nix-on-droid",
+ "nmd"
+ ],
"nmt": "nmt"
},
"locked": {
@@ -1012,11 +1101,11 @@
]
},
"locked": {
- "lastModified": 1777181277,
- "narHash": "sha256-yVJbd07ortDRAttDFmDV5p220aOLTHgVAx//0nW/xW8=",
+ "lastModified": 1788080100,
+ "narHash": "sha256-n14luQo3F/ZLfCEHk1QieiI1nGnW92ZQZeZ0UIb0UMQ=",
"owner": "nix-community",
"repo": "nix-index-database",
- "rev": "b8eb7acee0f7604fe1bf6a5b3dcf5254369180fa",
+ "rev": "dbb978fa87faf13398e90ccbc52c343d21c7dd6d",
"type": "github"
},
"original": {
@@ -1036,77 +1125,36 @@
],
"nixpkgs-docs": "nixpkgs-docs",
"nixpkgs-for-bootstrap": "nixpkgs-for-bootstrap",
- "nmd": "nmd_2"
+ "nmd": "nmd"
},
"locked": {
- "lastModified": 1720396533,
- "narHash": "sha256-UFzk/hZWO1VkciIO5UPaSpJN8s765wsngUSvtJM6d5Q=",
+ "lastModified": 1787352026,
+ "narHash": "sha256-2MKUKRNV+5qs3nbQDmz7L6KRHSEHDy/lZjfIAYMZSOE=",
"owner": "nix-community",
"repo": "nix-on-droid",
- "rev": "f3d3b8294039f2f9a8fb7ea82c320f29c6b0fe25",
+ "rev": "df611d5358360092b1d2e7e756f94b23843bd9d6",
"type": "github"
},
"original": {
"owner": "nix-community",
- "ref": "release-24.05",
+ "ref": "master",
"repo": "nix-on-droid",
"type": "github"
}
},
- "nix-secrets": {
- "inputs": {
- "nixpkgs": [
- "nixpkgs"
- ]
- },
- "locked": {
- "lastModified": 1741040419,
- "narHash": "sha256-BqBIfzYFs8zGvMpxXYt1yWRIH3nVBvTrWkk2RXCA0To=",
- "ref": "refs/heads/main",
- "rev": "6f7627cee3da9490f2f29afae3c223b8ac2f565f",
- "shallow": true,
- "type": "git",
- "url": "ssh://git@github.com/tuxdotrs/nix-secrets.git"
- },
- "original": {
- "shallow": true,
- "type": "git",
- "url": "ssh://git@github.com/tuxdotrs/nix-secrets.git"
- }
- },
- "nix-vscode-extensions": {
- "inputs": {
- "nixpkgs": [
- "nixpkgs"
- ]
- },
- "locked": {
- "lastModified": 1777226942,
- "narHash": "sha256-R7spsiBBO++he+uhvKCTKwWtCJR02mOqTvU3EEBemb0=",
- "owner": "nix-community",
- "repo": "nix-vscode-extensions",
- "rev": "ec41b109469c7061fab246ee94712f44fda8156f",
- "type": "github"
- },
- "original": {
- "owner": "nix-community",
- "repo": "nix-vscode-extensions",
- "type": "github"
- }
- },
"nixcord": {
"inputs": {
- "flake-compat": "flake-compat_5",
- "flake-parts": "flake-parts_2",
- "nixpkgs": "nixpkgs_7",
- "nixpkgs-nixcord": "nixpkgs-nixcord"
+ "flake-parts": "flake-parts_4",
+ "nixpkgs": "nixpkgs_11",
+ "nixpkgs-nixcord": "nixpkgs-nixcord",
+ "treefmt-nix": "treefmt-nix"
},
"locked": {
- "lastModified": 1777125640,
- "narHash": "sha256-jKmRu5PknoI0pk3WEqMhVReosUubUCq3M/izEQWzb+4=",
+ "lastModified": 1788512400,
+ "narHash": "sha256-pFiwb+c/lIvMvjSzJONZ+jPi36kbbljys7OFy+Kxt3U=",
"owner": "kaylorben",
"repo": "nixcord",
- "rev": "0e738683dd7551a9cbfa343397b1592dfd785b7e",
+ "rev": "004e2c950c0b4a404fb3ea5ab01f5645265e4322",
"type": "github"
},
"original": {
@@ -1116,38 +1164,21 @@
}
},
"nixos-hardware": {
- "locked": {
- "lastModified": 1776983936,
- "narHash": "sha256-ZOQyNqSvJ8UdrrqU1p7vaFcdL53idK+LOM8oRWEWh6o=",
- "owner": "nixos",
- "repo": "nixos-hardware",
- "rev": "2096f3f411ce46e88a79ae4eafcfc9df8ed41c61",
- "type": "github"
- },
- "original": {
- "owner": "nixos",
- "repo": "nixos-hardware",
- "type": "github"
- }
- },
- "nixos-wsl": {
"inputs": {
- "flake-compat": "flake-compat_6",
- "nixpkgs": [
- "nixpkgs"
- ]
+ "nixpkgs": "nixpkgs_12"
},
"locked": {
- "lastModified": 1776910211,
- "narHash": "sha256-0ku3gW8bZ9TTpEU2fQw86oU6ZLT2vF6pacF+cLaf7VY=",
- "owner": "nix-community",
- "repo": "nixos-wsl",
- "rev": "4e6cad241baa0115a7aae8c55b04c166da4997c9",
+ "lastModified": 1788335262,
+ "narHash": "sha256-3jBEq8avfzlrsY4UpW4d5TOmm7ocseZfnitEJhqauyc=",
+ "owner": "NixOS",
+ "repo": "nixos-hardware",
+ "rev": "44d95795ee2d475b3d687325e26dcf4ca9104557",
"type": "github"
},
"original": {
- "owner": "nix-community",
- "repo": "nixos-wsl",
+ "owner": "NixOS",
+ "ref": "master",
+ "repo": "nixos-hardware",
"type": "github"
}
},
@@ -1183,51 +1214,6 @@
"type": "github"
}
},
- "nixpkgs-f2k": {
- "inputs": {
- "emacs": "emacs",
- "infuse": "infuse",
- "nixpkgs": "nixpkgs_10",
- "nixpkgs-fmt": "nixpkgs-fmt",
- "parts": "parts"
- },
- "locked": {
- "lastModified": 1777180539,
- "narHash": "sha256-y6gBux0av65/ydC8iM6s/DFPs1wm2d4+26MvGZTJT1I=",
- "owner": "moni-dz",
- "repo": "nixpkgs-f2k",
- "rev": "2e1d7fc8f7f9405d926b54df3503f114e6b5daed",
- "type": "github"
- },
- "original": {
- "owner": "moni-dz",
- "repo": "nixpkgs-f2k",
- "type": "github"
- }
- },
- "nixpkgs-fmt": {
- "inputs": {
- "fenix": "fenix",
- "flake-utils": "flake-utils",
- "nixpkgs": [
- "nixpkgs-f2k",
- "nixpkgs"
- ]
- },
- "locked": {
- "lastModified": 1721822211,
- "narHash": "sha256-zacOgNv3qM3AbSG3p5PT/Bfc4c7NoIqoLII8/jIUsOQ=",
- "owner": "nix-community",
- "repo": "nixpkgs-fmt",
- "rev": "bdb15b4c7e0cb49ae091dd43113d0a938afae02c",
- "type": "github"
- },
- "original": {
- "owner": "nix-community",
- "repo": "nixpkgs-fmt",
- "type": "github"
- }
- },
"nixpkgs-for-bootstrap": {
"locked": {
"lastModified": 1720244366,
@@ -1246,11 +1232,11 @@
},
"nixpkgs-lib": {
"locked": {
- "lastModified": 1748740939,
- "narHash": "sha256-rQaysilft1aVMwF14xIdGS3sj1yHlI6oKQNBRTF40cc=",
+ "lastModified": 1782614948,
+ "narHash": "sha256-ePjCwr1sNm9NYUqywL7QfK3JnlS015msC+eBu2zKlp8=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
- "rev": "656a64127e9d791a334452c6b6606d17539476e2",
+ "rev": "db3f255737b94216eb71cce308e2912cf6bc2d7c",
"type": "github"
},
"original": {
@@ -1261,11 +1247,11 @@
},
"nixpkgs-lib_2": {
"locked": {
- "lastModified": 1774748309,
- "narHash": "sha256-+U7gF3qxzwD5TZuANzZPeJTZRHS29OFQgkQ2kiTJBIQ=",
+ "lastModified": 1785031560,
+ "narHash": "sha256-OmshNvn2vupOFpYinLUu+1Dnpu4n7Q5N3ggGVNHpkUI=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
- "rev": "333c4e0545a6da976206c74db8773a1645b5870a",
+ "rev": "0e79af5e3d4dcfcd676ab5ba3f95d2e3352e078c",
"type": "github"
},
"original": {
@@ -1276,11 +1262,11 @@
},
"nixpkgs-lib_3": {
"locked": {
- "lastModified": 1774748309,
- "narHash": "sha256-+U7gF3qxzwD5TZuANzZPeJTZRHS29OFQgkQ2kiTJBIQ=",
+ "lastModified": 1788057806,
+ "narHash": "sha256-DTQSMxzDWmT0zhguthvegnVkn7CFqGCv4IHCzk5ZUpM=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
- "rev": "333c4e0545a6da976206c74db8773a1645b5870a",
+ "rev": "596e2e3940e09b2abbeb03f75fa1828c57fcd72c",
"type": "github"
},
"original": {
@@ -1291,75 +1277,104 @@
},
"nixpkgs-nixcord": {
"locked": {
- "lastModified": 1776734388,
- "narHash": "sha256-vl3dkhlE5gzsItuHoEMVe+DlonsK+0836LIRDnm6MXQ=",
+ "lastModified": 1786711500,
+ "narHash": "sha256-QvnceIGTBeDvDd9oCn+GvdsnkquliuwbVgpiRH68qaQ=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "10e7ad5bbcb421fe07e3a4ad53a634b0cd57ffac",
+ "rev": "02e08985a27c65ffd33d434eeb2e660a2e4dc84d",
"type": "github"
},
"original": {
"owner": "NixOS",
- "ref": "nixos-25.11",
+ "ref": "nixos-26.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-stable": {
"locked": {
- "lastModified": 1776734388,
- "narHash": "sha256-vl3dkhlE5gzsItuHoEMVe+DlonsK+0836LIRDnm6MXQ=",
+ "lastModified": 1782841183,
+ "narHash": "sha256-Ndt/5R7UN4rBdhFR1lxHZZZ42cD6vGlnuxC2VvvsKE4=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "10e7ad5bbcb421fe07e3a4ad53a634b0cd57ffac",
+ "rev": "c9bfd86ed684d27e63b0ff9ebb18699f84f27a3b",
"type": "github"
},
"original": {
"owner": "NixOS",
- "ref": "nixos-25.11",
- "repo": "nixpkgs",
- "type": "github"
- }
- },
- "nixpkgs-stable_2": {
- "locked": {
- "lastModified": 1751290243,
- "narHash": "sha256-kNf+obkpJZWar7HZymXZbW+Rlk3HTEIMlpc6FCNz0Ds=",
- "owner": "nixos",
- "repo": "nixpkgs",
- "rev": "5ab036a8d97cb9476fbe81b09076e6e91d15e1b6",
- "type": "github"
- },
- "original": {
- "owner": "nixos",
- "ref": "release-24.11",
+ "ref": "nixos-25.11-small",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_10": {
"locked": {
- "lastModified": 1777179511,
- "narHash": "sha256-GCqyVuDsIavHaoFa1dGHAPGKkMbjMhexYN9wBZQNH8U=",
+ "lastModified": 1781577229,
+ "narHash": "sha256-lrp67w8AulE9Ks53n27I45ADSzbOCn4H+CNW1Ck8B+8=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "e56e56311fc951877e3fda0dac432554ce2d21c5",
+ "rev": "567a49d1913ce81ac6e9582e3553dd90a955875f",
"type": "github"
},
"original": {
"owner": "NixOS",
- "ref": "master",
+ "ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_11": {
"locked": {
- "lastModified": 1776877367,
- "narHash": "sha256-EHq1/OX139R1RvBzOJ0aMRT3xnWyqtHBRUBuO1gFzjI=",
+ "lastModified": 1786711500,
+ "narHash": "sha256-QvnceIGTBeDvDd9oCn+GvdsnkquliuwbVgpiRH68qaQ=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "02e08985a27c65ffd33d434eeb2e660a2e4dc84d",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixos-26.05",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs_12": {
+ "locked": {
+ "lastModified": 1767892417,
+ "narHash": "sha256-8bW3q88CEg2u4hSP66Vf4lpbLonHz7hqDNBMcCY7E9U=",
+ "rev": "3497aa5c9457a9d88d71fa93a4a8368816fbeeba",
+ "type": "tarball",
+ "url": "https://releases.nixos.org/nixos/unstable/nixos-26.05pre924538.3497aa5c9457/nixexprs.tar.xz"
+ },
+ "original": {
+ "type": "tarball",
+ "url": "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz"
+ }
+ },
+ "nixpkgs_13": {
+ "locked": {
+ "lastModified": 1788316716,
+ "narHash": "sha256-bc7rSpXIdn9QWGNqfWcPZWOhEVF8NoeAZkWq0XWnf/k=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "3ed67ec0a4d3c7ab4ae1f04f8ee8df07bfa506a2",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs_14": {
+ "locked": {
+ "lastModified": 1788316716,
+ "narHash": "sha256-bc7rSpXIdn9QWGNqfWcPZWOhEVF8NoeAZkWq0XWnf/k=",
"owner": "nixos",
"repo": "nixpkgs",
- "rev": "0726a0ecb6d4e08f6adced58726b95db924cef57",
+ "rev": "3ed67ec0a4d3c7ab4ae1f04f8ee8df07bfa506a2",
"type": "github"
},
"original": {
@@ -1369,13 +1384,13 @@
"type": "github"
}
},
- "nixpkgs_12": {
+ "nixpkgs_15": {
"locked": {
- "lastModified": 1775888245,
- "narHash": "sha256-nwASzrRDD1JBEu/o8ekKYEXm/oJW6EMCzCRdrwcLe90=",
+ "lastModified": 1776683584,
+ "narHash": "sha256-NuTLMrr10Tng72hurYG8jYQ4XKK8wnpJmOGcPiis96g=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "13043924aaa7375ce482ebe2494338e058282925",
+ "rev": "9dd5558b06dbdacbf635a3dd36dce1b1a7ee3a89",
"type": "github"
},
"original": {
@@ -1385,7 +1400,150 @@
"type": "github"
}
},
+ "nixpkgs_16": {
+ "locked": {
+ "lastModified": 1788404924,
+ "narHash": "sha256-lhEhY8X5EgkQ/eg6IFz4cc8jRuSYSvnxx1al7d1dvZ0=",
+ "owner": "nixos",
+ "repo": "nixpkgs",
+ "rev": "0968519e14f7aa7d3e9b389682bd74d2b51c8ce8",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nixos",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs_17": {
+ "locked": {
+ "lastModified": 1782175435,
+ "narHash": "sha256-EMzXKmnOtBQ2MnvpiNOm7E+kOMvdPrIKaeg52Tip2Uk=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "89570f24e97e614aa34aa9ab1c927b6578a43775",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixpkgs-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs_18": {
+ "locked": {
+ "lastModified": 1788775869,
+ "narHash": "sha256-JRf1lSypbvKj6AzUZHpUA6YC1DirVuitZWOnRwcm+Ww=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "58973d74f1893afe13f5902919803a0e99da0ca4",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixpkgs-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs_19": {
+ "locked": {
+ "lastModified": 1770107345,
+ "narHash": "sha256-tbS0Ebx2PiA1FRW8mt8oejR0qMXmziJmPaU1d4kYY9g=",
+ "owner": "nixos",
+ "repo": "nixpkgs",
+ "rev": "4533d9293756b63904b7238acb84ac8fe4c8c2c4",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nixos",
+ "ref": "nixpkgs-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
"nixpkgs_2": {
+ "locked": {
+ "lastModified": 1785454630,
+ "narHash": "sha256-LQy14TZp77TwbQf40gg1V3jo8FwJG0jGDkAH+zRHqg8=",
+ "owner": "nixos",
+ "repo": "nixpkgs",
+ "rev": "1559d3daa3ecc813a650b79375ea61b6741b8746",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nixos",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs_20": {
+ "locked": {
+ "lastModified": 1740547748,
+ "narHash": "sha256-Ly2fBL1LscV+KyCqPRufUBuiw+zmWrlJzpWOWbahplg=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "3a05eebede89661660945da1f151959900903b6a",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixpkgs-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs_21": {
+ "locked": {
+ "lastModified": 1774386573,
+ "narHash": "sha256-4hAV26quOxdC6iyG7kYaZcM3VOskcPUrdCQd/nx8obc=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "46db2e09e1d3f113a13c0d7b81e2f221c63b8ce9",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs_3": {
+ "locked": {
+ "lastModified": 1782918843,
+ "narHash": "sha256-ETYnV9U7Sr+A45dohzZdfCZKOss4qrTkO+wgNZNvEc0=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "e8273b29fe1390ec8d4603f2477357555291432e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixpkgs-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs_4": {
+ "locked": {
+ "lastModified": 1748162331,
+ "narHash": "sha256-rqc2RKYTxP3tbjA+PB3VMRQNnjesrT0pEofXQTrMsS8=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "7c43f080a7f28b2774f3b3f43234ca11661bf334",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "nixos-25.05",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_5": {
"locked": {
"lastModified": 1743014863,
"narHash": "sha256-jAIUqsiN2r3hCuHji80U7NNEafpIMBXiwKlSrjWMlpg=",
@@ -1401,26 +1559,13 @@
"type": "github"
}
},
- "nixpkgs_3": {
+ "nixpkgs_6": {
"locked": {
- "lastModified": 1770537093,
- "narHash": "sha256-XV30uo8tXuxdzuV8l3sojmlPRLd/8tpMsOp4lNzLGUo=",
- "rev": "fef9403a3e4d31b0a23f0bacebbec52c248fbb51",
- "type": "tarball",
- "url": "https://releases.nixos.org/nixpkgs/nixpkgs-26.05pre942631.fef9403a3e4d/nixexprs.tar.xz"
- },
- "original": {
- "type": "tarball",
- "url": "https://channels.nixos.org/nixpkgs-unstable/nixexprs.tar.xz"
- }
- },
- "nixpkgs_4": {
- "locked": {
- "lastModified": 1776877367,
- "narHash": "sha256-EHq1/OX139R1RvBzOJ0aMRT3xnWyqtHBRUBuO1gFzjI=",
+ "lastModified": 1785318670,
+ "narHash": "sha256-dN6Ou5x/+23FZLEpYP3IffO+NyJFzUlGumt1uu3MMaY=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "0726a0ecb6d4e08f6adced58726b95db924cef57",
+ "rev": "0954f7ee2f6bb3dc7d4e3d0d8bcb8fd4bde4cfc5",
"type": "github"
},
"original": {
@@ -1430,7 +1575,23 @@
"type": "github"
}
},
- "nixpkgs_5": {
+ "nixpkgs_7": {
+ "locked": {
+ "lastModified": 1787736819,
+ "narHash": "sha256-cV5xEJJK3BvhU8rEd4mC9UsmDi5qscv/kzGPhBRC5WA=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "9fbb54b33e91ee4ca368e35a78e0613c720600b3",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs_8": {
"locked": {
"lastModified": 1768564909,
"narHash": "sha256-Kell/SpJYVkHWMvnhqJz/8DqQg2b6PguxVWOuadbHCc=",
@@ -1446,7 +1607,7 @@
"type": "github"
}
},
- "nixpkgs_6": {
+ "nixpkgs_9": {
"locked": {
"lastModified": 1772963539,
"narHash": "sha256-9jVDGZnvCckTGdYT53d/EfznygLskyLQXYwJLKMPsZs=",
@@ -1462,71 +1623,7 @@
"type": "github"
}
},
- "nixpkgs_7": {
- "locked": {
- "lastModified": 1776734388,
- "narHash": "sha256-vl3dkhlE5gzsItuHoEMVe+DlonsK+0836LIRDnm6MXQ=",
- "owner": "NixOS",
- "repo": "nixpkgs",
- "rev": "10e7ad5bbcb421fe07e3a4ad53a634b0cd57ffac",
- "type": "github"
- },
- "original": {
- "owner": "NixOS",
- "ref": "nixos-25.11",
- "repo": "nixpkgs",
- "type": "github"
- }
- },
- "nixpkgs_8": {
- "locked": {
- "lastModified": 1776877367,
- "narHash": "sha256-EHq1/OX139R1RvBzOJ0aMRT3xnWyqtHBRUBuO1gFzjI=",
- "owner": "nixos",
- "repo": "nixpkgs",
- "rev": "0726a0ecb6d4e08f6adced58726b95db924cef57",
- "type": "github"
- },
- "original": {
- "owner": "nixos",
- "ref": "nixos-unstable",
- "repo": "nixpkgs",
- "type": "github"
- }
- },
- "nixpkgs_9": {
- "locked": {
- "lastModified": 1776877367,
- "narHash": "sha256-EHq1/OX139R1RvBzOJ0aMRT3xnWyqtHBRUBuO1gFzjI=",
- "owner": "NixOS",
- "repo": "nixpkgs",
- "rev": "0726a0ecb6d4e08f6adced58726b95db924cef57",
- "type": "github"
- },
- "original": {
- "owner": "NixOS",
- "ref": "nixos-unstable",
- "repo": "nixpkgs",
- "type": "github"
- }
- },
"nmd": {
- "flake": false,
- "locked": {
- "lastModified": 1666190571,
- "narHash": "sha256-Z1hc7M9X6L+H83o9vOprijpzhTfOBjd0KmUTnpHAVjA=",
- "owner": "rycee",
- "repo": "nmd",
- "rev": "b75d312b4f33bd3294cd8ae5c2ca8c6da2afc169",
- "type": "gitlab"
- },
- "original": {
- "owner": "rycee",
- "repo": "nmd",
- "type": "gitlab"
- }
- },
- "nmd_2": {
"inputs": {
"nixpkgs": [
"nix-on-droid",
@@ -1564,17 +1661,38 @@
"type": "gitlab"
}
},
- "nur": {
+ "npm-lockfile-fix": {
"inputs": {
- "flake-parts": "flake-parts_3",
- "nixpkgs": "nixpkgs_11"
+ "nixpkgs": [
+ "hermes-agent",
+ "nixpkgs"
+ ]
},
"locked": {
- "lastModified": 1777233693,
- "narHash": "sha256-ZqKJHMCQb6VHg8m/BMMgckuVwA7DEpD7o9cNB8XtciA=",
+ "lastModified": 1775903712,
+ "narHash": "sha256-2GV79U6iVH4gKAPWYrxUReB0S41ty/Y3dBLquU8AlaA=",
+ "owner": "jeslie0",
+ "repo": "npm-lockfile-fix",
+ "rev": "c6093acb0c0548e0f9b8b3d82918823721930fe8",
+ "type": "github"
+ },
+ "original": {
+ "owner": "jeslie0",
+ "repo": "npm-lockfile-fix",
+ "type": "github"
+ }
+ },
+ "nur": {
+ "inputs": {
+ "flake-parts": "flake-parts_5",
+ "nixpkgs": "nixpkgs_14"
+ },
+ "locked": {
+ "lastModified": 1788512036,
+ "narHash": "sha256-7snKGlOrcV8bqetPTnc9WPjg8b/nGvaDWxWoNxSVBVI=",
"owner": "nix-community",
"repo": "nur",
- "rev": "36560e47f05a6413371627ee954523886fd2a87b",
+ "rev": "7cae767fcd8d1f3a61731a43b93a3cb37f0beabb",
"type": "github"
},
"original": {
@@ -1583,39 +1701,61 @@
"type": "github"
}
},
- "parts": {
+ "opencode": {
"inputs": {
- "nixpkgs-lib": "nixpkgs-lib_3"
+ "nixpkgs": "nixpkgs_15"
},
"locked": {
- "lastModified": 1775087534,
- "narHash": "sha256-91qqW8lhL7TLwgQWijoGBbiD4t7/q75KTi8NxjVmSmA=",
- "owner": "hercules-ci",
- "repo": "flake-parts",
- "rev": "3107b77cd68437b9a76194f0f7f9c55f2329ca5b",
+ "lastModified": 1788510168,
+ "narHash": "sha256-wFLy+8XzIm1cKmlunsIJbU5P5jzoJh7JXB1FvYoDn60=",
+ "owner": "anomalyco",
+ "repo": "opencode",
+ "rev": "70f74112e3f4a33ea1af8209c979a5060d7d2a36",
"type": "github"
},
"original": {
- "owner": "hercules-ci",
- "repo": "flake-parts",
+ "owner": "anomalyco",
+ "repo": "opencode",
+ "type": "github"
+ }
+ },
+ "pre-commit": {
+ "inputs": {
+ "flake-compat": "flake-compat_5",
+ "gitignore": "gitignore",
+ "nixpkgs": [
+ "lanzaboote",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1781733627,
+ "narHash": "sha256-U3yTuGBnmXvXoQI3qkpfEDsn9RovQPAjN7ndRco+3u0=",
+ "owner": "cachix",
+ "repo": "pre-commit-hooks.nix",
+ "rev": "3bbec39bc90eadfa031e6f3b77272f3f60803e39",
+ "type": "github"
+ },
+ "original": {
+ "owner": "cachix",
+ "repo": "pre-commit-hooks.nix",
"type": "github"
}
},
"pre-commit-hooks": {
"inputs": {
"flake-compat": "flake-compat_4",
- "gitignore": "gitignore",
"nixpkgs": [
"hyprland",
"nixpkgs"
]
},
"locked": {
- "lastModified": 1776796298,
- "narHash": "sha256-PcRvlWayisPSjd0UcRQbhG8Oqw78AcPE6x872cPRHN8=",
+ "lastModified": 1787424939,
+ "narHash": "sha256-O2tBn84NNuHrnqNVxx/XqsXwfYvS1YwBh+7CBnbCYsk=",
"owner": "cachix",
"repo": "git-hooks.nix",
- "rev": "3cfd774b0a530725a077e17354fbdb87ea1c4aad",
+ "rev": "809414f0cdadf82cf11b06c2b29ba9b3168b3297",
"type": "github"
},
"original": {
@@ -1624,52 +1764,126 @@
"type": "github"
}
},
+ "pyproject-build-systems": {
+ "inputs": {
+ "nixpkgs": [
+ "hermes-agent",
+ "nixpkgs"
+ ],
+ "pyproject-nix": [
+ "hermes-agent",
+ "pyproject-nix"
+ ],
+ "uv2nix": [
+ "hermes-agent",
+ "uv2nix"
+ ]
+ },
+ "locked": {
+ "lastModified": 1785115949,
+ "narHash": "sha256-8AM37BfyGaL2v/SZyg4PupRxJ01Y4htvM+WrTjWrPpo=",
+ "owner": "pyproject-nix",
+ "repo": "build-system-pkgs",
+ "rev": "62c0d86027edb1c4f39a5facc09876348144f7c9",
+ "type": "github"
+ },
+ "original": {
+ "owner": "pyproject-nix",
+ "repo": "build-system-pkgs",
+ "type": "github"
+ }
+ },
+ "pyproject-nix": {
+ "inputs": {
+ "nixpkgs": [
+ "hermes-agent",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1784591072,
+ "narHash": "sha256-zP/WaDxrRu8GANZM61+V2LT/7ycEEdoyLWn7M6WzU7M=",
+ "owner": "pyproject-nix",
+ "repo": "pyproject.nix",
+ "rev": "e3b599ca2e7fcf93d4edf65d7f19bbf6491724f3",
+ "type": "github"
+ },
+ "original": {
+ "owner": "pyproject-nix",
+ "repo": "pyproject.nix",
+ "type": "github"
+ }
+ },
+ "quickshell": {
+ "inputs": {
+ "nixpkgs": [
+ "tshell",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1787279335,
+ "narHash": "sha256-CLX2Zp5i5BuLbOxNOkwRd9YY84IOrACNxBV79o9/F9Y=",
+ "ref": "refs/heads/master",
+ "rev": "1a4716cde794a59928d9d9fc15f2afc7a95de360",
+ "revCount": 846,
+ "type": "git",
+ "url": "https://git.outfoxxed.me/outfoxxed/quickshell"
+ },
+ "original": {
+ "type": "git",
+ "url": "https://git.outfoxxed.me/outfoxxed/quickshell"
+ }
+ },
"root": {
"inputs": {
"awww": "awww",
+ "cardwire": "cardwire",
+ "copyparty": "copyparty",
"cyber-tux": "cyber-tux",
"deploy-rs": "deploy-rs",
"disko": "disko",
- "ghostty": "ghostty",
+ "flake-parts": "flake-parts",
+ "hermes-agent": "hermes-agent",
"home-manager": "home-manager_2",
"hyprland": "hyprland",
- "hyprland-plugins": "hyprland-plugins",
"impermanence": "impermanence",
+ "import-tree": "import-tree",
"lan-mouse": "lan-mouse",
+ "lanzaboote": "lanzaboote",
"mango": "mango",
"nix-index-database": "nix-index-database",
"nix-on-droid": "nix-on-droid",
- "nix-secrets": "nix-secrets",
- "nix-vscode-extensions": "nix-vscode-extensions",
"nixcord": "nixcord",
"nixos-hardware": "nixos-hardware",
- "nixos-wsl": "nixos-wsl",
- "nixpkgs": "nixpkgs_8",
- "nixpkgs-f2k": "nixpkgs-f2k",
- "nixpkgs-stable": "nixpkgs-stable_2",
+ "nixpkgs": "nixpkgs_13",
+ "nixpkgs-stable": "nixpkgs-stable",
"nur": "nur",
+ "opencode": "opencode",
+ "serpantinum": "serpantinum",
"sops-nix": "sops-nix",
- "tawm": "tawm",
"tfolio": "tfolio",
"tnvim": "tnvim",
- "tpanel": "tpanel",
+ "treefmt-nix": "treefmt-nix_3",
"trok": "trok",
+ "tshell": "tshell",
"vicinae-extensions": "vicinae-extensions",
+ "voxtype": "voxtype",
"wezterm-flake": "wezterm-flake"
}
},
"rust-analyzer-src": {
"flake": false,
"locked": {
- "lastModified": 1637439871,
- "narHash": "sha256-2awQ/obzl7zqYgLwbQL0zT58gN8Xq7n+81GcMiS595I=",
- "owner": "rust-analyzer",
+ "lastModified": 1785509417,
+ "narHash": "sha256-KO1aylbnpZTW1l/8c1MoUPIbwPh5eSM0+VOsksXiXU4=",
+ "owner": "rust-lang",
"repo": "rust-analyzer",
- "rev": "4566414789310acb2617543f4b50beab4bb48e06",
+ "rev": "e4e67338eaf4724e4e6e1525711e00b85d174cf9",
"type": "github"
},
"original": {
- "owner": "rust-analyzer",
+ "owner": "rust-lang",
"ref": "nightly",
"repo": "rust-analyzer",
"type": "github"
@@ -1718,6 +1932,27 @@
}
},
"rust-overlay_3": {
+ "inputs": {
+ "nixpkgs": [
+ "lanzaboote",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1782012058,
+ "narHash": "sha256-9mWUnReOUXfKjZuJAL/bAFH3LUyECTRtXgSNVjRw3UY=",
+ "owner": "oxalica",
+ "repo": "rust-overlay",
+ "rev": "8534567325bd8a8d2928e6afd81e0a87d19efd3c",
+ "type": "github"
+ },
+ "original": {
+ "owner": "oxalica",
+ "repo": "rust-overlay",
+ "type": "github"
+ }
+ },
+ "rust-overlay_4": {
"inputs": {
"nixpkgs": [
"wezterm-flake",
@@ -1725,11 +1960,11 @@
]
},
"locked": {
- "lastModified": 1764470739,
- "narHash": "sha256-sa9f81B1dWO16QtgDTWHX8DQbiHKzHndpaunY5EQtwE=",
+ "lastModified": 1780715792,
+ "narHash": "sha256-4+8gPeiPeud89mjo865RwpqmKwa1MThRsq2SvRxo7mg=",
"owner": "oxalica",
"repo": "rust-overlay",
- "rev": "3bfa664055e1a09c6aedab5533c5fc8d6ca5741a",
+ "rev": "27b7e78c6935293ee868469cc4172e9b8b17823b",
"type": "github"
},
"original": {
@@ -1740,17 +1975,19 @@
},
"scenefx": {
"inputs": {
+ "flake-utils": "flake-utils_2",
"nixpkgs": [
"mango",
"nixpkgs"
- ]
+ ],
+ "systems": "systems_3"
},
"locked": {
- "lastModified": 1750785057,
- "narHash": "sha256-tGX6j4W91rcb+glXJo43sjPI9zQvPotonknG1BdihR4=",
+ "lastModified": 1782624992,
+ "narHash": "sha256-vUjLG6eubEhJJVa9LPygIcVmNoHwYbSUTJcWEcbxnU4=",
"owner": "wlrfx",
"repo": "scenefx",
- "rev": "3a6cfb12e4ba97b43326357d14f7b3e40897adfc",
+ "rev": "37ccd723bef49e6891156ffafce8f549f01446cc",
"type": "github"
},
"original": {
@@ -1775,16 +2012,51 @@
"type": "github"
}
},
- "sops-nix": {
+ "serpantinum": {
"inputs": {
- "nixpkgs": "nixpkgs_12"
+ "nixpkgs": "nixpkgs_16",
+ "serpantinum-wallpapers": "serpantinum-wallpapers"
},
"locked": {
- "lastModified": 1776771786,
- "narHash": "sha256-DRFGPfFV6hbrfO9a1PH1FkCi7qR5FgjSqsQGGvk1rdI=",
+ "lastModified": 1788698642,
+ "narHash": "sha256-fiPiQ/FIV0CxUbPwXdRG9YHQ6UGiNcOhG/+29kP+UZI=",
+ "owner": "ilyamiro",
+ "repo": "serpantinum",
+ "rev": "e2754d28bda0e06270b870e2e671ff518e739fd9",
+ "type": "github"
+ },
+ "original": {
+ "owner": "ilyamiro",
+ "repo": "serpantinum",
+ "type": "github"
+ }
+ },
+ "serpantinum-wallpapers": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1787675697,
+ "narHash": "sha256-ADvKHmQDsX50opqeiyEAB3uxUTjuCyDym0pGQCy7Sws=",
+ "owner": "ilyamiro",
+ "repo": "shell-wallpapers",
+ "rev": "1cb526443872fbf283a3f8305c3aa647545c02e4",
+ "type": "github"
+ },
+ "original": {
+ "owner": "ilyamiro",
+ "repo": "shell-wallpapers",
+ "type": "github"
+ }
+ },
+ "sops-nix": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_17"
+ },
+ "locked": {
+ "lastModified": 1788337237,
+ "narHash": "sha256-gkSH8VUtCo6hnysNmb9DbTuDepH2t5pv+QWjP75xKAk=",
"owner": "Mic92",
"repo": "sops-nix",
- "rev": "bef289e2248991f7afeb95965c82fbcd8ff72598",
+ "rev": "fbf759290e0cb0a98dfc813a4eb7d53ad1dacb57",
"type": "github"
},
"original": {
@@ -1809,18 +2081,17 @@
}
},
"systems_2": {
- "flake": false,
"locked": {
- "lastModified": 1681028828,
- "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "lastModified": 1689347949,
+ "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
"owner": "nix-systems",
- "repo": "default",
- "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "repo": "default-linux",
+ "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
"type": "github"
},
"original": {
"owner": "nix-systems",
- "repo": "default",
+ "repo": "default-linux",
"type": "github"
}
},
@@ -1869,38 +2140,33 @@
"type": "github"
}
},
- "tawm": {
- "inputs": {
- "nixpkgs": [
- "nixpkgs"
- ]
- },
+ "systems_6": {
"locked": {
- "lastModified": 1756904097,
- "narHash": "sha256-niQjPQi2tdbKHtWuEe5dRiB+wXcXu/qlEbRzgsBbxtE=",
- "owner": "tuxdotrs",
- "repo": "tawm",
- "rev": "1424e3718d9298addb30664dbc23dbd932fa44d6",
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
- "owner": "tuxdotrs",
- "repo": "tawm",
+ "owner": "nix-systems",
+ "repo": "default",
"type": "github"
}
},
"tfolio": {
"inputs": {
- "nixpkgs": [
- "nixpkgs"
- ]
+ "flake-parts": "flake-parts_6",
+ "nixpkgs": "nixpkgs_18",
+ "treefmt-nix": "treefmt-nix_2"
},
"locked": {
- "lastModified": 1740818426,
- "narHash": "sha256-Ew6I/vG06yekJoVqB6RmXjgJj+9OIQhTCaawX5q/mu0=",
+ "lastModified": 1788861166,
+ "narHash": "sha256-uY+BKFyGGEyMvSCZBbViVh6Qa6gbFijkuXWbcIvTrHM=",
"ref": "refs/heads/main",
- "rev": "b4037d1b1fd36e0d81845bb0744b1a9a390fd66e",
- "revCount": 15,
+ "rev": "f4161eb5331c5ac7348f6a81a86461dd964a21a1",
+ "revCount": 21,
"type": "git",
"url": "ssh://git@github.com/tuxdotrs/tfolio.git"
},
@@ -1929,39 +2195,97 @@
"type": "github"
}
},
- "tpanel": {
+ "treefmt-nix": {
"inputs": {
- "ags": "ags",
"nixpkgs": [
+ "nixcord",
"nixpkgs"
]
},
"locked": {
- "lastModified": 1771924703,
- "narHash": "sha256-FdXguczx6AcfEnEPhKm76CdjsvAKQ88H4CHt43bhO6s=",
- "owner": "tuxdotrs",
- "repo": "tpanel",
- "rev": "9b8c4df5961eb541fd60e8ea424266790c3969a1",
+ "lastModified": 1785945821,
+ "narHash": "sha256-NLSyTCW4K4ofhNBllt3omPasm6QpralXH1DBZOc91Dw=",
+ "owner": "numtide",
+ "repo": "treefmt-nix",
+ "rev": "ae7910970dddc408fe6ab1c8e4b277bb21d72dc0",
"type": "github"
},
"original": {
- "owner": "tuxdotrs",
- "repo": "tpanel",
+ "owner": "numtide",
+ "repo": "treefmt-nix",
+ "type": "github"
+ }
+ },
+ "treefmt-nix_2": {
+ "inputs": {
+ "nixpkgs": [
+ "tfolio",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1786901030,
+ "narHash": "sha256-WSFCsDSE5ffgD2MqzkM2CYjeFiKhRF/dJUN8uedb6YE=",
+ "owner": "numtide",
+ "repo": "treefmt-nix",
+ "rev": "27b3b12a8e6375f28ebe122f07d230ca5459bbfa",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "treefmt-nix",
+ "type": "github"
+ }
+ },
+ "treefmt-nix_3": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_19"
+ },
+ "locked": {
+ "lastModified": 1786901030,
+ "narHash": "sha256-WSFCsDSE5ffgD2MqzkM2CYjeFiKhRF/dJUN8uedb6YE=",
+ "owner": "numtide",
+ "repo": "treefmt-nix",
+ "rev": "27b3b12a8e6375f28ebe122f07d230ca5459bbfa",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "treefmt-nix",
+ "type": "github"
+ }
+ },
+ "treefmt-nix_4": {
+ "inputs": {
+ "nixpkgs": [
+ "tshell",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1786901030,
+ "narHash": "sha256-WSFCsDSE5ffgD2MqzkM2CYjeFiKhRF/dJUN8uedb6YE=",
+ "owner": "numtide",
+ "repo": "treefmt-nix",
+ "rev": "27b3b12a8e6375f28ebe122f07d230ca5459bbfa",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "treefmt-nix",
"type": "github"
}
},
"trok": {
"inputs": {
- "nixpkgs": [
- "nixpkgs"
- ]
+ "nixpkgs": "nixpkgs_20"
},
"locked": {
- "lastModified": 1771501010,
- "narHash": "sha256-AvEVcS9/3/9zFGJqCjdnDGqyJSXTEAEGyR8q3Wfq1gU=",
+ "lastModified": 1788796165,
+ "narHash": "sha256-F07seSdocIHeW79bbfQD+4x5TlSC6FRKGmMir8V8Kzw=",
"owner": "tuxdotrs",
"repo": "trok",
- "rev": "e451f17df0356a8ff25eaf97f5c4503205d2750f",
+ "rev": "6c13858d46850d4a0fdfe198ccfd27d631d6ff65",
"type": "github"
},
"original": {
@@ -1970,6 +2294,28 @@
"type": "github"
}
},
+ "tshell": {
+ "inputs": {
+ "nixpkgs": [
+ "nixpkgs"
+ ],
+ "quickshell": "quickshell",
+ "treefmt-nix": "treefmt-nix_4"
+ },
+ "locked": {
+ "lastModified": 1788466010,
+ "narHash": "sha256-Ru1/dQxMKp9X9E186j4BsRrJz3U9DCmSefgmaAuj9tg=",
+ "owner": "tuxdotrs",
+ "repo": "tshell",
+ "rev": "77c56f9945ba1f279f48020a157cb0e10a1cf69d",
+ "type": "github"
+ },
+ "original": {
+ "owner": "tuxdotrs",
+ "repo": "tshell",
+ "type": "github"
+ }
+ },
"utils": {
"inputs": {
"systems": "systems"
@@ -1988,6 +2334,31 @@
"type": "github"
}
},
+ "uv2nix": {
+ "inputs": {
+ "nixpkgs": [
+ "hermes-agent",
+ "nixpkgs"
+ ],
+ "pyproject-nix": [
+ "hermes-agent",
+ "pyproject-nix"
+ ]
+ },
+ "locked": {
+ "lastModified": 1785277507,
+ "narHash": "sha256-9Tq3UDX2hD/aveW/HvkBlAmEwJTOlY5HQXJM+L5BGmE=",
+ "owner": "pyproject-nix",
+ "repo": "uv2nix",
+ "rev": "5a836d395cbf5fc22670eb98dd4aa4fc4d406977",
+ "type": "github"
+ },
+ "original": {
+ "owner": "pyproject-nix",
+ "repo": "uv2nix",
+ "type": "github"
+ }
+ },
"vicinae": {
"inputs": {
"nixpkgs": [
@@ -2000,11 +2371,11 @@
]
},
"locked": {
- "lastModified": 1768856963,
- "narHash": "sha256-u5bWDuwk6oieTnvm1YjNotcYK8iJSddH5+S68+X4TSc=",
+ "lastModified": 1780277152,
+ "narHash": "sha256-P3YrDLnggsMsSoiX/ox3CS6GkZtY37XQVon/QR6Agw8=",
"owner": "vicinaehq",
"repo": "vicinae",
- "rev": "934bc0ad47be6dbd6498a0dac655c4613fd0ab27",
+ "rev": "67290dff5b2191a6cb6dd78b31d623eeef3acdec",
"type": "github"
},
"original": {
@@ -2015,7 +2386,7 @@
},
"vicinae-extensions": {
"inputs": {
- "flake-compat": "flake-compat_7",
+ "flake-compat": "flake-compat_6",
"nixpkgs": [
"nixpkgs"
],
@@ -2023,11 +2394,11 @@
"vicinae": "vicinae"
},
"locked": {
- "lastModified": 1777139402,
- "narHash": "sha256-NfO+rYviCA6Nr3B/qEHpjM+9KRal61PmLKyOtrJPP2g=",
+ "lastModified": 1788128057,
+ "narHash": "sha256-hWweiuJ0Ybq5ZNostG2Ky0/J4yGeDOHg/kSLNPyMiQI=",
"owner": "vicinaehq",
"repo": "extensions",
- "rev": "bedd4c9f180ca2c83bb73a4474fb41194bc23873",
+ "rev": "9558aec33311c6759a14ffe8ef65dd1be669aebb",
"type": "github"
},
"original": {
@@ -2036,25 +2407,45 @@
"type": "github"
}
},
+ "voxtype": {
+ "inputs": {
+ "flake-utils": "flake-utils_3",
+ "nixpkgs": "nixpkgs_21"
+ },
+ "locked": {
+ "lastModified": 1780004034,
+ "narHash": "sha256-zsOG1mBTXN4gdsTb1pUPKXATfhV5ZjgEsIUk07asaGo=",
+ "owner": "peteonrails",
+ "repo": "voxtype",
+ "rev": "8d49248baa53f29cb33007c9625a37281c72e799",
+ "type": "github"
+ },
+ "original": {
+ "owner": "peteonrails",
+ "ref": "v0.7.5",
+ "repo": "voxtype",
+ "type": "github"
+ }
+ },
"wezterm-flake": {
"inputs": {
- "flake-utils": "flake-utils_2",
+ "flake-utils": "flake-utils_4",
"freetype2": "freetype2",
"harfbuzz": "harfbuzz",
"libpng": "libpng",
"nixpkgs": [
"nixpkgs"
],
- "rust-overlay": "rust-overlay_3",
+ "rust-overlay": "rust-overlay_4",
"zlib": "zlib"
},
"locked": {
"dir": "nix",
- "lastModified": 1774954828,
- "narHash": "sha256-F6qDnwdVlX/JJhM7XYkgU2QtBfN1EQ9UysP2xVKAA6I=",
+ "lastModified": 1788215300,
+ "narHash": "sha256-QO6fsVwrun93p1KTa8Pu00b2MZt7dcXA2johE3sf/4k=",
"owner": "wez",
"repo": "wezterm",
- "rev": "577474d89ee61aef4a48145cdec82a638d874751",
+ "rev": "4fbd6b8e90e2326b8e25c589768f98bd71ddd047",
"type": "github"
},
"original": {
@@ -2093,11 +2484,11 @@
]
},
"locked": {
- "lastModified": 1777035886,
- "narHash": "sha256-m1TNuBoSXUBSKhD9UVMkU90M0wFTPTfvIOOltO8IM8A=",
+ "lastModified": 1786988229,
+ "narHash": "sha256-frEFLVRj8xXvBBDs44IRiqHo6R2PxsRpluygL7abjjI=",
"owner": "hyprwm",
"repo": "xdg-desktop-portal-hyprland",
- "rev": "ecfcdcc781f48821d83e1e2a0e30d7beca0eeb5e",
+ "rev": "59d429bf45aed4e2209043c0c36565ad8e2859a5",
"type": "github"
},
"original": {
@@ -2106,57 +2497,6 @@
"type": "github"
}
},
- "zig": {
- "inputs": {
- "flake-compat": [
- "ghostty",
- "flake-compat"
- ],
- "nixpkgs": [
- "ghostty",
- "nixpkgs"
- ],
- "systems": [
- "ghostty",
- "systems"
- ]
- },
- "locked": {
- "lastModified": 1776789209,
- "narHash": "sha256-G6B7Q4TXn7MZ1mB+f9rymjsYF5PLWoSvmbxijb/99bw=",
- "owner": "mitchellh",
- "repo": "zig-overlay",
- "rev": "14fe971844e841297ddd2ce9783d6892b467af39",
- "type": "github"
- },
- "original": {
- "owner": "mitchellh",
- "repo": "zig-overlay",
- "type": "github"
- }
- },
- "zig_2": {
- "inputs": {
- "nixpkgs": [
- "ghostty",
- "zon2nix",
- "nixpkgs"
- ]
- },
- "locked": {
- "lastModified": 1776888758,
- "narHash": "sha256-OlQexlc8pMXAPhGrT89MtDcPCJv8MsFJcxFPMibRBho=",
- "ref": "refs/heads/main",
- "rev": "a380ec6969faf5fae32f08b96f8529a3bca55d42",
- "revCount": 1672,
- "type": "git",
- "url": "https://codeberg.org/jcollie/zig-overlay.git"
- },
- "original": {
- "type": "git",
- "url": "https://codeberg.org/jcollie/zig-overlay.git"
- }
- },
"zlib": {
"flake": false,
"locked": {
@@ -2173,29 +2513,6 @@
"repo": "zlib",
"type": "github"
}
- },
- "zon2nix": {
- "inputs": {
- "nixpkgs": [
- "ghostty",
- "nixpkgs"
- ],
- "zig": "zig_2"
- },
- "locked": {
- "lastModified": 1776999674,
- "narHash": "sha256-dEuWd2li80+H7f0k7RA25/Od49G91Pn3El3TcbEpONw=",
- "owner": "jcollie",
- "repo": "zon2nix",
- "rev": "fe860f11b076bba30708d1efb4830459ecf85f0d",
- "type": "github"
- },
- "original": {
- "owner": "jcollie",
- "ref": "main",
- "repo": "zon2nix",
- "type": "github"
- }
}
},
"root": "root",
diff --git a/flake.nix b/flake.nix
old mode 100755
new mode 100644
index 70cab36..002c0cc
--- a/flake.nix
+++ b/flake.nix
@@ -1,183 +1,90 @@
{
- description = "tux's Nix Flake";
+ description = "tux's nix configurations";
- outputs = {
- self,
- nixpkgs,
- deploy-rs,
- ...
- } @ inputs: let
- inherit (self) outputs;
- inherit (inputs.nixpkgs.lib) nixosSystem;
- inherit (inputs.nix-on-droid.lib) nixOnDroidConfiguration;
- forAllSystems = nixpkgs.lib.genAttrs [
- "x86_64-linux"
- "aarch64-linux"
- ];
- username = "tux";
- email = "t@tux.rs";
-
- mkNixOSConfig = host: {
- specialArgs = {inherit inputs outputs username email;};
- modules = [./hosts/${host}];
- };
-
- mkDroidConfig = host: {
- pkgs = import nixpkgs {system = "aarch64-linux";};
- extraSpecialArgs = {inherit inputs outputs username email;};
- modules = [./hosts/${host}];
- };
-
- mkNixOSNode = hostname: {
- inherit hostname;
- profiles.system = {
- user = "root";
- path = deploy-rs.lib.x86_64-linux.activate.nixos self.nixosConfigurations.${hostname};
- };
- };
-
- activateNixOnDroid = configuration:
- deploy-rs.lib.aarch64-linux.activate.custom
- configuration.activationPackage
- "${configuration.activationPackage}/activate";
-
- mkDroidNode = hostname: {
- inherit hostname;
- profiles.system = {
- sshUser = "nix-on-droid";
- user = "nix-on-droid";
- magicRollback = true;
- sshOpts = ["-p" "8033"];
- path = activateNixOnDroid self.nixOnDroidConfigurations.${hostname};
- };
- };
- in {
- packages = forAllSystems (system: import ./pkgs nixpkgs.legacyPackages.${system});
- formatter = forAllSystems (system: nixpkgs.legacyPackages.${system}.alejandra);
-
- # Custom packages and modifications, exported as overlays
- overlays = import ./overlays {inherit inputs;};
-
- # NixOS configuration entrypoint
- # 'nixos-rebuild switch --flake .#your-hostname'
- nixosConfigurations = {
- arcturus = nixosSystem (mkNixOSConfig "arcturus");
- canopus = nixosSystem (mkNixOSConfig "canopus");
- alpha = nixosSystem (mkNixOSConfig "alpha");
- sirius = nixosSystem (mkNixOSConfig "sirius");
- vega = nixosSystem (mkNixOSConfig "vega");
- node = nixosSystem (mkNixOSConfig "node");
- vps = nixosSystem (mkNixOSConfig "vps");
- isoImage = nixosSystem (mkNixOSConfig "isoImage");
- homelab = nixosSystem (mkNixOSConfig "homelab");
- };
-
- # NixOnDroid configuration entrypoint
- # 'nix-on-droid switch --flake .#your-hostname'
- nixOnDroidConfigurations = {
- capella = nixOnDroidConfiguration (mkDroidConfig "capella");
- rigel = nixOnDroidConfiguration (mkDroidConfig "rigel");
- };
-
- deploy = {
- nodes = {
- arcturus = mkNixOSNode "arcturus";
- canopus = mkNixOSNode "canopus";
- alpha = mkNixOSNode "alpha";
- sirius = mkNixOSNode "sirius";
- vega = mkNixOSNode "vega";
- node = mkNixOSNode "node";
- homelab = mkNixOSNode "homelab";
- capella = mkDroidNode "capella";
- rigel = mkDroidNode "rigel";
- };
- };
- checks = builtins.mapAttrs (system: deployLib: deployLib.deployChecks self.deploy) deploy-rs.lib;
- };
+ outputs = inputs: inputs.flake-parts.lib.mkFlake { inherit inputs; } (inputs.import-tree ./modules);
inputs = {
- nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
- nixpkgs-stable.url = "github:nixos/nixpkgs/release-24.11";
- nixos-wsl = {
- url = "github:nix-community/nixos-wsl";
- inputs.nixpkgs.follows = "nixpkgs";
+ flake-parts = {
+ url = "github:hercules-ci/flake-parts";
+ inputs.nixpkgs-lib.follows = "nixpkgs";
};
+
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
- nix-vscode-extensions = {
- url = "github:nix-community/nix-vscode-extensions";
- inputs.nixpkgs.follows = "nixpkgs";
- };
- wezterm-flake = {
- url = "github:wez/wezterm/main?dir=nix";
- inputs.nixpkgs.follows = "nixpkgs";
- };
+
disko = {
url = "github:nix-community/disko";
inputs.nixpkgs.follows = "nixpkgs";
};
- nix-secrets = {
- url = "git+ssh://git@github.com/tuxdotrs/nix-secrets.git?shallow=1";
- inputs.nixpkgs.follows = "nixpkgs";
- };
- nix-on-droid = {
- url = "github:nix-community/nix-on-droid/release-24.05";
- inputs.nixpkgs.follows = "nixpkgs";
- inputs.home-manager.follows = "home-manager";
- };
- tawm = {
- url = "github:tuxdotrs/tawm";
- inputs.nixpkgs.follows = "nixpkgs";
- };
+
tnvim = {
url = "github:tuxdotrs/tnvim";
inputs.nixpkgs.follows = "nixpkgs";
};
- trok = {
- url = "github:tuxdotrs/trok";
- inputs.nixpkgs.follows = "nixpkgs";
- };
- tpanel = {
- url = "github:tuxdotrs/tpanel";
- inputs.nixpkgs.follows = "nixpkgs";
- };
- tfolio = {
- url = "git+ssh://git@github.com/tuxdotrs/tfolio.git";
+
+ tshell = {
+ url = "github:tuxdotrs/tshell";
inputs.nixpkgs.follows = "nixpkgs";
};
+
cyber-tux = {
url = "git+ssh://git@github.com/tuxdotrs/cyber-tux.git";
inputs.nixpkgs.follows = "nixpkgs";
};
- nix-index-database = {
- url = "github:nix-community/nix-index-database";
- inputs.nixpkgs.follows = "nixpkgs";
- };
- hyprland.url = "github:hyprwm/Hyprland";
- hyprland-plugins = {
- url = "github:hyprwm/hyprland-plugins";
- inputs.hyprland.follows = "hyprland";
- };
- mango = {
- url = "github:DreamMaoMao/mango";
+
+ wezterm-flake = {
+ url = "github:wez/wezterm/main?dir=nix";
inputs.nixpkgs.follows = "nixpkgs";
};
+
vicinae-extensions = {
url = "github:vicinaehq/extensions";
inputs.nixpkgs.follows = "nixpkgs";
};
- awww.url = "git+https://codeberg.org/LGFae/awww";
- ghostty.url = "github:ghostty-org/ghostty";
- nixos-hardware.url = "github:nixos/nixos-hardware";
- nixpkgs-f2k.url = "github:moni-dz/nixpkgs-f2k";
- nur.url = "github:nix-community/nur";
- sops-nix.url = "github:Mic92/sops-nix";
+ mango = {
+ url = "github:DreamMaoMao/mango";
+ inputs.nixpkgs.follows = "nixpkgs";
+ };
+
+ nix-index-database = {
+ url = "github:nix-community/nix-index-database";
+ inputs.nixpkgs.follows = "nixpkgs";
+ };
+
+ cardwire = {
+ url = "github:opengamingcollective/cardwire";
+ inputs.nixpkgs.follows = "nixpkgs";
+ };
+
+ nix-on-droid = {
+ url = "github:nix-community/nix-on-droid/master";
+ inputs.nixpkgs.follows = "nixpkgs";
+ inputs.home-manager.follows = "home-manager";
+ };
+
+ import-tree.url = "github:vic/import-tree";
+ nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
+ nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-25.11-small";
impermanence.url = "github:nix-community/impermanence";
deploy-rs.url = "github:serokell/deploy-rs";
- nixcord.url = "github:kaylorben/nixcord";
+ nixos-hardware.url = "github:NixOS/nixos-hardware/master";
+ sops-nix.url = "github:Mic92/sops-nix";
+ treefmt-nix.url = "github:numtide/treefmt-nix";
lan-mouse.url = "github:feschber/lan-mouse";
+ hyprland.url = "github:hyprwm/Hyprland";
+ awww.url = "git+https://codeberg.org/LGFae/awww";
+ nixcord.url = "github:kaylorben/nixcord";
+ nur.url = "github:nix-community/nur";
+ lanzaboote.url = "github:nix-community/lanzaboote/v1.1.0";
+ copyparty.url = "github:9001/copyparty";
+ hermes-agent.url = "github:NousResearch/hermes-agent";
+ voxtype.url = "github:peteonrails/voxtype/v0.7.5";
+ opencode.url = "github:anomalyco/opencode";
+ serpantinum.url = "github:ilyamiro/serpantinum";
+ trok.url = "github:tuxdotrs/trok";
+ tfolio.url = "git+ssh://git@github.com/tuxdotrs/tfolio.git";
};
}
diff --git a/hosts/alpha/default.nix b/hosts/alpha/default.nix
deleted file mode 100644
index b1771d4..0000000
--- a/hosts/alpha/default.nix
+++ /dev/null
@@ -1,164 +0,0 @@
-{
- modulesPath,
- inputs,
- username,
- lib,
- email,
- config,
- ...
-}: {
- imports = [
- (modulesPath + "/installer/scan/not-detected.nix")
- (modulesPath + "/profiles/qemu-guest.nix")
- inputs.disko.nixosModules.default
- (import ./disko.nix {device = "/dev/vda";})
-
- ../common
- ../../modules/nixos/selfhosted/uptime-kuma.nix
- ];
-
- tux.services.openssh.enable = true;
- tux.services.openssh.ports = [23];
-
- tux.services.tfolio.enable = true;
-
- tux.services.nginxStreamProxy = {
- enable = true;
- upstreamServers = inputs.nix-secrets.proxy-servers;
- };
-
- sops.secrets = {
- borg_encryption_key = {
- sopsFile = ./secrets.yaml;
- };
-
- "cloudflare_credentials/email" = {
- sopsFile = ./secrets.yaml;
- };
-
- "cloudflare_credentials/dns_api_token" = {
- sopsFile = ./secrets.yaml;
- };
- };
-
- nixpkgs = {
- hostPlatform = "x86_64-linux";
- };
-
- boot = {
- initrd.systemd = {
- enable = lib.mkForce true;
-
- services.wipe-my-fs = {
- wantedBy = ["initrd.target"];
- after = ["initrd-root-device.target"];
- before = ["sysroot.mount"];
- unitConfig.DefaultDependencies = "no";
- serviceConfig.Type = "oneshot";
- script = ''
- mkdir /btrfs_tmp
- mount /dev/disk/by-partlabel/disk-primary-root /btrfs_tmp
-
- if [[ -e /btrfs_tmp/root ]]; then
- mkdir -p /btrfs_tmp/old_roots
- timestamp=$(date --date="@$(stat -c %Y /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"
- }
-
- for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +30); do
- delete_subvolume_recursively "$i"
- done
-
- btrfs subvolume create /btrfs_tmp/root
- umount /btrfs_tmp
- '';
- };
- };
-
- loader = {
- grub = {
- efiSupport = true;
- efiInstallAsRemovable = true;
- };
- };
- };
-
- networking = {
- hostName = "alpha";
-
- firewall = {
- enable = true;
- allowedTCPPorts = [80 443 22 23];
- };
- };
-
- security = {
- acme = {
- acceptTerms = true;
- defaults.email = "${email}";
- certs = {
- "tux.rs" = {
- group = "nginx";
- domain = "*.tux.rs";
- extraDomainNames = ["tux.rs"];
- dnsProvider = "cloudflare";
- credentialFiles = {
- CLOUDFLARE_EMAIL_FILE = config.sops.secrets."cloudflare_credentials/email".path;
- CLOUDFLARE_DNS_API_TOKEN_FILE = config.sops.secrets."cloudflare_credentials/dns_api_token".path;
- };
- };
- };
- };
- };
-
- users.users.nginx.extraGroups = ["acme"];
-
- services = {
- nginx = {
- recommendedGzipSettings = true;
- recommendedOptimisation = true;
- recommendedProxySettings = true;
- recommendedTlsSettings = true;
- };
- };
-
- programs = {
- zsh.enable = true;
- dconf.enable = true;
- };
-
- programs.fuse.userAllowOther = true;
- fileSystems."/persist".neededForBoot = true;
- environment.persistence."/persist" = {
- hideMounts = true;
- directories = [
- "/var/log"
- "/var/lib/acme"
- "/var/lib/nixos"
- "/var/lib/private"
- ];
- files = [
- "/etc/ssh/ssh_host_ed25519_key"
- "/etc/ssh/ssh_host_ed25519_key.pub"
- "/etc/ssh/ssh_host_rsa_key"
- "/etc/ssh/ssh_host_rsa_key.pub"
- ];
- };
-
- users.users.${username} = {linger = true;};
- home-manager.users.${username} = {
- imports = [
- ./home.nix
- ];
- };
-
- system.stateVersion = "24.11";
-}
diff --git a/hosts/alpha/disko.nix b/hosts/alpha/disko.nix
deleted file mode 100644
index 4a0c700..0000000
--- a/hosts/alpha/disko.nix
+++ /dev/null
@@ -1,53 +0,0 @@
-{device ? throw "Set this to the disk device, e.g. /dev/nvme0n1", ...}: {
- disko.devices.disk.primary = {
- inherit device;
- type = "disk";
- content = {
- type = "gpt"; # GPT partitioning scheme
- partitions = {
- boot = {
- name = "boot";
- size = "1M";
- type = "EF02";
- };
- # EFI Partition
- ESP = {
- size = "512M";
- type = "EF00";
- content = {
- type = "filesystem";
- format = "vfat";
- mountpoint = "/boot";
- mountOptions = ["defaults" "umask=0077"];
- };
- };
- # Btrfs Root Partition
- root = {
- size = "100%"; # Use remaining space
- type = "8300"; # Linux filesystem type
- content = {
- type = "btrfs";
- subvolumes = {
- "/root" = {
- mountOptions = ["compress=zstd"]; # Compression for better performance
- mountpoint = "/"; # Root subvolume
- };
- "/persist" = {
- mountOptions = ["compress=zstd"]; # Compression for persistent data
- mountpoint = "/persist"; # Persistent subvolume
- };
- "/nix" = {
- mountOptions = [
- "compress=zstd"
- "noatime"
- "noacl"
- ]; # Optimize for Nix store
- mountpoint = "/nix"; # Nix subvolume
- };
- };
- };
- };
- };
- };
- };
-}
diff --git a/hosts/alpha/home.nix b/hosts/alpha/home.nix
deleted file mode 100644
index 4fd1caf..0000000
--- a/hosts/alpha/home.nix
+++ /dev/null
@@ -1,11 +0,0 @@
-{...}: {
- home.persistence."/persist" = {
- directories = [
- "Projects"
- ".ssh"
- ".local/share/zsh"
- ];
- };
-
- home.stateVersion = "24.11";
-}
diff --git a/hosts/alpha/secrets.yaml b/hosts/alpha/secrets.yaml
deleted file mode 100644
index 82ac079..0000000
--- a/hosts/alpha/secrets.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-borg_encryption_key: ENC[AES256_GCM,data:EK1f7J4ea80K7LO16pPmkh246xmXoJEiCKzPbiRCmjQ=,iv:3vae+IAAgDx+0NPgml07kbT9kc4RpzDd1oj2Qb6ZqdM=,tag:aXj3IwzfeQ8+tGjSpq76bw==,type:str]
-cloudflare_credentials:
- email: ENC[AES256_GCM,data:w9ghChGxgV7OVeM=,iv:Qtl/pMmXGjhZ9dMRkxeyEDncGfY/YPy51eJrZ6mOgGg=,tag:oi7OoTf4TnUknblZ3lPDzQ==,type:str]
- dns_api_token: ENC[AES256_GCM,data:lMoqQs9MZ646ESJUxN2dtIopNS8P55JARk6wyfaJ8ad9ABvk268oWQ==,iv:Ez4y/kKPsRuIH9mEcpS3IU4j3kK8F6iBBFOnIf9Ck60=,tag:7I0eE8PoohH9KtiHziagrg==,type:str]
-sops:
- age:
- - recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB3NjIrVVlPVW9qTU9vMlMw
- K3BtRHZaS0h0WmlmMjF3YjhHSFZtNmFzdjNZCjRKQ0UwWTc2L3NOY1AyZnR2K2hF
- QkQ4blQvd0paRHd6c3dWaU5XbmV4S28KLS0tIExtWnR0djB5WU9lajVJeU5udlBQ
- eDlMemQ1c1FkazlRaDhPUzNBcVh2bWsK544MNSGooJPKL7hxQ+yvPRROw3RER7p8
- jbUVxMp4ZD/0ut/qFrKdyvfSPDcDkUR5eBoeaeUBkMAAPL+YeIxKhQ==
- -----END AGE ENCRYPTED FILE-----
- - recipient: age1zujp5gxy7suv8ysnygv43cmzuvv36nxfg0ch7r3xg2emc6fz3vmqqujheq
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBvWlN0bWNMZTlMM3Mvdmdn
- M2M1RzBaNUl3Qkc4Sm5QbmE3cFpuODBNakZzCk9SbjBvM25pK2pGdmRqMXd4eTJu
- ZU8vTmtSN1RYK2RmQ01QempKUG43eHMKLS0tIHVINVgvNTluS1grSm1YSHkzalMx
- SGM4ditJZFducVNEaDlJSkhuUnpxQzAKvvHbDuTQUpW+O/qtgjAFZlYc4iRRj4G1
- BP/QyzuTnpP6PuAG9pJYHx164+uS2Ftog/QnCFD0YAJdJtxaoUHzOw==
- -----END AGE ENCRYPTED FILE-----
- lastmodified: "2025-07-09T19:44:56Z"
- mac: ENC[AES256_GCM,data:1sXY3aEfbsit5hGBdE7x0pbdSLnW67NRNNDTEjS1fI85TaPpMmcgrxxvEDsg1A6psRMdBwFMUIVHH/rf4rkZ9tXSmHZBFTZrTQGn09bPF9yNC0MnJXKkcNcQiQJveg986LMWFwT/WE8PWbeDh7o+ASJF+IgT+5ikq8DMBgoyK/E=,iv:Ssy66et65Oq2WwbF12ubLGk87bSv/KSruf49T7v04NY=,tag:Y89PxwRFlJUBZniS2clybw==,type:str]
- unencrypted_suffix: _unencrypted
- version: 3.10.2
diff --git a/hosts/arcturus/default.nix b/hosts/arcturus/default.nix
deleted file mode 100644
index b0e5d80..0000000
--- a/hosts/arcturus/default.nix
+++ /dev/null
@@ -1,240 +0,0 @@
-{
- modulesPath,
- inputs,
- username,
- lib,
- email,
- config,
- ...
-}: {
- imports = [
- (modulesPath + "/installer/scan/not-detected.nix")
- (modulesPath + "/profiles/qemu-guest.nix")
- inputs.disko.nixosModules.default
- (import ./disko.nix {device = "/dev/vda";})
-
- ../common
- ../../modules/nixos/virtualisation/docker.nix
- ../../modules/nixos/selfhosted/postgresql.nix
- ../../modules/nixos/selfhosted/headscale.nix
- ../../modules/nixos/selfhosted/vaultwarden.nix
- ../../modules/nixos/selfhosted/gitea.nix
- ../../modules/nixos/selfhosted/umami.nix
- ../../modules/nixos/selfhosted/monitoring/grafana.nix
- ../../modules/nixos/selfhosted/monitoring/loki.nix
- ../../modules/nixos/selfhosted/monitoring/promtail.nix
- ../../modules/nixos/selfhosted/ntfy-sh.nix
- ../../modules/nixos/selfhosted/searx.nix
- ../../modules/nixos/selfhosted/wakapi.nix
- ../../modules/nixos/selfhosted/silver-bullet.nix
- ../../modules/nixos/selfhosted/rustdesk-server.nix
- ../../modules/nixos/selfhosted/open-webui.nix
- ../../modules/nixos/selfhosted/glance
- ];
-
- tux.services.openssh.enable = true;
- tux.containers.aiostreams = {
- enable = true;
- port = 4567;
- environment = {
- ADDON_ID = "aiostreams.tux.rs";
- BASE_URL = "https://aiostreams.tux.rs";
- };
-
- environmentFiles = [
- config.sops.secrets."aiostreams".path
- ];
- };
-
- sops.secrets = {
- borg_encryption_key = {
- sopsFile = ./secrets.yaml;
- };
-
- searx_secret_key = {
- sopsFile = ./secrets.yaml;
- };
-
- "cloudflare_credentials/email" = {
- sopsFile = ./secrets.yaml;
- };
-
- "cloudflare_credentials/dns_api_token" = {
- sopsFile = ./secrets.yaml;
- };
-
- plausible_key = {
- sopsFile = ./secrets.yaml;
- };
-
- wakapi_salt = {
- sopsFile = ./secrets.yaml;
- };
-
- silver_bullet = {
- sopsFile = ./secrets.yaml;
- };
-
- "cs2_secrets/SRCDS_TOKEN" = {
- sopsFile = ./secrets.yaml;
- };
-
- "cs2_secrets/CS2_RCONPW" = {
- sopsFile = ./secrets.yaml;
- };
-
- "cs2_secrets/CS2_PW" = {
- sopsFile = ./secrets.yaml;
- };
-
- aiostreams = {
- sopsFile = ./secrets.yaml;
- };
-
- umami = {
- sopsFile = ./secrets.yaml;
- };
- };
-
- nixpkgs = {
- hostPlatform = "x86_64-linux";
- };
-
- boot = {
- kernel.sysctl = {
- "vm.swappiness" = 10;
- };
-
- initrd.systemd = {
- enable = lib.mkForce true;
-
- services.wipe-my-fs = {
- wantedBy = ["initrd.target"];
- after = ["initrd-root-device.target"];
- before = ["sysroot.mount"];
- unitConfig.DefaultDependencies = "no";
- serviceConfig.Type = "oneshot";
- script = ''
- mkdir /btrfs_tmp
- mount /dev/disk/by-partlabel/disk-primary-root /btrfs_tmp
-
- if [[ -e /btrfs_tmp/root ]]; then
- mkdir -p /btrfs_tmp/old_roots
- timestamp=$(date --date="@$(stat -c %Y /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"
- }
-
- for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +30); do
- delete_subvolume_recursively "$i"
- done
-
- btrfs subvolume create /btrfs_tmp/root
- umount /btrfs_tmp
- '';
- };
- };
-
- loader = {
- grub = {
- efiSupport = true;
- efiInstallAsRemovable = true;
- configurationLimit = 10;
- };
- timeout = 1;
- };
- };
-
- networking = {
- hostName = "arcturus";
-
- firewall = {
- enable = true;
- allowedTCPPorts = [
- 80
- 443
- 22
- 3333
- 8081
- ];
- };
- };
-
- security = {
- acme = {
- acceptTerms = true;
- defaults.email = "${email}";
- certs = {
- "tux.rs" = {
- group = "nginx";
- domain = "*.tux.rs";
- extraDomainNames = ["tux.rs"];
- dnsProvider = "cloudflare";
- credentialFiles = {
- CLOUDFLARE_EMAIL_FILE = config.sops.secrets."cloudflare_credentials/email".path;
- CLOUDFLARE_DNS_API_TOKEN_FILE = config.sops.secrets."cloudflare_credentials/dns_api_token".path;
- };
- };
- };
- };
- };
-
- users.users.nginx.extraGroups = ["acme"];
-
- services = {
- nginx = {
- recommendedTlsSettings = true;
- recommendedBrotliSettings = true;
- recommendedOptimisation = true;
- recommendedGzipSettings = true;
- recommendedProxySettings = true;
- };
- };
-
- programs.fuse.userAllowOther = true;
- fileSystems."/persist".neededForBoot = true;
- environment.persistence."/persist" = {
- hideMounts = true;
- directories = [
- "/var/log"
- "/var/lib/nixos"
- "/var/lib/acme"
- "/var/lib/postgresql"
- "/var/lib/headscale"
- "/var/lib/vaultwarden"
- "/var/lib/gitea"
- "/var/lib/clickhouse"
- "/var/lib/grafana"
- "/var/lib/promtail"
- "/var/lib/private"
- "/var/lib/nextcloud"
- "/var/lib/silverbullet"
- "/var/lib/kasmweb"
- "/var/lib/aiostreams"
- ];
- files = [
- "/etc/ssh/ssh_host_ed25519_key"
- "/etc/ssh/ssh_host_ed25519_key.pub"
- "/etc/ssh/ssh_host_rsa_key"
- "/etc/ssh/ssh_host_rsa_key.pub"
- ];
- };
-
- users.users.${username} = {
- linger = true;
- };
- home-manager.users.${username} = {
- imports = [
- ./home.nix
- ];
- };
-
- system.stateVersion = "24.11";
-}
diff --git a/hosts/arcturus/disko.nix b/hosts/arcturus/disko.nix
deleted file mode 100644
index 4a0c700..0000000
--- a/hosts/arcturus/disko.nix
+++ /dev/null
@@ -1,53 +0,0 @@
-{device ? throw "Set this to the disk device, e.g. /dev/nvme0n1", ...}: {
- disko.devices.disk.primary = {
- inherit device;
- type = "disk";
- content = {
- type = "gpt"; # GPT partitioning scheme
- partitions = {
- boot = {
- name = "boot";
- size = "1M";
- type = "EF02";
- };
- # EFI Partition
- ESP = {
- size = "512M";
- type = "EF00";
- content = {
- type = "filesystem";
- format = "vfat";
- mountpoint = "/boot";
- mountOptions = ["defaults" "umask=0077"];
- };
- };
- # Btrfs Root Partition
- root = {
- size = "100%"; # Use remaining space
- type = "8300"; # Linux filesystem type
- content = {
- type = "btrfs";
- subvolumes = {
- "/root" = {
- mountOptions = ["compress=zstd"]; # Compression for better performance
- mountpoint = "/"; # Root subvolume
- };
- "/persist" = {
- mountOptions = ["compress=zstd"]; # Compression for persistent data
- mountpoint = "/persist"; # Persistent subvolume
- };
- "/nix" = {
- mountOptions = [
- "compress=zstd"
- "noatime"
- "noacl"
- ]; # Optimize for Nix store
- mountpoint = "/nix"; # Nix subvolume
- };
- };
- };
- };
- };
- };
- };
-}
diff --git a/hosts/arcturus/home.nix b/hosts/arcturus/home.nix
deleted file mode 100644
index 0ea57f5..0000000
--- a/hosts/arcturus/home.nix
+++ /dev/null
@@ -1,12 +0,0 @@
-{...}: {
- home.persistence."/persist" = {
- directories = [
- "Projects"
- "Stuff"
- ".ssh"
- ".local/share/zsh"
- ];
- };
-
- home.stateVersion = "24.11";
-}
diff --git a/hosts/arcturus/secrets.yaml b/hosts/arcturus/secrets.yaml
deleted file mode 100644
index c77b130..0000000
--- a/hosts/arcturus/secrets.yaml
+++ /dev/null
@@ -1,39 +0,0 @@
-borg_encryption_key: ENC[AES256_GCM,data:7DZQaoS2a5mPjTej25vr1aO1yAAPyXT2tf/VxKrLxF0=,iv:it8JlyEj4r4Z+qDvoEWMQlGkbVh08M/BCkGLVzRCVKQ=,tag:81gRhru8J3hkQhIbgUOgBg==,type:str]
-searx_secret_key: ENC[AES256_GCM,data:Z49PJ2gNI5CI0IfzOta+r67VNUvjoPpMVv5lajGhUMPzSy1KWZC5wIM3d02jWwCOsNjXdU5hE3j9W0rkoy5ZhFPXBJRUEv5b6IcaLA==,iv:364zGZkD2LO189nkvizl8yjedi1IgYEEQMA67SexSSI=,tag:qPqefG6jUaBOpUy6d7E++w==,type:str]
-plausible_key: ENC[AES256_GCM,data:Ynf2aJ6RLRdAkT9ltLpCXTl8zg/VESDchlf67PmKjc93rSfDgq9tFqv1q55Km2lDo7y9iLu5WyLLg24CSSwy8Q==,iv:yW5hgP4dhfkvunv3iYmXGEH9w29OOmrG4ourPagslVg=,tag:C5PVfEseP5gJdoQQL4gERQ==,type:str]
-wakapi_salt: ENC[AES256_GCM,data:Vk5Lezv0f/0ehHqXXBCsQxWFYE2KFujTfII0r7Gd1BXFrwiPEdX62aZ+9LQx7s1RTHh0n+LP/5t0cmHO/fJhGw==,iv:ZUlRwNXUCQ53Lymi9fO4qoBWjLpHVWfTnYM0Z1I6F5o=,tag:dadkEKV7paH4+qAz7Bxxqg==,type:str]
-cloudflare_credentials:
- email: ENC[AES256_GCM,data:qesgxkzUglKdYPI=,iv:2XDEoQzmtagSiILWZzJPswdhkQ+qjdZfNd+LL1nHPx8=,tag:K1F23Za2Zq78tzf0fl5zEw==,type:str]
- dns_api_token: ENC[AES256_GCM,data:ibSL4KWYhqgHjo27fiSqB1iN9NWU3/qGGuLpmiMpBf+qCuh8uxR7Yw==,iv:NapMvfUSm5rgeROK7KuxGyog8s2PW9CCKtjRG87FoCQ=,tag:/Oah7PRCe4XPts0IYt83zw==,type:str]
-nextcloud_password: ENC[AES256_GCM,data:o37mq4YHQT5pbi+cXrk=,iv:8HiDwdHTozNM2lHpgqVhdsspuifppsL2I6Z31xEnYFI=,tag:xTnfn8HcubfiQwLYIkpxjw==,type:str]
-silver_bullet: ENC[AES256_GCM,data:tI3Anq2V0Bttw/kN0DYtjdLUB24Q+JiymJt001ie3HfhEVcV3aQhQACTKJ2DbikCZWiet3ve9yqqktudlNTkXk2tk7D1/HQ30ToPzFLSPq6ZY0cxRCMFha9a,iv:gdG59nXnCA7x24vh1xqxocLfAi2/wpFGodCZTJb6Uvg=,tag:Ib1QpryROo6PKWohvLiMVQ==,type:str]
-cs2_secrets:
- SRCDS_TOKEN: ENC[AES256_GCM,data:SzPz4sHDgEoioX8ylLFM6AUUS60gWYpR3ifxUD8A8IQga24t6GM0dyGDryc=,iv:XefIn9yCLPLKVRA+rZiSGUH3l6ZANIJoGRuM/3vFLIw=,tag:flEjl9c7i3XBlHJaq41QYQ==,type:str]
- CS2_RCONPW: ENC[AES256_GCM,data:ZyVeoOngZjxKR/ObYo5yJC1ViCNufuA=,iv:+fJK0sY39V/iH7OjT0AzQq6RefVzLZCDETYcAMFnZNU=,tag:IOhRUQRdffNMXa2cKZvi/w==,type:str]
- CS2_PW: ENC[AES256_GCM,data:W1Cur7YT1F/+45vmqif2JbpjVURfnfo=,iv:sBNDM2N+QWDAMculBBZtYZcM7ILEfpwkwOd7ErORQhI=,tag:XFsxTUjctZKU38RQUfJ8HQ==,type:str]
-aiostreams: ENC[AES256_GCM,data:2U2EoRUsKr4OIkqrudmIUEp2bABNlSlNUTzR3vtvTfSJVemIGK31iu0SG8aR4tLSQFEZyhIP9M22zZJVWY5hX1UcMEJ1rmtXnaRjTiurRSpTj76pT9plnrjp0NWDcSWY+uhDrAsEko4oPPJEECTT3qMYLXipnzqpPeWsTrNYiuxmfDPcZw==,iv:tHKbtnLMNfY7B2ssE8x0dri9XhA2M6jIj2KOxOsmG2o=,tag:8hjqmniL/P+PfwfYiAdAwA==,type:str]
-umami: ENC[AES256_GCM,data:BJN9VpwknBaX+mz6xjq1GX9epM2bukplraPw67TttnLhM9JTmZiela5oFWZiaGjG3Oss3n4WPsPvhC4m28Ah+TQLCoiDFCFqervk228=,iv:YwbJ2/1hXs5Jbqx1dNj1t4ExFS27PWbA4NT9h8/tyU8=,tag:+R1aRF/TaMSGbLDi9GnYwA==,type:str]
-sops:
- age:
- - recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB6TGpVMzNDZjNQSkNDQmM3
- eXpvZDRPZW9Kbm81Z2VVUVZIckFNUC9zTEZzCmliUkNWS01YMHVRaUoxTS84VmxQ
- UDZtbkhmZmdZVWVsaHN3djkwSERGQ1kKLS0tIEh0ckhDTkQvcEM0UFI2MUVXVHI5
- WnhEdnRqazdZWmczYXYxNy9BMHdwdEUKYgB34OOezF3iF706pIfDmQ0FJEHXBbGF
- EJRNmA4Zl1AwyzkN3NSlctzvxx201T1GWL4qZeyVafRv5jQ9oSfK7g==
- -----END AGE ENCRYPTED FILE-----
- - recipient: age1zsl5d4vj6gl3h96y5p53sq5y4vr4vtlwp727h7rp9a4xfkxm53lqrh6r50
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBHeXNrT3c1bENOK0lNZWNT
- eFBqYm1BRHBhakFQMVVIKzR0SDRDOW9jUXdBCmFIQWZRSnBlOFBralVFakQ2clNY
- Q1Nma0pRVHh4L3IwQm1GbTdqb1BUcWsKLS0tIFRQOVIxb1FRc29WSVVERWsxSDhq
- NGprRGVyZ2plWVNrM3drM3JSUjM2L0UKuNk5DqYn2DIfRpY72zDRP5BKoVAXtNv9
- uLI//8wc7f4I3uBdARQdpRE1fapY1UOJOn3i0yndrZARPEbdohRK1Q==
- -----END AGE ENCRYPTED FILE-----
- lastmodified: "2026-02-17T13:21:46Z"
- mac: ENC[AES256_GCM,data:7OcwTCe7MMFPUlqOIs0PxiJndtcWR1LbgSQ+69VXCCkewiee8suDuSMxn6sF+zb402uqSUitKWWySMEyL42ym0uyKB7+fi46sBj8O7T9uYM6F/wiH7S9Q7nuNaGP6zxj5TlvB//Dkp4n31Oqtg8xCTK+xGsV9mR17Ai0fjCxUBI=,iv:WvnNPF76Oi9vE2fgocvnOJmhuAdKjsoQeVZuFa0KU6Q=,tag:UHA+FhQr+BASkSyPTWHpaQ==,type:str]
- unencrypted_suffix: _unencrypted
- version: 3.11.0
diff --git a/hosts/canopus/default.nix b/hosts/canopus/default.nix
deleted file mode 100755
index 180cbaa..0000000
--- a/hosts/canopus/default.nix
+++ /dev/null
@@ -1,432 +0,0 @@
-{
- inputs,
- username,
- pkgs,
- lib,
- config,
- ...
-}: {
- imports = [
- inputs.nixos-hardware.nixosModules.asus-zephyrus-ga503
- inputs.disko.nixosModules.default
-
- (import ./disko.nix {device = "/dev/nvme0n1";})
- ./hardware.nix
-
- ../common
- ../../modules/nixos/desktop
- ../../modules/nixos/desktop/hyprland
- ../../modules/nixos/desktop/mango
- ../../modules/nixos/virtualisation
- ../../modules/nixos/steam.nix
- ../../modules/nixos/obs-studio.nix
- ];
-
- hardware.nvidia-container-toolkit.enable = true;
- tux.services.openssh.enable = true;
- tux.packages.distrobox.enable = true;
- nixpkgs.config.cudaSupport = true;
-
- sops.secrets = {
- hyperbolic_api_key = {
- sopsFile = ./secrets.yaml;
- owner = "${username}";
- };
-
- gemini_api_key = {
- sopsFile = ./secrets.yaml;
- owner = "${username}";
- };
-
- open_router_api_key = {
- sopsFile = ./secrets.yaml;
- owner = "${username}";
- };
-
- "vicinae.json" = {
- sopsFile = ./secrets.yaml;
- owner = username;
- };
- };
-
- networking = {
- hostName = "canopus";
- networkmanager = {
- enable = true;
- wifi.powersave = false;
- };
- firewall = {
- enable = true;
- allowedTCPPorts = [
- 80
- 443
- 22
- 3000
- 6666
- 8081
- ];
-
- # Facilitate firewall punching
- allowedUDPPorts = [
- 41641
- 4242
- ];
-
- allowedTCPPortRanges = [
- {
- from = 1714;
- to = 1764;
- }
- ];
- allowedUDPPortRanges = [
- {
- from = 1714;
- to = 1764;
- }
- ];
- };
- };
-
- boot = {
- binfmt.emulatedSystems = ["aarch64-linux"];
-
- plymouth = {
- enable = true;
- theme = "spinner-monochrome";
- themePackages = [
- (pkgs.plymouth-spinner-monochrome.override {inherit (config.boot.plymouth) logo;})
- ];
- };
-
- kernelParams = [
- "quiet"
- "loglevel=3"
- "systemd.show_status=auto"
- "udev.log_level=3"
- "rd.udev.log_level=3"
- "vt.global_cursor_default=0"
- ];
- consoleLogLevel = 0;
- initrd.verbose = false;
-
- kernelPackages = pkgs.linuxPackages_zen;
- supportedFilesystems = ["ntfs"];
-
- initrd = {
- kernelModules = [
- "vfio_pci"
- "vfio"
- "vfio_iommu_type1"
- ];
-
- systemd = {
- enable = lib.mkForce true;
-
- services.wipe-my-fs = {
- wantedBy = ["initrd.target"];
- after = ["initrd-root-device.target"];
- before = ["sysroot.mount"];
- unitConfig.DefaultDependencies = "no";
- serviceConfig.Type = "oneshot";
- script = ''
- mkdir /btrfs_tmp
- mount /dev/disk/by-partlabel/disk-primary-root /btrfs_tmp
-
- if [[ -e /btrfs_tmp/root ]]; then
- mkdir -p /btrfs_tmp/old_roots
- timestamp=$(date --date="@$(stat -c %Y /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"
- }
-
- for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +30); do
- delete_subvolume_recursively "$i"
- done
-
- btrfs subvolume create /btrfs_tmp/root
- umount /btrfs_tmp
- '';
- };
- };
- };
-
- loader = {
- systemd-boot = {
- enable = true;
- configurationLimit = 10;
- };
- efi.canTouchEfiVariables = true;
- timeout = 1;
- };
- };
-
- hardware = {
- bluetooth.enable = true;
- bluetooth.powerOnBoot = true;
- graphics.enable32Bit = true;
- };
-
- security = {
- polkit.enable = true;
- rtkit.enable = true;
- };
-
- systemd = {
- enableEmergencyMode = false;
-
- user = {
- services.polkit-gnome-authentication-agent-1 = {
- description = "polkit-gnome-authentication-agent-1";
- wantedBy = ["graphical-session.target"];
- wants = ["graphical-session.target"];
- after = ["graphical-session.target"];
- serviceConfig = {
- Type = "simple";
- ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1";
- Restart = "on-failure";
- RestartSec = 1;
- TimeoutStopSec = 10;
- };
- };
- };
- };
-
- programs = {
- ssh.startAgent = true;
- xfconf.enable = true;
- thunar = {
- enable = true;
- plugins = with pkgs; [
- thunar-archive-plugin
- thunar-volman
- ];
- };
- nix-ld = {
- enable = true;
- package = pkgs.nix-ld;
- };
- nm-applet.enable = true;
- noisetorch.enable = true;
- };
-
- services = {
- fwupd.enable = true;
- fstrim.enable = true;
- resolved.enable = true;
- flatpak.enable = true;
-
- pipewire = {
- enable = true;
- alsa.enable = true;
- alsa.support32Bit = true;
- pulse.enable = true;
- wireplumber.enable = true;
- };
-
- logind = {
- settings.Login = {
- HandlePowerKey = "suspend";
- HanldeLidSwitch = "suspend";
- HandleLidSwitchExternalPower = "suspend";
- };
- };
-
- xrdp = {
- enable = true;
- openFirewall = true;
- defaultWindowManager = "awesome";
- audio.enable = true;
- };
-
- syncthing = {
- enable = true;
- user = "tux";
- dataDir = "/home/tux/";
- openDefaultPorts = true;
- };
-
- libinput.touchpad.naturalScrolling = true;
- libinput.mouse.accelProfile = "flat";
-
- # To use Auto-cpufreq we need to
- # disable TLP because it's enabled by nixos-hardware
- tlp.enable = false;
- auto-cpufreq = {
- enable = true;
- settings = {
- battery = {
- platform_profile = "balanced";
- governor = "powersave";
- energy_performance_preference = "performance";
- turbo = "never";
- scaling_min_freq = 400000;
- scaling_max_freq = 3800000;
- };
- charger = {
- platform_profile = "performance";
- governor = "performance";
- energy_performance_preference = "performance";
- turbo = "auto";
- scaling_min_freq = 400000;
- scaling_max_freq = 4600000;
- };
- };
- };
-
- blueman.enable = true;
-
- supergfxd = {
- enable = true;
- settings = {
- mode = "Integrated";
- vfio_enable = false;
- vfio_save = false;
- always_reboot = false;
- no_logind = false;
- logout_timeout_s = 180;
- hotplug_type = "None";
- };
- };
-
- asusd = {
- enable = true;
- asusdConfig.text = ''
- (
- charge_control_end_threshold: 80,
- disable_nvidia_powerd_on_battery: true,
- ac_command: "",
- bat_command: "",
-
- platform_profile_linked_epp: true,
- platform_profile_on_battery: Quiet,
- platform_profile_on_ac: Performance,
-
- change_platform_profile_on_battery: true,
- change_platform_profile_on_ac: true,
-
- profile_quiet_epp: Power,
- profile_balanced_epp: BalancePower,
- profile_custom_epp: Performance,
- profile_performance_epp: Performance,
-
- ac_profile_tunings: {},
- dc_profile_tunings: {},
- armoury_settings: {},
- )
- '';
- profileConfig.text = ''
- (
- active_profile: Quiet,
- )
- '';
- fanCurvesConfig.text = ''
- (
- profiles: (
- balanced: [
- (
- fan: CPU,
- pwm: (2, 22, 45, 68, 91, 153, 153, 153),
- temp: (55, 62, 66, 70, 74, 78, 78, 78),
- enabled: false,
- ),
- (
- fan: GPU,
- pwm: (2, 25, 48, 71, 94, 165, 165, 165),
- temp: (55, 62, 66, 70, 74, 78, 78, 78),
- enabled: false,
- ),
- ],
- performance: [
- (
- fan: CPU,
- pwm: (35, 68, 79, 91, 114, 175, 175, 175),
- temp: (58, 62, 66, 70, 74, 78, 78, 78),
- enabled: false,
- ),
- (
- fan: GPU,
- pwm: (35, 71, 84, 94, 119, 188, 188, 188),
- temp: (58, 62, 66, 70, 74, 78, 78, 78),
- enabled: false,
- ),
- ],
- quiet: [
- (
- fan: CPU,
- pwm: (2, 12, 22, 35, 45, 58, 79, 79),
- temp: (55, 62, 66, 70, 74, 78, 82, 82),
- enabled: true,
- ),
- (
- fan: GPU,
- pwm: (2, 12, 25, 35, 48, 61, 84, 84),
- temp: (55, 62, 66, 70, 74, 78, 82, 82),
- enabled: true,
- ),
- ],
- custom: [],
- ),
- )
- '';
- };
-
- gvfs.enable = true;
- tumbler.enable = true;
- # @FIX gnome gcr agent conflicts with programs.ssh.startAgent;
- # gnome.gnome-keyring.enable = true;
- tailscale = {
- enable = true;
- extraUpFlags = ["--login-server https://hs.tux.rs"];
- };
- mullvad-vpn = {
- enable = true;
- package = pkgs.mullvad-vpn;
- };
- };
-
- fonts.packages = with pkgs.nerd-fonts; [
- fira-code
- jetbrains-mono
- bigblue-terminal
- ];
-
- programs.fuse.userAllowOther = true;
- fileSystems."/persist".neededForBoot = true;
- environment.persistence."/persist" = {
- hideMounts = true;
- directories = [
- "/var/log"
- "/var/lib/bluetooth"
- "/var/lib/tailscale"
- "/var/lib/nixos"
- "/var/lib/docker"
- "/var/lib/waydroid"
- "/var/lib/iwd"
- "/var/lib/libvirt"
- "/etc/NetworkManager/system-connections"
- ];
- files = [
- # "/etc/machine-id"
- "/etc/ly/save.ini"
- "/etc/ssh/ssh_host_ed25519_key"
- "/etc/ssh/ssh_host_ed25519_key.pub"
- "/etc/ssh/ssh_host_rsa_key"
- "/etc/ssh/ssh_host_rsa_key.pub"
- ];
- };
-
- home-manager.users.${username} = {
- imports = [
- ./home.nix
- ];
- };
-
- system.stateVersion = "24.11";
-}
diff --git a/hosts/canopus/disko.nix b/hosts/canopus/disko.nix
deleted file mode 100644
index 24c9cd2..0000000
--- a/hosts/canopus/disko.nix
+++ /dev/null
@@ -1,69 +0,0 @@
-{device ? throw "Set this to the disk device, e.g. /dev/nvme0n1", ...}: {
- disko.devices.disk.primary = {
- inherit device;
- type = "disk";
- content = {
- type = "gpt"; # GPT partitioning scheme
- partitions = {
- # EFI Partition
- ESP = {
- size = "1G";
- type = "EF00";
- content = {
- type = "filesystem";
- format = "vfat";
- mountpoint = "/boot";
- mountOptions = [
- "defaults"
- "umask=0077"
- ];
- };
- };
- # Swap Partition
- swap = {
- size = "32G";
- content = {
- type = "swap";
- discardPolicy = "both";
- resumeDevice = true; # Enable hibernation
- };
- };
- # Btrfs Root Partition
- root = {
- size = "100%"; # Use remaining space
- type = "8300"; # Linux filesystem type
- content = {
- type = "btrfs";
- subvolumes = {
- "/root" = {
- mountOptions = [
- "compress=zstd"
- "noatime"
- "space_cache=v2"
- ]; # Compression for better performance
- mountpoint = "/"; # Root subvolume
- };
- "/persist" = {
- mountOptions = [
- "compress=zstd"
- "noatime"
- "space_cache=v2"
- ]; # Compression for persistent data
- mountpoint = "/persist"; # Persistent subvolume
- };
- "/nix" = {
- mountOptions = [
- "compress=zstd"
- "noatime"
- "noacl"
- "space_cache=v2"
- ]; # Optimize for Nix store
- mountpoint = "/nix"; # Nix subvolume
- };
- };
- };
- };
- };
- };
- };
-}
diff --git a/hosts/canopus/hardware.nix b/hosts/canopus/hardware.nix
deleted file mode 100755
index 89fe563..0000000
--- a/hosts/canopus/hardware.nix
+++ /dev/null
@@ -1,30 +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,
- pkgs,
- modulesPath,
- ...
-}: {
- imports = [
- (modulesPath + "/installer/scan/not-detected.nix")
- ];
-
- boot.initrd.availableKernelModules = ["nvme" "xhci_pci" "usbhid" "usb_storage" "sd_mod" "sdhci_pci"];
- boot.initrd.kernelModules = [];
- boot.kernelModules = ["kvm-amd"];
- boot.extraModulePackages = [];
-
- # 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
- # still possible to use this option, but it's recommended to use it in conjunction
- # with explicit per-interface declarations with `networking.interfaces.
.useDHCP`.
- networking.useDHCP = lib.mkDefault true;
- # networking.interfaces.enp3s0.useDHCP = lib.mkDefault true;
- # networking.interfaces.wlp4s0.useDHCP = lib.mkDefault true;
-
- nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
- hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
-}
diff --git a/hosts/canopus/home.nix b/hosts/canopus/home.nix
deleted file mode 100644
index b9995c9..0000000
--- a/hosts/canopus/home.nix
+++ /dev/null
@@ -1,138 +0,0 @@
-{pkgs, ...}: {
- imports = [
- ../../modules/home/desktop/hyprland
- ../../modules/home/desktop/mango
- ../../modules/home/desktop/vicinae
- ../../modules/home/desktop/utils
- ../../modules/home/alacritty
- ../../modules/home/wezterm
- ../../modules/home/ghostty
- ../../modules/home/desktop/rofi
- ../../modules/home/lan-mouse
- ../../modules/home/firefox
- ../../modules/home/brave
- ../../modules/home/vs-code
- ../../modules/home/zed
- ../../modules/home/mopidy
- ../../modules/home/thunderbird
- ../../modules/home/easyeffects
- ../../modules/home/discord
- ../../modules/home/kdeconnect
- ../../modules/home/spotify
- ];
-
- home.pointerCursor = {
- package = pkgs.bibata-cursors;
- name = "Bibata-Modern-Ice";
- size = 28;
- };
-
- qt = {
- enable = true;
- platformTheme.name = "gtk";
- style = {
- name = "adwaita-dark";
- package = pkgs.adwaita-qt;
- };
- };
-
- gtk = {
- enable = true;
- theme = {
- name = "Materia-dark";
- package = pkgs.materia-theme;
- };
- iconTheme = {
- package = pkgs.tela-icon-theme;
- name = "Tela-black";
- };
- };
-
- services.flameshot = {
- enable = true;
- package = pkgs.flameshot.override {enableWlrSupport = true;};
- settings = {
- General = {
- useGrimAdapter = true;
- };
- };
- };
-
- home.packages = with pkgs; [
- antigravity
- davinci-resolve
- telegram-desktop
- anydesk
- rustdesk-flutter
- moonlight-qt
- rawtherapee
- stable.beekeeper-studio
- libreoffice-qt
- spotify
- # @TODO Enable when qt5 webengine patched
- # https://github.com/NixOS/nixpkgs/blob/b599843bad24621dcaa5ab60dac98f9b0eb1cabe/pkgs/development/libraries/qt-5/modules/qtwebengine.nix#L466
- # stremio
- galaxy-buds-client
- copyq
- vlc
- tor-browser
- vivaldi
- bluetui
- impala
- pulseaudio
- ];
-
- home.persistence."/persist" = {
- directories = [
- "Downloads"
- "Music"
- "Wallpapers"
- "Documents"
- "Videos"
- "Projects"
- "Stuff"
- "Distrobox"
- "go"
- ".ssh"
- ".wakatime"
- ".rustup"
- ".cargo"
- ".steam"
- ".mozilla"
- ".cache/awww"
- ".cache/spotifyd"
- ".cache/spotify-player"
- ".config/BraveSoftware"
- ".config/vivaldi"
- ".config/Antigravity"
- ".config/zed"
- ".config/copyq"
- ".config/discord"
- ".config/Vencord"
- ".config/vesktop"
- ".config/sops"
- ".config/obs-studio"
- ".config/easyeffects"
- ".config/rustdesk"
- ".config/kdeconnect"
- ".config/Moonlight\ Game\ Streaming\ Project"
- ".local/lib/vivaldi"
- ".local/share/nvim"
- ".local/share/opencode"
- ".local/share/zsh"
- ".local/share/zoxide"
- ".local/share/Smart\ Code\ ltd"
- ".local/share/GalaxyBudsClient"
- ".local/share/TelegramDesktop"
- ".local/state/lazygit"
- ".local/share/Steam"
- ".local/share/vicinae"
- ];
- files = [
- ".wakatime.cfg"
- ".config/aichat/.env"
- ];
- };
-
- home.stateVersion = "24.11";
-}
diff --git a/hosts/canopus/secrets.yaml b/hosts/canopus/secrets.yaml
deleted file mode 100644
index 4b7dc73..0000000
--- a/hosts/canopus/secrets.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-hyperbolic_api_key: ENC[AES256_GCM,data:WGvF0PPbMd7zWiO8GfmgluV7dW+ZpzLMO31uI5xo+nekvTBkXiAuHFDK/SXKEUFDMEboNkA/a6JUNsCRhuA4N7qhIZgyQ2bc1iafsj7c4F4X/py63Z4bMx8+byScOSoW+RKAvSFOLDGXQ4s9dKc3XNW7G15QyzTRYUFDbXxsSQ6n6DMJk4jr,iv:o+Shbpl3tXmefpdQB5sod3bNQHHsBnEEP0Bk3C1H5Yo=,tag:fi+7K3nAjVoavqy2Mt8W3Q==,type:str]
-gemini_api_key: ENC[AES256_GCM,data:ToQn6NiBpebcSPIHbnAyTJm092Xv24pb7Q09hW/Qb0qZC0ORJGG5,iv:/VIw5hTKlZLaWYdEyaEvIv/ZPTBhq5OkguPL6wFs8A8=,tag:44tNJTBeHYW1ug+z+yKTrw==,type:str]
-open_router_api_key: ENC[AES256_GCM,data:QLXIEqsUe8HQobJMvqh8fZi7azXjnz7B524kDPWB8Dk5tAv6EVvM0KHAa6aTGmeMB8LJiUPcLmPU0ifU07s2OyB3Q9w+IFvlfQ==,iv:pBr8SJG8FHP1oYrXrHG0gRMPfdXXoBNPGcYEXF3IJGg=,tag:Yf2FuncT3/9pcBIEN+irGQ==,type:str]
-vicinae.json: ENC[AES256_GCM,data:VZ3Z3Q3/KSmqE20Jt91y7XnO8LjKKFg8PUFiFuj2aW3kf/dl40lNWATQxa5AmggGViOf2R+1Q2r4cyGQFUWiOww5gcUT3Op+Z+zqPTE+Heu8/Sst0Vi7ZjL8vvmc6HYpT4t6JvYCEr4jjnBwLIvaxNwxCArEfga5lMgOzDQqhnZeOkBCTGdCp4nN7eBaWBFK4Jsm905mm+N2yMD4/rlkFNA6EBEJ4j5A5DnFF3ooZKSqi0VUhvagZ0JsaGdHpn124hnKkVwLejcWlKYpmXu+5gYRh1F5sADR8BpubMeCoEnGB5zUuxd7v/8m8siYbYzJEMtoBLNVlFcfgdI7/tGfd5aj5S+/ZEHbL9UrSLpKiw==,iv:xayL9aZgak0y3hxwcijMSMslaLCMsVvkXm1Fefs652k=,tag:BE804jVdu1poJmoGPjwsqA==,type:str]
-sops:
- age:
- - recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAwZ1V0UE0vT3FoZDhKYXBi
- ODRvNGRmZzZQY2t0VDNYTzgzUW5TMlFRQzBnCm9sZEJ1WmY0QU1KR1AwS3R0NXlh
- cHhYNjA2TWM3Z1JZM2E1UHluNzdBYXcKLS0tIFRwQm10VlJEUVFyemRGYXpUNHhq
- eWNJdzc2dlNlR1N1THAzSVlDNEZZMUUK7kacPvAuwbl0hggMuKJS/hjy0j+i1Oeh
- tw7bdZ6do30sf9uY8TWDCeOiK1uOJGATLcDd14VhHl968By8n/5pDw==
- -----END AGE ENCRYPTED FILE-----
- - recipient: age1x36yr8h993srfj29sfpzt4wyz52nztvncpmhgmfs0j26qvfecq3qvcm0an
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSByZk42NzVUMXV0ZDVWR3Q2
- N3NUN1B3blNZS1lKbEU1VmhaTDVOMmFESm1FCi9VeEFXVkRjUnFxYUxERUg0ODY4
- eFhFMXhOek1wWTRwOEd6Zk82Sm9VM0UKLS0tIGVBMHpQSWJzMVUxU09XeS8yVXFW
- UVM3a1VIMWZGRGNxaUNwbStKekd4N28KvouH73cSd9xMUzDX3ib5tsR8deXGaGTB
- N36MxnZcv9AhX7YErc18OkUv+lHZf2MoJ+x5+XOMCjhlUOlvqcBrAg==
- -----END AGE ENCRYPTED FILE-----
- lastmodified: "2026-02-17T13:38:15Z"
- mac: ENC[AES256_GCM,data:KYa/c921oDF2JKEEO0Fdvh8J1qkuQDH2biaS79v1qRr4AUd1yRpyZ75NvHmeIrYNsXgcgzqCi7vtaCF7v/ucirruf20ZeNmCpVb0BfesNko+0PrjWpwnNbabVCVIJFZiGbe35ENcM0DPECvb7vBJ2QKvqMCot6Zys9TgeXRcmGk=,iv:BPEE3KEg7y0BvVkd+aNMRK8xk4JNKgk8R+AR94rCFiM=,tag:y7rrugvI7XmjDP0Dj7GwBQ==,type:str]
- unencrypted_suffix: _unencrypted
- version: 3.11.0
diff --git a/hosts/capella/default.nix b/hosts/capella/default.nix
deleted file mode 100644
index 3d8f235..0000000
--- a/hosts/capella/default.nix
+++ /dev/null
@@ -1,63 +0,0 @@
-{
- pkgs,
- username,
- outputs,
- inputs,
- email,
- ...
-}: {
- imports = [
- ../../modules/droid/sshd.nix
- ];
-
- android-integration.am.enable = true;
- android-integration.termux-open-url.enable = true;
- android-integration.xdg-open.enable = true;
- android-integration.termux-setup-storage.enable = true;
- android-integration.termux-reload-settings.enable = true;
-
- terminal.font = let
- firacode = pkgs.nerd-fonts.fira-code;
- fontPath = "share/fonts/truetype/NerdFonts/FiraCode/FiraCodeNerdFont-Regular.ttf";
- in "${firacode}/${fontPath}";
-
- time.timeZone = "Asia/Kolkata";
-
- tux.services.openssh = {
- enable = true;
- ports = [8033];
- authorizedKeys = [
- "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL+OzPUe2ECPC929DqpkM39tl/vdNAXfsRnmrGfR+X3D ${email}"
- ];
- };
-
- user = {
- uid = 10479;
- gid = 10479;
- shell = "${pkgs.zsh}/bin/zsh";
- };
-
- environment.etcBackupExtension = ".backup";
- environment.motd = '''';
- environment.packages = with pkgs; [
- nano
- git
- neovim
- openssh
- inputs.trok.packages."aarch64-linux".default
- ];
-
- home-manager = {
- config = ./home.nix;
- backupFileExtension = "backup";
- extraSpecialArgs = {inherit inputs outputs username email;};
- useGlobalPkgs = true;
- };
-
- # Set up nix for flakes
- nix.extraOptions = ''
- experimental-features = nix-command flakes
- '';
-
- system.stateVersion = "24.05";
-}
diff --git a/hosts/capella/home.nix b/hosts/capella/home.nix
deleted file mode 100644
index a952cec..0000000
--- a/hosts/capella/home.nix
+++ /dev/null
@@ -1,35 +0,0 @@
-{pkgs, ...}: {
- imports = [
- ../../modules/home/git
- ../../modules/home/starship
- ../../modules/home/fastfetch
- ];
-
- programs = {
- bat.enable = true;
- zoxide = {
- enable = true;
- options = ["--cmd cd"];
- };
- zsh = {
- enable = true;
- shellAliases = {
- ls = "lsd";
- };
- syntaxHighlighting.enable = true;
- autosuggestion.enable = true;
- initContent = ''
- fastfetch
- '';
- };
- };
-
- home.packages = with pkgs; [
- neovim
- busybox
- lsd
- fastfetch
- ];
-
- home.stateVersion = "24.05";
-}
diff --git a/hosts/common/default.nix b/hosts/common/default.nix
deleted file mode 100644
index 1c02596..0000000
--- a/hosts/common/default.nix
+++ /dev/null
@@ -1,67 +0,0 @@
-{
- username,
- outputs,
- inputs,
- email,
- ...
-}: {
- imports = [
- inputs.impermanence.nixosModules.impermanence
- inputs.home-manager.nixosModules.home-manager
- inputs.nix-index-database.nixosModules.nix-index
-
- ../../modules/base
- ../../modules/nixos/fail2ban.nix
- ../../modules/nixos/selfhosted/upstream-proxy.nix
- ../../modules/nixos/selfhosted/tfolio.nix
- ../../modules/nixos/selfhosted/cyber-tux.nix
- ../../modules/nixos/selfhosted/containers/aiostreams.nix
- ../../modules/nixos/networking/ssh.nix
- ../../modules/nixos/distrobox.nix
- ];
-
- sops.secrets.tux-password = {
- sopsFile = ./secrets.yaml;
- neededForUsers = true;
- };
-
- time.timeZone = "Asia/Kolkata";
- i18n = {
- defaultLocale = "en_US.UTF-8";
- extraLocaleSettings = {
- LC_ADDRESS = "en_IN";
- LC_IDENTIFICATION = "en_IN";
- LC_MEASUREMENT = "en_IN";
- LC_MONETARY = "en_IN";
- LC_NAME = "en_IN";
- LC_NUMERIC = "en_IN";
- LC_PAPER = "en_IN";
- LC_TELEPHONE = "en_IN";
- LC_TIME = "en_IN";
- };
- };
-
- security.sudo.wheelNeedsPassword = false;
-
- programs = {
- zsh.enable = true;
- };
-
- home-manager = {
- backupFileExtension = "hm-backup";
- useUserPackages = true;
- extraSpecialArgs = {
- inherit
- inputs
- outputs
- username
- email
- ;
- };
- users.${username} = {
- imports = [
- ./home.nix
- ];
- };
- };
-}
diff --git a/hosts/common/home.nix b/hosts/common/home.nix
deleted file mode 100644
index b129d48..0000000
--- a/hosts/common/home.nix
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- outputs,
- username,
- inputs,
- ...
-}: {
- imports = [
- inputs.nix-index-database.homeModules.nix-index
-
- ../../modules/home/shell
- ../../modules/home/git
- ../../modules/home/starship
- ../../modules/home/fastfetch
- ../../modules/home/nvim
- ../../modules/home/tmux
- ../../modules/home/helix
- ../../modules/home/aria2
- ];
-
- nixpkgs = {
- overlays = [
- outputs.overlays.additions
- outputs.overlays.modifications
- outputs.overlays.stable-packages
- outputs.overlays.nur
- outputs.overlays.nix-vscode-extensions
- ];
-
- config = {
- allowUnfree = true;
- allowUnfreePredicate = _: true;
- joypixels.acceptLicense = true;
- };
- };
-
- home = {
- username = "${username}";
- homeDirectory = "/home/${username}";
- };
-
- programs.home-manager.enable = true;
-
- systemd.user.startServices = "sd-switch";
-}
diff --git a/hosts/common/secrets.yaml b/hosts/common/secrets.yaml
deleted file mode 100644
index 5c14937..0000000
--- a/hosts/common/secrets.yaml
+++ /dev/null
@@ -1,88 +0,0 @@
-tux-password: ENC[AES256_GCM,data:yAqMKsk7uz0F0k32PdYnqAmn+tdLyXl2krvMstdgFCvIUZH8TlATWCUMPUtnxQiTQqCUY+Q8LE+yYcFFGC3r5TskbF98igZTDA==,iv:hkE/21gdD2bCEdIITrhm9lhKRTHhCPeo8YaYS61/dEM=,tag:/tz2Xvy2ro9gGwKHrJuuzw==,type:str]
-sops:
- age:
- - recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBXaTFZSENQZDcvczUrVFF6
- Mm1GV3pqSzVPd2pQaUp3ZGRJS0kzMExXSmtJCkVwR1VxbUhCTTlKVHlLR0kvWkFO
- R2VmQWhzSEsya3I4b1JRWnFSbXdUanMKLS0tIFR5bkU3cEVHL3BlUFRjL2l2ZDBK
- WUVaZzFCQkc0KzRNQlRRdGNvWFdQNkUKhxAV3VavBzjSQHJPNn+Ghspi1scCq7dS
- Qu81Q24kMK9sL7ddTjB7UqCgZ3LHq+Izzw5cSYVy+nq150oCBURnoA==
- -----END AGE ENCRYPTED FILE-----
- - recipient: age1f860dfewlx5jtt9ejr47gywx70p3dmyc8mat29gpr75psljwjv8q5xyxkq
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBNVGdJQTdBVHAxTmFoeThj
- RWE0QjBiQUt5UkdDZzBRQm5vTUtGZmRxQ2xvCkRiUDIxUkV3ZW5Jd1ZoZWRzeE03
- T0VPZE9pYXJGclVZSTJRM1JaVjM3VU0KLS0tIGFXQ3pRWXFYYWkrYngyZDJST2Jr
- UlAzTFdxMENxckVpL05ReENjZHk3b1UK1NEgbZ5AMf9h6zlfIHL7ugNSyQ156T5r
- x3l7nFrvxAWE9aTzn03hFjgRP72If6k/3pHJmT8h2494+K20qAmx6g==
- -----END AGE ENCRYPTED FILE-----
- - recipient: age1x36yr8h993srfj29sfpzt4wyz52nztvncpmhgmfs0j26qvfecq3qvcm0an
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBwZE16cm5vNzhVSkY5K2hV
- MWRaMHNIL1Q2cDZ0eHozbTJJWklKb09BK213CkFSazJGdnBWQnRvQ2Zlc1JQazZV
- VWVMb1FpcUZMeURQSXJBTkJGeVdCeUkKLS0tIG1uRDJ4T2pRaVY1aERQOWhZdGl0
- b3JVbHNpY1B5ekpodHp3ZXlrZFplNFEKiRPqPKh3g33a2/fQVrj8qGOcXheVaLgA
- CAShzomubIQNFZUnl12hjH+ZcKlAwYFXzCrHUNdkEUWRIASqGa5oMA==
- -----END AGE ENCRYPTED FILE-----
- - recipient: age1jg642q775gmnmxeu29gcf3lph8vem4xr8t84cxe809dpd0myrussh49h60
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAvQ3UybGxJaUU5ckdDak5F
- d3RJdlR3VHNHZTJ0UXhXc08wSVVXZVFZb2lvClZGSzV6QmhqL01rYjhjdjNKT2RT
- V3k1QUF4VXBNb2d6dnA0N2lNNnpXS00KLS0tICs3bWRHMGZiMmM4S3YyY0ttRWZ1
- Snd1QTlRUndzK0RSUld1TlRkNU13cHMKTZsBN/4nBfEndip/vCUNtFZF89MKT8uA
- C/hKD33ycaLNzmgxz3VRSCxeALMspeobeOLfRHJLflusD9xGgXn73A==
- -----END AGE ENCRYPTED FILE-----
- - recipient: age1zsl5d4vj6gl3h96y5p53sq5y4vr4vtlwp727h7rp9a4xfkxm53lqrh6r50
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBQWmkrNXJvUjR5anlUcFVE
- NExQTnAwZDVmWEl3c3B2bis1N00wQzF6MFFvCnpENVNJU1JWLyswNnZoUTBZNE16
- V2ZtLzIzanZEOWhkYXFxaWVLaDZoUDAKLS0tIEs3SXRZU283dERkZEFabmtFZTEx
- aUIwRTgzQklUZmlnS05MQ2o5QmJSQk0KVrx1ZHqnS3KQ9jB7yqVIWbrQAdqDt/c4
- i3mst4a/rKjgZGUYugHMctJppPIpqqVZTpBHPgY5OiAGESMrUZE+Ig==
- -----END AGE ENCRYPTED FILE-----
- - recipient: age1zujp5gxy7suv8ysnygv43cmzuvv36nxfg0ch7r3xg2emc6fz3vmqqujheq
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBvdUhKNU5BYmNEdllkWU1R
- QVIxMExuYit6ekNwVHFmd2dGNEJtTTlHd0IwCkxiZnAvSURQY2RyWnRVVGxtdlUv
- bmNpNFB6OENqOFJSakQ2NGJ0cVJTQlkKLS0tIEt5QXBXNC9WaDdIdklTeTA3ZEp6
- Y212bDZSRkttWjBqTEdkbjY4WHd5RTgK1Y779ogFUcr89gosqh7rra7Wg6G/Ez1o
- /+48kxF2DTKZLJYX2AFEP5H0JjBDtt+isiO7H1644LjdAwO/sgFMSQ==
- -----END AGE ENCRYPTED FILE-----
- - recipient: age1ydkclhk9kwqdq74utesqdfupt43lz64d5k65gz2z9uyljcqq9fcq3hv28l
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBwQXFScVBqUDZHc3BDK3N4
- T3BnSWk5SElzZllYRHdlMStPS2ZyMDZoZ3pnCm5KVnBYb1R6anRWd04rNllPSW1G
- ZVMwMTQ5NjQvaEYwZUhOOE56ckJHb00KLS0tIEpCWmNQZzFlK3ZrRGFPMFVwZndG
- ZStueWovUmtKdTk2enRJa3NSbFpJL1UKtzKYPJ6vy6+VjPkrsRvNTwUtV198oglr
- cMqBSuwkqzgjDC09sRMnW5PRfJo8hG+5gkd6EPZ8uAbUhGC+kAyLrg==
- -----END AGE ENCRYPTED FILE-----
- - recipient: age1put942dyhly8nk9c8n0h8tq0x6xplrg3uw5q0d2jmvwez3zq79qsapl7he
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0ZU93NCtxODQ2YjA4TUcr
- aWEyaW4zREZtVUpuZWhZSUw3TWhpMXBYWEVVCitDNGx1eWZQZGsvUDl0UzNCd0Zp
- QndpMys5OVg1WXMrdXRDUkFZWDErcjAKLS0tIDBOZTBxM09INTIxZm9tQk10ZUc2
- emExUmJZZk00WmxYK2Y3WCtmQXhSUmsKwMxI9I6kQYkvZ4TzJtv/MdGLwTbQdePx
- XB+oFbc9Rp3IAEZfH1+VEtJRjyKk5hE7HQoIh92XxJvmbDIswOe/Rg==
- -----END AGE ENCRYPTED FILE-----
- - recipient: age1y4luzn2jls7rvgphej23srvdlx563lxq29tvf66vhwwzaf7c3f3qzvresh
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBwNUhPQThmWjJROW95SWsw
- aFk4dGR3c0RJZTkwSHFXaWp2UCtQWS9xYjFnCnAxa0RMV0xsNnZ2cnVMbmRzRFYv
- QmRZQVY1ME9zTmZtT1RxUmFQc2JYc2cKLS0tIGxUTjYwYXZUMU9FY3BFS04zQk1G
- bFJwRno1a0pwVHpaV0haZjlZazNtZDAKxTvzsmLtx50sI2bZ3fFcB6j9ZLas4KmL
- 5bu9Z75hFi+N1sjvMpcK7oIFypGLIWU3xpTP//jv6RuiyjGuR2Dq2w==
- -----END AGE ENCRYPTED FILE-----
- lastmodified: "2025-11-04T09:28:17Z"
- mac: ENC[AES256_GCM,data:A+xfYhnoq/JWYGZOleieF5vjrsPOtkKnXPbd94iBAbnuuBKx8Vgkpuum+hJzVIBdDSCVm8hl2Tpcw7NqWLSkXtBR/NKixzk6eIwFvOZz4h7Qe1Zue10pB25IkIzR34sLnWSHtsxuRRG6fZnf0CNtp7baf4XU3doyDwy5A384Jf0=,iv:i0y0UEY7SSCOBIBc+97qIiq4obpUJYb3gFo1yEc5eUI=,tag:c5zONd6zTv3sq4bPqT73OQ==,type:str]
- unencrypted_suffix: _unencrypted
- version: 3.11.0
diff --git a/hosts/homelab/default.nix b/hosts/homelab/default.nix
deleted file mode 100755
index afde133..0000000
--- a/hosts/homelab/default.nix
+++ /dev/null
@@ -1,169 +0,0 @@
-{
- inputs,
- username,
- pkgs,
- lib,
- config,
- ...
-}: {
- imports = [
- inputs.disko.nixosModules.default
-
- (import ./disko.nix {device = "/dev/nvme0n1";})
- ./hardware.nix
-
- ../common
- ../../modules/nixos/desktop
- ../../modules/nixos/virtualisation/docker.nix
- ];
-
- tux.services.openssh.enable = true;
-
- sops.secrets = {
- discord_token = {
- sopsFile = ./secrets.yaml;
- };
-
- hyperbolic_api_key = {
- sopsFile = ./secrets.yaml;
- owner = "${username}";
- };
-
- gemini_api_key = {
- sopsFile = ./secrets.yaml;
- owner = "${username}";
- };
-
- open_router_api_key = {
- sopsFile = ./secrets.yaml;
- owner = "${username}";
- };
- };
-
- tux.services.cyber-tux = {
- enable = true;
- environmentFile = config.sops.secrets.discord_token.path;
- };
-
- networking = {
- hostName = "homelab";
- networkmanager = {
- enable = true;
- wifi.powersave = false;
- };
- firewall = {
- enable = true;
- allowedTCPPorts = [22];
-
- # Facilitate firewall punching
- allowedUDPPorts = [41641];
- };
- };
-
- boot = {
- consoleLogLevel = 0;
- initrd.verbose = false;
-
- kernelPackages = pkgs.linuxPackages_zen;
-
- initrd.systemd = {
- enable = lib.mkForce true;
-
- services.wipe-my-fs = {
- wantedBy = ["initrd.target"];
- after = ["initrd-root-device.target"];
- before = ["sysroot.mount"];
- unitConfig.DefaultDependencies = "no";
- serviceConfig.Type = "oneshot";
- script = ''
- mkdir /btrfs_tmp
- mount /dev/disk/by-partlabel/disk-primary-root /btrfs_tmp
-
- if [[ -e /btrfs_tmp/root ]]; then
- mkdir -p /btrfs_tmp/old_roots
- timestamp=$(date --date="@$(stat -c %Y /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"
- }
-
- for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +30); do
- delete_subvolume_recursively "$i"
- done
-
- btrfs subvolume create /btrfs_tmp/root
- umount /btrfs_tmp
- '';
- };
- };
-
- loader = {
- systemd-boot = {
- enable = true;
- configurationLimit = 10;
- };
- efi.canTouchEfiVariables = true;
- timeout = 1;
- };
- };
-
- hardware = {
- graphics.enable32Bit = true;
- };
-
- security = {
- rtkit.enable = true;
- };
-
- programs = {
- nix-ld = {
- enable = true;
- package = pkgs.nix-ld;
- };
- };
-
- services = {
- fwupd.enable = true;
- fstrim.enable = true;
-
- tailscale = {
- enable = true;
- extraUpFlags = ["--login-server https://hs.tux.rs"];
- };
- };
-
- programs.fuse.userAllowOther = true;
- fileSystems."/persist".neededForBoot = true;
- environment.persistence."/persist" = {
- hideMounts = true;
- directories = [
- "/var/log"
- "/var/lib/tailscale"
- "/var/lib/nixos"
- "/etc/NetworkManager/system-connections"
- ];
- files = [
- "/etc/ssh/ssh_host_ed25519_key"
- "/etc/ssh/ssh_host_ed25519_key.pub"
- "/etc/ssh/ssh_host_rsa_key"
- "/etc/ssh/ssh_host_rsa_key.pub"
- ];
- };
-
- users.users.${username} = {linger = true;};
- home-manager.users.${username} = {
- imports = [
- ./home.nix
- ];
- };
-
- environment.systemPackages = with pkgs; [go-wol];
-
- system.stateVersion = "24.11";
-}
diff --git a/hosts/homelab/disko.nix b/hosts/homelab/disko.nix
deleted file mode 100644
index cb6eb32..0000000
--- a/hosts/homelab/disko.nix
+++ /dev/null
@@ -1,48 +0,0 @@
-{device ? throw "Set this to the disk device, e.g. /dev/nvme0n1", ...}: {
- disko.devices.disk.primary = {
- inherit device;
- type = "disk";
- content = {
- type = "gpt"; # GPT partitioning scheme
- partitions = {
- # EFI Partition
- ESP = {
- size = "512M";
- type = "EF00";
- content = {
- type = "filesystem";
- format = "vfat";
- mountpoint = "/boot";
- mountOptions = ["defaults" "umask=0077"];
- };
- };
- # Btrfs Root Partition
- root = {
- size = "100%"; # Use remaining space
- type = "8300"; # Linux filesystem type
- content = {
- type = "btrfs";
- subvolumes = {
- "/root" = {
- mountOptions = ["compress=zstd"]; # Compression for better performance
- mountpoint = "/"; # Root subvolume
- };
- "/persist" = {
- mountOptions = ["compress=zstd"]; # Compression for persistent data
- mountpoint = "/persist"; # Persistent subvolume
- };
- "/nix" = {
- mountOptions = [
- "compress=zstd"
- "noatime"
- "noacl"
- ]; # Optimize for Nix store
- mountpoint = "/nix"; # Nix subvolume
- };
- };
- };
- };
- };
- };
- };
-}
diff --git a/hosts/homelab/hardware.nix b/hosts/homelab/hardware.nix
deleted file mode 100755
index 89fe563..0000000
--- a/hosts/homelab/hardware.nix
+++ /dev/null
@@ -1,30 +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,
- pkgs,
- modulesPath,
- ...
-}: {
- imports = [
- (modulesPath + "/installer/scan/not-detected.nix")
- ];
-
- boot.initrd.availableKernelModules = ["nvme" "xhci_pci" "usbhid" "usb_storage" "sd_mod" "sdhci_pci"];
- boot.initrd.kernelModules = [];
- boot.kernelModules = ["kvm-amd"];
- boot.extraModulePackages = [];
-
- # 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
- # still possible to use this option, but it's recommended to use it in conjunction
- # with explicit per-interface declarations with `networking.interfaces..useDHCP`.
- networking.useDHCP = lib.mkDefault true;
- # networking.interfaces.enp3s0.useDHCP = lib.mkDefault true;
- # networking.interfaces.wlp4s0.useDHCP = lib.mkDefault true;
-
- nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
- hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
-}
diff --git a/hosts/homelab/home.nix b/hosts/homelab/home.nix
deleted file mode 100644
index 69d3e89..0000000
--- a/hosts/homelab/home.nix
+++ /dev/null
@@ -1,21 +0,0 @@
-{...}: {
- home.persistence."/persist" = {
- directories = [
- "Projects"
- "Stuff"
- ".ssh"
- ".wakatime"
- ".config/sops"
- ".config/go-wol"
- ".local/share/nvim"
- ".local/share/zsh"
- ".local/share/zoxide"
- ".local/state/lazygit"
- ];
- files = [
- ".wakatime.cfg"
- ];
- };
-
- home.stateVersion = "24.11";
-}
diff --git a/hosts/homelab/secrets.yaml b/hosts/homelab/secrets.yaml
deleted file mode 100644
index ce9e143..0000000
--- a/hosts/homelab/secrets.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-discord_token: ENC[AES256_GCM,data:fZqz6LD3+Svtton5gNCXO5ddWAqW1IyxP3M2DAIXZEIYRHUfAq8h9LES2IHWepjl5qKimxB35zacE/TYK2fitngWtRGVoMDBzzU6VTKNulNV3yFWrPA=,iv:YOplYld+c9vHVC0Srfm89qrh4yUygDiW67X2TdwHKMc=,tag:Ioc2wNLX818fRQ/2PSO7Sw==,type:str]
-hyperbolic_api_key: ENC[AES256_GCM,data:t8xjjzhgvM9BXiB5jDc2RR384d+mL5zXr+/obDLMm2J+IN+Xw9fr4iz50CTQ5ZMWWMoPjxzY5vgiJ+h71BsDRM0TvBMWuXd2ihKOIZOVo6OQmCX/SeKUgkjunFqz+YKcxsLsF7ZG/tOgWGqMmxom8iGV7LELKG/8MLDCF50YgJNO568MJMUU,iv:Cf+mSG2dxsRclDy8k7gK+hi+Qd5J7wqfS9SQztRob80=,tag:Io4aAFa29SUsfuPFI2/+DA==,type:str]
-gemini_api_key: ENC[AES256_GCM,data:GJWo7dXSaUbl2Q9h+Sc1sRF0g+82LyHk3mKFqDaBmRdalvyGwMvp,iv:odLpACXHVqxWIj7e/u6AY1pxjYX+e10Lezne1BlHl60=,tag:qO3zcz/93eHuEzG66zwwdA==,type:str]
-open_router_api_key: ENC[AES256_GCM,data:ETiZEngQRnOrJtDXSDfBanzbUyThTAu9BSQCL1tuVv07CCWJaXUui9Y0kS9oIO5to655FON3C0RxovTGx6rWQwOMKeEn5bHUHA==,iv:ePJzHKFWddkLGfydPi6uEzvksm7Djln/DBV88Jc1ugA=,tag:Eb7eYPMC0DlqtT7OFK4UuA==,type:str]
-sops:
- age:
- - recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2YktFRE9KS0h0T0hDTlpF
- ZEk0VzNTcVE0ampsWVRtSzJ3UHBXL2NlUUh3Cjk5ZnFKVENmTTJHQjgrVWlyOUE1
- THUrTUFzdWhKejNUNXpsNVpvZVdJWm8KLS0tIDZ5bmYzSVBUVlVORHAzSGtCQmVo
- a2JuSWVtMi9FMkova3BCd2F0U2VCRzQKonG/AkEn2X2l3vyr0UlJprGW2ZSwrczq
- xHafyGiU/I1AO/HoB3BXyP8t/Sgn/dy42lspqZ3MoLLlmx7dQeTd+g==
- -----END AGE ENCRYPTED FILE-----
- - recipient: age1jg642q775gmnmxeu29gcf3lph8vem4xr8t84cxe809dpd0myrussh49h60
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBxWUowUlB2cWVOclpRMENn
- TU5za0Y2UHZ5eFNZMEdQWm9xdTZFYkVwS2hNCnRBUU1ndFdiQ09sQjBDb1greC93
- ejl2OVZTTEtIcWpxUk5RRngrbjRWREEKLS0tIDVrSHhxbmJFdWwyQS9xeWlFZitJ
- Y1RHaFdXaE9DODJtSTFCSVZWb0xVeUEK4qeBKg3u+vhBIM1dQ7BaOWi/C7Q8hk60
- vu9Zr075n0+kb5Ab+RH24ZmEoP5PJXjwEfbAnmRTjn0reYn1nfcNYA==
- -----END AGE ENCRYPTED FILE-----
- lastmodified: "2025-10-14T06:52:16Z"
- mac: ENC[AES256_GCM,data:/p5Mbonr1YcrDgBIi+wFFPnNKsn74kuWf/EloNDnVWg59LuBy3nhrfXHUvbwlX7vLbSLozbuAHKTDcQ0+OUXJTYvMRApAGVh9HrvQFEQuOPOkwN8/qtdvwduInetX3t7PLWu4vbCVhl1v2BzJyEVQ9tzn7+8zEJhDDS7cPsZ9Is=,iv:GPJxjmOQPAqh0TulLhhX4UX+5FrZizCtDOkQa9xxaXY=,tag:Vv33D3wubWBDVOxdKOMENQ==,type:str]
- unencrypted_suffix: _unencrypted
- version: 3.10.2
diff --git a/hosts/isoImage/default.nix b/hosts/isoImage/default.nix
deleted file mode 100644
index f1a01a1..0000000
--- a/hosts/isoImage/default.nix
+++ /dev/null
@@ -1,91 +0,0 @@
-{
- pkgs,
- modulesPath,
- inputs,
- username,
- lib,
- ...
-}: {
- imports = [
- "${modulesPath}/installer/cd-dvd/installation-cd-minimal.nix"
- inputs.home-manager.nixosModules.home-manager
-
- ../common
- ../../modules/nixos/desktop
- ../../modules/nixos/desktop/awesome
- ../../modules/nixos/desktop/hyprland
- ];
-
- nixpkgs.hostPlatform = "x86_64-linux";
-
- networking = {
- hostName = "iso";
- };
-
- hardware = {
- bluetooth.enable = true;
- bluetooth.powerOnBoot = true;
- };
-
- security = {
- rtkit.enable = true;
- };
-
- programs = {
- ssh.startAgent = true;
- thunar = {
- enable = true;
- plugins = with pkgs; [
- thunar-archive-plugin
- thunar-volman
- ];
- };
- nm-applet.enable = true;
- };
-
- services = {
- resolved.enable = true;
-
- pipewire = {
- enable = true;
- alsa.enable = true;
- alsa.support32Bit = true;
- pulse.enable = true;
- };
-
- logind = {
- settings.Login = {
- HandlePowerKey = "suspend";
- HanldeLidSwitch = "suspend";
- HandleLidSwitchExternalPower = "suspend";
- };
- };
-
- libinput.touchpad.naturalScrolling = true;
- libinput.mouse.accelProfile = "flat";
-
- blueman.enable = true;
-
- gvfs.enable = true;
- tumbler.enable = true;
- };
-
- fonts.packages = with pkgs.nerd-fonts; [
- fira-code
- jetbrains-mono
- bigblue-terminal
- ];
-
- home-manager.users.${username} = {
- imports = [
- ./home.nix
- ];
- };
-
- users.users.${username} = {
- hashedPasswordFile = lib.mkForce null;
- initialPassword = username;
- };
-
- system.stateVersion = "23.11";
-}
diff --git a/hosts/isoImage/home.nix b/hosts/isoImage/home.nix
deleted file mode 100644
index 9d7c6fa..0000000
--- a/hosts/isoImage/home.nix
+++ /dev/null
@@ -1,19 +0,0 @@
-{pkgs, ...}: {
- imports = [
- ../../modules/home/desktop/awesome
- ../../modules/home/desktop/hyprland
- ../../modules/home/picom
- ../../modules/home/wezterm
- ../../modules/home/desktop/rofi
- ../../modules/home/firefox
- ../../modules/home/brave
- ];
-
- home.pointerCursor = {
- package = pkgs.bibata-cursors;
- name = "Bibata-Modern-Ice";
- size = 28;
- };
-
- home.stateVersion = "24.11";
-}
diff --git a/hosts/node/default.nix b/hosts/node/default.nix
deleted file mode 100755
index 8cf5bb2..0000000
--- a/hosts/node/default.nix
+++ /dev/null
@@ -1,54 +0,0 @@
-{
- inputs,
- username,
- ...
-}: {
- imports = [
- inputs.disko.nixosModules.default
-
- (import ./disko.nix {
- device = "/dev/nvme0n1";
- device2 = "/dev/nvme1n1";
- device3 = "/dev/sda";
- })
- ./hardware.nix
-
- ../common
- ];
-
- tux.services.openssh.enable = true;
-
- boot.loader.grub.enable = true;
-
- networking = {
- hostName = "node";
- networkmanager = {
- enable = true;
- wifi.powersave = false;
- };
- firewall = {
- enable = true;
- allowedTCPPorts = [
- 22
- 8545
- 8546
- 9545
- 9546
- ];
- };
- };
-
- security.rtkit.enable = true;
-
- environment.persistence."/persist" = {
- enable = false;
- };
-
- home-manager.users.${username} = {
- imports = [
- ./home.nix
- ];
- };
-
- system.stateVersion = "25.05";
-}
diff --git a/hosts/node/disko.nix b/hosts/node/disko.nix
deleted file mode 100644
index ee51714..0000000
--- a/hosts/node/disko.nix
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- device ? throw "Set this to the disk device, e.g. /dev/nvme0n1",
- device2 ? throw "Set this to the disk device2, e.g. /dev/nvme1n1",
- device3 ? throw "Set this to the disk device3, e.g. /dev/nvme1n1",
- ...
-}: {
- disko.devices = {
- disk = {
- disk1 = {
- type = "disk";
- device = "${device}";
- content = {
- type = "gpt";
- partitions = {
- boot = {
- size = "1M";
- type = "EF02"; # for grub MBR
- };
- mdadm = {
- size = "100%";
- content = {
- type = "mdraid";
- name = "raid0";
- };
- };
- };
- };
- };
- disk2 = {
- type = "disk";
- device = "${device2}";
- content = {
- type = "gpt";
- partitions = {
- boot = {
- size = "1M";
- type = "EF02"; # for grub MBR
- };
- mdadm = {
- size = "100%";
- content = {
- type = "mdraid";
- name = "raid0";
- };
- };
- };
- };
- };
- hdd = {
- type = "disk";
- device = "${device3}";
- content = {
- type = "gpt";
- partitions = {
- data = {
- size = "100%";
- content = {
- type = "filesystem";
- format = "ext4";
- mountpoint = "/mnt/hdd";
- };
- };
- };
- };
- };
- };
- mdadm = {
- raid0 = {
- type = "mdadm";
- level = 0;
- content = {
- type = "gpt";
- partitions = {
- primary = {
- size = "100%";
- content = {
- type = "filesystem";
- format = "ext4";
- mountpoint = "/";
- };
- };
- };
- };
- };
- };
- };
-}
diff --git a/hosts/node/hardware.nix b/hosts/node/hardware.nix
deleted file mode 100644
index 3a5dbf1..0000000
--- a/hosts/node/hardware.nix
+++ /dev/null
@@ -1,29 +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,
- pkgs,
- modulesPath,
- ...
-}: {
- imports = [
- (modulesPath + "/installer/scan/not-detected.nix")
- ];
-
- boot.initrd.availableKernelModules = ["xhci_pci" "ahci" "nvme" "usbhid"];
- boot.initrd.kernelModules = [];
- boot.kernelModules = ["kvm-amd"];
- boot.extraModulePackages = [];
-
- # 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
- # still possible to use this option, but it's recommended to use it in conjunction
- # with explicit per-interface declarations with `networking.interfaces..useDHCP`.
- networking.useDHCP = lib.mkDefault true;
- # networking.interfaces.enp41s0.useDHCP = lib.mkDefault true;
-
- nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
- hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
-}
diff --git a/hosts/node/home.nix b/hosts/node/home.nix
deleted file mode 100644
index 3443cad..0000000
--- a/hosts/node/home.nix
+++ /dev/null
@@ -1,3 +0,0 @@
-{...}: {
- home.stateVersion = "25.05";
-}
diff --git a/hosts/rigel/default.nix b/hosts/rigel/default.nix
deleted file mode 100644
index 1591f04..0000000
--- a/hosts/rigel/default.nix
+++ /dev/null
@@ -1,63 +0,0 @@
-{
- pkgs,
- username,
- outputs,
- inputs,
- email,
- ...
-}: {
- imports = [
- ../../modules/droid/sshd.nix
- ];
-
- android-integration.am.enable = true;
- android-integration.termux-open-url.enable = true;
- android-integration.xdg-open.enable = true;
- android-integration.termux-setup-storage.enable = true;
- android-integration.termux-reload-settings.enable = true;
-
- terminal.font = let
- firacode = pkgs.nerd-fonts.fira-code;
- fontPath = "share/fonts/truetype/NerdFonts/FiraCode/FiraCodeNerdFont-Regular.ttf";
- in "${firacode}/${fontPath}";
-
- time.timeZone = "Asia/Kolkata";
-
- tux.services.openssh = {
- enable = true;
- ports = [8033];
- authorizedKeys = [
- "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL+OzPUe2ECPC929DqpkM39tl/vdNAXfsRnmrGfR+X3D ${email}"
- ];
- };
-
- user = {
- uid = 10225;
- gid = 10225;
- shell = "${pkgs.zsh}/bin/zsh";
- };
-
- environment.etcBackupExtension = ".backup";
- environment.motd = '''';
- environment.packages = with pkgs; [
- nano
- git
- neovim
- openssh
- inputs.trok.packages."aarch64-linux".default
- ];
-
- home-manager = {
- config = ./home.nix;
- backupFileExtension = "backup";
- extraSpecialArgs = {inherit inputs outputs username email;};
- useGlobalPkgs = true;
- };
-
- # Set up nix for flakes
- nix.extraOptions = ''
- experimental-features = nix-command flakes
- '';
-
- system.stateVersion = "24.05";
-}
diff --git a/hosts/rigel/home.nix b/hosts/rigel/home.nix
deleted file mode 100644
index a952cec..0000000
--- a/hosts/rigel/home.nix
+++ /dev/null
@@ -1,35 +0,0 @@
-{pkgs, ...}: {
- imports = [
- ../../modules/home/git
- ../../modules/home/starship
- ../../modules/home/fastfetch
- ];
-
- programs = {
- bat.enable = true;
- zoxide = {
- enable = true;
- options = ["--cmd cd"];
- };
- zsh = {
- enable = true;
- shellAliases = {
- ls = "lsd";
- };
- syntaxHighlighting.enable = true;
- autosuggestion.enable = true;
- initContent = ''
- fastfetch
- '';
- };
- };
-
- home.packages = with pkgs; [
- neovim
- busybox
- lsd
- fastfetch
- ];
-
- home.stateVersion = "24.05";
-}
diff --git a/hosts/sirius/default.nix b/hosts/sirius/default.nix
deleted file mode 100644
index 5433902..0000000
--- a/hosts/sirius/default.nix
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- pkgs,
- inputs,
- username,
- config,
- ...
-}: {
- imports = [
- inputs.nixos-wsl.nixosModules.wsl
-
- ../common
- ../../modules/nixos/virtualisation/docker.nix
- ];
-
- hardware.nvidia-container-toolkit = {
- enable = true;
- suppressNvidiaDriverAssertion = true;
- };
-
- tux.services.openssh.enable = true;
-
- sops.secrets = {
- hyperbolic_api_key = {
- sopsFile = ./secrets.yaml;
- owner = "${username}";
- };
-
- gemini_api_key = {
- sopsFile = ./secrets.yaml;
- owner = "${username}";
- };
-
- open_router_api_key = {
- sopsFile = ./secrets.yaml;
- owner = "${username}";
- };
- };
-
- boot.binfmt.emulatedSystems = ["aarch64-linux"];
-
- nixpkgs = {
- config.cudaSupport = true;
- hostPlatform = "x86_64-linux";
- };
-
- wsl = {
- enable = true;
- defaultUser = "${username}";
- useWindowsDriver = true;
- interop.register = true;
- };
-
- networking.hostName = "sirius";
-
- programs = {
- ssh.startAgent = true;
- zsh.enable = true;
-
- nix-ld = {
- enable = true;
- libraries = config.hardware.graphics.extraPackages;
- package = pkgs.nix-ld;
- };
-
- dconf.enable = true;
- };
-
- environment.persistence."/persist" = {
- enable = false;
- };
-
- home-manager.users.${username} = {
- imports = [
- ./home.nix
- ];
- };
-
- system.stateVersion = "23.11";
-}
diff --git a/hosts/sirius/home.nix b/hosts/sirius/home.nix
deleted file mode 100644
index 86ea8a7..0000000
--- a/hosts/sirius/home.nix
+++ /dev/null
@@ -1,3 +0,0 @@
-{...}: {
- home.stateVersion = "23.11";
-}
diff --git a/hosts/sirius/secrets.yaml b/hosts/sirius/secrets.yaml
deleted file mode 100644
index 32ff925..0000000
--- a/hosts/sirius/secrets.yaml
+++ /dev/null
@@ -1,27 +0,0 @@
-hyperbolic_api_key: ENC[AES256_GCM,data:3E4oWt65AU3anVUEU52r7vpRddDgXdqKgvc/URQmJGbA0nu6sbRmw3lD44SG0L5tMubi20+gkKlyFV3i8q2U148eo582Sxh8eXshvvjZ+gr9W9Eg0Tk9kQWycrE+N3r3g1AC+CWtbkRFDxQLuVAYf9W4mTw2Yg1VLV7H3BUCSYv3Rg5EPb9c,iv:Z+72Bk+5ZnHVR+SHXgM5mwfsIp4zZf9Iv8cAaZQB3Mg=,tag:phqWkpOCKnfiCBvR/f3flw==,type:str]
-gemini_api_key: ENC[AES256_GCM,data:S9DEgF4xIDXaOqs+3vdRbFb4Z8eAV1hVg8PwEfasWu9XGH3CTXV8,iv:LvUFg6dzlzC3feGh//d2rmxvVq5TJQDEBQWfxNa259Y=,tag:juLXnsiXz7OmYvyKfAv66Q==,type:str]
-open_router_api_key: ENC[AES256_GCM,data:tUtkVER9ZlhSeb0bDbA1nRi1lkRX/ofosV+mcHnaNQmAZXWXiyn8WDfemxxNuvU86YctURxL4TckfsQv7RmMjY7esB1Pmmwf9Q==,iv:elT8JJu48cgu4Q1YWxiL4ePNkP+EGhI8blqfUB/nmz8=,tag:bMvUXUegE+GJ6WdypTxLyw==,type:str]
-sops:
- age:
- - recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBtVUx5VWlHekQ1ZlBWb1cv
- aWpXQ0NUaDVudENNRWhPdXlhekhwZW9zbjNNCkRzTlVOZm53MnJmckp6d3FsTU9D
- M2pZYUs2aHJzWjQzM01BMUVaZHlsdm8KLS0tIG04Rjc3VXM1eFhvTGhpMVlJdE9K
- dkYwdGZMRmZ1MFFTVlI4T0MrNytsV00KmdCXJ/EBZhLN/NXuOf36LjwmGTze46Ou
- kQtKSpdzLdo/bdS6sbUGVHqDLeS7GwGtVciMh9zBHCsGBCAAkQHxIA==
- -----END AGE ENCRYPTED FILE-----
- - recipient: age1f860dfewlx5jtt9ejr47gywx70p3dmyc8mat29gpr75psljwjv8q5xyxkq
- enc: |
- -----BEGIN AGE ENCRYPTED FILE-----
- YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiSXhQdEpJZHBGbjlZTnhD
- U0Zwc1pwbGtHdkRFbWJRVzRNWUdqakhzM2pJCmYyYlMwQVZEbzkxcnRKVERyeExB
- Z0hXcTdyMHMwREExdlJmR3JHTldvRnMKLS0tIFNMczN6QmI3cUR6clBDU2dKQTVF
- U1dpRkttaURwSkgySVdiR25iZk50b2cKrrNfeAV73W3+kWM0diIFj08+koBVySVx
- U3tYYrePi7qQxDSrNo4a14yOopjktj/ABKpxI5cfza6aS5NQxErq2Q==
- -----END AGE ENCRYPTED FILE-----
- lastmodified: "2025-10-10T21:30:12Z"
- mac: ENC[AES256_GCM,data:IxGSaYj3PLV+RA4G+A3yep0RkcPr9xd6X7yKJP3QVthzGinm0KRNs8wyMdDgdSrK/e0AlzN594VOMTRRgxLV9oPqEPqufWDGGCpiKuW+q2mJSv3i3f1dUbO/l+OSTEFqeeKb8rWEhbJ3qcjEhI/eFB+RNkDtJvSzDlJsS4uDB9A=,iv:VlvTI3AHyBKpwr9b29YqN8V1Tjq2E8oAOAPA7LuAKps=,tag:+BFt/T4ep66WFz9Y2a7a9w==,type:str]
- unencrypted_suffix: _unencrypted
- version: 3.10.2
diff --git a/hosts/vega/default.nix b/hosts/vega/default.nix
deleted file mode 100644
index 07bae60..0000000
--- a/hosts/vega/default.nix
+++ /dev/null
@@ -1,67 +0,0 @@
-{
- pkgs,
- username,
- ...
-}: {
- imports = [
- ./hardware.nix
- ../common
-
- ../../modules/nixos/selfhosted/adguard.nix
- ];
-
- tux.services.openssh.enable = true;
-
- boot.initrd.availableKernelModules = [
- "usbhid"
- "usb_storage"
- "vc4"
- "pcie_brcmstb" # required for the pcie bus to work
- "reset-raspberrypi" # required for vl805 firmware to load
- ];
-
- # Use the extlinux boot loader. (NixOS wants to enable GRUB by default)
- boot.loader.grub.enable = false;
- # Enables the generation of /boot/extlinux/extlinux.conf
- boot.loader.generic-extlinux-compatible.enable = true;
-
- hardware.enableRedistributableFirmware = true;
- powerManagement.cpuFreqGovernor = "ondemand";
-
- networking = {
- hostName = "vega";
- networkmanager = {
- enable = true;
- wifi.powersave = false;
- };
- firewall = {
- enable = true;
- allowedTCPPorts = [22];
-
- # Facilitate firewall punching
- allowedUDPPorts = [41641];
- };
- };
-
- services = {
- tailscale = {
- enable = true;
- extraUpFlags = ["--login-server https://hs.tux.rs"];
- };
- };
-
- environment.systemPackages = with pkgs; [go-wol];
-
- environment.persistence."/persist" = {
- enable = false;
- };
-
- users.users.${username} = {linger = true;};
- home-manager.users.${username} = {
- imports = [
- ./home.nix
- ];
- };
-
- system.stateVersion = "24.11";
-}
diff --git a/hosts/vega/hardware.nix b/hosts/vega/hardware.nix
deleted file mode 100644
index 9f89204..0000000
--- a/hosts/vega/hardware.nix
+++ /dev/null
@@ -1,36 +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,
- pkgs,
- modulesPath,
- ...
-}: {
- imports = [
- (modulesPath + "/installer/scan/not-detected.nix")
- ];
-
- boot.initrd.availableKernelModules = [];
- boot.initrd.kernelModules = [];
- boot.kernelModules = [];
- boot.extraModulePackages = [];
-
- fileSystems."/" = {
- device = "/dev/disk/by-uuid/44444444-4444-4444-8888-888888888888";
- fsType = "ext4";
- };
-
- swapDevices = [];
-
- # 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
- # still possible to use this option, but it's recommended to use it in conjunction
- # with explicit per-interface declarations with `networking.interfaces..useDHCP`.
- networking.useDHCP = lib.mkDefault true;
- # networking.interfaces.enu1u1.useDHCP = lib.mkDefault true;
- # networking.interfaces.wlan0.useDHCP = lib.mkDefault true;
-
- nixpkgs.hostPlatform = lib.mkDefault "aarch64-linux";
-}
diff --git a/hosts/vega/home.nix b/hosts/vega/home.nix
deleted file mode 100644
index 06e725e..0000000
--- a/hosts/vega/home.nix
+++ /dev/null
@@ -1,3 +0,0 @@
-{...}: {
- home.stateVersion = "24.11";
-}
diff --git a/hosts/vps/default.nix b/hosts/vps/default.nix
deleted file mode 100644
index 353c09e..0000000
--- a/hosts/vps/default.nix
+++ /dev/null
@@ -1,102 +0,0 @@
-{
- modulesPath,
- inputs,
- username,
- lib,
- ...
-}: {
- imports = [
- (modulesPath + "/installer/scan/not-detected.nix")
- (modulesPath + "/profiles/qemu-guest.nix")
- inputs.disko.nixosModules.default
- (import ./disko.nix {device = "/dev/sda";})
-
- ../common
- ];
-
- tux.services.openssh.enable = true;
-
- nixpkgs = {
- hostPlatform = "x86_64-linux";
- };
-
- boot = {
- initrd.systemd = {
- enable = lib.mkForce true;
-
- services.wipe-my-fs = {
- wantedBy = ["initrd.target"];
- after = ["initrd-root-device.target"];
- before = ["sysroot.mount"];
- unitConfig.DefaultDependencies = "no";
- serviceConfig.Type = "oneshot";
- script = ''
- mkdir /btrfs_tmp
- mount /dev/disk/by-partlabel/disk-primary-root /btrfs_tmp
-
- if [[ -e /btrfs_tmp/root ]]; then
- mkdir -p /btrfs_tmp/old_roots
- timestamp=$(date --date="@$(stat -c %Y /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"
- }
-
- for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +30); do
- delete_subvolume_recursively "$i"
- done
-
- btrfs subvolume create /btrfs_tmp/root
- umount /btrfs_tmp
- '';
- };
- };
-
- loader = {
- grub = {
- efiSupport = true;
- efiInstallAsRemovable = true;
- };
- };
- };
-
- networking.hostName = "vps";
-
- users = {
- users.${username} = {
- password = "${username}";
- hashedPasswordFile = lib.mkForce null;
- };
- };
-
- programs.fuse.userAllowOther = true;
- fileSystems."/persist".neededForBoot = true;
- environment.persistence."/persist" = {
- hideMounts = true;
- directories = [
- "/var/log"
- "/var/lib/nixos"
- ];
- files = [
- "/etc/ssh/ssh_host_ed25519_key"
- "/etc/ssh/ssh_host_ed25519_key.pub"
- "/etc/ssh/ssh_host_rsa_key"
- "/etc/ssh/ssh_host_rsa_key.pub"
- ];
- };
-
- users.users.${username} = {linger = true;};
- home-manager.users.${username} = {
- imports = [
- ./home.nix
- ];
- };
-
- system.stateVersion = "24.11";
-}
diff --git a/hosts/vps/disko.nix b/hosts/vps/disko.nix
deleted file mode 100644
index 4a0c700..0000000
--- a/hosts/vps/disko.nix
+++ /dev/null
@@ -1,53 +0,0 @@
-{device ? throw "Set this to the disk device, e.g. /dev/nvme0n1", ...}: {
- disko.devices.disk.primary = {
- inherit device;
- type = "disk";
- content = {
- type = "gpt"; # GPT partitioning scheme
- partitions = {
- boot = {
- name = "boot";
- size = "1M";
- type = "EF02";
- };
- # EFI Partition
- ESP = {
- size = "512M";
- type = "EF00";
- content = {
- type = "filesystem";
- format = "vfat";
- mountpoint = "/boot";
- mountOptions = ["defaults" "umask=0077"];
- };
- };
- # Btrfs Root Partition
- root = {
- size = "100%"; # Use remaining space
- type = "8300"; # Linux filesystem type
- content = {
- type = "btrfs";
- subvolumes = {
- "/root" = {
- mountOptions = ["compress=zstd"]; # Compression for better performance
- mountpoint = "/"; # Root subvolume
- };
- "/persist" = {
- mountOptions = ["compress=zstd"]; # Compression for persistent data
- mountpoint = "/persist"; # Persistent subvolume
- };
- "/nix" = {
- mountOptions = [
- "compress=zstd"
- "noatime"
- "noacl"
- ]; # Optimize for Nix store
- mountpoint = "/nix"; # Nix subvolume
- };
- };
- };
- };
- };
- };
- };
-}
diff --git a/hosts/vps/home.nix b/hosts/vps/home.nix
deleted file mode 100644
index 4fd1caf..0000000
--- a/hosts/vps/home.nix
+++ /dev/null
@@ -1,11 +0,0 @@
-{...}: {
- home.persistence."/persist" = {
- directories = [
- "Projects"
- ".ssh"
- ".local/share/zsh"
- ];
- };
-
- home.stateVersion = "24.11";
-}
diff --git a/modules/base/default.nix b/modules/base/default.nix
deleted file mode 100644
index e5d0cf6..0000000
--- a/modules/base/default.nix
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- imports = [
- ./nix.nix
- ./nixpkgs.nix
- ./nh.nix
- ./overlays.nix
- ./sops.nix
- ./substituters.nix
- ./user.nix
- ];
-}
diff --git a/modules/base/nh.nix b/modules/base/nh.nix
deleted file mode 100644
index 1f099a0..0000000
--- a/modules/base/nh.nix
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- config,
- username,
- ...
-}: {
- programs.nh = {
- enable = true;
-
- clean = {
- enable = !config.nix.gc.automatic;
- dates = "weekly";
- };
-
- flake = "/home/${username}/Projects/nixos-config";
- };
-}
diff --git a/modules/base/nix.nix b/modules/base/nix.nix
deleted file mode 100644
index 7c096fc..0000000
--- a/modules/base/nix.nix
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- pkgs,
- username,
- ...
-}: {
- nix = {
- # @TODO enable when lix is patched
- # package = pkgs.lix;
-
- gc = {
- automatic = true;
- dates = "weekly";
- options = "--delete-older-than 7d";
- };
-
- optimise = {
- automatic = true;
- dates = ["weekly"];
- };
-
- channel.enable = false;
-
- settings = {
- extra-platforms = [
- "aarch64-linux"
- "arm-linux"
- ];
- auto-optimise-store = true;
- allowed-users = ["${username}"];
- trusted-users = ["${username}"];
- experimental-features = "nix-command flakes";
- keep-going = true;
- warn-dirty = false;
- http-connections = 50;
- };
- };
-}
diff --git a/modules/base/nixpkgs.nix b/modules/base/nixpkgs.nix
deleted file mode 100644
index 9915423..0000000
--- a/modules/base/nixpkgs.nix
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- nixpkgs = {
- config = {
- allowUnfree = true;
- joypixels.acceptLicense = true;
- };
- };
-}
diff --git a/modules/base/overlays.nix b/modules/base/overlays.nix
deleted file mode 100644
index 7ff88b8..0000000
--- a/modules/base/overlays.nix
+++ /dev/null
@@ -1,9 +0,0 @@
-{outputs, ...}: {
- nixpkgs.overlays = [
- outputs.overlays.additions
- outputs.overlays.modifications
- outputs.overlays.stable-packages
- outputs.overlays.nur
- outputs.overlays.nix-vscode-extensions
- ];
-}
diff --git a/modules/base/sops.nix b/modules/base/sops.nix
deleted file mode 100644
index 6dd1e38..0000000
--- a/modules/base/sops.nix
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- inputs,
- config,
- pkgs,
- ...
-}: let
- isEd25519 = k: k.type == "ed25519";
- getKeyPath = k: k.path;
- keys = builtins.filter isEd25519 config.services.openssh.hostKeys;
-in {
- imports = [inputs.sops-nix.nixosModules.sops];
-
- sops.age = {
- sshKeyPaths = map getKeyPath keys;
- keyFile = "/var/lib/sops-nix/key.txt";
- generateKey = true;
- };
-
- environment.systemPackages = with pkgs; [sops];
-}
diff --git a/modules/base/substituters.nix b/modules/base/substituters.nix
deleted file mode 100644
index 4e8a664..0000000
--- a/modules/base/substituters.nix
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- nix.settings = {
- substituters = [
- "https://cache.nixos.org?priority=10"
- "https://anyrun.cachix.org"
- "https://fufexan.cachix.org"
- "https://helix.cachix.org"
- "https://hyprland.cachix.org"
- "https://nix-community.cachix.org"
- "https://nix-gaming.cachix.org"
- "https://yazi.cachix.org"
- "https://nix-on-droid.cachix.org"
- ];
- trusted-substituters = ["https://nix-on-droid.cachix.org"];
- trusted-public-keys = [
- "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
- "anyrun.cachix.org-1:pqBobmOjI7nKlsUMV25u9QHa9btJK65/C8vnO3p346s="
- "fufexan.cachix.org-1:LwCDjCJNJQf5XD2BV+yamQIMZfcKWR9ISIFy5curUsY="
- "helix.cachix.org-1:ejp9KQpR1FBI2onstMQ34yogDm4OgU2ru6lIwPvuCVs="
- "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="
- "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
- "nix-gaming.cachix.org-1:nbjlureqMbRAxR1gJ/f3hxemL9svXaZF/Ees8vCUUs4="
- "yazi.cachix.org-1:Dcdz63NZKfvUCbDGngQDAZq6kOroIrFoyO064uvLh8k="
- "nix-on-droid.cachix.org-1:56snoMJTXmDRC1Ei24CmKoUqvHJ9XCp+nidK7qkMQrU="
- ];
- };
-}
diff --git a/modules/base/user.nix b/modules/base/user.nix
deleted file mode 100644
index c63052e..0000000
--- a/modules/base/user.nix
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- config,
- pkgs,
- username,
- email,
- ...
-}: {
- users = {
- mutableUsers = false;
- defaultUserShell = pkgs.zsh;
- users.${username} = {
- hashedPasswordFile = config.sops.secrets.tux-password.path;
- isNormalUser = true;
- extraGroups = ["networkmanager" "wheel" "storage"];
- openssh.authorizedKeys.keys = [
- ''ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL+OzPUe2ECPC929DqpkM39tl/vdNAXfsRnmrGfR+X3D ${email}''
- ];
- };
- };
-}
diff --git a/modules/droid/core/hm.nix b/modules/droid/core/hm.nix
new file mode 100644
index 0000000..694b152
--- /dev/null
+++ b/modules/droid/core/hm.nix
@@ -0,0 +1,32 @@
+{ inputs, config, ... }:
+{
+ flake.modules.nixOnDroid.core =
+ {
+ hostName,
+ userName,
+ userEmail,
+ ...
+ }:
+ {
+ home-manager = {
+ backupFileExtension = "bak";
+ useGlobalPkgs = true;
+ useUserPackages = true;
+ extraSpecialArgs = {
+ inherit
+ inputs
+ hostName
+ userName
+ userEmail
+ ;
+ };
+
+ config = {
+ imports = [
+ config.flake.modules.homeManager.shell
+ config.flake.modules.homeManager.${hostName}
+ ];
+ };
+ };
+ };
+}
diff --git a/modules/droid/core/nix.nix b/modules/droid/core/nix.nix
new file mode 100644
index 0000000..e74862c
--- /dev/null
+++ b/modules/droid/core/nix.nix
@@ -0,0 +1,7 @@
+{
+ flake.modules.nixOnDroid.core = {
+ nix.extraOptions = ''
+ experimental-features = nix-command flakes
+ '';
+ };
+}
diff --git a/modules/droid/networking/ssh.nix b/modules/droid/networking/ssh.nix
new file mode 100644
index 0000000..5c399be
--- /dev/null
+++ b/modules/droid/networking/ssh.nix
@@ -0,0 +1,109 @@
+{
+ flake.modules.nixOnDroid.networking =
+ {
+ config,
+ lib,
+ pkgs,
+ ...
+ }:
+ let
+ # utility functions
+ concatLines = list: builtins.concatStringsSep "\n" list;
+
+ prefixLines = mapper: list: concatLines (map mapper list);
+
+ # could be put in the config
+ configPath = "ssh/sshd_config";
+
+ keysFolder = "/etc/ssh";
+
+ authorizedKeysFolder = "/etc/ssh/authorized_keys.d";
+
+ supportedKeysTypes = [
+ "rsa"
+ "ed25519"
+ ];
+
+ sshd-start-bin = "sshd-start";
+
+ # real config
+ cfg = config.tnix.networking.openssh;
+
+ pathOfKeyOf = type: "${keysFolder}/ssh_host_${type}_key";
+
+ generateKeyOf = type: ''
+ ${lib.getExe' pkgs.openssh "ssh-keygen"} \
+ -t "${type}" \
+ -f "${pathOfKeyOf type}" \
+ -N ""
+ '';
+
+ generateKeyWhenNeededOf = type: ''
+ if [ ! -f ${pathOfKeyOf type} ]; then
+ mkdir --parents ${keysFolder}
+ ${generateKeyOf type}
+ fi
+ '';
+
+ sshd-start = pkgs.writeScriptBin sshd-start-bin ''
+ #!${pkgs.runtimeShell}
+ ${prefixLines generateKeyWhenNeededOf supportedKeysTypes}
+
+ mkdir --parents "${authorizedKeysFolder}"
+ echo "${lib.concatStringsSep "\n" cfg.authorizedKeys}" > ${authorizedKeysFolder}/${config.user.userName}
+
+ echo "Starting sshd in non-daemonized way on port ${lib.concatMapStrings toString cfg.ports}"
+ ${lib.getExe' pkgs.openssh "sshd"} \
+ -f "/etc/${configPath}" \
+ -D # don't detach into a daemon process
+ '';
+ in
+ {
+ options.tnix.networking.openssh = {
+ enable = lib.mkEnableOption ''
+ Whether to enable the OpenSSH secure shell daemon, which
+ allows secure remote logins.
+ '';
+
+ ports = lib.mkOption {
+ type = lib.types.listOf lib.types.port;
+ default = [ 22 ];
+ description = ''
+ Specifies on which ports the SSH daemon listens.
+ '';
+ };
+
+ authorizedKeys = lib.mkOption {
+ type = lib.types.listOf lib.types.str;
+ default = [ ];
+ description = ''
+ Specify a list of public keys to be added to the authorized_keys file.
+ '';
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ environment.etc = {
+ "${configPath}".text = ''
+ ${prefixLines (port: "Port ${toString port}") cfg.ports}
+
+ AuthorizedKeysFile ${authorizedKeysFolder}/%u
+
+ LogLevel VERBOSE
+ '';
+ };
+
+ environment.packages = [
+ sshd-start
+ pkgs.openssh
+ ];
+
+ build.activationAfter.sshd = ''
+ SERVER_PID=$(${lib.getExe' pkgs.procps "ps"} -a | ${lib.getExe' pkgs.toybox "grep"} sshd || true)
+ if [ -z "$SERVER_PID" ]; then
+ $DRY_RUN_CMD ${lib.getExe sshd-start}
+ fi
+ '';
+ };
+ };
+}
diff --git a/modules/droid/sshd.nix b/modules/droid/sshd.nix
deleted file mode 100644
index 43a7dba..0000000
--- a/modules/droid/sshd.nix
+++ /dev/null
@@ -1,106 +0,0 @@
-{
- config,
- lib,
- pkgs,
- ...
-}: let
- # utility functions
- concatLines = list: builtins.concatStringsSep "\n" list;
-
- prefixLines = mapper: list: concatLines (map mapper list);
-
- # could be put in the config
- configPath = "ssh/sshd_config";
-
- keysFolder = "/etc/ssh";
-
- authorizedKeysFolder = "/etc/ssh/authorized_keys.d";
-
- supportedKeysTypes = [
- "rsa"
- "ed25519"
- ];
-
- sshd-start-bin = "sshd-start";
-
- # real config
- cfg = config.tux.services.openssh;
-
- pathOfKeyOf = type: "${keysFolder}/ssh_host_${type}_key";
-
- generateKeyOf = type: ''
- ${lib.getExe' pkgs.openssh "ssh-keygen"} \
- -t "${type}" \
- -f "${pathOfKeyOf type}" \
- -N ""
- '';
-
- generateKeyWhenNeededOf = type: ''
- if [ ! -f ${pathOfKeyOf type} ]; then
- mkdir --parents ${keysFolder}
- ${generateKeyOf type}
- fi
- '';
-
- sshd-start = pkgs.writeScriptBin sshd-start-bin ''
- #!${pkgs.runtimeShell}
- ${prefixLines generateKeyWhenNeededOf supportedKeysTypes}
-
- mkdir --parents "${authorizedKeysFolder}"
- echo "${lib.concatStringsSep "\n" cfg.authorizedKeys}" > ${authorizedKeysFolder}/${config.user.userName}
-
- echo "Starting sshd in non-daemonized way on port ${lib.concatMapStrings toString cfg.ports}"
- ${lib.getExe' pkgs.openssh "sshd"} \
- -f "/etc/${configPath}" \
- -D # don't detach into a daemon process
- '';
-in {
- options = {
- tux.services.openssh = {
- enable = lib.mkEnableOption ''
- Whether to enable the OpenSSH secure shell daemon, which
- allows secure remote logins.
- '';
-
- ports = lib.mkOption {
- type = lib.types.listOf lib.types.port;
- default = [22];
- description = ''
- Specifies on which ports the SSH daemon listens.
- '';
- };
-
- authorizedKeys = lib.mkOption {
- type = lib.types.listOf lib.types.str;
- default = [];
- description = ''
- Specify a list of public keys to be added to the authorized_keys file.
- '';
- };
- };
- };
-
- config = lib.mkIf cfg.enable {
- environment.etc = {
- "${configPath}".text = ''
- ${prefixLines (port: "Port ${toString port}") cfg.ports}
-
- AuthorizedKeysFile ${authorizedKeysFolder}/%u
-
- LogLevel VERBOSE
- '';
- };
-
- environment.packages = [
- sshd-start
- pkgs.openssh
- ];
-
- build.activationAfter.sshd = ''
- SERVER_PID=$(${lib.getExe' pkgs.procps "ps"} -a | ${lib.getExe' pkgs.toybox "grep"} sshd || true)
- if [ -z "$SERVER_PID" ]; then
- $DRY_RUN_CMD ${lib.getExe sshd-start}
- fi
- '';
- };
-}
diff --git a/modules/flake/flake-parts.nix b/modules/flake/flake-parts.nix
new file mode 100644
index 0000000..1c75663
--- /dev/null
+++ b/modules/flake/flake-parts.nix
@@ -0,0 +1,4 @@
+{ inputs, ... }:
+{
+ imports = [ inputs.flake-parts.flakeModules.modules ];
+}
diff --git a/modules/flake/hosts.nix b/modules/flake/hosts.nix
new file mode 100644
index 0000000..3dbe199
--- /dev/null
+++ b/modules/flake/hosts.nix
@@ -0,0 +1,130 @@
+{
+ self,
+ inputs,
+ config,
+ ...
+}:
+let
+ mkNixOSHost =
+ hostName:
+ {
+ userName ? "tux",
+ userEmail ? "t@tux.rs",
+ system ? "x86_64-linux",
+ unstable ? true,
+ }:
+ let
+ nixpkgs = if unstable then inputs.nixpkgs else inputs.nixpkgs-stable;
+ in
+ nixpkgs.lib.nixosSystem {
+ inherit system;
+ specialArgs = {
+ inherit
+ hostName
+ userName
+ userEmail
+ system
+ ;
+ };
+ modules = [
+ config.flake.modules.nixos.core
+ config.flake.modules.nixos.${hostName}
+ ];
+ };
+
+ mkDroidHost =
+ hostName:
+ {
+ userName ? "nix-on-droid",
+ userEmail ? "t@tux.rs",
+ system ? "aarch64-linux",
+ unstable ? true,
+ }:
+ let
+ nixpkgs = if unstable then inputs.nixpkgs else inputs.nixpkgs-stable;
+ in
+ inputs.nix-on-droid.lib.nixOnDroidConfiguration {
+ pkgs = import nixpkgs {
+ inherit system;
+ config = {
+ allowUnfree = true;
+ joypixels.acceptLicense = true;
+ };
+ overlays = builtins.attrValues inputs.self.overlays;
+ };
+ extraSpecialArgs = {
+ inherit
+ hostName
+ userName
+ userEmail
+ ;
+ };
+ modules = [
+ config.flake.modules.nixOnDroid.core
+ config.flake.modules.nixOnDroid.${hostName}
+ ];
+ };
+
+ mkNixOSNode =
+ hostName:
+ {
+ system ? "x86_64-linux",
+ }:
+ {
+ hostname = hostName;
+ profiles.system = {
+ user = "root";
+ path = inputs.deploy-rs.lib.${system}.activate.nixos self.nixosConfigurations.${hostName};
+ };
+ };
+
+ activateNixOnDroid =
+ system: configuration:
+ inputs.deploy-rs.lib.${system}.activate.custom configuration.activationPackage
+ "${configuration.activationPackage}/activate";
+
+ mkDroidNode =
+ hostName:
+ {
+ system ? "aarch64-linux",
+ }:
+ {
+ hostname = hostName;
+ profiles.system = {
+ sshUser = "nix-on-droid";
+ user = "nix-on-droid";
+ magicRollback = true;
+ sshOpts = [
+ "-p"
+ "8033"
+ ];
+ path = activateNixOnDroid system self.nixOnDroidConfigurations.${hostName};
+ };
+ };
+
+in
+{
+ flake = {
+ nixosConfigurations = builtins.mapAttrs mkNixOSHost {
+ sirius = { };
+ canopus = { };
+ arcturus = { };
+ alpha = { };
+ vps = { };
+ };
+
+ nixOnDroidConfigurations = builtins.mapAttrs mkDroidHost {
+ vega = { };
+ };
+
+ deploy.nodes =
+ builtins.mapAttrs (hostName: _: mkNixOSNode hostName { }) self.nixosConfigurations
+ // builtins.mapAttrs (hostName: _: mkDroidNode hostName { }) self.nixOnDroidConfigurations;
+ };
+
+ perSystem = {
+ checks = builtins.mapAttrs (
+ _: hostConfig: hostConfig.config.system.build.toplevel
+ ) self.nixosConfigurations;
+ };
+}
diff --git a/modules/flake/overlays.nix b/modules/flake/overlays.nix
new file mode 100644
index 0000000..184a81f
--- /dev/null
+++ b/modules/flake/overlays.nix
@@ -0,0 +1,42 @@
+{
+ inputs,
+ ...
+}:
+{
+ flake.overlays = {
+ modifications = final: prev: {
+ tnvim = inputs.tnvim.packages.${prev.stdenv.hostPlatform.system}.default;
+ tshell = inputs.tshell.packages.${prev.stdenv.hostPlatform.system}.default;
+ trok = inputs.trok.packages.${prev.stdenv.hostPlatform.system}.default;
+ tfolio = inputs.tfolio.packages.${prev.stdenv.hostPlatform.system}.default;
+ cyber-tux = inputs.cyber-tux.packages.${prev.stdenv.hostPlatform.system}.default;
+ wezterm-git = inputs.wezterm-flake.packages.${prev.stdenv.hostPlatform.system}.default;
+ hyprland-git = inputs.hyprland.packages.${prev.stdenv.hostPlatform.system};
+ awww = inputs.awww.packages.${prev.stdenv.hostPlatform.system}.awww;
+ vicinae-extensions = inputs.vicinae-extensions.packages.${prev.stdenv.hostPlatform.system};
+ voxtype = inputs.voxtype.packages.${prev.stdenv.hostPlatform.system};
+ opencode-git = inputs.opencode.packages.${prev.stdenv.hostPlatform.system}.default;
+ nix-index-small =
+ inputs.nix-index-database.packages.${prev.stdenv.hostPlatform.system}.nix-index-with-small-db;
+ };
+
+ stable-packages = final: _prev: {
+ stable = import inputs.nixpkgs-stable {
+ system = final.stdenv.hostPlatform.system;
+ config.allowUnfree = true;
+ };
+ };
+
+ nur = inputs.nur.overlays.default;
+ copyparty = inputs.copyparty.overlays.default;
+ };
+
+ perSystem =
+ { system, ... }:
+ {
+ _module.args.pkgs = import inputs.nixpkgs {
+ inherit system;
+ overlays = builtins.attrValues inputs.self.overlays;
+ };
+ };
+}
diff --git a/modules/flake/systems.nix b/modules/flake/systems.nix
new file mode 100644
index 0000000..991fba3
--- /dev/null
+++ b/modules/flake/systems.nix
@@ -0,0 +1,6 @@
+{
+ systems = [
+ "x86_64-linux"
+ "aarch64-linux"
+ ];
+}
diff --git a/modules/flake/treefmt.nix b/modules/flake/treefmt.nix
new file mode 100644
index 0000000..6aadd98
--- /dev/null
+++ b/modules/flake/treefmt.nix
@@ -0,0 +1,16 @@
+{ inputs, ... }:
+{
+ imports = [
+ inputs.treefmt-nix.flakeModule
+ ];
+
+ perSystem = {
+ treefmt.config = {
+ projectRootFile = "flake.nix";
+ flakeCheck = true;
+ programs = {
+ nixfmt.enable = true;
+ };
+ };
+ };
+}
diff --git a/modules/hm/core/hm.nix b/modules/hm/core/hm.nix
new file mode 100644
index 0000000..5fced0c
--- /dev/null
+++ b/modules/hm/core/hm.nix
@@ -0,0 +1,13 @@
+{
+ flake.modules.homeManager.core =
+ { userName, ... }:
+ {
+ programs.home-manager.enable = true;
+ systemd.user.startServices = "sd-switch";
+
+ home = {
+ username = "${userName}";
+ homeDirectory = "/home/${userName}";
+ };
+ };
+}
diff --git a/modules/hm/core/nixpkgs.nix b/modules/hm/core/nixpkgs.nix
new file mode 100644
index 0000000..b6ca2f5
--- /dev/null
+++ b/modules/hm/core/nixpkgs.nix
@@ -0,0 +1,18 @@
+{ inputs, ... }:
+{
+ flake.modules.homeManager.core =
+ {
+ lib,
+ osConfig ? { },
+ ...
+ }:
+ {
+ nixpkgs = lib.mkIf (!(osConfig.home-manager.useGlobalPkgs or false)) {
+ config = {
+ allowUnfree = true;
+ joypixels.acceptLicense = true;
+ };
+ overlays = builtins.attrValues inputs.self.overlays;
+ };
+ };
+}
diff --git a/modules/hm/desktop/brave.nix b/modules/hm/desktop/brave.nix
new file mode 100644
index 0000000..9f68ad3
--- /dev/null
+++ b/modules/hm/desktop/brave.nix
@@ -0,0 +1,38 @@
+{
+ flake.modules.homeManager.desktop =
+ {
+ pkgs,
+ config,
+ ...
+ }:
+ let
+ configDir = "${config.xdg.configHome}/BraveSoftware/Brave-Browser";
+
+ extensionJson = ext: {
+ name = "${configDir}/External Extensions/${ext.id}.json";
+ value.text = builtins.toJSON {
+ external_update_url = "https://clients2.google.com/service/update2/crx";
+ };
+ };
+
+ extensions = [
+ { id = "nkbihfbeogaeaoehlefnkodbefgpgknn"; } # Metamask
+ { id = "gppongmhjkpfnbhagpmjfkannfbllamg"; } # Wappalyzer
+ { id = "nngceckbapebfimnlniiiahkandclblb"; } # Bitwarden
+ { id = "bfnaelmomeimhlpmgjnjophhpkkoljpa"; } # Phantom
+ { id = "eimadpbcbfnmbkopoojfekhnkhdbieeh"; } # DarkReader
+ ];
+ in
+ {
+ programs.chromium = {
+ enable = true;
+ package = pkgs.brave;
+ commandLineArgs = [
+ "--disable-features=WebRtcAllowInputVolumeAdjustment"
+ "--force-device-scale-factor=1.0"
+ ];
+ };
+
+ home.file = builtins.listToAttrs (map extensionJson extensions);
+ };
+}
diff --git a/modules/hm/desktop/discord.nix b/modules/hm/desktop/discord.nix
new file mode 100644
index 0000000..896436e
--- /dev/null
+++ b/modules/hm/desktop/discord.nix
@@ -0,0 +1,45 @@
+{
+ flake.modules.homeManager.desktop =
+ { inputs, userName, ... }:
+ {
+ imports = [
+ inputs.nixcord.homeModules.nixcord
+ ];
+
+ programs.nixcord = {
+ enable = true;
+ user = userName;
+ discord.enable = false;
+ vesktop.enable = true;
+ config = {
+ themeLinks = [
+ "https://raw.githubusercontent.com/refact0r/system24/refs/heads/main/archive/flavors/spotify-text.theme.css"
+ ];
+ frameless = true;
+ plugins = {
+ hideMedia.enable = true;
+ ignoreActivities = {
+ enable = true;
+ ignorePlaying = true;
+ ignoreWatching = true;
+ };
+ };
+ };
+ dorion = {
+ theme = "dark";
+ zoom = "1.1";
+ blur = "acrylic";
+ sysTray = true;
+ openOnStartup = true;
+ autoClearCache = true;
+ disableHardwareAccel = false;
+ rpcServer = true;
+ rpcProcessScanner = true;
+ pushToTalk = true;
+ pushToTalkKeys = [ "RControl" ];
+ desktopNotifications = true;
+ unreadBadge = true;
+ };
+ };
+ };
+}
diff --git a/modules/hm/desktop/easyeffects.nix b/modules/hm/desktop/easyeffects.nix
new file mode 100644
index 0000000..5d99671
--- /dev/null
+++ b/modules/hm/desktop/easyeffects.nix
@@ -0,0 +1,5 @@
+{
+ flake.modules.homeManager.desktop = {
+ services.easyeffects.enable = true;
+ };
+}
diff --git a/modules/hm/desktop/firefox.nix b/modules/hm/desktop/firefox.nix
new file mode 100644
index 0000000..56f3ade
--- /dev/null
+++ b/modules/hm/desktop/firefox.nix
@@ -0,0 +1,75 @@
+{
+ flake.modules.homeManager.desktop =
+ {
+ pkgs,
+ userName,
+ ...
+ }:
+ {
+ programs.firefox = {
+ enable = true;
+
+ package = pkgs.firefox.override {
+ extraPolicies = {
+ CaptivePortal = false;
+ DisableFirefoxStudies = true;
+ DisablePocket = true;
+ DisableTelemetry = true;
+ DisableFirefoxAccounts = false;
+ NoDefaultBookmarks = true;
+ OfferToSaveLogins = false;
+ OfferToSaveLoginsDefault = false;
+ PasswordManagerEnabled = false;
+ FirefoxHome = {
+ Search = true;
+ Pocket = false;
+ Snippets = false;
+ TopSites = false;
+ Highlights = false;
+ };
+ UserMessaging = {
+ ExtensionRecommendations = false;
+ SkipOnboarding = true;
+ };
+ };
+ };
+
+ profiles = {
+ ${userName} = {
+ id = 0;
+ name = "tux";
+ search = {
+ force = true;
+ default = "google";
+ };
+ settings = {
+ "general.smoothScroll" = true;
+ "extensions.activeThemeID" = "firefox-compact-dark@mozilla.org";
+ "layout.css.prefers-color-scheme.content-override" = 0;
+ "browser.compactmode.show" = true;
+ "browser.tabs.firefox-view" = false;
+ "browser.bookmarks.addedImportButton" = false;
+ "extensions.pocket.enabled" = false;
+ "browser.fullscreen.autohide" = false;
+ };
+ extraConfig = ''
+ user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true);
+ user_pref("full-screen-api.ignore-widgets", true);
+ user_pref("media.ffmpeg.vaapi.enabled", true);
+ user_pref("media.rdd-vpx.enabled", true);
+ '';
+
+ extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [
+ ublock-origin
+ facebook-container
+ metamask
+ darkreader
+ bitwarden
+ wappalyzer
+ clearurls
+ ];
+ };
+ };
+ };
+ };
+}
diff --git a/modules/hm/desktop/ghostty.nix b/modules/hm/desktop/ghostty.nix
new file mode 100644
index 0000000..d74c8b6
--- /dev/null
+++ b/modules/hm/desktop/ghostty.nix
@@ -0,0 +1,49 @@
+{
+ flake.modules.homeManager.desktop = {
+ programs.ghostty = {
+ enable = true;
+ enableZshIntegration = true;
+ systemd.enable = true;
+
+ settings = {
+ confirm-close-surface = false;
+ gtk-titlebar = false;
+ window-padding-x = 10;
+ window-padding-y = 10;
+ font-size = 12;
+ font-family = "JetBrainsMono Nerd Font";
+ theme = "poimandres";
+ custom-shader = "shaders/cursor_warp.glsl";
+ custom-shader-animation = "always";
+ };
+
+ themes = {
+ poimandres = {
+ background = "#0f0f0f";
+ foreground = "#a6accd";
+ cursor-color = "#f2eacf";
+ selection-background = "#1a1a1a";
+ selection-foreground = "#f1f1f1";
+ palette = [
+ "0=#252b37"
+ "1=#d0679d"
+ "2=#5de4c7"
+ "3=#fffac2"
+ "4=#89ddff"
+ "5=#fae4fc"
+ "6=#add7ff"
+ "7=#ffffff"
+ "8=#a6accd"
+ "9=#d0679d"
+ "10=#5de4c7"
+ "11=#fffac2"
+ "12=#add7ff"
+ "13=#89ddff"
+ "14=#fcc5e9"
+ "15=#ffffff"
+ ];
+ };
+ };
+ };
+ };
+}
diff --git a/modules/hm/desktop/hyprland.nix b/modules/hm/desktop/hyprland.nix
new file mode 100644
index 0000000..a39dcf0
--- /dev/null
+++ b/modules/hm/desktop/hyprland.nix
@@ -0,0 +1,40 @@
+{
+ flake.modules.homeManager.desktop =
+ { config, pkgs, ... }:
+ {
+ # TODO: Hyprland 0.55 switched to Lua-based configuration.
+ # HM module is updated but I'm too lazy at this point so we symlink our config instead.
+ wayland.windowManager.hyprland = {
+ enable = true;
+ package = null;
+ portalPackage = null;
+ xwayland.enable = true;
+ configType = "hyprlang";
+ systemd.variables = [ "--all" ];
+ };
+
+ home.file = {
+ ".config/hypr/config".source =
+ config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/Projects/hypr/config";
+ ".config/hypr/hyprland.lua".source =
+ config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/Projects/hypr/hyprland.lua";
+ };
+
+ home.packages = with pkgs; [
+ ags
+ awww
+ grim
+ slurp
+ hyprshot
+ wl-clipboard
+ wl-screenrec
+ (writeShellScriptBin "hypr-screenshot" ''
+ hyprshot -m region -r ppm - | satty --filename -
+ '')
+
+ (writeShellScriptBin "hypr-screenrecord" ''
+ wl-screenrec -g "$(slurp)"
+ '')
+ ];
+ };
+}
diff --git a/modules/hm/desktop/lan-mouse.nix b/modules/hm/desktop/lan-mouse.nix
new file mode 100644
index 0000000..ab17ca9
--- /dev/null
+++ b/modules/hm/desktop/lan-mouse.nix
@@ -0,0 +1,39 @@
+{ inputs, ... }:
+{
+ flake.modules.homeManager.desktop =
+ {
+ config,
+ pkgs,
+ lib,
+ ...
+ }:
+ with lib;
+ let
+ cfg = config.tnix.services.lan-mouse;
+ in
+ {
+ imports = [ inputs.lan-mouse.homeManagerModules.default ];
+
+ options.tnix.services.lan-mouse = {
+ enable = mkEnableOption "Enable Lan-Mouse";
+
+ settings = mkOption {
+ type = (pkgs.formats.toml { }).type;
+ default = { };
+ description = ''
+ TOML configuration for lan-mouse.
+ See for available options.
+ '';
+ };
+ };
+
+ config = mkIf cfg.enable {
+
+ programs.lan-mouse = {
+ enable = true;
+ systemd = true;
+ settings = cfg.settings;
+ };
+ };
+ };
+}
diff --git a/modules/hm/desktop/mango.nix b/modules/hm/desktop/mango.nix
new file mode 100644
index 0000000..a5d2c87
--- /dev/null
+++ b/modules/hm/desktop/mango.nix
@@ -0,0 +1,256 @@
+{ inputs, ... }:
+{
+ flake.modules.homeManager.desktop =
+ {
+ config,
+ pkgs,
+ lib,
+ ...
+ }:
+ with lib;
+ let
+ cfg = config.tnix.desktop.mangowm;
+ in
+ {
+ imports = [
+ inputs.mango.hmModules.mango
+ ];
+
+ options.tnix.desktop.mangowm = {
+ enable = mkEnableOption "Enable MangoWM";
+
+ monitorRule = mkOption {
+ type = with types; listOf str;
+ default = [ ];
+ };
+
+ tagRule = mkOption {
+ type = with types; listOf str;
+ default = [ ];
+ };
+ };
+
+ config = mkIf cfg.enable {
+ wayland.windowManager.mango = {
+ enable = true;
+ settings = {
+ # Monitors
+ monitorrule = cfg.monitorRule;
+
+ focus_cross_monitor = 1;
+ exchange_cross_monitor = 1;
+ drag_tile_to_tile = 1;
+
+ # Keyboard
+ repeat_rate = 25;
+ repeat_delay = 600;
+ numlockon = 0;
+ xkb_rules_layout = "us";
+
+ # Trackpad
+ disable_trackpad = 0;
+ tap_to_click = 1;
+ tap_and_drag = 1;
+ drag_lock = 1;
+ trackpad_natural_scrolling = 1;
+ disable_while_typing = 1;
+ left_handed = 0;
+ middle_button_emulation = 0;
+ swipe_min_threshold = 1;
+
+ # Mouse
+ mouse_natural_scrolling = 0;
+ mouse_accel_profile = 0;
+
+ # Theme
+ border_radius = 8;
+ no_radius_when_single = 0;
+ focused_opacity = 0.9;
+ unfocused_opacity = 0.9;
+
+ # Scroller Layout Setting
+ scroller_structs = 0;
+ scroller_default_proportion = 0.5;
+ scroller_ignore_proportion_single = 0;
+ scroller_default_proportion_single = 1.0;
+
+ # Master-Stack Layout Setting
+ new_is_master = 0;
+ default_mfact = 0.5;
+ default_nmaster = 1;
+ smartgaps = 0;
+
+ # Overview Setting
+ hotarea_size = 10;
+ enable_hotarea = 1;
+ ov_tab_mode = 0;
+ overviewgappi = 15;
+ overviewgappo = 15;
+
+ # layouts
+ tagrule = cfg.tagRule;
+
+ # Keybindings
+ mousebind = [
+ "SUPER, btn_left, moveresize, curmove"
+ "SUPER, btn_right, moveresize, curresize"
+ ];
+
+ gesturebind = [
+ "none, right, 3, viewtoleft_have_client"
+ "none, up, 3, toggleoverview"
+ "none, down, 3, toggleoverview"
+ ];
+
+ bind = [
+ # apps
+ "SUPER, Return, spawn, wezterm"
+ "SUPER, Space, spawn, vicinae toggle"
+ "SUPER, D, spawn, vesktop"
+ "SUPER, T, spawn, Telegram"
+ "SUPER, B, spawn, brave"
+ "SUPER, V, spawn, vicinae vicinae://extensions/vicinae/clipboard/history"
+ "SUPER+SHIFT, W, spawn, vicinae vicinae://extensions/sovereign/awww-switcher/wpgrid"
+
+ # WM
+ "SUPER, Q, killclient"
+ "SUPER+SHIFT, R, reload_config"
+ "SUPER+SHIFT, F, togglefullscreen"
+ "SUPER+SHIFT, Space, togglefloating"
+ "SUPER+SHIFT, Space, centerwin"
+
+ "ALT, Tab, toggleoverview"
+ "ALT+SHIFT, minus, incgaps, -1"
+ "ALT+SHIFT, equal, incgaps, 1"
+ "ALT+SHIFT, R, togglegaps"
+ "SUPER+SHIFT, P, toggleglobal"
+
+ # switch layout
+ "SUPER+SHIFT, H, setlayout, tile"
+ "SUPER+SHIFT, V, setlayout, vertical_tile"
+ "SUPER+SHIFT, S, setlayout, scroller"
+
+ # resize client
+ "SUPER+CTRL, Up, resizewin, +0, -50"
+ "SUPER+CTRL, Down, resizewin, +0, +50"
+ "SUPER+CTRL, Left, resizewin, -50, +0"
+ "SUPER+CTRL, Right, resizewin, +50, +0"
+ "SUPER+CTRL, Equal, setoption, default_mfact, 0.5"
+
+ # swap client
+ "SUPER+SHIFT, Up, exchange_client, up"
+ "SUPER+SHIFT, Down, exchange_client, down"
+ "SUPER+SHIFT, Left, exchange_client, left"
+ "SUPER+SHIFT, Right, exchange_client, right"
+
+ # switch client focus
+ "SUPER, Tab, focusstack, next"
+ "SUPER, Left, focusdir, left"
+ "SUPER, Right, focusdir, right"
+ "SUPER, Up, focusdir, up"
+ "SUPER, Down, focusdir, down"
+
+ # switch view
+ "SUPER, 1, view, 1, 1"
+ "SUPER, 2, view, 2, 1"
+ "SUPER, 3, view, 3, 1"
+ "SUPER, 4, view, 4, 1"
+ "SUPER, 5, view, 5, 1"
+
+ # move client to the tag with focus
+ "SUPER+SHIFT, 1, tagsilent, 1, 1"
+ "SUPER+SHIFT, 2, tagsilent, 2, 1"
+ "SUPER+SHIFT, 3, tagsilent, 3, 1"
+ "SUPER+SHIFT, 4, tagsilent, 4, 1"
+ "SUPER+SHIFT, 5, tagsilent, 5, 1"
+
+ # move client to the tag without focus
+ "SUPER+ALT, 1, tag, 1, 1"
+ "SUPER+ALT, 2, tag, 2, 1"
+ "SUPER+ALT, 3, tag, 3, 1"
+ "SUPER+ALT, 4, tag, 4, 1"
+ "SUPER+ALT, 5, tag, 5, 1"
+ ];
+
+ # Window effect
+ blur = 1;
+ blur_layer = 0;
+ blur_optimized = 1;
+ blur_params_num_passes = 2;
+ blur_params_radius = 5;
+ blur_params_noise = 0.02;
+ blur_params_brightness = 0.9;
+ blur_params_contrast = 0.9;
+ blur_params_saturation = 1.2;
+
+ shadows = 1;
+ layer_shadows = 0;
+ shadow_only_floating = 1;
+ shadows_size = 10;
+ shadows_blur = 15;
+ shadows_position_x = 0;
+ shadows_position_y = 0;
+ shadowscolor = "0x000000ff";
+
+ # Animation
+ animations = 1;
+ layer_animations = 1;
+ animation_type_open = "slide";
+ animation_type_close = "fade";
+ animation_fade_in = 1;
+ animation_fade_out = 1;
+ tag_animation_direction = 0;
+ zoom_initial_ratio = 0.3;
+ zoom_end_ratio = 0.8;
+ fadein_begin_opacity = 0.5;
+ fadeout_begin_opacity = 0.8;
+
+ animation_duration_move = 100;
+ animation_duration_open = 100;
+ animation_duration_close = 100;
+ animation_duration_tag = 200;
+ animation_duration_focus = 0;
+
+ animation_curve_open = "0.46, 1.0, 0.29, 1";
+ animation_curve_move = "0.46, 1.0, 0.29, 1";
+ animation_curve_tag = "0.46, 1.0, 0.29, 1";
+ animation_curve_close = "0.08, 0.92, 0, 1";
+ animation_curve_focus = "0.46, 1.0, 0.29, 1";
+ animation_curve_opafadeout = "0.5, 0.5, 0.5, 0.5";
+ animation_curve_opafadein = "0.46, 1.0, 0.29, 1";
+
+ # Appearance
+ borderpx = 0;
+ gappih = 10;
+ gappiv = 10;
+ gappoh = 10;
+ gappov = 10;
+
+ rootcolor = "0x201b14ff";
+ bordercolor = "0x444444ff";
+ focuscolor = "0xc9b890ff";
+ maximizescreencolor = "0x89aa61ff";
+ urgentcolor = "0xad401fff";
+ scratchpadcolor = "0x516c93ff";
+ globalcolor = "0xb153a7ff";
+ overlaycolor = "0x14a57cff";
+
+ # Misc
+ syncobj_enable = 1;
+
+ exec-once = [
+ "dbus-update-activation-environment --systemd --all; systemctl --user reset-failed && systemctl --user start mango-session.target"
+ "awww-daemon"
+ "dms run"
+ ];
+ };
+ };
+
+ home.packages = with pkgs; [
+ quickshell
+ dms-shell
+ dgop
+ ];
+ };
+ };
+}
diff --git a/modules/hm/desktop/mpv.nix b/modules/hm/desktop/mpv.nix
new file mode 100644
index 0000000..dd199e2
--- /dev/null
+++ b/modules/hm/desktop/mpv.nix
@@ -0,0 +1,24 @@
+{
+ flake.modules.homeManager.desktop =
+ { pkgs, ... }:
+ {
+ programs.mpv = {
+ enable = true;
+
+ scripts = (
+ with pkgs.mpvScripts;
+ [
+ modernz
+ thumbfast
+ mpris
+ mpv-image-viewer.image-positioning
+ ]
+ );
+
+ config = {
+ osc = "no";
+ border = "no";
+ };
+ };
+ };
+}
diff --git a/modules/hm/desktop/satty.nix b/modules/hm/desktop/satty.nix
new file mode 100644
index 0000000..3f7c05f
--- /dev/null
+++ b/modules/hm/desktop/satty.nix
@@ -0,0 +1,19 @@
+{
+ flake.modules.homeManager.desktop = {
+ programs.satty = {
+ enable = true;
+ settings = {
+ general = {
+ corner-roundness = 12;
+ initial-tool = "arrow";
+ early-exit = true;
+ copy-command = "wl-copy";
+ };
+
+ font = {
+ family = "JetBrainsMono NerdFont";
+ };
+ };
+ };
+ };
+}
diff --git a/modules/hm/desktop/serpantinum.nix b/modules/hm/desktop/serpantinum.nix
new file mode 100644
index 0000000..3ecd4ef
--- /dev/null
+++ b/modules/hm/desktop/serpantinum.nix
@@ -0,0 +1,68 @@
+{ inputs, ... }: {
+
+ flake.modules.nixos.desktop = {
+ imports = [
+ inputs.serpantinum.nixosModules.default
+ ];
+
+ programs.serpantinum.enable = true;
+ };
+
+ flake.modules.homeManager.desktop = { pkgs, ... }: {
+ imports = [
+ inputs.serpantinum.homeManagerModules.default
+ ];
+
+ home.packages = with pkgs; [ pulseaudioFull ];
+
+ programs.serpantinum = {
+ enable = true;
+ systemd.enable = true;
+
+ settings = {
+ wallpaperDir = "/home/tux/Wallpapers";
+
+ general = {
+ language = "en";
+ weatherUnit = "metric";
+ weatherInterval = 30;
+ };
+
+ bar = {
+ position = "top";
+ style = "modular";
+ width = 5;
+ workspaceCount = 7;
+ modules = {
+ left = [
+ "left"
+ "workspaces"
+ "sysmon"
+ "wifi"
+ ];
+ center = [ "vis" ];
+ right = [
+ "media"
+ "vol"
+ "bat"
+ "tray"
+ "timedate"
+ ];
+ };
+ };
+
+ theme = {
+ fontFamily = "JetBrains Mono SemiBold";
+ borderRadius = 12;
+ matugen = true;
+ };
+
+ notifications = {
+ dnd = false;
+ position = "top right";
+ sound = true;
+ };
+ };
+ };
+ };
+}
diff --git a/modules/hm/desktop/theme.nix b/modules/hm/desktop/theme.nix
new file mode 100644
index 0000000..edf4475
--- /dev/null
+++ b/modules/hm/desktop/theme.nix
@@ -0,0 +1,32 @@
+{
+ flake.modules.homeManager.desktop =
+ { pkgs, ... }:
+ {
+ home.pointerCursor = {
+ enable = true;
+ package = pkgs.bibata-cursors;
+ name = "Bibata-Modern-Ice";
+ size = 28;
+ };
+
+ qt = {
+ enable = true;
+ style.name = "adwaita-dark";
+ };
+
+ gtk = {
+ enable = true;
+ theme = {
+ name = "adw-gtk3-dark";
+ package = pkgs.adw-gtk3;
+ };
+ iconTheme = {
+ package = pkgs.tela-icon-theme;
+ name = "Tela-black";
+ };
+ };
+
+ # Make GTK4/libadwaita apps prefer dark too (they ignore gtk.theme).
+ dconf.settings."org/gnome/desktop/interface".color-scheme = "prefer-dark";
+ };
+}
diff --git a/modules/hm/desktop/vicinae.nix b/modules/hm/desktop/vicinae.nix
new file mode 100644
index 0000000..82da2d3
--- /dev/null
+++ b/modules/hm/desktop/vicinae.nix
@@ -0,0 +1,69 @@
+{
+ flake.modules.homeManager.desktop =
+ {
+ pkgs,
+ ...
+ }:
+ {
+ programs.vicinae = {
+ enable = true;
+ systemd = {
+ enable = true;
+ autoStart = true;
+ };
+ useLayerShell = true;
+
+ extensions = with pkgs.vicinae-extensions; [
+ # @TODO broken in upstream repo
+ # bluetooth
+ nix
+ ssh
+ awww-switcher
+ process-manager
+ pulseaudio
+ wifi-commander
+ port-killer
+ silverbullet
+ ];
+
+ settings = {
+ close_on_focus_loss = true;
+ consider_preedit = true;
+ pop_to_root_on_close = true;
+ favicon_service = "twenty";
+ search_files_in_root = true;
+ font = {
+ normal = {
+ size = 10;
+ family = "JetBrainsMono Nerd Font";
+ };
+ };
+ theme = {
+ light = {
+ name = "vicinae-light";
+ icon_theme = "default";
+ };
+ dark = {
+ name = "vicinae-dark";
+ icon_theme = "default";
+ };
+ };
+ launcher_window = {
+ opacity = 0.98;
+ };
+
+ imports = [ "/run/secrets/vicinae.json" ];
+
+ providers = {
+ "@sovereign/vicinae-extension-awww-switcher-0" = {
+ "preferences" = {
+ "transitionDuration" = "1";
+ "transitionType" = "center";
+ "wallpaperPath" = "/home/tux/Wallpapers/";
+ };
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/modules/hm/desktop/voxtype.nix b/modules/hm/desktop/voxtype.nix
new file mode 100644
index 0000000..df024a4
--- /dev/null
+++ b/modules/hm/desktop/voxtype.nix
@@ -0,0 +1,19 @@
+{ inputs, ... }: {
+ flake.modules.homeManager.desktop = { pkgs, ... }: {
+ imports = [
+ inputs.voxtype.homeManagerModules.default
+ ];
+
+ programs.voxtype = {
+ enable = true;
+ package = pkgs.voxtype.onnx-cuda;
+ engine = "parakeet";
+ model.path = "/home/tux/.local/share/voxtype/models/parakeet-tdt-0.6b-v3";
+ service.enable = true;
+ settings = {
+ hotkey.enabled = false;
+ whisper.language = "en";
+ };
+ };
+ };
+}
diff --git a/modules/hm/desktop/wezterm.nix b/modules/hm/desktop/wezterm.nix
new file mode 100644
index 0000000..4275b35
--- /dev/null
+++ b/modules/hm/desktop/wezterm.nix
@@ -0,0 +1,33 @@
+{
+ flake.modules.homeManager.desktop =
+ { pkgs, ... }:
+ {
+ programs.wezterm = {
+ enable = true;
+ package = pkgs.wezterm-git;
+ enableZshIntegration = false;
+
+ extraConfig = ''
+ local wezterm = require 'wezterm'
+ local config = {}
+
+ config.check_for_updates = false
+
+ config.window_close_confirmation = 'NeverPrompt'
+ config.color_scheme = 'Poimandres'
+ config.colors = {
+ background = "#0f0f0f"
+ }
+ config.enable_tab_bar = false
+ config.font = wezterm.font_with_fallback {
+ 'JetBrainsMono Nerd Font',
+ }
+ config.font_size = 12.0
+ config.window_background_opacity = 1
+ config.audible_bell = "Disabled"
+
+ return config
+ '';
+ };
+ };
+}
diff --git a/modules/hm/desktop/zed.nix b/modules/hm/desktop/zed.nix
new file mode 100644
index 0000000..e555af5
--- /dev/null
+++ b/modules/hm/desktop/zed.nix
@@ -0,0 +1,35 @@
+{
+ flake.modules.homeManager.desktop = {
+ programs.zed-editor = {
+ enable = true;
+ extensions = [
+ "lua"
+ "nix"
+ "C#"
+ "solidity"
+ ];
+ userKeymaps = [
+ {
+ context = "Workspace";
+ bindings = {
+ F7 = "workspace::NewTerminal";
+ };
+ }
+ ];
+ userSettings = {
+ ui_font_size = 18;
+ buffer_font_size = 18;
+ theme = {
+ mode = "dark";
+ light = "Ayu Light";
+ dark = "Ayu Dark";
+ };
+ vim_mode = true;
+ telemetry = {
+ diagnostics = false;
+ metrics = false;
+ };
+ };
+ };
+ };
+}
diff --git a/modules/hm/gaming/lutris.nix b/modules/hm/gaming/lutris.nix
new file mode 100644
index 0000000..ba36180
--- /dev/null
+++ b/modules/hm/gaming/lutris.nix
@@ -0,0 +1,8 @@
+{
+ flake.modules.homeManager.desktop = { osConfig, ... }: {
+ programs.lutris = {
+ enable = true;
+ steamPackage = osConfig.programs.steam.package;
+ };
+ };
+}
diff --git a/modules/hm/shell/bat.nix b/modules/hm/shell/bat.nix
new file mode 100644
index 0000000..68f1fc9
--- /dev/null
+++ b/modules/hm/shell/bat.nix
@@ -0,0 +1,5 @@
+{
+ flake.modules.homeManager.shell = {
+ programs.bat.enable = true;
+ };
+}
diff --git a/modules/hm/shell/btop.nix b/modules/hm/shell/btop.nix
new file mode 100644
index 0000000..8ab4ee1
--- /dev/null
+++ b/modules/hm/shell/btop.nix
@@ -0,0 +1,12 @@
+{
+ flake.modules.homeManager.shell = {
+ programs.btop = {
+ enable = true;
+ settings = {
+ theme_background = false;
+ update_ms = 1000;
+ presets = "cpu:0:default mem:0:default net:0:default";
+ };
+ };
+ };
+}
diff --git a/modules/hm/shell/fastfetch.nix b/modules/hm/shell/fastfetch.nix
new file mode 100644
index 0000000..20d6cdf
--- /dev/null
+++ b/modules/hm/shell/fastfetch.nix
@@ -0,0 +1,69 @@
+{
+ flake.modules.homeManager.shell = {
+ home.file.".config/fastfetch/config.jsonc".text = ''
+ {
+ "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
+ "logo": {
+ "type": "none",
+ },
+ "display": {
+ "separator": " ",
+ "key": {
+ "width": 18,
+ },
+ },
+ "modules": [
+ {
+ "key": " ╭───────────╮",
+ "type": "custom",
+ },
+ {
+ "key": " │ │\u001b[11D{#31} user",
+ "type": "title",
+ "format": "{1}",
+ },
+ {
+ "key": " │ │\u001b[11D{#34} hname",
+ "type": "command",
+ "text": "hostname",
+ },
+ {
+ "key": " │ │\u001b[11D{#34} distro",
+ "type": "os",
+ },
+ {
+ "key": " │ │\u001b[11D{#35} kernel",
+ "type": "kernel",
+ },
+ {
+ "key": " │ │\u001b[11D{#31} uptime",
+ "type": "uptime",
+ },
+ {
+ "key": " │ │\u001b[11D{#32} shell",
+ "type": "shell",
+ },
+ {
+ "key": " │ │\u001b[11D{#35} memory",
+ "type": "memory",
+ },
+ {
+ "key": " ├───────────┤",
+ "type": "custom",
+ },
+ {
+ "key": " │ │\u001b[11D{#39} colors",
+ "type": "colors",
+ "symbol": "circle",
+ },
+ {
+ "key": " ╰───────────╯",
+ "type": "custom",
+ },
+ ],
+ }
+ '';
+
+ programs.fastfetch.enable = true;
+ };
+}
diff --git a/modules/hm/shell/fzf.nix b/modules/hm/shell/fzf.nix
new file mode 100644
index 0000000..359d980
--- /dev/null
+++ b/modules/hm/shell/fzf.nix
@@ -0,0 +1,8 @@
+{
+ flake.modules.homeManager.shell = {
+ programs.fzf = {
+ enable = true;
+ enableZshIntegration = true;
+ };
+ };
+}
diff --git a/modules/hm/shell/git.nix b/modules/hm/shell/git.nix
new file mode 100644
index 0000000..20264f1
--- /dev/null
+++ b/modules/hm/shell/git.nix
@@ -0,0 +1,27 @@
+{
+ flake.modules.homeManager.shell =
+ {
+ userName,
+ userEmail,
+ ...
+ }:
+ {
+ programs.git = {
+ enable = true;
+ signing = {
+ key = "~/.ssh/id_ed25519.pub";
+ signByDefault = true;
+ };
+ lfs.enable = true;
+ settings = {
+ user = {
+ name = "${userName}";
+ email = "${userEmail}";
+ };
+ init.defaultBranch = "main";
+ commit.gpgSign = true;
+ gpg.format = "ssh";
+ };
+ };
+ };
+}
diff --git a/modules/hm/shell/lazygit.nix b/modules/hm/shell/lazygit.nix
new file mode 100644
index 0000000..9badc48
--- /dev/null
+++ b/modules/hm/shell/lazygit.nix
@@ -0,0 +1,160 @@
+{
+ flake.modules.homeManager.shell = {
+ programs.lazygit = {
+ enable = true;
+ settings = {
+ gui = {
+ showIcons = true;
+ nerdFontsVersion = "3";
+ };
+ customCommands = [
+ {
+ key = "";
+ description = "AI-powered conventional commit";
+ context = "global";
+ command = "git commit -m \"{{.Form.CommitMsg}}\"";
+ loadingText = "Generating commit messages...";
+ prompts = [
+ {
+ type = "menu";
+ key = "Type";
+ title = "Type of change";
+ options = [
+ {
+ name = "AI defined";
+ description = "Let AI analyze and determine the best commit type";
+ value = "ai-defined";
+ }
+ {
+ name = "build";
+ description = "Changes that affect the build system or external dependencies";
+ value = "build";
+ }
+ {
+ name = "feat";
+ description = "A new feature";
+ value = "feat";
+ }
+ {
+ name = "fix";
+ description = "A bug fix";
+ value = "fix";
+ }
+ {
+ name = "chore";
+ description = "Other changes that don't modify src or test files";
+ value = "chore";
+ }
+ {
+ name = "ci";
+ description = "Changes to CI configuration files and scripts";
+ value = "ci";
+ }
+ {
+ name = "docs";
+ description = "Documentation only changes";
+ value = "docs";
+ }
+ {
+ name = "perf";
+ description = "A code change that improves performance";
+ value = "perf";
+ }
+ {
+ name = "refactor";
+ description = "A code change that neither fixes a bug nor adds a feature";
+ value = "refactor";
+ }
+ {
+ name = "revert";
+ description = "Reverts a previous commit";
+ value = "revert";
+ }
+ {
+ name = "style";
+ description = "Changes that do not affect the meaning of the code";
+ value = "style";
+ }
+ {
+ name = "test";
+ description = "Adding missing tests or correcting existing tests";
+ value = "test";
+ }
+ ];
+ }
+ {
+ type = "menuFromCommand";
+ title = "AI Generated Commit Messages";
+ key = "CommitMsg";
+ command = ''
+ bash -lc '
+ diff=$(git diff --cached)
+ if [ -z "$diff" ]; then
+ echo "No changes in staging. Add changes first."
+ exit 1
+ fi
+
+ SELECTED_TYPE="{{.Form.Type}}"
+ COMMITS_TO_SUGGEST=4
+
+ opencode run --format json --model=google/gemini-3.5-flash-lite --variant=none "
+ You are an expert at writing Git commits. Your job is to write commit messages that follow the Conventional Commits format.
+
+ The user has selected: $SELECTED_TYPE
+
+ Your task is to:
+ 1. Analyze the code changes
+ 2. Determine the most appropriate commit type if user selected ai-defined
+ 3. Determine an appropriate scope, component, or area affected
+ 4. Decide if this is a breaking change
+ 5. Write clear, concise commit messages
+
+ Available commit types:
+ - feat: A new feature
+ - fix: A bug fix
+ - docs: Documentation only changes
+ - style: Changes that do not affect the meaning of the code
+ - refactor: A code change that neither fixes a bug nor adds a feature
+ - perf: A code change that improves performance
+ - test: Adding missing tests or correcting existing tests
+ - build: Changes that affect the build system or external dependencies
+ - ci: Changes to CI configuration files and scripts
+ - chore: Other changes that do not modify src or test files
+ - revert: Reverts a previous commit
+
+ Follow these guidelines:
+ - Structure: ():
+ - If user selected ai-defined, analyze the changes and pick the most suitable type
+ - If user selected a specific type, use that type: $SELECTED_TYPE
+ - Add scope in parentheses if applicable, for example auth, api, ui, config
+ - Use exclamation mark after type or scope for breaking changes: type(scope)!: description
+ - Use lowercase for description except proper nouns
+ - Use imperative mood: add, not added
+ - Keep description under 50 characters when possible
+ - No period at the end of subject line
+
+ IMPORTANT:
+ - Generate exactly $COMMITS_TO_SUGGEST different commit message options
+ - If user selected ai-defined, you can use different types for different options
+ - If user selected a specific type, all messages must use that type
+ - Only return commit messages, no explanations
+ - Do not use markdown code blocks
+ - One message per line
+
+ Previous commits for context:
+ $(git log --oneline -10)
+
+ Changes to analyze:
+ $(git diff --cached --stat)
+ $diff
+ " | JQ_TEXT=text jq -r "select(.type == env.JQ_TEXT) | .part.text? // empty"
+ '
+ '';
+ }
+ ];
+ }
+ ];
+ };
+ };
+ };
+}
diff --git a/modules/hm/shell/lsd.nix b/modules/hm/shell/lsd.nix
new file mode 100644
index 0000000..6d26f74
--- /dev/null
+++ b/modules/hm/shell/lsd.nix
@@ -0,0 +1,8 @@
+{
+ flake.modules.homeManager.shell = {
+ programs.lsd = {
+ enable = true;
+ enableZshIntegration = true;
+ };
+ };
+}
diff --git a/modules/hm/shell/misc.nix b/modules/hm/shell/misc.nix
new file mode 100644
index 0000000..ca35bf1
--- /dev/null
+++ b/modules/hm/shell/misc.nix
@@ -0,0 +1,17 @@
+{
+ flake.modules.homeManager.shell =
+ { pkgs, ... }:
+ {
+ home.packages = with pkgs; [
+ systemctl-tui
+ zip
+ unzip
+ pciutils
+ usbutils
+ jq
+ dig
+ lsof
+ trok
+ ];
+ };
+}
diff --git a/modules/hm/shell/neovim.nix b/modules/hm/shell/neovim.nix
new file mode 100644
index 0000000..48508bb
--- /dev/null
+++ b/modules/hm/shell/neovim.nix
@@ -0,0 +1,40 @@
+{
+ flake.modules.homeManager.shell =
+ { pkgs, ... }:
+ {
+ home.file = {
+ ".config/nvim" = {
+ recursive = true;
+ source = "${pkgs.tnvim}";
+ };
+ };
+
+ programs = {
+ neovim = {
+ enable = true;
+ defaultEditor = true;
+ };
+ };
+
+ home = {
+ packages = with pkgs; [
+ python3
+ nodejs
+ bun
+ pnpm
+ go
+ rustup
+ typescript
+ neovide
+ nil
+ statix
+ deadnix
+ alejandra
+ luarocks
+ gdu
+ gcc
+ wakatime-cli
+ ];
+ };
+ };
+}
diff --git a/modules/hm/shell/opencode.nix b/modules/hm/shell/opencode.nix
new file mode 100644
index 0000000..3c6bf9b
--- /dev/null
+++ b/modules/hm/shell/opencode.nix
@@ -0,0 +1,32 @@
+{
+ flake.modules.homeManager.shell = { pkgs, ... }: {
+ programs.opencode = {
+ enable = true;
+ package = pkgs.opencode-git;
+ tui = {
+ theme = "system";
+ };
+ settings = {
+ model = "opencode-go/kimi-k3";
+ provider = {
+ google = {
+ options = {
+ apiKey = "{file:/run/secrets/gemini-api-key}";
+ };
+ };
+ openrouter = {
+ options = {
+ apiKey = "{file:/run/secrets/openrouter-api-key}";
+ };
+ };
+ opencode-go = {
+ options = {
+ apiKey = "{file:/run/secrets/opencode-go-api-key}";
+ };
+ };
+ };
+ plugin = [ "@dietrichgebert/ponytail" ];
+ };
+ };
+ };
+}
diff --git a/modules/hm/shell/ripgrep.nix b/modules/hm/shell/ripgrep.nix
new file mode 100644
index 0000000..89297d5
--- /dev/null
+++ b/modules/hm/shell/ripgrep.nix
@@ -0,0 +1,5 @@
+{
+ flake.modules.homeManager.shell = {
+ programs.ripgrep.enable = true;
+ };
+}
diff --git a/modules/hm/shell/starship.nix b/modules/hm/shell/starship.nix
new file mode 100644
index 0000000..71ee023
--- /dev/null
+++ b/modules/hm/shell/starship.nix
@@ -0,0 +1,52 @@
+{
+ flake.modules.homeManager.shell = {
+ programs.starship = {
+ enable = true;
+ settings = {
+ format = "$os$hostname$directory$rust$golang$solidity$nodejs(bold blue)$git_branch$git_status[❯](bold yellow)[❯](bold purple)[❯](bold blue) ";
+ scan_timeout = 60;
+ add_newline = false;
+ line_break.disabled = true;
+
+ os = {
+ format = "[$symbol ]($style)";
+ style = "bold green";
+ disabled = false;
+ symbols.NixOS = "";
+ symbols.Linux = "";
+ symbols.Arch = "";
+ symbols.Ubuntu = "";
+ };
+ directory = {
+ format = "[$path]($style)[$read_only ]($read_only_style)";
+ read_only = " ";
+ style = "bold blue";
+ };
+ git_branch.format = "[$symbol$branch]($style) ";
+ hostname = {
+ ssh_only = false;
+ format = "[$ssh_symbol$hostname]($style) ";
+ style = "bold green";
+ ssh_symbol = " ";
+ disabled = false;
+ };
+ rust = {
+ format = "[$symbol]($style)";
+ symbol = " ";
+ };
+ golang = {
+ format = "[$symbol]($style)";
+ symbol = " ";
+ };
+ solidity = {
+ format = "[$symbol]($style)";
+ symbol = " ";
+ };
+ nodejs = {
+ format = "[$symbol]($style)";
+ symbol = " ";
+ };
+ };
+ };
+ };
+}
diff --git a/modules/hm/shell/superfile.nix b/modules/hm/shell/superfile.nix
new file mode 100644
index 0000000..bf55632
--- /dev/null
+++ b/modules/hm/shell/superfile.nix
@@ -0,0 +1,43 @@
+{
+ flake.modules.homeManager.shell = {
+ programs.superfile = {
+ enable = true;
+ settings = {
+ theme = "poimandres";
+ editor = "";
+ dir_editor = "";
+ auto_check_update = false;
+ cd_on_quit = false;
+ default_open_file_preview = true;
+ show_image_preview = true;
+ show_panel_footer_info = true;
+ default_directory = "~";
+ file_size_use_si = false;
+ default_sort_type = 0;
+ sort_order_reversed = false;
+ case_sensitive_sort = false;
+ shell_close_on_success = false;
+ debug = false;
+ ignore_missing_fields = false;
+ nerdfont = true;
+ transparent_background = true;
+ file_preview_width = 0;
+ code_previewer = "bat";
+ sidebar_width = 20;
+ border_top = "─";
+ border_bottom = "─";
+ border_left = "│";
+ border_right = "│";
+ border_top_left = "╭";
+ border_top_right = "╮";
+ border_bottom_left = "╰";
+ border_bottom_right = "╯";
+ border_middle_left = "├";
+ border_middle_right = "┤";
+ metadata = true;
+ zoxide_support = true;
+ enable_md5_checksum = false;
+ };
+ };
+ };
+}
diff --git a/modules/hm/shell/tmux.nix b/modules/hm/shell/tmux.nix
new file mode 100644
index 0000000..4593cdd
--- /dev/null
+++ b/modules/hm/shell/tmux.nix
@@ -0,0 +1,155 @@
+{
+ flake.modules.homeManager.shell =
+ { pkgs, ... }:
+ let
+ bg = "default";
+ fg = "default";
+ bg2 = "brightblack";
+ fg2 = "white";
+ color = c: "#{@${c}}";
+
+ indicator =
+ let
+ accent = color "indicator_color";
+ content = " ";
+ in
+ "#[reverse,fg=${accent}]#{?client_prefix,${content},}";
+
+ current_window =
+ let
+ accent = color "main_accent";
+ index = "#[reverse,fg=${accent},bg=${fg}] #I ";
+ name = "#[fg=${bg2},bg=${fg2}] #W ";
+ # flags = "#{?window_flags,#{window_flags}, }";
+ in
+ "${index}${name}";
+
+ window_status =
+ let
+ accent = color "window_color";
+ index = "#[reverse,fg=${accent},bg=${fg}] #I ";
+ name = "#[fg=${bg2},bg=${fg2}] #W ";
+ # flags = "#{?window_flags,#{window_flags}, }";
+ in
+ "${index}${name}";
+
+ battery =
+ let
+ percentage = pkgs.writeShellScript "percentage" (
+ if pkgs.stdenv.isDarwin then
+ ''
+ echo $(pmset -g batt | grep -o "[0-9]\+%" | tr '%' ' ')
+ ''
+ else
+ ''
+ path="/org/freedesktop/UPower/devices/DisplayDevice"
+ echo $(${pkgs.upower}/bin/upower -i $path | grep -o "[0-9]\+%" | tr '%' ' ')
+ ''
+ );
+ state = pkgs.writeShellScript "state" (
+ if pkgs.stdenv.isDarwin then
+ ''
+ echo $(pmset -g batt | awk '{print $4}')
+ ''
+ else
+ ''
+ path="/org/freedesktop/UPower/devices/DisplayDevice"
+ echo $(${pkgs.upower}/bin/upower -i $path | grep state | awk '{print $2}')
+ ''
+ );
+ icon = pkgs.writeShellScript "icon" ''
+ percentage=$(${percentage})
+ state=$(${state})
+ if [ "$state" == "charging" ] || [ "$state" == "fully-charged" ]; then echo ""
+ elif [ $percentage -ge 75 ]; then echo ""
+ elif [ $percentage -ge 50 ]; then echo ""
+ elif [ $percentage -ge 25 ]; then echo ""
+ elif [ $percentage -ge 0 ]; then echo ""
+ fi
+ '';
+ color = pkgs.writeShellScript "color" ''
+ percentage=$(${percentage})
+ state=$(${state})
+ if [ "$state" == "charging" ] || [ "$state" == "fully-charged" ]; then echo "green"
+ elif [ $percentage -ge 75 ]; then echo "green"
+ elif [ $percentage -ge 50 ]; then echo "${fg2}"
+ elif [ $percentage -ge 30 ]; then echo "yellow"
+ elif [ $percentage -ge 0 ]; then echo "red"
+ fi
+ '';
+ in
+ "#[fg=#(${color})]#(${icon}) #[fg=${fg}]#(${percentage})%";
+
+ pwd =
+ let
+ accent = color "main_accent";
+ icon = "#[fg=${accent}] ";
+ format = "#[fg=${fg}]#{b:pane_current_path}";
+ in
+ "${icon}${format}";
+
+ git =
+ let
+ icon = pkgs.writeShellScript "branch" ''
+ git -C "$1" branch && echo " "
+ '';
+ branch = pkgs.writeShellScript "branch" ''
+ git -C "$1" rev-parse --abbrev-ref HEAD
+ '';
+ in
+ "#[fg=magenta]#(${icon} #{pane_current_path})#(${branch} #{pane_current_path})";
+
+ separator = "#[fg=${fg}]|";
+ in
+ {
+ programs.tmux = {
+ enable = true;
+ baseIndex = 1;
+ escapeTime = 0;
+ mouse = true;
+ extraConfig = ''
+ set-option -sa terminal-overrides ",xterm*:Tc"
+ set-option -g status-position top
+ unbind r
+ bind r source-file ~/.config/tmux/tmux.conf
+
+ # remap prefix from C-b to C-Space
+ # unbind C-b
+ # set -g prefix C-Space
+ # bind C-Space send-prefix
+
+ # split panes using | and -
+ unbind '"'
+ unbind %
+ bind | split-window -h
+ bind - split-window -v
+
+ # Start windows and panes at 1, not 0
+ set -g base-index 1
+ set -g pane-base-index 1
+ set-window-option -g pane-base-index 1
+ set-option -g renumber-windows on
+
+ # switch panes using Alt-arrow without prefix
+ bind -n M-Left select-pane -L
+ bind -n M-Right select-pane -R
+ bind -n M-Up select-pane -U
+ bind -n M-Down select-pane -D
+
+ set-option -g default-terminal "screen-256color"
+ set-option -g status-right-length 100
+ set-option -g @indicator_color "yellow"
+ set-option -g @window_color "magenta"
+ set-option -g @main_accent "blue"
+ set-option -g pane-active-border fg=black
+ set-option -g pane-border-style fg=black
+ set-option -g status-style "bg=${bg} fg=${fg}"
+ set-option -g status-left "${indicator}"
+ set-option -g status-right "${git} ${pwd} ${separator} ${battery}"
+ set-option -g window-status-current-format "${current_window}"
+ set-option -g window-status-format "${window_status}"
+ set-option -g window-status-separator ""
+ '';
+ };
+ };
+}
diff --git a/modules/hm/shell/zoxide.nix b/modules/hm/shell/zoxide.nix
new file mode 100644
index 0000000..42df138
--- /dev/null
+++ b/modules/hm/shell/zoxide.nix
@@ -0,0 +1,9 @@
+{
+ flake.modules.homeManager.shell = {
+ programs.zoxide = {
+ enable = true;
+ options = [ "--cmd cd" ];
+ enableZshIntegration = true;
+ };
+ };
+}
diff --git a/modules/hm/shell/zsh.nix b/modules/hm/shell/zsh.nix
new file mode 100644
index 0000000..56172e9
--- /dev/null
+++ b/modules/hm/shell/zsh.nix
@@ -0,0 +1,31 @@
+{ lib, ... }:
+{
+ flake.modules.homeManager.shell =
+ { pkgs, ... }:
+ {
+ programs.zsh = {
+ enable = true;
+ history = {
+ append = true;
+ share = true;
+ expireDuplicatesFirst = true;
+ ignoreDups = true;
+ size = 1000000;
+ save = 1000000;
+ path = "$HOME/.local/share/zsh/.zsh_history";
+ };
+ fastSyntaxHighlighting.enable = true;
+ autosuggestion.enable = true;
+ initContent = ''
+ ${lib.getExe pkgs.fastfetch}
+ bindkey "^A" vi-beginning-of-line
+ bindkey "^E" vi-end-of-line
+ bindkey '^R' fzf-history-widget
+
+ PATH=$PATH:~/.cargo/bin:~/.local/bin
+ alias stui='systemctl-tui'
+ alias vim='nvim --clean'
+ '';
+ };
+ };
+}
diff --git a/modules/home/alacritty/default.nix b/modules/home/alacritty/default.nix
deleted file mode 100755
index e5986b1..0000000
--- a/modules/home/alacritty/default.nix
+++ /dev/null
@@ -1,69 +0,0 @@
-{...}: {
- programs.alacritty = {
- enable = true;
-
- settings = {
- font = {
- normal.family = "JetBrainsMono Nerd Font";
- bold.family = "JetBrainsMono Nerd Font";
- italic.family = "JetBrainsMono Nerd Font";
- bold_italic.family = "JetBrainsMono Nerd Font";
- size = 12;
- };
-
- window = {
- padding = {
- x = 15;
- y = 15;
- };
-
- decorations = "none";
- opacity = 1.0;
- dynamic_title = true;
- };
-
- selection.save_to_clipboard = false;
-
- general.live_config_reload = true;
-
- colors = {
- primary = {
- background = "#0f0f0f";
- foreground = "#a5b6cf";
- };
- normal = {
- black = "#1c1e27";
- blue = "#8baff1";
- cyan = "#98d3ee";
- green = "#95d3af";
- magenta = "#c79bf0";
- red = "#e26c7c";
- white = "#d0d3d8";
- yellow = "#f1d8a5";
- };
- bright = {
- black = "#151720";
- blue = "#86aaec";
- cyan = "#93cee9";
- green = "#90ceaa";
- magenta = "#c296eb";
- red = "#dd6777";
- white = "#cbced3";
- yellow = "#ecd3a0";
- };
- cursor = {
- cursor = "#a5b6cf";
- text = "CellForeground";
- };
- selection = {
- text = "CellForeground";
- background = "0x303340";
- };
- vi_mode_cursor = {
- text = "CellBackground";
- cursor = "CellForeground";
- };
- };
- };
- };
-}
diff --git a/modules/home/aria2/default.nix b/modules/home/aria2/default.nix
deleted file mode 100644
index 752dd96..0000000
--- a/modules/home/aria2/default.nix
+++ /dev/null
@@ -1,44 +0,0 @@
-{...}: {
- programs.aria2 = {
- enable = true;
- settings = {
- file-allocation = "none";
- log-level = "warn";
- max-connection-per-server = 16;
- min-split-size = "1M";
- human-readable = true;
- reuse-uri = true;
- rpc-save-upload-metadata = true;
- max-file-not-found = 0;
- remote-time = true;
- async-dns = true;
- stop = 0;
- allow-piece-length-change = true;
- optimize-concurrent-downloads = true;
- deferred-input = true;
- continue = true;
- check-integrity = true;
- realtime-chunk-checksum = true;
- piece-length = "1M";
- split = 16;
- # Seconds:
- save-session-interval = 60;
- # Caches in memory
- disk-cache = "32M";
- save-not-found = true;
- download-result = "full";
- truncate-console-readout = true;
- retry-wait = 30;
- max-tries = 15;
- enable-color = true;
- enable-http-keep-alive = true;
- enable-http-pipelining = true;
- http-accept-gzip = true;
- follow-torrent = true;
- bt-save-metadata = true;
- seed-time = 0;
- bt-load-saved-metadata = true;
- metalink-preferred-protocol = "https";
- };
- };
-}
diff --git a/modules/home/bitwarden/default.nix b/modules/home/bitwarden/default.nix
deleted file mode 100644
index ba0f39b..0000000
--- a/modules/home/bitwarden/default.nix
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- pkgs,
- email,
- ...
-}: {
- programs.rbw = {
- enable = true;
- settings = {
- base_url = "https://bw.tux.rs";
- email = "${email}";
- };
- };
-
- home.packages = with pkgs; [
- bitwarden
- ];
-}
diff --git a/modules/home/brave/default.nix b/modules/home/brave/default.nix
deleted file mode 100644
index d1127d0..0000000
--- a/modules/home/brave/default.nix
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- pkgs,
- config,
- ...
-}: let
- configDir = "${config.xdg.configHome}/BraveSoftware/Brave-Browser";
-
- extensionJson = ext: {
- name = "${configDir}/External Extensions/${ext.id}.json";
- value.text = builtins.toJSON {
- external_update_url = "https://clients2.google.com/service/update2/crx";
- };
- };
-
- extensions = [
- {id = "nkbihfbeogaeaoehlefnkodbefgpgknn";} # Metamask
- {id = "gppongmhjkpfnbhagpmjfkannfbllamg";} # Wappalyzer
- {id = "nngceckbapebfimnlniiiahkandclblb";} # Bitwarden
- {id = "bfnaelmomeimhlpmgjnjophhpkkoljpa";} # Phantom
- {id = "eimadpbcbfnmbkopoojfekhnkhdbieeh";} # DarkReader
- ];
-in {
- programs.chromium = {
- enable = true;
- package = pkgs.brave;
- commandLineArgs = [
- "--disable-features=WebRtcAllowInputVolumeAdjustment"
- "--force-device-scale-factor=1.0"
- ];
- };
-
- home.file = builtins.listToAttrs (map extensionJson extensions);
-}
diff --git a/modules/home/desktop/awesome/default.nix b/modules/home/desktop/awesome/default.nix
deleted file mode 100644
index 6f8ccc3..0000000
--- a/modules/home/desktop/awesome/default.nix
+++ /dev/null
@@ -1,8 +0,0 @@
-{pkgs, ...}: {
- home.file = {
- ".config/awesome" = {
- recursive = true;
- source = "${pkgs.tawm}";
- };
- };
-}
diff --git a/modules/home/desktop/hyprland/default.nix b/modules/home/desktop/hyprland/default.nix
deleted file mode 100644
index 15b7cf4..0000000
--- a/modules/home/desktop/hyprland/default.nix
+++ /dev/null
@@ -1,306 +0,0 @@
-{pkgs, ...}: {
- imports = [
- ./hyprlock.nix
- ];
-
- home.packages = with pkgs; [
- ags
- awww
- ];
-
- wayland.windowManager.hyprland = {
- enable = true;
- package = null;
- portalPackage = null;
- xwayland.enable = true;
- systemd.variables = ["--all"];
-
- plugins = with pkgs.hyprland-plugins; [
- # hyprexpo
- ];
-
- settings = let
- # Hyprland
- border_size = 0;
- gaps_in = 5;
- gaps_out = 10;
- gaps_ws = -10;
- rounding = 8;
- active_border_col = "rgba(90ceaaff) rgba(ecd3a0ff) 45deg";
- inactive_border_col = "rgba(86aaeccc) rgba(93cee9cc) 45deg";
-
- # Apps
- terminal = "wezterm";
- floating_terminal = "wezterm start --class wezterm-floating";
- editor = "wezterm -e nvim";
- browser = "brave --new-window";
- spotify = "wezterm start --class wezterm-floating -e spotify_player";
- filemanager = "wezterm -e superfile";
- in {
- # See https://wiki.hyprland.org/Configuring/Multi-GPU
- env = "AQ_DRM_DEVICES,/dev/dri/card2";
-
- #-- Output
- # See https://wiki.hyprland.org/Configuring/Monitors
- monitor = [
- "eDP-1,2560x1440@90,0x0,1"
- "HDMI-A-1,preferred,0x-1440,1"
- ];
-
- #-- Input: Keyboard, Mouse, Touchpad
- input = {
- sensitivity = -0.7;
- scroll_method = "2 fg";
- touchpad = {
- natural_scroll = true;
- clickfinger_behavior = false;
- };
- };
-
- device = {
- name = "asue1209:00-04f3:319f-touchpad";
- sensitivity = 0;
- };
-
- #-- General
- # See https://wiki.hyprland.org/Configuring/Variables
- general = {
- border_size = border_size;
- gaps_in = gaps_in;
- gaps_out = gaps_out;
- gaps_workspaces = gaps_ws;
- layout = "master";
- resize_on_border = true;
-
- "col.active_border" = active_border_col;
- "col.inactive_border" = inactive_border_col;
- };
-
- misc = {
- disable_hyprland_logo = true;
- force_default_wallpaper = 1;
- vrr = 0;
- };
-
- cursor = {
- no_hardware_cursors = 1;
- };
-
- ecosystem = {
- no_update_news = true;
- no_donation_nag = true;
- };
-
- #-- Decoration
- # See https://wiki.hyprland.org/Configuring/Variables/#decoration
- decoration = {
- rounding = rounding;
- active_opacity = 1.0;
- inactive_opacity = 1.0;
- fullscreen_opacity = 1.0;
-
- blur = {
- enabled = false;
- size = 4;
- passes = 3;
- new_optimizations = true;
- xray = false;
- special = true;
- brightness = 1;
- noise = 0.02;
- contrast = 1;
- popups = true;
- popups_ignorealpha = 0.6;
- };
-
- shadow = {
- enabled = false;
- };
- };
-
- #-- Animations
- # See https://wiki.hyprland.org/Configuring/Animations
- animations = {
- enabled = true;
-
- bezier = [
- "zoom, 0.05, 0.7, 0.1, 1.0"
- ];
-
- animation = [
- "windows, 1, 1, zoom, slide"
- "windowsIn, 1, 1, zoom, slide"
- "windowsOut, 1, 1, zoom, slidevert"
- "windowsMove, 1, 1, zoom, slide"
- "fade, 1, 2, zoom"
- "workspaces, 1, 1, zoom, slide"
- ];
- };
-
- #-- Layout : Master
- # See https://wiki.hyprland.org/Configuring/Master-Layout
- master = {
- allow_small_split = false;
- special_scale_factor = 0.8;
- mfact = 0.5;
- new_on_top = false;
- orientation = "left";
- smart_resizing = true;
- drop_at_cursor = true;
- };
-
- #-- Window Rules
- # See https://wiki.hyprland.org/Configuring/Window-Rules
- windowrule = [
- "float on, center on, size 800 600, match:class org.pulseaudio.pavucontrol"
-
- # Wezterm and Ghostty floating terminal
- "float on, center on, size 1200 800, match:class (com.ghostty.floating|wezterm-floating)"
-
- "float on, center on, size 900 700, match:class GalaxyBudsClient"
-
- # KDE Connect
- "float on, center on, size 900 700, match:class (org.kde.kdeconnect.sms|org.kde.kdeconnect.app)"
-
- "workspace 7 silent, match:class (discord|org.telegram.desktop)"
- ];
-
- # plugin = {
- # hyprexpo = {
- # columns = 3;
- # gap_size = 5;
- # bg_col = "rgb(111111)";
- # workspace_method = "first 1";
- # gesture_distance = 300;
- # };
- # };
-
- gesture = [
- "3, horizontal, workspace"
- "3, up, dispatcher, exec, brightnessctl s +20%"
- "3, down, dispatcher, exec, brightnessctl s +20%-"
- ];
-
- bindm = [
- "SUPER,mouse:273,resizewindow"
- "SUPER,mouse:272,movewindow"
- ];
-
- bind = [
- # apps
- "SUPER, Return, exec, ${terminal}"
- "SUPER, Space, exec, vicinae toggle"
- "SUPER, F, exec, ${filemanager}"
- "SUPER, E, exec, ${editor}"
- "SUPER, B, exec, ${browser}"
- "SUPER, G, exec, GalaxyBudsClient"
- "SUPER, D, exec, discord"
- "SUPER, T, exec, Telegram"
- "SUPER, S, exec, ${spotify}"
- "SUPER, V, exec, vicinae vicinae://extensions/vicinae/clipboard/history"
-
- "SUPER_SHIFT, Return, exec, ${floating_terminal}"
- "SUPER_SHIFT, S, exec, hypr-screenshot"
- "SUPER_SHIFT, W, exec, vicinae vicinae://extensions/sovereign/awww-switcher/wpgrid"
-
- # tpanel
- "SUPER_SHIFT, B, exec, ags toggle bar"
- "SUPER_SHIFT, C, exec, ags toggle control-center"
- "SUPER_SHIFT, R, exec, ags quit; ${pkgs.tpanel}/bin/tpanel"
-
- # hyprland
- "SUPER, Q, killactive"
- # "SUPER, grave, hyprexpo:expo, toggle"
- "SUPER_SHIFT, Q, forcekillactive"
- "SUPER_SHIFT, F, fullscreen, 0"
- "SUPER_SHIFT, Space, exec, hyprctl dispatch togglefloating; hyprctl dispatch resizeactive exact 1200 800; hyprctl dispatch centerwindow;"
- "SUPER_SHIFT, P, exec, hyprctl dispatch pin"
-
- # lock
- "SUPER_SHIFT, L, exec, hyprlock"
-
- # change focus
- "SUPER, left, movefocus, l"
- "SUPER, right, movefocus, r"
- "SUPER, up, movefocus, u"
- "SUPER, down, movefocus, d"
-
- # move active
- "SUPER_SHIFT, left, movewindow, l"
- "SUPER_SHIFT, right, movewindow, r"
- "SUPER_SHIFT, up, movewindow, u"
- "SUPER_SHIFT, down, movewindow, d"
-
- # workspaces
- "SUPER, 1, workspace, 1"
- "SUPER, 2, workspace, 2"
- "SUPER, 3, workspace, 3"
- "SUPER, 4, workspace, 4"
- "SUPER, 5, workspace, 5"
- "SUPER, 6, workspace, 6"
- "SUPER, 7, workspace, 7"
-
- # send to workspaces
- "SUPER_SHIFT, 1, movetoworkspacesilent, 1"
- "SUPER_SHIFT, 2, movetoworkspacesilent, 2"
- "SUPER_SHIFT, 3, movetoworkspacesilent, 3"
- "SUPER_SHIFT, 4, movetoworkspacesilent, 4"
- "SUPER_SHIFT, 5, movetoworkspacesilent, 5"
- "SUPER_SHIFT, 6, movetoworkspacesilent, 6"
- "SUPER_SHIFT, 7, movetoworkspacesilent, 7"
- ];
-
- workspace = [
- "1, monitor:HDMI-A-1, default:true"
- "2, monitor:HDMI-A-1"
- "3, monitor:HDMI-A-1"
- "4, monitor:HDMI-A-1"
- "5, monitor:HDMI-A-1"
- "6, monitor:eDP-1"
- "7, monitor:eDP-1"
- ];
-
- binde = [
- # resize active
- "SUPER_CTRL, left, resizeactive, -20 0"
- "SUPER_CTRL, right, resizeactive, 20 0"
- "SUPER_CTRL, up, resizeactive, 0 -20"
- "SUPER_CTRL, down, resizeactive, 0 20"
- "SUPER_CTRL, equal, exec, hyprctl dispatch layoutmsg mfact exact 0.5;"
-
- # move active (Floating Only)
- "SUPER_ALT, left, moveactive, -20 0"
- "SUPER_ALT, right, moveactive, 20 0"
- "SUPER_ALT, up, moveactive, 0 -20"
- "SUPER_ALT, down, moveactive, 0 20"
- "SUPER_ALT, equal, exec, hyprctl dispatch centerwindow;"
-
- # speaker and mic volume control
- " , XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 10%+"
- " , XF86AudioLowerVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 10%-"
- " , XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
- " , XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"
-
- # display and keyboard brightness control
- " , XF86MonBrightnessUp, exec, brightnessctl s +20%"
- " , XF86MonBrightnessDown, exec, brightnessctl s 20%-"
- " , XF86KbdBrightnessUp, exec, asusctl -n"
- " , XF86KbdBrightnessDown, exec, asusctl -p"
-
- # performance
- " , XF86Launch4, exec, asusctl profile -n"
- ];
-
- "exec-once" = [
- # load hyprland plugins
- # "hyprctl plugin load '$HYPR_PLUGIN_DIR/lib/libhyprexpo.so'"
-
- "easyeffects --w"
- "awww-daemon"
- "${pkgs.tpanel}/bin/tpanel"
- "kdeconnectd"
- "kdeconnect-indicator"
- ];
- };
- };
-}
diff --git a/modules/home/desktop/hyprland/hyprlock.nix b/modules/home/desktop/hyprland/hyprlock.nix
deleted file mode 100644
index b7c76f9..0000000
--- a/modules/home/desktop/hyprland/hyprlock.nix
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- programs.hyprlock = {
- enable = true;
- settings = {
- general = {
- hide_cursor = true;
- ignore_empty_input = true;
- };
-
- animations = {
- enabled = true;
- fade_in = {
- duration = 300;
- bezier = "easeOutQuint";
- };
- fade_out = {
- duration = 300;
- bezier = "easeOutQuint";
- };
- };
-
- background = [
- {
- path = "screenshot";
- blur_passes = 3;
- blur_size = 8;
- }
- ];
-
- input-field = [
- {
- size = "200, 50";
- position = "0, -80";
- monitor = "";
- dots_center = true;
- fade_on_empty = false;
- font_color = "rgb(202, 211, 245)";
- inner_color = "rgb(91, 96, 120)";
- outer_color = "rgb(24, 25, 38)";
- outline_thickness = 5;
- placeholder_text = "Password";
- shadow_passes = 2;
- }
- ];
- };
- };
-}
diff --git a/modules/home/desktop/hyprland/hyprpaper.nix b/modules/home/desktop/hyprland/hyprpaper.nix
deleted file mode 100644
index 4d9ddc8..0000000
--- a/modules/home/desktop/hyprland/hyprpaper.nix
+++ /dev/null
@@ -1,19 +0,0 @@
-{pkgs, ...}: {
- services.hyprpaper = {
- enable = true;
-
- settings = {
- ipc = "on";
- splash = false;
- splash_offset = 20;
-
- wallpaper = {
- monitor = "";
- path = "~/Wallpapers/new/sunset-pixel.png";
- fit_mode = "";
- };
- };
- };
-
- home.packages = with pkgs; [hyprpaper];
-}
diff --git a/modules/home/desktop/mango/default.nix b/modules/home/desktop/mango/default.nix
deleted file mode 100644
index d86ec77..0000000
--- a/modules/home/desktop/mango/default.nix
+++ /dev/null
@@ -1,225 +0,0 @@
-{inputs, ...}: {
- imports = [
- inputs.mango.hmModules.mango
- ];
-
- wayland.windowManager.mango = {
- enable = true;
- settings = {
- # Monitors
- monitorrule = [
- "name:eDP-1, width:2560, height:1440, refresh:165, x:0, y:10, vrr:1"
- "name:HDMI-A-1, width:2560, height:1440, refresh:100, x:0, y:-1440, vrr:1"
- ];
-
- # Keyboard
- repeat_rate = 25;
- repeat_delay = 600;
- numlockon = 0;
- xkb_rules_layout = "us";
-
- # Trackpad
- disable_trackpad = 0;
- tap_to_click = 1;
- tap_and_drag = 1;
- drag_lock = 1;
- trackpad_natural_scrolling = 1;
- disable_while_typing = 1;
- left_handed = 0;
- middle_button_emulation = 0;
- swipe_min_threshold = 1;
-
- # Mouse
- mouse_natural_scrolling = 0;
- accel_profile = 0;
-
- # Theme
- border_radius = 8;
- no_radius_when_single = 0;
- focused_opacity = 1.0;
- unfocused_opacity = 1.0;
-
- # Scroller Layout Setting
- scroller_structs = 0;
- scroller_default_proportion = 0.5;
- scroller_ignore_proportion_single = 0;
- scroller_default_proportion_single = 1.0;
-
- # Master-Stack Layout Setting
- new_is_master = 0;
- default_mfact = 0.5;
- default_nmaster = 1;
- smartgaps = 0;
-
- # Overview Setting
- hotarea_size = 10;
- enable_hotarea = 1;
- ov_tab_mode = 0;
- overviewgappi = 15;
- overviewgappo = 15;
-
- # layouts
- tagrule = [
- "id:1, layout_name:tile"
- "id:2, layout_name:tile"
- "id:3, layout_name:tile"
- "id:4, layout_name:tile"
- "id:5, layout_name:tile"
- "id:6, layout_name:scroller"
- ];
-
- # Keybindings
- mousebind = [
- "SUPER, btn_left, moveresize, curmove"
- "SUPER, btn_right, moveresize, curresize"
- ];
-
- gesturebind = [
- "none, right, 3, viewtoleft_have_client"
- "none, up, 3, toggleoverview"
- "none, down, 3, toggleoverview"
- ];
-
- bind = [
- # apps
- "SUPER, Return, spawn, wezterm"
- "SUPER, Space, spawn, vicinae toggle"
- "SUPER, B, spawn, brave"
- "SUPER, V, spawn, vicinae vicinae://extensions/vicinae/clipboard/history"
- "SUPER+SHIFT, W, spawn, vicinae vicinae://extensions/sovereign/awww-switcher/wpgrid"
-
- # WM
- "SUPER, Q, killclient"
- "SUPER+SHIFT, R, reload_config"
- "SUPER+SHIFT, F, togglefullscreen"
- "SUPER+SHIFT, Space, togglefloating"
-
- "ALT, Tab, toggleoverview"
- "ALT+SHIFT, minus, incgaps, -1"
- "ALT+SHIFT, equal, incgaps, 1"
- "ALT+SHIFT, R, togglegaps"
-
- # switch layout
- "SUPER+SHIFT, H, setlayout, tile"
- "SUPER+SHIFT, V, setlayout, vertical_tile"
- "SUPER+SHIFT, S, setlayout, scroller"
-
- # resize client
- "SUPER+CTRL, Up, resizewin, +0, -50"
- "SUPER+CTRL, Down, resizewin, +0, +50"
- "SUPER+CTRL, Left, resizewin, -50, +0"
- "SUPER+CTRL, Right, resizewin, +50, +0"
-
- # swap client
- "SUPER+SHIFT, Up, exchange_client, up"
- "SUPER+SHIFT, Down, exchange_client, down"
- "SUPER+SHIFT, Left, exchange_client, left"
- "SUPER+SHIFT, Right, exchange_client, right"
-
- # switch client focus
- "SUPER, Tab, focusstack, next"
- "SUPER, Left, focusdir, left"
- "SUPER, Right, focusdir, right"
- "SUPER, Up, focusdir, up"
- "SUPER, Down, focusdir, down"
-
- # switch view
- "SUPER, 1, view, 1, 0"
- "SUPER, 2, view, 2, 0"
- "SUPER, 3, view, 3, 0"
- "SUPER, 4, view, 4, 0"
- "SUPER, 5, view, 5, 0"
- "SUPER, 6, view, 6, 0"
-
- # move client to the tag with focus
- "SUPER+SHIFT, 1, tagsilent, 1, 0"
- "SUPER+SHIFT, 2, tagsilent, 2, 0"
- "SUPER+SHIFT, 3, tagsilent, 3, 0"
- "SUPER+SHIFT, 4, tagsilent, 4, 0"
- "SUPER+SHIFT, 5, tagsilent, 5, 0"
- "SUPER+SHIFT, 6, tagsilent, 6, 0"
-
- # move client to the tag without focus
- "SUPER+ALT, 1, tag, 1, 0"
- "SUPER+ALT, 2, tag, 2, 0"
- "SUPER+ALT, 3, tag, 3, 0"
- "SUPER+ALT, 4, tag, 4, 0"
- "SUPER+ALT, 5, tag, 5, 0"
- "SUPER+ALT, 6, tag, 6, 0"
- ];
-
- # Window effect
- blur = 0;
- blur_layer = 0;
- blur_optimized = 1;
- blur_params_num_passes = 2;
- blur_params_radius = 5;
- blur_params_noise = 0.02;
- blur_params_brightness = 0.9;
- blur_params_contrast = 0.9;
- blur_params_saturation = 1.2;
-
- shadows = 0;
- layer_shadows = 0;
- shadow_only_floating = 1;
- shadows_size = 10;
- shadows_blur = 15;
- shadows_position_x = 0;
- shadows_position_y = 0;
- shadowscolor = "0x000000ff";
-
- # Animation
- animations = 1;
- layer_animations = 1;
- animation_type_open = "slide";
- animation_type_close = "fade";
- animation_fade_in = 1;
- animation_fade_out = 1;
- tag_animation_direction = 1;
- zoom_initial_ratio = 0.3;
- zoom_end_ratio = 0.8;
- fadein_begin_opacity = 0.5;
- fadeout_begin_opacity = 0.8;
-
- animation_duration_move = 100;
- animation_duration_open = 100;
- animation_duration_close = 100;
- animation_duration_tag = 200;
- animation_duration_focus = 0;
-
- animation_curve_open = "0.46, 1.0, 0.29, 1";
- animation_curve_move = "0.46, 1.0, 0.29, 1";
- animation_curve_tag = "0.46, 1.0, 0.29, 1";
- animation_curve_close = "0.08, 0.92, 0, 1";
- animation_curve_focus = "0.46, 1.0, 0.29, 1";
- animation_curve_opafadeout = "0.5, 0.5, 0.5, 0.5";
- animation_curve_opafadein = "0.46, 1.0, 0.29, 1";
-
- # Appearance
- borderpx = 0;
- gappih = 10;
- gappiv = 10;
- gappoh = 10;
- gappov = 10;
-
- rootcolor = "0x201b14ff";
- bordercolor = "0x444444ff";
- focuscolor = "0xc9b890ff";
- maximizescreencolor = "0x89aa61ff";
- urgentcolor = "0xad401fff";
- scratchpadcolor = "0x516c93ff";
- globalcolor = "0xb153a7ff";
- overlaycolor = "0x14a57cff";
-
- # Misc
- syncobj_enable = 1;
-
- exec-once = [
- "awww-daemon"
- "kdeconnectd"
- "kdeconnect-indicator"
- "dbus-update-activation-environment --systemd --all; systemctl --user reset-failed && systemctl --user start mango-session.target"
- ];
- };
- };
-}
diff --git a/modules/home/desktop/rofi/default.nix b/modules/home/desktop/rofi/default.nix
deleted file mode 100644
index 8d72dfb..0000000
--- a/modules/home/desktop/rofi/default.nix
+++ /dev/null
@@ -1,317 +0,0 @@
-{config, ...}: {
- programs.rofi = {
- enable = true;
- extraConfig = {
- terminal = "alacritty";
-
- modes = "combi,keys";
-
- display-window = "window";
- display-drun = "run";
- display-windowcd = "windowcd";
- display-run = "run";
- display-ssh = "ssh";
- display-combi = "combi";
- display-keys = "keys";
- display-filebrowser = "filebrowser";
-
- combi-modes = "window,drun";
- combi-hide-mode-prefix = false;
- combi-display-format = "{mode} {text}";
-
- window-format = "[{w=-1}] {c=-1} {t=-1}";
- window-thumbnail = false;
-
- drun-url-launcher = "xdg-open";
- drun-match-fields = "name,generic,exec,categories,keywords";
- drun-display-format = "{name}[ ({generic})][ {exec}]";
- drun-show-actions = true;
-
- run-command = "{cmd}";
- run-list-command = "";
- run-shell-command = "{terminal} -e {cmd}";
-
- matching = "normal";
- font = "JetBrains Mono 11";
- show-icons = true;
- scroll-method = 0;
- cycle = false;
- fixed-num-lines = false;
- };
- theme = let
- inherit (config.lib.formats.rasi) mkLiteral;
- in {
- "*" = {
- font = "JetBrains Mono 11";
-
- black = mkLiteral "#1d1f21";
- white = mkLiteral "#c5c8c6";
- red = mkLiteral "#cc6666";
- orange = mkLiteral "#de935f";
- yellow = mkLiteral "#f0c674";
- green = mkLiteral "#7cb36b";
- cyan = mkLiteral "#78bab9";
- blue = mkLiteral "#81a2be";
- magenta = mkLiteral "#b294bb";
-
- black-bright = mkLiteral "#3c4044";
- white-bright = mkLiteral "#eaeaea";
- red-bright = mkLiteral "#d54e53";
- orange-bright = mkLiteral "#e78c45";
- yellow-bright = mkLiteral "#e7c547";
- green-bright = mkLiteral "#71c464";
- cyan-bright = mkLiteral "#6acdcc";
- blue-bright = mkLiteral "#7aa6da";
- magenta-bright = mkLiteral "#c397d8";
-
- black-66 = mkLiteral "#131415";
- white-66 = mkLiteral "#828382";
- red-66 = mkLiteral "#864343";
- orange-66 = mkLiteral "#92613e";
- yellow-66 = mkLiteral "#9e824c";
- green-66 = mkLiteral "#517646";
- cyan-66 = mkLiteral "#4f7a7a";
- blue-66 = mkLiteral "#556a7d";
- magenta-66 = mkLiteral "#75617b";
-
- black-33 = mkLiteral "#090a0a";
- white-33 = mkLiteral "#414141";
- red-33 = mkLiteral "#432121";
- orange-33 = mkLiteral "#49301f";
- yellow-33 = mkLiteral "#4f4126";
- green-33 = mkLiteral "#283b23";
- cyan-33 = mkLiteral "#273d3d";
- blue-33 = mkLiteral "#2a353e";
- magenta-33 = mkLiteral "#3a303d";
-
- common-background = mkLiteral "@black";
- common-background-bright = mkLiteral "@black-bright";
- common-background-66 = " @black-66";
- common-foreground = mkLiteral "@white";
- common-foreground-bright = mkLiteral "@white-bright";
- common-foreground-66 = mkLiteral "@white-66";
- common-primary = mkLiteral "@yellow";
- common-primary-bright = mkLiteral "@yellow-bright";
- common-primary-66 = mkLiteral "@yellow-66";
- common-primary-33 = mkLiteral "@yellow-33";
- common-secondary = mkLiteral "@blue";
- common-secondary-bright = mkLiteral "@blue-bright";
- common-secondary-66 = mkLiteral "@blue-66";
- common-secondary-33 = mkLiteral "@blue-33";
- common-urgent = mkLiteral "@red";
- common-urgent-bright = mkLiteral "@red-bright";
- common-urgent-66 = mkLiteral "@red-66";
- common-urgent-33 = mkLiteral "@red-33";
-
- background-color = mkLiteral "transparent";
-
- normal-normal-background = mkLiteral "transparent";
- normal-normal-foreground = mkLiteral "@common-foreground";
- normal-normal-border-color = mkLiteral "transparent";
- normal-active-background = mkLiteral "transparent";
- normal-active-foreground = mkLiteral "@common-secondary-bright";
- normal-active-border-color = mkLiteral "transparent";
- normal-urgent-background = mkLiteral "transparent";
- normal-urgent-foreground = mkLiteral "@common-urgent-bright";
- normal-urgent-border-color = mkLiteral "transparent";
-
- selected-normal-background = mkLiteral "@common-primary-33";
- selected-normal-foreground = mkLiteral "@common-primary-bright";
- selected-normal-border-color = mkLiteral "@common-primary-66";
- selected-active-background = mkLiteral "@common-secondary-33";
- selected-active-foreground = mkLiteral "@common-secondary-bright";
- selected-active-border-color = mkLiteral "@common-secondary-66";
- selected-urgent-background = mkLiteral "@common-urgent-33";
- selected-urgent-foreground = mkLiteral "@common-urgent-bright";
- selected-urgent-border-color = mkLiteral "@common-urgent-66";
-
- alternate-normal-background = mkLiteral "@normal-normal-background";
- alternate-normal-foreground = mkLiteral "@normal-normal-foreground";
- alternate-normal-border-color = mkLiteral "@normal-normal-border-color";
- alternate-active-background = mkLiteral "@normal-active-background";
- alternate-active-foreground = mkLiteral "@normal-active-foreground";
- alternate-active-border-color = mkLiteral "@normal-active-border-color";
- alternate-urgent-background = mkLiteral "@normal-urgent-background";
- alternate-urgent-foreground = mkLiteral "@normal-urgent-foreground";
- alternate-urgent-border-color = mkLiteral "@normal-urgent-border-color";
- };
-
- "window" = {
- background-color = mkLiteral "#1d1f21e6"; #// @black + 0.85 alpha
- border = 3;
- border-color = mkLiteral "@black-bright";
- border-radius = 16;
- width = 1024;
- height = 460;
- };
-
- "mainbox" = {
- padding = 16;
- spacing = 16;
- };
-
- "inputbar" = {
- background-color = mkLiteral "#333537"; #// @black-110
- border = 1;
- border-color = mkLiteral "#606263"; #// @black-130
- border-radius = 8;
- padding = mkLiteral "12 16";
- spacing = 0;
- text-color = mkLiteral "@common-foreground";
- children = mkLiteral "[ entry, case-indicator, num-filtered-rows, textbox-num-sep, num-rows ]";
- };
-
- "prompt" = {
- background-color = mkLiteral "transparent";
- text-color = mkLiteral "@common-foreground-bright";
- spacing = 0;
- text-transform = mkLiteral "bold";
- };
-
- "textbox-prompt-colon" = {
- background-color = mkLiteral "transparent";
- text-color = mkLiteral "inherit";
- margin = mkLiteral "0 0.3em 0 0";
- expand = false;
- str = "=";
- };
-
- "entry" = {
- background-color = mkLiteral "transparent";
- text-color = mkLiteral "@common-foreground-bright";
- cursor = "text";
- placeholder-color = mkLiteral "@common-foreground-66";
- placeholder = "Type to filter";
- };
-
- "case-indicator" = {
- background-color = mkLiteral "transparent";
- text-color = mkLiteral "inherit";
- };
-
- "num-filtered-rows" = {
- background-color = mkLiteral "transparent";
- text-color = mkLiteral "inherit";
- expand = false;
- };
-
- "textbox-num-sep" = {
- background-color = mkLiteral "transparent";
- text-color = mkLiteral "inherit";
- expand = false;
- str = "/";
- };
-
- "num-rows" = {
- background-color = mkLiteral "transparent";
- text-color = mkLiteral "inherit";
- expand = false;
- };
-
- "message" = {
- background-color = mkLiteral "@cyan-33";
- border = 1;
- border-color = mkLiteral "@cyan-66";
- border-radius = 8;
- padding = 16;
- };
-
- "textbox" = {
- background-color = mkLiteral "transparent";
- text-color = mkLiteral "@cyan-bright";
- };
-
- "listview" = {
- dynamic = true;
- scrollbar = true;
- spacing = 0;
- };
-
- "scrollbar" = {
- background-color = mkLiteral "transparent";
- padding = 0;
- margin = mkLiteral "0 0 0 4";
- handle-width = 8;
- border = 0;
- handle-color = mkLiteral "#626463"; #// @white-50
- };
-
- "element" = {
- border = 1;
- border-radius = 8;
- padding = mkLiteral "6 12";
- margin = mkLiteral "1 0";
- spacing = 12;
- children = mkLiteral "[ element-icon, element-text ]";
- };
-
- "element-icon" = {
- background-color = mkLiteral "transparent";
- text-color = mkLiteral "inherit";
- size = mkLiteral "1.0em";
- cursor = mkLiteral "inherit";
- };
-
- "element-text" = {
- background-color = mkLiteral "transparent";
- text-color = mkLiteral "inherit";
- highlight = mkLiteral "inherit";
- cursor = mkLiteral "inherit";
- };
-
- "element normal.normal" = {
- background-color = mkLiteral "@normal-normal-background";
- text-color = mkLiteral "@normal-normal-foreground";
- border-color = mkLiteral "@normal-normal-border-color";
- };
-
- "element normal.urgent" = {
- background-color = mkLiteral "@normal-urgent-background";
- text-color = mkLiteral "@normal-urgent-foreground";
- border-color = mkLiteral "@normal-urgent-border-color";
- };
-
- "element normal.active" = {
- background-color = mkLiteral "@normal-active-background";
- text-color = mkLiteral "@normal-active-foreground";
- border-color = mkLiteral "@normal-active-border-color";
- };
-
- "element selected.normal" = {
- background-color = mkLiteral "@selected-normal-background";
- text-color = mkLiteral "@selected-normal-foreground";
- border-color = mkLiteral "@selected-normal-border-color";
- };
-
- "element selected.urgent" = {
- background-color = mkLiteral "@selected-urgent-background";
- text-color = mkLiteral "@selected-urgent-foreground";
- border-color = mkLiteral "@selected-urgent-border-color";
- };
-
- "element selected.active" = {
- background-color = mkLiteral "@selected-active-background";
- text-color = mkLiteral "@selected-active-foreground";
- border-color = mkLiteral "@selected-active-border-color";
- };
-
- "element alternate.normal" = {
- background-color = mkLiteral "@alternate-normal-background";
- text-color = mkLiteral "@alternate-normal-foreground";
- border-color = mkLiteral "@alternate-normal-border-color";
- };
-
- "element alternate.urgent" = {
- background-color = mkLiteral "@alternate-urgent-background";
- text-color = mkLiteral "@alternate-urgent-foreground";
- border-color = mkLiteral "@alternate-urgent-border-color";
- };
-
- "element alternate.active" = {
- background-color = mkLiteral "@alternate-active-background";
- text-color = mkLiteral "@alternate-active-foreground";
- border-color = mkLiteral "@alternate-active-border-color";
- };
- };
- };
-}
diff --git a/modules/home/desktop/utils/default.nix b/modules/home/desktop/utils/default.nix
deleted file mode 100644
index dc2c39a..0000000
--- a/modules/home/desktop/utils/default.nix
+++ /dev/null
@@ -1,32 +0,0 @@
-{pkgs, ...}: {
- programs.satty = {
- enable = true;
- settings = {
- general = {
- corner-roundness = 12;
- initial-tool = "arrow";
- early-exit = true;
- copy-command = "wl-copy";
- };
-
- font = {
- family = "JetBrainsMono NerdFont";
- };
- };
- };
-
- home.packages = with pkgs; [
- grim
- slurp
- hyprshot
- wl-clipboard
- wl-screenrec
- (writeShellScriptBin "hypr-screenshot" ''
- hyprshot -m region -r ppm - | satty --filename -
- '')
-
- (writeShellScriptBin "hypr-screenrecord" ''
- wl-screenrec -g "$(slurp)"
- '')
- ];
-}
diff --git a/modules/home/desktop/vicinae/default.nix b/modules/home/desktop/vicinae/default.nix
deleted file mode 100644
index 6dab11d..0000000
--- a/modules/home/desktop/vicinae/default.nix
+++ /dev/null
@@ -1,70 +0,0 @@
-{
- pkgs,
- config,
- ...
-}: {
- programs.vicinae = {
- enable = true;
- systemd = {
- enable = true;
- autoStart = true;
- };
- useLayerShell = true;
-
- extensions = with pkgs.vicinae-extensions; [
- bluetooth
- nix
- ssh
- awww-switcher
- process-manager
- pulseaudio
- wifi-commander
- port-killer
- silverbullet
- ];
-
- settings = {
- close_on_focus_loss = false;
- consider_preedit = true;
- pop_to_root_on_close = true;
- favicon_service = "twenty";
- search_files_in_root = true;
- font = {
- normal = {
- size = 10;
- family = "JetBrainsMono Nerd Font";
- };
- };
- theme = {
- light = {
- name = "vicinae-light";
- icon_theme = "default";
- };
- dark = {
- name = "vicinae-dark";
- icon_theme = "default";
- };
- };
- launcher_window = {
- opacity = 0.98;
- };
-
- imports = ["/run/secrets/vicinae.json"];
-
- providers = {
- "@samlinville/store.raycast.tailscale" = {
- "preferences" = {
- "tailscalePath" = "${pkgs.tailscale}/bin/tailscale";
- };
- };
- "@sovereign/vicinae-extension-awww-switcher-0" = {
- "preferences" = {
- "transitionDuration" = "1";
- "transitionType" = "center";
- "wallpaperPath" = "/home/tux/Wallpapers/";
- };
- };
- };
- };
- };
-}
diff --git a/modules/home/desktop/waybar/default.nix b/modules/home/desktop/waybar/default.nix
deleted file mode 100644
index 49b760e..0000000
--- a/modules/home/desktop/waybar/default.nix
+++ /dev/null
@@ -1,338 +0,0 @@
-{...}: {
- programs = {
- waybar = {
- enable = true;
- settings = {
- mainBar = {
- position = "top";
- layer = "top";
- height = 35;
- margin-top = 0;
- margin-bottom = 0;
- margin-left = 0;
- margin-right = 0;
- exclusive = true;
- passthrough = false;
-
- modules-left = [
- "custom/l_end"
- "cpu"
- "memory"
- "custom/r_end"
- ];
- modules-center = [
- "custom/l_end"
- "hyprland/workspaces"
- "custom/r_end"
- ];
- modules-right = [
- "custom/l_end"
- "network"
- "bluetooth"
- "battery"
- "tray"
- "custom/r_end"
- ];
-
- "hyprland/workspaces" = {
- "disable-scroll" = true;
- "all-outputs" = true;
- "active-only" = false;
- "on-click" = "activate";
- "persistent-workspaces" = {
- "1" = [];
- "2" = [];
- "3" = [];
- "4" = [];
- };
- };
-
- "network" = {
- "tooltip" = true;
- "format-wifi" = " {bandwidthDownBytes} {bandwidthUpBytes}";
- "format-ethernet" = " {bandwidthDownBytes} {bandwidthUpBytes}";
- "tooltip-format" = "Network= {essid}\nSignal strength= {signaldBm}dBm ({signalStrength}%)\nFrequency= {frequency}MHz\nInterface= {ifname}\nIP= {ipaddr}/{cidr}\nGateway= {gwaddr}\nNetmask= {netmask}";
- "format-linked" = " {ifname} (No IP)";
- "format-disconnected" = " ";
- "tooltip-format-disconnected" = "Disconnected";
- "interval" = 2;
- };
-
- "battery" = {
- "states" = {
- "good" = 95;
- "warning" = 30;
- "critical" = 20;
- };
- "format" = "{icon} {capacity}%";
- "format-charging" = " {capacity}%";
- "format-plugged" = " {capacity}%";
- "format-alt" = "{time} {icon}";
- "format-icons" = ["" "" "" "" "" "" "" "" "" "" ""];
- };
-
- "bluetooth" = {
- "format" = "";
- "format-disabled" = "";
- "format-connected" = " {num_connections}";
- "format-connected-battery" = "{icon} {num_connections}";
- # "format-connected-battery"= "{icon} {device_alias}-{device_battery_percentage}%";
- "format-icons" = ["" "" "" "" "" "" "" "" "" "" ""];
- # "format-device-preference"= [ "device1"; "device2" ]; // preference list deciding the displayed device If this config option is not defined or none of the devices in the list are connected; it will fall back to showing the last connected device.
- "tooltip-format" = "{controller_alias}\n{num_connections} connected";
- "tooltip-format-connected" = "{controller_alias}\n{num_connections} connected\n\n{device_enumerate}";
- "tooltip-format-enumerate-connected" = "{device_alias}";
- "tooltip-format-enumerate-connected-battery" = "{device_alias}\t{icon} {device_battery_percentage}%";
- };
-
- "memory" = {
- "states" = {
- "c" = 90; # critical
- "h" = 60; # high
- "m" = 30; # medium
- };
- "interval" = 30;
- "format" = " {used}GB";
- "format-m" = " {used}GB";
- "format-h" = " {used}GB";
- "format-c" = " {used}GB";
- "format-alt" = " {percentage}%";
- "max-length" = 10;
- "tooltip" = true;
- "tooltip-format" = " {percentage}%\n {used=0.1f}GB/{total=0.1f}GB";
- };
-
- "cpu" = {
- "interval" = 10;
- "format" = " {usage}%";
- "format-alt" = "{icon0}{icon1}{icon2}{icon3}";
- "format-icons" = ["▁" "▂" "▃" "▄" "▅" "▆" "▇" "█"];
- };
-
- "tray" = {
- "icon-size" = 14;
- "spacing" = 5;
- };
-
- "custom/l_end" = {
- "format" = " ";
- "interval" = "once";
- "tooltip" = false;
- };
-
- "custom/r_end" = {
- "format" = " ";
- "interval" = "once";
- "tooltip" = false;
- };
-
- "custom/sl_end" = {
- "format" = " ";
- "interval" = "once";
- "tooltip" = false;
- };
-
- "custom/sr_end" = {
- "format" = " ";
- "interval" = "once";
- "tooltip" = false;
- };
-
- "custom/rl_end" = {
- "format" = " ";
- "interval" = "once";
- "tooltip" = false;
- };
-
- "custom/rr_end" = {
- "format" = " ";
- "interval" = "once";
- "tooltip" = false;
- };
-
- "custom/padd" = {
- "format" = " ";
- "interval" = "once";
- "tooltip" = false;
- };
- };
- };
- style = let
- bar_bg = "rgba(23, 28, 34, 0.95)";
- main_bg = "#101419";
- main_fg = "#93cee9";
-
- wb_act_bg = "#90ceaa";
- wb_act_fg = "#1f2328";
-
- wb_hvr_bg = "#90ceaa";
- wb_hvr_fg = "#1f2328";
- in ''
- * {
- border: none;
- border-radius: 0px;
- font-family: "JetBrainsMono Nerd Font";
- font-weight: bold;
- font-size: 20px;
- min-height: 10px;
- }
-
- window#waybar {
- background: ${bar_bg};
- }
-
- tooltip {
- background: ${main_bg};
- color: ${main_fg};
- border-radius: 7px;
- border-width: 0px;
- }
-
- #workspaces button {
- box-shadow: none;
- text-shadow: none;
- padding: 0px;
- border-radius: 9px;
- margin-top: 3px;
- margin-bottom: 3px;
- margin-left: 0px;
- padding-left: 3px;
- padding-right: 3px;
- margin-right: 0px;
- color: ${main_fg};
- animation: ws_normal 20s ease-in-out 1;
- }
-
- #workspaces button.active {
- background: ${wb_act_bg};
- color: ${wb_act_fg};
- margin-left: 3px;
- padding-left: 12px;
- padding-right: 12px;
- margin-right: 3px;
- animation: ws_active 20s ease-in-out 1;
- transition: all 0.4s cubic-bezier(.55,-0.68,.48,1.682);
- }
-
- #workspaces button:hover {
- background: ${wb_hvr_bg};
- color: ${wb_hvr_fg};
- animation: ws_hover 20s ease-in-out 1;
- transition: all 0.3s cubic-bezier(.55,-0.68,.48,1.682);
- }
-
- #taskbar button {
- box-shadow: none;
- text-shadow: none;
- padding: 0px;
- border-radius: 9px;
- margin-top: 3px;
- margin-bottom: 3px;
- margin-left: 0px;
- padding-left: 3px;
- padding-right: 3px;
- margin-right: 0px;
- color: @wb-color;
- animation: tb_normal 20s ease-in-out 1;
- }
-
- #taskbar button.active {
- background: ${wb_act_bg};
- color: @wb-act-color;
- margin-left: 3px;
- padding-left: 12px;
- padding-right: 12px;
- margin-right: 3px;
- animation: tb_active 20s ease-in-out 1;
- transition: all 0.4s cubic-bezier(.55,-0.68,.48,1.682);
- }
-
- #taskbar button:hover {
- background: ${wb_hvr_bg};
- color: @wb-hvr-color;
- animation: tb_hover 20s ease-in-out 1;
- transition: all 0.3s cubic-bezier(.55,-0.68,.48,1.682);
- }
-
- #backlight,
- #battery,
- #bluetooth,
- #custom-cliphist,
- #clock,
- #custom-cpuinfo,
- #cpu,
- #custom-gpuinfo,
- #idle_inhibitor,
- #language,
- #memory,
- #custom-mode,
- #mpris,
- #network,
- #custom-power,
- #pulseaudio,
- #custom-spotify,
- #taskbar,
- #tray,
- #custom-updates,
- #custom-wallchange,
- #custom-wbar,
- #window,
- #workspaces,
- #custom-l_end,
- #custom-r_end,
- #custom-sl_end,
- #custom-sr_end,
- #custom-rl_end,
- #custom-rr_end {
- color: ${main_fg};
- background: ${main_bg};
- opacity: 1;
- margin: 4px 0px 4px 0px;
- padding-left: 4px;
- padding-right: 4px;
- }
-
- #workspaces,
- #taskbar {
- padding: 0px;
- }
-
- #custom-r_end {
- border-radius: 0px 21px 21px 0px;
- margin-right: 9px;
- padding-right: 3px;
- }
-
- #custom-l_end {
- border-radius: 21px 0px 0px 21px;
- margin-left: 9px;
- padding-left: 3px;
- }
-
- #custom-sr_end {
- border-radius: 0px;
- margin-right: 9px;
- padding-right: 3px;
- }
-
- #custom-sl_end {
- border-radius: 0px;
- margin-left: 9px;
- padding-left: 3px;
- }
-
- #custom-rr_end {
- border-radius: 0px 7px 7px 0px;
- margin-right: 9px;
- padding-right: 3px;
- }
-
- #custom-rl_end {
- border-radius: 7px 0px 0px 7px;
- margin-left: 9px;
- padding-left: 3px;
- }
- '';
- };
- };
-}
diff --git a/modules/home/discord/default.nix b/modules/home/discord/default.nix
deleted file mode 100644
index bba4060..0000000
--- a/modules/home/discord/default.nix
+++ /dev/null
@@ -1,40 +0,0 @@
-{inputs, ...}: {
- imports = [
- inputs.nixcord.homeModules.nixcord
- ];
-
- programs.nixcord = {
- enable = true;
- vesktop.enable = true;
- dorion.enable = true;
- config = {
- themeLinks = [
- "https://raw.githubusercontent.com/refact0r/system24/refs/heads/main/archive/flavors/spotify-text.theme.css"
- ];
- frameless = true;
- plugins = {
- hideMedia.enable = true;
- ignoreActivities = {
- enable = true;
- ignorePlaying = true;
- ignoreWatching = true;
- };
- };
- };
- dorion = {
- theme = "dark";
- zoom = "1.1";
- blur = "acrylic";
- sysTray = true;
- openOnStartup = true;
- autoClearCache = true;
- disableHardwareAccel = false;
- rpcServer = true;
- rpcProcessScanner = true;
- pushToTalk = true;
- pushToTalkKeys = ["RControl"];
- desktopNotifications = true;
- unreadBadge = true;
- };
- };
-}
diff --git a/modules/home/easyeffects/default.nix b/modules/home/easyeffects/default.nix
deleted file mode 100644
index 22bfd00..0000000
--- a/modules/home/easyeffects/default.nix
+++ /dev/null
@@ -1,3 +0,0 @@
-{...}: {
- services.easyeffects.enable = true;
-}
diff --git a/modules/home/fastfetch/default.nix b/modules/home/fastfetch/default.nix
deleted file mode 100644
index 596e562..0000000
--- a/modules/home/fastfetch/default.nix
+++ /dev/null
@@ -1,69 +0,0 @@
-{...}: {
- home.file.".config/fastfetch/config.jsonc".text = ''
- {
- "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
- "logo": {
- "type": "none",
- },
- "display": {
- "separator": " ",
- "key": {
- "width": 18,
- },
- },
- "modules": [
- {
- "key": " ╭───────────╮",
- "type": "custom",
- },
- {
- "key": " │ │\u001b[11D{#31} user",
- "type": "title",
- "format": "{1}",
- },
- {
- "key": " │ │\u001b[11D{#34} hname",
- "type": "command",
- "text": "hostname",
- },
- {
- "key": " │ │\u001b[11D{#34} distro",
- "type": "os",
- },
- {
- "key": " │ │\u001b[11D{#35} kernel",
- "type": "kernel",
- },
- {
- "key": " │ │\u001b[11D{#31} uptime",
- "type": "uptime",
- },
- {
- "key": " │ │\u001b[11D{#32} shell",
- "type": "shell",
- },
- {
- "key": " │ │\u001b[11D{#35} memory",
- "type": "memory",
- },
- {
- "key": " ├───────────┤",
- "type": "custom",
- },
- {
- "key": " │ │\u001b[11D{#39} colors",
- "type": "colors",
- "symbol": "circle",
- },
- {
- "key": " ╰───────────╯",
- "type": "custom",
- },
- ],
- }
- '';
-
- programs.fastfetch = {
- enable = true;
- };
-}
diff --git a/modules/home/firefox/default.nix b/modules/home/firefox/default.nix
deleted file mode 100644
index 7a2390a..0000000
--- a/modules/home/firefox/default.nix
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- pkgs,
- username,
- ...
-}: {
- home.file.".mozilla/firefox/${username}/chrome".source = pkgs.firefox-mod-blur;
-
- programs.firefox = {
- enable = true;
-
- package = pkgs.firefox.override {
- extraPolicies = {
- CaptivePortal = false;
- DisableFirefoxStudies = true;
- DisablePocket = true;
- DisableTelemetry = true;
- DisableFirefoxAccounts = false;
- NoDefaultBookmarks = true;
- OfferToSaveLogins = false;
- OfferToSaveLoginsDefault = false;
- PasswordManagerEnabled = false;
- FirefoxHome = {
- Search = true;
- Pocket = false;
- Snippets = false;
- TopSites = false;
- Highlights = false;
- };
- UserMessaging = {
- ExtensionRecommendations = false;
- SkipOnboarding = true;
- };
- };
- };
-
- profiles = {
- ${username} = {
- id = 0;
- name = "tux";
- search = {
- force = true;
- default = "google";
- };
- settings = {
- "general.smoothScroll" = true;
- "extensions.activeThemeID" = "firefox-compact-dark@mozilla.org";
- "layout.css.prefers-color-scheme.content-override" = 0;
- "browser.compactmode.show" = true;
- "browser.tabs.firefox-view" = false;
- "browser.bookmarks.addedImportButton" = false;
- "extensions.pocket.enabled" = false;
- "browser.fullscreen.autohide" = false;
- };
- extraConfig = ''
- user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true);
- user_pref("full-screen-api.ignore-widgets", true);
- user_pref("media.ffmpeg.vaapi.enabled", true);
- user_pref("media.rdd-vpx.enabled", true);
- '';
-
- extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [
- ublock-origin
- facebook-container
- metamask
- darkreader
- bitwarden
- wappalyzer
- clearurls
- ];
- };
- };
- };
-}
diff --git a/modules/home/floorp/default.nix b/modules/home/floorp/default.nix
deleted file mode 100644
index 8b0a785..0000000
--- a/modules/home/floorp/default.nix
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- username,
- pkgs,
- ...
-}: {
- programs.floorp = {
- enable = true;
-
- profiles = {
- ${username} = {
- id = 0;
- name = "${username}";
- search = {
- force = true;
- default = "Google";
- };
- settings = {
- "general.smoothScroll" = true;
- "extensions.activeThemeID" = "firefox-compact-dark@mozilla.org";
- "layout.css.prefers-color-scheme.content-override" = 0;
- "browser.compactmode.show" = true;
- "browser.tabs.firefox-view" = false;
- "browser.bookmarks.addedImportButton" = false;
- "extensions.pocket.enabled" = false;
- "browser.fullscreen.autohide" = false;
- };
- extraConfig = ''
- user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true);
- user_pref("full-screen-api.ignore-widgets", true);
- user_pref("media.ffmpeg.vaapi.enabled", true);
- user_pref("media.rdd-vpx.enabled", true);
- '';
-
- extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [
- ublock-origin
- facebook-container
- metamask
- darkreader
- bitwarden
- wappalyzer
- clearurls
- ];
- };
- };
- };
-}
diff --git a/modules/home/ghostty/default.nix b/modules/home/ghostty/default.nix
deleted file mode 100644
index d7e0b87..0000000
--- a/modules/home/ghostty/default.nix
+++ /dev/null
@@ -1,40 +0,0 @@
-{pkgs, ...}: {
- home.file = {
- ".config/ghostty/config" = {
- text = ''
- confirm-close-surface = false
- gtk-titlebar = false
- window-padding-x = 10
- window-padding-y = 10
- background-opacity = 0.9
- font-size = 12
-
- palette = 0=#252b37
- palette = 1=#d0679d
- palette = 2=#5de4c7
- palette = 3=#fffac2
- palette = 4=#89ddff
- palette = 5=#fae4fc
- palette = 6=#add7ff
- palette = 7=#ffffff
- palette = 8=#a6accd
- palette = 9=#d0679d
- palette = 10=#5de4c7
- palette = 11=#fffac2
- palette = 12=#add7ff
- palette = 13=#89ddff
- palette = 14=#fcc5e9
- palette = 15=#ffffff
- background = #0f0f0f
- foreground = #a6accd
- cursor-color = #f2eacf
- selection-background = #1a1a1a
- selection-foreground = #f1f1f1
- '';
- };
- };
-
- home.packages = with pkgs; [
- ghostty
- ];
-}
diff --git a/modules/home/git/default.nix b/modules/home/git/default.nix
deleted file mode 100755
index 2f45121..0000000
--- a/modules/home/git/default.nix
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- email,
- username,
- ...
-}: {
- programs.git = {
- enable = true;
- signing = {
- key = "~/.ssh/id_ed25519.pub";
- signByDefault = true;
- };
- settings = {
- user = {
- name = "${username}";
- email = "${email}";
- };
- init.defaultBranch = "main";
- commit.gpgSign = true;
- gpg.format = "ssh";
- };
- };
-}
diff --git a/modules/home/helix/default.nix b/modules/home/helix/default.nix
deleted file mode 100644
index 28268f8..0000000
--- a/modules/home/helix/default.nix
+++ /dev/null
@@ -1,37 +0,0 @@
-{pkgs, ...}: {
- programs.helix = {
- enable = true;
- settings = {
- theme = "gruvbox";
- editor = {
- line-number = "relative";
- cursorline = true;
- color-modes = true;
- bufferline = "multiple";
-
- "cursor-shape" = {
- insert = "bar";
- normal = "block";
- select = "underline";
- };
- };
- };
- languages = {
- language = [
- {
- name = "nix";
- auto-format = true;
- }
- ];
-
- language-server = {
- nil = {
- command = "${pkgs.nil}/bin/nil";
- config.nil.formatting = {
- command = "${pkgs.alejandra}/bin/alejandra";
- };
- };
- };
- };
- };
-}
diff --git a/modules/home/kdeconnect/default.nix b/modules/home/kdeconnect/default.nix
deleted file mode 100644
index cff771e..0000000
--- a/modules/home/kdeconnect/default.nix
+++ /dev/null
@@ -1,6 +0,0 @@
-{...}: {
- services.kdeconnect = {
- enable = true;
- indicator = true;
- };
-}
diff --git a/modules/home/lan-mouse/default.nix b/modules/home/lan-mouse/default.nix
deleted file mode 100644
index b65685f..0000000
--- a/modules/home/lan-mouse/default.nix
+++ /dev/null
@@ -1,19 +0,0 @@
-{inputs, ...}: {
- imports = [
- inputs.lan-mouse.homeManagerModules.default
- ];
-
- programs.lan-mouse = {
- enable = true;
- systemd = true;
- settings = {
- # release_bind = ["KeyA" "KeyS" "KeyD" "KeyF"];
-
- port = 4242;
-
- authorized_fingerprints = {
- "30:66:b3:95:dc:6b:55:a4:9f:30:31:9c:3e:4d:70:03:33:c3:f0:6f:df:31:35:58:36:6e:80:2f:32:b2:ce:48" = "pc";
- };
- };
- };
-}
diff --git a/modules/home/librewolf/default.nix b/modules/home/librewolf/default.nix
deleted file mode 100644
index 299adaf..0000000
--- a/modules/home/librewolf/default.nix
+++ /dev/null
@@ -1,5 +0,0 @@
-{...}: {
- programs.librewolf = {
- enable = true;
- };
-}
diff --git a/modules/home/mopidy/default.nix b/modules/home/mopidy/default.nix
deleted file mode 100644
index fb3deda..0000000
--- a/modules/home/mopidy/default.nix
+++ /dev/null
@@ -1,38 +0,0 @@
-{pkgs, ...}: {
- programs.ncmpcpp = {
- enable = true;
- package = pkgs.ncmpcpp.override {
- visualizerSupport = true;
- clockSupport = true;
- };
- mpdMusicDir = "~/Music/";
-
- settings = {
- mpd_host = "127.0.0.1";
- mpd_port = 6600;
- mpd_connection_timeout = 20;
- visualizer_data_source = "localhost:5555";
- visualizer_fps = 60;
- visualizer_output_name = "feed";
- visualizer_in_stereo = "yes";
- visualizer_type = "spectrum";
- visualizer_look = "▄▍";
- visualizer_spectrum_smooth_look = "yes";
- song_status_format = "$b$7♫ $2%a $4⟫$3⟫ $8%t $4⟫$3⟫ $5%b ";
- header_visibility = "no";
- color1 = "white";
- color2 = "green";
- };
- };
-
- services.mopidy = {
- enable = true;
-
- extensionPackages = with pkgs; [
- mopidy-mpd
- mopidy-spotify
- mopidy-soundcloud
- mopidy-iris
- ];
- };
-}
diff --git a/modules/home/nvim/default.nix b/modules/home/nvim/default.nix
deleted file mode 100755
index 274b4e9..0000000
--- a/modules/home/nvim/default.nix
+++ /dev/null
@@ -1,40 +0,0 @@
-{pkgs, ...}: {
- home.file = {
- ".config/nvim" = {
- recursive = true;
- source = "${pkgs.tnvim}";
- };
- };
-
- programs = {
- neovim = {
- enable = true;
- defaultEditor = true;
- vimAlias = true;
- withPython3 = true;
- withNodeJs = true;
- };
- };
-
- home = {
- packages = with pkgs; [
- gcc
- neovide
-
- # nix
- nil # Language Server
- statix # Lints and suggestions
- deadnix # Find and remove unused
- alejandra # Code Formatter
-
- # lua
- luarocks
-
- # ts
- typescript
-
- gdu
- ripgrep
- ];
- };
-}
diff --git a/modules/home/picom/default.nix b/modules/home/picom/default.nix
deleted file mode 100644
index 04dfeab..0000000
--- a/modules/home/picom/default.nix
+++ /dev/null
@@ -1,64 +0,0 @@
-{pkgs, ...}: {
- services.picom = {
- enable = true;
- package = pkgs.picom;
-
- backend = "glx";
- vSync = true;
-
- fade = true;
- fadeDelta = 10;
- fadeSteps = [0.05 0.05];
- fadeExclude = [
- "window_type *= 'menu'"
- ];
-
- activeOpacity = 1;
- inactiveOpacity = 1;
- opacityRules = [
- "90:class_g = 'rofi'"
- "90:class_g = 'thunar'"
- "90:class_g = 'spotify'"
- "90:class_g = 'discord'"
- "90:class_g = 'code'"
- "90:class_g = 'org.wezfurlong.wezterm'"
- "90:class_g = 'wezterm-floating'"
- ];
-
- settings = {
- glx-no-stencil = true;
- glx-copy-from-font = false;
- use-damage = false;
-
- frame-opacity = 1;
- blur-background = true;
- blur-method = "dual_kawase";
- blur-strength = 10;
-
- corner-radius = 8;
-
- rounded-corners-exclude = [
- "window_type = 'dock'"
- ];
-
- # pijulius specifics
- animations = true;
- animation-stiffness = 500;
- animation-window-mass = 1.0;
- animation-dampening = 26;
- animation-delta = 10;
- animation-force_steps = false;
- animation-clamping = true;
-
- animation-for-open-window = "slide-up";
- animation-for-menu-window = "slide-down";
- animation-for-transient-window = "slide-down";
- animation-for-unmap-window = "slide-up";
-
- animation-for-next-tag = "slide-right";
- animation-for-prev-tag = "slide-left";
- enable-fading-next-tag = true;
- enable-fading-prev-tag = true;
- };
- };
-}
diff --git a/modules/home/shell/default.nix b/modules/home/shell/default.nix
deleted file mode 100755
index 617d760..0000000
--- a/modules/home/shell/default.nix
+++ /dev/null
@@ -1,100 +0,0 @@
-{pkgs, ...}: {
- imports = [
- ./lazygit.nix
- ./superfile.nix
- ./open-code.nix
- ];
-
- programs = {
- bat.enable = true;
- zsh = {
- enable = true;
- history = {
- append = true;
- share = true;
- expireDuplicatesFirst = true;
- ignoreDups = true;
- size = 1000000;
- save = 1000000;
- path = "$HOME/.local/share/zsh/.zsh_history";
- };
- syntaxHighlighting.enable = true;
- autosuggestion.enable = true;
- initContent = ''
- fastfetch
- export WINIT_X11_SCALE_FACTOR=1
- PATH=$PATH:~/.cargo/bin:~/.local/bin
-
- bindkey "^A" vi-beginning-of-line
- bindkey "^E" vi-end-of-line
- bindkey '^R' fzf-history-widget
- '';
- };
- zoxide = {
- enable = true;
- options = ["--cmd cd"];
- enableZshIntegration = true;
- };
- ripgrep.enable = true;
- btop = {
- enable = true;
- settings = {
- theme_background = false;
- update_ms = 1000;
- presets = "cpu:0:default mem:0:default net:0:default";
- };
- };
- go.enable = true;
- yazi = {
- enable = true;
- enableZshIntegration = true;
- };
- fzf = {
- enable = true;
- enableZshIntegration = true;
- };
- lsd = {
- enable = true;
- enableZshIntegration = true;
- };
- };
-
- home.packages = with pkgs; [
- systemctl-tui
- ranger
- wget
- portal
- bore-cli
- zip
- unzip
- pciutils
- gnumake
- nvtopPackages.full
- zellij
- nix-output-monitor
- duf
- jq
- atac
- termshark
- solc
- dig
- lsof
-
- python312
- python312Packages.pipx
- nodejs
- pnpm
- yarn
- rustup
- bun
- nixpkgs-fmt
-
- hunspell
- hunspellDicts.en_US
- air
- templ
- ffmpeg
- deploy-rs
- trok
- ];
-}
diff --git a/modules/home/shell/lazygit.nix b/modules/home/shell/lazygit.nix
deleted file mode 100644
index f215527..0000000
--- a/modules/home/shell/lazygit.nix
+++ /dev/null
@@ -1,171 +0,0 @@
-{...}: {
- programs.lazygit = {
- enable = true;
- settings = {
- gui = {
- showIcons = true;
- nerdFontsVersion = "3";
- };
- customCommands = [
- {
- key = "";
- description = "AI-powered conventional commit";
- context = "global";
- command = "git commit -m \"{{.Form.CommitMsg}}\"";
- loadingText = "Generating commit messages...";
- prompts = [
- {
- type = "menu";
- key = "Type";
- title = "Type of change";
- options = [
- {
- name = "AI defined";
- description = "Let AI analyze and determine the best commit type";
- value = "ai-defined";
- }
- {
- name = "build";
- description = "Changes that affect the build system or external dependencies";
- value = "build";
- }
- {
- name = "feat";
- description = "A new feature";
- value = "feat";
- }
- {
- name = "fix";
- description = "A bug fix";
- value = "fix";
- }
- {
- name = "chore";
- description = "Other changes that don't modify src or test files";
- value = "chore";
- }
- {
- name = "ci";
- description = "Changes to CI configuration files and scripts";
- value = "ci";
- }
- {
- name = "docs";
- description = "Documentation only changes";
- value = "docs";
- }
- {
- name = "perf";
- description = "A code change that improves performance";
- value = "perf";
- }
- {
- name = "refactor";
- description = "A code change that neither fixes a bug nor adds a feature";
- value = "refactor";
- }
- {
- name = "revert";
- description = "Reverts a previous commit";
- value = "revert";
- }
- {
- name = "style";
- description = "Changes that do not affect the meaning of the code";
- value = "style";
- }
- {
- name = "test";
- description = "Adding missing tests or correcting existing tests";
- value = "test";
- }
- ];
- }
- {
- type = "menuFromCommand";
- title = "AI Generated Commit Messages";
- key = "CommitMsg";
- command = ''
- bash -c "
- # Check for staged changes
- diff=\$(git diff --cached | head -n 10)
- if [ -z \"\$diff\" ]; then
- echo \"No changes in staging. Add changes first.\"
- exit 1
- fi
-
- SELECTED_TYPE=\"{{.Form.Type}}\"
- COMMITS_TO_SUGGEST=8
-
- opencode run -m \"google/gemini-2.5-flash-lite\" \"
- You are an expert at writing Git commits. Your job is to write commit messages that follow the Conventional Commits format.
-
- The user has selected: \$SELECTED_TYPE
-
- Your task is to:
- 1. Analyze the code changes
- 2. Determine the most appropriate commit type (if user selected 'ai-defined')
- 3. Determine an appropriate scope (component/area affected)
- 4. Decide if this is a breaking change
- 5. Write clear, concise commit messages
-
- Available commit types:
- - feat: A new feature
- - fix: A bug fix
- - docs: Documentation only changes
- - style: Changes that do not affect the meaning of the code
- - refactor: A code change that neither fixes a bug nor adds a feature
- - perf: A code change that improves performance
- - test: Adding missing tests or correcting existing tests
- - build: Changes that affect the build system or external dependencies
- - ci: Changes to CI configuration files and scripts
- - chore: Other changes that don't modify src or test files
- - revert: Reverts a previous commit
-
- Follow these guidelines:
- - Structure: ():
- - If user selected 'ai-defined', analyze the changes and pick the most suitable type
- - If user selected a specific type, use that type: \$SELECTED_TYPE
- - Add scope in parentheses if applicable (e.g., auth, api, ui, config)
- - Use exclamation mark (!) after type/scope for breaking changes: type(scope)!: description
- - Use lowercase for description (except proper nouns)
- - Use imperative mood (\\\"add\\\", not \\\"added\\\")
- - Keep description under 50 characters when possible
- - No period at the end of subject line
-
- Examples:
- - feat(auth): add OAuth login support
- - fix(api): handle null response in user endpoint
- - docs(readme): update installation instructions
- - style(ui): improve button spacing consistency
- - refactor(database): simplify query builder logic
- - test(auth): add unit tests for login flow
- - build(deps): upgrade React to version 18
- - ci(github): fix deployment workflow
- - chore(config): update ESLint rules
- - perf(api)!: optimize database queries
-
- IMPORTANT:
- - Generate exactly \$COMMITS_TO_SUGGEST different commit message options
- - If user selected 'ai-defined', you can use different types for different options
- - If user selected a specific type, all messages must use that type
- - Only return commit messages, no explanations
- - Do not use markdown code blocks
- - One message per line
-
- Previous commits for context:
- \$(git log --oneline -10)
-
- Changes to analyze:
- \$(git diff --cached --stat)
- \$(git diff --cached)
- \"
- "
- '';
- }
- ];
- }
- ];
- };
- };
-}
diff --git a/modules/home/shell/open-code.nix b/modules/home/shell/open-code.nix
deleted file mode 100644
index 8042242..0000000
--- a/modules/home/shell/open-code.nix
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- programs.opencode = {
- enable = true;
- tui = {
- theme = "system";
- };
- settings = {
- provider = {
- google = {
- options = {
- apiKey = "{file:/run/secrets/gemini_api_key}";
- };
- };
- openrouter = {
- options = {
- apiKey = "{file:/run/secrets/open_router_api_key}";
- };
- };
- };
- };
- };
-}
diff --git a/modules/home/shell/superfile.nix b/modules/home/shell/superfile.nix
deleted file mode 100644
index ed3b9fe..0000000
--- a/modules/home/shell/superfile.nix
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- programs.superfile = {
- enable = true;
- settings = {
- theme = "poimandres";
- editor = "";
- dir_editor = "";
- auto_check_update = false;
- cd_on_quit = false;
- default_open_file_preview = true;
- show_image_preview = true;
- show_panel_footer_info = true;
- default_directory = "~";
- file_size_use_si = false;
- default_sort_type = 0;
- sort_order_reversed = false;
- case_sensitive_sort = false;
- shell_close_on_success = false;
- debug = false;
- ignore_missing_fields = false;
- nerdfont = true;
- transparent_background = true;
- file_preview_width = 0;
- code_previewer = "bat";
- sidebar_width = 20;
- border_top = "─";
- border_bottom = "─";
- border_left = "│";
- border_right = "│";
- border_top_left = "╭";
- border_top_right = "╮";
- border_bottom_left = "╰";
- border_bottom_right = "╯";
- border_middle_left = "├";
- border_middle_right = "┤";
- metadata = true;
- zoxide_support = true;
- enable_md5_checksum = false;
- };
- };
-}
diff --git a/modules/home/spotify/default.nix b/modules/home/spotify/default.nix
deleted file mode 100644
index 504651f..0000000
--- a/modules/home/spotify/default.nix
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- services.spotifyd = {
- enable = true;
- settings = {
- global = {
- device_name = "canopus";
- device_type = "computer";
- bitrate = 320;
- initial_volume = 100;
- autoplay = true;
- };
- };
- };
-
- programs.spotify-player = {
- enable = true;
- settings = {
- theme = "default";
- client_id = "c54c06bacd3642c68d981474dadd3a53";
- login_redirect_uri = "http://127.0.0.1:8989/login";
- device = {
- name = "spotify-player";
- device_type = "speaker";
- volume = 100;
- bitrate = 320;
- audio_cache = false;
- normalization = false;
- autoplay = false;
- };
- };
- };
-}
diff --git a/modules/home/starship/default.nix b/modules/home/starship/default.nix
deleted file mode 100755
index 9c86af5..0000000
--- a/modules/home/starship/default.nix
+++ /dev/null
@@ -1,50 +0,0 @@
-{...}: {
- programs.starship = {
- enable = true;
- settings = {
- format = ''$os$hostname$directory$rust$golang$solidity$nodejs(bold blue)$git_branch$git_status[❯](bold yellow)[❯](bold purple)[❯](bold blue) '';
- scan_timeout = 60;
- add_newline = false;
- line_break.disabled = true;
-
- os = {
- format = "[$symbol ]($style)";
- style = "bold green";
- disabled = false;
- symbols.NixOS = "";
- symbols.Linux = "";
- symbols.Arch = "";
- symbols.Ubuntu = "";
- };
- directory = {
- format = "[$path]($style)[$read_only ]($read_only_style)";
- read_only = " ";
- style = "bold blue";
- };
- git_branch.format = "[$symbol$branch]($style) ";
- hostname = {
- ssh_only = false;
- format = "[$ssh_symbol$hostname]($style) ";
- style = "bold green";
- ssh_symbol = " ";
- disabled = false;
- };
- rust = {
- format = "[$symbol]($style)";
- symbol = " ";
- };
- golang = {
- format = "[$symbol]($style)";
- symbol = " ";
- };
- solidity = {
- format = "[$symbol]($style)";
- symbol = " ";
- };
- nodejs = {
- format = "[$symbol]($style)";
- symbol = " ";
- };
- };
- };
-}
diff --git a/modules/home/thunderbird/default.nix b/modules/home/thunderbird/default.nix
deleted file mode 100644
index 902ca16..0000000
--- a/modules/home/thunderbird/default.nix
+++ /dev/null
@@ -1,9 +0,0 @@
-{username, ...}: {
- programs.thunderbird = {
- enable = true;
-
- profiles."${username}" = {
- isDefault = true;
- };
- };
-}
diff --git a/modules/home/tmux/default.nix b/modules/home/tmux/default.nix
deleted file mode 100644
index e651c08..0000000
--- a/modules/home/tmux/default.nix
+++ /dev/null
@@ -1,136 +0,0 @@
-{pkgs, ...}: let
- bg = "default";
- fg = "default";
- bg2 = "brightblack";
- fg2 = "white";
- color = c: "#{@${c}}";
-
- indicator = let
- accent = color "indicator_color";
- content = " ";
- in "#[reverse,fg=${accent}]#{?client_prefix,${content},}";
-
- current_window = let
- accent = color "main_accent";
- index = "#[reverse,fg=${accent},bg=${fg}] #I ";
- name = "#[fg=${bg2},bg=${fg2}] #W ";
- # flags = "#{?window_flags,#{window_flags}, }";
- in "${index}${name}";
-
- window_status = let
- accent = color "window_color";
- index = "#[reverse,fg=${accent},bg=${fg}] #I ";
- name = "#[fg=${bg2},bg=${fg2}] #W ";
- # flags = "#{?window_flags,#{window_flags}, }";
- in "${index}${name}";
-
- battery = let
- percentage = pkgs.writeShellScript "percentage" (
- if pkgs.stdenv.isDarwin
- then ''
- echo $(pmset -g batt | grep -o "[0-9]\+%" | tr '%' ' ')
- ''
- else ''
- path="/org/freedesktop/UPower/devices/DisplayDevice"
- echo $(${pkgs.upower}/bin/upower -i $path | grep -o "[0-9]\+%" | tr '%' ' ')
- ''
- );
- state = pkgs.writeShellScript "state" (
- if pkgs.stdenv.isDarwin
- then ''
- echo $(pmset -g batt | awk '{print $4}')
- ''
- else ''
- path="/org/freedesktop/UPower/devices/DisplayDevice"
- echo $(${pkgs.upower}/bin/upower -i $path | grep state | awk '{print $2}')
- ''
- );
- icon = pkgs.writeShellScript "icon" ''
- percentage=$(${percentage})
- state=$(${state})
- if [ "$state" == "charging" ] || [ "$state" == "fully-charged" ]; then echo ""
- elif [ $percentage -ge 75 ]; then echo ""
- elif [ $percentage -ge 50 ]; then echo ""
- elif [ $percentage -ge 25 ]; then echo ""
- elif [ $percentage -ge 0 ]; then echo ""
- fi
- '';
- color = pkgs.writeShellScript "color" ''
- percentage=$(${percentage})
- state=$(${state})
- if [ "$state" == "charging" ] || [ "$state" == "fully-charged" ]; then echo "green"
- elif [ $percentage -ge 75 ]; then echo "green"
- elif [ $percentage -ge 50 ]; then echo "${fg2}"
- elif [ $percentage -ge 30 ]; then echo "yellow"
- elif [ $percentage -ge 0 ]; then echo "red"
- fi
- '';
- in "#[fg=#(${color})]#(${icon}) #[fg=${fg}]#(${percentage})%";
-
- pwd = let
- accent = color "main_accent";
- icon = "#[fg=${accent}] ";
- format = "#[fg=${fg}]#{b:pane_current_path}";
- in "${icon}${format}";
-
- git = let
- icon = pkgs.writeShellScript "branch" ''
- git -C "$1" branch && echo " "
- '';
- branch = pkgs.writeShellScript "branch" ''
- git -C "$1" rev-parse --abbrev-ref HEAD
- '';
- in "#[fg=magenta]#(${icon} #{pane_current_path})#(${branch} #{pane_current_path})";
-
- separator = "#[fg=${fg}]|";
-in {
- programs.tmux = {
- enable = true;
- baseIndex = 1;
- escapeTime = 0;
- mouse = true;
- extraConfig = ''
- set-option -sa terminal-overrides ",xterm*:Tc"
- set-option -g status-position top
- unbind r
- bind r source-file ~/.config/tmux/tmux.conf
-
- # remap prefix from C-b to C-Space
- # unbind C-b
- # set -g prefix C-Space
- # bind C-Space send-prefix
-
- # split panes using | and -
- unbind '"'
- unbind %
- bind | split-window -h
- bind - split-window -v
-
- # Start windows and panes at 1, not 0
- set -g base-index 1
- set -g pane-base-index 1
- set-window-option -g pane-base-index 1
- set-option -g renumber-windows on
-
- # switch panes using Alt-arrow without prefix
- bind -n M-Left select-pane -L
- bind -n M-Right select-pane -R
- bind -n M-Up select-pane -U
- bind -n M-Down select-pane -D
-
- set-option -g default-terminal "screen-256color"
- set-option -g status-right-length 100
- set-option -g @indicator_color "yellow"
- set-option -g @window_color "magenta"
- set-option -g @main_accent "blue"
- set-option -g pane-active-border fg=black
- set-option -g pane-border-style fg=black
- set-option -g status-style "bg=${bg} fg=${fg}"
- set-option -g status-left "${indicator}"
- set-option -g status-right "${git} ${pwd} ${separator} ${battery}"
- set-option -g window-status-current-format "${current_window}"
- set-option -g window-status-format "${window_status}"
- set-option -g window-status-separator ""
- '';
- };
-}
diff --git a/modules/home/vs-code/default.nix b/modules/home/vs-code/default.nix
deleted file mode 100644
index 21a20b1..0000000
--- a/modules/home/vs-code/default.nix
+++ /dev/null
@@ -1,76 +0,0 @@
-{pkgs, ...}: {
- programs.vscode = {
- enable = true;
- package = pkgs.vscodium;
-
- profiles.default = {
- keybindings = [
- {
- "key" = "f7";
- "command" = "-editor.action.wordHighlight.next";
- "when" = "editorTextFocus && hasWordHighlights";
- }
- {
- "key" = "f7";
- "command" = "-editor.action.accessibleDiffViewer.next";
- "when" = "isInDiffEditor";
- }
- {
- "key" = "f7";
- "command" = "workbench.action.terminal.toggleTerminal";
- "when" = "terminal.active";
- }
- {
- "key" = "ctrl+`";
- "command" = "-workbench.action.terminal.toggleTerminal";
- "when" = "terminal.active";
- }
- ];
-
- userSettings = {
- "window.zoomLevel" = 2;
- "window.menuBarVisibility" = "toggle";
-
- "workbench.colorTheme" = "Poimandres Alternate";
- "workbench.startupEditor" = "none";
-
- "editor.fontFamily" = "FiraCode NF, FiraCode Nerd Font";
- "editor.fontLigatures" = true;
- "editor.cursorBlinking" = "smooth";
- "editor.minimap.enabled" = false;
-
- "terminal.integrated.fontFamily" = "FiraCode NF, FiraCode Nerd Font , FiraCode";
- };
-
- extensions =
- (with pkgs.vscode-extensions; [
- wakatime.vscode-wakatime
- ms-dotnettools.csharp
- naumovs.color-highlight
- ms-vscode-remote.remote-containers
- ms-azuretools.vscode-docker
- mikestead.dotenv
- golang.go
- wix.vscode-import-cost
- sumneko.lua
- yzhang.markdown-all-in-one
- jnoortheen.nix-ide
- esbenp.prettier-vscode
- prisma.prisma
- ms-python.python
- ms-vscode-remote.remote-ssh
- humao.rest-client
- bradlc.vscode-tailwindcss
- gruntfuggly.todo-tree
- ])
- ++ (with pkgs.vscode-marketplace; [
- danielpriestley.poimandres-alternate
- pufferbommy.pretty-poimandres
- yoavbls.pretty-ts-errors
- formulahendry.auto-rename-tag
- chakrounanas.turbo-console-log
- streetsidesoftware.code-spell-checker
- ]);
- };
- };
-}
diff --git a/modules/home/wezterm/default.nix b/modules/home/wezterm/default.nix
deleted file mode 100644
index e681030..0000000
--- a/modules/home/wezterm/default.nix
+++ /dev/null
@@ -1,29 +0,0 @@
-{pkgs, ...}: {
- programs.wezterm = {
- enable = true;
- package = pkgs.wezterm-git;
- enableZshIntegration = false;
-
- extraConfig = ''
- local wezterm = require 'wezterm'
- local config = {}
-
- config.check_for_updates = false
-
- config.window_close_confirmation = 'NeverPrompt'
- config.color_scheme = 'Poimandres'
- config.colors = {
- background = "#0f0f0f"
- }
- config.enable_tab_bar = false
- config.font = wezterm.font_with_fallback {
- 'JetBrainsMono Nerd Font',
- }
- config.font_size = 12.0
- config.window_background_opacity = 1
- config.audible_bell = "Disabled"
-
- return config
- '';
- };
-}
diff --git a/modules/home/zed/default.nix b/modules/home/zed/default.nix
deleted file mode 100644
index c58e55e..0000000
--- a/modules/home/zed/default.nix
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- programs.zed-editor = {
- enable = true;
- extensions = ["lua" "nix" "C#" "solidity"];
- userKeymaps = [
- {
- context = "Workspace";
- bindings = {
- F7 = "workspace::NewTerminal";
- };
- }
- ];
- userSettings = {
- ui_font_size = 18;
- buffer_font_size = 18;
- theme = {
- mode = "dark";
- light = "Ayu Light";
- dark = "Ayu Dark";
- };
- vim_mode = true;
- telemetry = {
- diagnostics = false;
- metrics = false;
- };
- };
- };
-}
diff --git a/modules/hosts/alpha/config.nix b/modules/hosts/alpha/config.nix
new file mode 100644
index 0000000..4be5f17
--- /dev/null
+++ b/modules/hosts/alpha/config.nix
@@ -0,0 +1,138 @@
+{ inputs, config, ... }:
+{
+ flake.modules.nixos.alpha =
+ {
+ hostName,
+ userName,
+ ...
+ }@innerArgs:
+ {
+ imports =
+ with config.flake.modules.nixos;
+ [
+ boot
+ networking
+ virtualisation
+ services
+ ]
+ ++ [
+ inputs.trok.nixosModules.default
+ inputs.tfolio.nixosModules.default
+ ];
+
+ tnix = {
+ boot = {
+ legacy.enable = true;
+
+ impermanence = {
+ enable = true;
+
+ home = {
+ directories = [
+ ".local/share/nvim"
+ ".local/share/zsh"
+ ".local/share/zoxide"
+ ".local/state/lazygit"
+ ".local/share/opencode"
+ ];
+ };
+ };
+ };
+
+ networking = {
+ openssh = {
+ enable = true;
+ ports = [
+ 23
+ ];
+ };
+ netbird-client.enable = true;
+ };
+
+ services = {
+ pangolin = {
+ enable = true;
+ domain = "pangolin.lab.tux.rs";
+ baseDomain = "lab.tux.rs";
+ environmentFile = innerArgs.config.sops.secrets."pangolin".path;
+ };
+
+ uptime-kuma = {
+ enable = true;
+ domain = "status.lab.tux.rs";
+ };
+
+ mediaflow-proxy = {
+ enable = true;
+ environmentFile = innerArgs.config.sops.secrets."mediaflow-proxy".path;
+ };
+
+ trok = {
+ enable = true;
+ };
+ };
+
+ virtualisation = {
+ docker.enable = true;
+ };
+ };
+
+ sops.secrets = {
+ tux-password = {
+ sopsFile = ./secrets.yaml;
+ neededForUsers = true;
+ };
+
+ gemini-api-key = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+
+ openrouter-api-key = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+
+ opencode-go-api-key = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+
+ netbird-key = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+
+ "cloudflare-credentials/email" = {
+ sopsFile = ./secrets.yaml;
+ };
+
+ "cloudflare-credentials/dns-api-token" = {
+ sopsFile = ./secrets.yaml;
+ };
+
+ aiostreams = {
+ sopsFile = ./secrets.yaml;
+ };
+
+ mediaflow-proxy = {
+ sopsFile = ./secrets.yaml;
+ };
+
+ pangolin = {
+ sopsFile = ./secrets.yaml;
+ };
+ };
+
+ # --- Networking ---
+ networking = {
+ hostName = hostName;
+ networkmanager.enable = true;
+ firewall.enable = false;
+ };
+
+ services.tfolio.enable = true;
+
+ system.stateVersion = "26.05";
+ };
+}
diff --git a/modules/hosts/alpha/disko.nix b/modules/hosts/alpha/disko.nix
new file mode 100644
index 0000000..3cc0c26
--- /dev/null
+++ b/modules/hosts/alpha/disko.nix
@@ -0,0 +1,82 @@
+{ inputs, ... }:
+{
+ flake.modules.nixos.alpha =
+ { config, lib, ... }:
+ let
+ hasOptinPersistence = config.tnix.boot.impermanence.enable;
+ isLegacy = config.tnix.boot.legacy.enable;
+ in
+ {
+ imports = [
+ inputs.disko.nixosModules.disko
+ ];
+
+ disko.devices.disk.primary = {
+ device = "/dev/sda";
+ type = "disk";
+ content = {
+ type = "gpt";
+ partitions = {
+ ESP = {
+ size = "1G";
+ type = "EF00";
+ content = {
+ type = "filesystem";
+ format = "vfat";
+ mountpoint = "/boot";
+ mountOptions = [
+ "defaults"
+ "umask=0077"
+ ];
+ };
+ };
+ root = {
+ size = "100%";
+ type = "8300";
+ content = {
+ type = "btrfs";
+ # Base subvolumes that always exist
+ subvolumes = {
+ "/root" = {
+ mountOptions = [
+ "compress=zstd"
+ "noatime"
+ "space_cache=v2"
+ ];
+ mountpoint = "/";
+ };
+ "/nix" = {
+ mountOptions = [
+ "compress=zstd"
+ "noatime"
+ "noacl"
+ "space_cache=v2"
+ ];
+ mountpoint = "/nix";
+ };
+ }
+ # Conditionally merge /persist only when impermanence is enabled
+ // lib.optionalAttrs hasOptinPersistence {
+ "/persist" = {
+ mountOptions = [
+ "compress=zstd"
+ "noatime"
+ "space_cache=v2"
+ ];
+ mountpoint = "/persist";
+ };
+ };
+ };
+ };
+ }
+ // lib.optionalAttrs isLegacy {
+ boot = {
+ name = "boot";
+ size = "1M";
+ type = "EF02";
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/modules/hosts/alpha/hardware.nix b/modules/hosts/alpha/hardware.nix
new file mode 100644
index 0000000..297cffe
--- /dev/null
+++ b/modules/hosts/alpha/hardware.nix
@@ -0,0 +1,17 @@
+{
+ flake.modules.nixos.alpha =
+ {
+ lib,
+ modulesPath,
+ system,
+ ...
+ }:
+ {
+ imports = [
+ (modulesPath + "/profiles/qemu-guest.nix")
+ ];
+
+ networking.useDHCP = lib.mkDefault true;
+ nixpkgs.hostPlatform = lib.mkDefault system;
+ };
+}
diff --git a/modules/hosts/alpha/home.nix b/modules/hosts/alpha/home.nix
new file mode 100644
index 0000000..eab1bd2
--- /dev/null
+++ b/modules/hosts/alpha/home.nix
@@ -0,0 +1,5 @@
+{
+ flake.modules.homeManager.alpha = {
+ home.stateVersion = "26.05";
+ };
+}
diff --git a/modules/hosts/alpha/secrets.yaml b/modules/hosts/alpha/secrets.yaml
new file mode 100644
index 0000000..38cad75
--- /dev/null
+++ b/modules/hosts/alpha/secrets.yaml
@@ -0,0 +1,35 @@
+tux-password: ENC[AES256_GCM,data:tvx3nMoIuQSotxHDWLs7UesnyWY3u3EwkqAIzCw3Z2AJseaiqnt/xeSKAeUXPVSs85rVdIJ6Ys5+6r+NONEG7ujuNevpjJRNkQ==,iv:CB0BIrMfdiWiMCvmRdtsafh3dCAD5Qb3mOuE7eq4nA4=,tag:p/3AESwNCEL4EoU9rJjUPw==,type:str]
+gemini-api-key: ENC[AES256_GCM,data:Bo3Z5Jhce0UOBn77I2AcrXYbBgPLDx0eOjPC8J63E/VWNhMPbbxb,iv:iWOsTACOMcK3oqq848WnJ5Ku3tYy1aadmLB4IMgoyqg=,tag:BPzlXoP8/iJaj8c/YFCWyg==,type:str]
+openrouter-api-key: ENC[AES256_GCM,data:D+/ImUTg7UvBTh0fMlWMZ0O/GsQS/R4Hz+CO4l42R6mn+zk+udvw79BctXdWWyrFf2ZNOTJ/99QTtWOUOvHISWaEJogXyb+93g==,iv:c7OtgBu1Zaf7lA4InIsKOAPbAvTl3gaO7QGCFNx21Bo=,tag:KXiASj/qC1YzK6DUox57ug==,type:str]
+opencode-go-api-key: ENC[AES256_GCM,data:ipKkNcRqBERIQ6f6yFzVm999s+UwJys4elHWhzpL441RfOaG9MmRWMcD+wRLJ7DSWFjYu6uUPF7TKez8J6abWeKDgg==,iv:FDSYE3R8zKVxWiP2S/sCVcwEu3fEXg/hCeqCRSF+c6g=,tag:5RDuMFGMoN6xwAYj0HiyjQ==,type:str]
+netbird-key: ENC[AES256_GCM,data:NilfyafnGhFVYD6q4+jJQxlhXNdNC8BQ1CZfu8a5wc693Y1h,iv:Rpl0OpkQdBMPpIJ08t9Z0AjDAW6c97pFZKO1KPu8ipY=,tag:du3d0SQWuqJtJSwhSgJE4g==,type:str]
+cloudflare-credentials:
+ email: ENC[AES256_GCM,data:K9L6H4dqNNgbCFg=,iv:jirDJb+Y2sXrup6/doRmOdd8tV7zLnttcgG75r4Fs04=,tag:XeyMVC+Q9TEuTxSfOeR2Uw==,type:str]
+ dns-api-token: ENC[AES256_GCM,data:aLZqasMaxpv08KuGqhe66J/jHqEnMNdZrYtIurv01xk2/5OW//PaHQ==,iv:7tZYpOT27n/RWaj1CqiZbhA/g3aKbxjdkMA6SuW/YpQ=,tag:oetxyD9XMrihSLyDvl7qfw==,type:str]
+aiostreams: ENC[AES256_GCM,data:HeV4NONoqTti/4GBpzYaUEGgrSpDfCfcGJ3kbZAUtg5hm1zQCcelx3N4b/woSjaNZrDj98P5R3oZUkgVfv0RS2PKdJc3EdLaPFwXcuJ+W0U373sryU85uIIZi4BvQ4LyCCpuclPU5dgQmb9rzbIvhlu/ftfpKJsRbH2bUgMMo2nohMWUtg==,iv:V60U/omnN+09cSOQGvwwN8DC6/D++MB0axQyzIG97zo=,tag:vwNbXRj3CS+okb0NSwxgYw==,type:str]
+mediaflow-proxy: ENC[AES256_GCM,data:jk2eYyOmO3XpqFNo3jucB/VvL6pWBGrquYi/OpIwvSPqjbo=,iv:DIsqykv77/TlLhT9uIPGJRBlCQHVdhcuYlc56qQGZgk=,tag:phMXArjIrNNI51U9hpaUzg==,type:str]
+pangolin: ENC[AES256_GCM,data:G6TscTsWsyvBM/L2boxpDIrczV0cycQNT51mOf0vPKOHdifdBxT6Q3PY+Ms5arc=,iv:qh655lwIcD89D8ufIzJWYrDqPKGCrGMUXsgcFYwm9zY=,tag:kGlGzaOADZyY6gsLuI6EHw==,type:str]
+sops:
+ age:
+ - enc: |
+ -----BEGIN AGE ENCRYPTED FILE-----
+ YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBaR0kzRXBGRjJaVldDRk90
+ KzYwSzJBeXBnNVZ0T2VaU2oyLzdRWmo5ZzNVCk9HTDVtMk8xL1cwL2FSRUR5UGdS
+ bXJnOXhTbWozWm5rd2pnaFNoWk0rWncKLS0tIGFWWmY2WU9YanJ5UElab3lqaXNo
+ QUhYUWs4bitJaGpXL200b0s0SmVIeVUKevQ1IVqmqGIYf014iL47C02+peSYJyeE
+ PNluZUA6VzrL2WpdJzDqxAwSWtcgXG0/JADIg+DssnhftiHMHzn3NQ==
+ -----END AGE ENCRYPTED FILE-----
+ recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4
+ - enc: |
+ -----BEGIN AGE ENCRYPTED FILE-----
+ YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBnL1VPODRnNEs2bXlUVjB5
+ Z0pBUzBnRDQ0WWcvL2IvUHdmQXUxNjRpTVN3Ck9VLzd2QWpMMlFJck1EQXBVanl0
+ SC91bDFqNFlJZ2E0UXVZa3BKRjh3TlkKLS0tIENuc1dUZ1dDUTg2VXBueU1ETG9S
+ c095blJheHhVT0E4bjdGUWlYN0N4MVUKK42sChX4V37HK1SRKQxldLpft2jVfeiG
+ 4TkObqH8ddGpbd7cX5a/wboTjYuEdAviWxjK2oBPgtcFc1f03X3tmA==
+ -----END AGE ENCRYPTED FILE-----
+ recipient: age1mzxxxzhy3us3rd960ufqv7vlxj5cnug86md6x69llg9ujzw2pqws057llf
+ lastmodified: "2026-08-07T20:02:00Z"
+ mac: ENC[AES256_GCM,data:VrA2OPCcVvAzYjZTkHPxytclISP24P1FqiIQjSGQItkMLieom80N6933hB0Tdn3BM6600bHt2NweSqHjGx//pn2Gbur4pxeN3TpF9tKXc12IcAThUL9g48fMbk5y+kWWVUF1Pezod0YnzWAlalUXFqvKinfm4RqPNjDjndA/dcI=,iv:xfs9XD5ZIQ6dyMMZ8OE5FEs/hrSr/T2VwC7XvZ7xC2A=,tag:jYWo2kgwwltKB+njiYaPkQ==,type:str]
+ unencrypted_suffix: _unencrypted
+ version: 3.13.3
diff --git a/modules/hosts/arcturus/config.nix b/modules/hosts/arcturus/config.nix
new file mode 100644
index 0000000..909cb96
--- /dev/null
+++ b/modules/hosts/arcturus/config.nix
@@ -0,0 +1,165 @@
+{ config, ... }:
+{
+ flake.modules.nixos.arcturus =
+ {
+ pkgs,
+ hostName,
+ userName,
+ ...
+ }@innerArgs:
+ {
+ imports = with config.flake.modules.nixos; [
+ boot
+ networking
+ virtualisation
+ services
+ ];
+
+ tnix = {
+ boot = {
+ secure-boot.enable = true;
+
+ impermanence = {
+ enable = true;
+
+ home = {
+ directories = [
+ "Distrobox"
+ ".bun"
+ ".config/sops"
+ ".local/share/nvim"
+ ".local/share/opencode"
+ ".local/share/zsh"
+ ".local/share/zoxide"
+ ".local/state/lazygit"
+ ];
+
+ files = [
+ ".wakatime.cfg"
+ ];
+ };
+ };
+ };
+
+ networking = {
+ openssh.enable = true;
+ netbird-client.enable = true;
+ newt = {
+ enable = true;
+ environmentFile = innerArgs.config.sops.secrets.newt.path;
+ };
+ };
+
+ services = {
+ hermes-agent = {
+ enable = true;
+ environmentFiles = [ innerArgs.config.sops.secrets.hermes.path ];
+ };
+
+ cyber-tux = {
+ enable = true;
+ environmentFile = innerArgs.config.sops.secrets.discord-token.path;
+ };
+
+ vaultwarden = {
+ enable = true;
+ domain = "bw.lab.tux.rs";
+ configurePangolin = true;
+ };
+
+ copyparty = {
+ enable = true;
+ domain = "files.lab.tux.rs";
+ accounts.${userName}.passwordFile = innerArgs.config.sops.secrets.copyparty.path;
+ volumes = {
+ "/" = {
+ path = "/var/lib/copyparty/data";
+ access = {
+ r = "*";
+ rwmdgGha = [ userName ];
+ };
+ };
+ };
+ configurePangolin = true;
+ };
+ };
+
+ virtualisation = {
+ docker.enable = true;
+ distrobox.enable = true;
+ };
+ };
+
+ sops.secrets = {
+ tux-password = {
+ sopsFile = ./secrets.yaml;
+ neededForUsers = true;
+ };
+
+ discord-token = {
+ sopsFile = ./secrets.yaml;
+ };
+
+ gemini-api-key = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+
+ openrouter-api-key = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+
+ opencode-go-api-key = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+
+ netbird-key = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+
+ newt = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+
+ copyparty = {
+ sopsFile = ./secrets.yaml;
+ owner = innerArgs.config.services.copyparty.user;
+ };
+
+ hermes = {
+ sopsFile = ./secrets.yaml;
+ };
+ };
+
+ # --- Networking ---
+ networking = {
+ hostName = hostName;
+ networkmanager = {
+ enable = true;
+ wifi.backend = "iwd";
+ };
+ wireless.iwd = {
+ enable = true;
+ settings = {
+ Network = {
+ EnableIPv6 = true;
+ };
+ Settings = {
+ AutoConnect = true;
+ };
+ };
+ };
+ firewall.enable = false;
+ };
+
+ environment.systemPackages = with pkgs; [
+ impala
+ ];
+
+ system.stateVersion = "26.05";
+ };
+}
diff --git a/modules/hosts/arcturus/disko.nix b/modules/hosts/arcturus/disko.nix
new file mode 100644
index 0000000..a426148
--- /dev/null
+++ b/modules/hosts/arcturus/disko.nix
@@ -0,0 +1,74 @@
+{ inputs, ... }:
+{
+ flake.modules.nixos.arcturus =
+ { config, lib, ... }:
+ let
+ hasOptinPersistence = config.tnix.boot.impermanence.enable;
+ in
+ {
+ imports = [
+ inputs.disko.nixosModules.disko
+ ];
+
+ disko.devices.disk.primary = {
+ device = "/dev/nvme0n1";
+ type = "disk";
+ content = {
+ type = "gpt";
+ partitions = {
+ ESP = {
+ size = "1G";
+ type = "EF00";
+ content = {
+ type = "filesystem";
+ format = "vfat";
+ mountpoint = "/boot";
+ mountOptions = [
+ "defaults"
+ "umask=0077"
+ ];
+ };
+ };
+ root = {
+ size = "100%";
+ type = "8300";
+ content = {
+ type = "btrfs";
+ # Base subvolumes that always exist
+ subvolumes = {
+ "/root" = {
+ mountOptions = [
+ "compress=zstd"
+ "noatime"
+ "space_cache=v2"
+ ];
+ mountpoint = "/";
+ };
+ "/nix" = {
+ mountOptions = [
+ "compress=zstd"
+ "noatime"
+ "noacl"
+ "space_cache=v2"
+ ];
+ mountpoint = "/nix";
+ };
+ }
+ # Conditionally merge /persist only when impermanence is enabled
+ // lib.optionalAttrs hasOptinPersistence {
+ "/persist" = {
+ mountOptions = [
+ "compress=zstd"
+ "noatime"
+ "space_cache=v2"
+ ];
+ mountpoint = "/persist";
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/modules/hosts/arcturus/hardware.nix b/modules/hosts/arcturus/hardware.nix
new file mode 100644
index 0000000..8648393
--- /dev/null
+++ b/modules/hosts/arcturus/hardware.nix
@@ -0,0 +1,36 @@
+{ config, ... }:
+{
+ flake.modules.nixos.arcturus =
+ {
+ lib,
+ pkgs,
+ system,
+ ...
+ }@innerArgs:
+ {
+ imports = with config.flake.modules.nixos; [
+ hardware
+ ];
+
+ boot.initrd.availableKernelModules = [
+ "nvme"
+ "xhci_pci"
+ "ahci"
+ "usbhid"
+ "usb_storage"
+ "sd_mod"
+ ];
+ boot.initrd.kernelModules = [ ];
+ boot.kernelModules = [ "kvm-amd" ];
+ boot.extraModulePackages = [ ];
+
+ hardware.cpu.amd.updateMicrocode = lib.mkDefault innerArgs.config.hardware.enableRedistributableFirmware;
+
+ networking.useDHCP = lib.mkDefault true;
+ nixpkgs.hostPlatform = lib.mkDefault system;
+
+ environment.systemPackages = with pkgs; [
+ nvtopPackages.amd
+ ];
+ };
+}
diff --git a/modules/hosts/arcturus/home.nix b/modules/hosts/arcturus/home.nix
new file mode 100644
index 0000000..d413830
--- /dev/null
+++ b/modules/hosts/arcturus/home.nix
@@ -0,0 +1,5 @@
+{
+ flake.modules.homeManager.arcturus = {
+ home.stateVersion = "26.05";
+ };
+}
diff --git a/modules/hosts/arcturus/secrets.yaml b/modules/hosts/arcturus/secrets.yaml
new file mode 100644
index 0000000..82d06b4
--- /dev/null
+++ b/modules/hosts/arcturus/secrets.yaml
@@ -0,0 +1,33 @@
+tux-password: ENC[AES256_GCM,data:eXg28pYQjIi5iPh4oHBOvIYQReM92T79uty/O461mEoLB8awr8ikq3RM7Mux3jZKM+Fk/Ow3NNG0F/154dZentodr1uvy9gD1g==,iv:nQevOumENveBMuiYMJF0OokORyjZCpR8ahTfOuj2Dzo=,tag:64zz8eVuw1OwTltfAUwWSg==,type:str]
+discord-token: ENC[AES256_GCM,data:uzxkrNRRplL/1MfvPZ/EL+I8UACuZQBHZ95BSHuxW0nBjxhr2F89D2BXTcKOBI9qO6uMjK5WBtWzSOw3y9EsngTTm/youIdkrIDLP3r/tkpOkLa/VjM=,iv:OxzFa0nEInV5uxgQFww11ZE1NorH5q130Tgp/6l9uOE=,tag:g4U9wLhPAkz72ktbQ8KrSg==,type:str]
+gemini-api-key: ENC[AES256_GCM,data:gLZSoYTdKY+rwIpYiXvN9n9PGkUD6q8Oe7dHnYkjEjwDf5qpjubg,iv:ySoNgQWTu9DjvbashF4ulyYP8fJUl4yrCTeBQ0jrGmw=,tag:FctubsQv50AP78JvTb9bpQ==,type:str]
+openrouter-api-key: ENC[AES256_GCM,data:6xONCl9lqOoO7b4CEyCz9607tICDUAkpglRjGS5nYq2ppg2UKqYTrWD1BGCA5Xfs/CWskniVhoNG3vscjKiYCCh9gbM6aqdmTQ==,iv:7Iwc9t00HOOBjA7URXcUO41badqYyJCkFHM/uPkLFxY=,tag:Cl39kitr2e0//HVwAdsdUQ==,type:str]
+opencode-go-api-key: ENC[AES256_GCM,data:dmeRKn7TWHnqvpyPQpcEG6yHTb2bRby/rh10ytL0jHj5R+lRmNVdmqUF92GTznY9vEaB6ZYCJecWhpm8g4upNfOWBg==,iv:9UMJpAlD8gpcNiN+liu3nawoAZQKapEg7sCp561N9E8=,tag:OZlASpOa5BQaQwFWjoLCRw==,type:str]
+netbird-key: ENC[AES256_GCM,data:q6eKisca04qn/CvALrvXF79MsToDhvLRLv2JTiUBAZglCC9m,iv:jj0/ZD7IDgopprTVUgSfJmdAJmUP3iqewU3dqssGYbk=,tag:6IPRdCm2FGdlTEIX7jt3qA==,type:str]
+copyparty: ENC[AES256_GCM,data:QXt8IgTekg9rzFyuzpg=,iv:vJYfHqCiheq290K9TGACHNHyOWzIn60j1Kz502SE27w=,tag:ECt7Wavlqw1V6zgXiRZtUg==,type:str]
+newt: ENC[AES256_GCM,data:r5Rd81ZrzrIYbXtFkypbJltoGCOYrW6P4IpwGCtaH7lqCg7wD/WMboMx13HN4Mm0J4qbBpDakpfVv9qUTrisYP1xwpKkmY1kqPlFWRZN8hzuuNS2Tv3qUjavTp5XGotVPLHj1Cg/cwGcf8EAssYTwTy7H0PgdQKwqigQD1f1s/j4iXQ=,iv:1xP38/Ayt1xvn2fJGa5zgOrVNOw2J5taG1Orx6uNgZI=,tag:H9JXu9gzyyvTPWgXaoTsiw==,type:str]
+hermes: ENC[AES256_GCM,data:9A2T2LIeVGo805k5E8wPHmqfjqQ6Dp7srQrVXHLsJRk+9N9bo2pMZUvAZm9FI89zPyK7tMnmLd56Jwf+W+mmQqbupnmN66jxOxOaB0MQ9/6/1oNHvaii337ed6fviLy6hx24pEOpY3OXwSEdNftwJqzc7YXLZK3UX8thhDDdxd0TSj3VUBd0ZHDWd4NpsgtjRRyVDBjHsnF0vzSZXtomithnHqeVHpp/jWPc+ZGrpnVvU8wxNMGLlDtr4A==,iv:dYCaTygVp1hqunPmBcNaYr7JxrdxfH1pcBE6B5HMgzk=,tag:/fddnR3n6+erzWF+m/bgGQ==,type:str]
+sops:
+ age:
+ - enc: |
+ -----BEGIN AGE ENCRYPTED FILE-----
+ YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA3Qkh0cmdHNGJTYmFNUFZW
+ c244RjlyNjlrSWh1bG1IRFFFeFZZVzhaYVdBCmd1N3JNS0IzWDlUMUJSM0pYdi9L
+ MzlHRk1pZ1hqaVdIYUQwczh2VDVtZE0KLS0tIEtRYWF6V0I3eDBZSnVmZ2R5S0Z5
+ Z3hhRitmdEwxbzcrS0cwNTZVK1lXYlUKSFfKk7JGzxRq9weL4NKJqfmAige2O+1T
+ 59PvEFKvvkGb6ajkzwTw0lB3UFzly6FuTnbSLY9r+oT9AMbxLoKdcQ==
+ -----END AGE ENCRYPTED FILE-----
+ recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4
+ - enc: |
+ -----BEGIN AGE ENCRYPTED FILE-----
+ YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBOYlZiak1CSW1NSGt5QTRi
+ RjlUeG5EODVkTVJDY1RrZXJ6OU5NQ0RIOG5jCnJxZ1R6MmlGWXY2SmtaY1pQSWdZ
+ UWp3L2h6c0k0MVpubE9BRSswUEk3ZkkKLS0tIGN4Zm1tcHBiKzAyYWNHVktVZmpU
+ V3h4dUZLcktrTUZvUm44eVZOWEl4VmMKMTvajoWcktb4jVIP4HyzQiR41Wg8Gdqi
+ TLKEYsPQgOJ7s8P9gw2uPUY6HRz86CtiC6EbO27u0+8BbI85x1QScg==
+ -----END AGE ENCRYPTED FILE-----
+ recipient: age1huqa3hc7wcxk4dpelrzny437nzrx4fnll3d8g9ahznzk268yju5qufapxy
+ lastmodified: "2026-08-12T13:48:51Z"
+ mac: ENC[AES256_GCM,data:0GyC8VW0qoPaIcKfGKto8wDF64gDmiIhczok8oiJ0l5B7+ZUCVAKmWkMaXHyrU7kqg06WSiIixsnclEjIMxlyZVBOcfQaXeSO51uom/ax+4CfzxSGxgnpySarWRfCHgkcGUeO/eci5MzmZPgAHy7b8IBcJWzVUCS7XBIMMyYwNs=,iv:yUsltZZ1y4fzi3Kakwt/ji/J+r/P1/3mLEQqZiN2pm4=,tag:6Fwo34LOX+jCXF9DoYUv/A==,type:str]
+ unencrypted_suffix: _unencrypted
+ version: 3.13.3
diff --git a/modules/hosts/canopus/config.nix b/modules/hosts/canopus/config.nix
new file mode 100644
index 0000000..fd23b52
--- /dev/null
+++ b/modules/hosts/canopus/config.nix
@@ -0,0 +1,139 @@
+{ config, ... }:
+{
+ flake.modules.nixos.canopus =
+ {
+ pkgs,
+ hostName,
+ userName,
+ ...
+ }:
+ {
+ imports = with config.flake.modules.nixos; [
+ boot
+ networking
+ desktop
+ gaming
+ virtualisation
+ ];
+
+ tnix = {
+ boot = {
+ secure-boot.enable = true;
+
+ impermanence = {
+ enable = true;
+
+ home = {
+ directories = [
+ "Distrobox"
+ ".steam"
+ ".bun"
+ ".cache/awww"
+ ".config/BraveSoftware"
+ ".config/zed"
+ ".config/Vencord"
+ ".config/vesktop"
+ ".config/sops"
+ ".config/obs-studio"
+ ".config/easyeffects"
+ ".config/DankMaterialShell"
+ ".local/share/Steam"
+ ".local/share/lutris"
+ ".local/share/net.lutris.Lutris"
+ ".local/share/nvim"
+ ".local/share/opencode"
+ ".local/share/zsh"
+ ".local/share/zoxide"
+ ".local/share/voxtype"
+ ".local/state/lazygit"
+ ".local/share/vicinae"
+ ".local/share/TelegramDesktop"
+ ".local/share/GalaxyBudsClient"
+ ];
+
+ files = [
+ ".wakatime.cfg"
+ ];
+ };
+ };
+ };
+
+ networking = {
+ openssh.enable = true;
+ netbird-client.enable = true;
+ };
+
+ virtualisation = {
+ docker.enable = true;
+ docker.nvidia.enable = false;
+ qemu.enable = true;
+ waydroid.enable = true;
+ distrobox.enable = true;
+ };
+ };
+
+ sops.secrets = {
+ tux-password = {
+ sopsFile = ./secrets.yaml;
+ neededForUsers = true;
+ };
+
+ gemini-api-key = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+
+ openrouter-api-key = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+
+ opencode-go-api-key = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+
+ netbird-key = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+
+ vicinae-json = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+ };
+
+ # --- Networking ---
+ networking = {
+ hostName = hostName;
+ networkmanager = {
+ enable = true;
+ wifi.backend = "iwd";
+ };
+ wireless.iwd = {
+ enable = true;
+ settings = {
+ Network = {
+ EnableIPv6 = true;
+ };
+ Settings = {
+ AutoConnect = true;
+ };
+ };
+ };
+ firewall.enable = false;
+ };
+
+ environment.systemPackages = with pkgs; [
+ davinci-resolve
+ telegram-desktop
+ galaxy-buds-client
+ impala
+ ];
+
+ # !!! DO NOT CHANGE THIS !!!
+ # This should match the version used at initial install.
+ system.stateVersion = "26.05";
+ };
+}
diff --git a/modules/hosts/canopus/disko.nix b/modules/hosts/canopus/disko.nix
new file mode 100644
index 0000000..ea9e61b
--- /dev/null
+++ b/modules/hosts/canopus/disko.nix
@@ -0,0 +1,82 @@
+{ inputs, ... }:
+{
+ flake.modules.nixos.canopus =
+ { config, lib, ... }:
+ let
+ hasOptinPersistence = config.tnix.boot.impermanence.enable;
+ in
+ {
+ imports = [
+ inputs.disko.nixosModules.disko
+ ];
+
+ disko.devices.disk.primary = {
+ device = "/dev/nvme0n1";
+ type = "disk";
+ content = {
+ type = "gpt";
+ partitions = {
+ ESP = {
+ size = "1G";
+ type = "EF00";
+ content = {
+ type = "filesystem";
+ format = "vfat";
+ mountpoint = "/boot";
+ mountOptions = [
+ "defaults"
+ "umask=0077"
+ ];
+ };
+ };
+ swap = {
+ size = "32G";
+ content = {
+ type = "swap";
+ discardPolicy = "both";
+ resumeDevice = true;
+ };
+ };
+ root = {
+ size = "100%";
+ type = "8300";
+ content = {
+ type = "btrfs";
+ # Base subvolumes that always exist
+ subvolumes = {
+ "/root" = {
+ mountOptions = [
+ "compress=zstd"
+ "noatime"
+ "space_cache=v2"
+ ];
+ mountpoint = "/";
+ };
+ "/nix" = {
+ mountOptions = [
+ "compress=zstd"
+ "noatime"
+ "noacl"
+ "space_cache=v2"
+ ];
+ mountpoint = "/nix";
+ };
+ }
+ # Conditionally merge /persist only when impermanence is enabled
+ // lib.optionalAttrs hasOptinPersistence {
+ "/persist" = {
+ mountOptions = [
+ "compress=zstd"
+ "noatime"
+ "space_cache=v2"
+ ];
+ mountpoint = "/persist";
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/modules/hosts/canopus/hardware.nix b/modules/hosts/canopus/hardware.nix
new file mode 100644
index 0000000..422e375
--- /dev/null
+++ b/modules/hosts/canopus/hardware.nix
@@ -0,0 +1,150 @@
+{ inputs, config, ... }:
+{
+ flake.modules.nixos.canopus =
+ {
+ lib,
+ pkgs,
+ system,
+ ...
+ }@innerArgs:
+ {
+ imports =
+ with config.flake.modules.nixos;
+ [
+ hardware
+ ]
+ ++ [
+ inputs.nixos-hardware.nixosModules.asus-zephyrus-ga503
+ inputs.cardwire.nixosModules.default
+ ];
+
+ boot.kernelParams = [ "nvidia-drm.modeset=1" ];
+ boot.initrd.availableKernelModules = [
+ "nvme"
+ "xhci_pci"
+ "ahci"
+ "usbhid"
+ "usb_storage"
+ "sd_mod"
+ ];
+ boot.initrd.kernelModules = [ ];
+ boot.kernelModules = [ "kvm-amd" ];
+ boot.extraModulePackages = [ ];
+
+ hardware = {
+ nvidia = {
+ modesetting.enable = true;
+ open = false;
+ nvidiaSettings = true;
+ };
+
+ cpu.amd.updateMicrocode = lib.mkDefault innerArgs.config.hardware.enableRedistributableFirmware;
+ };
+
+ services = {
+ xserver.videoDrivers = [ "nvidia" ];
+ power-profiles-daemon.enable = true;
+ upower.enable = true;
+
+ cardwire = {
+ enable = true;
+ settings = {
+ auto_apply_gpu_state = true;
+ experimental_nvidia_block = true;
+ battery_auto_switch = true;
+ battery_auto_switch_mode = "hybrid";
+ };
+ };
+
+ asusd = {
+ enable = true;
+ asusdConfig.text = ''
+ (
+ charge_control_end_threshold: 80,
+ disable_nvidia_powerd_on_battery: true,
+ ac_command: "",
+ bat_command: "",
+
+ platform_profile_linked_epp: true,
+ platform_profile_on_battery: Quiet,
+ platform_profile_on_ac: Performance,
+
+ change_platform_profile_on_battery: true,
+ change_platform_profile_on_ac: true,
+
+ profile_quiet_epp: Power,
+ profile_balanced_epp: BalancePower,
+ profile_custom_epp: Performance,
+ profile_performance_epp: Performance,
+
+ ac_profile_tunings: {},
+ dc_profile_tunings: {},
+ armoury_settings: {},
+ )
+ '';
+ profileConfig.text = ''
+ (
+ active_profile: Quiet,
+ )
+ '';
+ fanCurvesConfig.text = ''
+ (
+ profiles: (
+ balanced: [
+ (
+ fan: CPU,
+ pwm: (20, 40, 60, 85, 110, 140, 170, 200),
+ temp: (45, 55, 62, 68, 74, 80, 86, 92),
+ enabled: true,
+ ),
+ (
+ fan: GPU,
+ pwm: (20, 40, 60, 85, 110, 140, 170, 200),
+ temp: (45, 55, 62, 68, 74, 80, 86, 92),
+ enabled: true,
+ ),
+ ],
+ performance: [
+ (
+ fan: CPU,
+ pwm: (35, 60, 90, 120, 150, 180, 220, 255),
+ temp: (45, 55, 62, 68, 74, 80, 86, 92),
+ enabled: true,
+ ),
+ (
+ fan: GPU,
+ pwm: (35, 60, 90, 120, 150, 180, 220, 255),
+ temp: (45, 55, 62, 68, 74, 80, 86, 92),
+ enabled: true,
+ ),
+ ],
+ quiet: [
+ (
+ fan: CPU,
+ pwm: (0, 10, 20, 35, 55, 80, 110, 140),
+ temp: (45, 55, 62, 68, 74, 80, 86, 92),
+ enabled: true,
+ ),
+ (
+ fan: GPU,
+ pwm: (0, 10, 20, 35, 55, 80, 110, 140),
+ temp: (45, 55, 62, 68, 74, 80, 86, 92),
+ enabled: true,
+ ),
+ ],
+ custom: [],
+ ),
+ )
+ '';
+ };
+ };
+
+ networking.useDHCP = lib.mkDefault true;
+ nixpkgs.config.cudaSupport = true;
+ nixpkgs.hostPlatform = lib.mkDefault system;
+
+ environment.systemPackages = with pkgs; [
+ nvtopPackages.full
+ ];
+ };
+}
diff --git a/modules/hosts/canopus/home.nix b/modules/hosts/canopus/home.nix
new file mode 100644
index 0000000..c9bd1dc
--- /dev/null
+++ b/modules/hosts/canopus/home.nix
@@ -0,0 +1,87 @@
+{ config, ... }:
+{
+ flake.modules.homeManager.canopus = { pkgs, ... }: {
+ imports = with config.flake.modules.homeManager; [
+ desktop
+ ];
+
+ tnix = {
+ desktop = {
+ mangowm = {
+ enable = true;
+ monitorRule = [
+ "name:eDP-1, width:2560, height:1440, refresh:165, x:0, y:0, vrr:1"
+ ];
+
+ tagRule = [
+ "id:1, layout_name:tile"
+ "id:2, layout_name:tile"
+ "id:3, layout_name:tile"
+ "id:4, layout_name:tile"
+ "id:5, layout_name:scroller"
+ ];
+ };
+ };
+
+ services.lan-mouse = {
+ enable = true;
+ settings = {
+ authorized_fingerprints = {
+ "f4:4b:17:61:f7:01:a4:a2:e1:c7:8c:1c:7a:f3:8b:87:14:3d:05:3d:a0:8b:cc:e7:88:d8:d8:d2:a4:c2:75:8b" =
+ "sirius";
+ };
+ };
+ };
+ };
+
+ home.packages = with pkgs; [
+ (writeShellScriptBin "mirror-display" ''
+ hyprctl eval 'hl.monitor({
+ output = "eDP-1",
+ mode = "2560x1440@165",
+ position = "0x0",
+ scale = "1",
+ disabled = false
+ })' &&
+ hyprctl eval 'hl.monitor({
+ output = "HDMI-A-1",
+ mode = "preferred",
+ position = "auto",
+ scale = "1",
+ mirror = "eDP-1"
+ })'
+ '')
+ (writeShellScriptBin "extend-display" ''
+ hyprctl eval 'hl.monitor({
+ output = "eDP-1",
+ mode = "2560x1440@165",
+ position = "0x0",
+ scale = "1",
+ disabled = false
+ })' &&
+ hyprctl eval 'hl.monitor({
+ output = "HDMI-A-1",
+ mode = "preferred",
+ position = "0x-1440",
+ scale = "1",
+ mirror = ""
+ })'
+ '')
+ (writeShellScriptBin "dock-display" ''
+ hyprctl eval 'hl.monitor({
+ output = "eDP-1",
+ disabled = true
+ })' &&
+ hyprctl eval 'hl.monitor({
+ output = "HDMI-A-1",
+ mode = "preferred",
+ position = "0x0",
+ scale = "1",
+ mirror = ""
+ })'
+ '')
+ ];
+
+ home.stateVersion = "26.05";
+ };
+}
diff --git a/modules/hosts/canopus/secrets.yaml b/modules/hosts/canopus/secrets.yaml
new file mode 100644
index 0000000..8877a0a
--- /dev/null
+++ b/modules/hosts/canopus/secrets.yaml
@@ -0,0 +1,30 @@
+tux-password: ENC[AES256_GCM,data:Xb4/JMAZCBnBheDCJdRRGXLnMJ1ej8HbN+AUqA/+2sdYESKeF1PFny4Iq2kqvzdK4D3mp+pdjd7GAGfJp4M7sOcvI3V/coyxPQ==,iv:h+S+MEwHj22uHaTzFoxGZtefNUAQNp3fbU+QRfgtKvQ=,tag:VHrIEIQivPFTfhmm7dWEyQ==,type:str]
+gemini-api-key: ENC[AES256_GCM,data:Q6+actg0oyUWiUJVy/9yZmea1QyGu2o8LfMsuAVFD6k7kp0dYIrl,iv:ukyouqrHxzVpBBE98KL6PW8P3j+seemm/e0Gl1urUcM=,tag:Z7MM3dJ414CmdxE72cdzNA==,type:str]
+openrouter-api-key: ENC[AES256_GCM,data:SalhWKR6artX/kOVKZGpKSmrgsQDU/heshrdkK3wotOZ3BRn/ZqZRBldvl1JPSenMAMvE2LWUdmBQmwG/id7L7JL1O/+lUHIQw==,iv:hLlHayFJgUkWOirVLfqP0pGRBZAqGKe+EE2yG1ELGNk=,tag:0qoo0tb+xWjjQXr4n1qGmw==,type:str]
+opencode-go-api-key: ENC[AES256_GCM,data:zbeTcaXJZFVfYnM/7sgblJFU9WfeosX/44KsXvrzKwiLPfGLLYYo9AFaCvWzzG6jHuSZC5OYrBWfOZv4+3omfCgglQ==,iv:LscUQE+PNhXGim9PSqc9nZIZichWSgAn/zsNxQ/HM/o=,tag:MaBCobnRM42fopiibibe5Q==,type:str]
+netbird-key: ENC[AES256_GCM,data:swmaa+RjxeUmEl8hS2riGrW4lP5jdks9HM3x57/FLpOuqFtR,iv:MrpVjiocrPi+dBGPk7pwgSUNlJ1eryRpMjC8+jkU+T0=,tag:j6sqpQ02apqc6FwkdDvk9g==,type:str]
+vicinae-json: ENC[AES256_GCM,data:FarBf6l8pl3hF7kGKPIWztUhwiKoQXmyTufCuJ120K/bPh1Bfiyi+ETt4DLYOGI6FJXfpVz4BbZOA29bXTLhVPxH0QtyBu/F5uEqA015b/c8VevDJSyy9huR13qO9ksLbMBt8RfWbAd9j26t7A1C8/mMyiJOEXCCTV9CEIW3xWrsYmhwsT8RYM+PwrPSeN1gQXHSMyRUjf/kOdJoda8+iXpLfjo4II4r2ELpbqi8QxhrRdsJsoOfAymFM784NtlTjE+h6S4TMehmoF/9ARif6I5SGQ0WfIKt/8orTGCPllL+NupLziSnpIGRGSybdArD+o5NCw59GOAbVRADxq8rCESwEkq3cF+hm8HabfYbiQ==,iv:Y/hXLFTJT3gNF3B6tgKoAh7njVuneoUzjVTlsCZiySw=,tag:2hfrwph6IccJdRu/yGu3XA==,type:str]
+sops:
+ age:
+ - recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4
+ enc: |
+ -----BEGIN AGE ENCRYPTED FILE-----
+ YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqS2RZdVJaNTlRamZPMkll
+ MDRVSVl1b2x2LzZpdlBrdmZtdyt3UE15RldRCldXUXE2a1BFeHg5NGNPbW5IMDht
+ cHN1QituOU9uWFQwNS9udzNEbVhtUjQKLS0tIEtkTXhlYS9XSUlQRTY1eXBjeXZQ
+ bThQTFdZU29ISm93TWcwVk5ZTkhRWm8KCcprmLGhahgDkXCBpzjctHgao+gc+rKC
+ xLIwheUyFJOGK+ixqcdoZ/PC0kY68hVLt1YzLAyxFi4Ur1wltPrNug==
+ -----END AGE ENCRYPTED FILE-----
+ - recipient: age1x36yr8h993srfj29sfpzt4wyz52nztvncpmhgmfs0j26qvfecq3qvcm0an
+ enc: |
+ -----BEGIN AGE ENCRYPTED FILE-----
+ YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGVW13WFE1Ylh3Uk1HNU1i
+ bU9kRzFqTmhkQlRzMlRkM0VhMlNmMDUyK25NCkZYUStxM2tScGozRXJGekxGa1RX
+ b1VXK0Y2Z1U0YU9XRmxRUWdWem50L1EKLS0tIFovcHRlZ1JJd2lRN0RFbHdCdm9m
+ V1N3eUVjZ0VZRjBZdXRPNng3Y3JoUTAKQau9CG9XfvM+5JZVRwaJr/o/sXMaJiy2
+ wo2YcDb+4vfT4Wr+/8J3ccQgbLRZH916X5ZPL+A+nFyVXVKOCl3ENg==
+ -----END AGE ENCRYPTED FILE-----
+ lastmodified: "2026-05-12T06:33:00Z"
+ mac: ENC[AES256_GCM,data:htDJdEx34Q5NG8vwbBimnFENZawbLZ4FC0DkyG6J5RYP0BFnycKcKGsYR87SvIjcJZXvfZ0e6fXdtc78dd6I0sQtrQ7aNn4Iktbu/AkPmntsBwpIjVI99X9zUyQB87go/oX15yuyt8loB6ds2RkL/pfFsgLbFc10JHsBy+WcEzI=,iv:HvY+5LYzyHpRm8XCSKrN8ra/LJT9v23TPSsZg/4QVNU=,tag:k+d45+zgBYq4vlWmmc8ZkQ==,type:str]
+ unencrypted_suffix: _unencrypted
+ version: 3.12.2
diff --git a/modules/hosts/sirius/config.nix b/modules/hosts/sirius/config.nix
new file mode 100644
index 0000000..1d67aa1
--- /dev/null
+++ b/modules/hosts/sirius/config.nix
@@ -0,0 +1,138 @@
+{ config, ... }:
+{
+ flake.modules.nixos.sirius =
+ {
+ pkgs,
+ hostName,
+ userName,
+ ...
+ }:
+ {
+ imports = with config.flake.modules.nixos; [
+ boot
+ networking
+ desktop
+ gaming
+ virtualisation
+ ];
+
+ tnix = {
+ boot = {
+ secure-boot.enable = true;
+
+ impermanence = {
+ enable = true;
+
+ home = {
+ directories = [
+ "Distrobox"
+ ".bun"
+ ".steam"
+ ".cache/awww"
+ ".config/BraveSoftware"
+ ".config/zed"
+ ".config/Vencord"
+ ".config/vesktop"
+ ".config/sops"
+ ".config/obs-studio"
+ ".config/easyeffects"
+ ".config/DankMaterialShell"
+ ".local/share/Steam"
+ ".local/share/lutris"
+ ".local/share/net.lutris.Lutris"
+ ".local/share/nvim"
+ ".local/share/opencode"
+ ".local/share/zsh"
+ ".local/share/zoxide"
+ ".local/share/voxtype"
+ ".local/state/lazygit"
+ ".local/share/vicinae"
+ ".local/share/TelegramDesktop"
+ ];
+
+ files = [
+ ".wakatime.cfg"
+ ".config/lan-mouse/lan-mouse.pem"
+ ];
+ };
+ };
+ };
+
+ networking = {
+ openssh.enable = true;
+ netbird-client.enable = true;
+ };
+
+ virtualisation = {
+ docker.enable = true;
+ docker.nvidia.enable = true;
+ qemu.enable = true;
+ waydroid.enable = true;
+ distrobox.enable = true;
+ };
+ };
+
+ sops.secrets = {
+ tux-password = {
+ sopsFile = ./secrets.yaml;
+ neededForUsers = true;
+ };
+
+ gemini-api-key = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+
+ openrouter-api-key = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+
+ opencode-go-api-key = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+
+ netbird-key = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+
+ vicinae-json = {
+ sopsFile = ./secrets.yaml;
+ owner = userName;
+ };
+ };
+
+ # --- Networking ---
+ networking = {
+ hostName = hostName;
+ networkmanager = {
+ enable = true;
+ wifi.backend = "iwd";
+ };
+ wireless.iwd = {
+ enable = true;
+ settings = {
+ Network = {
+ EnableIPv6 = true;
+ };
+ Settings = {
+ AutoConnect = true;
+ };
+ };
+ };
+ firewall.enable = false;
+ };
+
+ environment.systemPackages = with pkgs; [
+ davinci-resolve
+ telegram-desktop
+ impala
+ ];
+
+ # !!! DO NOT CHANGE THIS !!!
+ # This should match the version used at initial install.
+ system.stateVersion = "26.05";
+ };
+}
diff --git a/modules/hosts/sirius/disko.nix b/modules/hosts/sirius/disko.nix
new file mode 100644
index 0000000..7704fb5
--- /dev/null
+++ b/modules/hosts/sirius/disko.nix
@@ -0,0 +1,82 @@
+{ inputs, ... }:
+{
+ flake.modules.nixos.sirius =
+ { config, lib, ... }:
+ let
+ hasOptinPersistence = config.tnix.boot.impermanence.enable;
+ in
+ {
+ imports = [
+ inputs.disko.nixosModules.disko
+ ];
+
+ disko.devices.disk.primary = {
+ device = "/dev/nvme1n1";
+ type = "disk";
+ content = {
+ type = "gpt";
+ partitions = {
+ ESP = {
+ size = "1G";
+ type = "EF00";
+ content = {
+ type = "filesystem";
+ format = "vfat";
+ mountpoint = "/boot";
+ mountOptions = [
+ "defaults"
+ "umask=0077"
+ ];
+ };
+ };
+ swap = {
+ size = "70G";
+ content = {
+ type = "swap";
+ discardPolicy = "both";
+ resumeDevice = true;
+ };
+ };
+ root = {
+ size = "100%";
+ type = "8300";
+ content = {
+ type = "btrfs";
+ # Base subvolumes that always exist
+ subvolumes = {
+ "/root" = {
+ mountOptions = [
+ "compress=zstd"
+ "noatime"
+ "space_cache=v2"
+ ];
+ mountpoint = "/";
+ };
+ "/nix" = {
+ mountOptions = [
+ "compress=zstd"
+ "noatime"
+ "noacl"
+ "space_cache=v2"
+ ];
+ mountpoint = "/nix";
+ };
+ }
+ # Conditionally merge /persist only when impermanence is enabled
+ // lib.optionalAttrs hasOptinPersistence {
+ "/persist" = {
+ mountOptions = [
+ "compress=zstd"
+ "noatime"
+ "space_cache=v2"
+ ];
+ mountpoint = "/persist";
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/modules/hosts/sirius/hardware.nix b/modules/hosts/sirius/hardware.nix
new file mode 100644
index 0000000..313e615
--- /dev/null
+++ b/modules/hosts/sirius/hardware.nix
@@ -0,0 +1,61 @@
+{ inputs, config, ... }:
+{
+ flake.modules.nixos.sirius =
+ {
+ lib,
+ pkgs,
+ system,
+ ...
+ }@innerArgs:
+ {
+ imports =
+ with config.flake.modules.nixos;
+ [
+ hardware
+ ]
+ ++ [
+ inputs.cardwire.nixosModules.default
+ ];
+
+ boot.kernelParams = [ "nvidia-drm.modeset=1" ];
+ boot.initrd.availableKernelModules = [
+ "nvme"
+ "xhci_pci"
+ "ahci"
+ "usbhid"
+ "usb_storage"
+ "sd_mod"
+ ];
+ boot.initrd.kernelModules = [ ];
+ boot.kernelModules = [ "kvm-amd" ];
+ boot.extraModulePackages = [ ];
+
+ hardware = {
+ nvidia = {
+ modesetting.enable = true;
+ open = false;
+ nvidiaSettings = true;
+ };
+
+ cpu.amd.updateMicrocode = lib.mkDefault innerArgs.config.hardware.enableRedistributableFirmware;
+ };
+
+ services = {
+ xserver.videoDrivers = [ "nvidia" ];
+ power-profiles-daemon.enable = true;
+
+ cardwire = {
+ enable = true;
+ settings.auto_apply_gpu_state = true;
+ };
+ };
+
+ networking.useDHCP = lib.mkDefault true;
+ nixpkgs.config.cudaSupport = true;
+ nixpkgs.hostPlatform = lib.mkDefault system;
+
+ environment.systemPackages = with pkgs; [
+ nvtopPackages.full
+ ];
+ };
+}
diff --git a/modules/hosts/sirius/home.nix b/modules/hosts/sirius/home.nix
new file mode 100644
index 0000000..143d2f0
--- /dev/null
+++ b/modules/hosts/sirius/home.nix
@@ -0,0 +1,57 @@
+{ config, ... }:
+{
+ flake.modules.homeManager.sirius = {
+ imports = with config.flake.modules.homeManager; [
+ desktop
+ ];
+
+ tnix = {
+ desktop = {
+ mangowm = {
+ enable = true;
+ monitorRule = [
+ "name:DP-2, width:1440, height:2560, refresh:144, x:0, y:0, vrr:0, rr:1"
+ "name:DP-3, width:2560, height:1440, refresh:144, x:1440, y:0, vrr:0"
+ "name:DP-1, width:1080, height:1920, refresh:144, x:4000, y:0, vrr:0, rr:3"
+ ];
+
+ tagRule = [
+ "id:1, layout_name:vertical_tile, monitor_name:DP-2, no_hide:1"
+ "id:2, layout_name:vertical_tile, monitor_name:DP-2, no_hide:1"
+ "id:3, layout_name:vertical_tile, monitor_name:DP-2, no_hide:1"
+ "id:4, layout_name:vertical_tile, monitor_name:DP-2, no_hide:1"
+ "id:5, layout_name:vertical_tile, monitor_name:DP-2, no_hide:1"
+
+ "id:1, layout_name:tile, monitor_name:DP-3, no_hide:1"
+ "id:2, layout_name:tile, monitor_name:DP-3, no_hide:1"
+ "id:3, layout_name:tile, monitor_name:DP-3, no_hide:1"
+ "id:4, layout_name:tile, monitor_name:DP-3, no_hide:1"
+ "id:5, layout_name:tile, monitor_name:DP-3, no_hide:1"
+
+ "id:1, layout_name:vertical_tile, monitor_name:DP-1, no_hide:1"
+ "id:2, layout_name:vertical_tile, monitor_name:DP-1, no_hide:1"
+ "id:3, layout_name:vertical_tile, monitor_name:DP-1, no_hide:1"
+ "id:4, layout_name:vertical_tile, monitor_name:DP-1, no_hide:1"
+ "id:5, layout_name:vertical_tile, monitor_name:DP-1, no_hide:1"
+ ];
+ };
+ };
+
+ services.lan-mouse = {
+ enable = true;
+ settings = {
+ clients = [
+ {
+ position = "bottom";
+ hostname = "canopus";
+ activate_on_startup = true;
+ ips = [ "192.168.8.2" ];
+ }
+ ];
+ };
+ };
+ };
+
+ home.stateVersion = "26.05";
+ };
+}
diff --git a/modules/hosts/sirius/secrets.yaml b/modules/hosts/sirius/secrets.yaml
new file mode 100644
index 0000000..b5448d8
--- /dev/null
+++ b/modules/hosts/sirius/secrets.yaml
@@ -0,0 +1,30 @@
+tux-password: ENC[AES256_GCM,data:JWQVd2MYX2U4UP4II62ixG9hWI5MtgHAFhl8aCmyrYPl1H/ig9ZYqfTiggJsOoXM9CUHmhUTrSWw7xRvbzztBrC7L4ABcWPbrQ==,iv:wY/RNJs7XaCsHHNX2MLBqzAgDCSo4rht10oiKrUlTHo=,tag:DcADVtEJs2KCeNS6AhO0SQ==,type:str]
+gemini-api-key: ENC[AES256_GCM,data:Y9YgXp/tB3Q1Rb5YMsZLgWCq+bdeIjsXAVeO3Yh7nZ8MwDH7d5De,iv:FIXxJCn6JDYsHIoNn8f8Un3z9ZPVbxdjR48Ux88poRg=,tag:bMJ4i69HTspnhzsrsxkbrw==,type:str]
+openrouter-api-key: ENC[AES256_GCM,data:HfZgZz4NyCLLM9woTZp2I6JGOlVcFblw2OMjx8k0TG5ZU2ycBCF6bKqp3wFibUxXcHy+nIfjI82fkLeSyIaGILRLYCJCc8BHKw==,iv:umUcn8MRaj7JXo6IFrGMXOu+jsFSCEikMxsQxfaFS/Q=,tag:l2s61C4EpJoKv8cc9nYGFA==,type:str]
+opencode-go-api-key: ENC[AES256_GCM,data:BGERcZg5Jpnznc4cXeYFMhPk9kKBkd9GvIuQBV9TW3JE1utgrLLYK6mKNCQqrEStRFiO2jUUnBm3opUNL4SuEHFLpw==,iv:fgFAwx6z9yruK27PvAJX/Q2CS9gU+LJ5zMUK/f/rzpo=,tag:BPu3M+jppPB8sLoLmfuY/Q==,type:str]
+netbird-key: ENC[AES256_GCM,data:qXAnRnLM2TlzpOvWG4exJv0+pUvpe0FpRN5xOWx3+KNt+yhq,iv:X+yl4o1RSYMCMWdVXo1hpzy+6IdKXUpsKPtYNSiHiCY=,tag:I8HbnD5iw6EJ1TdsNrhvfw==,type:str]
+vicinae-json: ENC[AES256_GCM,data:JjxolEgS6uakqR4eHOx3VyrOO5kaL4dj1jcEiLWsrktCU32UB7OmP1kJEVomA1rZjODpFHL89+FRpcNFspTFrc365WlANE81RLg/M2Ja1MiLYaDFNcBGtqMX9Yc1muor53Xl7t+rTSvDIj1oE1L7xPPcjCLfwC5QDzJjCBWj9FhCxnU5BwvoJNv9vgA6xnkzAOYSPZK/ihULMD0DxyqOUEa5ECGX62OPM9Gbr7jEviaItYzOOxaRs/yQVqizodGGl/BcK6fPqvOYSxip9ABYRVSI9ZvysY7ofAkeX91ardPwVG5VvEYfxZwBvGFjV7ZfTzVkK+BiUUNrvciAETHqwkjHftPpfJjxWsgLr8lbOA==,iv:HjDE/sqVDnxeww7r2upxH57rc1+LpuMKnhhyGXoc1Ms=,tag:d2kZeWkg17eVoNACIQ3Q9A==,type:str]
+sops:
+ age:
+ - recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4
+ enc: |
+ -----BEGIN AGE ENCRYPTED FILE-----
+ YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBQNGdHcDc4bTFkR0EyZlUr
+ eXovR1lyeTZJTDg5R281MFFuMHVwOXZXYzNvCkpIT1g3K05WUUswaEVjVVJWQkJq
+ V20xODdoWlJMY3ZCcGo0czU1TXZFRE0KLS0tIGNTeXV2Mld2STRmRnFaM1MzT3Nk
+ Z0JwWWR0STUybjVhSXdDR3NiKzV1eDQK22HmMuyqYaR/eGuALkAPB1Y5bN2KwIt3
+ pamM8vbnjB//hXoyrv4vsoDk9WzLGFGjgiw2qsM2HQgzQqtrwF1/1A==
+ -----END AGE ENCRYPTED FILE-----
+ - recipient: age1maxsx5tq2h3d92rfyl8ekcdan5gu5cpch4qs3c56cu7qag02xgvs3h0gqc
+ enc: |
+ -----BEGIN AGE ENCRYPTED FILE-----
+ YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA1N3ZBd1pHODFtZkZxaHNP
+ OXlXUzVFS0ZIam1IWVkxNldOdTEwY0s4aUNZCjVlcnF1aXJxUUlQSXhteXJ6OU1W
+ L0crZzJOaHF2SnVhWVZnVEdqRlR0cjgKLS0tIFlFWHhaR3U2QTNxRGZRMnk3cmll
+ M3JocWZJeXFxenhXOENBVWpvNkd3bm8KqhNLzCyEAI643jGWpZF/uTchHmBj8ozU
+ HtpOzKsshif66D0XOHeJQfQamJI4TyKsj3Sk3j9rstsLmN2lxTRGHg==
+ -----END AGE ENCRYPTED FILE-----
+ lastmodified: "2026-05-10T00:35:50Z"
+ mac: ENC[AES256_GCM,data:u27zQ1PPnWy5Parbh/1DkVP3ICmHnLZJKaLbN3dZEVONgqOWi32LV3t0iNhtLWwVnzFPBusRWahQiqAkUdnQtrXF0OtjPCpLuIw86xB75QPGbet0GZlLNb8/xPshChZe4v520csdJMWiy3vYeKrk8LxMSViAGhmhYK2a5NbGhzI=,iv:/9vePmvCNqoP0kx24fP3HfCjS2FkjBmI5B+SycvKKW4=,tag:gE1/DnLolwhoyfMJYejGIQ==,type:str]
+ unencrypted_suffix: _unencrypted
+ version: 3.12.2
diff --git a/modules/hosts/vega/config.nix b/modules/hosts/vega/config.nix
new file mode 100644
index 0000000..d115df5
--- /dev/null
+++ b/modules/hosts/vega/config.nix
@@ -0,0 +1,56 @@
+{ config, ... }:
+{
+ flake.modules.nixOnDroid.vega =
+ {
+ pkgs,
+ userEmail,
+ ...
+ }:
+ {
+ imports = with config.flake.modules.nixOnDroid; [
+ networking
+ ];
+
+ # @TODO: Broken currently
+ # android-integration.am.enable = true;
+ # android-integration.termux-open-url.enable = true;
+ # android-integration.xdg-open.enable = true;
+ # android-integration.termux-setup-storage.enable = true;
+ # android-integration.termux-reload-settings.enable = true;
+
+ terminal.font =
+ let
+ firacode = pkgs.nerd-fonts.fira-code;
+ fontPath = "share/fonts/truetype/NerdFonts/FiraCode/FiraCodeNerdFont-Regular.ttf";
+ in
+ "${firacode}/${fontPath}";
+
+ time.timeZone = "Asia/Kolkata";
+
+ tnix.networking.openssh = {
+ enable = true;
+ ports = [ 8033 ];
+ authorizedKeys = [
+ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL+OzPUe2ECPC929DqpkM39tl/vdNAXfsRnmrGfR+X3D ${userEmail}"
+ ];
+ };
+
+ user = {
+ uid = 10481;
+ gid = 10481;
+ shell = "${pkgs.zsh}/bin/zsh";
+ };
+
+ environment.etcBackupExtension = ".backup";
+ environment.motd = "";
+ environment.packages = with pkgs; [
+ ncurses
+ procps
+ util-linux
+ rsync
+ gnutar
+ ];
+
+ system.stateVersion = "24.05";
+ };
+}
diff --git a/modules/hosts/vega/home.nix b/modules/hosts/vega/home.nix
new file mode 100644
index 0000000..8d219c1
--- /dev/null
+++ b/modules/hosts/vega/home.nix
@@ -0,0 +1,9 @@
+{ lib, ... }:
+{
+ flake.modules.homeManager.vega = {
+ # @TODO: Broken currently - By default it's enabled by neovim module
+ programs.vim.enable = lib.mkForce false;
+
+ home.stateVersion = "26.05";
+ };
+}
diff --git a/modules/hosts/vps/config.nix b/modules/hosts/vps/config.nix
new file mode 100644
index 0000000..ac29c61
--- /dev/null
+++ b/modules/hosts/vps/config.nix
@@ -0,0 +1,50 @@
+{ config, ... }:
+{
+ flake.modules.nixos.vps =
+ {
+ hostName,
+ ...
+ }:
+ {
+ imports = with config.flake.modules.nixos; [
+ boot
+ networking
+ virtualisation
+ services
+ ];
+
+ tnix = {
+ boot = {
+ legacy.enable = true;
+
+ impermanence = {
+ enable = true;
+
+ home = {
+ directories = [
+ ".local/share/nvim"
+ ".local/share/zsh"
+ ".local/share/zoxide"
+ ".local/state/lazygit"
+ ];
+ };
+ };
+ };
+
+ networking.openssh.enable = true;
+
+ virtualisation = {
+ docker.enable = true;
+ };
+ };
+
+ # --- Networking ---
+ networking = {
+ hostName = hostName;
+ networkmanager.enable = true;
+ firewall.enable = false;
+ };
+
+ system.stateVersion = "26.05";
+ };
+}
diff --git a/modules/hosts/vps/disko.nix b/modules/hosts/vps/disko.nix
new file mode 100644
index 0000000..f6dccaa
--- /dev/null
+++ b/modules/hosts/vps/disko.nix
@@ -0,0 +1,82 @@
+{ inputs, ... }:
+{
+ flake.modules.nixos.vps =
+ { config, lib, ... }:
+ let
+ hasOptinPersistence = config.tnix.boot.impermanence.enable;
+ isLegacy = config.tnix.boot.legacy.enable;
+ in
+ {
+ imports = [
+ inputs.disko.nixosModules.disko
+ ];
+
+ disko.devices.disk.primary = {
+ device = "/dev/sda";
+ type = "disk";
+ content = {
+ type = "gpt";
+ partitions = {
+ ESP = {
+ size = "1G";
+ type = "EF00";
+ content = {
+ type = "filesystem";
+ format = "vfat";
+ mountpoint = "/boot";
+ mountOptions = [
+ "defaults"
+ "umask=0077"
+ ];
+ };
+ };
+ root = {
+ size = "100%";
+ type = "8300";
+ content = {
+ type = "btrfs";
+ # Base subvolumes that always exist
+ subvolumes = {
+ "/root" = {
+ mountOptions = [
+ "compress=zstd"
+ "noatime"
+ "space_cache=v2"
+ ];
+ mountpoint = "/";
+ };
+ "/nix" = {
+ mountOptions = [
+ "compress=zstd"
+ "noatime"
+ "noacl"
+ "space_cache=v2"
+ ];
+ mountpoint = "/nix";
+ };
+ }
+ # Conditionally merge /persist only when impermanence is enabled
+ // lib.optionalAttrs hasOptinPersistence {
+ "/persist" = {
+ mountOptions = [
+ "compress=zstd"
+ "noatime"
+ "space_cache=v2"
+ ];
+ mountpoint = "/persist";
+ };
+ };
+ };
+ };
+ }
+ // lib.optionalAttrs isLegacy {
+ boot = {
+ name = "boot";
+ size = "1M";
+ type = "EF02";
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/modules/hosts/vps/hardware.nix b/modules/hosts/vps/hardware.nix
new file mode 100644
index 0000000..0dbbb22
--- /dev/null
+++ b/modules/hosts/vps/hardware.nix
@@ -0,0 +1,17 @@
+{
+ flake.modules.nixos.vps =
+ {
+ lib,
+ modulesPath,
+ system,
+ ...
+ }:
+ {
+ imports = [
+ (modulesPath + "/profiles/qemu-guest.nix")
+ ];
+
+ networking.useDHCP = lib.mkDefault true;
+ nixpkgs.hostPlatform = lib.mkDefault system;
+ };
+}
diff --git a/modules/hosts/vps/home.nix b/modules/hosts/vps/home.nix
new file mode 100644
index 0000000..10ce823
--- /dev/null
+++ b/modules/hosts/vps/home.nix
@@ -0,0 +1,5 @@
+{
+ flake.modules.homeManager.vps = {
+ home.stateVersion = "26.05";
+ };
+}
diff --git a/modules/nixos/boot/impermanence.nix b/modules/nixos/boot/impermanence.nix
new file mode 100644
index 0000000..46c97e1
--- /dev/null
+++ b/modules/nixos/boot/impermanence.nix
@@ -0,0 +1,122 @@
+{ inputs, ... }:
+{
+ flake.modules.nixos.boot =
+ {
+ config,
+ lib,
+ userName,
+ ...
+ }:
+ let
+ cfg = config.tnix.boot;
+ in
+ {
+ imports = [
+ inputs.impermanence.nixosModules.impermanence
+ ];
+
+ options.tnix.boot.impermanence = {
+ enable = lib.mkEnableOption "Enable impermanence";
+
+ directories = lib.mkOption {
+ type = lib.types.listOf lib.types.str;
+ default = [ ];
+ };
+
+ files = lib.mkOption {
+ type = lib.types.listOf lib.types.str;
+ default = [ ];
+ };
+ };
+
+ options.tnix.boot.impermanence.home = {
+ directories = lib.mkOption {
+ type = lib.types.listOf lib.types.str;
+ default = [ ];
+ };
+
+ files = lib.mkOption {
+ type = lib.types.listOf lib.types.str;
+ default = [ ];
+ };
+ };
+
+ config = lib.mkIf cfg.impermanence.enable {
+ programs.fuse.userAllowOther = true;
+ fileSystems."/persist".neededForBoot = true;
+ environment.persistence."/persist" = {
+ hideMounts = true;
+ directories = [
+ "/var/log"
+ "/var/lib"
+ "/etc/NetworkManager/system-connections"
+ ]
+ ++ cfg.impermanence.directories;
+
+ files = [
+ "/etc/machine-id"
+ "/etc/ssh/ssh_host_ed25519_key"
+ "/etc/ssh/ssh_host_ed25519_key.pub"
+ "/etc/ssh/ssh_host_rsa_key"
+ "/etc/ssh/ssh_host_rsa_key.pub"
+ ]
+ ++ cfg.impermanence.files;
+ };
+
+ home-manager.users.${userName} = {
+ home.persistence."/persist" = {
+ directories = [
+ "Downloads"
+ "Music"
+ "Wallpapers"
+ "Documents"
+ "Videos"
+ "Projects"
+ "Stuff"
+ ".ssh"
+ ]
+ ++ cfg.impermanence.home.directories;
+
+ files = cfg.impermanence.home.files;
+ };
+ };
+
+ boot.initrd.systemd = {
+ enable = true;
+
+ services.wipe-my-fs = {
+ wantedBy = [ "initrd.target" ];
+ after = [ "initrd-root-device.target" ];
+ before = [ "sysroot.mount" ];
+ unitConfig.DefaultDependencies = "no";
+ serviceConfig.Type = "oneshot";
+ script = ''
+ mkdir /btrfs_tmp
+ mount /dev/disk/by-partlabel/disk-primary-root /btrfs_tmp
+
+ if [[ -e /btrfs_tmp/root ]]; then
+ mkdir -p /btrfs_tmp/old_roots
+ timestamp=$(date --date="@$(stat -c %Y /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"
+ }
+
+ for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +30); do
+ delete_subvolume_recursively "$i"
+ done
+
+ btrfs subvolume create /btrfs_tmp/root
+ umount /btrfs_tmp
+ '';
+ };
+ };
+ };
+ };
+}
diff --git a/modules/nixos/boot/loader.nix b/modules/nixos/boot/loader.nix
new file mode 100644
index 0000000..37081e7
--- /dev/null
+++ b/modules/nixos/boot/loader.nix
@@ -0,0 +1,31 @@
+{
+ flake.modules.nixos.boot =
+ { config, lib, ... }:
+ let
+ cfg = config.tnix.boot;
+ in
+ {
+ options.tnix.boot.legacy = {
+ enable = lib.mkEnableOption "legacy boot (GRUB) instead of systemd-boot";
+ };
+
+ config = lib.mkMerge [
+ {
+ boot.binfmt.emulatedSystems = [ "aarch64-linux" ];
+
+ boot.loader = {
+ timeout = 1;
+ efi.canTouchEfiVariables = true;
+ };
+ }
+
+ (lib.mkIf (!cfg.legacy.enable && !cfg.secure-boot.enable) {
+ boot.loader.systemd-boot.enable = true;
+ })
+
+ (lib.mkIf cfg.legacy.enable {
+ boot.loader.grub.enable = true;
+ })
+ ];
+ };
+}
diff --git a/modules/nixos/boot/misc.nix b/modules/nixos/boot/misc.nix
new file mode 100644
index 0000000..bec171b
--- /dev/null
+++ b/modules/nixos/boot/misc.nix
@@ -0,0 +1,12 @@
+{
+ flake.modules.nixos.boot =
+ { pkgs, ... }:
+ {
+ boot = {
+ consoleLogLevel = 0;
+ initrd.verbose = false;
+ kernelPackages = pkgs.linuxPackages_zen;
+ supportedFilesystems = [ "ntfs" ];
+ };
+ };
+}
diff --git a/modules/nixos/boot/secure-boot.nix b/modules/nixos/boot/secure-boot.nix
new file mode 100644
index 0000000..49065e7
--- /dev/null
+++ b/modules/nixos/boot/secure-boot.nix
@@ -0,0 +1,43 @@
+{ inputs, ... }:
+{
+ flake.modules.nixos.boot =
+ {
+ config,
+ lib,
+ pkgs,
+ ...
+ }:
+ let
+ cfg = config.tnix.boot;
+ in
+ {
+ imports = [ inputs.lanzaboote.nixosModules.lanzaboote ];
+
+ options.tnix.boot.secure-boot = {
+ enable = lib.mkEnableOption "Enable secure-boot";
+ };
+
+ config = lib.mkIf cfg.secure-boot.enable {
+ assertions = [
+ {
+ assertion = !cfg.legacy.enable;
+ message = "secure-boot and legacy boot (GRUB) cannot be enabled at the same time";
+ }
+ ];
+
+ environment.systemPackages = [ pkgs.sbctl ];
+
+ # Lanzaboote replaces systemd-boot, so force it off
+ boot.loader.systemd-boot.enable = lib.mkForce false;
+
+ boot.lanzaboote = {
+ enable = true;
+ autoGenerateKeys.enable = true;
+ autoEnrollKeys.enable = true;
+
+ configurationLimit = 10;
+ pkiBundle = "/var/lib/sbctl";
+ };
+ };
+ };
+}
diff --git a/modules/nixos/core/hm.nix b/modules/nixos/core/hm.nix
new file mode 100644
index 0000000..1f58bc1
--- /dev/null
+++ b/modules/nixos/core/hm.nix
@@ -0,0 +1,37 @@
+{ inputs, config, ... }:
+{
+ flake.modules.nixos.core =
+ {
+ hostName,
+ userName,
+ userEmail,
+ ...
+ }:
+ {
+ imports = [
+ inputs.home-manager.nixosModules.home-manager
+ ];
+
+ home-manager = {
+ backupFileExtension = "bak";
+ useGlobalPkgs = true;
+ useUserPackages = true;
+ extraSpecialArgs = {
+ inherit
+ inputs
+ hostName
+ userName
+ userEmail
+ ;
+ };
+
+ users.${userName} = {
+ imports = [
+ config.flake.modules.homeManager.core
+ config.flake.modules.homeManager.shell
+ config.flake.modules.homeManager.${hostName}
+ ];
+ };
+ };
+ };
+}
diff --git a/modules/nixos/core/nh.nix b/modules/nixos/core/nh.nix
new file mode 100644
index 0000000..5205e6d
--- /dev/null
+++ b/modules/nixos/core/nh.nix
@@ -0,0 +1,20 @@
+{
+ flake.modules.nixos.core =
+ {
+ config,
+ userName,
+ ...
+ }:
+ {
+ programs.nh = {
+ enable = true;
+
+ clean = {
+ enable = !config.nix.gc.automatic;
+ dates = "weekly";
+ };
+
+ flake = "/home/${userName}/Projects/nixos-config";
+ };
+ };
+}
diff --git a/modules/nixos/core/nix-index.nix b/modules/nixos/core/nix-index.nix
new file mode 100644
index 0000000..3c42155
--- /dev/null
+++ b/modules/nixos/core/nix-index.nix
@@ -0,0 +1,13 @@
+{ inputs, ... }:
+{
+ flake.modules.nixos.core = { pkgs, ... }: {
+ imports = [
+ inputs.nix-index-database.nixosModules.default
+ ];
+
+ programs = {
+ nix-index.package = pkgs.nix-index-small;
+ nix-index-database.comma.enable = true;
+ };
+ };
+}
diff --git a/modules/nixos/core/nix.nix b/modules/nixos/core/nix.nix
new file mode 100644
index 0000000..465c37c
--- /dev/null
+++ b/modules/nixos/core/nix.nix
@@ -0,0 +1,88 @@
+{
+ flake.modules.nixos.core =
+ { userName, ... }:
+ {
+ nix = {
+ channel.enable = false;
+
+ gc = {
+ automatic = true;
+ options = "--delete-older-than 7d";
+ dates = "weekly";
+ persistent = true;
+ };
+
+ optimise.automatic = true;
+
+ settings = {
+ extra-platforms = [
+ "aarch64-linux"
+ "arm-linux"
+ ];
+
+ experimental-features = [
+ "nix-command"
+ "flakes"
+ ];
+
+ max-jobs = "auto";
+
+ # Make legacy nix commands use the XDG base directories instead of creating directories in $HOME.
+ use-xdg-base-directories = true;
+
+ # The maximum number of parallel TCP connections used to fetch files from binary caches and by other downloads.
+ # It defaults to 25. 0 means no limit.
+ http-connections = 128;
+
+ # This option defines the maximum number of substitution jobs that Nix will try to run in
+ # parallel. The default is 16. The minimum value one can choose is 1 and lower values will be
+ # interpreted as 1.
+ max-substitution-jobs = 128;
+
+ # The number of lines of the tail of the log to show if a build fails.
+ log-lines = 25;
+
+ # When free disk space in /nix/store drops below min-free during a build, Nix performs a
+ # garbage-collection until max-free bytes are available or there is no more garbage.
+ # A value of 0 (the default) disables this feature.
+ min-free = 128000000; # 128 MB
+ max-free = 1000000000; # 1 GB
+
+ # Prevent garbage collection from altering nix-shells managed by nix-direnv
+ # https://github.com/nix-community/nix-direnv#installation
+ keep-outputs = true;
+ keep-derivations = true;
+
+ # If set to true, Nix will keep building derivations even if some fail. The default is false.
+ keep-going = true;
+
+ # Automatically detect files in the store that have identical contents, and replaces
+ # them with hard links to a single copy. This saves disk space.
+ auto-optimise-store = true;
+
+ # Whether to warn about dirty Git/Mercurial trees.
+ warn-dirty = false;
+
+ # The timeout (in seconds) for establishing connections in the binary cache substituter.
+ # It corresponds to curl’s –connect-timeout option. A value of 0 means no limit.
+ connect-timeout = 5;
+
+ # Allow the use of cachix
+ trusted-users = [
+ "root"
+ "${userName}"
+ ];
+ allowed-users = [
+ "root"
+ "${userName}"
+ ];
+
+ builders-use-substitutes = true;
+
+ # If set to true, Nix will fall back to building from source if a binary substitute
+ # fails. This is equivalent to the –fallback flag. The default is false.
+ fallback = true;
+ };
+ };
+ };
+}
diff --git a/modules/nixos/core/nixpkgs.nix b/modules/nixos/core/nixpkgs.nix
new file mode 100644
index 0000000..ba594b6
--- /dev/null
+++ b/modules/nixos/core/nixpkgs.nix
@@ -0,0 +1,12 @@
+{ inputs, ... }:
+{
+ flake.modules.nixos.core = {
+ nixpkgs = {
+ config = {
+ allowUnfree = true;
+ joypixels.acceptLicense = true;
+ };
+ overlays = builtins.attrValues inputs.self.overlays;
+ };
+ };
+}
diff --git a/modules/nixos/core/security.nix b/modules/nixos/core/security.nix
new file mode 100644
index 0000000..12da9af
--- /dev/null
+++ b/modules/nixos/core/security.nix
@@ -0,0 +1,7 @@
+{
+ flake.modules.nixos.core = {
+ security = {
+ sudo.wheelNeedsPassword = false;
+ };
+ };
+}
diff --git a/modules/nixos/core/sops.nix b/modules/nixos/core/sops.nix
new file mode 100644
index 0000000..a3cb3f8
--- /dev/null
+++ b/modules/nixos/core/sops.nix
@@ -0,0 +1,25 @@
+{ inputs, ... }:
+{
+ flake.modules.nixos.core =
+ {
+ config,
+ pkgs,
+ ...
+ }:
+ let
+ isEd25519 = k: k.type == "ed25519";
+ getKeyPath = k: k.path;
+ keys = builtins.filter isEd25519 config.services.openssh.hostKeys;
+ in
+ {
+ imports = [ inputs.sops-nix.nixosModules.sops ];
+
+ sops.age = {
+ sshKeyPaths = map getKeyPath keys;
+ keyFile = "/var/lib/sops-nix/key.txt";
+ generateKey = true;
+ };
+
+ environment.systemPackages = with pkgs; [ sops ];
+ };
+}
diff --git a/modules/nixos/core/substituters.nix b/modules/nixos/core/substituters.nix
new file mode 100644
index 0000000..360a53b
--- /dev/null
+++ b/modules/nixos/core/substituters.nix
@@ -0,0 +1,38 @@
+{
+ flake.modules.nixos.core = {
+ nix.settings = {
+ substituters = [
+ "https://cache.nixos.org?priority=10"
+ "https://anyrun.cachix.org"
+ "https://fufexan.cachix.org"
+ "https://helix.cachix.org"
+ "https://hyprland.cachix.org"
+ "https://nix-community.cachix.org"
+ "https://nix-gaming.cachix.org"
+ "https://yazi.cachix.org"
+ "https://nix-on-droid.cachix.org"
+ "https://lan-mouse.cachix.org"
+ "https://wezterm.cachix.org"
+ "https://cache.nixos-cuda.org"
+ ];
+ trusted-substituters = [
+ "https://nix-on-droid.cachix.org"
+ "https://hyprland.cachix.org"
+ ];
+ trusted-public-keys = [
+ "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
+ "anyrun.cachix.org-1:pqBobmOjI7nKlsUMV25u9QHa9btJK65/C8vnO3p346s="
+ "fufexan.cachix.org-1:LwCDjCJNJQf5XD2BV+yamQIMZfcKWR9ISIFy5curUsY="
+ "helix.cachix.org-1:ejp9KQpR1FBI2onstMQ34yogDm4OgU2ru6lIwPvuCVs="
+ "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="
+ "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
+ "nix-gaming.cachix.org-1:nbjlureqMbRAxR1gJ/f3hxemL9svXaZF/Ees8vCUUs4="
+ "yazi.cachix.org-1:Dcdz63NZKfvUCbDGngQDAZq6kOroIrFoyO064uvLh8k="
+ "nix-on-droid.cachix.org-1:56snoMJTXmDRC1Ei24CmKoUqvHJ9XCp+nidK7qkMQrU="
+ "lan-mouse.cachix.org-1:KlE2AEZUgkzNKM7BIzMQo8w9yJYqUpor1CAUNRY6OyM="
+ "wezterm.cachix.org-1:kAbhjYUC9qvblTE+s7S+kl5XM1zVa4skO+E/1IDWdH0="
+ "cache.nixos-cuda.org:74DUi4Ye579gUqzH4ziL9IyiJBlDpMRn9MBN8oNan9M="
+ ];
+ };
+ };
+}
diff --git a/modules/nixos/core/users.nix b/modules/nixos/core/users.nix
new file mode 100644
index 0000000..92719d7
--- /dev/null
+++ b/modules/nixos/core/users.nix
@@ -0,0 +1,51 @@
+{
+ flake.modules.nixos.core =
+ {
+ pkgs,
+ lib,
+ config,
+ userName,
+ userEmail,
+ ...
+ }:
+ let
+ hasPasswordSecret = lib.hasAttrByPath [ "sops" "secrets" "tux-password" ] config;
+ in
+ {
+ programs.zsh.enable = true;
+
+ time.timeZone = "Asia/Kolkata";
+ i18n = {
+ defaultLocale = "en_US.UTF-8";
+ extraLocaleSettings = lib.genAttrs [
+ "LC_ADDRESS"
+ "LC_IDENTIFICATION"
+ "LC_MEASUREMENT"
+ "LC_MONETARY"
+ "LC_NAME"
+ "LC_NUMERIC"
+ "LC_PAPER"
+ "LC_TELEPHONE"
+ "LC_TIME"
+ ] (_: "en_IN");
+ };
+
+ users = {
+ mutableUsers = false;
+ defaultUserShell = pkgs.zsh;
+ users.${userName} = {
+ hashedPasswordFile = lib.mkIf hasPasswordSecret config.sops.secrets.tux-password.path;
+ initialPassword = lib.mkIf (!hasPasswordSecret) userName;
+ isNormalUser = true;
+ extraGroups = [
+ "networkmanager"
+ "wheel"
+ "storage"
+ ];
+ openssh.authorizedKeys.keys = [
+ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL+OzPUe2ECPC929DqpkM39tl/vdNAXfsRnmrGfR+X3D ${userEmail}"
+ ];
+ };
+ };
+ };
+}
diff --git a/modules/nixos/desktop/awesome/default.nix b/modules/nixos/desktop/awesome/default.nix
deleted file mode 100755
index d79543e..0000000
--- a/modules/nixos/desktop/awesome/default.nix
+++ /dev/null
@@ -1,70 +0,0 @@
-{
- lib,
- pkgs,
- ...
-}: {
- services = {
- displayManager = {
- defaultSession = "none+awesome";
- ly = {
- enable = true;
- settings = {
- session_log = "null";
- };
- };
- };
-
- xserver = {
- enable = true;
- windowManager.awesome = {
- enable = true;
- luaModules = lib.attrValues {
- inherit
- (pkgs.luajitPackages)
- lgi
- ldbus
- luadbi-mysql
- luaposix
- dkjson
- ;
- };
- };
- };
-
- acpid.enable = true;
- picom.enable = true;
- upower.enable = true;
- blueman.enable = true;
- };
-
- programs.dconf.enable = true;
-
- environment.systemPackages = with pkgs; [
- luajit
- acpi
- linuxKernel.packages.linux_zen.acpi_call
- lxappearance
- inotify-tools
- polkit_gnome
- xdotool
- xclip
- xbacklight
- gpick
- alsa-utils
- pavucontrol
- brightnessctl
- libnotify
- feh
- maim
- mpdris2
- python311Packages.mutagen
- xdg-utils
- playerctl
- pulsemixer
- easyeffects
- procps
- sct
- slop
- sddm-sugar-dark
- ];
-}
diff --git a/modules/nixos/desktop/brave.nix b/modules/nixos/desktop/brave.nix
new file mode 100644
index 0000000..2baa7bd
--- /dev/null
+++ b/modules/nixos/desktop/brave.nix
@@ -0,0 +1,13 @@
+{
+ flake.modules.nixos.desktop = {
+ environment.etc."/brave/policies/managed/brave-policies.json".text = builtins.toJSON {
+ TorDisabled = true;
+ BraveAIChatEnabled = false;
+ BraveRewardsDisabled = true;
+ BraveWalletDisabled = true;
+ BraveVPNDisabled = true;
+ BraveNewsDisabled = true;
+ BraveTalkDisabled = true;
+ };
+ };
+}
diff --git a/modules/nixos/desktop/default.nix b/modules/nixos/desktop/default.nix
deleted file mode 100644
index b62351a..0000000
--- a/modules/nixos/desktop/default.nix
+++ /dev/null
@@ -1,55 +0,0 @@
-{pkgs, ...}: {
- services = {
- displayManager = {
- defaultSession = "none+awesome";
- ly = {
- enable = true;
- settings = {
- session_log = "null";
- };
- };
- };
-
- acpid.enable = true;
- picom.enable = true;
- upower.enable = true;
- blueman.enable = true;
- };
-
- programs.dconf.enable = true;
-
- xdg.mime = {
- enable = true;
- defaultApplications = {
- "application/pdf" = ["brave-browser.desktop"];
- "text/html" = ["brave-browser.desktop"];
- "x-scheme-handler/http" = ["brave-browser.desktop"];
- "x-scheme-handler/https" = ["brave-browser.desktop"];
- "x-scheme-handler/about" = ["brave-browser.desktop"];
- "x-scheme-handler/unknown" = ["brave-browser.desktop"];
- };
- };
-
- environment.systemPackages = with pkgs; [
- acpi
- linuxKernel.packages.linux_zen.acpi_call
- inotify-tools
- polkit_gnome
- xdotool
- xclip
- xbacklight
- gpick
- alsa-utils
- pavucontrol
- brightnessctl
- libnotify
- feh
- maim
- mpdris2
- xdg-utils
- playerctl
- pulsemixer
- easyeffects
- procps
- ];
-}
diff --git a/modules/nixos/desktop/font.nix b/modules/nixos/desktop/font.nix
new file mode 100644
index 0000000..05a42f0
--- /dev/null
+++ b/modules/nixos/desktop/font.nix
@@ -0,0 +1,11 @@
+{
+ flake.modules.nixos.desktop =
+ { pkgs, ... }:
+ {
+ fonts.packages = with pkgs.nerd-fonts; [
+ fira-code
+ jetbrains-mono
+ bigblue-terminal
+ ];
+ };
+}
diff --git a/modules/nixos/desktop/gpu-screen-recorder.nix b/modules/nixos/desktop/gpu-screen-recorder.nix
new file mode 100644
index 0000000..5289b79
--- /dev/null
+++ b/modules/nixos/desktop/gpu-screen-recorder.nix
@@ -0,0 +1,13 @@
+{
+ flake.modules.nixos.desktop =
+ { pkgs, ... }:
+ {
+ programs.gpu-screen-recorder = {
+ enable = true;
+ };
+
+ environment.systemPackages = with pkgs; [
+ gpu-screen-recorder-gtk
+ ];
+ };
+}
diff --git a/modules/nixos/desktop/hyprland.nix b/modules/nixos/desktop/hyprland.nix
new file mode 100644
index 0000000..e07c0e8
--- /dev/null
+++ b/modules/nixos/desktop/hyprland.nix
@@ -0,0 +1,11 @@
+{
+ flake.modules.nixos.desktop =
+ { pkgs, ... }:
+ {
+ programs.hyprland = {
+ enable = true;
+ package = pkgs.hyprland-git.hyprland;
+ portalPackage = pkgs.hyprland-git.xdg-desktop-portal-hyprland;
+ };
+ };
+}
diff --git a/modules/nixos/desktop/hyprland/default.nix b/modules/nixos/desktop/hyprland/default.nix
deleted file mode 100644
index 13b3756..0000000
--- a/modules/nixos/desktop/hyprland/default.nix
+++ /dev/null
@@ -1,28 +0,0 @@
-{pkgs, ...}: {
- programs.hyprland = {
- enable = true;
- package = pkgs.hyprland-git.hyprland;
- portalPackage = pkgs.hyprland-git.xdg-desktop-portal-hyprland;
- };
-
- environment.systemPackages = [
- (pkgs.writeShellScriptBin "mirror-display" ''
- hyprctl keyword monitor "eDP-1,2560x1440@90,0x0,1" \
- && hyprctl keyword monitor "HDMI-A-1,preferred,0x0,1,mirror,eDP-1" \
- && ags quit \
- && ${pkgs.tpanel}/bin/tpanel &
- '')
- (pkgs.writeShellScriptBin "extend-display" ''
- hyprctl keyword monitor "eDP-1,2560x1440@90,0x0,1" \
- && hyprctl keyword monitor "HDMI-A-1,preferred,0x-1440,1" \
- && ags quit \
- && ${pkgs.tpanel}/bin/tpanel &
- '')
- (pkgs.writeShellScriptBin "dock-display" ''
- hyprctl keyword monitor "eDP-1,disable" \
- && hyprctl keyword monitor "HDMI-A-1,preferred,0x0,1" \
- && ags quit \
- && ${pkgs.tpanel}/bin/tpanel &
- '')
- ];
-}
diff --git a/modules/nixos/desktop/ly.nix b/modules/nixos/desktop/ly.nix
new file mode 100644
index 0000000..feea59e
--- /dev/null
+++ b/modules/nixos/desktop/ly.nix
@@ -0,0 +1,10 @@
+{
+ flake.modules.nixos.desktop = {
+ services.displayManager.ly = {
+ enable = true;
+ settings = {
+ session_log = "null";
+ };
+ };
+ };
+}
diff --git a/modules/nixos/desktop/mango.nix b/modules/nixos/desktop/mango.nix
new file mode 100644
index 0000000..4e6fc4d
--- /dev/null
+++ b/modules/nixos/desktop/mango.nix
@@ -0,0 +1,36 @@
+{
+ inputs,
+ ...
+}:
+{
+ flake.modules.nixos.desktop =
+ {
+ pkgs,
+ lib,
+ ...
+ }:
+ {
+ imports = [
+ inputs.mango.nixosModules.mango
+ ];
+
+ programs.mango.enable = true;
+
+ xdg.portal = {
+ enable = lib.mkDefault true;
+ extraPortals = with pkgs; [
+ hyprland-git.xdg-desktop-portal-hyprland
+ xdg-desktop-portal-wlr
+ xdg-desktop-portal-gtk
+ ];
+ config.mango = {
+ default = lib.mkForce [
+ "hyprland"
+ "gtk"
+ ];
+ "org.freedesktop.impl.portal.ScreenCast" = lib.mkForce [ "hyprland" ];
+ "org.freedesktop.impl.portal.ScreenShot" = lib.mkForce [ "hyprland" ];
+ };
+ };
+ };
+}
diff --git a/modules/nixos/desktop/mango/default.nix b/modules/nixos/desktop/mango/default.nix
deleted file mode 100644
index 120de56..0000000
--- a/modules/nixos/desktop/mango/default.nix
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- inputs,
- pkgs,
- lib,
- ...
-}: {
- imports = [
- inputs.mango.nixosModules.mango
- ];
-
- programs.mango.enable = true;
-
- xdg.portal = {
- enable = lib.mkDefault true;
- extraPortals = with pkgs; [
- hyprland-git.xdg-desktop-portal-hyprland
- xdg-desktop-portal-wlr
- xdg-desktop-portal-gtk
- ];
- config.mango = {
- default = lib.mkForce ["hyprland" "gtk"];
- "org.freedesktop.impl.portal.ScreenCast" = lib.mkForce ["hyprland"];
- "org.freedesktop.impl.portal.ScreenShot" = lib.mkForce ["hyprland"];
- };
- };
-}
diff --git a/modules/nixos/desktop/misc.nix b/modules/nixos/desktop/misc.nix
new file mode 100644
index 0000000..c0787e1
--- /dev/null
+++ b/modules/nixos/desktop/misc.nix
@@ -0,0 +1,7 @@
+{
+ flake.modules.nixos.desktop =
+ { pkgs, ... }:
+ {
+ environment.systemPackages = with pkgs; [ brightnessctl ];
+ };
+}
diff --git a/modules/nixos/desktop/obs-studio.nix b/modules/nixos/desktop/obs-studio.nix
new file mode 100644
index 0000000..1eef51f
--- /dev/null
+++ b/modules/nixos/desktop/obs-studio.nix
@@ -0,0 +1,15 @@
+{
+ flake.modules.nixos.desktop =
+ { pkgs, ... }:
+ {
+ programs.obs-studio = {
+ enable = true;
+ enableVirtualCamera = true;
+ plugins = with pkgs.obs-studio-plugins; [
+ obs-vaapi
+ wlrobs
+ obs-source-record
+ ];
+ };
+ };
+}
diff --git a/modules/nixos/desktop/thunar.nix b/modules/nixos/desktop/thunar.nix
new file mode 100644
index 0000000..91615ff
--- /dev/null
+++ b/modules/nixos/desktop/thunar.nix
@@ -0,0 +1,18 @@
+{
+ flake.modules.nixos.desktop =
+ { pkgs, ... }:
+ {
+ services = {
+ gvfs.enable = true;
+ tumbler.enable = true;
+ };
+
+ programs.thunar = {
+ enable = true;
+ plugins = with pkgs; [
+ thunar-archive-plugin
+ thunar-volman
+ ];
+ };
+ };
+}
diff --git a/modules/nixos/desktop/tshell.nix b/modules/nixos/desktop/tshell.nix
new file mode 100644
index 0000000..83b65ac
--- /dev/null
+++ b/modules/nixos/desktop/tshell.nix
@@ -0,0 +1,7 @@
+{
+ flake.modules.nixos.desktop =
+ { pkgs, ... }:
+ {
+ environment.systemPackages = with pkgs; [ tshell ];
+ };
+}
diff --git a/modules/nixos/distrobox.nix b/modules/nixos/distrobox.nix
deleted file mode 100644
index 8d3f74e..0000000
--- a/modules/nixos/distrobox.nix
+++ /dev/null
@@ -1,112 +0,0 @@
-{
- config,
- pkgs,
- lib,
- ...
-}:
-with lib; let
- cfg = config.tux.packages.distrobox;
-in {
- options.tux.packages.distrobox = {
- enable = mkEnableOption "Enable DistroBox";
- };
-
- config = mkIf cfg.enable {
- environment.systemPackages = with pkgs; [
- distrobox
-
- (writeShellScriptBin "dbox-create" ''
- #!/usr/bin/env bash
-
- # 1. Initialize variables
- IMAGE=""
- NAME=""
-
- # Array to hold optional arguments (like volumes)
- declare -a EXTRA_ARGS
-
- # 2. Parse arguments
- while [[ $# -gt 0 ]]; do
- case $1 in
- -i|--image)
- IMAGE="$2"
- shift 2
- ;;
- -n|--name)
- NAME="$2"
- shift 2
- ;;
- -p|--profile)
- echo ":: Profile mode enabled: Mounting Nix store and user profiles (Read-Only)"
- # Add volume flags to the array
- EXTRA_ARGS+=( "--volume" "/nix/store:/nix/store:ro" )
- EXTRA_ARGS+=( "--volume" "/etc/profiles/per-user:/etc/profiles/per-user:ro" )
- EXTRA_ARGS+=( "--volume" "/etc/static/profiles/per-user:/etc/static/profiles/per-user:ro" )
- shift 1
- ;;
- *)
- echo "Unknown option $1"
- exit 1
- ;;
- esac
- done
-
- if [ -z "$IMAGE" ] || [ -z "$NAME" ]; then
- echo "Usage: dbox-create -i -n [-p]"
- exit 1
- fi
-
- # 3. Define the custom home path
- CUSTOM_HOME="$HOME/Distrobox/$NAME"
-
- echo "------------------------------------------------"
- echo "Creating Distrobox: $NAME"
- echo "Location: $CUSTOM_HOME"
- echo "------------------------------------------------"
-
- # 4. Run Distrobox Create
- # We expand "''${EXTRA_ARGS[@]}" to properly pass the volume arguments
- ${pkgs.distrobox}/bin/distrobox create \
- --image "$IMAGE" \
- --name "$NAME" \
- --home "$CUSTOM_HOME" \
- "''${EXTRA_ARGS[@]}"
-
- # Check exit code
- if [ $? -ne 0 ]; then
- echo "Error: Distrobox creation failed."
- exit 1
- fi
-
- # 5. Post-Creation: Symlink Config Files
- echo "--> Linking configurations to $NAME..."
-
- # Helper function to symlink
- link_config() {
- SRC="$1"
- DEST="$2"
- DEST_DIR=$(dirname "$DEST")
-
- # Create parent directory if it doesn't exist
- mkdir -p "$DEST_DIR"
-
- if [ -e "$SRC" ]; then
- # ln -sf: symbolic link, force overwrite
- ln -sf "$SRC" "$DEST"
- echo " [LINK] $DEST -> $SRC"
- else
- echo " [SKIP] $SRC not found on host"
- fi
- }
-
- # Create Symlinks
- link_config "$HOME/.zshrc" "$CUSTOM_HOME/.zshrc"
- link_config "$HOME/.zshenv" "$CUSTOM_HOME/.zshenv"
- link_config "$HOME/.config/fastfetch" "$CUSTOM_HOME/.config/fastfetch"
- link_config "$HOME/.config/starship.toml" "$CUSTOM_HOME/.config/starship.toml"
-
- echo "--> Done! Enter via: distrobox enter $NAME"
- '')
- ];
- };
-}
diff --git a/modules/nixos/fail2ban.nix b/modules/nixos/fail2ban.nix
deleted file mode 100644
index 802e938..0000000
--- a/modules/nixos/fail2ban.nix
+++ /dev/null
@@ -1,32 +0,0 @@
-{config, ...}: let
- isFirewallEnabled = config.networking.firewall.enable;
-in {
- services.fail2ban = {
- enable = isFirewallEnabled;
- maxretry = 5;
- banaction = "iptables-multiport[blocktype=DROP]";
- ignoreIP = [
- "127.0.0.0/8"
- "10.0.0.0/8"
- "192.168.0.0/16"
- ];
- bantime = "24h";
-
- bantime-increment = {
- enable = true;
- rndtime = "12m";
- overalljails = true;
- multipliers = "4 8 16 32 64 128 256 512 1024 2048";
- maxtime = "192h";
- };
-
- jails = {
- sshd.settings = {
- enabled = true;
- port = toString config.services.openssh.ports;
- mode = "aggressive";
- filter = "sshd";
- };
- };
- };
-}
diff --git a/modules/nixos/gaming/steam.nix b/modules/nixos/gaming/steam.nix
new file mode 100644
index 0000000..bce53b3
--- /dev/null
+++ b/modules/nixos/gaming/steam.nix
@@ -0,0 +1,11 @@
+{
+ flake.modules.nixos.gaming =
+ { pkgs, ... }:
+ {
+ programs.steam = {
+ enable = true;
+ protontricks.enable = true;
+ extraCompatPackages = with pkgs; [ proton-ge-bin ];
+ };
+ };
+}
diff --git a/modules/nixos/hardware/audio.nix b/modules/nixos/hardware/audio.nix
new file mode 100644
index 0000000..13bb453
--- /dev/null
+++ b/modules/nixos/hardware/audio.nix
@@ -0,0 +1,18 @@
+{
+ flake.modules.nixos.hardware = { pkgs, ... }: {
+ security.rtkit.enable = true;
+
+ services.pipewire = {
+ enable = true;
+ alsa.enable = true;
+ alsa.support32Bit = true;
+ pulse.enable = true;
+ wireplumber.enable = true;
+ };
+
+ environment.systemPackages = with pkgs; [
+ alsa-utils
+ pavucontrol
+ ];
+ };
+}
diff --git a/modules/nixos/hardware/bluetooth.nix b/modules/nixos/hardware/bluetooth.nix
new file mode 100644
index 0000000..1f58530
--- /dev/null
+++ b/modules/nixos/hardware/bluetooth.nix
@@ -0,0 +1,11 @@
+{
+ flake.modules.nixos.hardware = { pkgs, ... }: {
+ hardware.bluetooth = {
+ enable = true;
+ };
+
+ environment.systemPackages = [
+ pkgs.bluetui
+ ];
+ };
+}
diff --git a/modules/nixos/hardware/graphics.nix b/modules/nixos/hardware/graphics.nix
new file mode 100644
index 0000000..312b007
--- /dev/null
+++ b/modules/nixos/hardware/graphics.nix
@@ -0,0 +1,13 @@
+{
+ flake.modules.nixos.hardware = {
+ hardware = {
+ graphics = {
+ enable = true;
+ enable32Bit = true;
+ };
+
+ enableAllFirmware = true;
+ usb-modeswitch.enable = true;
+ };
+ };
+}
diff --git a/modules/nixos/networking/netbird-client.nix b/modules/nixos/networking/netbird-client.nix
new file mode 100644
index 0000000..ed3e480
--- /dev/null
+++ b/modules/nixos/networking/netbird-client.nix
@@ -0,0 +1,31 @@
+{
+ flake.modules.nixos.networking =
+ {
+ config,
+ lib,
+ hostName,
+ ...
+ }:
+ with lib;
+ let
+ cfg = config.tnix.networking.netbird-client;
+ in
+ {
+ options.tnix.networking.netbird-client = {
+ enable = mkEnableOption "Enable netbird client";
+ };
+
+ config = mkIf cfg.enable {
+ services.netbird.clients = {
+ ${hostName} = {
+ port = 61820;
+ login = {
+ enable = true;
+ setupKeyFile = config.sops.secrets.netbird-key.path;
+ };
+ bin.suffix = "";
+ };
+ };
+ };
+ };
+}
diff --git a/modules/nixos/networking/newt.nix b/modules/nixos/networking/newt.nix
new file mode 100644
index 0000000..82fa749
--- /dev/null
+++ b/modules/nixos/networking/newt.nix
@@ -0,0 +1,30 @@
+{
+ flake.modules.nixos.networking =
+ {
+ config,
+ lib,
+ ...
+ }:
+ with lib;
+ let
+ cfg = config.tnix.networking.newt;
+ in
+ {
+ options.tnix.networking.newt = {
+ enable = mkEnableOption "Newt";
+
+ environmentFile = mkOption {
+ type = types.nullOr types.path;
+ default = null;
+ description = "Environment file with secrets passed to Newt";
+ };
+ };
+
+ config = mkIf cfg.enable {
+ services.newt = {
+ enable = true;
+ environmentFile = cfg.environmentFile;
+ };
+ };
+ };
+}
diff --git a/modules/nixos/networking/ssh.nix b/modules/nixos/networking/ssh.nix
index 4914000..27240a5 100644
--- a/modules/nixos/networking/ssh.nix
+++ b/modules/nixos/networking/ssh.nix
@@ -1,69 +1,76 @@
{
- config,
- lib,
- ...
-}:
-with lib; let
- cfg = config.tux.services.openssh;
+ flake.modules.nixos.networking =
+ {
+ config,
+ lib,
+ ...
+ }:
+ with lib;
+ let
+ cfg = config.tnix.networking.openssh;
- # Sops needs acess to the keys before the persist dirs are even mounted; so
- # just persisting the keys won't work, we must point at /persist
- hasOptinPersistence = config.environment.persistence."/persist".enable;
-in {
- options.tux.services.openssh = {
- enable = mkEnableOption "Enable OpenSSH server";
+ # Sops needs acess to the keys before the persist dirs are even mounted; so
+ # just persisting the keys won't work, we must point at /persist
+ hasOptinPersistence = config.tnix.boot.impermanence.enable;
+ in
+ {
+ options.tnix.networking.openssh = {
+ enable = mkEnableOption "Enable OpenSSH server";
- ports = mkOption {
- type = types.listOf types.port;
- default = [22];
- description = ''
- Specifies on which ports the SSH daemon listens.
- '';
- };
- };
-
- config = mkIf cfg.enable {
- services.openssh = {
- enable = true;
- startWhenNeeded = true;
- allowSFTP = true;
- ports = cfg.ports;
-
- settings = {
- PermitRootLogin = "no";
- PasswordAuthentication = false;
- KbdInteractiveAuthentication = false;
- AuthenticationMethods = "publickey";
- PubkeyAuthentication = "yes";
- ChallengeResponseAuthentication = "no";
- UsePAM = false;
- UseDns = false;
- X11Forwarding = false;
- KexAlgorithms = [
- "curve25519-sha256"
- "curve25519-sha256@libssh.org"
- "diffie-hellman-group16-sha512"
- "diffie-hellman-group18-sha512"
- "sntrup761x25519-sha512@openssh.com"
- "diffie-hellman-group-exchange-sha256"
- "mlkem768x25519-sha256"
- "sntrup761x25519-sha512"
- ];
- Macs = [
- "hmac-sha2-512-etm@openssh.com"
- "hmac-sha2-256-etm@openssh.com"
- "umac-128-etm@openssh.com"
- ];
- ClientAliveCountMax = 5;
- ClientAliveInterval = 60;
+ ports = mkOption {
+ type = types.listOf types.port;
+ default = [ 22 ];
+ description = ''
+ Specifies on which ports the SSH daemon listens.
+ '';
+ };
};
- hostKeys = [
- {
- path = "${lib.optionalString hasOptinPersistence "/persist"}/etc/ssh/ssh_host_ed25519_key";
- type = "ed25519";
- }
- ];
+ config = mkIf cfg.enable {
+ programs.ssh.startAgent = true;
+
+ services.openssh = {
+ enable = true;
+ startWhenNeeded = true;
+ allowSFTP = true;
+ ports = cfg.ports;
+
+ settings = {
+ PermitRootLogin = "no";
+ PasswordAuthentication = false;
+ KbdInteractiveAuthentication = false;
+ AuthenticationMethods = "publickey";
+ PubkeyAuthentication = "yes";
+ ChallengeResponseAuthentication = "no";
+ UsePAM = false;
+ UseDns = false;
+ X11Forwarding = false;
+ KexAlgorithms = [
+ "curve25519-sha256"
+ "curve25519-sha256@libssh.org"
+ "diffie-hellman-group16-sha512"
+ "diffie-hellman-group18-sha512"
+ "sntrup761x25519-sha512@openssh.com"
+ "diffie-hellman-group-exchange-sha256"
+ "mlkem768x25519-sha256"
+ "sntrup761x25519-sha512"
+ ];
+ Macs = [
+ "hmac-sha2-512-etm@openssh.com"
+ "hmac-sha2-256-etm@openssh.com"
+ "umac-128-etm@openssh.com"
+ ];
+ ClientAliveCountMax = 5;
+ ClientAliveInterval = 60;
+ };
+
+ hostKeys = [
+ {
+ path = "${lib.optionalString hasOptinPersistence "/persist"}/etc/ssh/ssh_host_ed25519_key";
+ type = "ed25519";
+ }
+ ];
+ };
+ };
};
- };
}
diff --git a/modules/nixos/obs-studio.nix b/modules/nixos/obs-studio.nix
deleted file mode 100644
index f4e745a..0000000
--- a/modules/nixos/obs-studio.nix
+++ /dev/null
@@ -1,7 +0,0 @@
-{pkgs, ...}: {
- programs.obs-studio = {
- enable = true;
- enableVirtualCamera = true;
- plugins = with pkgs.obs-studio-plugins; [obs-vaapi wlrobs obs-source-record];
- };
-}
diff --git a/modules/nixos/selfhosted/adguard.nix b/modules/nixos/selfhosted/adguard.nix
deleted file mode 100644
index b2a489c..0000000
--- a/modules/nixos/selfhosted/adguard.nix
+++ /dev/null
@@ -1,8 +0,0 @@
-{...}: {
- services = {
- adguardhome = {
- enable = true;
- openFirewall = true;
- };
- };
-}
diff --git a/modules/nixos/selfhosted/containers/aiostreams.nix b/modules/nixos/selfhosted/containers/aiostreams.nix
deleted file mode 100644
index 6b429e8..0000000
--- a/modules/nixos/selfhosted/containers/aiostreams.nix
+++ /dev/null
@@ -1,61 +0,0 @@
-{
- config,
- lib,
- ...
-}:
-with lib; let
- cfg = config.tux.containers.aiostreams;
-in {
- options.tux.containers.aiostreams = {
- enable = mkEnableOption "Enable AIOStreams";
-
- port = mkOption {
- type = types.int;
- default = 3000;
- };
-
- dataDir = mkOption {
- type = types.path;
- default = "/var/lib/aiostreams";
- description = "Directory to store persistent AIOStreams data";
- };
-
- environment = mkOption {
- type = with types; attrsOf str;
- default = {};
- };
-
- environmentFiles = mkOption {
- type = with types; listOf path;
- default = [];
- };
- };
-
- config = mkIf cfg.enable {
- virtualisation.oci-containers.containers.aiostreams = {
- autoStart = true;
- image = "ghcr.io/viren070/aiostreams:latest";
- ports = [
- "${toString cfg.port}:3000"
- ];
-
- environment = cfg.environment;
- environmentFiles = cfg.environmentFiles;
- volumes = [
- "${cfg.dataDir}:/app/data"
- ];
- };
-
- services.nginx.virtualHosts = {
- "${cfg.environment.ADDON_ID}" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- locations = {
- "/" = {
- proxyPass = "http://localhost:${toString cfg.port}";
- };
- };
- };
- };
- };
-}
diff --git a/modules/nixos/selfhosted/containers/cs2.nix b/modules/nixos/selfhosted/containers/cs2.nix
deleted file mode 100644
index da5cb8e..0000000
--- a/modules/nixos/selfhosted/containers/cs2.nix
+++ /dev/null
@@ -1,61 +0,0 @@
-{config, ...}: {
- virtualisation.oci-containers.containers.cs2-server = {
- image = "joedwards32/cs2";
- environmentFiles = [
- config.sops.secrets."cs2_secrets/SRCDS_TOKEN".path
- config.sops.secrets."cs2_secrets/CS2_RCONPW".path
- config.sops.secrets."cs2_secrets/CS2_PW".path
- ];
-
- environment = {
- # Server configuration
- STEAMAPPVALIDATE = "0";
- CS2_SERVERNAME = "tux's CS-2 Server";
- CS2_CHEATS = "0";
- CS2_PORT = "27015";
- CS2_SERVER_HIBERNATE = "1";
- CS2_RCON_PORT = "";
- CS2_LAN = "0";
- CS2_MAXPLAYERS = "10";
- CS2_ADDITIONAL_ARGS = "";
- CS2_CFG_URL = "";
- # Game modes
- CS2_GAMEALIAS = "competitive";
- CS2_GAMETYPE = "0";
- CS2_GAMEMODE = "1";
- CS2_MAPGROUP = "mg_active";
- CS2_STARTMAP = "de_mirage";
- # Workshop Maps
- CS2_HOST_WORKSHOP_COLLECTION = "";
- CS2_HOST_WORKSHOP_MAP = "";
- # Bots
- CS2_BOT_DIFFICULTY = "3";
- CS2_BOT_QUOTA = "";
- CS2_BOT_QUOTA_MODE = "";
- # TV
- TV_AUTORECORD = "0";
- TV_ENABLE = "0";
- TV_PORT = "27020";
- TV_PW = "changeme";
- TV_RELAY_PW = "changeme";
- TV_MAXRATE = "0";
- TV_DELAY = "0";
- # Logs
- CS2_LOG = "on";
- CS2_LOG_MONEY = "0";
- CS2_LOG_DETAIL = "0";
- CS2_LOG_ITEMS = "0";
- };
- volumes = [
- "cs2:/home/steam/cs2-dedicated"
- ];
- ports = [
- "27015:27015/tcp"
- "27015:27015/udp"
- "27020:27020/udp"
- ];
- extraOptions = [
- "--interactive"
- ];
- };
-}
diff --git a/modules/nixos/selfhosted/cyber-tux.nix b/modules/nixos/selfhosted/cyber-tux.nix
deleted file mode 100644
index 5f3ebc2..0000000
--- a/modules/nixos/selfhosted/cyber-tux.nix
+++ /dev/null
@@ -1,86 +0,0 @@
-{
- config,
- lib,
- pkgs,
- ...
-}:
-with lib; let
- cfg = config.tux.services.cyber-tux;
-in {
- options.tux.services.cyber-tux = {
- enable = mkEnableOption "Enable CyberTux Discord bot";
-
- user = mkOption {
- type = types.str;
- default = "cyber-tux";
- description = "User under which the CyberTux service runs.";
- };
-
- group = mkOption {
- type = types.str;
- default = "cyber-tux";
- description = "Group under which the CyberTux service runs.";
- };
-
- environmentFile = mkOption {
- type = types.path;
- description = "Environment file containing DISCORD_TOKEN";
- };
- };
-
- config = mkIf cfg.enable {
- systemd.services = {
- cyber-tux = {
- description = "A discord bot for my server";
- after = ["network.target"];
- wantedBy = ["multi-user.target"];
-
- serviceConfig = {
- Type = "simple";
- User = "cyber-tux";
- Group = "cyber-tux";
- EnvironmentFile = cfg.environmentFile;
- ExecStart = getExe pkgs.cyber-tux;
- Restart = "always";
-
- LockPersonality = true;
- MemoryDenyWriteExecute = true;
- NoNewPrivileges = true;
- PrivateDevices = true;
- PrivateIPC = true;
- PrivateTmp = true;
- PrivateUsers = true;
- ProtectClock = true;
- ProtectControlGroups = true;
- ProtectHome = true;
- ProtectHostname = true;
- ProtectKernelLogs = true;
- ProtectKernelModules = true;
- ProtectKernelTunables = true;
- ProtectProc = "invisible";
- ProtectSystem = "strict";
- RestrictNamespaces = "uts ipc pid user cgroup";
- RestrictRealtime = true;
- RestrictSUIDSGID = true;
- SystemCallArchitectures = "native";
- SystemCallFilter = ["@system-service"];
- UMask = "0077";
- };
- };
- };
- # Ensure the user and group exist
- users.users = mkIf (cfg.user == "cyber-tux") {
- ${cfg.user} = {
- isSystemUser = true;
- group = cfg.group;
- description = "CyberTux service user";
- home = "/var/lib/cyber-tux";
- createHome = true;
- };
- };
-
- users.groups = mkIf (cfg.group == "cyber-tux") {
- ${cfg.group} = {};
- };
- };
-}
diff --git a/modules/nixos/selfhosted/gitea.nix b/modules/nixos/selfhosted/gitea.nix
deleted file mode 100644
index 40c3e52..0000000
--- a/modules/nixos/selfhosted/gitea.nix
+++ /dev/null
@@ -1,29 +0,0 @@
-{lib, ...}: {
- services = {
- gitea = {
- enable = true;
- settings = {
- service.DISABLE_REGISTRATION = true;
- server = {
- DOMAIN = "git.tux.rs";
- ROOT_URL = "https://git.tux.rs";
- };
- };
- };
-
- nginx = {
- enable = lib.mkForce true;
- virtualHosts = {
- "git.tux.rs" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- locations = {
- "/" = {
- proxyPass = "http://localhost:3000";
- };
- };
- };
- };
- };
- };
-}
diff --git a/modules/nixos/selfhosted/glance/default.nix b/modules/nixos/selfhosted/glance/default.nix
deleted file mode 100644
index b9bccb9..0000000
--- a/modules/nixos/selfhosted/glance/default.nix
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- username,
- lib,
- config,
- ...
-}: let
- home = import ./home.nix;
-in {
- services = {
- glance = {
- enable = true;
- openFirewall = true;
- settings = {
- server = {
- host = "0.0.0.0";
- port = 5678;
- };
- branding = {
- custom-footer = "${username}
";
- };
- pages = [
- home.page
- ];
- };
- };
-
- nginx = {
- enable = lib.mkForce true;
- virtualHosts = {
- "home.tux.rs" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- locations = {
- "/" = {
- proxyPass = "http://${config.services.glance.settings.server.host}:${toString config.services.glance.settings.server.port}";
- proxyWebsockets = true;
- };
- };
- };
- };
- };
- };
-}
diff --git a/modules/nixos/selfhosted/glance/home.nix b/modules/nixos/selfhosted/glance/home.nix
deleted file mode 100644
index 2b7bdb9..0000000
--- a/modules/nixos/selfhosted/glance/home.nix
+++ /dev/null
@@ -1,86 +0,0 @@
-{
- page = {
- name = "Dashboard - tux";
- width = "slim";
- hide-desktop-navigation = true;
- center-vertically = true;
- columns = [
- {
- size = "full";
- widgets = [
- {
- type = "search";
- autofocus = true;
- }
- {
- type = "markets";
- markets = [
- {
- symbol = "BTC-USD";
- name = "Bitcoin";
- chart-link = "https://www.tradingview.com/chart/?symbol=INDEX:BTCUSD";
- }
- {
- symbol = "ETH-USD";
- name = "Ethereum";
- chart-link = "https://www.tradingview.com/chart/?symbol=INDEX:ETHUSD";
- }
- {
- symbol = "SOL-USD";
- name = "Solana";
- chart-link = "https://www.tradingview.com/chart/?symbol=INDEX:SOLUSD";
- }
- ];
- }
- {
- type = "monitor";
- cache = "1m";
- title = "Services";
- sites = [
- {
- title = "Gitea";
- url = "https://git.tux.rs";
- icon = "si:gitea";
- }
- {
- title = "Vaultwarden";
- url = "https://bw.tux.rs";
- icon = "si:vaultwarden";
- }
- {
- title = "Ntfy";
- url = "https://ntfy.tux.rs";
- icon = "si:ntfy";
- }
- {
- title = "Grafana";
- url = "https://grafana.tux.rs";
- icon = "si:grafana";
- }
- {
- title = "SearXNG";
- url = "https://sx.tux.rs";
- icon = "si:searxng";
- }
- {
- title = "Wakapi";
- url = "https://wakapi.tux.rs";
- icon = "si:wakatime";
- }
- ];
- }
- {
- type = "reddit";
- subreddit = "selfhosted";
- style = "horizontal-cards";
- }
- {
- type = "reddit";
- subreddit = "homelab";
- style = "horizontal-cards";
- }
- ];
- }
- ];
- };
-}
diff --git a/modules/nixos/selfhosted/headscale.nix b/modules/nixos/selfhosted/headscale.nix
deleted file mode 100644
index 154c3e0..0000000
--- a/modules/nixos/selfhosted/headscale.nix
+++ /dev/null
@@ -1,65 +0,0 @@
-{
- config,
- pkgs,
- lib,
- email,
- ...
-}: {
- security = {
- acme = {
- defaults.email = "${email}";
- acceptTerms = true;
- };
- };
-
- services = {
- headscale = {
- enable = true;
- port = 8080;
- address = "0.0.0.0";
- settings = {
- dns = {
- base_domain = "hs.tux.rs";
- search_domains = ["tux.rs"];
- magic_dns = true;
- nameservers.global = [
- "9.9.9.9"
- ];
- };
- # server_url = "https://hs.tux.rs:443";
- metrics_listen_addr = "0.0.0.0:8095";
- logtail = {
- enabled = false;
- };
- log = {
- level = "warn";
- };
- ip_prefixes = [
- "100.64.0.0/10"
- "fd7a:115c:a1e0::/48"
- ];
- };
- };
-
- nginx = {
- enable = lib.mkForce true;
- virtualHosts = {
- "hs.tux.rs" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- locations = {
- "/" = {
- proxyPass = "http://localhost:${toString config.services.headscale.port}";
- proxyWebsockets = true;
- };
- "/metrics" = {
- proxyPass = "http://${config.services.headscale.settings.metrics_listen_addr}/metrics";
- };
- };
- };
- };
- };
- };
-
- environment.systemPackages = with pkgs; [headscale];
-}
diff --git a/modules/nixos/selfhosted/kasmweb.nix b/modules/nixos/selfhosted/kasmweb.nix
deleted file mode 100644
index a756a25..0000000
--- a/modules/nixos/selfhosted/kasmweb.nix
+++ /dev/null
@@ -1,24 +0,0 @@
-{lib, ...}: {
- services = {
- kasmweb = {
- enable = true;
- listenPort = 8843;
- };
-
- nginx = {
- enable = lib.mkForce true;
- virtualHosts = {
- "kasm.tux.rs" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- locations = {
- "/" = {
- proxyPass = "https://127.0.0.1:8843";
- proxyWebsockets = true;
- };
- };
- };
- };
- };
- };
-}
diff --git a/modules/nixos/selfhosted/monitoring/grafana.nix b/modules/nixos/selfhosted/monitoring/grafana.nix
deleted file mode 100644
index fc18920..0000000
--- a/modules/nixos/selfhosted/monitoring/grafana.nix
+++ /dev/null
@@ -1,45 +0,0 @@
-{
- lib,
- username,
- email,
- ...
-}: {
- services = {
- grafana = {
- enable = true;
- settings = {
- server.http_port = 8888;
- security = {
- admin_user = "${username}";
- admin_email = "${email}";
- };
- };
- };
-
- nginx = {
- enable = lib.mkForce true;
- virtualHosts = {
- "grafana.tux.rs" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- locations = {
- "/" = {
- proxyPass = "http://localhost:8888";
- proxyWebsockets = true;
- };
-
- "/api/live/" = {
- proxyPass = "http://localhost:8888";
- extraConfig = ''
- proxy_http_version 1.1;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection $connection_upgrade;
- proxy_set_header Host $host;
- '';
- };
- };
- };
- };
- };
- };
-}
diff --git a/modules/nixos/selfhosted/monitoring/loki.nix b/modules/nixos/selfhosted/monitoring/loki.nix
deleted file mode 100644
index eadac07..0000000
--- a/modules/nixos/selfhosted/monitoring/loki.nix
+++ /dev/null
@@ -1,77 +0,0 @@
-{lib, ...}: {
- services = {
- loki = {
- enable = true;
- configuration = {
- auth_enabled = false;
- server = {
- http_listen_port = 3100;
- };
- common = {
- ring = {
- instance_addr = "127.0.0.1";
- kvstore = {
- store = "inmemory";
- };
- };
- replication_factor = 1;
- path_prefix = "/tmp/loki";
- };
- schema_config = {
- configs = [
- {
- from = "2020-05-15";
- store = "tsdb";
- object_store = "filesystem";
- schema = "v13";
- index = {
- prefix = "index_";
- period = "24h";
- };
- }
- ];
- };
- storage_config = {
- filesystem = {
- directory = "/tmp/loki/chunks";
- };
- };
- };
- };
-
- nginx = {
- enable = lib.mkForce true;
- virtualHosts = {
- "loki.tux.rs" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- locations = {
- "/" = {
- proxyPass = "http://localhost:3100";
- extraConfig = ''
- proxy_http_version 1.1;
- proxy_read_timeout 1800s;
- proxy_connect_timeout 1600s;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection $connection_upgrade;
- proxy_set_header Connection "Keep-Alive";
- proxy_set_header Proxy-Connection "Keep-Alive";
- proxy_redirect off;
- '';
- };
-
- "/ready" = {
- proxyPass = "http://localhost:3100";
- extraConfig = ''
- proxy_http_version 1.1;
- proxy_set_header Connection "Keep-Alive";
- proxy_set_header Proxy-Connection "Keep-Alive";
- proxy_redirect off;
- '';
- };
- };
- };
- };
- };
- };
-}
diff --git a/modules/nixos/selfhosted/monitoring/promtail.nix b/modules/nixos/selfhosted/monitoring/promtail.nix
deleted file mode 100644
index 4a31bbe..0000000
--- a/modules/nixos/selfhosted/monitoring/promtail.nix
+++ /dev/null
@@ -1,55 +0,0 @@
-{lib, ...}: {
- services = {
- promtail = {
- enable = true;
- configuration = {
- server = {
- http_listen_port = 9080;
- grpc_listen_port = 0;
- };
- positions = {
- filename = "/var/lib/promtail/positions.yaml";
- };
- clients = [
- {
- url = "https://loki.tux.rs/loki/api/v1/push";
- }
- ];
- scrape_configs = [
- {
- job_name = "journal";
- journal = {
- max_age = "12h";
- labels = {
- job = "systemd-journal";
- };
- };
- relabel_configs = [
- {
- source_labels = [
- "__journal__systemd_unit"
- ];
- target_label = "unit";
- }
- ];
- }
- ];
- };
- };
-
- nginx = {
- enable = lib.mkForce true;
- virtualHosts = {
- "promtail.tux.rs" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- locations = {
- "/" = {
- proxyPass = "http://localhost:9080";
- };
- };
- };
- };
- };
- };
-}
diff --git a/modules/nixos/selfhosted/nextcloud.nix b/modules/nixos/selfhosted/nextcloud.nix
deleted file mode 100644
index b2c0850..0000000
--- a/modules/nixos/selfhosted/nextcloud.nix
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- config,
- pkgs,
- lib,
- username,
- ...
-}: {
- services = {
- nginx = {
- enable = lib.mkForce true;
- virtualHosts = {
- "cloud.tux.rs" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- };
- };
- };
-
- nextcloud = {
- enable = true;
- hostName = "cloud.tux.rs";
- package = pkgs.nextcloud32;
- database.createLocally = true;
- configureRedis = true;
- maxUploadSize = "16G";
- https = true;
-
- autoUpdateApps.enable = true;
- extraAppsEnable = true;
- extraApps = with config.services.nextcloud.package.packages.apps; {
- inherit mail spreed;
- };
-
- config = {
- dbtype = "sqlite";
- adminuser = "${username}";
- adminpassFile = config.sops.secrets.nextcloud_password.path;
- };
-
- settings = {
- overwriteProtocol = "https";
- default_phone_region = "IN";
- };
- };
- };
-
- environment.systemPackages = with pkgs; [
- nextcloud32
- ];
-}
diff --git a/modules/nixos/selfhosted/ntfy-sh.nix b/modules/nixos/selfhosted/ntfy-sh.nix
deleted file mode 100644
index fcb19e1..0000000
--- a/modules/nixos/selfhosted/ntfy-sh.nix
+++ /dev/null
@@ -1,28 +0,0 @@
-{lib, ...}: {
- services = {
- ntfy-sh = {
- enable = true;
- settings = {
- listen-http = ":7070";
- base-url = "https://ntfy.tux.rs";
- behind-proxy = true;
- };
- };
-
- nginx = {
- enable = lib.mkForce true;
- virtualHosts = {
- "ntfy.tux.rs" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- locations = {
- "/" = {
- proxyPass = "http://localhost:7070";
- proxyWebsockets = true;
- };
- };
- };
- };
- };
- };
-}
diff --git a/modules/nixos/selfhosted/open-webui.nix b/modules/nixos/selfhosted/open-webui.nix
deleted file mode 100644
index ab69d7e..0000000
--- a/modules/nixos/selfhosted/open-webui.nix
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- lib,
- config,
- ...
-}: {
- services = {
- open-webui = {
- enable = true;
- openFirewall = true;
- host = "0.0.0.0";
- port = 1111;
- environment = {
- WEBUI_URL = "https://chat.tux.rs";
- ENABLE_OLLAMA_API = "True";
- OLLAMA_BASE_URL = "http://pc:11434";
- };
- };
-
- nginx = {
- enable = lib.mkForce true;
- virtualHosts = {
- "chat.tux.rs" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- locations = {
- "/" = {
- proxyPass = "http://${config.services.open-webui.host}:${toString config.services.open-webui.port}";
- proxyWebsockets = true;
- };
- };
- };
- };
- };
- };
-}
diff --git a/modules/nixos/selfhosted/plausible.nix b/modules/nixos/selfhosted/plausible.nix
deleted file mode 100644
index 1f62556..0000000
--- a/modules/nixos/selfhosted/plausible.nix
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- config,
- lib,
- ...
-}: {
- services = {
- plausible = {
- enable = true;
-
- server = {
- baseUrl = "https://plausible.tux.rs";
- port = 2100;
- disableRegistration = true;
- secretKeybaseFile = config.sops.secrets.plausible_key.path;
- };
-
- database.postgres = {
- dbname = "plausible";
- socket = "/run/postgresql";
- };
- };
-
- nginx = {
- enable = lib.mkForce true;
- virtualHosts = {
- "plausible.tux.rs" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- locations = {
- "/" = {
- proxyPass = "http://localhost:2100";
- proxyWebsockets = true;
- };
- };
- };
- };
- };
- };
-}
diff --git a/modules/nixos/selfhosted/postgresql.nix b/modules/nixos/selfhosted/postgresql.nix
deleted file mode 100644
index f79085b..0000000
--- a/modules/nixos/selfhosted/postgresql.nix
+++ /dev/null
@@ -1,97 +0,0 @@
-{
- lib,
- pkgs,
- ...
-}: {
- services.postgresql = {
- enable = true;
- package = pkgs.postgresql_16;
-
- ensureDatabases = [
- "plausible"
- "wakapi"
- ];
- ensureUsers = [
- {
- name = "postgres";
- ensureClauses = {
- superuser = true;
- login = true;
- createrole = true;
- createdb = true;
- replication = true;
- };
- }
- {
- name = "plausible";
- ensureDBOwnership = true;
- }
- {
- name = "wakapi";
- ensureDBOwnership = true;
- }
- ];
-
- checkConfig = true;
- enableTCPIP = false;
-
- settings = {
- max_connections = 100;
- superuser_reserved_connections = 3;
-
- shared_buffers = "1024 MB";
- work_mem = "32 MB";
- maintenance_work_mem = "320 MB";
- huge_pages = "off";
- effective_cache_size = "3 GB";
- effective_io_concurrency = 100;
- random_page_cost = 1.25;
-
- shared_preload_libraries = "pg_stat_statements";
- track_io_timing = "on";
- track_functions = "pl";
-
- wal_level = "replica";
- max_wal_senders = 0;
- synchronous_commit = "on";
-
- checkpoint_timeout = "15 min";
- checkpoint_completion_target = 0.9;
- max_wal_size = "1024 MB";
- min_wal_size = "512 MB";
-
- wal_compression = "on";
- wal_buffers = -1;
- wal_writer_delay = "200ms";
- wal_writer_flush_after = "1MB";
-
- bgwriter_delay = "200ms";
- bgwriter_lru_maxpages = 100;
- bgwriter_lru_multiplier = 2.0;
- bgwriter_flush_after = 0;
-
- max_worker_processes = 3;
- max_parallel_workers_per_gather = 2;
- max_parallel_maintenance_workers = 2;
- max_parallel_workers = 3;
- parallel_leader_participation = "on";
-
- enable_partitionwise_join = "on";
- enable_partitionwise_aggregate = "on";
- jit = "on";
-
- jit_above_cost = 100000;
- jit_inline_above_cost = 150000;
- jit_optimize_above_cost = 500000;
-
- log_min_duration_statement = 100;
- "auto_explain.log_min_duration" = 100;
-
- log_connections = true;
- log_statement = "all";
- logging_collector = true;
- log_disconnections = true;
- log_destination = lib.mkForce "syslog";
- };
- };
-}
diff --git a/modules/nixos/selfhosted/rustdesk-server.nix b/modules/nixos/selfhosted/rustdesk-server.nix
deleted file mode 100644
index 4a85453..0000000
--- a/modules/nixos/selfhosted/rustdesk-server.nix
+++ /dev/null
@@ -1,9 +0,0 @@
-{...}: {
- services = {
- rustdesk-server = {
- enable = true;
- openFirewall = true;
- signal.relayHosts = ["156.67.105.203"];
- };
- };
-}
diff --git a/modules/nixos/selfhosted/searx.nix b/modules/nixos/selfhosted/searx.nix
deleted file mode 100644
index aa89895..0000000
--- a/modules/nixos/selfhosted/searx.nix
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- pkgs,
- lib,
- config,
- ...
-}: {
- services = {
- searx = {
- enable = true;
- package = pkgs.searxng;
- environmentFile = config.sops.secrets.searx_secret_key.path;
- settings = {
- general = {
- instance_name = "SearXNG";
- };
- server = {
- bind_address = "0.0.0.0";
- port = 3415;
- base_url = "https://sx.tux.rs";
- secret_key = "@secret_key@";
- };
- search = {
- autocomplete = "google";
- };
- };
- };
-
- nginx = {
- enable = lib.mkForce true;
- virtualHosts = {
- "sx.tux.rs" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- locations = {
- "/" = {
- proxyPass = "http://localhost:3415";
- };
- };
- };
- };
- };
- };
-}
diff --git a/modules/nixos/selfhosted/send.nix b/modules/nixos/selfhosted/send.nix
deleted file mode 100644
index 093a993..0000000
--- a/modules/nixos/selfhosted/send.nix
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- lib,
- config,
- ...
-}: {
- services = {
- send = {
- enable = true;
- port = 1443;
-
- environment = {
- DEFAULT_DOWNLOADS = 5;
- DETECT_BASE_URL = true;
- };
- };
-
- nginx = {
- enable = lib.mkForce true;
- virtualHosts = {
- "share.tux.rs" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- locations = {
- "/" = {
- proxyPass = "http://${config.services.send.host}:${toString config.services.send.port}";
- proxyWebsockets = true;
- };
- };
- };
- };
- };
- };
-}
diff --git a/modules/nixos/selfhosted/silver-bullet.nix b/modules/nixos/selfhosted/silver-bullet.nix
deleted file mode 100644
index 89aae56..0000000
--- a/modules/nixos/selfhosted/silver-bullet.nix
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- lib,
- config,
- ...
-}: {
- services = {
- silverbullet = {
- enable = true;
- listenPort = 9876;
- envFile = config.sops.secrets.silver_bullet.path;
- };
-
- nginx = {
- enable = lib.mkForce true;
- virtualHosts = {
- "notes.tux.rs" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- locations = {
- "/" = {
- proxyPass = "http://localhost:9876";
- };
- };
- };
- };
- };
- };
-}
diff --git a/modules/nixos/selfhosted/tfolio.nix b/modules/nixos/selfhosted/tfolio.nix
deleted file mode 100644
index 9669acf..0000000
--- a/modules/nixos/selfhosted/tfolio.nix
+++ /dev/null
@@ -1,102 +0,0 @@
-{
- config,
- lib,
- pkgs,
- ...
-}:
-with lib; let
- cfg = config.tux.services.tfolio;
-in {
- options.tux.services.tfolio = {
- enable = mkEnableOption "Enable tfolio";
-
- host = mkOption {
- type = lib.types.str;
- default = "0.0.0.0";
- description = "IP address or hostname on which the tfolio service will listen.";
- };
-
- port = mkOption {
- type = lib.types.port;
- default = 22;
- description = "Port number on which the tfolio service will listen.";
- };
-
- dataDir = mkOption {
- type = lib.types.str;
- default = "/var/lib/tfolio/";
- description = "Directory where tfolio will store its data files.";
- };
-
- user = mkOption {
- type = types.str;
- default = "tfolio";
- description = "User under which the tfolio service runs.";
- };
-
- group = mkOption {
- type = types.str;
- default = "tfolio";
- description = "Group under which the tfolio service runs.";
- };
- };
-
- config = mkIf cfg.enable {
- systemd.services = {
- tfolio = {
- description = "my portfolio in a ssh session";
- after = ["network.target"];
- wantedBy = ["multi-user.target"];
-
- serviceConfig = {
- Type = "simple";
- User = cfg.user;
- Group = cfg.group;
- ExecStart = "${getExe pkgs.tfolio} -l ${cfg.host} -p ${toString cfg.port} -d ${cfg.dataDir}";
- Restart = "always";
- StateDirectory = "tfolio";
-
- # Allow binding to privileged ports
- AmbientCapabilities = "CAP_NET_BIND_SERVICE";
- CapabilityBoundingSet = "CAP_NET_BIND_SERVICE";
-
- LockPersonality = true;
- MemoryDenyWriteExecute = true;
- NoNewPrivileges = true;
- PrivateDevices = true;
- PrivateIPC = true;
- PrivateTmp = true;
- ProtectClock = true;
- ProtectControlGroups = true;
- ProtectHome = "read-only";
- ProtectHostname = true;
- ProtectKernelLogs = true;
- ProtectKernelModules = true;
- ProtectKernelTunables = true;
- ProtectProc = "invisible";
- ProtectSystem = "full";
- RestrictNamespaces = "uts ipc pid user cgroup";
- RestrictRealtime = true;
- RestrictSUIDSGID = true;
- SystemCallArchitectures = "native";
- SystemCallFilter = ["@system-service"];
- UMask = "0077";
- };
- };
- };
- # Ensure the user and group exist
- users.users = mkIf (cfg.user == "tfolio") {
- ${cfg.user} = {
- isSystemUser = true;
- group = cfg.group;
- description = "tfolio service user";
- home = "/var/lib/tfolio";
- createHome = true;
- };
- };
-
- users.groups = mkIf (cfg.group == "tfolio") {
- ${cfg.group} = {};
- };
- };
-}
diff --git a/modules/nixos/selfhosted/umami.nix b/modules/nixos/selfhosted/umami.nix
deleted file mode 100644
index 7f815f8..0000000
--- a/modules/nixos/selfhosted/umami.nix
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- lib,
- config,
- ...
-}: {
- services = {
- umami = {
- enable = true;
- settings = {
- APP_SECRET_FILE = config.sops.secrets.umami.path;
- PORT = 4645;
- };
- createPostgresqlDatabase = true;
- };
-
- nginx = {
- enable = lib.mkForce true;
- virtualHosts = {
- "umami.tux.rs" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- locations = {
- "/" = {
- proxyPass = "http://localhost:${toString config.services.umami.settings.PORT}";
- proxyWebsockets = true;
- };
- };
- };
- };
- };
- };
-}
diff --git a/modules/nixos/selfhosted/upstream-proxy.nix b/modules/nixos/selfhosted/upstream-proxy.nix
deleted file mode 100644
index 7ca136e..0000000
--- a/modules/nixos/selfhosted/upstream-proxy.nix
+++ /dev/null
@@ -1,60 +0,0 @@
-{
- lib,
- config,
- pkgs,
- ...
-}: let
- cfg = config.tux.services.nginxStreamProxy;
-
- upstreamServerType = lib.types.submodule ({config, ...}: {
- options = {
- address = lib.mkOption {
- type = lib.types.str;
- description = "IP address or hostname of the upstream server";
- };
- port = lib.mkOption {
- type = lib.types.port;
- default = 9999;
- description = "Port number of the upstream server";
- };
- listenPort = lib.mkOption {
- type = lib.types.port;
- default = config.port;
- defaultText = lib.literalExpression "port";
- description = "Local port to listen for incoming connections (defaults to port)";
- };
- };
- });
-in {
- options.tux.services.nginxStreamProxy = {
- enable = lib.mkEnableOption "Enable nginx TCP stream proxy";
-
- upstreamServers = lib.mkOption {
- type = lib.types.listOf upstreamServerType;
- default = [
- {
- address = "0.0.0.0";
- port = 9999;
- }
- ];
- description = "List of upstream servers to proxy to, each with its own listen port";
- };
- };
-
- config = lib.mkIf cfg.enable {
- networking.firewall.allowedTCPPorts = map (server: server.listenPort) cfg.upstreamServers;
-
- services.nginx = {
- enable = lib.mkForce true;
- package = pkgs.nginx.override {withStream = true;};
- streamConfig =
- lib.concatMapStringsSep "\n" (server: ''
- server {
- listen ${toString server.listenPort};
- proxy_pass ${server.address}:${toString server.port};
- }
- '')
- cfg.upstreamServers;
- };
- };
-}
diff --git a/modules/nixos/selfhosted/uptime-kuma.nix b/modules/nixos/selfhosted/uptime-kuma.nix
deleted file mode 100644
index ba33ffd..0000000
--- a/modules/nixos/selfhosted/uptime-kuma.nix
+++ /dev/null
@@ -1,22 +0,0 @@
-{lib, ...}: {
- services = {
- uptime-kuma = {
- enable = true;
- };
-
- nginx = {
- enable = lib.mkForce true;
- virtualHosts = {
- "uptime.tux.rs" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- locations = {
- "/" = {
- proxyPass = "http://localhost:3001";
- };
- };
- };
- };
- };
- };
-}
diff --git a/modules/nixos/selfhosted/vaultwarden.nix b/modules/nixos/selfhosted/vaultwarden.nix
deleted file mode 100644
index d518e16..0000000
--- a/modules/nixos/selfhosted/vaultwarden.nix
+++ /dev/null
@@ -1,29 +0,0 @@
-{lib, ...}: {
- services = {
- vaultwarden = {
- enable = true;
- config = {
- domain = "https://bw.tux.rs";
- enableWebsocket = true;
- signupsAllowed = true;
- disableIconDownload = true;
- };
- };
-
- nginx = {
- enable = lib.mkForce true;
- virtualHosts = {
- "bw.tux.rs" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- locations = {
- "/" = {
- proxyPass = "http://localhost:8000";
- proxyWebsockets = true;
- };
- };
- };
- };
- };
- };
-}
diff --git a/modules/nixos/selfhosted/wakapi.nix b/modules/nixos/selfhosted/wakapi.nix
deleted file mode 100644
index 60e4a9a..0000000
--- a/modules/nixos/selfhosted/wakapi.nix
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- lib,
- config,
- ...
-}: {
- services = {
- wakapi = {
- enable = true;
- passwordSaltFile = config.sops.secrets.wakapi_salt.path;
- database.createLocally = true;
- settings = {
- app.avatar_url_template = "https://www.gravatar.com/avatar/{email_hash}.png";
-
- server = {
- port = 15999;
- public_url = "https://wakapi.tux.rs";
- };
-
- db = {
- dialect = "postgres";
- host = "/run/postgresql";
- port = 5432;
- name = "wakapi";
- user = "wakapi";
- };
-
- security = {
- allow_signup = false;
- disable_frontpage = true;
- };
- };
- };
-
- nginx = {
- enable = lib.mkForce true;
- virtualHosts = {
- "wakapi.tux.rs" = {
- forceSSL = true;
- useACMEHost = "tux.rs";
- locations = {
- "/" = {
- proxyPass = "http://localhost:15999";
- proxyWebsockets = true;
- };
- };
- };
- };
- };
- };
-}
diff --git a/modules/nixos/services/aiostreams.nix b/modules/nixos/services/aiostreams.nix
new file mode 100644
index 0000000..64b60df
--- /dev/null
+++ b/modules/nixos/services/aiostreams.nix
@@ -0,0 +1,127 @@
+{
+ flake.modules.nixos.services =
+ {
+ config,
+ lib,
+ ...
+ }:
+ with lib;
+ let
+ cfg = config.tnix.services.aiostreams;
+ port = toString cfg.port;
+ acmeHost = config.tnix.services.nginx.domain;
+ in
+ {
+ options.tnix.services.aiostreams = {
+ enable = mkEnableOption "AIOStreams";
+
+ host = mkOption {
+ type = types.str;
+ default = "127.0.0.1";
+ description = "Host on which AIOStreams listens";
+ };
+
+ port = mkOption {
+ type = types.port;
+ default = 3000;
+ description = "Port on which AIOStreams listens";
+ };
+
+ domain = mkOption {
+ type = types.str;
+ default = "";
+ description = "Domain on which AIOStreams is available";
+ };
+
+ configureNginx = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Whether to configure Nginx as a reverse proxy for AIOStreams";
+ };
+
+ configurePangolin = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Whether to configure Pangolin as a reverse proxy for AIOStreams";
+ };
+
+ image = mkOption {
+ type = types.str;
+ default = "ghcr.io/viren070/aiostreams:latest";
+ description = "Container image to use";
+ };
+
+ dataDir = mkOption {
+ type = types.path;
+ default = "/var/lib/docker/volumes/aiostreams/_data";
+ description = "Directory to store persistent AIOStreams data";
+ };
+
+ environmentFile = mkOption {
+ type = types.nullOr types.path;
+ default = null;
+ description = "Environment file with secrets passed to the container";
+ };
+ };
+
+ config = mkIf cfg.enable {
+ assertions = [
+ {
+ assertion = cfg.domain != "";
+ message = "tnix.services.aiostreams.domain must be set when tnix.services.aiostreams.enable is true.";
+ }
+ ];
+
+ virtualisation.oci-containers.containers.aiostreams = {
+ image = cfg.image;
+ ports = [
+ "${cfg.host}:${port}:3000"
+ ];
+ environment = {
+ ADDON_ID = cfg.domain;
+ BASE_URL = "https://${cfg.domain}";
+ };
+ environmentFiles = optional (cfg.environmentFile != null) cfg.environmentFile;
+ volumes = [
+ "${cfg.dataDir}:/app/data"
+ ];
+ };
+
+ services = {
+ nginx.virtualHosts.${cfg.domain} = mkIf cfg.configureNginx {
+ forceSSL = acmeHost != "";
+ useACMEHost = mkIf (acmeHost != "") acmeHost;
+ locations."/" = {
+ proxyPass = "http://${cfg.host}:${port}";
+ proxyWebsockets = true;
+ };
+ };
+
+ newt.blueprint.proxy-resources = mkIf cfg.configurePangolin {
+ aiostreams = {
+ auth = {
+ sso-enabled = false;
+ };
+ full-domain = cfg.domain;
+ name = "aiostreams";
+ protocol = "http";
+ targets = [
+ {
+ hostname = "localhost";
+ method = "http";
+ port = cfg.port;
+ healthcheck = {
+ hostname = "localhost";
+ port = cfg.port;
+ scheme = "http";
+ method = "GET";
+ path = "/";
+ };
+ }
+ ];
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/modules/nixos/services/copyparty.nix b/modules/nixos/services/copyparty.nix
new file mode 100644
index 0000000..0ec9631
--- /dev/null
+++ b/modules/nixos/services/copyparty.nix
@@ -0,0 +1,118 @@
+{ inputs, ... }: {
+ flake.modules.nixos.services =
+ {
+ config,
+ lib,
+ pkgs,
+ options,
+ ...
+ }:
+ with lib;
+ let
+ cfg = config.tnix.services.copyparty;
+ port = toString cfg.port;
+ acmeHost = config.tnix.services.nginx.domain;
+ in
+ {
+ imports = [
+ inputs.copyparty.nixosModules.default
+ ];
+
+ options.tnix.services.copyparty = {
+ enable = mkEnableOption "Copyparty";
+
+ host = mkOption {
+ type = types.str;
+ default = "127.0.0.1";
+ description = "Host on which Copyparty listens";
+ };
+
+ port = mkOption {
+ type = types.port;
+ default = 1115;
+ description = "Port on which Copyparty listens";
+ };
+
+ domain = mkOption {
+ type = types.str;
+ default = "";
+ description = "Domain on which Copyparty is available";
+ };
+
+ accounts = options.services.copyparty.accounts;
+ volumes = options.services.copyparty.volumes;
+
+ configureNginx = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Whether to configure Nginx as a reverse proxy for Copyparty";
+ };
+
+ configurePangolin = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Whether to configure Pangolin as a reverse proxy for Copyparty";
+ };
+ };
+
+ config = mkIf cfg.enable {
+ assertions = [
+ {
+ assertion = cfg.domain != "";
+ message = "tnix.services.copyparty.domain must be set when tnix.services.copyparty.enable is true.";
+ }
+ ];
+
+ services = {
+ copyparty = {
+ enable = true;
+ settings = {
+ i = cfg.host;
+ p = cfg.port;
+ no-reload = true;
+ ignored-flag = false;
+ };
+ accounts = cfg.accounts;
+ volumes = cfg.volumes;
+ package = pkgs.copyparty.override {
+ extraPackages = [ pkgs.exiftool ];
+ };
+ };
+
+ nginx.virtualHosts.${cfg.domain} = mkIf cfg.configureNginx {
+ forceSSL = acmeHost != "";
+ useACMEHost = mkIf (acmeHost != "") acmeHost;
+ locations."/" = {
+ proxyPass = "http://${cfg.host}:${port}";
+ proxyWebsockets = true;
+ };
+ };
+
+ newt.blueprint.proxy-resources = mkIf cfg.configurePangolin {
+ copyparty = {
+ auth = {
+ sso-enabled = false;
+ };
+ full-domain = cfg.domain;
+ name = "copyparty";
+ protocol = "http";
+ targets = [
+ {
+ hostname = "localhost";
+ method = "http";
+ port = cfg.port;
+ healthcheck = {
+ hostname = "localhost";
+ port = cfg.port;
+ scheme = "http";
+ method = "GET";
+ path = "/";
+ };
+ }
+ ];
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/modules/nixos/services/cyber-tux.nix b/modules/nixos/services/cyber-tux.nix
new file mode 100644
index 0000000..7614854
--- /dev/null
+++ b/modules/nixos/services/cyber-tux.nix
@@ -0,0 +1,106 @@
+{
+ flake.modules.nixos.services =
+ {
+ config,
+ lib,
+ pkgs,
+ ...
+ }:
+ with lib;
+ let
+ cfg = config.tnix.services.cyber-tux;
+ in
+ {
+ options.tnix.services.cyber-tux = {
+ enable = mkEnableOption "CyberTux Discord bot";
+
+ user = mkOption {
+ type = types.str;
+ default = "cyber-tux";
+ description = "User under which the CyberTux service runs.";
+ };
+
+ group = mkOption {
+ type = types.str;
+ default = "cyber-tux";
+ description = "Group under which the CyberTux service runs.";
+ };
+
+ dataDir = mkOption {
+ type = types.path;
+ default = "/var/lib/cyber-tux";
+ description = "Directory where CyberTux stores its data (must be under /var/lib).";
+ };
+
+ environmentFile = mkOption {
+ type = types.path;
+ description = "Environment file containing the Discord bot token.";
+ };
+ };
+
+ config = mkIf cfg.enable {
+ systemd.services.cyber-tux = {
+ description = "CyberTux Discord bot";
+ after = [ "network-online.target" ];
+ wants = [ "network-online.target" ];
+ wantedBy = [ "multi-user.target" ];
+
+ serviceConfig = {
+ Type = "simple";
+ User = cfg.user;
+ Group = cfg.group;
+ EnvironmentFile = cfg.environmentFile;
+ ExecStart = getExe pkgs.cyber-tux;
+ Restart = "always";
+ RestartSec = 5;
+ WorkingDirectory = cfg.dataDir;
+ StateDirectory = baseNameOf cfg.dataDir;
+ StateDirectoryMode = "0700";
+
+ LockPersonality = true;
+ MemoryDenyWriteExecute = true;
+ NoNewPrivileges = true;
+ PrivateDevices = true;
+ PrivateIPC = true;
+ PrivateTmp = true;
+ PrivateUsers = true;
+ ProtectClock = true;
+ ProtectControlGroups = true;
+ ProtectHome = true;
+ ProtectHostname = true;
+ ProtectKernelLogs = true;
+ ProtectKernelModules = true;
+ ProtectKernelTunables = true;
+ ProtectProc = "invisible";
+ ProtectSystem = "strict";
+ RestrictNamespaces = [
+ "uts"
+ "ipc"
+ "pid"
+ "user"
+ "cgroup"
+ ];
+ RestrictRealtime = true;
+ RestrictSUIDSGID = true;
+ SystemCallArchitectures = "native";
+ SystemCallFilter = [ "@system-service" ];
+ UMask = "0077";
+ };
+ };
+
+ users.users = mkIf (cfg.user == "cyber-tux") {
+ ${cfg.user} = {
+ isSystemUser = true;
+ group = cfg.group;
+ description = "CyberTux service user";
+ home = cfg.dataDir;
+ createHome = true;
+ };
+ };
+
+ users.groups = mkIf (cfg.group == "cyber-tux") {
+ ${cfg.group} = { };
+ };
+ };
+ };
+}
diff --git a/modules/nixos/services/gitea.nix b/modules/nixos/services/gitea.nix
new file mode 100644
index 0000000..743159a
--- /dev/null
+++ b/modules/nixos/services/gitea.nix
@@ -0,0 +1,123 @@
+{
+ flake.modules.nixos.services =
+ {
+ config,
+ lib,
+ ...
+ }:
+ with lib;
+ let
+ cfg = config.tnix.services.gitea;
+ port = toString cfg.port;
+ acmeHost = config.tnix.services.nginx.domain;
+ in
+ {
+ options.tnix.services.gitea = {
+ enable = mkEnableOption "Gitea";
+
+ host = mkOption {
+ type = types.str;
+ default = "127.0.0.1";
+ description = "Host on which Gitea listens";
+ };
+
+ port = mkOption {
+ type = types.port;
+ default = 1114;
+ description = "Port on which Gitea listens";
+ };
+
+ domain = mkOption {
+ type = types.str;
+ default = "";
+ description = "Domain on which Gitea is available";
+ };
+
+ configureNginx = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Whether to configure Nginx as a reverse proxy for Gitea";
+ };
+
+ configurePangolin = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Whether to configure Pangolin as a reverse proxy for Gitea";
+ };
+ };
+
+ config = mkIf cfg.enable {
+ assertions = [
+ {
+ assertion = cfg.domain != "";
+ message = "tnix.services.gitea.domain must be set when tnix.services.gitea.enable is true.";
+ }
+ ];
+
+ services = {
+ gitea = {
+ enable = true;
+ settings = {
+ service.DISABLE_REGISTRATION = true;
+ server = {
+ HTTP_ADDR = cfg.host;
+ HTTP_PORT = cfg.port;
+ DOMAIN = cfg.domain;
+ ROOT_URL = "https://${cfg.domain}";
+ };
+ };
+ database = {
+ type = "postgres";
+ name = "gitea";
+ user = "gitea";
+ };
+ };
+
+ nginx.virtualHosts.${cfg.domain} = mkIf cfg.configureNginx {
+ forceSSL = acmeHost != "";
+ useACMEHost = mkIf (acmeHost != "") acmeHost;
+ locations."/" = {
+ proxyPass = "http://${cfg.host}:${port}";
+ proxyWebsockets = true;
+ };
+ };
+
+ newt.blueprint.proxy-resources = mkIf cfg.configurePangolin {
+ gitea = {
+ auth = {
+ sso-enabled = false;
+ };
+ full-domain = cfg.domain;
+ name = "gitea";
+ protocol = "http";
+ targets = [
+ {
+ hostname = "localhost";
+ method = "http";
+ port = cfg.port;
+ healthcheck = {
+ hostname = "localhost";
+ port = cfg.port;
+ scheme = "http";
+ method = "GET";
+ path = "/";
+ };
+ }
+ ];
+ };
+ };
+
+ postgresql = {
+ enable = true;
+ ensureDatabases = [ "gitea" ];
+ ensureUsers = [
+ {
+ name = "gitea";
+ ensureDBOwnership = true;
+ }
+ ];
+ };
+ };
+ };
+ };
+}
diff --git a/modules/nixos/services/hermes-agent.nix b/modules/nixos/services/hermes-agent.nix
new file mode 100644
index 0000000..5f0da1d
--- /dev/null
+++ b/modules/nixos/services/hermes-agent.nix
@@ -0,0 +1,48 @@
+{ inputs, ... }: {
+ flake.modules.nixos.services =
+ {
+ config,
+ lib,
+ pkgs,
+ options,
+ userName,
+ ...
+ }:
+ with lib;
+ let
+ cfg = config.tnix.services.hermes-agent;
+ in
+ {
+ imports = [
+ inputs.hermes-agent.nixosModules.default
+ ];
+
+ options.tnix.services.hermes-agent = {
+ enable = mkEnableOption "Hermes Agent";
+ environmentFiles = options.services.hermes-agent.environmentFiles;
+ };
+
+ config = mkIf cfg.enable {
+ services.hermes-agent = {
+ enable = true;
+ settings.model = {
+ provider = "opencode-go";
+ default = "deepseek-v4-flash";
+ };
+ environmentFiles = cfg.environmentFiles;
+ addToSystemPackages = true;
+
+ extraPlugins = [
+ (pkgs.fetchFromGitHub {
+ owner = "DietrichGebert";
+ repo = "ponytail";
+ rev = "v4.9.0";
+ hash = "sha256-8cYggVltBAlZ/Zj4pl1bOu7mQdZFXCmDGW4RSpvRA+w=";
+ })
+ ];
+ };
+
+ users.users.${userName}.extraGroups = [ "hermes" ];
+ };
+ };
+}
diff --git a/modules/nixos/services/mediaflow-proxy.nix b/modules/nixos/services/mediaflow-proxy.nix
new file mode 100644
index 0000000..ba5cac3
--- /dev/null
+++ b/modules/nixos/services/mediaflow-proxy.nix
@@ -0,0 +1,122 @@
+{
+ flake.modules.nixos.services =
+ {
+ config,
+ lib,
+ ...
+ }:
+ with lib;
+ let
+ cfg = config.tnix.services.mediaflow-proxy;
+ port = toString cfg.port;
+ acmeHost = config.tnix.services.nginx.domain;
+ in
+ {
+ options.tnix.services.mediaflow-proxy = {
+ enable = mkEnableOption "MediaFlow Proxy";
+
+ host = mkOption {
+ type = types.str;
+ default = "0.0.0.0";
+ description = "Host on which MediaFlow Proxy listens";
+ };
+
+ port = mkOption {
+ type = types.port;
+ default = 1113;
+ description = "Port on which MediaFlow Proxy listens";
+ };
+
+ domain = mkOption {
+ type = types.str;
+ default = "";
+ description = "Domain on which MediaFlow Proxy is available";
+ };
+
+ configureNginx = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Whether to configure Nginx as a reverse proxy for MediaFlow Proxy";
+ };
+
+ configurePangolin = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Whether to configure Pangolin as a reverse proxy for MediaFlow Proxy";
+ };
+
+ image = mkOption {
+ type = types.str;
+ default = "ghcr.io/mhdzumair/mediaflow-proxy-light:latest";
+ description = "Container image to use";
+ };
+
+ environmentFile = mkOption {
+ type = types.nullOr types.path;
+ default = null;
+ description = "Environment file with secrets passed to the container";
+ };
+ };
+
+ config = mkIf cfg.enable {
+ assertions = [
+ {
+ assertion = !cfg.configureNginx || cfg.domain != "";
+ message = "tnix.services.mediaflow-proxy.domain must be set when tnix.services.mediaflow-proxy.configureNginx is enabled.";
+ }
+ {
+ assertion = !cfg.configurePangolin || cfg.domain != "";
+ message = "tnix.services.mediaflow-proxy.domain must be set when tnix.services.mediaflow-proxy.configurePangolin is enabled.";
+ }
+ ];
+
+ virtualisation.oci-containers.containers.mediaflow-proxy = {
+ image = cfg.image;
+ ports = [
+ "${cfg.host}:${port}:${port}"
+ ];
+ environment = {
+ APP__SERVER__HOST = "0.0.0.0";
+ APP__SERVER__PORT = port;
+ };
+ environmentFiles = optional (cfg.environmentFile != null) cfg.environmentFile;
+ };
+
+ services = {
+ nginx.virtualHosts.${cfg.domain} = mkIf cfg.configureNginx {
+ forceSSL = acmeHost != "";
+ useACMEHost = mkIf (acmeHost != "") acmeHost;
+ locations."/" = {
+ proxyPass = "http://${cfg.host}:${port}";
+ proxyWebsockets = true;
+ };
+ };
+
+ newt.blueprint.proxy-resources = mkIf cfg.configurePangolin {
+ mediaflow-proxy = {
+ auth = {
+ sso-enabled = false;
+ };
+ full-domain = cfg.domain;
+ name = "mediaflow-proxy";
+ protocol = "http";
+ targets = [
+ {
+ hostname = "localhost";
+ method = "http";
+ port = cfg.port;
+ healthcheck = {
+ hostname = "localhost";
+ port = cfg.port;
+ scheme = "http";
+ method = "GET";
+ path = "/";
+ };
+ }
+ ];
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/modules/nixos/services/nginx.nix b/modules/nixos/services/nginx.nix
new file mode 100644
index 0000000..30c6b4a
--- /dev/null
+++ b/modules/nixos/services/nginx.nix
@@ -0,0 +1,55 @@
+{
+ flake.modules.nixos.services =
+ {
+ config,
+ lib,
+ userEmail,
+ ...
+ }:
+ with lib;
+ let
+ cfg = config.tnix.services.nginx;
+ in
+ {
+ options.tnix.services.nginx = {
+ enable = mkEnableOption "Nginx";
+
+ domain = mkOption {
+ type = types.str;
+ default = "";
+ description = "Base domain for the wildcard ACME certificate (disabled when empty)";
+ };
+ };
+
+ config = mkIf cfg.enable {
+ security = {
+ acme = {
+ acceptTerms = true;
+ defaults.email = userEmail;
+ certs = mkIf (cfg.domain != "") {
+ "${cfg.domain}" = {
+ group = "nginx";
+ domain = "*.${cfg.domain}";
+ extraDomainNames = [ "${cfg.domain}" ];
+ dnsProvider = "cloudflare";
+ credentialFiles = {
+ CLOUDFLARE_EMAIL_FILE = config.sops.secrets."cloudflare-credentials/email".path;
+ CLOUDFLARE_DNS_API_TOKEN_FILE = config.sops.secrets."cloudflare-credentials/dns-api-token".path;
+ };
+ };
+ };
+ };
+ };
+
+ users.users.nginx.extraGroups = [ "acme" ];
+
+ services.nginx = {
+ enable = true;
+ recommendedGzipSettings = true;
+ recommendedOptimisation = true;
+ recommendedProxySettings = true;
+ recommendedTlsSettings = true;
+ };
+ };
+ };
+}
diff --git a/modules/nixos/services/pangolin.nix b/modules/nixos/services/pangolin.nix
new file mode 100644
index 0000000..ed2253a
--- /dev/null
+++ b/modules/nixos/services/pangolin.nix
@@ -0,0 +1,91 @@
+{
+ flake.modules.nixos.services =
+ {
+ config,
+ lib,
+ userEmail,
+ pkgs,
+ ...
+ }:
+ with lib;
+ let
+ cfg = config.tnix.services.pangolin;
+ in
+ {
+ options.tnix.services.pangolin = {
+ enable = mkEnableOption "Pangolin";
+
+ domain = mkOption {
+ type = types.str;
+ default = "";
+ description = "Domain on which Pangolin Dashboard is available";
+ };
+
+ baseDomain = mkOption {
+ type = types.str;
+ default = "";
+ description = "Pangolin base fully qualified domain name";
+ };
+
+ environmentFile = mkOption {
+ type = types.nullOr types.path;
+ default = null;
+ description = "Environment file with secrets passed to Pangolin";
+ };
+ };
+
+ config = mkIf cfg.enable {
+ services = {
+ pangolin = {
+ enable = true;
+ package = (
+ pkgs.fosrl-pangolin.override {
+ databaseType = "pg";
+ }
+ );
+ openFirewall = true;
+ baseDomain = cfg.baseDomain;
+ dashboardDomain = cfg.domain;
+ environmentFile = cfg.environmentFile;
+ letsEncryptEmail = userEmail;
+
+ settings = {
+ app.dashboard_url = "https://${config.services.pangolin.dashboardDomain}";
+ domains.domain1 = {
+ base_domain = config.services.pangolin.baseDomain;
+ prefer_wildcard_cert = false;
+ };
+ server = {
+ external_port = 3000;
+ internal_port = 3001;
+ next_port = 3002;
+ integration_port = 3003;
+ # needs to be set, otherwise this fails silently
+ # see https://github.com/fosrl/newt/issues/37
+ internal_hostname = "localhost";
+ };
+ gerbil.base_endpoint = config.services.pangolin.dashboardDomain;
+ flags = {
+ disable_signup_without_invite = true;
+ enable_integration_api = false;
+ allow_raw_resources = true;
+ disable_enterprise_features = true;
+ };
+ postgres.connection_string = "postgresql:///pangolin?host=/run/postgresql";
+ };
+ };
+
+ postgresql = {
+ enable = true;
+ ensureDatabases = [ "pangolin" ];
+ ensureUsers = [
+ {
+ name = "pangolin";
+ ensureDBOwnership = true;
+ }
+ ];
+ };
+ };
+ };
+ };
+}
diff --git a/modules/nixos/services/trok.nix b/modules/nixos/services/trok.nix
new file mode 100644
index 0000000..7c0a732
--- /dev/null
+++ b/modules/nixos/services/trok.nix
@@ -0,0 +1,27 @@
+{ inputs, ... }: {
+ flake.modules.nixos.services =
+ {
+ config,
+ lib,
+ ...
+ }:
+ with lib;
+ let
+ cfg = config.tnix.services.trok;
+ in
+ {
+ imports = [
+ inputs.trok.nixosModules.default
+ ];
+
+ options.tnix.services.trok = {
+ enable = mkEnableOption "trok";
+ };
+
+ config = mkIf cfg.enable {
+ services.trok = {
+ enable = true;
+ };
+ };
+ };
+}
diff --git a/modules/nixos/services/uptime-kuma.nix b/modules/nixos/services/uptime-kuma.nix
new file mode 100644
index 0000000..52fc8c3
--- /dev/null
+++ b/modules/nixos/services/uptime-kuma.nix
@@ -0,0 +1,102 @@
+{
+ flake.modules.nixos.services =
+ {
+ config,
+ lib,
+ ...
+ }:
+ with lib;
+ let
+ cfg = config.tnix.services.uptime-kuma;
+ port = toString cfg.port;
+ acmeHost = config.tnix.services.nginx.domain;
+ in
+ {
+ options.tnix.services.uptime-kuma = {
+ enable = mkEnableOption "Uptime Kuma";
+
+ host = mkOption {
+ type = types.str;
+ default = "127.0.0.1";
+ description = "Host on which Uptime Kuma listens";
+ };
+
+ port = mkOption {
+ type = types.port;
+ default = 1111;
+ description = "Port on which Uptime Kuma listens";
+ };
+
+ domain = mkOption {
+ type = types.str;
+ default = "";
+ description = "Domain on which Uptime Kuma is available";
+ };
+
+ configureNginx = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Whether to configure Nginx as a reverse proxy for Uptime Kuma";
+ };
+
+ configurePangolin = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Whether to configure Pangolin as a reverse proxy for Uptime Kuma";
+ };
+ };
+
+ config = mkIf cfg.enable {
+ assertions = [
+ {
+ assertion = cfg.domain != "";
+ message = "tnix.services.uptime-kuma.domain must be set when tnix.services.uptime-kuma.enable is true.";
+ }
+ ];
+
+ services = {
+ uptime-kuma = {
+ enable = true;
+ settings = {
+ HOST = cfg.host;
+ PORT = port;
+ };
+ };
+
+ nginx.virtualHosts.${cfg.domain} = mkIf cfg.configureNginx {
+ forceSSL = acmeHost != "";
+ useACMEHost = mkIf (acmeHost != "") acmeHost;
+ locations."/" = {
+ proxyPass = "http://${cfg.host}:${port}";
+ proxyWebsockets = true;
+ };
+ };
+
+ newt.blueprint.proxy-resources = mkIf cfg.configurePangolin {
+ uptime-kuma = {
+ auth = {
+ sso-enabled = false;
+ };
+ full-domain = cfg.domain;
+ name = "uptime-kuma";
+ protocol = "http";
+ targets = [
+ {
+ hostname = "localhost";
+ method = "http";
+ port = cfg.port;
+ healthcheck = {
+ hostname = "localhost";
+ port = cfg.port;
+ scheme = "http";
+ method = "GET";
+ path = "/";
+ };
+ }
+ ];
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/modules/nixos/services/vaultwarden.nix b/modules/nixos/services/vaultwarden.nix
new file mode 100644
index 0000000..e2ac87b
--- /dev/null
+++ b/modules/nixos/services/vaultwarden.nix
@@ -0,0 +1,120 @@
+{
+ flake.modules.nixos.services =
+ {
+ config,
+ lib,
+ ...
+ }:
+ with lib;
+ let
+ cfg = config.tnix.services.vaultwarden;
+ port = toString cfg.port;
+ acmeHost = config.tnix.services.nginx.domain;
+ in
+ {
+ options.tnix.services.vaultwarden = {
+ enable = mkEnableOption "Vaultwarden";
+
+ host = mkOption {
+ type = types.str;
+ default = "127.0.0.1";
+ description = "Host on which Vaultwarden listens";
+ };
+
+ port = mkOption {
+ type = types.port;
+ default = 1112;
+ description = "Port on which Vaultwarden listens";
+ };
+
+ domain = mkOption {
+ type = types.str;
+ default = "";
+ description = "Domain on which Vaultwarden is available";
+ };
+
+ configureNginx = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Whether to configure Nginx as a reverse proxy for Vaultwarden";
+ };
+
+ configurePangolin = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Whether to configure Pangolin as a reverse proxy for Vaultwarden";
+ };
+ };
+
+ config = mkIf cfg.enable {
+ assertions = [
+ {
+ assertion = cfg.domain != "";
+ message = "tnix.services.vaultwarden.domain must be set when tnix.services.vaultwarden.enable is true.";
+ }
+ ];
+
+ services = {
+ vaultwarden = {
+ enable = true;
+ dbBackend = "postgresql";
+ config = {
+ ROCKET_ADDRESS = cfg.host;
+ ROCKET_PORT = cfg.port;
+ DOMAIN = "https://${cfg.domain}";
+
+ DATABASE_URL = "postgresql:///vaultwarden?host=/run/postgresql";
+ ENABLE_WEBSOCKET = true;
+ SIGNUPS_ALLOWED = true;
+ DISABLE_ICON_DOWNLOAD = true;
+ };
+ };
+
+ nginx.virtualHosts.${cfg.domain} = mkIf cfg.configureNginx {
+ forceSSL = acmeHost != "";
+ useACMEHost = mkIf (acmeHost != "") acmeHost;
+ locations."/" = {
+ proxyPass = "http://${cfg.host}:${port}";
+ proxyWebsockets = true;
+ };
+ };
+
+ newt.blueprint.proxy-resources = mkIf cfg.configurePangolin {
+ vaultwarden = {
+ auth = {
+ sso-enabled = false;
+ };
+ full-domain = cfg.domain;
+ name = "vaultwarden";
+ protocol = "http";
+ targets = [
+ {
+ hostname = "localhost";
+ method = "http";
+ port = cfg.port;
+ healthcheck = {
+ hostname = "localhost";
+ port = cfg.port;
+ scheme = "http";
+ method = "GET";
+ path = "/";
+ };
+ }
+ ];
+ };
+ };
+
+ postgresql = {
+ enable = true;
+ ensureDatabases = [ "vaultwarden" ];
+ ensureUsers = [
+ {
+ name = "vaultwarden";
+ ensureDBOwnership = true;
+ }
+ ];
+ };
+ };
+ };
+ };
+}
diff --git a/modules/nixos/steam.nix b/modules/nixos/steam.nix
deleted file mode 100644
index 1931b0d..0000000
--- a/modules/nixos/steam.nix
+++ /dev/null
@@ -1,7 +0,0 @@
-{...}: {
- programs.steam = {
- enable = true;
- };
-
- hardware.graphics.enable32Bit = true;
-}
diff --git a/modules/nixos/virtualisation/default.nix b/modules/nixos/virtualisation/default.nix
deleted file mode 100755
index bbae769..0000000
--- a/modules/nixos/virtualisation/default.nix
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- imports = [
- ./docker.nix
- ./waydroid.nix
- ./qemu.nix
- ];
-}
diff --git a/modules/nixos/virtualisation/distrobox.nix b/modules/nixos/virtualisation/distrobox.nix
new file mode 100644
index 0000000..aa22cf6
--- /dev/null
+++ b/modules/nixos/virtualisation/distrobox.nix
@@ -0,0 +1,118 @@
+{
+ flake.modules.nixos.virtualisation =
+ {
+ config,
+ lib,
+ pkgs,
+ ...
+ }:
+ let
+ cfg = config.tnix.virtualisation;
+ in
+ {
+ options.tnix.virtualisation.distrobox = {
+ enable = lib.mkEnableOption "Enable DistroBox";
+ };
+
+ config = lib.mkIf cfg.distrobox.enable {
+ virtualisation.waydroid.enable = true;
+
+ environment.systemPackages = with pkgs; [
+ distrobox
+
+ (writeShellScriptBin "dbox-create" ''
+ #!/usr/bin/env bash
+
+ # 1. Initialize variables
+ IMAGE=""
+ NAME=""
+
+ # Array to hold optional arguments (like volumes)
+ declare -a EXTRA_ARGS
+
+ # 2. Parse arguments
+ while [[ $# -gt 0 ]]; do
+ case $1 in
+ -i|--image)
+ IMAGE="$2"
+ shift 2
+ ;;
+ -n|--name)
+ NAME="$2"
+ shift 2
+ ;;
+ -p|--profile)
+ echo ":: Profile mode enabled: Mounting Nix store and user profiles (Read-Only)"
+ # Add volume flags to the array
+ EXTRA_ARGS+=( "--volume" "/nix/store:/nix/store:ro" )
+ EXTRA_ARGS+=( "--volume" "/etc/profiles/per-user:/etc/profiles/per-user:ro" )
+ EXTRA_ARGS+=( "--volume" "/etc/static/profiles/per-user:/etc/static/profiles/per-user:ro" )
+ shift 1
+ ;;
+ *)
+ echo "Unknown option $1"
+ exit 1
+ ;;
+ esac
+ done
+
+ if [ -z "$IMAGE" ] || [ -z "$NAME" ]; then
+ echo "Usage: dbox-create -i -n [-p]"
+ exit 1
+ fi
+
+ # 3. Define the custom home path
+ CUSTOM_HOME="$HOME/Distrobox/$NAME"
+
+ echo "------------------------------------------------"
+ echo "Creating Distrobox: $NAME"
+ echo "Location: $CUSTOM_HOME"
+ echo "------------------------------------------------"
+
+ # 4. Run Distrobox Create
+ # We expand "''${EXTRA_ARGS[@]}" to properly pass the volume arguments
+ ${pkgs.distrobox}/bin/distrobox create \
+ --image "$IMAGE" \
+ --name "$NAME" \
+ --home "$CUSTOM_HOME" \
+ "''${EXTRA_ARGS[@]}"
+
+ # Check exit code
+ if [ $? -ne 0 ]; then
+ echo "Error: Distrobox creation failed."
+ exit 1
+ fi
+
+ # 5. Post-Creation: Symlink Config Files
+ echo "--> Linking configurations to $NAME..."
+
+ # Helper function to symlink
+ link_config() {
+ SRC="$1"
+ DEST="$2"
+ DEST_DIR=$(dirname "$DEST")
+
+ # Create parent directory if it doesn't exist
+ mkdir -p "$DEST_DIR"
+
+ if [ -e "$SRC" ]; then
+ # ln -sf: symbolic link, force overwrite
+ ln -sf "$SRC" "$DEST"
+ echo " [LINK] $DEST -> $SRC"
+ else
+ echo " [SKIP] $SRC not found on host"
+ fi
+ }
+
+ # Create Symlinks
+ link_config "$HOME/.zshrc" "$CUSTOM_HOME/.zshrc"
+ link_config "$HOME/.zshenv" "$CUSTOM_HOME/.zshenv"
+ link_config "$HOME/.config/fastfetch" "$CUSTOM_HOME/.config/fastfetch"
+ link_config "$HOME/.config/starship.toml" "$CUSTOM_HOME/.config/starship.toml"
+
+ echo "--> Done! Enter via: distrobox enter $NAME"
+ '')
+ ];
+ };
+ };
+}
diff --git a/modules/nixos/virtualisation/docker.nix b/modules/nixos/virtualisation/docker.nix
old mode 100755
new mode 100644
index d93f20a..dfcdb6e
--- a/modules/nixos/virtualisation/docker.nix
+++ b/modules/nixos/virtualisation/docker.nix
@@ -1,14 +1,32 @@
{
- username,
- pkgs,
- ...
-}: {
- virtualisation = {
- oci-containers.backend = "docker";
- docker.enable = true;
- };
+ flake.modules.nixos.virtualisation =
+ {
+ config,
+ lib,
+ pkgs,
+ userName,
+ ...
+ }:
+ let
+ cfg = config.tnix.virtualisation;
+ in
+ {
+ options.tnix.virtualisation.docker = {
+ enable = lib.mkEnableOption "Docker container runtime";
+ nvidia = {
+ enable = lib.mkEnableOption "NVIDIA Container Toolkit for Docker";
+ };
+ };
- environment.systemPackages = with pkgs; [lazydocker];
+ config = lib.mkIf cfg.docker.enable {
+ virtualisation = {
+ oci-containers.backend = "docker";
+ docker.enable = true;
+ };
- users.users.${username}.extraGroups = ["docker"];
+ hardware.nvidia-container-toolkit.enable = lib.mkIf cfg.docker.nvidia.enable true;
+ environment.systemPackages = with pkgs; [ lazydocker ];
+ users.users.${userName}.extraGroups = [ "docker" ];
+ };
+ };
}
diff --git a/modules/nixos/virtualisation/qemu.nix b/modules/nixos/virtualisation/qemu.nix
old mode 100755
new mode 100644
index 50ba010..793c2b0
--- a/modules/nixos/virtualisation/qemu.nix
+++ b/modules/nixos/virtualisation/qemu.nix
@@ -1,22 +1,38 @@
{
- pkgs,
- username,
- ...
-}: {
- virtualisation = {
- libvirtd = {
- enable = true;
- qemu = {
- swtpm.enable = true;
+ flake.modules.nixos.virtualisation =
+ {
+ config,
+ lib,
+ pkgs,
+ userName,
+ ...
+ }:
+ let
+ cfg = config.tnix.virtualisation;
+ in
+ {
+ options.tnix.virtualisation.qemu = {
+ enable = lib.mkEnableOption "QEMU/KVM virtualization with libvirtd";
+ };
+
+ config = lib.mkIf cfg.qemu.enable {
+ virtualisation = {
+ libvirtd = {
+ enable = true;
+ qemu = {
+ swtpm.enable = true;
+ };
+ };
+ spiceUSBRedirection.enable = true;
+ };
+
+ users.users.${userName}.extraGroups = [ "libvirtd" ];
+
+ environment.systemPackages = with pkgs; [
+ virt-manager
+ virt-viewer
+ ];
};
};
- spiceUSBRedirection.enable = true;
- };
- users.users.${username}.extraGroups = ["libvirtd"];
-
- environment.systemPackages = with pkgs; [
- virt-manager
- virt-viewer
- ];
}
diff --git a/modules/nixos/virtualisation/waydroid.nix b/modules/nixos/virtualisation/waydroid.nix
old mode 100755
new mode 100644
index 1e2080a..933e2d2
--- a/modules/nixos/virtualisation/waydroid.nix
+++ b/modules/nixos/virtualisation/waydroid.nix
@@ -1,5 +1,20 @@
-{...}: {
- virtualisation = {
- waydroid.enable = true;
- };
+{
+ flake.modules.nixos.virtualisation =
+ {
+ config,
+ lib,
+ ...
+ }:
+ let
+ cfg = config.tnix.virtualisation;
+ in
+ {
+ options.tnix.virtualisation.waydroid = {
+ enable = lib.mkEnableOption "Waydroid Android container";
+ };
+
+ config = lib.mkIf cfg.waydroid.enable {
+ virtualisation.waydroid.enable = true;
+ };
+ };
}
diff --git a/overlays/default.nix b/overlays/default.nix
deleted file mode 100755
index 12d16cc..0000000
--- a/overlays/default.nix
+++ /dev/null
@@ -1,33 +0,0 @@
-{inputs, ...}: {
- additions = final: _prev: import ../pkgs {pkgs = final;};
-
- modifications = final: prev: {
- awesome = inputs.nixpkgs-f2k.packages.${prev.stdenv.hostPlatform.system}.awesome-git;
- ghostty = inputs.ghostty.packages.${prev.stdenv.hostPlatform.system}.default;
- tawm = inputs.tawm.packages.${prev.stdenv.hostPlatform.system}.default;
- tnvim = inputs.tnvim.packages.${prev.stdenv.hostPlatform.system}.default;
- tpanel = inputs.tpanel.packages.${prev.stdenv.hostPlatform.system}.default;
- ags = inputs.tpanel.packages.${prev.stdenv.hostPlatform.system}.ags.default;
- tfolio = inputs.tfolio.packages.${prev.stdenv.hostPlatform.system}.default;
- trok = inputs.trok.packages.${prev.stdenv.hostPlatform.system}.default;
- cyber-tux = inputs.cyber-tux.packages.${prev.stdenv.hostPlatform.system}.default;
- hyprland-git = inputs.hyprland.packages.${prev.stdenv.hostPlatform.system};
- hyprland-plugins = inputs.hyprland-plugins.packages.${prev.stdenv.hostPlatform.system};
- wezterm-git = inputs.wezterm-flake.packages.${prev.stdenv.hostPlatform.system}.default;
- awww = inputs.awww.packages.${prev.stdenv.hostPlatform.system}.awww;
- vicinae-extensions = inputs.vicinae-extensions.packages.${prev.stdenv.hostPlatform.system};
- };
-
- # When applied, the stable nixpkgs set (declared in the flake inputs) will
- # be accessible through 'pkgs.stable'
- stable-packages = final: _prev: {
- stable = import inputs.nixpkgs-stable {
- system = final.stdenv.hostPlatform.system;
- config.allowUnfree = true;
- };
- };
-
- nur = inputs.nur.overlays.default;
-
- nix-vscode-extensions = inputs.nix-vscode-extensions.overlays.default;
-}
diff --git a/pkgs/default.nix b/pkgs/default.nix
deleted file mode 100755
index 9ad3acd..0000000
--- a/pkgs/default.nix
+++ /dev/null
@@ -1,5 +0,0 @@
-{pkgs, ...}: {
- firefox-mod-blur = pkgs.callPackage ./firefox-mod-blur {};
- plymouth-spinner-monochrome = pkgs.callPackage ./plymouth-spinner-monochrome {};
- go-wol = pkgs.callPackage ./go-wol {};
-}
diff --git a/pkgs/firefox-mod-blur/default.nix b/pkgs/firefox-mod-blur/default.nix
deleted file mode 100644
index fe7e6eb..0000000
--- a/pkgs/firefox-mod-blur/default.nix
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- lib,
- stdenv,
- pkgs,
-}:
-stdenv.mkDerivation {
- pname = "firefox-mod-blur";
- version = "v2.14";
-
- src = pkgs.fetchFromGitHub {
- owner = "datguypiko";
- repo = "Firefox-Mod-Blur";
- rev = "refs/heads/master";
- sha256 = "sha256-PX26cPYKU5ERgmcMrpCyFGwLE2a2w80z2zPn28xJq/U=";
- };
-
- installPhase = ''
- mkdir $out
- cp -r * "$out/"
- cp -r "$out/EXTRA MODS/Bookmarks Bar Mods/Bookmarks bar same color as toolbar/bookmarks_bar_same_color_as_toolbar.css" "$out/"
- '';
-
- meta = with lib; {
- description = "Firefox Mod Blur";
- homepage = "https://github.com/datguypiko/Firefox-Mod-Blur";
- platforms = platforms.all;
- license = licenses.gpl3;
- };
-}
diff --git a/pkgs/go-wol/default.nix b/pkgs/go-wol/default.nix
deleted file mode 100644
index 01977ce..0000000
--- a/pkgs/go-wol/default.nix
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- lib,
- buildGoModule,
- fetchFromGitHub,
- ...
-}: let
- version = "2.0.1";
-in
- buildGoModule {
- pname = "go-wol";
- inherit version;
-
- src = fetchFromGitHub {
- owner = "sabhiram";
- repo = "go-wol";
- rev = "v${version}";
- hash = "sha256-iV3p0PjRK0ItfOaRJoS30iZC+O3lNPWfcRb3pfv60RY=";
- };
-
- vendorHash = "sha256-Ze928UnuvScA32fglTYkQx+XE15BxSB6vNa9OSyhN3w=";
-
- meta = with lib; {
- homepage = "https://github.com/sabhiram/go-wol";
- description = "Simple wake on LAN magic packet generator for golang";
- license = licenses.mit;
- };
- }
diff --git a/pkgs/plymouth-spinner-monochrome/default.nix b/pkgs/plymouth-spinner-monochrome/default.nix
deleted file mode 100644
index 78f2a92..0000000
--- a/pkgs/plymouth-spinner-monochrome/default.nix
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- stdenv,
- logo ? null,
- lib,
- ...
-}:
-stdenv.mkDerivation {
- pname = "plymouth-spinner-monochrome";
- version = "1.0";
- src = ./src;
-
- buildPhase = lib.optionalString (logo != null) ''
- ln -s ${logo} watermark.png
- '';
- installPhase = ''
- mkdir -p $out/share/plymouth/themes
- cp -rT . $out/share/plymouth/themes/spinner-monochrome
- '';
-
- meta = {
- platforms = lib.platforms.all;
- };
-}
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0001.png b/pkgs/plymouth-spinner-monochrome/src/animation-0001.png
deleted file mode 100644
index 6bd8239..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0001.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0002.png b/pkgs/plymouth-spinner-monochrome/src/animation-0002.png
deleted file mode 100644
index ef8ff54..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0002.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0003.png b/pkgs/plymouth-spinner-monochrome/src/animation-0003.png
deleted file mode 100644
index 205380b..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0003.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0004.png b/pkgs/plymouth-spinner-monochrome/src/animation-0004.png
deleted file mode 100644
index 6038af8..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0004.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0005.png b/pkgs/plymouth-spinner-monochrome/src/animation-0005.png
deleted file mode 100644
index 7a96767..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0005.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0006.png b/pkgs/plymouth-spinner-monochrome/src/animation-0006.png
deleted file mode 100644
index eb0256f..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0006.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0007.png b/pkgs/plymouth-spinner-monochrome/src/animation-0007.png
deleted file mode 100644
index d2ccac9..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0007.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0008.png b/pkgs/plymouth-spinner-monochrome/src/animation-0008.png
deleted file mode 100644
index 85849c8..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0008.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0009.png b/pkgs/plymouth-spinner-monochrome/src/animation-0009.png
deleted file mode 100644
index 3e79b9b..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0009.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0010.png b/pkgs/plymouth-spinner-monochrome/src/animation-0010.png
deleted file mode 100644
index 1f64875..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0010.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0011.png b/pkgs/plymouth-spinner-monochrome/src/animation-0011.png
deleted file mode 100644
index 57bec05..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0011.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0012.png b/pkgs/plymouth-spinner-monochrome/src/animation-0012.png
deleted file mode 100644
index cdefdc7..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0012.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0013.png b/pkgs/plymouth-spinner-monochrome/src/animation-0013.png
deleted file mode 100644
index de5aa6e..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0013.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0014.png b/pkgs/plymouth-spinner-monochrome/src/animation-0014.png
deleted file mode 100644
index a019904..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0014.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0015.png b/pkgs/plymouth-spinner-monochrome/src/animation-0015.png
deleted file mode 100644
index 249e173..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0015.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0016.png b/pkgs/plymouth-spinner-monochrome/src/animation-0016.png
deleted file mode 100644
index f72a577..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0016.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0017.png b/pkgs/plymouth-spinner-monochrome/src/animation-0017.png
deleted file mode 100644
index 02926e7..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0017.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0018.png b/pkgs/plymouth-spinner-monochrome/src/animation-0018.png
deleted file mode 100644
index 667cd7d..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0018.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0019.png b/pkgs/plymouth-spinner-monochrome/src/animation-0019.png
deleted file mode 100644
index 760868a..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0019.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0020.png b/pkgs/plymouth-spinner-monochrome/src/animation-0020.png
deleted file mode 100644
index d228ed8..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0020.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0021.png b/pkgs/plymouth-spinner-monochrome/src/animation-0021.png
deleted file mode 100644
index e7bd0f5..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0021.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0022.png b/pkgs/plymouth-spinner-monochrome/src/animation-0022.png
deleted file mode 100644
index 4c77282..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0022.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0023.png b/pkgs/plymouth-spinner-monochrome/src/animation-0023.png
deleted file mode 100644
index 8e77aa1..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0023.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0024.png b/pkgs/plymouth-spinner-monochrome/src/animation-0024.png
deleted file mode 100644
index ed52d3d..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0024.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0025.png b/pkgs/plymouth-spinner-monochrome/src/animation-0025.png
deleted file mode 100644
index 371a299..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0025.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0026.png b/pkgs/plymouth-spinner-monochrome/src/animation-0026.png
deleted file mode 100644
index 1bfd5dc..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0026.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0027.png b/pkgs/plymouth-spinner-monochrome/src/animation-0027.png
deleted file mode 100644
index 6f4d83b..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0027.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0028.png b/pkgs/plymouth-spinner-monochrome/src/animation-0028.png
deleted file mode 100644
index eda5e3f..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0028.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0029.png b/pkgs/plymouth-spinner-monochrome/src/animation-0029.png
deleted file mode 100644
index 33f2683..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0029.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0030.png b/pkgs/plymouth-spinner-monochrome/src/animation-0030.png
deleted file mode 100644
index c5132bd..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0030.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0031.png b/pkgs/plymouth-spinner-monochrome/src/animation-0031.png
deleted file mode 100644
index f6ed4b2..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0031.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0032.png b/pkgs/plymouth-spinner-monochrome/src/animation-0032.png
deleted file mode 100644
index 0979164..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0032.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0033.png b/pkgs/plymouth-spinner-monochrome/src/animation-0033.png
deleted file mode 100644
index c9ec0e5..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0033.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0034.png b/pkgs/plymouth-spinner-monochrome/src/animation-0034.png
deleted file mode 100644
index 2851ef3..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0034.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0035.png b/pkgs/plymouth-spinner-monochrome/src/animation-0035.png
deleted file mode 100644
index 2bd3b0d..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0035.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/animation-0036.png b/pkgs/plymouth-spinner-monochrome/src/animation-0036.png
deleted file mode 100644
index fbe48ff..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/animation-0036.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/bullet.png b/pkgs/plymouth-spinner-monochrome/src/bullet.png
deleted file mode 100644
index 5799dda..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/bullet.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/capslock.png b/pkgs/plymouth-spinner-monochrome/src/capslock.png
deleted file mode 100644
index 9d775f6..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/capslock.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/entry.png b/pkgs/plymouth-spinner-monochrome/src/entry.png
deleted file mode 100644
index 81cf210..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/entry.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/keyboard.png b/pkgs/plymouth-spinner-monochrome/src/keyboard.png
deleted file mode 100644
index f532ad0..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/keyboard.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/keymap-render.png b/pkgs/plymouth-spinner-monochrome/src/keymap-render.png
deleted file mode 100644
index 4aaed5a..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/keymap-render.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/lock.png b/pkgs/plymouth-spinner-monochrome/src/lock.png
deleted file mode 100644
index 2de24c4..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/lock.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/spinner-monochrome.plymouth b/pkgs/plymouth-spinner-monochrome/src/spinner-monochrome.plymouth
deleted file mode 100644
index b40d928..0000000
--- a/pkgs/plymouth-spinner-monochrome/src/spinner-monochrome.plymouth
+++ /dev/null
@@ -1,79 +0,0 @@
-[Plymouth Theme]
-Name[be]=Круцёлка
-Name[cs]=Točítko
-Name[da]=Snurre
-Name[de]=Spinner
-Name[eo]=Turnilo
-Name[es]=Spinner
-Name[eu]=Spinner
-Name[fr]=Roulette
-Name[fur]=Roulette
-Name[hu]=Forgó
-Name[id]=Spinner
-Name[it]=Spinner
-Name[nl]=Spinner
-Name[pa]=ਸਪਿੱਨਰ
-Name[pl]=Spinner
-Name[pt_BR]=Spinner
-Name[ru]=Числовое поле с кнопками
-Name[sr]=Предилица
-Name[sv]=Spinnare
-Name[uk]=Крутний індикатор
-Name[zh_CN]=Spinner
-Name[ms]=Spinner
-Name[he]=שבשבת טעינה
-Name[fa]=چرخنده
-Name[fi]=Spinneri
-Name=Spinner
-Description=A theme designed by jimmac that features a simple spinner.
-ModuleName=two-step
-
-[two-step]
-Font=Fira Sans 12
-TitleFont=Fira Sans 30
-ImageDir=/etc/plymouth/themes/spinner-monochrome
-DialogHorizontalAlignment=.5
-DialogVerticalAlignment=.382
-TitleHorizontalAlignment=.5
-TitleVerticalAlignment=.382
-HorizontalAlignment=.5
-VerticalAlignment=.7
-WatermarkHorizontalAlignment=.5
-WatermarkVerticalAlignment=.96
-Transition=none
-TransitionDuration=0.0
-BackgroundStartColor=0x000000
-BackgroundEndColor=0x000000
-ProgressBarBackgroundColor=0x606060
-ProgressBarForegroundColor=0xffffff
-MessageBelowAnimation=true
-
-[boot-up]
-UseEndAnimation=false
-
-[shutdown]
-UseEndAnimation=false
-
-[reboot]
-UseEndAnimation=false
-
-[updates]
-SuppressMessages=true
-ProgressBarShowPercentComplete=true
-UseProgressBar=true
-Title=Installing Updates...
-SubTitle=Do not turn off your computer
-
-[system-upgrade]
-SuppressMessages=true
-ProgressBarShowPercentComplete=true
-UseProgressBar=true
-Title=Upgrading System...
-SubTitle=Do not turn off your computer
-
-[firmware-upgrade]
-SuppressMessages=true
-ProgressBarShowPercentComplete=true
-UseProgressBar=true
-Title=Upgrading Firmware...
-SubTitle=Do not turn off your computer
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0001.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0001.png
deleted file mode 100644
index 6a64683..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0001.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0002.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0002.png
deleted file mode 100644
index 8e9a85d..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0002.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0003.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0003.png
deleted file mode 100644
index 9fe95aa..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0003.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0004.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0004.png
deleted file mode 100644
index 687aa8b..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0004.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0005.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0005.png
deleted file mode 100644
index 3a56beb..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0005.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0006.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0006.png
deleted file mode 100644
index 949cb23..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0006.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0007.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0007.png
deleted file mode 100644
index 14d8b45..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0007.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0008.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0008.png
deleted file mode 100644
index beef391..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0008.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0009.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0009.png
deleted file mode 100644
index b366daa..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0009.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0010.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0010.png
deleted file mode 100644
index 0312f62..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0010.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0011.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0011.png
deleted file mode 100644
index f3e2cb9..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0011.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0012.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0012.png
deleted file mode 100644
index ca4f017..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0012.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0013.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0013.png
deleted file mode 100644
index ace8764..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0013.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0014.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0014.png
deleted file mode 100644
index 6c43a9d..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0014.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0015.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0015.png
deleted file mode 100644
index 1e87c5d..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0015.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0016.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0016.png
deleted file mode 100644
index fac163b..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0016.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0017.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0017.png
deleted file mode 100644
index ce792de..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0017.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0018.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0018.png
deleted file mode 100644
index 6423b95..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0018.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0019.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0019.png
deleted file mode 100644
index 45e9359..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0019.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0020.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0020.png
deleted file mode 100644
index b84b04d..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0020.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0021.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0021.png
deleted file mode 100644
index a64932d..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0021.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0022.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0022.png
deleted file mode 100644
index 4b57e23..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0022.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0023.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0023.png
deleted file mode 100644
index b3dbeef..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0023.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0024.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0024.png
deleted file mode 100644
index 196e987..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0024.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0025.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0025.png
deleted file mode 100644
index 3905e00..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0025.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0026.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0026.png
deleted file mode 100644
index 4c02eb1..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0026.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0027.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0027.png
deleted file mode 100644
index 9ab5b00..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0027.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0028.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0028.png
deleted file mode 100644
index fa8584b..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0028.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0029.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0029.png
deleted file mode 100644
index d9931e1..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0029.png and /dev/null differ
diff --git a/pkgs/plymouth-spinner-monochrome/src/throbber-0030.png b/pkgs/plymouth-spinner-monochrome/src/throbber-0030.png
deleted file mode 100644
index fc1683f..0000000
Binary files a/pkgs/plymouth-spinner-monochrome/src/throbber-0030.png and /dev/null differ