Compare commits

..

1 Commits

Author SHA1 Message Date
tux
8f531dfc4e feat: add pangolin and newt modules 2026-08-09 14:36:16 +05:30
116 changed files with 3007 additions and 5105 deletions

208
README.md
View File

@@ -15,48 +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 |
## 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%">

1567
flake.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{ {
description = "tux's nix configurations"; description = "tux's nix configurations";
outputs = inputs: inputs.flake-parts.lib.mkFlake {inherit inputs;} (inputs.import-tree ./modules); outputs = inputs: inputs.flake-parts.lib.mkFlake { inherit inputs; } (inputs.import-tree ./modules);
inputs = { inputs = {
flake-parts = { flake-parts = {
@@ -24,18 +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"; inputs.nixpkgs.follows = "nixpkgs";
}; };
@@ -64,17 +54,6 @@
inputs.nixpkgs.follows = "nixpkgs"; 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";
@@ -89,11 +68,5 @@
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"; 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";
}; };
} }

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,20 @@
{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;
tfolio = inputs.tfolio.packages.${prev.stdenv.hostPlatform.system}.default;
cyber-tux = inputs.cyber-tux.packages.${prev.stdenv.hostPlatform.system}.default; cyber-tux = inputs.cyber-tux.packages.${prev.stdenv.hostPlatform.system}.default;
ags = inputs.tpanel.packages.${prev.stdenv.hostPlatform.system}.ags.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 = nix-index-small =
inputs.nix-index-database.packages.${prev.stdenv.hostPlatform.system}.nix-index-with-small-db; 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: {
@@ -37,18 +25,14 @@
}; };
nur = inputs.nur.overlays.default; nur = inputs.nur.overlays.default;
copyparty = inputs.copyparty.overlays.default;
llm-agents = inputs.llm-agents.overlays.shared-nixpkgs;
}; };
perSystem = {system, ...}: let perSystem =
pkgs = import inputs.nixpkgs { { system, ... }:
inherit system; {
overlays = builtins.attrValues inputs.self.overlays; _module.args.pkgs = import inputs.nixpkgs {
inherit system;
overlays = builtins.attrValues inputs.self.overlays;
};
}; };
in {
_module.args.pkgs = pkgs;
packages.omasnap = pkgs.omasnap;
};
} }

View File

@@ -1,4 +1,5 @@
{inputs, ...}: { { inputs, ... }:
{
imports = [ imports = [
inputs.treefmt-nix.flakeModule inputs.treefmt-nix.flakeModule
]; ];
@@ -8,7 +9,7 @@
projectRootFile = "flake.nix"; projectRootFile = "flake.nix";
flakeCheck = true; flakeCheck = true;
programs = { programs = {
alejandra.enable = true; nixfmt.enable = true;
}; };
}; };
}; };

View File

@@ -1,11 +1,13 @@
{ {
flake.modules.homeManager.core = {userName, ...}: { flake.modules.homeManager.core =
programs.home-manager.enable = true; { userName, ... }:
systemd.user.startServices = "sd-switch"; {
programs.home-manager.enable = true;
systemd.user.startServices = "sd-switch";
home = { home = {
username = "${userName}"; username = "${userName}";
homeDirectory = "/home/${userName}"; homeDirectory = "/home/${userName}";
};
}; };
};
} }

View File

@@ -1,15 +1,18 @@
{inputs, ...}: { { inputs, ... }:
flake.modules.homeManager.core = { {
lib, flake.modules.homeManager.core =
osConfig ? {}, {
... lib,
}: { osConfig ? { },
nixpkgs = lib.mkIf (!(osConfig.home-manager.useGlobalPkgs or false)) { ...
config = { }:
allowUnfree = true; {
joypixels.acceptLicense = true; nixpkgs = lib.mkIf (!(osConfig.home-manager.useGlobalPkgs or false)) {
config = {
allowUnfree = true;
joypixels.acceptLicense = true;
};
overlays = builtins.attrValues inputs.self.overlays;
}; };
overlays = builtins.attrValues inputs.self.overlays;
}; };
};
} }

View File

@@ -1,37 +1,38 @@
{ {
flake.modules.homeManager.desktop = { flake.modules.homeManager.desktop =
pkgs, {
config, pkgs,
... 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";
value.text = builtins.toJSON { value.text = builtins.toJSON {
external_update_url = "https://clients2.google.com/service/update2/crx"; external_update_url = "https://clients2.google.com/service/update2/crx";
};
}; };
};
extensions = [ extensions = [
{id = "nkbihfbeogaeaoehlefnkodbefgpgknn";} # Metamask { id = "nkbihfbeogaeaoehlefnkodbefgpgknn"; } # Metamask
{id = "gppongmhjkpfnbhagpmjfkannfbllamg";} # Wappalyzer { id = "gppongmhjkpfnbhagpmjfkannfbllamg"; } # Wappalyzer
{id = "nngceckbapebfimnlniiiahkandclblb";} # Bitwarden { id = "nngceckbapebfimnlniiiahkandclblb"; } # Bitwarden
{id = "bfnaelmomeimhlpmgjnjophhpkkoljpa";} # Phantom { id = "bfnaelmomeimhlpmgjnjophhpkkoljpa"; } # Phantom
{id = "eimadpbcbfnmbkopoojfekhnkhdbieeh";} # DarkReader { id = "eimadpbcbfnmbkopoojfekhnkhdbieeh"; } # DarkReader
];
in {
programs.chromium = {
enable = true;
package = pkgs.brave-origin;
commandLineArgs = [
"--disable-features=WebRtcAllowInputVolumeAdjustment"
"--force-device-scale-factor=1.0"
]; ];
in
{
programs.chromium = {
enable = true;
package = pkgs.brave;
commandLineArgs = [
"--disable-features=WebRtcAllowInputVolumeAdjustment"
"--force-device-scale-factor=1.0"
];
};
home.file = builtins.listToAttrs (map extensionJson extensions);
}; };
home.packages = [pkgs.brave];
home.file = builtins.listToAttrs (map extensionJson extensions);
};
} }

View File

@@ -1,58 +1,45 @@
{ {
flake.modules.homeManager.desktop = { flake.modules.homeManager.desktop =
inputs, { inputs, userName, ... }:
userName, {
... imports = [
}: { inputs.nixcord.homeModules.nixcord
imports = [ ];
inputs.nixcord.homeModules.nixcord
];
programs.nixcord = { programs.nixcord = {
enable = true; enable = true;
user = userName; user = userName;
discord.enable = false; discord.enable = false;
vesktop.enable = true; vesktop.enable = true;
config = { config = {
themeLinks = [ themeLinks = [
"https://raw.githubusercontent.com/refact0r/system24/refs/heads/main/archive/flavors/spotify-text.theme.css" "https://raw.githubusercontent.com/refact0r/system24/refs/heads/main/archive/flavors/spotify-text.theme.css"
]; ];
frameless = true; frameless = true;
plugins = { plugins = {
hideMedia.enable = true; hideMedia.enable = true;
anonymiseFileNames.enable = true; ignoreActivities = {
copyFileContents.enable = true; enable = true;
noTypingAnimation.enable = true; ignorePlaying = true;
readAllNotificationsButton.enable = true; ignoreWatching = true;
silentTyping.enable = true; };
validUser.enable = true;
biggerStreamPreview.enable = true;
ignoreActivities = {
enable = true;
ignorePlaying = true;
ignoreWatching = true;
};
sortFriendRequests = {
enable = true;
showDates = true;
}; };
}; };
}; dorion = {
dorion = { theme = "dark";
theme = "dark"; zoom = "1.1";
zoom = "1.1"; blur = "acrylic";
blur = "acrylic"; sysTray = true;
sysTray = true; openOnStartup = true;
openOnStartup = true; autoClearCache = true;
autoClearCache = true; disableHardwareAccel = false;
disableHardwareAccel = false; rpcServer = true;
rpcServer = true; rpcProcessScanner = true;
rpcProcessScanner = true; pushToTalk = true;
pushToTalk = true; pushToTalkKeys = [ "RControl" ];
pushToTalkKeys = ["RControl"]; desktopNotifications = true;
desktopNotifications = true; unreadBadge = true;
unreadBadge = true; };
}; };
}; };
};
} }

View File

@@ -1,73 +1,75 @@
{ {
flake.modules.homeManager.desktop = { flake.modules.homeManager.desktop =
pkgs, {
userName, pkgs,
... userName,
}: { ...
programs.firefox = { }:
enable = true; {
programs.firefox = {
enable = true;
package = pkgs.firefox.override { package = pkgs.firefox.override {
extraPolicies = { extraPolicies = {
CaptivePortal = false; CaptivePortal = false;
DisableFirefoxStudies = true; DisableFirefoxStudies = true;
DisablePocket = true; DisablePocket = true;
DisableTelemetry = true; DisableTelemetry = true;
DisableFirefoxAccounts = false; DisableFirefoxAccounts = false;
NoDefaultBookmarks = true; NoDefaultBookmarks = true;
OfferToSaveLogins = false; OfferToSaveLogins = false;
OfferToSaveLoginsDefault = false; OfferToSaveLoginsDefault = false;
PasswordManagerEnabled = false; PasswordManagerEnabled = false;
FirefoxHome = { FirefoxHome = {
Search = true; Search = true;
Pocket = false; Pocket = false;
Snippets = false; Snippets = false;
TopSites = false; TopSites = false;
Highlights = false; Highlights = false;
}; };
UserMessaging = { UserMessaging = {
ExtensionRecommendations = false; ExtensionRecommendations = false;
SkipOnboarding = true; SkipOnboarding = true;
};
}; };
}; };
};
profiles = { profiles = {
${userName} = { ${userName} = {
id = 0; id = 0;
name = "tux"; name = "tux";
search = { search = {
force = true; force = true;
default = "google"; default = "google";
}; };
settings = { settings = {
"general.smoothScroll" = true; "general.smoothScroll" = true;
"extensions.activeThemeID" = "firefox-compact-dark@mozilla.org"; "extensions.activeThemeID" = "firefox-compact-dark@mozilla.org";
"layout.css.prefers-color-scheme.content-override" = 0; "layout.css.prefers-color-scheme.content-override" = 0;
"browser.compactmode.show" = true; "browser.compactmode.show" = true;
"browser.tabs.firefox-view" = false; "browser.tabs.firefox-view" = false;
"browser.bookmarks.addedImportButton" = false; "browser.bookmarks.addedImportButton" = false;
"extensions.pocket.enabled" = false; "extensions.pocket.enabled" = false;
"browser.fullscreen.autohide" = false; "browser.fullscreen.autohide" = false;
}; };
extraConfig = '' extraConfig = ''
user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true); user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true);
user_pref("full-screen-api.ignore-widgets", true); user_pref("full-screen-api.ignore-widgets", true);
user_pref("media.ffmpeg.vaapi.enabled", true); user_pref("media.ffmpeg.vaapi.enabled", true);
user_pref("media.rdd-vpx.enabled", true); user_pref("media.rdd-vpx.enabled", true);
''; '';
extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [ extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [
ublock-origin ublock-origin
facebook-container facebook-container
metamask metamask
darkreader darkreader
bitwarden bitwarden
wappalyzer wappalyzer
clearurls clearurls
]; ];
};
}; };
}; };
}; };
};
} }

View File

