Compare commits

..

1 Commits

Author SHA1 Message Date
tux
8d3e740614 feat(mangowm): update montor config 2026-05-08 00:58:08 +05:30
118 changed files with 1965 additions and 6977 deletions

View File

@@ -3,10 +3,7 @@ keys:
- &tux age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4 - &tux age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4
- &hosts - &hosts
- &sirius age1maxsx5tq2h3d92rfyl8ekcdan5gu5cpch4qs3c56cu7qag02xgvs3h0gqc - &sirius age18hepvvp3nw9ram6usxc8rvpxed2pye0knqx0zutqgxeu35k745vqyxfphz
- &canopus age1x36yr8h993srfj29sfpzt4wyz52nztvncpmhgmfs0j26qvfecq3qvcm0an
- &arcturus age1huqa3hc7wcxk4dpelrzny437nzrx4fnll3d8g9ahznzk268yju5qufapxy
- &alpha age1mzxxxzhy3us3rd960ufqv7vlxj5cnug86md6x69llg9ujzw2pqws057llf
creation_rules: creation_rules:
- path_regex: hosts/sirius/secrets.yaml$ - path_regex: hosts/sirius/secrets.yaml$
@@ -14,18 +11,3 @@ creation_rules:
- age: - age:
- *tux - *tux
- *sirius - *sirius
- path_regex: hosts/canopus/secrets.yaml$
key_groups:
- age:
- *tux
- *canopus
- path_regex: hosts/arcturus/secrets.yaml$
key_groups:
- age:
- *tux
- *arcturus
- path_regex: hosts/alpha/secrets.yaml$
key_groups:
- age:
- *tux
- *alpha

211
README.md
View File