@@ -13,8 +13,6 @@
font-size = 12; font-size = 12;
font-family = "JetBrainsMono Nerd Font"; font-family = "JetBrainsMono Nerd Font";
theme = "poimandres"; theme = "poimandres";
custom-shader = "shaders/cursor_warp.glsl";
custom-shader-animation = "always";
}; };
themes = { themes = {

View File

@@ -1,43 +1,40 @@
{ {
flake.modules.homeManager.desktop = { flake.modules.homeManager.desktop =
config, { config, pkgs, ... }:
pkgs, {
... # TODO: Hyprland 0.55 switched to Lua-based configuration.
}: { # Until the Home Manager module is updated, we symlink our config instead.
# TODO: Hyprland 0.55 switched to Lua-based configuration.
# HM module is updated but I'm too lazy at this point so we symlink our config instead. # wayland.windowManager.hyprland = {
wayland.windowManager.hyprland = { # enable = true;
enable = true; # package = null;
package = null; # portalPackage = null;
portalPackage = null; # xwayland.enable = true;
xwayland.enable = true; # systemd.variables = [ "--all" ];
configType = "hyprlang"; # };
systemd.variables = ["--all"];
home.file = {
".config/hypr/config".source =
config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/Projects/hypr/config";
".config/hypr/hyprland.lua".source =
config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/Projects/hypr/hyprland.lua";
};
home.packages = with pkgs; [
ags
awww
grim
slurp
hyprshot
wl-clipboard
wl-screenrec
(writeShellScriptBin "hypr-screenshot" ''
hyprshot -m region -r ppm - | satty --filename -
'')
(writeShellScriptBin "hypr-screenrecord" ''
wl-screenrec -g "$(slurp)"
'')
];
}; };
home.file = {
".config/hypr/config".source =
config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/Projects/hypr/config";
".config/hypr/hyprland.lua".source =
config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/Projects/hypr/hyprland.lua";
};
home.packages = with pkgs; [
ags
awww
grim
slurp
hyprshot
wl-clipboard
wl-screenrec
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,21 +1,25 @@
{inputs, ...}: { { inputs, ... }:
flake.modules.homeManager.desktop = { {
config, flake.modules.homeManager.desktop =
pkgs, {
lib, config,
... pkgs,
}: 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 = {
enable = mkEnableOption "Enable Lan-Mouse"; enable = mkEnableOption "Enable Lan-Mouse";
settings = mkOption { settings = mkOption {
type = (pkgs.formats.toml {}).type; type = (pkgs.formats.toml { }).type;
default = {}; default = { };
description = '' description = ''
TOML configuration for lan-mouse. TOML configuration for lan-mouse.
See <https://github.com/feschber/lan-mouse/> for available options. See <https://github.com/feschber/lan-mouse/> for available options.
@@ -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,13 +1,17 @@
{inputs, ...}: { { inputs, ... }:
flake.modules.homeManager.desktop = { {
config, flake.modules.homeManager.desktop =
pkgs, {
lib, config,
... pkgs,
}: lib,
with lib; let ...
}:
with lib;
let
cfg = config.tnix.desktop.mangowm; cfg = config.tnix.desktop.mangowm;
in { in
{
imports = [ imports = [
inputs.mango.hmModules.mango inputs.mango.hmModules.mango
]; ];
@@ -17,12 +21,12 @@
monitorRule = mkOption { monitorRule = mkOption {
type = with types; listOf str; type = with types; listOf str;
default = []; default = [ ];
}; };
tagRule = mkOption { tagRule = mkOption {
type = with types; listOf str; type = with types; listOf str;
default = []; default = [ ];
}; };
}; };

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 +1,24 @@
{ {
flake.modules.homeManager.desktop = {pkgs, ...}: { flake.modules.homeManager.desktop =
programs.mpv = { { pkgs, ... }:
enable = true; {
programs.mpv = {
enable = true;
scripts = ( scripts = (
with pkgs.mpvScripts; [ with pkgs.mpvScripts;
modernz [
thumbfast modernz
mpris thumbfast
mpv-image-viewer.image-positioning mpris
] mpv-image-viewer.image-positioning
); ]
);
config = { config = {
osc = "no"; osc = "no";
border = "no"; border = "no";
};
}; };
}; };
};
} }

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 +1,32 @@
{ {
flake.modules.homeManager.desktop = {pkgs, ...}: { flake.modules.homeManager.desktop =
home.pointerCursor = { { pkgs, ... }:
enable = true; {
package = pkgs.bibata-cursors; home.pointerCursor = {
name = "Bibata-Modern-Ice"; enable = true;
size = 24; package = pkgs.bibata-cursors;
}; name = "Bibata-Modern-Ice";
size = 28;
qt = {
enable = true;
style.name = "adwaita-dark";
};
gtk = {
enable = true;
theme = {
name = "adw-gtk3-dark";
package = pkgs.adw-gtk3;
}; };
iconTheme = {
package = pkgs.tela-icon-theme;
name = "Tela-black";
};
};
# Make GTK4/libadwaita apps prefer dark too (they ignore gtk.theme). qt = {
dconf.settings."org/gnome/desktop/interface".color-scheme = "prefer-dark"; 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,60 +1,69 @@
{ {
flake.modules.homeManager.desktop = {pkgs, ...}: { flake.modules.homeManager.desktop =
programs.vicinae = { {
enable = true; pkgs,
systemd = { ...
}:
{
programs.vicinae = {
enable = true; enable = true;
autoStart = true; systemd = {
}; enable = true;
useLayerShell = true; autoStart = true;
extensions = with pkgs.vicinae-extensions; [
nix
ssh
awww-switcher
process-manager
pulseaudio
port-killer
];
settings = {
close_on_focus_loss = false;
consider_preedit = true;
pop_to_root_on_close = true;
favicon_service = "twenty";
search_files_in_root = true;
font = {
normal = {
size = 10;
family = "JetBrainsMono Nerd Font";
};
};
theme = {
light = {
name = "vicinae-light";
icon_theme = "default";
};
dark = {
name = "vicinae-dark";
icon_theme = "default";
};
};
launcher_window = {
opacity = 0.98;
}; };
useLayerShell = true;
imports = ["/run/secrets/vicinae.json"]; extensions = with pkgs.vicinae-extensions; [
# @TODO broken in upstream repo
# bluetooth
nix
ssh
awww-switcher
process-manager
pulseaudio
wifi-commander
port-killer
silverbullet
];
providers = { settings = {
"@sovereign/vicinae-extension-awww-switcher-0" = { close_on_focus_loss = true;
"preferences" = { consider_preedit = true;
"transitionDuration" = "1"; pop_to_root_on_close = true;
"transitionType" = "center"; favicon_service = "twenty";
"wallpaperPath" = "/home/tux/Wallpapers/"; search_files_in_root = true;
font = {
normal = {
size = 10;
family = "JetBrainsMono Nerd Font";
};
};
theme = {
light = {
name = "vicinae-light";
icon_theme = "default";
};
dark = {
name = "vicinae-dark";
icon_theme = "default";
};
};
launcher_window = {
opacity = 0.98;
};
imports = [ "/run/secrets/vicinae.json" ];
providers = {
"@sovereign/vicinae-extension-awww-switcher-0" = {
"preferences" = {
"transitionDuration" = "1";
"transitionType" = "center";
"wallpaperPath" = "/home/tux/Wallpapers/";
};
}; };
}; };
}; };
}; };
}; };
};
} }

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,31 +1,33 @@
{ {
flake.modules.homeManager.desktop = {pkgs, ...}: { flake.modules.homeManager.desktop =
programs.wezterm = { { pkgs, ... }:
enable = true; {
package = pkgs.wezterm-git; programs.wezterm = {
enableZshIntegration = false; enable = true;
package = pkgs.wezterm-git;
enableZshIntegration = false;
extraConfig = '' extraConfig = ''
local wezterm = require 'wezterm' local wezterm = require 'wezterm'
local config = {} local config = {}
config.check_for_updates = false config.check_for_updates = false
config.window_close_confirmation = 'NeverPrompt' config.window_close_confirmation = 'NeverPrompt'
config.color_scheme = 'Poimandres' config.color_scheme = 'Poimandres'
config.colors = { config.colors = {
background = "#0f0f0f" background = "#0f0f0f"
} }
config.enable_tab_bar = false config.enable_tab_bar = false
config.font = wezterm.font_with_fallback { config.font = wezterm.font_with_fallback {
'JetBrainsMono Nerd Font', 'JetBrainsMono Nerd Font',
} }
config.font_size = 12.0 config.font_size = 12.0
config.window_background_opacity = 1 config.window_background_opacity = 1
config.audible_bell = "Disabled" config.audible_bell = "Disabled"
return config return config
''; '';
};
}; };
};
} }

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,25 +1,27 @@
{ {
flake.modules.homeManager.shell = { flake.modules.homeManager.shell =
userName, {
userEmail, userName,
... userEmail,
}: { ...
programs.git = { }:
enable = true; {
signing = { programs.git = {
key = "~/.ssh/id_ed25519.pub"; enable = true;
signByDefault = true; signing = {
}; key = "~/.ssh/id_ed25519.pub";
lfs.enable = true; signByDefault = true;
settings = { };
user = { lfs.enable = true;
name = "${userName}"; settings = {
email = "${userEmail}"; user = {
name = "${userName}";
email = "${userEmail}";
};
init.defaultBranch = "main";
commit.gpgSign = true;
gpg.format = "ssh";
}; };
init.defaultBranch = "main";
commit.gpgSign = true;
gpg.format = "ssh";
}; };
}; };
};
} }

View File

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

View File

@@ -1,86 +1,16 @@
{ {
flake.modules.homeManager.shell = {pkgs, ...}: { flake.modules.homeManager.shell =
home.packages = with pkgs; [ { pkgs, ... }:
systemctl-tui {
zip home.packages = with pkgs; [
unzip systemctl-tui
pciutils zip
usbutils unzip
jq pciutils
dig usbutils
lsof jq
trok dig
lsof
(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,38 +1,42 @@
{ {
flake.modules.homeManager.shell = {pkgs, ...}: { flake.modules.homeManager.shell =
home.file = { { pkgs, ... }:
".config/nvim" = { {
recursive = true; home.file = {
source = "${pkgs.tnvim}"; ".config/nvim" = {
recursive = true;
source = "${pkgs.tnvim}";
};
};
programs = {
neovim = {
enable = true;
defaultEditor = true;
};
vim.enable = true;
};
home = {
packages = with pkgs; [
python3
nodejs
bun
pnpm
go
rustup
typescript
neovide
nil
statix
deadnix
alejandra
luarocks
gdu
gcc
wakatime-cli
];
}; };
}; };
programs = {
neovim = {
enable = true;
defaultEditor = true;
};
};
home = {
packages = with pkgs; [
python3
nodejs
bun
pnpm
go
rustup
typescript
neovide
nil
statix
deadnix
alejandra
luarocks
gdu
gcc
wakatime-cli
];
};
};
} }

View File

@@ -1,13 +1,12 @@
{ {
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"; model = "opencode-go/kimi-k3";
provider = { provider = {
google = { google = {
options = { options = {
@@ -24,13 +23,7 @@
apiKey = "{file:/run/secrets/opencode-go-api-key}"; apiKey = "{file:/run/secrets/opencode-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,138 +1,155 @@
{ {
flake.modules.homeManager.shell = {pkgs, ...}: let flake.modules.homeManager.shell =
bg = "default"; { pkgs, ... }:
fg = "default"; let
bg2 = "brightblack"; bg = "default";
fg2 = "white"; fg = "default";
color = c: "#{@${c}}"; bg2 = "brightblack";
fg2 = "white";
color = c: "#{@${c}}";
indicator = let indicator =
accent = color "indicator_color"; let
content = " "; accent = color "indicator_color";
in "#[reverse,fg=${accent}]#{?client_prefix,${content},}"; content = " ";
in
"#[reverse,fg=${accent}]#{?client_prefix,${content},}";
current_window = let current_window =
accent = color "main_accent"; let
index = "#[reverse,fg=${accent},bg=${fg}] #I "; accent = color "main_accent";
name = "#[fg=${bg2},bg=${fg2}] #W "; index = "#[reverse,fg=${accent},bg=${fg}] #I ";
# flags = "#{?window_flags,#{window_flags}, }"; name = "#[fg=${bg2},bg=${fg2}] #W ";
in "${index}${name}"; # flags = "#{?window_flags,#{window_flags}, }";
in
"${index}${name}";
window_status = let window_status =
accent = color "window_color"; let
index = "#[reverse,fg=${accent},bg=${fg}] #I "; accent = color "window_color";
name = "#[fg=${bg2},bg=${fg2}] #W "; index = "#[reverse,fg=${accent},bg=${fg}] #I ";
# flags = "#{?window_flags,#{window_flags}, }"; name = "#[fg=${bg2},bg=${fg2}] #W ";
in "${index}${name}"; # flags = "#{?window_flags,#{window_flags}, }";
in
"${index}${name}";
battery = let battery =
percentage = pkgs.writeShellScript "percentage" ( let
if pkgs.stdenv.isDarwin percentage = pkgs.writeShellScript "percentage" (
then '' if pkgs.stdenv.isDarwin then
echo $(pmset -g batt | grep -o "[0-9]\+%" | tr '%' ' ') ''
'' echo $(pmset -g batt | grep -o "[0-9]\+%" | tr '%' ' ')
else '' ''
path="/org/freedesktop/UPower/devices/DisplayDevice" else
echo $(${pkgs.upower}/bin/upower -i $path | grep -o "[0-9]\+%" | tr '%' ' ') ''
'' path="/org/freedesktop/UPower/devices/DisplayDevice"
); echo $(${pkgs.upower}/bin/upower -i $path | grep -o "[0-9]\+%" | tr '%' ' ')
state = pkgs.writeShellScript "state" ( ''
if pkgs.stdenv.isDarwin );
then '' state = pkgs.writeShellScript "state" (
echo $(pmset -g batt | awk '{print $4}') if pkgs.stdenv.isDarwin then
'' ''
else '' echo $(pmset -g batt | awk '{print $4}')
path="/org/freedesktop/UPower/devices/DisplayDevice" ''
echo $(${pkgs.upower}/bin/upower -i $path | grep state | awk '{print $2}') else
'' ''
); path="/org/freedesktop/UPower/devices/DisplayDevice"
icon = pkgs.writeShellScript "icon" '' echo $(${pkgs.upower}/bin/upower -i $path | grep state | awk '{print $2}')
percentage=$(${percentage}) ''
state=$(${state}) );
if [ "$state" == "charging" ] || [ "$state" == "fully-charged" ]; then echo "󰂄" icon = pkgs.writeShellScript "icon" ''
elif [ $percentage -ge 75 ]; then echo "󱊣" percentage=$(${percentage})
elif [ $percentage -ge 50 ]; then echo "󱊢" state=$(${state})
elif [ $percentage -ge 25 ]; then echo "󱊡" if [ "$state" == "charging" ] || [ "$state" == "fully-charged" ]; then echo "󰂄"
elif [ $percentage -ge 0 ]; then echo "󰂎" elif [ $percentage -ge 75 ]; then echo "󱊣"
fi elif [ $percentage -ge 50 ]; then echo "󱊢"
''; elif [ $percentage -ge 25 ]; then echo "󱊡"
color = pkgs.writeShellScript "color" '' elif [ $percentage -ge 0 ]; then echo "󰂎"
percentage=$(${percentage}) fi
state=$(${state}) '';
if [ "$state" == "charging" ] || [ "$state" == "fully-charged" ]; then echo "green" color = pkgs.writeShellScript "color" ''
elif [ $percentage -ge 75 ]; then echo "green" percentage=$(${percentage})
elif [ $percentage -ge 50 ]; then echo "${fg2}" state=$(${state})
elif [ $percentage -ge 30 ]; then echo "yellow" if [ "$state" == "charging" ] || [ "$state" == "fully-charged" ]; then echo "green"
elif [ $percentage -ge 0 ]; then echo "red" elif [ $percentage -ge 75 ]; then echo "green"
fi elif [ $percentage -ge 50 ]; then echo "${fg2}"
''; elif [ $percentage -ge 30 ]; then echo "yellow"
in "#[fg=#(${color})]#(${icon}) #[fg=${fg}]#(${percentage})%"; elif [ $percentage -ge 0 ]; then echo "red"
fi
'';
in
"#[fg=#(${color})]#(${icon}) #[fg=${fg}]#(${percentage})%";
pwd = let pwd =
accent = color "main_accent"; let
icon = "#[fg=${accent}] "; accent = color "main_accent";
format = "#[fg=${fg}]#{b:pane_current_path}"; icon = "#[fg=${accent}] ";
in "${icon}${format}"; format = "#[fg=${fg}]#{b:pane_current_path}";
in
"${icon}${format}";
git = let git =
icon = pkgs.writeShellScript "branch" '' let
git -C "$1" branch && echo " " icon = pkgs.writeShellScript "branch" ''
''; git -C "$1" branch && echo " "
branch = pkgs.writeShellScript "branch" '' '';
git -C "$1" rev-parse --abbrev-ref HEAD branch = pkgs.writeShellScript "branch" ''
''; 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 = { {
enable = true; programs.tmux = {
baseIndex = 1; enable = true;
escapeTime = 0; baseIndex = 1;
mouse = true; escapeTime = 0;
extraConfig = '' mouse = true;
set-option -sa terminal-overrides ",xterm*:Tc" extraConfig = ''
set-option -g status-position top set-option -sa terminal-overrides ",xterm*:Tc"
unbind r set-option -g status-position top
bind r source-file ~/.config/tmux/tmux.conf unbind r
bind r source-file ~/.config/tmux/tmux.conf
# remap prefix from C-b to C-Space # remap prefix from C-b to C-Space
# unbind C-b # unbind C-b
# set -g prefix C-Space # set -g prefix C-Space
# bind C-Space send-prefix # bind C-Space send-prefix
# split panes using | and - # split panes using | and -
unbind '"' unbind '"'
unbind % unbind %
bind | split-window -h bind | split-window -h
bind - split-window -v bind - split-window -v
# Start windows and panes at 1, not 0 # Start windows and panes at 1, not 0
set -g base-index 1 set -g base-index 1
set -g pane-base-index 1 set -g pane-base-index 1
set-window-option -g pane-base-index 1 set-window-option -g pane-base-index 1
set-option -g renumber-windows on set-option -g renumber-windows on
# switch panes using Alt-arrow without prefix # switch panes using Alt-arrow without prefix
bind -n M-Left select-pane -L bind -n M-Left select-pane -L
bind -n M-Right select-pane -R bind -n M-Right select-pane -R
bind -n M-Up select-pane -U bind -n M-Up select-pane -U
bind -n M-Down select-pane -D bind -n M-Down select-pane -D
set-option -g default-terminal "screen-256color" set-option -g default-terminal "screen-256color"
set-option -g status-right-length 100 set-option -g status-right-length 100
set-option -g @indicator_color "yellow" set-option -g @indicator_color "yellow"
set-option -g @window_color "magenta" set-option -g @window_color "magenta"
set-option -g @main_accent "blue" set-option -g @main_accent "blue"
set-option -g pane-active-border fg=black set-option -g pane-active-border fg=black
set-option -g pane-border-style fg=black set-option -g pane-border-style fg=black
set-option -g status-style "bg=${bg} fg=${fg}" set-option -g status-style "bg=${bg} fg=${fg}"
set-option -g status-left "${indicator}" set-option -g status-left "${indicator}"
set-option -g status-right "${git} ${pwd} ${separator} ${battery}" set-option -g status-right "${git} ${pwd} ${separator} ${battery}"
set-option -g window-status-current-format "${current_window}" set-option -g window-status-current-format "${current_window}"
set-option -g window-status-format "${window_status}" set-option -g window-status-format "${window_status}"
set-option -g window-status-separator "" set-option -g window-status-separator ""
''; '';
};
}; };
};
} }

View File

@@ -2,7 +2,7 @@
flake.modules.homeManager.shell = { flake.modules.homeManager.shell = {
programs.zoxide = { programs.zoxide = {
enable = true; enable = true;
options = ["--cmd cd"]; options = [ "--cmd cd" ];
enableZshIntegration = true; enableZshIntegration = true;
}; };
}; };

View File

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

View File

@@ -1,143 +1,134 @@
{ config, ... }:
{ {
inputs, flake.modules.nixos.alpha =
config, {
... hostName,
}: { userName,
flake.modules.nixos.alpha = { ...
hostName, }@innerArgs:
userName, {
... imports = with config.flake.modules.nixos; [
} @ innerArgs: {
imports = with config.flake.modules.nixos;
[
boot boot
networking networking
virtualisation virtualisation
services services
]
++ [
inputs.trok.nixosModules.default
inputs.tfolio.nixosModules.default
]; ];
tnix = { tnix = {
boot = { boot = {
legacy.enable = true; legacy.enable = true;
impermanence = { impermanence = {
enable = true; enable = true;
home = { home = {
directories = [ directories = [
".local/share/nvim" ".local/share/nvim"
".local/share/zsh" ".local/share/zsh"
".local/share/zoxide" ".local/share/zoxide"
".local/state/lazygit" ".local/state/lazygit"
".local/share/opencode" ".local/share/opencode"
]; ];
};
}; };
}; };
};
networking = { networking = {
openssh = { openssh.enable = true;
enable = true; netbird-client.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 = { services = {
enable = true; nginx = {
domain = "status.lab.tux.rs"; enable = true;
domain = "lab.tux.rs";
};
pangolin = {
enable = false;
domain = "pangolin.lab.tux.rs";
baseDomain = "lab.tux.rs";
environmentFile = innerArgs.config.sops.secrets."pangolin".path;
};
uptime-kuma = {
enable = true;
port = 1111;
domain = "status.lab.tux.rs";
};
vaultwarden = {
enable = true;
port = 9999;
domain = "bw.lab.tux.rs";
};
mediaflow-proxy = {
enable = true;
port = 8888;
environmentFile = innerArgs.config.sops.secrets."mediaflow-proxy".path;
};
};
virtualisation = {
docker.enable = true;
};
};
sops.secrets = {
tux-password = {
sopsFile = ./secrets.yaml;
neededForUsers = true;
};
gemini-api-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
openrouter-api-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
opencode-go-api-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
netbird-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
"cloudflare-credentials/email" = {
sopsFile = ./secrets.yaml;
};
"cloudflare-credentials/dns-api-token" = {
sopsFile = ./secrets.yaml;
};
aiostreams = {
sopsFile = ./secrets.yaml;
}; };
mediaflow-proxy = { mediaflow-proxy = {
enable = true; sopsFile = ./secrets.yaml;
environmentFile = innerArgs.config.sops.secrets."mediaflow-proxy".path;
}; };
trok = { pangolin = {
enable = true; sopsFile = ./secrets.yaml;
}; };
}; };
virtualisation = { # --- Networking ---
docker.enable = true; networking = {
hostName = hostName;
networkmanager.enable = true;
firewall.enable = false;
}; };
system.stateVersion = "26.05";
}; };
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

@@ -0,0 +1,30 @@
{
inputs,
config,
...
}:
let
hostName = "alpha";
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
system
;
};
modules = [
config.flake.modules.nixos.core
config.flake.modules.nixos.${hostName}
];
};
}

View File

@@ -1,23 +1,22 @@
{inputs, ...}: { { inputs, ... }:
flake.modules.nixos.alpha = { {
config, flake.modules.nixos.alpha =
lib, { config, lib, ... }:
... let
}: let hasOptinPersistence = config.tnix.boot.impermanence.enable;
hasOptinPersistence = config.tnix.boot.impermanence.enable; isLegacy = config.tnix.boot.legacy.enable;
isLegacy = config.tnix.boot.legacy.enable; in
in { {
imports = [ imports = [
inputs.disko.nixosModules.disko inputs.disko.nixosModules.disko
]; ];
disko.devices.disk.primary = { disko.devices.disk.primary = {
device = "/dev/sda"; device = "/dev/sda";
type = "disk"; type = "disk";
content = { content = {
type = "gpt"; type = "gpt";
partitions = partitions = {
{
ESP = { ESP = {
size = "1G"; size = "1G";
type = "EF00"; type = "EF00";
@@ -37,37 +36,36 @@
content = { content = {
type = "btrfs"; type = "btrfs";
# Base subvolumes that always exist # Base subvolumes that always exist
subvolumes = subvolumes = {
{ "/root" = {
"/root" = { mountOptions = [
mountOptions = [ "compress=zstd"
"compress=zstd" "noatime"
"noatime" "space_cache=v2"
"space_cache=v2" ];
]; mountpoint = "/";
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";
};
}; };
"/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";
};
};
}; };
}; };
} }
@@ -78,7 +76,7 @@
type = "EF02"; type = "EF02";
}; };
}; };
};
}; };
}; };
};
} }

View File

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

View File

@@ -1,3 +1,4 @@
{ ... }:
{ {
flake.modules.homeManager.alpha = { flake.modules.homeManager.alpha = {
home.stateVersion = "26.05"; home.stateVersion = "26.05";

View File

@@ -2,7 +2,6 @@ tux-password: ENC[AES256_GCM,data:tvx3nMoIuQSotxHDWLs7UesnyWY3u3EwkqAIzCw3Z2AJse
gemini-api-key: ENC[AES256_GCM,data:Bo3Z5Jhce0UOBn77I2AcrXYbBgPLDx0eOjPC8J63E/VWNhMPbbxb,iv:iWOsTACOMcK3oqq848WnJ5Ku3tYy1aadmLB4IMgoyqg=,tag:BPzlXoP8/iJaj8c/YFCWyg==,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] 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] 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] netbird-key: ENC[AES256_GCM,data:NilfyafnGhFVYD6q4+jJQxlhXNdNC8BQ1CZfu8a5wc693Y1h,iv:Rpl0OpkQdBMPpIJ08t9Z0AjDAW6c97pFZKO1KPu8ipY=,tag:du3d0SQWuqJtJSwhSgJE4g==,type:str]
cloudflare-credentials: cloudflare-credentials:
email: ENC[AES256_GCM,data:K9L6H4dqNNgbCFg=,iv:jirDJb+Y2sXrup6/doRmOdd8tV7zLnttcgG75r4Fs04=,tag:XeyMVC+Q9TEuTxSfOeR2Uw==,type:str] email: ENC[AES256_GCM,data:K9L6H4dqNNgbCFg=,iv:jirDJb+Y2sXrup6/doRmOdd8tV7zLnttcgG75r4Fs04=,tag:XeyMVC+Q9TEuTxSfOeR2Uw==,type:str]
@@ -30,7 +29,7 @@ sops:
4TkObqH8ddGpbd7cX5a/wboTjYuEdAviWxjK2oBPgtcFc1f03X3tmA== 4TkObqH8ddGpbd7cX5a/wboTjYuEdAviWxjK2oBPgtcFc1f03X3tmA==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1mzxxxzhy3us3rd960ufqv7vlxj5cnug86md6x69llg9ujzw2pqws057llf recipient: age1mzxxxzhy3us3rd960ufqv7vlxj5cnug86md6x69llg9ujzw2pqws057llf
lastmodified: "2026-09-16T14:21:00Z" lastmodified: "2026-08-07T20:02:00Z"
mac: ENC[AES256_GCM,data:Aqg1cboHKW5QrJooVIqgbHTFg9EpTEnfCv/RRSp0efzyXvDrR7eG5WTvJPE9IbrmS190yvOlT0fw1Bhzyr8kiyoO71sbyUessw5IMUGcLP+m2FNtt8osc7fSTGseojv3MXBndOMDEOpT+Clv6hbv/rr5eGbb05oK6rW97/pDDfU=,iv:s/9PAHHQ0mHQJosKGclSnumHqm6CG3fDVKD5eT4Q1Y0=,tag:3pgycAwYUz9aEOy4/aW30Q==,type:str] mac: ENC[AES256_GCM,data:VrA2OPCcVvAzYjZTkHPxytclISP24P1FqiIQjSGQItkMLieom80N6933hB0Tdn3BM6600bHt2NweSqHjGx//pn2Gbur4pxeN3TpF9tKXc12IcAThUL9g48fMbk5y+kWWVUF1Pezod0YnzWAlalUXFqvKinfm4RqPNjDjndA/dcI=,iv:xfs9XD5ZIQ6dyMMZ8OE5FEs/hrSr/T2VwC7XvZ7xC2A=,tag:jYWo2kgwwltKB+njiYaPkQ==,type:str]
unencrypted_suffix: _unencrypted unencrypted_suffix: _unencrypted
version: 3.13.3 version: 3.13.3

View File

@@ -1,179 +1,123 @@
{config, ...}: { { config, ... }:
flake.modules.nixos.arcturus = { {
pkgs, flake.modules.nixos.arcturus =
hostName, {
userName, hostName,
... userName,
} @ innerArgs: { ...
imports = with config.flake.modules.nixos; [ }@innerArgs:
boot {
networking imports = with config.flake.modules.nixos; [
virtualisation boot
services networking
]; virtualisation
services
];
tnix = { tnix = {
boot = { boot = {
secure-boot.enable = true; secure-boot.enable = true;
impermanence = { impermanence = {
enable = true; enable = true;
home = { home = {
directories = [ directories = [
"Distrobox" "Distrobox"
".bun" ".config/sops"
".rustup" ".local/share/nvim"
".config/sops" ".local/share/opencode"
".config/nix" ".local/share/zsh"
".local/share/nvim" ".local/share/zoxide"
".local/share/opencode" ".local/state/lazygit"
".local/share/zsh" ];
".local/share/zoxide"
".local/state/lazygit"
".pi/agent/sessions" files = [
".omp" ".wakatime.cfg"
]; ];
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 = { networking = {
openssh.enable = true;
netbird-client.enable = true;
newt = {
enable = false;
environmentFile = innerArgs.config.sops.secrets.newt.path;
};
};
services = {
cyber-tux = {
enable = true;
environmentFile = innerArgs.config.sops.secrets.discord-token.path;
};
};
virtualisation = {
docker.enable = true;
distrobox.enable = true;
};
};
sops.secrets = {
tux-password = {
sopsFile = ./secrets.yaml;
neededForUsers = true;
};
discord-token = {
sopsFile = ./secrets.yaml;
};
gemini-api-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
openrouter-api-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
opencode-go-api-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
netbird-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
newt = {
sopsFile = ./secrets.yaml;
owner = userName;
};
};
# --- Networking ---
networking = {
hostName = hostName;
networkmanager = {
enable = true; enable = true;
domain = "coder.lab.tux.rs"; wifi.backend = "iwd";
configurePangolin = true;
}; };
}; wireless.iwd = {
enable = true;
virtualisation = { settings = {
docker.enable = true; Network = {
distrobox.enable = true; EnableIPv6 = true;
}; };
}; Settings = {
AutoConnect = 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;
}; };
firewall.enable = false;
system.stateVersion = "26.05";
}; };
environment.systemPackages = with pkgs; [
impala
];
system.stateVersion = "26.05";
};
} }

View File

@@ -0,0 +1,30 @@
{
inputs,
config,
...
}:
let
hostName = "arcturus";
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
system
;
};
modules = [
config.flake.modules.nixos.core
config.flake.modules.nixos.${hostName}
];
};
}

View File

@@ -1,42 +1,41 @@
{inputs, ...}: { { inputs, ... }:
flake.modules.nixos.arcturus = { {
config, flake.modules.nixos.arcturus =
lib, { config, lib, ... }:
... let
}: let hasOptinPersistence = config.tnix.boot.impermanence.enable;
hasOptinPersistence = config.tnix.boot.impermanence.enable; in
in { {
imports = [ imports = [
inputs.disko.nixosModules.disko inputs.disko.nixosModules.disko
]; ];
disko.devices.disk.primary = { disko.devices.disk.primary = {
device = "/dev/nvme0n1"; device = "/dev/nvme0n1";
type = "disk"; type = "disk";
content = { content = {
type = "gpt"; type = "gpt";
partitions = { partitions = {
ESP = { ESP = {
size = "1G"; size = "1G";
type = "EF00"; type = "EF00";
content = { content = {
type = "filesystem"; type = "filesystem";
format = "vfat"; format = "vfat";
mountpoint = "/boot"; mountpoint = "/boot";
mountOptions = [ mountOptions = [
"defaults" "defaults"
"umask=0077" "umask=0077"
]; ];
};
}; };
}; root = {
root = { size = "100%";
size = "100%"; type = "8300";
type = "8300"; content = {
content = { type = "btrfs";
type = "btrfs"; # Base subvolumes that always exist
# Base subvolumes that always exist subvolumes = {
subvolumes =
{
"/root" = { "/root" = {
mountOptions = [ mountOptions = [
"compress=zstd" "compress=zstd"
@@ -66,10 +65,10 @@
mountpoint = "/persist"; mountpoint = "/persist";
}; };
}; };
};
}; };
}; };
}; };
}; };
}; };
};
} }

View File

@@ -1,33 +1,36 @@
{config, ...}: { { config, ... }:
flake.modules.nixos.arcturus = { {
lib, flake.modules.nixos.arcturus =
pkgs, {
system, lib,
... pkgs,
} @ innerArgs: { system,
imports = with config.flake.modules.nixos; [ ...
hardware }@innerArgs:
]; {
imports = with config.flake.modules.nixos; [
hardware
];
boot.initrd.availableKernelModules = [ boot.initrd.availableKernelModules = [
"nvme" "nvme"
"xhci_pci" "xhci_pci"
"ahci" "ahci"
"usbhid" "usbhid"
"usb_storage" "usb_storage"
"sd_mod" "sd_mod"
]; ];
boot.initrd.kernelModules = []; boot.initrd.kernelModules = [ ];
boot.kernelModules = ["kvm-amd"]; boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = []; boot.extraModulePackages = [ ];
hardware.cpu.amd.updateMicrocode = lib.mkDefault innerArgs.config.hardware.enableRedistributableFirmware; hardware.cpu.amd.updateMicrocode = lib.mkDefault innerArgs.config.hardware.enableRedistributableFirmware;
networking.useDHCP = lib.mkDefault true; networking.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault system; nixpkgs.hostPlatform = lib.mkDefault system;
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
nvtopPackages.amd nvtopPackages.amd
]; ];
}; };
} }

View File

@@ -1,3 +1,4 @@
{ ... }:
{ {
flake.modules.homeManager.arcturus = { flake.modules.homeManager.arcturus = {
home.stateVersion = "26.05"; home.stateVersion = "26.05";

View File

@@ -3,11 +3,8 @@ discord-token: ENC[AES256_GCM,data:uzxkrNRRplL/1MfvPZ/EL+I8UACuZQBHZ95BSHuxW0nBj
gemini-api-key: ENC[AES256_GCM,data:gLZSoYTdKY+rwIpYiXvN9n9PGkUD6q8Oe7dHnYkjEjwDf5qpjubg,iv:ySoNgQWTu9DjvbashF4ulyYP8fJUl4yrCTeBQ0jrGmw=,tag:FctubsQv50AP78JvTb9bpQ==,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] 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] 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] 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:Agv3ljcUhld+e+YpRNsOXuQPq5uyZWQ+S6epUH044CIlvrC3DMFskOFVPnDco9P5y0pBnL5m9rltlRiQtMP4RNMzYFz5yR/weskmvZkt3dtZ2sdyaK36p6PTsQDOLl3l8rCDoFxaGRHBz3gD5Gyz9lS5GmLcZql6xg/VIAMdwv36/g0=,iv:NrsrTVJ+ycjEU1/nPigCXGUoIZqheEf+WqYhVqVsuJ0=,tag:0UqLf5ZdVCoQrhKDq4EgPw==,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: sops:
age: age:
- enc: | - enc: |
@@ -28,7 +25,7 @@ sops:
TLKEYsPQgOJ7s8P9gw2uPUY6HRz86CtiC6EbO27u0+8BbI85x1QScg== TLKEYsPQgOJ7s8P9gw2uPUY6HRz86CtiC6EbO27u0+8BbI85x1QScg==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1huqa3hc7wcxk4dpelrzny437nzrx4fnll3d8g9ahznzk268yju5qufapxy recipient: age1huqa3hc7wcxk4dpelrzny437nzrx4fnll3d8g9ahznzk268yju5qufapxy
lastmodified: "2026-09-16T14:20:26Z" lastmodified: "2026-08-08T11:57:44Z"
mac: ENC[AES256_GCM,data:I33KZL3u+7jfOFu0qn4LVx2nACiURSd6RcEn0ojfT62yC/TcXlGGu4QeN1Dx4Nta77n/h8RzDTcZtiUJylLhiVBmqyMOoNaBOmLDJ+P1L7weYLoWMoaDP7IWyzttGkNTgvyv2nW5IxbdcTZwrcSlPtdupsJeNy76ATHO+eUsvGQ=,iv:FvQKGH5Vzm36huGDnMr15wQL9vsH2hsAhvu0BE/NfEI=,tag:fzAzzgmv3vjWs1VYhh4GeA==,type:str] mac: ENC[AES256_GCM,data:0BYRw78P4Q0x/Wm5XmT1Jg3o/njic4qmaCFrZ+Egz34TL42zLCjax7TvVrJ/Rzb6UqGgeQb0Nca+JOHjOqs5J+J3SqnTpWnQa51LBu3naPwMphPhGrXgmvzHIFNlTXmljxjGo7tHt8hWHtHy6SgAOuep4tP7vgV/XeY91HGQyXc=,iv:mEbJ8OZ+uaTjhG4tsrHtPjQ6N6UDo7yAJAA7JMdO/r8=,tag:JE2aqSv4hJT4hpWZiyu9/g==,type:str]
unencrypted_suffix: _unencrypted unencrypted_suffix: _unencrypted
version: 3.13.3 version: 3.13.3

View File

@@ -1,165 +1,134 @@
{config, ...}: { { config, ... }:
flake.modules.nixos.canopus = { {
pkgs, flake.modules.nixos.canopus =
hostName, {
userName, pkgs,
... hostName,
}: { userName,
imports = with config.flake.modules.nixos; [ ...
boot }:
networking {
desktop imports = with config.flake.modules.nixos; [
gaming boot
virtualisation networking
]; desktop
gaming
virtualisation
];
tnix = { tnix = {
boot = { boot = {
secure-boot.enable = true; secure-boot.enable = true;
impermanence = { impermanence = {
enable = true; enable = true;
home = { home = {
directories = [ directories = [
"Distrobox" "Distrobox"
".steam" ".steam"
".bun" ".cache/awww"
".rustup" ".config/BraveSoftware"
".agents" ".config/zed"
".cache/awww" ".config/Vencord"
".cache/serpantinum" ".config/vesktop"
".config/BraveSoftware" ".config/sops"
".config/zed" ".config/obs-studio"
".config/Vencord" ".config/easyeffects"
".config/vesktop" ".config/DankMaterialShell"
".config/sops" ".local/share/Steam"
".config/nix" ".local/share/nvim"
".config/coderv2" ".local/share/opencode"
".config/obs-studio" ".local/share/zsh"
".config/easyeffects" ".local/share/zoxide"
".config/DankMaterialShell" ".local/state/lazygit"
".local/share/Steam" ".local/share/vicinae"
".local/share/lutris" ".local/share/TelegramDesktop"
".local/share/net.lutris.Lutris" ".local/share/GalaxyBudsClient"
".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" files = [
".orca" ".wakatime.cfg"
".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;
};
}; };
sops.secrets = {
tux-password = {
sopsFile = ./secrets.yaml;
neededForUsers = true;
};
gemini-api-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
openrouter-api-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
opencode-go-api-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
netbird-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
vicinae-json = {
sopsFile = ./secrets.yaml;
owner = userName;
};
};
# --- Networking ---
networking = { networking = {
openssh.enable = true; hostName = hostName;
netbird-client.enable = true; networkmanager = {
}; enable = true;
wifi.backend = "iwd";
virtualisation = { };
docker.enable = true; wireless.iwd = {
docker.nvidia.enable = false; enable = true;
qemu.enable = true; settings = {
waydroid.enable = true; Network = {
distrobox.enable = true; EnableIPv6 = true;
}; };
Settings = {
programs.nix-ld.enable = true; AutoConnect = 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;
}; };
firewall.enable = false;
environment.systemPackages = with pkgs; [
davinci-resolve
telegram-desktop
galaxy-buds-client
];
# !!! DO NOT CHANGE THIS !!!
# This should match the version used at initial install.
system.stateVersion = "26.05";
}; };
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

@@ -0,0 +1,30 @@
{
inputs,
config,
...
}:
let
hostName = "canopus";
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
system
;
};
modules = [
config.flake.modules.nixos.core
config.flake.modules.nixos.${hostName}
];
};
}

View File

@@ -1,50 +1,49 @@
{inputs, ...}: { { inputs, ... }:
flake.modules.nixos.canopus = { {
config, flake.modules.nixos.canopus =
lib, { config, lib, ... }:
... let
}: let hasOptinPersistence = config.tnix.boot.impermanence.enable;
hasOptinPersistence = config.tnix.boot.impermanence.enable; in
in { {
imports = [ imports = [
inputs.disko.nixosModules.disko inputs.disko.nixosModules.disko
]; ];
disko.devices.disk.primary = { disko.devices.disk.primary = {
device = "/dev/nvme0n1"; device = "/dev/nvme0n1";
type = "disk"; type = "disk";
content = { content = {
type = "gpt"; type = "gpt";
partitions = { partitions = {
ESP = { ESP = {
size = "1G"; size = "1G";
type = "EF00"; type = "EF00";
content = { content = {
type = "filesystem"; type = "filesystem";
format = "vfat"; format = "vfat";
mountpoint = "/boot"; mountpoint = "/boot";
mountOptions = [ mountOptions = [
"defaults" "defaults"
"umask=0077" "umask=0077"
]; ];
};
}; };
}; swap = {
swap = { size = "32G";
size = "32G"; content = {
content = { type = "swap";
type = "swap"; discardPolicy = "both";
discardPolicy = "both"; resumeDevice = true;
resumeDevice = true; };
}; };
}; root = {
root = { size = "100%";
size = "100%"; type = "8300";
type = "8300"; content = {
content = { type = "btrfs";
type = "btrfs"; # Base subvolumes that always exist
# Base subvolumes that always exist subvolumes = {
subvolumes =
{
"/root" = { "/root" = {
mountOptions = [ mountOptions = [
"compress=zstd" "compress=zstd"
@@ -74,10 +73,10 @@
mountpoint = "/persist"; mountpoint = "/persist";
}; };
}; };
};
}; };
}; };
}; };
}; };
}; };
};
} }

View File

@@ -1,150 +1,150 @@
{ inputs, config, ... }:
{ {
inputs, flake.modules.nixos.canopus =
config, {
... lib,
}: { pkgs,
flake.modules.nixos.canopus = { system,
lib, ...
pkgs, }@innerArgs:
system, {
... imports =
} @ innerArgs: { with config.flake.modules.nixos;
imports = with config.flake.modules.nixos; [
[ hardware
hardware ]
] ++ [ inputs.nixos-hardware.nixosModules.asus-zephyrus-ga503 ];
++ [
inputs.nixos-hardware.nixosModules.asus-zephyrus-ga503 boot.kernelParams = [ "nvidia-drm.modeset=1" ];
inputs.cardwire.nixosModules.default boot.initrd.availableKernelModules = [
"nvme"
"xhci_pci"
"ahci"
"usbhid"
"usb_storage"
"sd_mod"
]; ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ];
boot.kernelParams = ["nvidia-drm.modeset=1"]; hardware = {
boot.initrd.availableKernelModules = [ nvidia = {
"nvme" modesetting.enable = true;
"xhci_pci" open = false;
"ahci" nvidiaSettings = true;
"usbhid" };
"usb_storage"
"sd_mod"
];
boot.initrd.kernelModules = [];
boot.kernelModules = ["kvm-amd"];
boot.extraModulePackages = [];
hardware = { cpu.amd.updateMicrocode = lib.mkDefault innerArgs.config.hardware.enableRedistributableFirmware;
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;
services = { supergfxd = {
xserver.videoDrivers = ["nvidia"]; enable = true;
power-profiles-daemon.enable = true; settings = {
upower.enable = true; mode = "Hybrid";
vfio_enable = false;
vfio_save = false;
always_reboot = false;
no_logind = false;
logout_timeout_s = 180;
hotplug_type = "None";
};
};
cardwire = { asusd = {
enable = true; enable = true;
settings = { asusdConfig.text = ''
auto_apply_gpu_state = true; (
experimental_nvidia_block = true; charge_control_end_threshold: 80,
battery_auto_switch = true; disable_nvidia_powerd_on_battery: true,
battery_auto_switch_mode = "hybrid"; 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: [],
),
)
'';
}; };
}; };
asusd = { networking.useDHCP = lib.mkDefault true;
enable = true; nixpkgs.config.cudaSupport = true;
asusdConfig.text = '' nixpkgs.hostPlatform = lib.mkDefault system;
(
charge_control_end_threshold: 80,
disable_nvidia_powerd_on_battery: true,
ac_command: "",
bat_command: "",
platform_profile_linked_epp: true, environment.systemPackages = with pkgs; [
platform_profile_on_battery: Quiet, nvtopPackages.full
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,5 +1,6 @@
{config, ...}: { { config, ... }:
flake.modules.homeManager.canopus = {pkgs, ...}: { {
flake.modules.homeManager.canopus = { pkgs, ... }: {
imports = with config.flake.modules.homeManager; [ imports = with config.flake.modules.homeManager; [
desktop desktop
]; ];
@@ -26,7 +27,8 @@
enable = true; enable = true;
settings = { settings = {
authorized_fingerprints = { 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"; "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";
}; };
}; };
}; };
@@ -40,7 +42,7 @@
position = "0x0", position = "0x0",
scale = "1", scale = "1",
disabled = false disabled = false
})' && })' &&
hyprctl eval 'hl.monitor({ hyprctl eval 'hl.monitor({
output = "HDMI-A-1", output = "HDMI-A-1",
mode = "preferred", mode = "preferred",
@@ -56,7 +58,7 @@
position = "0x0", position = "0x0",
scale = "1", scale = "1",
disabled = false disabled = false
})' && })' &&
hyprctl eval 'hl.monitor({ hyprctl eval 'hl.monitor({
output = "HDMI-A-1", output = "HDMI-A-1",
mode = "preferred", mode = "preferred",
@@ -69,7 +71,7 @@
hyprctl eval 'hl.monitor({ hyprctl eval 'hl.monitor({
output = "eDP-1", output = "eDP-1",
disabled = true disabled = true
})' && })' &&
hyprctl eval 'hl.monitor({ hyprctl eval 'hl.monitor({
output = "HDMI-A-1", output = "HDMI-A-1",
mode = "preferred", mode = "preferred",

View File

@@ -2,12 +2,12 @@ tux-password: ENC[AES256_GCM,data:Xb4/JMAZCBnBheDCJdRRGXLnMJ1ej8HbN+AUqA/+2sdYES
gemini-api-key: ENC[AES256_GCM,data:Q6+actg0oyUWiUJVy/9yZmea1QyGu2o8LfMsuAVFD6k7kp0dYIrl,iv:ukyouqrHxzVpBBE98KL6PW8P3j+seemm/e0Gl1urUcM=,tag:Z7MM3dJ414CmdxE72cdzNA==,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] 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] 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] 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] 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: sops:
age: age:
- enc: | - recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4
enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqS2RZdVJaNTlRamZPMkll YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqS2RZdVJaNTlRamZPMkll
MDRVSVl1b2x2LzZpdlBrdmZtdyt3UE15RldRCldXUXE2a1BFeHg5NGNPbW5IMDht MDRVSVl1b2x2LzZpdlBrdmZtdyt3UE15RldRCldXUXE2a1BFeHg5NGNPbW5IMDht
@@ -15,8 +15,8 @@ sops:
bThQTFdZU29ISm93TWcwVk5ZTkhRWm8KCcprmLGhahgDkXCBpzjctHgao+gc+rKC bThQTFdZU29ISm93TWcwVk5ZTkhRWm8KCcprmLGhahgDkXCBpzjctHgao+gc+rKC
xLIwheUyFJOGK+ixqcdoZ/PC0kY68hVLt1YzLAyxFi4Ur1wltPrNug== xLIwheUyFJOGK+ixqcdoZ/PC0kY68hVLt1YzLAyxFi4Ur1wltPrNug==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4 - recipient: age1x36yr8h993srfj29sfpzt4wyz52nztvncpmhgmfs0j26qvfecq3qvcm0an
- enc: | enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGVW13WFE1Ylh3Uk1HNU1i YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGVW13WFE1Ylh3Uk1HNU1i
bU9kRzFqTmhkQlRzMlRkM0VhMlNmMDUyK25NCkZYUStxM2tScGozRXJGekxGa1RX bU9kRzFqTmhkQlRzMlRkM0VhMlNmMDUyK25NCkZYUStxM2tScGozRXJGekxGa1RX
@@ -24,8 +24,7 @@ sops:
V1N3eUVjZ0VZRjBZdXRPNng3Y3JoUTAKQau9CG9XfvM+5JZVRwaJr/o/sXMaJiy2 V1N3eUVjZ0VZRjBZdXRPNng3Y3JoUTAKQau9CG9XfvM+5JZVRwaJr/o/sXMaJiy2
wo2YcDb+4vfT4Wr+/8J3ccQgbLRZH916X5ZPL+A+nFyVXVKOCl3ENg== wo2YcDb+4vfT4Wr+/8J3ccQgbLRZH916X5ZPL+A+nFyVXVKOCl3ENg==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1x36yr8h993srfj29sfpzt4wyz52nztvncpmhgmfs0j26qvfecq3qvcm0an lastmodified: "2026-05-12T06:33:00Z"
lastmodified: "2026-09-16T14:20:36Z" mac: ENC[AES256_GCM,data:htDJdEx34Q5NG8vwbBimnFENZawbLZ4FC0DkyG6J5RYP0BFnycKcKGsYR87SvIjcJZXvfZ0e6fXdtc78dd6I0sQtrQ7aNn4Iktbu/AkPmntsBwpIjVI99X9zUyQB87go/oX15yuyt8loB6ds2RkL/pfFsgLbFc10JHsBy+WcEzI=,iv:HvY+5LYzyHpRm8XCSKrN8ra/LJT9v23TPSsZg/4QVNU=,tag:k+d45+zgBYq4vlWmmc8ZkQ==,type:str]
mac: ENC[AES256_GCM,data:mhJvvn/+VBfNrP1pXRweLSNVlHq9/DLDcKQv8k9ZVsEcd077ifEAqduOXVKXcXDM0VTuBzArw9hmih+kZbCHoUZAQrk8LF7FC4a4FFwXG9p45uKWbUloTuq5w3MCxyU8IoyiAufZcWUlYFQjZ8K4n8N0bVrGQGHogemnrBXTUIo=,iv:H3tKQOuIe/pEIp0pUWCSar8VDompXNZ4BZfD1Wg4pb0=,tag:lyPR4Prlal1bpSRLmGfy7A==,type:str]
unencrypted_suffix: _unencrypted unencrypted_suffix: _unencrypted
version: 3.13.3 version: 3.12.2

View File

@@ -1,166 +1,133 @@
{config, ...}: { { config, ... }:
flake.modules.nixos.sirius = { {
pkgs, flake.modules.nixos.sirius =
hostName, {
userName, pkgs,
... hostName,
}: { userName,
imports = with config.flake.modules.nixos; [ ...
boot }:
networking {
desktop imports = with config.flake.modules.nixos; [
gaming boot
virtualisation networking
]; desktop
gaming
virtualisation
];
tnix = { tnix = {
boot = { boot = {
secure-boot.enable = true; secure-boot.enable = true;
impermanence = { impermanence = {
enable = true; enable = true;
home = { home = {
directories = [ directories = [
"Distrobox" "Distrobox"
".steam" ".steam"
".bun" ".cache/awww"
".rustup" ".config/BraveSoftware"
".agents" ".config/zed"
".cache/awww" ".config/Vencord"
".cache/serpantinum" ".config/vesktop"
".config/BraveSoftware" ".config/sops"
".config/zed" ".config/obs-studio"
".config/Vencord" ".config/easyeffects"
".config/vesktop" ".config/DankMaterialShell"
".config/sops" ".local/share/Steam"
".config/nix" ".local/share/nvim"
".config/coderv2" ".local/share/opencode"
".config/obs-studio" ".local/share/zsh"
".config/easyeffects" ".local/share/zoxide"
".config/DankMaterialShell" ".local/state/lazygit"
".local/share/Steam" ".local/share/vicinae"
".local/share/lutris" ".local/share/TelegramDesktop"
".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" files = [
".orca" ".wakatime.cfg"
".config/orca" ".config/lan-mouse/lan-mouse.pem"
".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 = {
docker.enable = true;
docker.nvidia.enable = true;
qemu.enable = true;
waydroid.enable = true;
distrobox.enable = true;
};
}; };
sops.secrets = {
tux-password = {
sopsFile = ./secrets.yaml;
neededForUsers = true;
};
gemini-api-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
openrouter-api-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
opencode-go-api-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
netbird-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
vicinae-json = {
sopsFile = ./secrets.yaml;
owner = userName;
};
};
# --- Networking ---
networking = { networking = {
openssh.enable = true; hostName = hostName;
netbird-client.enable = true; networkmanager = {
}; enable = true;
wifi.backend = "iwd";
virtualisation = { };
docker.enable = true; wireless.iwd = {
docker.nvidia.enable = true; enable = true;
qemu.enable = true; settings = {
waydroid.enable = true; Network = {
distrobox.enable = true; EnableIPv6 = true;
}; };
Settings = {
programs.nix-ld.enable = true; AutoConnect = 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;
}; };
firewall.enable = false;
environment.systemPackages = with pkgs; [
davinci-resolve
telegram-desktop
];
# !!! DO NOT CHANGE THIS !!!
# This should match the version used at initial install.
system.stateVersion = "26.05";
}; };
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

@@ -0,0 +1,30 @@
{
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
system
;
};
modules = [
config.flake.modules.nixos.core
config.flake.modules.nixos.${hostName}
];
};
}

View File

@@ -1,50 +1,49 @@
{inputs, ...}: { { inputs, ... }:
flake.modules.nixos.sirius = { {
config, flake.modules.nixos.sirius =
lib, { config, lib, ... }:
... let
}: let hasOptinPersistence = config.tnix.boot.impermanence.enable;
hasOptinPersistence = config.tnix.boot.impermanence.enable; in
in { {
imports = [ imports = [
inputs.disko.nixosModules.disko inputs.disko.nixosModules.disko
]; ];
disko.devices.disk.primary = { disko.devices.disk.primary = {
device = "/dev/nvme1n1"; device = "/dev/nvme1n1";
type = "disk"; type = "disk";
content = { content = {
type = "gpt"; type = "gpt";
partitions = { partitions = {
ESP = { ESP = {
size = "1G"; size = "1G";
type = "EF00"; type = "EF00";
content = { content = {
type = "filesystem"; type = "filesystem";
format = "vfat"; format = "vfat";
mountpoint = "/boot"; mountpoint = "/boot";
mountOptions = [ mountOptions = [
"defaults" "defaults"
"umask=0077" "umask=0077"
]; ];
};
}; };
}; swap = {
swap = { size = "70G";
size = "70G"; content = {
content = { type = "swap";
type = "swap"; discardPolicy = "both";
discardPolicy = "both"; resumeDevice = true;
resumeDevice = true; };
}; };
}; root = {
root = { size = "100%";
size = "100%"; type = "8300";
type = "8300"; content = {
content = { type = "btrfs";
type = "btrfs"; # Base subvolumes that always exist
# Base subvolumes that always exist subvolumes = {
subvolumes =
{
"/root" = { "/root" = {
mountOptions = [ mountOptions = [
"compress=zstd" "compress=zstd"
@@ -74,10 +73,10 @@
mountpoint = "/persist"; mountpoint = "/persist";
}; };
}; };
};
}; };
}; };
}; };
}; };
}; };
};
} }

View File

@@ -1,61 +1,51 @@
{ config, ... }:
{ {
inputs, flake.modules.nixos.sirius =
config, {
... lib,
}: { pkgs,
flake.modules.nixos.sirius = { system,
lib, ...
pkgs, }@innerArgs:
system, {
... imports = with config.flake.modules.nixos; [
} @ innerArgs: {
imports = with config.flake.modules.nixos;
[
hardware hardware
]
++ [
inputs.cardwire.nixosModules.default
]; ];
boot.kernelParams = ["nvidia-drm.modeset=1"]; boot.kernelParams = [ "nvidia-drm.modeset=1" ];
boot.initrd.availableKernelModules = [ boot.initrd.availableKernelModules = [
"nvme" "nvme"
"xhci_pci" "xhci_pci"
"ahci" "ahci"
"usbhid" "usbhid"
"usb_storage" "usb_storage"
"sd_mod" "sd_mod"
]; ];
boot.initrd.kernelModules = []; boot.initrd.kernelModules = [ ];
boot.kernelModules = ["kvm-amd"]; boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = []; boot.extraModulePackages = [ ];
hardware = { hardware = {
nvidia = { nvidia = {
modesetting.enable = true; modesetting.enable = true;
open = false; open = false;
nvidiaSettings = true; nvidiaSettings = true;
};
cpu.amd.updateMicrocode = lib.mkDefault innerArgs.config.hardware.enableRedistributableFirmware;
}; };
cpu.amd.updateMicrocode = lib.mkDefault innerArgs.config.hardware.enableRedistributableFirmware; services = {
}; xserver.videoDrivers = [ "nvidia" ];
power-profiles-daemon.enable = true;
services = {
xserver.videoDrivers = ["nvidia"];
power-profiles-daemon.enable = true;
cardwire = {
enable = true;
settings.auto_apply_gpu_state = true;
}; };
networking.useDHCP = lib.mkDefault true;
nixpkgs.config.cudaSupport = true;
nixpkgs.hostPlatform = lib.mkDefault system;
environment.systemPackages = with pkgs; [
nvtopPackages.full
];
}; };
networking.useDHCP = lib.mkDefault true;
nixpkgs.config.cudaSupport = true;
nixpkgs.hostPlatform = lib.mkDefault system;
environment.systemPackages = with pkgs; [
nvtopPackages.full
];
};
} }

View File

@@ -1,4 +1,5 @@
{config, ...}: { { config, ... }:
{
flake.modules.homeManager.sirius = { flake.modules.homeManager.sirius = {
imports = with config.flake.modules.homeManager; [ imports = with config.flake.modules.homeManager; [
desktop desktop
@@ -44,7 +45,7 @@
position = "bottom"; position = "bottom";
hostname = "canopus"; hostname = "canopus";
activate_on_startup = true; activate_on_startup = true;
ips = ["192.168.8.2"]; ips = [ "192.168.8.2" ];
} }
]; ];
}; };

View File

@@ -2,12 +2,12 @@ tux-password: ENC[AES256_GCM,data:JWQVd2MYX2U4UP4II62ixG9hWI5MtgHAFhl8aCmyrYPl1H
gemini-api-key: ENC[AES256_GCM,data:Y9YgXp/tB3Q1Rb5YMsZLgWCq+bdeIjsXAVeO3Yh7nZ8MwDH7d5De,iv:FIXxJCn6JDYsHIoNn8f8Un3z9ZPVbxdjR48Ux88poRg=,tag:bMJ4i69HTspnhzsrsxkbrw==,type:str] gemini-api-key: ENC[AES256_GCM,data:Y9YgXp/tB3Q1Rb5YMsZLgWCq+bdeIjsXAVeO3Yh7nZ8MwDH7d5De,iv:FIXxJCn6JDYsHIoNn8f8Un3z9ZPVbxdjR48Ux88poRg=,tag:bMJ4i69HTspnhzsrsxkbrw==,type:str]
openrouter-api-key: ENC[AES256_GCM,data:HfZgZz4NyCLLM9woTZp2I6JGOlVcFblw2OMjx8k0TG5ZU2ycBCF6bKqp3wFibUxXcHy+nIfjI82fkLeSyIaGILRLYCJCc8BHKw==,iv:umUcn8MRaj7JXo6IFrGMXOu+jsFSCEikMxsQxfaFS/Q=,tag:l2s61C4EpJoKv8cc9nYGFA==,type:str] openrouter-api-key: ENC[AES256_GCM,data:HfZgZz4NyCLLM9woTZp2I6JGOlVcFblw2OMjx8k0TG5ZU2ycBCF6bKqp3wFibUxXcHy+nIfjI82fkLeSyIaGILRLYCJCc8BHKw==,iv:umUcn8MRaj7JXo6IFrGMXOu+jsFSCEikMxsQxfaFS/Q=,tag:l2s61C4EpJoKv8cc9nYGFA==,type:str]
opencode-go-api-key: ENC[AES256_GCM,data:BGERcZg5Jpnznc4cXeYFMhPk9kKBkd9GvIuQBV9TW3JE1utgrLLYK6mKNCQqrEStRFiO2jUUnBm3opUNL4SuEHFLpw==,iv:fgFAwx6z9yruK27PvAJX/Q2CS9gU+LJ5zMUK/f/rzpo=,tag:BPu3M+jppPB8sLoLmfuY/Q==,type:str] opencode-go-api-key: ENC[AES256_GCM,data:BGERcZg5Jpnznc4cXeYFMhPk9kKBkd9GvIuQBV9TW3JE1utgrLLYK6mKNCQqrEStRFiO2jUUnBm3opUNL4SuEHFLpw==,iv:fgFAwx6z9yruK27PvAJX/Q2CS9gU+LJ5zMUK/f/rzpo=,tag:BPu3M+jppPB8sLoLmfuY/Q==,type:str]
zai-coding-plan-api-key: ENC[AES256_GCM,data:u5RHaBq5WHit+GjcKYnr6vN7jkputBtt3G0lCNBciMgBnBzIcZd/JjJcNaKXfbal5w==,iv:x+mG1aoct7yfm4Hvu1mMqBq8MiF8UZbQ8SFjA99qTIw=,tag:9cEIO2tuhqE6df2M2N/R+g==,type:str]
netbird-key: ENC[AES256_GCM,data:qXAnRnLM2TlzpOvWG4exJv0+pUvpe0FpRN5xOWx3+KNt+yhq,iv:X+yl4o1RSYMCMWdVXo1hpzy+6IdKXUpsKPtYNSiHiCY=,tag:I8HbnD5iw6EJ1TdsNrhvfw==,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] 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+IFgyNTUxOSBQNGdHcDc4bTFkR0EyZlUr
eXovR1lyeTZJTDg5R281MFFuMHVwOXZXYzNvCkpIT1g3K05WUUswaEVjVVJWQkJq eXovR1lyeTZJTDg5R281MFFuMHVwOXZXYzNvCkpIT1g3K05WUUswaEVjVVJWQkJq
@@ -15,8 +15,8 @@ sops:
Z0JwWWR0STUybjVhSXdDR3NiKzV1eDQK22HmMuyqYaR/eGuALkAPB1Y5bN2KwIt3 Z0JwWWR0STUybjVhSXdDR3NiKzV1eDQK22HmMuyqYaR/eGuALkAPB1Y5bN2KwIt3
pamM8vbnjB//hXoyrv4vsoDk9WzLGFGjgiw2qsM2HQgzQqtrwF1/1A== pamM8vbnjB//hXoyrv4vsoDk9WzLGFGjgiw2qsM2HQgzQqtrwF1/1A==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4 - recipient: age1maxsx5tq2h3d92rfyl8ekcdan5gu5cpch4qs3c56cu7qag02xgvs3h0gqc
- enc: | enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA1N3ZBd1pHODFtZkZxaHNP YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA1N3ZBd1pHODFtZkZxaHNP
OXlXUzVFS0ZIam1IWVkxNldOdTEwY0s4aUNZCjVlcnF1aXJxUUlQSXhteXJ6OU1W OXlXUzVFS0ZIam1IWVkxNldOdTEwY0s4aUNZCjVlcnF1aXJxUUlQSXhteXJ6OU1W
@@ -24,8 +24,7 @@ sops:
M3JocWZJeXFxenhXOENBVWpvNkd3bm8KqhNLzCyEAI643jGWpZF/uTchHmBj8ozU M3JocWZJeXFxenhXOENBVWpvNkd3bm8KqhNLzCyEAI643jGWpZF/uTchHmBj8ozU
HtpOzKsshif66D0XOHeJQfQamJI4TyKsj3Sk3j9rstsLmN2lxTRGHg== HtpOzKsshif66D0XOHeJQfQamJI4TyKsj3Sk3j9rstsLmN2lxTRGHg==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1maxsx5tq2h3d92rfyl8ekcdan5gu5cpch4qs3c56cu7qag02xgvs3h0gqc lastmodified: "2026-05-10T00:35:50Z"
lastmodified: "2026-09-16T14:20:48Z" mac: ENC[AES256_GCM,data:u27zQ1PPnWy5Parbh/1DkVP3ICmHnLZJKaLbN3dZEVONgqOWi32LV3t0iNhtLWwVnzFPBusRWahQiqAkUdnQtrXF0OtjPCpLuIw86xB75QPGbet0GZlLNb8/xPshChZe4v520csdJMWiy3vYeKrk8LxMSViAGhmhYK2a5NbGhzI=,iv:/9vePmvCNqoP0kx24fP3HfCjS2FkjBmI5B+SycvKKW4=,tag:gE1/DnLolwhoyfMJYejGIQ==,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,8 +0,0 @@
{lib, ...}: {
flake.modules.homeManager.vega = {
# @TODO: Broken currently - By default it's enabled by neovim module
programs.vim.enable = lib.mkForce false;
home.stateVersion = "26.05";
};
}

View File

@@ -1,44 +1,50 @@
{config, ...}: { { config, ... }:
flake.modules.nixos.vps = {hostName, ...}: { {
imports = with config.flake.modules.nixos; [ flake.modules.nixos.vps =
boot {
networking hostName,
virtualisation ...
services }:
]; {
imports = with config.flake.modules.nixos; [
boot
networking
virtualisation
services
];
tnix = { tnix = {
boot = { boot = {
legacy.enable = true; legacy.enable = true;
impermanence = { impermanence = {
enable = true; enable = true;
home = { home = {
directories = [ directories = [
".local/share/nvim" ".local/share/nvim"
".local/share/zsh" ".local/share/zsh"
".local/share/zoxide" ".local/share/zoxide"
".local/state/lazygit" ".local/state/lazygit"
]; ];
};
}; };
}; };
networking.openssh.enable = true;
virtualisation = {
docker.enable = true;
};
}; };
networking.openssh.enable = true; # --- Networking ---
networking = {
virtualisation = { hostName = hostName;
docker.enable = true; networkmanager.enable = true;
firewall.enable = false;
}; };
};
# --- Networking --- system.stateVersion = "26.05";
networking = {
hostName = hostName;
networkmanager.enable = true;
firewall.enable = false;
}; };
system.stateVersion = "26.05";
};
} }

View File

@@ -0,0 +1,30 @@
{
inputs,
config,
...
}:
let
hostName = "vps";
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
system
;
};
modules = [
config.flake.modules.nixos.core
config.flake.modules.nixos.${hostName}
];
};
}

View File

@@ -1,23 +1,22 @@
{inputs, ...}: { { inputs, ... }:
flake.modules.nixos.vps = { {
config, flake.modules.nixos.vps =
lib, { config, lib, ... }:
... let
}: let hasOptinPersistence = config.tnix.boot.impermanence.enable;
hasOptinPersistence = config.tnix.boot.impermanence.enable; isLegacy = config.tnix.boot.legacy.enable;
isLegacy = config.tnix.boot.legacy.enable; in
in { {
imports = [ imports = [
inputs.disko.nixosModules.disko inputs.disko.nixosModules.disko
]; ];
disko.devices.disk.primary = { disko.devices.disk.primary = {
device = "/dev/sda"; device = "/dev/sda";
type = "disk"; type = "disk";
content = { content = {
type = "gpt"; type = "gpt";
partitions = partitions = {
{
ESP = { ESP = {
size = "1G"; size = "1G";
type = "EF00"; type = "EF00";
@@ -37,37 +36,36 @@
content = { content = {
type = "btrfs"; type = "btrfs";
# Base subvolumes that always exist # Base subvolumes that always exist
subvolumes = subvolumes = {
{ "/root" = {
"/root" = { mountOptions = [
mountOptions = [ "compress=zstd"
"compress=zstd" "noatime"
"noatime" "space_cache=v2"
"space_cache=v2" ];
]; mountpoint = "/";
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";
};
}; };
"/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";
};
};
}; };
}; };
} }
@@ -78,7 +76,7 @@
type = "EF02"; type = "EF02";
}; };
}; };
};
}; };
}; };
};
} }

View File

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

View File

@@ -1,3 +1,4 @@
{ ... }:
{ {
flake.modules.homeManager.vps = { flake.modules.homeManager.vps = {
home.stateVersion = "26.05"; home.stateVersion = "26.05";

View File

@@ -1,71 +1,70 @@
{inputs, ...}: { { inputs, ... }:
flake.modules.nixos.boot = { {
config, flake.modules.nixos.boot =
lib, {
userName, config,
... lib,
}: let userName,
cfg = config.tnix.boot; ...
in { }:
imports = [ let
inputs.impermanence.nixosModules.impermanence cfg = config.tnix.boot;
]; in
{
imports = [
inputs.impermanence.nixosModules.impermanence
];
options.tnix.boot.impermanence = { options.tnix.boot.impermanence = {
enable = lib.mkEnableOption "Enable impermanence"; enable = lib.mkEnableOption "Enable impermanence";
directories = lib.mkOption { directories = lib.mkOption {
type = lib.types.listOf lib.types.str; type = lib.types.listOf lib.types.str;
default = []; default = [ ];
};
files = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ ];
};
}; };
files = lib.mkOption { options.tnix.boot.impermanence.home = {
type = lib.types.listOf lib.types.str; directories = lib.mkOption {
default = []; type = lib.types.listOf lib.types.str;
}; default = [ ];
}; };
options.tnix.boot.impermanence.home = { files = lib.mkOption {
directories = lib.mkOption { type = lib.types.listOf lib.types.str;
type = lib.types.listOf lib.types.str; default = [ ];
default = []; };
}; };
files = lib.mkOption { config = lib.mkIf cfg.impermanence.enable {
type = lib.types.listOf lib.types.str; programs.fuse.userAllowOther = true;
default = []; fileSystems."/persist".neededForBoot = true;
}; environment.persistence."/persist" = {
}; hideMounts = true;
directories = [
config = lib.mkIf cfg.impermanence.enable {
programs.fuse.userAllowOther = true;
fileSystems."/persist".neededForBoot = true;
environment.persistence."/persist" = {
hideMounts = true;
directories =
[
"/var/log" "/var/log"
"/var/lib" "/var/lib"
"/etc/NetworkManager/system-connections" "/etc/NetworkManager/system-connections"
] ]
++ cfg.impermanence.directories; ++ cfg.impermanence.directories;
files = files = [
[
"/etc/machine-id"
"/etc/ssh/ssh_host_ed25519_key" "/etc/ssh/ssh_host_ed25519_key"
"/etc/ssh/ssh_host_ed25519_key.pub" "/etc/ssh/ssh_host_ed25519_key.pub"
"/etc/ssh/ssh_host_rsa_key" "/etc/ssh/ssh_host_rsa_key"
"/etc/ssh/ssh_host_rsa_key.pub" "/etc/ssh/ssh_host_rsa_key.pub"
"/etc/ly/save.txt"
] ]
++ cfg.impermanence.files; ++ cfg.impermanence.files;
}; };
home-manager.users.${userName} = { home-manager.users.${userName} = {
home.persistence."/persist" = { home.persistence."/persist" = {
directories = directories = [
[
"Downloads" "Downloads"
"Music" "Music"
"Wallpapers" "Wallpapers"
@@ -77,46 +76,46 @@
] ]
++ cfg.impermanence.home.directories; ++ cfg.impermanence.home.directories;
files = cfg.impermanence.home.files; files = cfg.impermanence.home.files;
};
}; };
};
boot.initrd.systemd = { boot.initrd.systemd = {
enable = true; enable = true;
services.wipe-my-fs = { services.wipe-my-fs = {
wantedBy = ["initrd.target"]; wantedBy = [ "initrd.target" ];
after = ["initrd-root-device.target"]; after = [ "initrd-root-device.target" ];
before = ["sysroot.mount"]; before = [ "sysroot.mount" ];
unitConfig.DefaultDependencies = "no"; unitConfig.DefaultDependencies = "no";
serviceConfig.Type = "oneshot"; serviceConfig.Type = "oneshot";
script = '' script = ''
mkdir /btrfs_tmp mkdir /btrfs_tmp
mount /dev/disk/by-partlabel/disk-primary-root /btrfs_tmp mount /dev/disk/by-partlabel/disk-primary-root /btrfs_tmp
if [[ -e /btrfs_tmp/root ]]; then if [[ -e /btrfs_tmp/root ]]; then
mkdir -p /btrfs_tmp/old_roots mkdir -p /btrfs_tmp/old_roots
timestamp=$(date --date="@$(stat -c %Y /btrfs_tmp/root)" "+%Y-%m-%-d_%H:%M:%S") timestamp=$(date --date="@$(stat -c %Y /btrfs_tmp/root)" "+%Y-%m-%-d_%H:%M:%S")
mv /btrfs_tmp/root "/btrfs_tmp/old_roots/$timestamp" mv /btrfs_tmp/root "/btrfs_tmp/old_roots/$timestamp"
fi fi
delete_subvolume_recursively() { delete_subvolume_recursively() {
IFS=$'\n' IFS=$'\n'
for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do
delete_subvolume_recursively "/btrfs_tmp/$i" delete_subvolume_recursively "/btrfs_tmp/$i"
done done
btrfs subvolume delete "$1" btrfs subvolume delete "$1"
} }
for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +30); do for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +30); do
delete_subvolume_recursively "$i" delete_subvolume_recursively "$i"
done done
btrfs subvolume create /btrfs_tmp/root btrfs subvolume create /btrfs_tmp/root
umount /btrfs_tmp umount /btrfs_tmp
''; '';
};
}; };
}; };
}; };
};
} }

View File

@@ -1,32 +1,29 @@
{ {
flake.modules.nixos.boot = { flake.modules.nixos.boot =
config, { config, lib, ... }:
lib, let
... cfg = config.tnix.boot;
}: let in
cfg = config.tnix.boot; {
in { options.tnix.boot.legacy = {
options.tnix.boot.legacy = { enable = lib.mkEnableOption "legacy boot (GRUB) instead of systemd-boot";
enable = lib.mkEnableOption "legacy boot (GRUB) instead of systemd-boot"; };
config = lib.mkMerge [
{
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;
})
];
}; };
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,10 +1,12 @@
{ {
flake.modules.nixos.boot = {pkgs, ...}: { flake.modules.nixos.boot =
boot = { { pkgs, ... }:
consoleLogLevel = 0; {
initrd.verbose = false; boot = {
kernelPackages = pkgs.linuxPackages_zen; consoleLogLevel = 0;
supportedFilesystems = ["ntfs"]; initrd.verbose = false;
kernelPackages = pkgs.linuxPackages_zen;
supportedFilesystems = [ "ntfs" ];
};
}; };
};
} }

View File

@@ -1,39 +1,43 @@
{inputs, ...}: { { inputs, ... }:
flake.modules.nixos.boot = { {
config, flake.modules.nixos.boot =
lib, {
pkgs, config,
... lib,
}: let pkgs,
cfg = config.tnix.boot; ...
in { }:
imports = [inputs.lanzaboote.nixosModules.lanzaboote]; let
cfg = config.tnix.boot;
in
{
imports = [ inputs.lanzaboote.nixosModules.lanzaboote ];
options.tnix.boot.secure-boot = { options.tnix.boot.secure-boot = {
enable = lib.mkEnableOption "Enable secure-boot"; enable = lib.mkEnableOption "Enable secure-boot";
}; };
config = lib.mkIf cfg.secure-boot.enable { config = lib.mkIf cfg.secure-boot.enable {
assertions = [ assertions = [
{ {
assertion = !cfg.legacy.enable; assertion = !cfg.legacy.enable;
message = "secure-boot and legacy boot (GRUB) cannot be enabled at the same time"; message = "secure-boot and legacy boot (GRUB) cannot be enabled at the same time";
} }
]; ];
environment.systemPackages = [pkgs.sbctl]; environment.systemPackages = [ pkgs.sbctl ];
# Lanzaboote replaces systemd-boot, so force it off # Lanzaboote replaces systemd-boot, so force it off
boot.loader.systemd-boot.enable = lib.mkForce false; boot.loader.systemd-boot.enable = lib.mkForce false;
boot.lanzaboote = { boot.lanzaboote = {
enable = true; enable = true;
autoGenerateKeys.enable = true; autoGenerateKeys.enable = true;
autoEnrollKeys.enable = true; autoEnrollKeys.enable = true;
configurationLimit = 10; configurationLimit = 10;
pkiBundle = "/var/lib/sbctl"; pkiBundle = "/var/lib/sbctl";
};
}; };
}; };
};
} }

View File

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

View File

@@ -1,38 +1,37 @@
{ inputs, config, ... }:
{ {
inputs, flake.modules.nixos.core =
config, {
... hostName,
}: { userName,
flake.modules.nixos.core = { userEmail,
hostName, ...
userName, }:
userEmail, {
... imports = [
}: { inputs.home-manager.nixosModules.home-manager
imports = [ ];
inputs.home-manager.nixosModules.home-manager
];
home-manager = { home-manager = {
backupFileExtension = "bak"; backupFileExtension = "bak";
useGlobalPkgs = true; useGlobalPkgs = true;
useUserPackages = true; useUserPackages = true;
extraSpecialArgs = { extraSpecialArgs = {
inherit inherit
inputs inputs
hostName hostName
userName userName
userEmail userEmail
; ;
}; };
users.${userName} = { users.${userName} = {
imports = [ imports = [
config.flake.modules.homeManager.core config.flake.modules.homeManager.core
config.flake.modules.homeManager.shell config.flake.modules.homeManager.shell
config.flake.modules.homeManager.${hostName} config.flake.modules.homeManager.${hostName}
]; ];
};
}; };
}; };
};
} }

View File

@@ -1,18 +1,20 @@
{ {
flake.modules.nixos.core = { flake.modules.nixos.core =
config, {
userName, config,
... userName,
}: { ...
programs.nh = { }:
enable = true; {
programs.nh = {
enable = true;
clean = { clean = {
enable = !config.nix.gc.automatic; enable = !config.nix.gc.automatic;
dates = "weekly"; dates = "weekly";
};
flake = "/home/${userName}/Projects/nixos-config";
}; };
flake = "/home/${userName}/Projects/nixos-config";
}; };
};
} }

View File

@@ -1,5 +1,6 @@
{inputs, ...}: { { inputs, ... }:
flake.modules.nixos.core = {pkgs, ...}: { {
flake.modules.nixos.core = { pkgs, ... }: {
imports = [ imports = [
inputs.nix-index-database.nixosModules.default inputs.nix-index-database.nixosModules.default
]; ];

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,86 +1,83 @@
{ {
flake.modules.nixos.core = {userName, ...}: { flake.modules.nixos.core =
nix = { { userName, ... }:
channel.enable = false; {
nix = {
channel.enable = false;
gc = { gc = {
automatic = true; automatic = true;
options = "--delete-older-than 7d"; options = "--delete-older-than 7d";
dates = "weekly"; dates = "weekly";
persistent = true; persistent = true;
}; };
optimise.automatic = true; optimise.automatic = true;
settings = { settings = {
extra-platforms = [ experimental-features = [
"aarch64-linux" "nix-command"
"arm-linux" "flakes"
]; ];
experimental-features = [ max-jobs = "auto";
"nix-command"
"flakes"
];
max-jobs = "auto"; # Make legacy nix commands use the XDG base directories instead of creating directories in $HOME.
use-xdg-base-directories = true;
# Make legacy nix commands use the XDG base directories instead of creating directories in $HOME. # The maximum number of parallel TCP connections used to fetch files from binary caches and by other downloads.
use-xdg-base-directories = true; # It defaults to 25. 0 means no limit.
http-connections = 128;
# The maximum number of parallel TCP connections used to fetch files from binary caches and by other downloads. # This option defines the maximum number of substitution jobs that Nix will try to run in
# It defaults to 25. 0 means no limit. # parallel. The default is 16. The minimum value one can choose is 1 and lower values will be
http-connections = 128; # interpreted as 1.
max-substitution-jobs = 128;
# This option defines the maximum number of substitution jobs that Nix will try to run in # The number of lines of the tail of the log to show if a build fails.
# parallel. The default is 16. The minimum value one can choose is 1 and lower values will be log-lines = 25;
# interpreted as 1.
max-substitution-jobs = 128;
# The number of lines of the tail of the log to show if a build fails. # When free disk space in /nix/store drops below min-free during a build, Nix performs a
log-lines = 25; # garbage-collection until max-free bytes are available or there is no more garbage.
# A value of 0 (the default) disables this feature.
min-free = 128000000; # 128 MB
max-free = 1000000000; # 1 GB
# When free disk space in /nix/store drops below min-free during a build, Nix performs a # Prevent garbage collection from altering nix-shells managed by nix-direnv
# garbage-collection until max-free bytes are available or there is no more garbage. # https://github.com/nix-community/nix-direnv#installation
# A value of 0 (the default) disables this feature. keep-outputs = true;
min-free = 128000000; # 128 MB keep-derivations = true;
max-free = 1000000000; # 1 GB
# Prevent garbage collection from altering nix-shells managed by nix-direnv # If set to true, Nix will keep building derivations even if some fail. The default is false.
# https://github.com/nix-community/nix-direnv#installation keep-going = true;
keep-outputs = true;
keep-derivations = true;
# If set to true, Nix will keep building derivations even if some fail. The default is false. # Automatically detect files in the store that have identical contents, and replaces
keep-going = true; # them with hard links to a single copy. This saves disk space.
auto-optimise-store = true;
# Automatically detect files in the store that have identical contents, and replaces # Whether to warn about dirty Git/Mercurial trees.
# them with hard links to a single copy. This saves disk space. warn-dirty = false;
auto-optimise-store = true;
# Whether to warn about dirty Git/Mercurial trees. # The timeout (in seconds) for establishing connections in the binary cache substituter.
warn-dirty = false; # It corresponds to curls connect-timeout option. A value of 0 means no limit.
connect-timeout = 5;
# The timeout (in seconds) for establishing connections in the binary cache substituter. # Allow the use of cachix
# It corresponds to curls connect-timeout option. A value of 0 means no limit. trusted-users = [
connect-timeout = 5; "root"
"${userName}"
];
allowed-users = [
"root"
"${userName}"
];
# Allow the use of cachix builders-use-substitutes = true;
trusted-users = [
"root"
"${userName}"
];
allowed-users = [
"root"
"${userName}"
];
builders-use-substitutes = true; # If set to true, Nix will fall back to building from source if a binary substitute
# fails. This is equivalent to the fallback flag. The default is false.
# If set to true, Nix will fall back to building from source if a binary substitute fallback = true;
# fails. This is equivalent to the fallback flag. The default is false. };
fallback = true;
}; };
}; };
};
} }

View File

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

View File

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

View File

@@ -1,21 +1,25 @@
{inputs, ...}: { { inputs, ... }:
flake.modules.nixos.core = { {
config, flake.modules.nixos.core =
pkgs, {
... config,
}: let pkgs,
isEd25519 = k: k.type == "ed25519"; ...
getKeyPath = k: k.path; }:
keys = builtins.filter isEd25519 config.services.openssh.hostKeys; let
in { isEd25519 = k: k.type == "ed25519";
imports = [inputs.sops-nix.nixosModules.sops]; getKeyPath = k: k.path;
keys = builtins.filter isEd25519 config.services.openssh.hostKeys;
in
{
imports = [ inputs.sops-nix.nixosModules.sops ];
sops.age = { sops.age = {
sshKeyPaths = map getKeyPath keys; sshKeyPaths = map getKeyPath keys;
keyFile = "/var/lib/sops-nix/key.txt"; keyFile = "/var/lib/sops-nix/key.txt";
generateKey = true; generateKey = true;
};
environment.systemPackages = with pkgs; [ sops ];
}; };
environment.systemPackages = with pkgs; [sops];
};
} }

View File

@@ -33,10 +33,6 @@
"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="
]; ];
extra-substituters = ["https://cache.numtide.com"];
extra-trusted-public-keys = [
"niks3.numtide.com-1:DTx8wZduET09hRmMtKdQDxNNthLQETkc/yaX7M4qK0g="
];
}; };
}; };
} }

View File

@@ -1,48 +1,51 @@
{ {
flake.modules.nixos.core = { flake.modules.nixos.core =
pkgs, {
lib, pkgs,
config, lib,
userName, config,
userEmail, userName,
... userEmail,
}: let ...
hasPasswordSecret = lib.hasAttrByPath ["sops" "secrets" "tux-password"] config; }:
in { let
programs.zsh.enable = true; hasPasswordSecret = lib.hasAttrByPath [ "sops" "secrets" "tux-password" ] config;
in
{
programs.zsh.enable = true;
time.timeZone = "Asia/Kolkata"; time.timeZone = "Asia/Kolkata";
i18n = { i18n = {
defaultLocale = "en_US.UTF-8"; defaultLocale = "en_US.UTF-8";
extraLocaleSettings = lib.genAttrs [ extraLocaleSettings = lib.genAttrs [
"LC_ADDRESS" "LC_ADDRESS"
"LC_IDENTIFICATION" "LC_IDENTIFICATION"
"LC_MEASUREMENT" "LC_MEASUREMENT"
"LC_MONETARY" "LC_MONETARY"
"LC_NAME" "LC_NAME"
"LC_NUMERIC" "LC_NUMERIC"
"LC_PAPER" "LC_PAPER"
"LC_TELEPHONE" "LC_TELEPHONE"
"LC_TIME" "LC_TIME"
] (_: "en_IN"); ] (_: "en_IN");
}; };
users = { users = {
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 = lib.mkIf hasPasswordSecret config.sops.secrets.tux-password.path;
initialPassword = lib.mkIf (!hasPasswordSecret) userName; initialPassword = lib.mkIf (!hasPasswordSecret) userName;
isNormalUser = true; isNormalUser = true;
extraGroups = [ extraGroups = [
"networkmanager" "networkmanager"
"wheel" "wheel"
"storage" "storage"
]; ];
openssh.authorizedKeys.keys = [ openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL+OzPUe2ECPC929DqpkM39tl/vdNAXfsRnmrGfR+X3D ${userEmail}" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL+OzPUe2ECPC929DqpkM39tl/vdNAXfsRnmrGfR+X3D ${userEmail}"
]; ];
};
}; };
}; };
};
} }

View File

@@ -1,9 +1,11 @@
{ {
flake.modules.nixos.desktop = {pkgs, ...}: { flake.modules.nixos.desktop =
fonts.packages = with pkgs.nerd-fonts; [ { pkgs, ... }:
fira-code {
jetbrains-mono fonts.packages = with pkgs.nerd-fonts; [
bigblue-terminal fira-code
]; jetbrains-mono
}; bigblue-terminal
];
};
} }

View File

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

View File

@@ -1,9 +1,11 @@
{ {
flake.modules.nixos.desktop = {pkgs, ...}: { flake.modules.nixos.desktop =
programs.hyprland = { { pkgs, ... }:
enable = true; {
package = pkgs.hyprland-git.hyprland; programs.hyprland = {
portalPackage = pkgs.hyprland-git.xdg-desktop-portal-hyprland; enable = true;
package = pkgs.hyprland-git.hyprland;
portalPackage = pkgs.hyprland-git.xdg-desktop-portal-hyprland;
};
}; };
};
} }

View File

@@ -1,30 +1,36 @@
{inputs, ...}: { {
flake.modules.nixos.desktop = { inputs,
pkgs, ...
lib, }:
... {
}: { flake.modules.nixos.desktop =
imports = [ {
inputs.mango.nixosModules.mango pkgs,
]; lib,
...
programs.mango.enable = true; }:
{
xdg.portal = { imports = [
enable = lib.mkDefault true; inputs.mango.nixosModules.mango
extraPortals = with pkgs; [
hyprland-git.xdg-desktop-portal-hyprland
xdg-desktop-portal-wlr
xdg-desktop-portal-gtk
]; ];
config.mango = {
default = lib.mkForce [ programs.mango.enable = true;
"hyprland"
"gtk" xdg.portal = {
enable = lib.mkDefault true;
extraPortals = with pkgs; [
hyprland-git.xdg-desktop-portal-hyprland
xdg-desktop-portal-wlr
xdg-desktop-portal-gtk
]; ];
"org.freedesktop.impl.portal.ScreenCast" = lib.mkForce ["hyprland"]; config.mango = {
"org.freedesktop.impl.portal.ScreenShot" = lib.mkForce ["hyprland"]; default = lib.mkForce [
"hyprland"
"gtk"
];
"org.freedesktop.impl.portal.ScreenCast" = lib.mkForce [ "hyprland" ];
"org.freedesktop.impl.portal.ScreenShot" = lib.mkForce [ "hyprland" ];
};
}; };
}; };
};
} }

View File

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

View File

@@ -1,14 +1,15 @@
{ {
flake.modules.nixos.desktop = {pkgs, ...}: { flake.modules.nixos.desktop =
programs.obs-studio = { { pkgs, ... }:
enable = true; {
enableVirtualCamera = true; programs.obs-studio = {
plugins = with pkgs.obs-studio-plugins; [ enable = true;
obs-vaapi enableVirtualCamera = true;
wlrobs plugins = with pkgs.obs-studio-plugins; [
obs-source-record obs-vaapi
obs-advanced-masks wlrobs
]; obs-source-record
];
};
}; };
};
} }

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
{ {
flake.modules.nixos.hardware = {pkgs, ...}: { flake.modules.nixos.hardware = {
security.rtkit.enable = true; security.rtkit.enable = true;
services.pipewire = { services.pipewire = {
@@ -9,10 +9,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,5 @@
{ {
flake.modules.nixos.hardware = {pkgs, ...}: { flake.modules.nixos.hardware = { pkgs, ... }: {
hardware.bluetooth = { hardware.bluetooth = {
enable = true; enable = true;
}; };

View File

@@ -1,13 +1,16 @@
{ {
flake.modules.nixos.networking = { flake.modules.nixos.networking =
config, {
lib, config,
hostName, lib,
... hostName,
}: ...
with lib; let }:
with lib;
let
cfg = config.tnix.networking.netbird-client; cfg = config.tnix.networking.netbird-client;
in { in
{
options.tnix.networking.netbird-client = { options.tnix.networking.netbird-client = {
enable = mkEnableOption "Enable netbird client"; enable = mkEnableOption "Enable netbird client";
}; };
@@ -15,7 +18,7 @@
config = mkIf cfg.enable { config = mkIf cfg.enable {
services.netbird.clients = { services.netbird.clients = {
${hostName} = { ${hostName} = {
port = 61820; port = 51820;
login = { login = {
enable = true; enable = true;
setupKeyFile = config.sops.secrets.netbird-key.path; setupKeyFile = config.sops.secrets.netbird-key.path;

View File

@@ -1,12 +1,15 @@
{ {
flake.modules.nixos.networking = { flake.modules.nixos.networking =
config, {
lib, config,
... lib,
}: ...
with lib; let }:
with lib;
let
cfg = config.tnix.networking.newt; cfg = config.tnix.networking.newt;
in { in
{
options.tnix.networking.newt = { options.tnix.networking.newt = {
enable = mkEnableOption "Newt"; enable = mkEnableOption "Newt";

View File

@@ -1,22 +1,25 @@
{ {
flake.modules.nixos.networking = { flake.modules.nixos.networking =
config, {
lib, config,
... lib,
}: ...
with lib; let }:
with lib;
let
cfg = config.tnix.networking.openssh; cfg = config.tnix.networking.openssh;
# Sops needs acess to the keys before the persist dirs are even mounted; so # Sops needs acess to the keys before the persist dirs are even mounted; so
# just persisting the keys won't work, we must point at /persist # just persisting the keys won't work, we must point at /persist
hasOptinPersistence = config.tnix.boot.impermanence.enable; hasOptinPersistence = config.tnix.boot.impermanence.enable;
in { in
{
options.tnix.networking.openssh = { options.tnix.networking.openssh = {
enable = mkEnableOption "Enable OpenSSH server"; enable = mkEnableOption "Enable OpenSSH server";
ports = mkOption { ports = mkOption {
type = types.listOf types.port; type = types.listOf types.port;
default = [22]; default = [ 22 ];
description = '' description = ''
Specifies on which ports the SSH daemon listens. Specifies on which ports the SSH daemon listens.
''; '';

View File

@@ -1,23 +1,20 @@
{ {
flake.modules.nixos.services = { flake.modules.nixos.services =
config, {
lib, config,
... lib,
}: ...
with lib; let }:
with lib;
let
cfg = config.tnix.services.aiostreams; cfg = config.tnix.services.aiostreams;
port = toString cfg.port; port = toString cfg.port;
acmeHost = config.tnix.services.nginx.domain; acmeHost = config.tnix.services.nginx.domain;
in { in
{
options.tnix.services.aiostreams = { options.tnix.services.aiostreams = {
enable = mkEnableOption "AIOStreams"; enable = mkEnableOption "AIOStreams";
host = mkOption {
type = types.str;
default = "127.0.0.1";
description = "Host on which AIOStreams listens";
};
port = mkOption { port = mkOption {
type = types.port; type = types.port;
default = 3000; default = 3000;
@@ -27,19 +24,7 @@
domain = mkOption { domain = mkOption {
type = types.str; type = types.str;
default = ""; default = "";
description = "Domain on which AIOStreams is available"; description = "Domain on which nginx serves AIOStreams (disabled when empty)";
};
configureNginx = mkOption {
type = types.bool;
default = false;
description = "Whether to configure Nginx as a reverse proxy for AIOStreams";
};
configurePangolin = mkOption {
type = types.bool;
default = false;
description = "Whether to configure Pangolin as a reverse proxy for AIOStreams";
}; };
image = mkOption { image = mkOption {
@@ -62,17 +47,10 @@
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
assertions = [
{
assertion = cfg.domain != "";
message = "tnix.services.aiostreams.domain must be set when tnix.services.aiostreams.enable is true.";
}
];
virtualisation.oci-containers.containers.aiostreams = { virtualisation.oci-containers.containers.aiostreams = {
image = cfg.image; image = cfg.image;
ports = [ ports = [
"${cfg.host}:${port}:3000" "127.0.0.1:${port}:3000"
]; ];
environment = { environment = {
ADDON_ID = cfg.domain; ADDON_ID = cfg.domain;
@@ -84,39 +62,11 @@
]; ];
}; };
services = { services.nginx.virtualHosts.${cfg.domain} = mkIf (cfg.domain != "") {
nginx.virtualHosts.${cfg.domain} = mkIf cfg.configureNginx { forceSSL = acmeHost != "";
forceSSL = acmeHost != ""; useACMEHost = mkIf (acmeHost != "") acmeHost;
useACMEHost = mkIf (acmeHost != "") acmeHost; locations."/" = {
locations."/" = { proxyPass = "http://127.0.0.1:${port}";
proxyPass = "http://${cfg.host}:${port}";
proxyWebsockets = true;
};
};
newt.blueprint.proxy-resources = mkIf cfg.configurePangolin {
aiostreams = {
auth = {
sso-enabled = false;
};
full-domain = cfg.domain;
name = "aiostreams";
protocol = "http";
targets = [
{
hostname = "localhost";
method = "http";
port = cfg.port;
healthcheck = {
hostname = "localhost";
port = cfg.port;
scheme = "http";
method = "GET";
path = "/";
};
}
];
};
}; };
}; };
}; };

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