@@ -15,55 +15,196 @@
## Table of Contents ## Table of Contents
- [Hosts](#hosts) - [Hosts](#hosts)
- [Installation](#installation)
- [Components](#components) - [Components](#components)
- [Showcase](#showcase) - [Showcase](#showcase)
- [Pain](#spent-months-on-this-system-configuration-) - [Pain](#spent-weeks-on-this-system-configuration-)
## Hosts ## Hosts
| | Hostname | Board | CPU | RAM | GPU | Purpose | | | 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. | | 🖥️ | `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 | Portable workstation for work, gaming, and media on the go. | | 💻 | `canopus` | Asus Zephyrus G15 | Ryzen 9 5900HS | 16GB | RTX 3060 | Optimized for productivity on the go and some gaming. |
| ☁️ | `arcturus` | Minisforum MS-A1 | Ryzen 7 8700G | 32GB | Radeon 780M | Homelab server for self-hosted services and infrastructure workloads. | | ☁️ | `homelab` | Minisforum MS-A1 | Ryzen 7 8700G | 32GB | Radeon 780M | WIP |
| ☁️ | `alpha` | KVM | 2 Core | 4GB | | Public-facing server for exposing homelab services to the internet. | | ☁️ | `arcturus` | KVM | 4 Core | 8GB | | Primary server responsible for exposing my homelab applications to the internet. |
| 📱 | `vega` | Samsung S25 Ultra | Snapdragon 8 Elite | 12GB | Adreno 830 | Primary mobile for daily usage. (Locked) | | ☁️ | `alpha` | KVM | 4 Core | 4GB | | Monitors uptime and health status of all services across the infrastructure. |
| 📱 | `capella` | Motorola Edge 30 | Snapdragon 778G+ | 8GB | Adreno 642L | Secondary mobile for tinkering and experimentation. (Rooted) | | 🥔 | `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.
## Components ## Components
| | Wayland | Xorg | | | Wayland | Xorg |
| ------------- | -------- | ---- | | ------------- | -------- | ---------------- |
| DM | ly | - | | DM | ly | ly |
| WM/DE | Hyprland | - | | WM/DE | Hyprland | AwesomeWM |
| Compositor | Hyprland | - | | Compositor | Hyprland | Picom (Jonaburg) |
| Bar | Tshell | - | | Bar | tPanel | Wibar |
| Hotkeys | Hyprland | - | | Hotkeys | Hyprland | Awful |
| Launcher | Tshell | - | | Launcher | tPanel | Rofi |
| Notifications | Tshell | - | | Notifications | tPanel | Naughty |
| Terminal | Wezterm | - | | Terminal | Wezterm | Wezterm |
| Editor | Neovim | - | | Editor | Neovim | Neovim |
> [!NOTE]
> Some components in this setup are in different repositories:
>
> - [tshell](https://github.com/tuxdotrs/tshell) — Bar and notification daemon
> - [tnvim](https://github.com/tuxdotrs/tnvim) — Neovim configuration
> - [twm](https://github.com/tuxdotrs/twm) — Hyprland setup (config, keybinds, and window rules)
## Showcase ## Showcase
| **Desktop** | **Tshell** | ### Desktop Hyprland
| :-------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: |
| <img src="https://raw.githubusercontent.com/tuxdotrs/nix-config/refs/heads/main/assets/hyprland/desktop.png" width="100%"> | <img src="https://raw.githubusercontent.com/tuxdotrs/nix-config/refs/heads/main/assets/hyprland/tPanel.png" width="100%"> |
| **Workflow** | **Neovim** |
| <img src="https://raw.githubusercontent.com/tuxdotrs/nix-config/refs/heads/main/assets/hyprland/workflow.png" width="100%"> | <img src="https://github.com/user-attachments/assets/f881c672-8d77-43ec-b637-df5004c7d11f" width="100%"> |
| **Floating Terminal** | **Lazygit** |
| <img src="https://github.com/user-attachments/assets/3339ecf8-3264-4179-a093-337c844592a6" width="100%"> | <img src="https://github.com/user-attachments/assets/6df15881-fc2b-41b1-af3b-124fe0599b94" width="100%"> |
| **Telescope** | **Firefox** |
| <img src="https://github.com/user-attachments/assets/03be05bc-8ede-4d6e-a341-2761d89b7288" width="100%"> | <img src="https://github.com/user-attachments/assets/6f12173b-2480-404e-b01a-599115a886c0" width="100%"> |
## Spent months on this system configuration 😢 ![Desktop](https://raw.githubusercontent.com/tuxdotrs/nix-config/refs/heads/main/assets/hyprland/desktop.png)
### tPanel
![tPanel](https://raw.githubusercontent.com/tuxdotrs/nix-config/refs/heads/main/assets/hyprland/tPanel.png)
### Workflow
![Workflow](https://raw.githubusercontent.com/tuxdotrs/nix-config/refs/heads/main/assets/hyprland/workflow.png)
## Showcase
### Desktop AwesomeWM
![2024-08-08_18-33](https://github.com/user-attachments/assets/1cdcc387-0f68-486c-a76c-a36ad2acb78d)
![2024-08-08_18-18](https://github.com/user-attachments/assets/f3fc4da5-6c0d-4cda-934d-b68ca6494e02)
### Neovim
![2024-08-08_18-16](https://github.com/user-attachments/assets/f881c672-8d77-43ec-b637-df5004c7d11f)
### Floating Terminal
![2024-08-08_18-16_1](https://github.com/user-attachments/assets/3339ecf8-3264-4179-a093-337c844592a6)
### Lazygit
![2024-08-08_18-16_2](https://github.com/user-attachments/assets/6df15881-fc2b-41b1-af3b-124fe0599b94)
### Telescope
![2024-08-08_18-16_3](https://github.com/user-attachments/assets/03be05bc-8ede-4d6e-a341-2761d89b7288)
### Firefox
![2024-08-08_18-26](https://github.com/user-attachments/assets/6f12173b-2480-404e-b01a-599115a886c0)
## Spent weeks on this system configuration 😢
<div align="center"> <div align="center">
<img src="https://user-images.githubusercontent.com/97862450/265550523-2f66a8b6-4347-40af-89c6-12db3a61cc7c.jpeg" width="60%"> <img src="https://user-images.githubusercontent.com/97862450/265550523-2f66a8b6-4347-40af-89c6-12db3a61cc7c.jpeg" width="60%">

1881
flake.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -24,23 +24,8 @@
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
tshell = { tpanel = {
url = "github:tuxdotrs/tshell"; url = "github:tuxdotrs/tpanel";
inputs.nixpkgs.follows = "nixpkgs";
};
trok = {
url = "github:tuxdotrs/trok";
inputs.nixpkgs.follows = "nixpkgs";
};
tfolio = {
url = "git+ssh://git@github.com/tuxdotrs/tfolio.git";
inputs.nixpkgs.follows = "nixpkgs";
};
cyber-tux = {
url = "git+ssh://git@github.com/tuxdotrs/cyber-tux.git";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
@@ -59,22 +44,6 @@
inputs.nixpkgs.follows = "nixpkgs"; 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"; import-tree.url = "github:vic/import-tree";
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-25.11-small"; nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-25.11-small";
@@ -83,19 +52,10 @@
nixos-hardware.url = "github:NixOS/nixos-hardware/master"; nixos-hardware.url = "github:NixOS/nixos-hardware/master";
sops-nix.url = "github:Mic92/sops-nix"; sops-nix.url = "github:Mic92/sops-nix";
treefmt-nix.url = "github:numtide/treefmt-nix"; treefmt-nix.url = "github:numtide/treefmt-nix";
nix-cachyos-kernel.url = "github:xddxdd/nix-cachyos-kernel/release";
lan-mouse.url = "github:feschber/lan-mouse"; lan-mouse.url = "github:feschber/lan-mouse";
hyprland.url = "github:hyprwm/Hyprland"; hyprland.url = "github:hyprwm/Hyprland";
awww.url = "git+https://codeberg.org/LGFae/awww"; awww.url = "git+https://codeberg.org/LGFae/awww";
nixcord.url = "github:kaylorben/nixcord"; nixcord.url = "github:kaylorben/nixcord";
nur.url = "github:nix-community/nur"; 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";
llm-agents.url = "github:numtide/llm-agents.nix";
twm.url = "github:tuxdotrs/twm";
}; };
} }

View File

@@ -1,33 +0,0 @@
{
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}
];
};
};
};
}

View File

@@ -1,7 +0,0 @@
{
flake.modules.nixOnDroid.core = {
nix.extraOptions = ''
experimental-features = nix-command flakes
'';
};
}

View File

@@ -1,106 +0,0 @@
{
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
'';
};
};
}

View File

@@ -1,3 +1,4 @@
{inputs, ...}: { { inputs, ... }:
{
imports = [ inputs.flake-parts.flakeModules.modules ]; imports = [ inputs.flake-parts.flakeModules.modules ];
} }

View File

@@ -1,118 +0,0 @@
{
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;
};
}

View File

@@ -1,32 +1,17 @@
{inputs, ...}: { {
inputs,
...
}:
{
flake.overlays = { flake.overlays = {
modifications = final: prev: { modifications = final: prev: {
omasnap = prev.callPackage ../../packages/omasnap.nix {};
tnvim = inputs.tnvim.packages.${prev.stdenv.hostPlatform.system}.default; tnvim = inputs.tnvim.packages.${prev.stdenv.hostPlatform.system}.default;
tshell = inputs.tshell.packages.${prev.stdenv.hostPlatform.system}.default; tpanel = inputs.tpanel.packages.${prev.stdenv.hostPlatform.system}.default;
trok = inputs.trok.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;
cyber-tux = inputs.cyber-tux.packages.${prev.stdenv.hostPlatform.system}.default;
wezterm-git = inputs.wezterm-flake.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}; hyprland-git = inputs.hyprland.packages.${prev.stdenv.hostPlatform.system};
awww = inputs.awww.packages.${prev.stdenv.hostPlatform.system}.awww; awww = inputs.awww.packages.${prev.stdenv.hostPlatform.system}.awww;
vicinae-extensions = inputs.vicinae-extensions.packages.${prev.stdenv.hostPlatform.system}; 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;
davinci-resolve = prev.davinci-resolve.override {
runCommandLocal = name: env: cmd:
if prev.lib.hasSuffix "-src.zip" name
then
prev.runCommandLocal name (env
// {
outputHash = "sha256-+3SB32EHpH9/0hM3h8CrO6f7V4ZAmxUFh3P8m6QDeO0=";
})
cmd
else prev.runCommandLocal name env cmd;
};
}; };
stable-packages = final: _prev: { stable-packages = final: _prev: {
@@ -36,21 +21,15 @@
}; };
}; };
cachyos-kernel = inputs.nix-cachyos-kernel.overlays.pinned;
nur = inputs.nur.overlays.default; nur = inputs.nur.overlays.default;
copyparty = inputs.copyparty.overlays.default;
llm-agents = inputs.llm-agents.overlays.shared-nixpkgs;
twm = inputs.twm.overlays.default;
}; };
perSystem = {system, ...}: let perSystem =
pkgs = import inputs.nixpkgs { { system, ... }:
{
_module.args.pkgs = import inputs.nixpkgs {
inherit system; inherit system;
overlays = builtins.attrValues inputs.self.overlays; overlays = builtins.attrValues inputs.self.overlays;
}; };
in {
_module.args.pkgs = pkgs;
packages.omasnap = pkgs.omasnap;
}; };
} }

View File

@@ -1,14 +1,22 @@
{inputs, ...}: { { inputs, ... }:
{
imports = [ imports = [
inputs.treefmt-nix.flakeModule inputs.treefmt-nix.flakeModule
]; ];
perSystem = { perSystem =
{
config,
pkgs,
system,
...
}:
{
treefmt.config = { treefmt.config = {
projectRootFile = "flake.nix"; projectRootFile = "flake.nix";
flakeCheck = true; flakeCheck = true;
programs = { programs = {
alejandra.enable = true; nixfmt.enable = true;
}; };
}; };
}; };

View File

@@ -1,5 +1,7 @@
{ {
flake.modules.homeManager.core = {userName, ...}: { flake.modules.homeManager.core =
{ userName, ... }:
{
programs.home-manager.enable = true; programs.home-manager.enable = true;
systemd.user.startServices = "sd-switch"; systemd.user.startServices = "sd-switch";

View File

@@ -1,9 +1,12 @@
{inputs, ...}: { { inputs, ... }:
flake.modules.homeManager.core = { {
flake.modules.homeManager.core =
{
lib, lib,
osConfig ? { }, osConfig ? { },
... ...
}: { }:
{
nixpkgs = lib.mkIf (!(osConfig.home-manager.useGlobalPkgs or false)) { nixpkgs = lib.mkIf (!(osConfig.home-manager.useGlobalPkgs or false)) {
config = { config = {
allowUnfree = true; allowUnfree = true;

View File

@@ -1,10 +1,12 @@
{ {
flake.modules.homeManager.desktop = { flake.modules.homeManager.desktop =
{
pkgs, pkgs,
config, config,
... ...
}: let }:
configDir = "${config.xdg.configHome}/BraveSoftware/Brave-Origin"; let
configDir = "${config.xdg.configHome}/BraveSoftware/Brave-Browser";
extensionJson = ext: { extensionJson = ext: {
name = "${configDir}/External Extensions/${ext.id}.json"; name = "${configDir}/External Extensions/${ext.id}.json";
@@ -20,18 +22,17 @@
{ id = "bfnaelmomeimhlpmgjnjophhpkkoljpa"; } # Phantom { id = "bfnaelmomeimhlpmgjnjophhpkkoljpa"; } # Phantom
{ id = "eimadpbcbfnmbkopoojfekhnkhdbieeh"; } # DarkReader { id = "eimadpbcbfnmbkopoojfekhnkhdbieeh"; } # DarkReader
]; ];
in { in
{
programs.chromium = { programs.chromium = {
enable = true; enable = true;
package = pkgs.brave-origin; package = pkgs.brave;
commandLineArgs = [ commandLineArgs = [
"--disable-features=WebRtcAllowInputVolumeAdjustment" "--disable-features=WebRtcAllowInputVolumeAdjustment"
"--force-device-scale-factor=1.0" "--force-device-scale-factor=1.0"
]; ];
}; };
home.packages = [pkgs.brave];
home.file = builtins.listToAttrs (map extensionJson extensions); home.file = builtins.listToAttrs (map extensionJson extensions);
}; };
} }

View File

@@ -0,0 +1,11 @@
{
flake.modules.homeManager.desktop =
{ pkgs, ... }:
{
home.pointerCursor = {
package = pkgs.bibata-cursors;
name = "Bibata-Modern-Ice";
size = 28;
};
};
}

View File

@@ -1,9 +1,7 @@
{ {
flake.modules.homeManager.desktop = { flake.modules.homeManager.desktop =
inputs, { inputs, userName, ... }:
userName, {
...
}: {
imports = [ imports = [
inputs.nixcord.homeModules.nixcord inputs.nixcord.homeModules.nixcord
]; ];
@@ -20,22 +18,11 @@
frameless = true; frameless = true;
plugins = { plugins = {
hideMedia.enable = true; hideMedia.enable = true;
anonymiseFileNames.enable = true;
copyFileContents.enable = true;
noTypingAnimation.enable = true;
readAllNotificationsButton.enable = true;
silentTyping.enable = true;
validUser.enable = true;
biggerStreamPreview.enable = true;
ignoreActivities = { ignoreActivities = {
enable = true; enable = true;
ignorePlaying = true; ignorePlaying = true;
ignoreWatching = true; ignoreWatching = true;
}; };
sortFriendRequests = {
enable = true;
showDates = true;
};
}; };
}; };
dorion = { dorion = {

View File

@@ -1,5 +0,0 @@
{
flake.modules.homeManager.desktop = {
services.easyeffects.enable = true;
};
}

View File

@@ -1,9 +1,11 @@
{ {
flake.modules.homeManager.desktop = { flake.modules.homeManager.desktop =
{
pkgs, pkgs,
userName, userName,
... ...
}: { }:
{
programs.firefox = { programs.firefox = {
enable = true; enable = true;

View File

@@ -1,49 +0,0 @@
{
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"
];
};
};
};
};
}

View File

@@ -1,65 +1,19 @@
{ {
flake.modules.homeManager.desktop = { flake.modules.homeManager.desktop =
config, { pkgs, ... }:
lib, {
pkgs,
...
}:
with lib; let
cfg = config.tnix.desktop.hyprland;
in {
options.tnix.desktop.hyprland = {
enable = mkEnableOption "tux's Hyprland";
monitorConfig = mkOption { home.packages = with pkgs; [
type = types.lines; ags
default = ""; awww
description = "Hyprland monitor configuration"; ];
};
workspaceConfig = mkOption {
type = types.lines;
default = "";
description = "Hyprland workspace configuration";
};
};
config = mkIf cfg.enable {
wayland.windowManager.hyprland = { wayland.windowManager.hyprland = {
enable = true; enable = true;
package = null; package = null;
portalPackage = null; portalPackage = null;
xwayland.enable = true; xwayland.enable = true;
configType = "hyprlang";
systemd.variables = [ "--all" ]; systemd.variables = [ "--all" ];
}; };
home.file = {
".config/hypr" = {
recursive = true;
source = pkgs.twm.hyprland;
};
".config/hypr/config/monitors.lua".text = cfg.monitorConfig;
".config/hypr/config/workspaces.lua".text = cfg.workspaceConfig;
};
home.packages = with pkgs; [
ags
awww
grim
slurp
hyprshot
wl-clipboard
wl-screenrec
omasnap
(writeShellScriptBin "hypr-screenshot" ''
hyprshot -m region -r ppm - | satty --filename -
'')
(writeShellScriptBin "hypr-screenrecord" ''
wl-screenrec -g "$(slurp)"
'')
];
};
}; };
} }

View File

@@ -1,86 +0,0 @@
{
flake.modules.homeManager.desktop = {pkgs, ...}: {
programs.kitty = {
enable = true;
package = pkgs.kitty;
font = {
name = "JetBrainsMono Nerd Font";
size = 12.0;
};
shellIntegration.enableZshIntegration = true;
settings = {
background_opacity = "1.0";
enable_audio_bell = false;
confirm_os_window_close = 0;
cursor_trail = 3;
# Window
window_padding_width = 10;
foreground = "#f1f1f1";
background = "#0f0f0f";
# Borders
active_border_color = "#3d59a1";
inactive_border_color = "#101014";
bell_border_color = "#fffac2";
# Colors
color0 = "#0f0f0f";
color8 = "#a6accd";
color1 = "#d0679d";
color9 = "#d0679d";
color2 = "#5de4c7";
color10 = "#5de4c7";
color3 = "#fffac2";
color11 = "#fffac2";
color4 = "#89ddff";
color12 = "#add7ff";
color5 = "#fcc5e9";
color13 = "#fae4fc";
color6 = "#add7ff";
color14 = "#89ddff";
color7 = "#ffffff";
color15 = "#ffffff";
# Cursor
cursor = "#ffffff";
cursor_text_color = "#0f0f0f";
# Selection
selection_foreground = "none";
selection_background = "#28344a";
# URLs
url_color = "#5de4c7";
# Tab bar
tab_bar_edge = "bottom";
tab_bar_style = "fade";
tab_fade = "1";
active_tab_foreground = "#3d59a1";
active_tab_background = "#16161e";
active_tab_font_style = "bold";
inactive_tab_foreground = "#787c99";
inactive_tab_background = "#16161e";
inactive_tab_font_style = "bold";
tab_bar_background = "#101014";
};
};
};
}

View File

@@ -1,13 +1,17 @@
{inputs, ...}: { { inputs, ... }:
flake.modules.homeManager.desktop = { {
flake.modules.homeManager.desktop =
{
config, config,
pkgs, pkgs,
lib, lib,
... ...
}: }:
with lib; let with lib;
let
cfg = config.tnix.services.lan-mouse; cfg = config.tnix.services.lan-mouse;
in { in
{
imports = [ inputs.lan-mouse.homeManagerModules.default ]; imports = [ inputs.lan-mouse.homeManagerModules.default ];
options.tnix.services.lan-mouse = { options.tnix.services.lan-mouse = {
@@ -24,6 +28,7 @@
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
programs.lan-mouse = { programs.lan-mouse = {
enable = true; enable = true;
systemd = true; systemd = true;

View File

@@ -1,41 +1,24 @@
{inputs, ...}: { { inputs, ... }:
flake.modules.homeManager.desktop = { {
config, flake.modules.homeManager.desktop =
pkgs, { pkgs, ... }:
lib, {
...
}:
with lib; let
cfg = config.tnix.desktop.mangowm;
in {
imports = [ imports = [
inputs.mango.hmModules.mango 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 = { wayland.windowManager.mango = {
enable = true; enable = true;
settings = { settings = {
# Monitors # Monitors
monitorrule = cfg.monitorRule; 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"
];
focus_cross_monitor = 1; focus_cross_monitor = 1;
exchange_cross_monitor = 1; exchange_cross_monitor = 1;
drag_tile_to_tile = 1;
# Keyboard # Keyboard
repeat_rate = 25; repeat_rate = 25;
@@ -61,8 +44,8 @@
# Theme # Theme
border_radius = 8; border_radius = 8;
no_radius_when_single = 0; no_radius_when_single = 0;
focused_opacity = 0.9; focused_opacity = 1.0;
unfocused_opacity = 0.9; unfocused_opacity = 1.0;
# Scroller Layout Setting # Scroller Layout Setting
scroller_structs = 0; scroller_structs = 0;
@@ -84,7 +67,25 @@
overviewgappo = 15; overviewgappo = 15;
# layouts # layouts
tagrule = cfg.tagRule; 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"
];
# Keybindings # Keybindings
mousebind = [ mousebind = [
@@ -103,7 +104,6 @@
"SUPER, Return, spawn, wezterm" "SUPER, Return, spawn, wezterm"
"SUPER, Space, spawn, vicinae toggle" "SUPER, Space, spawn, vicinae toggle"
"SUPER, D, spawn, vesktop" "SUPER, D, spawn, vesktop"
"SUPER, T, spawn, Telegram"
"SUPER, B, spawn, brave" "SUPER, B, spawn, brave"
"SUPER, V, spawn, vicinae vicinae://extensions/vicinae/clipboard/history" "SUPER, V, spawn, vicinae vicinae://extensions/vicinae/clipboard/history"
"SUPER+SHIFT, W, spawn, vicinae vicinae://extensions/sovereign/awww-switcher/wpgrid" "SUPER+SHIFT, W, spawn, vicinae vicinae://extensions/sovereign/awww-switcher/wpgrid"
@@ -113,13 +113,11 @@
"SUPER+SHIFT, R, reload_config" "SUPER+SHIFT, R, reload_config"
"SUPER+SHIFT, F, togglefullscreen" "SUPER+SHIFT, F, togglefullscreen"
"SUPER+SHIFT, Space, togglefloating" "SUPER+SHIFT, Space, togglefloating"
"SUPER+SHIFT, Space, centerwin"
"ALT, Tab, toggleoverview" "ALT, Tab, toggleoverview"
"ALT+SHIFT, minus, incgaps, -1" "ALT+SHIFT, minus, incgaps, -1"
"ALT+SHIFT, equal, incgaps, 1" "ALT+SHIFT, equal, incgaps, 1"
"ALT+SHIFT, R, togglegaps" "ALT+SHIFT, R, togglegaps"
"SUPER+SHIFT, P, toggleglobal"
# switch layout # switch layout
"SUPER+SHIFT, H, setlayout, tile" "SUPER+SHIFT, H, setlayout, tile"
@@ -131,7 +129,6 @@
"SUPER+CTRL, Down, resizewin, +0, +50" "SUPER+CTRL, Down, resizewin, +0, +50"
"SUPER+CTRL, Left, resizewin, -50, +0" "SUPER+CTRL, Left, resizewin, -50, +0"
"SUPER+CTRL, Right, resizewin, +50, +0" "SUPER+CTRL, Right, resizewin, +50, +0"
"SUPER+CTRL, Equal, setoption, default_mfact, 0.5"
# swap client # swap client
"SUPER+SHIFT, Up, exchange_client, up" "SUPER+SHIFT, Up, exchange_client, up"
@@ -169,7 +166,7 @@
]; ];
# Window effect # Window effect
blur = 1; blur = 0;
blur_layer = 0; blur_layer = 0;
blur_optimized = 1; blur_optimized = 1;
blur_params_num_passes = 2; blur_params_num_passes = 2;
@@ -179,7 +176,7 @@
blur_params_contrast = 0.9; blur_params_contrast = 0.9;
blur_params_saturation = 1.2; blur_params_saturation = 1.2;
shadows = 1; shadows = 0;
layer_shadows = 0; layer_shadows = 0;
shadow_only_floating = 1; shadow_only_floating = 1;
shadows_size = 10; shadows_size = 10;
@@ -195,7 +192,7 @@
animation_type_close = "fade"; animation_type_close = "fade";
animation_fade_in = 1; animation_fade_in = 1;
animation_fade_out = 1; animation_fade_out = 1;
tag_animation_direction = 0; tag_animation_direction = 1;
zoom_initial_ratio = 0.3; zoom_initial_ratio = 0.3;
zoom_end_ratio = 0.8; zoom_end_ratio = 0.8;
fadein_begin_opacity = 0.5; fadein_begin_opacity = 0.5;
@@ -248,5 +245,4 @@
dgop dgop
]; ];
}; };
};
} }

View File

@@ -1,19 +0,0 @@
{
flake.modules.homeManager.desktop = {
xdg.mimeApps = {
enable = true;
defaultApplications = {
"x-scheme-handler/discord" = "vesktop.desktop";
"text/html" = "brave-origin.desktop";
"x-scheme-handler/http" = "brave-origin.desktop";
"x-scheme-handler/https" = "brave-origin.desktop";
"x-scheme-handler/about" = "brave-origin.desktop";
"x-scheme-handler/unknown" = "brave-origin.desktop";
"x-scheme-handler/claude-cli" = "claude-code-url-handler.desktop";
};
};
};
}

View File

@@ -1,21 +0,0 @@
{
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";
};
};
};
}

View File

@@ -1,19 +0,0 @@
{
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";
};
};
};
};
}

View File

@@ -1,77 +0,0 @@
{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;
avatarPath = "/home/tux/Wallpapers/tux.png";
muteSfx = true;
};
bar = {
position = "top";
style = "modular";
time = {
format = "hh:mm:ss A";
};
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;
};
idle = {
enabled = true;
manualInhibit = true;
};
};
};
};
}

View File

@@ -1,30 +0,0 @@
{
flake.modules.homeManager.desktop = {pkgs, ...}: {
home.pointerCursor = {
enable = true;
package = pkgs.bibata-cursors;
name = "Bibata-Modern-Ice";
size = 24;
};
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";
};
}

View File

@@ -1,5 +1,10 @@
{ {
flake.modules.homeManager.desktop = {pkgs, ...}: { flake.modules.homeManager.desktop =
{
pkgs,
...
}:
{
programs.vicinae = { programs.vicinae = {
enable = true; enable = true;
systemd = { systemd = {
@@ -9,12 +14,15 @@
useLayerShell = true; useLayerShell = true;
extensions = with pkgs.vicinae-extensions; [ extensions = with pkgs.vicinae-extensions; [
bluetooth
nix nix
ssh ssh
awww-switcher awww-switcher
process-manager process-manager
pulseaudio pulseaudio
wifi-commander
port-killer port-killer
silverbullet
]; ];
settings = { settings = {
@@ -46,6 +54,11 @@
imports = [ "/run/secrets/vicinae.json" ]; imports = [ "/run/secrets/vicinae.json" ];
providers = { providers = {
"@samlinville/store.raycast.tailscale" = {
"preferences" = {
"tailscalePath" = "${pkgs.tailscale}/bin/tailscale";
};
};
"@sovereign/vicinae-extension-awww-switcher-0" = { "@sovereign/vicinae-extension-awww-switcher-0" = {
"preferences" = { "preferences" = {
"transitionDuration" = "1"; "transitionDuration" = "1";

View File

@@ -1,26 +0,0 @@
{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";
on_demand_loading = true;
};
parakeet = {
on_demand_loading = true;
};
};
};
};
}

View File

@@ -1,5 +1,7 @@
{ {
flake.modules.homeManager.desktop = {pkgs, ...}: { flake.modules.homeManager.desktop =
{ pkgs, ... }:
{
programs.wezterm = { programs.wezterm = {
enable = true; enable = true;
package = pkgs.wezterm-git; package = pkgs.wezterm-git;

View File

@@ -29,25 +29,6 @@
diagnostics = false; diagnostics = false;
metrics = false; metrics = false;
}; };
agent = {
dock = "right";
favorite_models = [];
model_parameters = [];
};
collaboration_panel = {
button = false;
};
agent_servers = {
opencode = {
default_config_options = {
model = "opencode-go/deepseek-v4.1-flash";
};
type = "registry";
};
};
}; };
}; };
}; };

View File

@@ -1,8 +0,0 @@
{
flake.modules.homeManager.desktop = {osConfig, ...}: {
programs.lutris = {
enable = true;
steamPackage = osConfig.programs.steam.package;
};
};
}

View File

@@ -1,16 +1,17 @@
{ {
flake.modules.homeManager.shell = { flake.modules.homeManager.shell =
{
userName, userName,
userEmail, userEmail,
... ...
}: { }:
{
programs.git = { programs.git = {
enable = true; enable = true;
signing = { signing = {
key = "~/.ssh/id_ed25519.pub"; key = "~/.ssh/id_ed25519.pub";
signByDefault = true; signByDefault = true;
}; };
lfs.enable = true;
settings = { settings = {
user = { user = {
name = "${userName}"; name = "${userName}";

View File

@@ -1,7 +0,0 @@
{
flake.modules.homeManager.shell = {
programs.gh = {
enable = true;
};
};
}

View File

@@ -87,25 +87,26 @@
title = "AI Generated Commit Messages"; title = "AI Generated Commit Messages";
key = "CommitMsg"; key = "CommitMsg";
command = '' command = ''
bash -lc ' bash -c "
diff=$(git diff --cached) # Check for staged changes
if [ -z "$diff" ]; then diff=\$(git diff --cached | head -n 10)
echo "No changes in staging. Add changes first." if [ -z \"\$diff\" ]; then
echo \"No changes in staging. Add changes first.\"
exit 1 exit 1
fi fi
SELECTED_TYPE="{{.Form.Type}}" SELECTED_TYPE=\"{{.Form.Type}}\"
COMMITS_TO_SUGGEST=4 COMMITS_TO_SUGGEST=8
opencode run --format json --model=google/gemini-3.5-flash-lite --variant=none " 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. 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 The user has selected: \$SELECTED_TYPE
Your task is to: Your task is to:
1. Analyze the code changes 1. Analyze the code changes
2. Determine the most appropriate commit type if user selected ai-defined 2. Determine the most appropriate commit type (if user selected 'ai-defined')
3. Determine an appropriate scope, component, or area affected 3. Determine an appropriate scope (component/area affected)
4. Decide if this is a breaking change 4. Decide if this is a breaking change
5. Write clear, concise commit messages 5. Write clear, concise commit messages
@@ -119,36 +120,48 @@
- test: Adding missing tests or correcting existing tests - test: Adding missing tests or correcting existing tests
- build: Changes that affect the build system or external dependencies - build: Changes that affect the build system or external dependencies
- ci: Changes to CI configuration files and scripts - ci: Changes to CI configuration files and scripts
- chore: Other changes that do not modify src or test files - chore: Other changes that don't modify src or test files
- revert: Reverts a previous commit - revert: Reverts a previous commit
Follow these guidelines: Follow these guidelines:
- Structure: <type>(<scope>): <description> - Structure: <type>(<scope>): <description>
- If user selected ai-defined, analyze the changes and pick the most suitable type - 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 - If user selected a specific type, use that type: \$SELECTED_TYPE
- Add scope in parentheses if applicable, for example auth, api, ui, config - Add scope in parentheses if applicable (e.g., auth, api, ui, config)
- Use exclamation mark after type or scope for breaking changes: type(scope)!: description - Use exclamation mark (!) after type/scope for breaking changes: type(scope)!: description
- Use lowercase for description except proper nouns - Use lowercase for description (except proper nouns)
- Use imperative mood: add, not added - Use imperative mood (\\\"add\\\", not \\\"added\\\")
- Keep description under 50 characters when possible - Keep description under 50 characters when possible
- No period at the end of subject line - 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: IMPORTANT:
- Generate exactly $COMMITS_TO_SUGGEST different commit message options - 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 'ai-defined', you can use different types for different options
- If user selected a specific type, all messages must use that type - If user selected a specific type, all messages must use that type
- Only return commit messages, no explanations - Only return commit messages, no explanations
- Do not use markdown code blocks - Do not use markdown code blocks
- One message per line - One message per line
Previous commits for context: Previous commits for context:
$(git log --oneline -10) \$(git log --oneline -10)
Changes to analyze: Changes to analyze:
$(git diff --cached --stat) \$(git diff --cached --stat)
$diff \$(git diff --cached)
" | JQ_TEXT=text jq -r "select(.type == env.JQ_TEXT) | .part.text? // empty" \"
' "
''; '';
} }
]; ];

View File

@@ -1,5 +1,7 @@
{ {
flake.modules.homeManager.shell = {pkgs, ...}: { flake.modules.homeManager.shell =
{ pkgs, ... }:
{
home.packages = with pkgs; [ home.packages = with pkgs; [
systemctl-tui systemctl-tui
zip zip
@@ -9,78 +11,6 @@
jq jq
dig dig
lsof lsof
trok
(writeShellScriptBin "hm-override" ''
#!/usr/bin/env bash
set -euo pipefail
usage() {
echo "Usage:"
echo " $0 <filename> Override symlink"
echo " $0 <filename> --restore Restore symlink"
echo " $0 <filename> -r Restore symlink"
exit 1
}
if [[ $# -lt 1 || $# -gt 2 ]]; then
usage
fi
FILE="$1"
LINK_BACKUP="''${FILE}.backup-link"
# Restore
if [[ "''${2:-}" == "--restore" || "''${2:-}" == "-r" ]]; then
if [[ ! -f "$LINK_BACKUP" ]]; then
echo "Error: no backup symlink found: $LINK_BACKUP"
exit 1
fi
TARGET="$(cat "$LINK_BACKUP")"
# Remove the temporary override.
rm -f "$FILE"
# Restore the original symlink.
ln -s "$TARGET" "$FILE"
# Remove the temporary symlink target backup.
rm "$LINK_BACKUP"
echo "Restored: $FILE -> $TARGET"
exit 0
fi
# Override mode
if [[ ! -L "$FILE" ]]; then
echo "Error: $FILE is not a symlink"
exit 1
fi
if [[ -e "$LINK_BACKUP" ]]; then
echo "Error: backup already exists: $LINK_BACKUP"
echo "Restore the existing override before running again."
exit 1
fi
# Remember the original symlink target.
TARGET="$(readlink "$FILE")"
printf '%s\n' "$TARGET" > "$LINK_BACKUP"
# Copy the contents before removing the symlink.
cp "$FILE" "$FILE.tmp"
# Replace the symlink with a regular writable file.
rm "$FILE"
mv "$FILE.tmp" "$FILE"
chmod u+w "$FILE"
echo "Overridden: $FILE"
echo "Original: $FILE -> $TARGET"
'')
]; ];
}; };
} }

View File

@@ -1,5 +1,7 @@
{ {
flake.modules.homeManager.shell = {pkgs, ...}: { flake.modules.homeManager.shell =
{ pkgs, ... }:
{
home.file = { home.file = {
".config/nvim" = { ".config/nvim" = {
recursive = true; recursive = true;
@@ -11,6 +13,7 @@
neovim = { neovim = {
enable = true; enable = true;
defaultEditor = true; defaultEditor = true;
vimAlias = true;
}; };
}; };

View File

@@ -1,36 +1,23 @@
{ {
flake.modules.homeManager.shell = {pkgs, ...}: { flake.modules.homeManager.shell = {
programs.opencode = { programs.opencode = {
enable = true; enable = true;
package = pkgs.opencode-git;
tui = { tui = {
theme = "system"; theme = "system";
}; };
settings = { settings = {
model = "opencode-go/deepseek-v4.1-flash";
provider = { provider = {
google = {
options = {
apiKey = "{file:/run/secrets/gemini-api-key}";
};
};
openrouter = { openrouter = {
options = { options = {
apiKey = "{file:/run/secrets/openrouter-api-key}"; apiKey = "{file:/run/secrets/open_router_api_key}";
}; };
}; };
opencode-go = { opencode-go = {
options = { options = {
apiKey = "{file:/run/secrets/opencode-go-api-key}"; apiKey = "{file:/run/secrets/open_code_go_api_key}";
};
};
zai-coding-plan = {
options = {
apiKey = "{file:/run/secrets/zai-coding-plan-api-key}";
}; };
}; };
}; };
plugin = ["@dietrichgebert/ponytail"];
}; };
}; };
}; };

View File

@@ -1,36 +0,0 @@
{
flake.modules.homeManager.shell = {pkgs, ...}: {
home.file.".pi/agent/auth.json".text = builtins.toJSON {
google = {
type = "api_key";
key = "!cat /run/secrets/gemini-api-key";
};
openrouter = {
type = "api_key";
key = "!cat /run/secrets/openrouter-api-key";
};
opencode-go = {
type = "api_key";
key = "!cat /run/secrets/opencode-go-api-key";
};
zai = {
type = "api_key";
key = "!cat /run/secrets/zai-coding-plan-api-key";
};
};
programs.pi-coding-agent = {
enable = true;
package = pkgs.llm-agents.pi;
settings = {
defaultModel = "glm-5.3-flash";
defaultProvider = "zai";
defaultThinkingLevel = "medium";
theme = "dark";
};
};
home.packages = with pkgs; [llm-agents.omp];
};
}

View File

@@ -1,47 +1,58 @@
{ {
flake.modules.homeManager.shell = {pkgs, ...}: let flake.modules.homeManager.shell =
{ pkgs, ... }:
let
bg = "default"; bg = "default";
fg = "default"; fg = "default";
bg2 = "brightblack"; bg2 = "brightblack";
fg2 = "white"; fg2 = "white";
color = c: "#{@${c}}"; color = c: "#{@${c}}";
indicator = let indicator =
let
accent = color "indicator_color"; accent = color "indicator_color";
content = " "; content = " ";
in "#[reverse,fg=${accent}]#{?client_prefix,${content},}"; in
"#[reverse,fg=${accent}]#{?client_prefix,${content},}";
current_window = let current_window =
let
accent = color "main_accent"; accent = color "main_accent";
index = "#[reverse,fg=${accent},bg=${fg}] #I "; index = "#[reverse,fg=${accent},bg=${fg}] #I ";
name = "#[fg=${bg2},bg=${fg2}] #W "; name = "#[fg=${bg2},bg=${fg2}] #W ";
# flags = "#{?window_flags,#{window_flags}, }"; # flags = "#{?window_flags,#{window_flags}, }";
in "${index}${name}"; in
"${index}${name}";
window_status = let window_status =
let
accent = color "window_color"; accent = color "window_color";
index = "#[reverse,fg=${accent},bg=${fg}] #I "; index = "#[reverse,fg=${accent},bg=${fg}] #I ";
name = "#[fg=${bg2},bg=${fg2}] #W "; name = "#[fg=${bg2},bg=${fg2}] #W ";
# flags = "#{?window_flags,#{window_flags}, }"; # flags = "#{?window_flags,#{window_flags}, }";
in "${index}${name}"; in
"${index}${name}";
battery = let battery =
let
percentage = pkgs.writeShellScript "percentage" ( percentage = pkgs.writeShellScript "percentage" (
if pkgs.stdenv.isDarwin if pkgs.stdenv.isDarwin then
then '' ''
echo $(pmset -g batt | grep -o "[0-9]\+%" | tr '%' ' ') echo $(pmset -g batt | grep -o "[0-9]\+%" | tr '%' ' ')
'' ''
else '' else
''
path="/org/freedesktop/UPower/devices/DisplayDevice" path="/org/freedesktop/UPower/devices/DisplayDevice"
echo $(${pkgs.upower}/bin/upower -i $path | grep -o "[0-9]\+%" | tr '%' ' ') echo $(${pkgs.upower}/bin/upower -i $path | grep -o "[0-9]\+%" | tr '%' ' ')
'' ''
); );
state = pkgs.writeShellScript "state" ( state = pkgs.writeShellScript "state" (
if pkgs.stdenv.isDarwin if pkgs.stdenv.isDarwin then
then '' ''
echo $(pmset -g batt | awk '{print $4}') echo $(pmset -g batt | awk '{print $4}')
'' ''
else '' else
''
path="/org/freedesktop/UPower/devices/DisplayDevice" path="/org/freedesktop/UPower/devices/DisplayDevice"
echo $(${pkgs.upower}/bin/upower -i $path | grep state | awk '{print $2}') echo $(${pkgs.upower}/bin/upower -i $path | grep state | awk '{print $2}')
'' ''
@@ -66,25 +77,31 @@
elif [ $percentage -ge 0 ]; then echo "red" elif [ $percentage -ge 0 ]; then echo "red"
fi fi
''; '';
in "#[fg=#(${color})]#(${icon}) #[fg=${fg}]#(${percentage})%"; in
"#[fg=#(${color})]#(${icon}) #[fg=${fg}]#(${percentage})%";
pwd = let pwd =
let
accent = color "main_accent"; accent = color "main_accent";
icon = "#[fg=${accent}] "; icon = "#[fg=${accent}] ";
format = "#[fg=${fg}]#{b:pane_current_path}"; format = "#[fg=${fg}]#{b:pane_current_path}";
in "${icon}${format}"; in
"${icon}${format}";
git = let git =
let
icon = pkgs.writeShellScript "branch" '' icon = pkgs.writeShellScript "branch" ''
git -C "$1" branch && echo " " git -C "$1" branch && echo " "
''; '';
branch = pkgs.writeShellScript "branch" '' branch = pkgs.writeShellScript "branch" ''
git -C "$1" rev-parse --abbrev-ref HEAD git -C "$1" rev-parse --abbrev-ref HEAD
''; '';
in "#[fg=magenta]#(${icon} #{pane_current_path})#(${branch} #{pane_current_path})"; in
"#[fg=magenta]#(${icon} #{pane_current_path})#(${branch} #{pane_current_path})";
separator = "#[fg=${fg}]|"; separator = "#[fg=${fg}]|";
in { in
{
programs.tmux = { programs.tmux = {
enable = true; enable = true;
baseIndex = 1; baseIndex = 1;

View File

@@ -1,5 +1,8 @@
{lib, ...}: { { lib, ... }:
flake.modules.homeManager.shell = {pkgs, ...}: { {
flake.modules.homeManager.shell =
{ pkgs, ... }:
{
programs.zsh = { programs.zsh = {
enable = true; enable = true;
history = { history = {
@@ -11,17 +14,13 @@
save = 1000000; save = 1000000;
path = "$HOME/.local/share/zsh/.zsh_history"; path = "$HOME/.local/share/zsh/.zsh_history";
}; };
fastSyntaxHighlighting.enable = true; syntaxHighlighting.enable = true;
autosuggestion.enable = true; autosuggestion.enable = true;
initContent = '' initContent = ''
${lib.getExe pkgs.fastfetch} ${lib.getExe pkgs.fastfetch}
bindkey "^A" vi-beginning-of-line bindkey "^A" vi-beginning-of-line
bindkey "^E" vi-end-of-line bindkey "^E" vi-end-of-line
bindkey '^R' fzf-history-widget bindkey '^R' fzf-history-widget
PATH=$PATH:~/.cargo/bin:~/.local/bin
alias stui='systemctl-tui'
alias vim='nvim --clean'
''; '';
}; };
}; };

View File

@@ -1,143 +0,0 @@
{
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;
};
zai-coding-plan-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";
};
}

View File

@@ -1,84 +0,0 @@
{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";
};
};
};
};
};
}

View File

@@ -1,17 +0,0 @@
{
flake.modules.nixos.alpha = {
pkgs,
lib,
modulesPath,
system,
...
}: {
imports = [
(modulesPath + "/profiles/qemu-guest.nix")
];
boot.kernelPackages = pkgs.linuxPackages_zen;
networking.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault system;
};
}

View File

@@ -1,5 +0,0 @@
{
flake.modules.homeManager.alpha = {
home.stateVersion = "26.05";
};
}

View File

@@ -1,36 +0,0 @@
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]
zai-coding-plan-api-key: ENC[AES256_GCM,data:HrNfR+Ux/Iyt4qkD1uXzDFQb+l0ltMMrbRahEG3pofFbw98VXfRFbhspcxh9vEyqkw==,iv:lzkLxPV7Q38dn0IEgtchVMrvnVBz4e5q282704x/hmU=,tag:IKzE6Tp6D93nJHoEvCPGBQ==,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-09-16T14:21:00Z"
mac: ENC[AES256_GCM,data:Aqg1cboHKW5QrJooVIqgbHTFg9EpTEnfCv/RRSp0efzyXvDrR7eG5WTvJPE9IbrmS190yvOlT0fw1Bhzyr8kiyoO71sbyUessw5IMUGcLP+m2FNtt8osc7fSTGseojv3MXBndOMDEOpT+Clv6hbv/rr5eGbb05oK6rW97/pDDfU=,iv:s/9PAHHQ0mHQJosKGclSnumHqm6CG3fDVKD5eT4Q1Y0=,tag:3pgycAwYUz9aEOy4/aW30Q==,type:str]
unencrypted_suffix: _unencrypted
version: 3.13.3

View File

@@ -1,179 +0,0 @@
{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"
".rustup"
".config/sops"
".config/nix"
".local/share/nvim"
".local/share/opencode"
".local/share/zsh"
".local/share/zoxide"
".local/state/lazygit"
".pi/agent/sessions"
".omp"
];
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;
};
coder = {
enable = true;
domain = "coder.lab.tux.rs";
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;
};
zai-coding-plan-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";
wifi.powersave = false;
};
wireless.iwd = {
enable = true;
settings = {
Network = {
EnableIPv6 = true;
};
Settings = {
AutoConnect = true;
};
};
};
firewall.enable = false;
};
environment.systemPackages = with pkgs; [
impala
];
system.stateVersion = "26.05";
};
}

View File

@@ -1,75 +0,0 @@
{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";
};
};
};
};
};
};
};
};
}

View File

@@ -1,34 +0,0 @@
{config, ...}: {
flake.modules.nixos.arcturus = {
lib,
pkgs,
system,
...
} @ innerArgs: {
imports = with config.flake.modules.nixos; [
hardware
];
boot.kernelPackages = pkgs.cachyosKernels.linuxPackages-cachyos-latest-lto-zen4;
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
];
};
}

View File

@@ -1,5 +0,0 @@
{
flake.modules.homeManager.arcturus = {
home.stateVersion = "26.05";
};
}

View File

@@ -1,34 +0,0 @@
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]
zai-coding-plan-api-key: ENC[AES256_GCM,data:lLegmS/RIo7JoBoAyVdcS++rXS8W62cwz+zVsv4dPnlfjGFO/nVlI5InqC34sPxLRQ==,iv:BRC7eYVmdZuWwb+2k2FrnlJih63HXrcvhVp/K5t5td8=,tag:aP8x+Xcnkz2t0hn7erCkKw==,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-09-16T14:20:26Z"
mac: ENC[AES256_GCM,data:I33KZL3u+7jfOFu0qn4LVx2nACiURSd6RcEn0ojfT62yC/TcXlGGu4QeN1Dx4Nta77n/h8RzDTcZtiUJylLhiVBmqyMOoNaBOmLDJ+P1L7weYLoWMoaDP7IWyzttGkNTgvyv2nW5IxbdcTZwrcSlPtdupsJeNy76ATHO+eUsvGQ=,iv:FvQKGH5Vzm36huGDnMr15wQL9vsH2hsAhvu0BE/NfEI=,tag:fzAzzgmv3vjWs1VYhh4GeA==,type:str]
unencrypted_suffix: _unencrypted
version: 3.13.3

View File

@@ -1,165 +0,0 @@
{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"
".rustup"
".agents"
".cache/awww"
".cache/serpantinum"
".config/BraveSoftware"
".config/zed"
".config/Vencord"
".config/vesktop"
".config/sops"
".config/nix"
".config/coderv2"
".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"
".local/state/serpantinum"
".local/share/zed"
".claude"
".orca"
".config/orca"
".zcode"
".config/ZCode"
".pi/agent/sessions"
".omp"
];
files = [
".wakatime.cfg"
".claude.json"
".config/gh/hosts.yml"
];
};
};
};
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;
};
programs.nix-ld.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;
};
zai-coding-plan-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";
wifi.powersave = false;
};
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
llm-agents.claude-code
llm-agents.orca
llm-agents.zcode
coder
];
# !!! DO NOT CHANGE THIS !!!
# This should match the version used at initial install.
system.stateVersion = "26.05";
};
}

View File

@@ -1,83 +0,0 @@
{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";
};
};
};
};
};
};
};
};
}

View File

@@ -1,151 +0,0 @@
{
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.kernelPackages = pkgs.cachyosKernels.linuxPackages-cachyos-bore-lto-x86_64-v3;
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
];
};
}

View File

@@ -1,107 +0,0 @@
{config, ...}: {
flake.modules.homeManager.canopus = {pkgs, ...}: {
imports = with config.flake.modules.homeManager; [
desktop
];
tnix = {
desktop = {
hyprland = {
enable = true;
monitorConfig = ''
hl.monitor({
output = "eDP-1",
mode = "2560x1440@165",
position = "0x0",
scale = "1",
})
'';
workspaceConfig = ''
hl.workspace_rule({ workspace = "1", monitor = "eDP-1", default = true })
hl.workspace_rule({ workspace = "2", monitor = "eDP-1" })
hl.workspace_rule({ workspace = "3", monitor = "eDP-1" })
hl.workspace_rule({ workspace = "4", monitor = "eDP-1" })
hl.workspace_rule({ workspace = "5", monitor = "eDP-1" })
hl.workspace_rule({ workspace = "6", monitor = "eDP-1", layout = "scrolling" })
hl.workspace_rule({ workspace = "7", monitor = "eDP-1", layout = "scrolling" })
'';
};
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";
};
}

View File

@@ -1,31 +0,0 @@
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]
zai-coding-plan-api-key: ENC[AES256_GCM,data:osUoFOvBgu+PtNiTIDIm3JoxsBJnQ9I8zY//9oeTpJxIvMctSWYnT4GYP4oI5mClZg==,iv:z5qxUPomGF1avLyk8PrAS3t+34ZGlQMRjbxVJ4JH9Cc=,tag:Qbz/LYAMXejXU4RS3RUPqA==,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:
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqS2RZdVJaNTlRamZPMkll
MDRVSVl1b2x2LzZpdlBrdmZtdyt3UE15RldRCldXUXE2a1BFeHg5NGNPbW5IMDht
cHN1QituOU9uWFQwNS9udzNEbVhtUjQKLS0tIEtkTXhlYS9XSUlQRTY1eXBjeXZQ
bThQTFdZU29ISm93TWcwVk5ZTkhRWm8KCcprmLGhahgDkXCBpzjctHgao+gc+rKC
xLIwheUyFJOGK+ixqcdoZ/PC0kY68hVLt1YzLAyxFi4Ur1wltPrNug==
-----END AGE ENCRYPTED FILE-----
recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGVW13WFE1Ylh3Uk1HNU1i
bU9kRzFqTmhkQlRzMlRkM0VhMlNmMDUyK25NCkZYUStxM2tScGozRXJGekxGa1RX
b1VXK0Y2Z1U0YU9XRmxRUWdWem50L1EKLS0tIFovcHRlZ1JJd2lRN0RFbHdCdm9m
V1N3eUVjZ0VZRjBZdXRPNng3Y3JoUTAKQau9CG9XfvM+5JZVRwaJr/o/sXMaJiy2
wo2YcDb+4vfT4Wr+/8J3ccQgbLRZH916X5ZPL+A+nFyVXVKOCl3ENg==
-----END AGE ENCRYPTED FILE-----
recipient: age1x36yr8h993srfj29sfpzt4wyz52nztvncpmhgmfs0j26qvfecq3qvcm0an
lastmodified: "2026-09-16T14:20:36Z"
mac: ENC[AES256_GCM,data:mhJvvn/+VBfNrP1pXRweLSNVlHq9/DLDcKQv8k9ZVsEcd077ifEAqduOXVKXcXDM0VTuBzArw9hmih+kZbCHoUZAQrk8LF7FC4a4FFwXG9p45uKWbUloTuq5w3MCxyU8IoyiAufZcWUlYFQjZ8K4n8N0bVrGQGHogemnrBXTUIo=,iv:H3tKQOuIe/pEIp0pUWCSar8VDompXNZ4BZfD1Wg4pb0=,tag:lyPR4Prlal1bpSRLmGfy7A==,type:str]
unencrypted_suffix: _unencrypted
version: 3.13.3

View File

@@ -1,82 +1,22 @@
{config, ...}: { { config, ... }:
flake.modules.nixos.sirius = { {
flake.modules.nixos.sirius =
{
pkgs, pkgs,
hostName, hostName,
userName, userName,
... ...
}: { }:
{
imports = with config.flake.modules.nixos; [ imports = with config.flake.modules.nixos; [
boot
networking networking
desktop desktop
gaming
virtualisation virtualisation
]; ];
tnix = { tnix = {
boot = { services.openssh.enable = true;
secure-boot.enable = true;
impermanence = {
enable = true;
home = {
directories = [
"Distrobox"
".steam"
".bun"
".rustup"
".agents"
".cache/awww"
".cache/serpantinum"
".config/BraveSoftware"
".config/zed"
".config/Vencord"
".config/vesktop"
".config/sops"
".config/nix"
".config/coderv2"
".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"
".local/state/serpantinum"
".local/share/zed"
".claude"
".orca"
".config/orca"
".zcode"
".config/ZCode"
".pi/agent/sessions"
".omp"
];
files = [
".wakatime.cfg"
".config/lan-mouse/lan-mouse.pem"
".claude.json"
".config/gh/hosts.yml"
];
};
};
};
networking = {
openssh.enable = true;
netbird-client.enable = true;
};
virtualisation = { virtualisation = {
docker.enable = true; docker.enable = true;
@@ -85,8 +25,6 @@
waydroid.enable = true; waydroid.enable = true;
distrobox.enable = true; distrobox.enable = true;
}; };
programs.nix-ld.enable = true;
}; };
sops.secrets = { sops.secrets = {
@@ -95,35 +33,30 @@
neededForUsers = true; neededForUsers = true;
}; };
gemini-api-key = { openrouter_api_key = {
sopsFile = ./secrets.yaml; sopsFile = ./secrets.yaml;
owner = userName; owner = userName;
}; };
openrouter-api-key = { opencode_go_api_key = {
sopsFile = ./secrets.yaml; sopsFile = ./secrets.yaml;
owner = userName; owner = userName;
}; };
opencode-go-api-key = { "vicinae.json" = {
sopsFile = ./secrets.yaml; sopsFile = ./secrets.yaml;
owner = userName; owner = userName;
}; };
};
zai-coding-plan-api-key = { # --- Boot ---
sopsFile = ./secrets.yaml; boot = {
owner = userName; loader = {
}; systemd-boot.enable = true;
efi.canTouchEfiVariables = true;
netbird-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
vicinae-json = {
sopsFile = ./secrets.yaml;
owner = userName;
}; };
kernelPackages = pkgs.linuxKernel.packages.linux_zen;
kernelParams = [ "nvidia-drm.modeset=1" ];
}; };
# --- Networking --- # --- Networking ---
@@ -132,7 +65,6 @@
networkmanager = { networkmanager = {
enable = true; enable = true;
wifi.backend = "iwd"; wifi.backend = "iwd";
wifi.powersave = false;
}; };
wireless.iwd = { wireless.iwd = {
enable = true; enable = true;
@@ -148,16 +80,17 @@
firewall.enable = false; firewall.enable = false;
}; };
environment.systemPackages = with pkgs; [ # --- Hardware / GPU ---
davinci-resolve hardware = {
telegram-desktop nvidia = {
galaxy-buds-client modesetting.enable = true;
impala open = false;
llm-agents.claude-code nvidiaSettings = true;
llm-agents.orca };
llm-agents.zcode };
coder nixpkgs.config.cudaSupport = true;
]; services.xserver.videoDrivers = [ "nvidia" ];
environment.systemPackages = with pkgs; [ nvtopPackages.full ];
# !!! DO NOT CHANGE THIS !!! # !!! DO NOT CHANGE THIS !!!
# This should match the version used at initial install. # This should match the version used at initial install.

View File

@@ -0,0 +1,23 @@
{
inputs,
config,
...
}:
let
hostName = "sirius";
userName = "tux";
userEmail = "t@tux.rs";
system = "x86_64-linux";
unstable = true;
nixpkgs = if unstable then inputs.nixpkgs else inputs.nixpkgs-stable;
in
{
flake.nixosConfigurations."${hostName}" = nixpkgs.lib.nixosSystem {
inherit system;
specialArgs = { inherit hostName userName userEmail; };
modules = [
config.flake.modules.nixos.core
config.flake.modules.nixos.${hostName}
];
};
}

View File

@@ -1,83 +0,0 @@
{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";
};
};
};
};
};
};
};
};
}

View File

@@ -1,24 +1,11 @@
{ {
inputs, flake.modules.nixos.sirius =
{
config, config,
...
}: {
flake.modules.nixos.sirius = {
lib, lib,
pkgs,
system,
... ...
} @ innerArgs: { }:
imports = with config.flake.modules.nixos; {
[
hardware
]
++ [
inputs.cardwire.nixosModules.default
];
boot.kernelPackages = pkgs.cachyosKernels.linuxPackages-cachyos-bore-lto-x86_64-v3;
boot.kernelParams = ["nvidia-drm.modeset=1"];
boot.initrd.availableKernelModules = [ boot.initrd.availableKernelModules = [
"nvme" "nvme"
"xhci_pci" "xhci_pci"
@@ -31,32 +18,31 @@
boot.kernelModules = [ "kvm-amd" ]; boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [ ];
hardware = { fileSystems."/" = {
nvidia = { device = "/dev/disk/by-uuid/d856ed98-6841-4cbf-89be-e08c6f48b9ea";
modesetting.enable = true; fsType = "ext4";
open = false;
nvidiaSettings = true;
}; };
cpu.amd.updateMicrocode = lib.mkDefault innerArgs.config.hardware.enableRedistributableFirmware; fileSystems."/boot" = {
}; device = "/dev/disk/by-uuid/7FE1-55C5";
fsType = "vfat";
services = { options = [
xserver.videoDrivers = ["nvidia"]; "fmask=0077"
power-profiles-daemon.enable = true; "dmask=0077"
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
]; ];
}; };
swapDevices = [ { device = "/dev/disk/by-uuid/69794aa5-51a9-4816-8d45-7791505165d4"; } ];
# 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.<interface>.useDHCP`.
networking.useDHCP = lib.mkDefault true;
# networking.interfaces.eno1.useDHCP = lib.mkDefault true;
# networking.interfaces.wlp10s0f3u2i2.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
};
} }

View File

@@ -1,80 +1,11 @@
{config, ...}: { { config, ... }:
{
flake.modules.homeManager.sirius = { flake.modules.homeManager.sirius = {
imports = with config.flake.modules.homeManager; [ imports = with config.flake.modules.homeManager; [
desktop desktop
]; ];
tnix = { tnix.services.lan-mouse = {
desktop = {
hyprland = {
enable = true;
monitorConfig = ''
hl.monitor({
output = "DP-2",
mode = "2560x1440@144",
position = "0x0",
scale = "1",
transform = 1,
})
hl.monitor({
output = "DP-3",
mode = "2560x1440@144",
position = "1440x0",
scale = "1",
})
hl.monitor({
output = "DP-1",
mode = "1920x1080@144",
position = "4000x0",
scale = "1",
transform = 3,
})
'';
workspaceConfig = ''
hl.workspace_rule({ workspace = "1", monitor = "DP-3", default = true })
hl.workspace_rule({ workspace = "2", monitor = "DP-3" })
hl.workspace_rule({ workspace = "3", monitor = "DP-3" })
hl.workspace_rule({ workspace = "4", monitor = "DP-3" })
hl.workspace_rule({ workspace = "5", monitor = "DP-3" })
hl.workspace_rule({ workspace = "6", monitor = "DP-2", layout = "scrolling", layout_opts = { direction = "down" } })
hl.workspace_rule({ workspace = "7", monitor = "DP-1", layout = "scrolling", layout_opts = { direction = "down" } })
'';
};
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; enable = true;
settings = { settings = {
clients = [ clients = [
@@ -87,7 +18,6 @@
]; ];
}; };
}; };
};
home.stateVersion = "26.05"; home.stateVersion = "26.05";
}; };

View File

@@ -1,31 +1,29 @@
tux-password: ENC[AES256_GCM,data:JWQVd2MYX2U4UP4II62ixG9hWI5MtgHAFhl8aCmyrYPl1H/ig9ZYqfTiggJsOoXM9CUHmhUTrSWw7xRvbzztBrC7L4ABcWPbrQ==,iv:wY/RNJs7XaCsHHNX2MLBqzAgDCSo4rht10oiKrUlTHo=,tag:DcADVtEJs2KCeNS6AhO0SQ==,type:str] tux-password: ENC[AES256_GCM,data:EJFFMc0W1YvCLINg4kETlUbqMYSfRTsiRuoB5MybaVwl7bbBXyPFo/MspFFMXpAqSPrzRAPaM8Lxk9ndbjt7gZpSu1dPThq36Q==,iv:zn3UUMOcW09u6KTz87tDr1wfmsLMKIRBDpLfQhg0p14=,tag:AOs7NASXeo98mNKqsYP3Ww==,type:str]
gemini-api-key: ENC[AES256_GCM,data:Y9YgXp/tB3Q1Rb5YMsZLgWCq+bdeIjsXAVeO3Yh7nZ8MwDH7d5De,iv:FIXxJCn6JDYsHIoNn8f8Un3z9ZPVbxdjR48Ux88poRg=,tag:bMJ4i69HTspnhzsrsxkbrw==,type:str] gemini_api_key: ENC[AES256_GCM,data:agH39C8hXX1jKYq03Z70aHHfrKSbNnHJfndMB53YJgWEzban7uMA,iv:fnYOySXisW1n6Moad9xBoRQFtRa/J6zTcp0lAMEtguw=,tag:0ENL4uu+8OpNc9X+hy7SiQ==,type:str]
openrouter-api-key: ENC[AES256_GCM,data:HfZgZz4NyCLLM9woTZp2I6JGOlVcFblw2OMjx8k0TG5ZU2ycBCF6bKqp3wFibUxXcHy+nIfjI82fkLeSyIaGILRLYCJCc8BHKw==,iv:umUcn8MRaj7JXo6IFrGMXOu+jsFSCEikMxsQxfaFS/Q=,tag:l2s61C4EpJoKv8cc9nYGFA==,type:str] openrouter_api_key: ENC[AES256_GCM,data:VBhV4NcR+7O7X2/OpN2yAGnfcSS2o3Zbvr5g3LHjdUixNSq8OZupsT9SVJDGE/RJp6nunPnYo4K8qQP2+m3K3aeQYKIyT5KNTg==,iv:CVLnloUsobanpHOuP31eIGpGoJOODukGaEmQRF+RPGw=,tag:DdEtCHMPwIIbdwZis4lQgg==,type:str]
opencode-go-api-key: ENC[AES256_GCM,data:BGERcZg5Jpnznc4cXeYFMhPk9kKBkd9GvIuQBV9TW3JE1utgrLLYK6mKNCQqrEStRFiO2jUUnBm3opUNL4SuEHFLpw==,iv:fgFAwx6z9yruK27PvAJX/Q2CS9gU+LJ5zMUK/f/rzpo=,tag:BPu3M+jppPB8sLoLmfuY/Q==,type:str] opencode_go_api_key: ENC[AES256_GCM,data:F7WXUHDX+pESqQJ4Sg5lNXqHLvsCd1bDFPZOutuacDFu3wLHs8i0kD/rLZ+m78OmRBRv2P3kf/gJsggtkvLC/PADYQ==,iv:23soYOeKC+CvLqwvP0M+uXICBKLsOs3z8g6iUhxzrpY=,tag:2EhgRFUaHsyNJ6TqYXJYzw==,type:str]
zai-coding-plan-api-key: ENC[AES256_GCM,data:u5RHaBq5WHit+GjcKYnr6vN7jkputBtt3G0lCNBciMgBnBzIcZd/JjJcNaKXfbal5w==,iv:x+mG1aoct7yfm4Hvu1mMqBq8MiF8UZbQ8SFjA99qTIw=,tag:9cEIO2tuhqE6df2M2N/R+g==,type:str] vicinae.json: ENC[AES256_GCM,data:qRv0EUwtS6bK9memOG3BqLf1uE5YNlpSC/p/05sb8Fw6skESaiymo584n5N8vkvGCn2Qjv/6ioJzwP4TieGtPoR1pHXkwTTGdzsnbRoU0bMuTUhD+NUBkjo2men7Yy3ljoNoopmgz9UFfps+EWuZSMmsNgIu/4sMXsNKcpDKcd8vLpXlPogwqUtbzuKw+u4RRzox0GB0QNEGcQ/F6dVKxJ2StDI8Bfy6qovEDUnK0snoCLhvAULwYwTKef8GpkCWVQRWxXk+dA4GjtgPuiABesv82gCsmsvzmfE3LLUqw+SfYgyQIXBL0IxFiULnkYZR7wmpUeWer3VCS1D8mv/0lvmcdvMqILgkV3UqXTrPqA==,iv:v7zh1tae6TFWOYms/7ihBdoJmw3z4jhcq9aV5y46aXc=,tag:2IKxst4I1XpAHp1wkOMYNA==,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: sops:
age: age:
- enc: | - recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4
enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBQNGdHcDc4bTFkR0EyZlUr YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAyblpIWjNqeVBXWnFlSGxw
eXovR1lyeTZJTDg5R281MFFuMHVwOXZXYzNvCkpIT1g3K05WUUswaEVjVVJWQkJq WXhPYlFDNVV2QktKQ2dKdEgxY0dnR2JuRUdRCk5ZNTc0RGpZOG5SRCtRQ0JsdkZt
V20xODdoWlJMY3ZCcGo0czU1TXZFRE0KLS0tIGNTeXV2Mld2STRmRnFaM1MzT3Nk ZEZQSWswa1FTRU04Ky9vWDdOTWdZRncKLS0tIFg2SkJFK1JDVk5Uc2VJTzYyWk1h
Z0JwWWR0STUybjVhSXdDR3NiKzV1eDQK22HmMuyqYaR/eGuALkAPB1Y5bN2KwIt3 cFpmZ0h5SGJtd2JJR05CMkJISnBtbmcKLGKreXlu3YU6KsV8lTVnPYyn33BL2D0z
pamM8vbnjB//hXoyrv4vsoDk9WzLGFGjgiw2qsM2HQgzQqtrwF1/1A== tMpXdTw0hVilpmpZXjwnvV/3OvN6WybXydxaPOjKODBWIKpVxRthBQ==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4 - recipient: age18hepvvp3nw9ram6usxc8rvpxed2pye0knqx0zutqgxeu35k745vqyxfphz
- enc: | enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA1N3ZBd1pHODFtZkZxaHNP YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBWTWQ0OHhnN1p3dTBLeGxp
OXlXUzVFS0ZIam1IWVkxNldOdTEwY0s4aUNZCjVlcnF1aXJxUUlQSXhteXJ6OU1W N05yOUVicnYxU3NETlRQUVgrcWJlMEl3blhZCkl0OGhCN25KTEJaWGNpOVRJUDRX
L0crZzJOaHF2SnVhWVZnVEdqRlR0cjgKLS0tIFlFWHhaR3U2QTNxRGZRMnk3cmll bENKSDN3Z1Fab3lLLzVNMXlrSm5ZVTgKLS0tIHlycjZJUllsb0xvczFKMVFKaldD
M3JocWZJeXFxenhXOENBVWpvNkd3bm8KqhNLzCyEAI643jGWpZF/uTchHmBj8ozU UGpKTHZTT2JZU0xaTHhhRjk2bEhaU1EKutUEk+TMTATHEoM9+MOdkUnIoBMeeDfu
HtpOzKsshif66D0XOHeJQfQamJI4TyKsj3Sk3j9rstsLmN2lxTRGHg== +GGKvInVKkAOtujBtSMj+xM8AEcfaHAFtwTgP/HEk3Hu6v7gp14oew==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1maxsx5tq2h3d92rfyl8ekcdan5gu5cpch4qs3c56cu7qag02xgvs3h0gqc lastmodified: "2026-05-07T13:21:48Z"
lastmodified: "2026-09-16T14:20:48Z" mac: ENC[AES256_GCM,data:VWNmixzidftm4u0lUt5yL9rlvQXOXVT1+A6b/6IyO9WsWi5aM67t9l9phwRxLYad1lLL/epDmJyIJQ0ck01CzQ/hFm2mnMk87ofrwbph3GVdvrYj+2dDkzIBCwDUe/p4rkrTSo87FVJZ8NvrndbBLX3pq7Axjeo92b3Zxfxg+L8=,iv:IqCOBV5EICtO1hRO07Df0fgobO+/biS8O/4lva7NfEg=,tag:vPltr8g61OdKK4XXFyJdgQ==,type:str]
mac: ENC[AES256_GCM,data:i2I6vo/tKTLq44Tu6vI2Cqp0EqQPbwuuRM2WUflD58UCr7huXIKnKrxmB1Hz/fdmpZPiCZ2dSlmOh733fKFclRmpHJLScYRX4+lFXEzToYExZlybVergxC6Cr4IaiB+A/HZIkW6iKK/ULr2mtXYNCqQgDQw8BgJuV2M/bAMM/V4=,iv:9akzmVH4CMMdDS5aukeLOxncMLKfvQCw2BYl36WAfOM=,tag:4F26bqEI8fEtNugqjHCUOg==,type:str]
unencrypted_suffix: _unencrypted unencrypted_suffix: _unencrypted
version: 3.13.3 version: 3.12.2

View File

@@ -1,51 +0,0 @@
{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";
};
}

View File

@@ -1,5 +0,0 @@
{
flake.modules.homeManager.vega = {
home.stateVersion = "26.05";
};
}

View File

@@ -1,44 +0,0 @@
{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";
};
}

View File

@@ -1,84 +0,0 @@
{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";
};
};
};
};
};
}

View File

@@ -1,17 +0,0 @@
{
flake.modules.nixos.vps = {
pkgs,
lib,
modulesPath,
system,
...
}: {
imports = [
(modulesPath + "/profiles/qemu-guest.nix")
];
boot.kernelPackages = pkgs.linuxPackages_zen;
networking.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault system;
};
}

View File

@@ -1,5 +0,0 @@
{
flake.modules.homeManager.vps = {
home.stateVersion = "26.05";
};
}

View File

@@ -1,122 +0,0 @@
{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"
"/etc/ly/save.txt"
]
++ 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
'';
};
};
};
};
}

View File

@@ -1,32 +0,0 @@
{
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;
})
];
};
}

View File

@@ -1,9 +0,0 @@
{
flake.modules.nixos.boot = {
boot = {
consoleLogLevel = 0;
initrd.verbose = false;
supportedFilesystems = ["ntfs"];
};
};
}

View File

@@ -1,39 +0,0 @@
{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";
};
};
};
}

View File

@@ -1,5 +0,0 @@
{
flake.modules.nixos.core = {...}: {
environment.enableAllTerminfo = true;
};
}

View File

@@ -1,14 +1,13 @@
{ inputs, config, ... }:
{
flake.modules.nixos.core =
{ {
inputs,
config,
...
}: {
flake.modules.nixos.core = {
hostName, hostName,
userName, userName,
userEmail, userEmail,
... ...
}: { }:
{
imports = [ imports = [
inputs.home-manager.nixosModules.home-manager inputs.home-manager.nixosModules.home-manager
]; ];

View File

@@ -1,9 +1,11 @@
{ {
flake.modules.nixos.core = { flake.modules.nixos.core =
{
config, config,
userName, userName,
... ...
}: { }:
{
programs.nh = { programs.nh = {
enable = true; enable = true;

View File

@@ -1,12 +0,0 @@
{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;
};
};
}

View File

@@ -1,18 +0,0 @@
{...}: {
flake.modules.nixos.core = {
config,
lib,
...
}:
with lib; let
cfg = config.tnix.programs.nix-ld;
in {
options.tnix.programs.nix-ld = {
enable = mkEnableOption "nix-ld";
};
config = mkIf cfg.enable {
programs.nix-ld.enable = true;
};
};
}

View File

@@ -1,5 +1,7 @@
{ {
flake.modules.nixos.core = {userName, ...}: { flake.modules.nixos.core =
{ userName, ... }:
{
nix = { nix = {
channel.enable = false; channel.enable = false;
@@ -13,11 +15,6 @@
optimise.automatic = true; optimise.automatic = true;
settings = { settings = {
extra-platforms = [
"aarch64-linux"
"arm-linux"
];
experimental-features = [ experimental-features = [
"nix-command" "nix-command"
"flakes" "flakes"

View File

@@ -1,4 +1,5 @@
{inputs, ...}: { { inputs, ... }:
{
flake.modules.nixos.core = { flake.modules.nixos.core = {
nixpkgs = { nixpkgs = {
config = { config = {

View File

@@ -1,5 +1,7 @@
{ {
flake.modules.nixos.core = { flake.modules.nixos.core =
{ pkgs, ... }:
{
security = { security = {
sudo.wheelNeedsPassword = false; sudo.wheelNeedsPassword = false;
}; };

View File

@@ -1,13 +1,17 @@
{inputs, ...}: { { inputs, ... }:
flake.modules.nixos.core = { {
flake.modules.nixos.core =
{
config, config,
pkgs, pkgs,
... ...
}: let }:
let
isEd25519 = k: k.type == "ed25519"; isEd25519 = k: k.type == "ed25519";
getKeyPath = k: k.path; getKeyPath = k: k.path;
keys = builtins.filter isEd25519 config.services.openssh.hostKeys; keys = builtins.filter isEd25519 config.services.openssh.hostKeys;
in { in
{
imports = [ inputs.sops-nix.nixosModules.sops ]; imports = [ inputs.sops-nix.nixosModules.sops ];
sops.age = { sops.age = {

View File

@@ -14,7 +14,6 @@
"https://lan-mouse.cachix.org" "https://lan-mouse.cachix.org"
"https://wezterm.cachix.org" "https://wezterm.cachix.org"
"https://cache.nixos-cuda.org" "https://cache.nixos-cuda.org"
"https://attic.xuyh0120.win/lantian"
]; ];
trusted-substituters = [ trusted-substituters = [
"https://nix-on-droid.cachix.org" "https://nix-on-droid.cachix.org"
@@ -33,11 +32,6 @@
"lan-mouse.cachix.org-1:KlE2AEZUgkzNKM7BIzMQo8w9yJYqUpor1CAUNRY6OyM=" "lan-mouse.cachix.org-1:KlE2AEZUgkzNKM7BIzMQo8w9yJYqUpor1CAUNRY6OyM="
"wezterm.cachix.org-1:kAbhjYUC9qvblTE+s7S+kl5XM1zVa4skO+E/1IDWdH0=" "wezterm.cachix.org-1:kAbhjYUC9qvblTE+s7S+kl5XM1zVa4skO+E/1IDWdH0="
"cache.nixos-cuda.org:74DUi4Ye579gUqzH4ziL9IyiJBlDpMRn9MBN8oNan9M=" "cache.nixos-cuda.org:74DUi4Ye579gUqzH4ziL9IyiJBlDpMRn9MBN8oNan9M="
"lantian:EeAUQ+W+6r7EtwnmYjeVwx5kOGEBpjlBfPlzGlTNvHc="
];
extra-substituters = ["https://cache.numtide.com"];
extra-trusted-public-keys = [
"niks3.numtide.com-1:DTx8wZduET09hRmMtKdQDxNNthLQETkc/yaX7M4qK0g="
]; ];
}; };
}; };

View File

@@ -1,14 +1,14 @@
{ {
flake.modules.nixos.core = { flake.modules.nixos.core =
{
pkgs, pkgs,
lib, lib,
config, config,
userName, userName,
userEmail, userEmail,
... ...
}: let }:
hasPasswordSecret = lib.hasAttrByPath ["sops" "secrets" "tux-password"] config; {
in {
programs.zsh.enable = true; programs.zsh.enable = true;
time.timeZone = "Asia/Kolkata"; time.timeZone = "Asia/Kolkata";
@@ -31,8 +31,7 @@
mutableUsers = false; mutableUsers = false;
defaultUserShell = pkgs.zsh; defaultUserShell = pkgs.zsh;
users.${userName} = { users.${userName} = {
hashedPasswordFile = lib.mkIf hasPasswordSecret config.sops.secrets.tux-password.path; hashedPasswordFile = config.sops.secrets.tux-password.path;
initialPassword = lib.mkIf (!hasPasswordSecret) userName;
isNormalUser = true; isNormalUser = true;
extraGroups = [ extraGroups = [
"networkmanager" "networkmanager"

View File

@@ -1,5 +1,6 @@
{ {
flake.modules.nixos.hardware = {pkgs, ...}: { flake.modules.nixos.desktop = {
security.rtkit.enable = true; security.rtkit.enable = true;
services.pipewire = { services.pipewire = {
@@ -9,10 +10,5 @@
pulse.enable = true; pulse.enable = true;
wireplumber.enable = true; wireplumber.enable = true;
}; };
environment.systemPackages = with pkgs; [
alsa-utils
pavucontrol
];
}; };
} }

View File

@@ -1,5 +1,7 @@
{ {
flake.modules.nixos.desktop = {pkgs, ...}: { flake.modules.nixos.desktop =
{ pkgs, ... }:
{
fonts.packages = with pkgs.nerd-fonts; [ fonts.packages = with pkgs.nerd-fonts; [
fira-code fira-code
jetbrains-mono jetbrains-mono

View File

@@ -1,11 +0,0 @@
{
flake.modules.nixos.desktop = {pkgs, ...}: {
programs.gpu-screen-recorder = {
enable = true;
};
environment.systemPackages = with pkgs; [
gpu-screen-recorder-gtk
];
};
}

View File

@@ -1,5 +1,5 @@
{ {
flake.modules.nixos.hardware = { flake.modules.nixos.desktop = {
hardware = { hardware = {
graphics = { graphics = {
enable = true; enable = true;

View File

@@ -1,5 +1,7 @@
{ {
flake.modules.nixos.desktop = {pkgs, ...}: { flake.modules.nixos.desktop =
{ pkgs, ... }:
{
programs.hyprland = { programs.hyprland = {
enable = true; enable = true;
package = pkgs.hyprland-git.hyprland; package = pkgs.hyprland-git.hyprland;

View File

@@ -3,7 +3,7 @@
services.displayManager.ly = { services.displayManager.ly = {
enable = true; enable = true;
settings = { settings = {
session_log = "null"; # session_log = "null";
}; };
}; };
}; };

View File

@@ -1,9 +1,15 @@
{inputs, ...}: { {
flake.modules.nixos.desktop = { inputs,
...
}:
{
flake.modules.nixos.desktop =
{
pkgs, pkgs,
lib, lib,
... ...
}: { }:
{
imports = [ imports = [
inputs.mango.nixosModules.mango inputs.mango.nixosModules.mango
]; ];

View File

@@ -1,5 +0,0 @@
{
flake.modules.nixos.desktop = {pkgs, ...}: {
environment.systemPackages = with pkgs; [brightnessctl];
};
}

View File

@@ -1,5 +1,7 @@
{ {
flake.modules.nixos.desktop = {pkgs, ...}: { flake.modules.nixos.desktop =
{ pkgs, ... }:
{
programs.obs-studio = { programs.obs-studio = {
enable = true; enable = true;
enableVirtualCamera = true; enableVirtualCamera = true;
@@ -7,7 +9,6 @@
obs-vaapi obs-vaapi
wlrobs wlrobs
obs-source-record obs-source-record
obs-advanced-masks
]; ];
}; };
}; };

View File

@@ -1,16 +0,0 @@
{
flake.modules.nixos.desktop = {pkgs, ...}: {
services = {
gvfs.enable = true;
tumbler.enable = true;
};
programs.thunar = {
enable = true;
plugins = with pkgs; [
thunar-archive-plugin
thunar-volman
];
};
};
}

View File

@@ -1,5 +0,0 @@
{
flake.modules.nixos.desktop = {pkgs, ...}: {
environment.systemPackages = with pkgs; [tshell];
};
}

View File

@@ -1,9 +0,0 @@
{
flake.modules.nixos.gaming = {pkgs, ...}: {
programs.steam = {
enable = true;
protontricks.enable = true;
extraCompatPackages = with pkgs; [proton-ge-bin];
};
};
}

View File

@@ -1,11 +0,0 @@
{
flake.modules.nixos.hardware = {pkgs, ...}: {
hardware.bluetooth = {
enable = true;
};
environment.systemPackages = [
pkgs.bluetui
];
};
}

View File

@@ -1,28 +0,0 @@
{
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 = "";
};
};
};
};
}

View File

@@ -1,27 +0,0 @@
{
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;
};
};
};
}

View File

@@ -1,17 +1,16 @@
{ {
flake.modules.nixos.networking = { flake.modules.nixos.networking =
{
config, config,
lib, lib,
... ...
}: }:
with lib; let with lib;
cfg = config.tnix.networking.openssh; let
cfg = config.tnix.services.openssh;
# Sops needs acess to the keys before the persist dirs are even mounted; so in
# just persisting the keys won't work, we must point at /persist {
hasOptinPersistence = config.tnix.boot.impermanence.enable; options.tnix.services.openssh = {
in {
options.tnix.networking.openssh = {
enable = mkEnableOption "Enable OpenSSH server"; enable = mkEnableOption "Enable OpenSSH server";
ports = mkOption { ports = mkOption {
@@ -60,13 +59,6 @@
ClientAliveCountMax = 5; ClientAliveCountMax = 5;
ClientAliveInterval = 60; ClientAliveInterval = 60;
}; };
hostKeys = [
{
path = "${lib.optionalString hasOptinPersistence "/persist"}/etc/ssh/ssh_host_ed25519_key";
type = "ed25519";
}
];
}; };
}; };
}; };

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