Compare commits

..

1 Commits

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

View File

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

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%">

1776
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,23 +24,8 @@
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
tshell = { tpanel = {
url = "github:tuxdotrs/tshell"; url = "github:tuxdotrs/tpanel";
inputs.nixpkgs.follows = "nixpkgs";
};
trok = {
url = "github:tuxdotrs/trok";
inputs.nixpkgs.follows = "nixpkgs";
};
tfolio = {
url = "git+ssh://git@github.com/tuxdotrs/tfolio.git";
inputs.nixpkgs.follows = "nixpkgs";
};
cyber-tux = {
url = "git+ssh://git@github.com/tuxdotrs/cyber-tux.git";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
@@ -59,22 +44,6 @@
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
nix-index-database = {
url = "github:nix-community/nix-index-database";
inputs.nixpkgs.follows = "nixpkgs";
};
cardwire = {
url = "github:opengamingcollective/cardwire";
inputs.nixpkgs.follows = "nixpkgs";
};
nix-on-droid = {
url = "github:nix-community/nix-on-droid/master";
inputs.nixpkgs.follows = "nixpkgs";
inputs.home-manager.follows = "home-manager";
};
import-tree.url = "github:vic/import-tree"; import-tree.url = "github:vic/import-tree";
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-25.11-small"; nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-25.11-small";
@@ -88,12 +57,5 @@
awww.url = "git+https://codeberg.org/LGFae/awww"; awww.url = "git+https://codeberg.org/LGFae/awww";
nixcord.url = "github:kaylorben/nixcord"; nixcord.url = "github:kaylorben/nixcord";
nur.url = "github:nix-community/nur"; nur.url = "github:nix-community/nur";
lanzaboote.url = "github:nix-community/lanzaboote/v1.1.0";
copyparty.url = "github:9001/copyparty";
hermes-agent.url = "github:NousResearch/hermes-agent";
voxtype.url = "github:peteonrails/voxtype/v0.7.5";
opencode.url = "github:anomalyco/opencode";
serpantinum.url = "github:ilyamiro/serpantinum";
llm-agents.url = "github:numtide/llm-agents.nix";
}; };
} }

View File

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

View File

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

View File

@@ -1,106 +0,0 @@
{
flake.modules.nixOnDroid.networking = {
config,
lib,
pkgs,
...
}: let
# utility functions
concatLines = list: builtins.concatStringsSep "\n" list;
prefixLines = mapper: list: concatLines (map mapper list);
# could be put in the config
configPath = "ssh/sshd_config";
keysFolder = "/etc/ssh";
authorizedKeysFolder = "/etc/ssh/authorized_keys.d";
supportedKeysTypes = [
"rsa"
"ed25519"
];
sshd-start-bin = "sshd-start";
# real config
cfg = config.tnix.networking.openssh;
pathOfKeyOf = type: "${keysFolder}/ssh_host_${type}_key";
generateKeyOf = type: ''
${lib.getExe' pkgs.openssh "ssh-keygen"} \
-t "${type}" \
-f "${pathOfKeyOf type}" \
-N ""
'';
generateKeyWhenNeededOf = type: ''
if [ ! -f ${pathOfKeyOf type} ]; then
mkdir --parents ${keysFolder}
${generateKeyOf type}
fi
'';
sshd-start = pkgs.writeScriptBin sshd-start-bin ''
#!${pkgs.runtimeShell}
${prefixLines generateKeyWhenNeededOf supportedKeysTypes}
mkdir --parents "${authorizedKeysFolder}"
echo "${lib.concatStringsSep "\n" cfg.authorizedKeys}" > ${authorizedKeysFolder}/${config.user.userName}
echo "Starting sshd in non-daemonized way on port ${lib.concatMapStrings toString cfg.ports}"
${lib.getExe' pkgs.openssh "sshd"} \
-f "/etc/${configPath}" \
-D # don't detach into a daemon process
'';
in {
options.tnix.networking.openssh = {
enable = lib.mkEnableOption ''
Whether to enable the OpenSSH secure shell daemon, which
allows secure remote logins.
'';
ports = lib.mkOption {
type = lib.types.listOf lib.types.port;
default = [22];
description = ''
Specifies on which ports the SSH daemon listens.
'';
};
authorizedKeys = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [];
description = ''
Specify a list of public keys to be added to the authorized_keys file.
'';
};
};
config = lib.mkIf cfg.enable {
environment.etc = {
"${configPath}".text = ''
${prefixLines (port: "Port ${toString port}") cfg.ports}
AuthorizedKeysFile ${authorizedKeysFolder}/%u
LogLevel VERBOSE
'';
};
environment.packages = [
sshd-start
pkgs.openssh
];
build.activationAfter.sshd = ''
SERVER_PID=$(${lib.getExe' pkgs.procps "ps"} -a | ${lib.getExe' pkgs.toybox "grep"} sshd || true)
if [ -z "$SERVER_PID" ]; then
$DRY_RUN_CMD ${lib.getExe sshd-start}
fi
'';
};
};
}

View File

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

View File

@@ -1,118 +0,0 @@
{
self,
inputs,
config,
...
}: let
mkNixOSHost = hostName: {
userName ? "tux",
userEmail ? "t@tux.rs",
system ? "x86_64-linux",
unstable ? true,
}: let
nixpkgs =
if unstable
then inputs.nixpkgs
else inputs.nixpkgs-stable;
in
nixpkgs.lib.nixosSystem {
inherit system;
specialArgs = {
inherit
hostName
userName
userEmail
system
;
};
modules = [
config.flake.modules.nixos.core
config.flake.modules.nixos.${hostName}
];
};
mkDroidHost = hostName: {
userName ? "nix-on-droid",
userEmail ? "t@tux.rs",
system ? "aarch64-linux",
unstable ? true,
}: let
nixpkgs =
if unstable
then inputs.nixpkgs
else inputs.nixpkgs-stable;
in
inputs.nix-on-droid.lib.nixOnDroidConfiguration {
pkgs = import nixpkgs {
inherit system;
config = {
allowUnfree = true;
joypixels.acceptLicense = true;
};
overlays = builtins.attrValues inputs.self.overlays;
};
extraSpecialArgs = {
inherit
hostName
userName
userEmail
;
};
modules = [
config.flake.modules.nixOnDroid.core
config.flake.modules.nixOnDroid.${hostName}
];
};
mkNixOSNode = hostName: {system ? "x86_64-linux"}: {
hostname = hostName;
profiles.system = {
user = "root";
path = inputs.deploy-rs.lib.${system}.activate.nixos self.nixosConfigurations.${hostName};
};
};
activateNixOnDroid = system: configuration:
inputs.deploy-rs.lib.${system}.activate.custom configuration.activationPackage
"${configuration.activationPackage}/activate";
mkDroidNode = hostName: {system ? "aarch64-linux"}: {
hostname = hostName;
profiles.system = {
sshUser = "nix-on-droid";
user = "nix-on-droid";
magicRollback = true;
sshOpts = [
"-p"
"8033"
];
path = activateNixOnDroid system self.nixOnDroidConfigurations.${hostName};
};
};
in {
flake = {
nixosConfigurations = builtins.mapAttrs mkNixOSHost {
sirius = {};
canopus = {};
arcturus = {};
alpha = {};
vps = {};
};
nixOnDroidConfigurations = builtins.mapAttrs mkDroidHost {
vega = {};
};
deploy.nodes =
builtins.mapAttrs (hostName: _: mkNixOSNode hostName {}) self.nixosConfigurations
// builtins.mapAttrs (hostName: _: mkDroidNode hostName {}) self.nixOnDroidConfigurations;
};
perSystem = {
checks =
builtins.mapAttrs (
_: hostConfig: hostConfig.config.system.build.toplevel
)
self.nixosConfigurations;
};
}

View File

@@ -1,32 +1,17 @@
{inputs, ...}: { {
inputs,
...
}:
{
flake.overlays = { flake.overlays = {
modifications = final: prev: { modifications = final: prev: {
omasnap = prev.callPackage ../../packages/omasnap.nix {};
tnvim = inputs.tnvim.packages.${prev.stdenv.hostPlatform.system}.default; tnvim = inputs.tnvim.packages.${prev.stdenv.hostPlatform.system}.default;
tshell = inputs.tshell.packages.${prev.stdenv.hostPlatform.system}.default; tpanel = inputs.tpanel.packages.${prev.stdenv.hostPlatform.system}.default;
trok = inputs.trok.packages.${prev.stdenv.hostPlatform.system}.default; ags = inputs.tpanel.packages.${prev.stdenv.hostPlatform.system}.ags.default;
tfolio = inputs.tfolio.packages.${prev.stdenv.hostPlatform.system}.default;
cyber-tux = inputs.cyber-tux.packages.${prev.stdenv.hostPlatform.system}.default;
wezterm-git = inputs.wezterm-flake.packages.${prev.stdenv.hostPlatform.system}.default; wezterm-git = inputs.wezterm-flake.packages.${prev.stdenv.hostPlatform.system}.default;
hyprland-git = inputs.hyprland.packages.${prev.stdenv.hostPlatform.system}; hyprland-git = inputs.hyprland.packages.${prev.stdenv.hostPlatform.system};
awww = inputs.awww.packages.${prev.stdenv.hostPlatform.system}.awww; awww = inputs.awww.packages.${prev.stdenv.hostPlatform.system}.awww;
vicinae-extensions = inputs.vicinae-extensions.packages.${prev.stdenv.hostPlatform.system}; vicinae-extensions = inputs.vicinae-extensions.packages.${prev.stdenv.hostPlatform.system};
voxtype = inputs.voxtype.packages.${prev.stdenv.hostPlatform.system};
opencode-git = inputs.opencode.packages.${prev.stdenv.hostPlatform.system}.default;
nix-index-small =
inputs.nix-index-database.packages.${prev.stdenv.hostPlatform.system}.nix-index-with-small-db;
davinci-resolve = prev.davinci-resolve.override {
runCommandLocal = name: env: cmd:
if prev.lib.hasSuffix "-src.zip" name
then
prev.runCommandLocal name (env
// {
outputHash = "sha256-+3SB32EHpH9/0hM3h8CrO6f7V4ZAmxUFh3P8m6QDeO0=";
})
cmd
else prev.runCommandLocal name env cmd;
};
}; };
stable-packages = final: _prev: { stable-packages = final: _prev: {
@@ -37,18 +22,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,15 +1,23 @@
{inputs, ...}: { { inputs, ... }:
{
imports = [ imports = [
inputs.treefmt-nix.flakeModule inputs.treefmt-nix.flakeModule
]; ];
perSystem = { perSystem =
treefmt.config = { {
projectRootFile = "flake.nix"; config,
flakeCheck = true; pkgs,
programs = { system,
alejandra.enable = true; ...
}:
{
treefmt.config = {
projectRootFile = "flake.nix";
flakeCheck = true;
programs = {
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

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

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,5 +0,0 @@
{
flake.modules.homeManager.desktop = {
services.easyeffects.enable = 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

@@ -1,49 +0,0 @@
{
flake.modules.homeManager.desktop = {
programs.ghostty = {
enable = true;
enableZshIntegration = true;
systemd.enable = true;
settings = {
confirm-close-surface = false;
gtk-titlebar = false;
window-padding-x = 10;
window-padding-y = 10;
font-size = 12;
font-family = "JetBrainsMono Nerd Font";
theme = "poimandres";
custom-shader = "shaders/cursor_warp.glsl";
custom-shader-animation = "always";
};
themes = {
poimandres = {
background = "#0f0f0f";
foreground = "#a6accd";
cursor-color = "#f2eacf";
selection-background = "#1a1a1a";
selection-foreground = "#f1f1f1";
palette = [
"0=#252b37"
"1=#d0679d"
"2=#5de4c7"
"3=#fffac2"
"4=#89ddff"
"5=#fae4fc"
"6=#add7ff"
"7=#ffffff"
"8=#a6accd"
"9=#d0679d"
"10=#5de4c7"
"11=#fffac2"
"12=#add7ff"
"13=#89ddff"
"14=#fcc5e9"
"15=#ffffff"
];
};
};
};
};
}

View File

@@ -1,43 +1,19 @@
{ {
flake.modules.homeManager.desktop = { flake.modules.homeManager.desktop =
config, { pkgs, ... }:
pkgs, {
...
}: { home.packages = with pkgs; [
# TODO: Hyprland 0.55 switched to Lua-based configuration. ags
# HM module is updated but I'm too lazy at this point so we symlink our config instead. awww
wayland.windowManager.hyprland = { ];
enable = true;
package = null; wayland.windowManager.hyprland = {
portalPackage = null; enable = true;
xwayland.enable = true; package = null;
configType = "hyprlang"; portalPackage = null;
systemd.variables = ["--all"]; xwayland.enable = true;
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
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,252 +1,248 @@
{inputs, ...}: { { inputs, ... }:
flake.modules.homeManager.desktop = { {
config, flake.modules.homeManager.desktop =
pkgs, { pkgs, ... }:
lib, {
...
}:
with lib; let
cfg = config.tnix.desktop.mangowm;
in {
imports = [ imports = [
inputs.mango.hmModules.mango inputs.mango.hmModules.mango
]; ];
options.tnix.desktop.mangowm = { wayland.windowManager.mango = {
enable = mkEnableOption "Enable MangoWM"; enable = true;
settings = {
# Monitors
monitorrule = [
"name:DP-2, width:1440, height:2560, refresh:144, x:0, y:0, vrr:0, rr:1"
"name:DP-3, width:2560, height:1440, refresh:144, x:1440, y:0, vrr:0"
"name:DP-1, width:1080, height:1920, refresh:144, x:4000, y:0, vrr:0, rr:3"
];
monitorRule = mkOption { focus_cross_monitor = 1;
type = with types; listOf str; exchange_cross_monitor = 1;
default = [];
};
tagRule = mkOption { # Keyboard
type = with types; listOf str; repeat_rate = 25;
default = []; repeat_delay = 600;
numlockon = 0;
xkb_rules_layout = "us";
# Trackpad
disable_trackpad = 0;
tap_to_click = 1;
tap_and_drag = 1;
drag_lock = 1;
trackpad_natural_scrolling = 1;
disable_while_typing = 1;
left_handed = 0;
middle_button_emulation = 0;
swipe_min_threshold = 1;
# Mouse
mouse_natural_scrolling = 0;
mouse_accel_profile = 0;
# Theme
border_radius = 8;
no_radius_when_single = 0;
focused_opacity = 1.0;
unfocused_opacity = 1.0;
# Scroller Layout Setting
scroller_structs = 0;
scroller_default_proportion = 0.5;
scroller_ignore_proportion_single = 0;
scroller_default_proportion_single = 1.0;
# Master-Stack Layout Setting
new_is_master = 0;
default_mfact = 0.5;
default_nmaster = 1;
smartgaps = 0;
# Overview Setting
hotarea_size = 10;
enable_hotarea = 1;
ov_tab_mode = 0;
overviewgappi = 15;
overviewgappo = 15;
# layouts
tagrule = [
"id:1, layout_name:vertical_tile, monitor_name:DP-2, no_hide:1"
"id:2, layout_name:vertical_tile, monitor_name:DP-2, no_hide:1"
"id:3, layout_name:vertical_tile, monitor_name:DP-2, no_hide:1"
"id:4, layout_name:vertical_tile, monitor_name:DP-2, no_hide:1"
"id:5, layout_name:vertical_tile, monitor_name:DP-2, no_hide:1"
"id:1, layout_name:tile, monitor_name:DP-3, no_hide:1"
"id:2, layout_name:tile, monitor_name:DP-3, no_hide:1"
"id:3, layout_name:tile, monitor_name:DP-3, no_hide:1"
"id:4, layout_name:tile, monitor_name:DP-3, no_hide:1"
"id:5, layout_name:tile, monitor_name:DP-3, no_hide:1"
"id:1, layout_name:vertical_tile, monitor_name:DP-1, no_hide:1"
"id:2, layout_name:vertical_tile, monitor_name:DP-1, no_hide:1"
"id:3, layout_name:vertical_tile, monitor_name:DP-1, no_hide:1"
"id:4, layout_name:vertical_tile, monitor_name:DP-1, no_hide:1"
"id:5, layout_name:vertical_tile, monitor_name:DP-1, no_hide:1"
];
# Keybindings
mousebind = [
"SUPER, btn_left, moveresize, curmove"
"SUPER, btn_right, moveresize, curresize"
];
gesturebind = [
"none, right, 3, viewtoleft_have_client"
"none, up, 3, toggleoverview"
"none, down, 3, toggleoverview"
];
bind = [
# apps
"SUPER, Return, spawn, wezterm"
"SUPER, Space, spawn, vicinae toggle"
"SUPER, D, spawn, vesktop"
"SUPER, B, spawn, brave"
"SUPER, V, spawn, vicinae vicinae://extensions/vicinae/clipboard/history"
"SUPER+SHIFT, W, spawn, vicinae vicinae://extensions/sovereign/awww-switcher/wpgrid"
# WM
"SUPER, Q, killclient"
"SUPER+SHIFT, R, reload_config"
"SUPER+SHIFT, F, togglefullscreen"
"SUPER+SHIFT, Space, togglefloating"
"ALT, Tab, toggleoverview"
"ALT+SHIFT, minus, incgaps, -1"
"ALT+SHIFT, equal, incgaps, 1"
"ALT+SHIFT, R, togglegaps"
# switch layout
"SUPER+SHIFT, H, setlayout, tile"
"SUPER+SHIFT, V, setlayout, vertical_tile"
"SUPER+SHIFT, S, setlayout, scroller"
# resize client
"SUPER+CTRL, Up, resizewin, +0, -50"
"SUPER+CTRL, Down, resizewin, +0, +50"
"SUPER+CTRL, Left, resizewin, -50, +0"
"SUPER+CTRL, Right, resizewin, +50, +0"
# swap client
"SUPER+SHIFT, Up, exchange_client, up"
"SUPER+SHIFT, Down, exchange_client, down"
"SUPER+SHIFT, Left, exchange_client, left"
"SUPER+SHIFT, Right, exchange_client, right"
# switch client focus
"SUPER, Tab, focusstack, next"
"SUPER, Left, focusdir, left"
"SUPER, Right, focusdir, right"
"SUPER, Up, focusdir, up"
"SUPER, Down, focusdir, down"
# switch view
"SUPER, 1, view, 1, 1"
"SUPER, 2, view, 2, 1"
"SUPER, 3, view, 3, 1"
"SUPER, 4, view, 4, 1"
"SUPER, 5, view, 5, 1"
# move client to the tag with focus
"SUPER+SHIFT, 1, tagsilent, 1, 1"
"SUPER+SHIFT, 2, tagsilent, 2, 1"
"SUPER+SHIFT, 3, tagsilent, 3, 1"
"SUPER+SHIFT, 4, tagsilent, 4, 1"
"SUPER+SHIFT, 5, tagsilent, 5, 1"
# move client to the tag without focus
"SUPER+ALT, 1, tag, 1, 1"
"SUPER+ALT, 2, tag, 2, 1"
"SUPER+ALT, 3, tag, 3, 1"
"SUPER+ALT, 4, tag, 4, 1"
"SUPER+ALT, 5, tag, 5, 1"
];
# Window effect
blur = 0;
blur_layer = 0;
blur_optimized = 1;
blur_params_num_passes = 2;
blur_params_radius = 5;
blur_params_noise = 0.02;
blur_params_brightness = 0.9;
blur_params_contrast = 0.9;
blur_params_saturation = 1.2;
shadows = 0;
layer_shadows = 0;
shadow_only_floating = 1;
shadows_size = 10;
shadows_blur = 15;
shadows_position_x = 0;
shadows_position_y = 0;
shadowscolor = "0x000000ff";
# Animation
animations = 1;
layer_animations = 1;
animation_type_open = "slide";
animation_type_close = "fade";
animation_fade_in = 1;
animation_fade_out = 1;
tag_animation_direction = 1;
zoom_initial_ratio = 0.3;
zoom_end_ratio = 0.8;
fadein_begin_opacity = 0.5;
fadeout_begin_opacity = 0.8;
animation_duration_move = 100;
animation_duration_open = 100;
animation_duration_close = 100;
animation_duration_tag = 200;
animation_duration_focus = 0;
animation_curve_open = "0.46, 1.0, 0.29, 1";
animation_curve_move = "0.46, 1.0, 0.29, 1";
animation_curve_tag = "0.46, 1.0, 0.29, 1";
animation_curve_close = "0.08, 0.92, 0, 1";
animation_curve_focus = "0.46, 1.0, 0.29, 1";
animation_curve_opafadeout = "0.5, 0.5, 0.5, 0.5";
animation_curve_opafadein = "0.46, 1.0, 0.29, 1";
# Appearance
borderpx = 0;
gappih = 10;
gappiv = 10;
gappoh = 10;
gappov = 10;
rootcolor = "0x201b14ff";
bordercolor = "0x444444ff";
focuscolor = "0xc9b890ff";
maximizescreencolor = "0x89aa61ff";
urgentcolor = "0xad401fff";
scratchpadcolor = "0x516c93ff";
globalcolor = "0xb153a7ff";
overlaycolor = "0x14a57cff";
# Misc
syncobj_enable = 1;
exec-once = [
"dbus-update-activation-environment --systemd --all; systemctl --user reset-failed && systemctl --user start mango-session.target"
"awww-daemon"
"dms run"
];
}; };
}; };
config = mkIf cfg.enable { home.packages = with pkgs; [
wayland.windowManager.mango = { quickshell
enable = true; dms-shell
settings = { dgop
# Monitors ];
monitorrule = cfg.monitorRule;
focus_cross_monitor = 1;
exchange_cross_monitor = 1;
drag_tile_to_tile = 1;
# Keyboard
repeat_rate = 25;
repeat_delay = 600;
numlockon = 0;
xkb_rules_layout = "us";
# Trackpad
disable_trackpad = 0;
tap_to_click = 1;
tap_and_drag = 1;
drag_lock = 1;
trackpad_natural_scrolling = 1;
disable_while_typing = 1;
left_handed = 0;
middle_button_emulation = 0;
swipe_min_threshold = 1;
# Mouse
mouse_natural_scrolling = 0;
mouse_accel_profile = 0;
# Theme
border_radius = 8;
no_radius_when_single = 0;
focused_opacity = 0.9;
unfocused_opacity = 0.9;
# Scroller Layout Setting
scroller_structs = 0;
scroller_default_proportion = 0.5;
scroller_ignore_proportion_single = 0;
scroller_default_proportion_single = 1.0;
# Master-Stack Layout Setting
new_is_master = 0;
default_mfact = 0.5;
default_nmaster = 1;
smartgaps = 0;
# Overview Setting
hotarea_size = 10;
enable_hotarea = 1;
ov_tab_mode = 0;
overviewgappi = 15;
overviewgappo = 15;
# layouts
tagrule = cfg.tagRule;
# Keybindings
mousebind = [
"SUPER, btn_left, moveresize, curmove"
"SUPER, btn_right, moveresize, curresize"
];
gesturebind = [
"none, right, 3, viewtoleft_have_client"
"none, up, 3, toggleoverview"
"none, down, 3, toggleoverview"
];
bind = [
# apps
"SUPER, Return, spawn, wezterm"
"SUPER, Space, spawn, vicinae toggle"
"SUPER, D, spawn, vesktop"
"SUPER, T, spawn, Telegram"
"SUPER, B, spawn, brave"
"SUPER, V, spawn, vicinae vicinae://extensions/vicinae/clipboard/history"
"SUPER+SHIFT, W, spawn, vicinae vicinae://extensions/sovereign/awww-switcher/wpgrid"
# WM
"SUPER, Q, killclient"
"SUPER+SHIFT, R, reload_config"
"SUPER+SHIFT, F, togglefullscreen"
"SUPER+SHIFT, Space, togglefloating"
"SUPER+SHIFT, Space, centerwin"
"ALT, Tab, toggleoverview"
"ALT+SHIFT, minus, incgaps, -1"
"ALT+SHIFT, equal, incgaps, 1"
"ALT+SHIFT, R, togglegaps"
"SUPER+SHIFT, P, toggleglobal"
# switch layout
"SUPER+SHIFT, H, setlayout, tile"
"SUPER+SHIFT, V, setlayout, vertical_tile"
"SUPER+SHIFT, S, setlayout, scroller"
# resize client
"SUPER+CTRL, Up, resizewin, +0, -50"
"SUPER+CTRL, Down, resizewin, +0, +50"
"SUPER+CTRL, Left, resizewin, -50, +0"
"SUPER+CTRL, Right, resizewin, +50, +0"
"SUPER+CTRL, Equal, setoption, default_mfact, 0.5"
# swap client
"SUPER+SHIFT, Up, exchange_client, up"
"SUPER+SHIFT, Down, exchange_client, down"
"SUPER+SHIFT, Left, exchange_client, left"
"SUPER+SHIFT, Right, exchange_client, right"
# switch client focus
"SUPER, Tab, focusstack, next"
"SUPER, Left, focusdir, left"
"SUPER, Right, focusdir, right"
"SUPER, Up, focusdir, up"
"SUPER, Down, focusdir, down"
# switch view
"SUPER, 1, view, 1, 1"
"SUPER, 2, view, 2, 1"
"SUPER, 3, view, 3, 1"
"SUPER, 4, view, 4, 1"
"SUPER, 5, view, 5, 1"
# move client to the tag with focus
"SUPER+SHIFT, 1, tagsilent, 1, 1"
"SUPER+SHIFT, 2, tagsilent, 2, 1"
"SUPER+SHIFT, 3, tagsilent, 3, 1"
"SUPER+SHIFT, 4, tagsilent, 4, 1"
"SUPER+SHIFT, 5, tagsilent, 5, 1"
# move client to the tag without focus
"SUPER+ALT, 1, tag, 1, 1"
"SUPER+ALT, 2, tag, 2, 1"
"SUPER+ALT, 3, tag, 3, 1"
"SUPER+ALT, 4, tag, 4, 1"
"SUPER+ALT, 5, tag, 5, 1"
];
# Window effect
blur = 1;
blur_layer = 0;
blur_optimized = 1;
blur_params_num_passes = 2;
blur_params_radius = 5;
blur_params_noise = 0.02;
blur_params_brightness = 0.9;
blur_params_contrast = 0.9;
blur_params_saturation = 1.2;
shadows = 1;
layer_shadows = 0;
shadow_only_floating = 1;
shadows_size = 10;
shadows_blur = 15;
shadows_position_x = 0;
shadows_position_y = 0;
shadowscolor = "0x000000ff";
# Animation
animations = 1;
layer_animations = 1;
animation_type_open = "slide";
animation_type_close = "fade";
animation_fade_in = 1;
animation_fade_out = 1;
tag_animation_direction = 0;
zoom_initial_ratio = 0.3;
zoom_end_ratio = 0.8;
fadein_begin_opacity = 0.5;
fadeout_begin_opacity = 0.8;
animation_duration_move = 100;
animation_duration_open = 100;
animation_duration_close = 100;
animation_duration_tag = 200;
animation_duration_focus = 0;
animation_curve_open = "0.46, 1.0, 0.29, 1";
animation_curve_move = "0.46, 1.0, 0.29, 1";
animation_curve_tag = "0.46, 1.0, 0.29, 1";
animation_curve_close = "0.08, 0.92, 0, 1";
animation_curve_focus = "0.46, 1.0, 0.29, 1";
animation_curve_opafadeout = "0.5, 0.5, 0.5, 0.5";
animation_curve_opafadein = "0.46, 1.0, 0.29, 1";
# Appearance
borderpx = 0;
gappih = 10;
gappiv = 10;
gappoh = 10;
gappov = 10;
rootcolor = "0x201b14ff";
bordercolor = "0x444444ff";
focuscolor = "0xc9b890ff";
maximizescreencolor = "0x89aa61ff";
urgentcolor = "0xad401fff";
scratchpadcolor = "0x516c93ff";
globalcolor = "0xb153a7ff";
overlaycolor = "0x14a57cff";
# Misc
syncobj_enable = 1;
exec-once = [
"dbus-update-activation-environment --systemd --all; systemctl --user reset-failed && systemctl --user start mango-session.target"
"awww-daemon"
"dms run"
];
};
};
home.packages = with pkgs; [
quickshell
dms-shell
dgop
];
};
}; };
} }

View File

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

View File

@@ -1,21 +0,0 @@
{
flake.modules.homeManager.desktop = {pkgs, ...}: {
programs.mpv = {
enable = true;
scripts = (
with pkgs.mpvScripts; [
modernz
thumbfast
mpris
mpv-image-viewer.image-positioning
]
);
config = {
osc = "no";
border = "no";
};
};
};
}

View File

@@ -1,19 +0,0 @@
{
flake.modules.homeManager.desktop = {
programs.satty = {
enable = true;
settings = {
general = {
corner-roundness = 12;
initial-tool = "arrow";
early-exit = true;
copy-command = "wl-copy";
};
font = {
family = "JetBrainsMono NerdFont";
};
};
};
};
}

View File

@@ -1,77 +0,0 @@
{inputs, ...}: {
flake.modules.nixos.desktop = {
imports = [
inputs.serpantinum.nixosModules.default
];
programs.serpantinum.enable = true;
};
flake.modules.homeManager.desktop = {pkgs, ...}: {
imports = [
inputs.serpantinum.homeManagerModules.default
];
home.packages = with pkgs; [pulseaudioFull];
programs.serpantinum = {
enable = true;
systemd.enable = true;
settings = {
wallpaperDir = "/home/tux/Wallpapers";
general = {
language = "en";
weatherUnit = "metric";
weatherInterval = 30;
avatarPath = "/home/tux/Wallpapers/tux.png";
muteSfx = true;
};
bar = {
position = "top";
style = "modular";
time = {
format = "hh:mm:ss A";
};
width = 5;
workspaceCount = 7;
modules = {
left = [
"left"
"workspaces"
"sysmon"
"wifi"
];
center = ["vis"];
right = [
"media"
"vol"
"bat"
"tray"
"timedate"
];
};
};
theme = {
fontFamily = "JetBrains Mono SemiBold";
borderRadius = 12;
matugen = true;
};
notifications = {
dnd = false;
position = "top right";
sound = true;
};
idle = {
enabled = true;
manualInhibit = true;
};
};
};
};
}

View File

@@ -1,30 +0,0 @@
{
flake.modules.homeManager.desktop = {pkgs, ...}: {
home.pointerCursor = {
enable = true;
package = pkgs.bibata-cursors;
name = "Bibata-Modern-Ice";
size = 24;
};
qt = {
enable = true;
style.name = "adwaita-dark";
};
gtk = {
enable = true;
theme = {
name = "adw-gtk3-dark";
package = pkgs.adw-gtk3;
};
iconTheme = {
package = pkgs.tela-icon-theme;
name = "Tela-black";
};
};
# Make GTK4/libadwaita apps prefer dark too (they ignore gtk.theme).
dconf.settings."org/gnome/desktop/interface".color-scheme = "prefer-dark";
};
}

View File

@@ -1,60 +1,73 @@
{ {
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; [
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 = false;
"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 = {
"@samlinville/store.raycast.tailscale" = {
"preferences" = {
"tailscalePath" = "${pkgs.tailscale}/bin/tailscale";
};
};
"@sovereign/vicinae-extension-awww-switcher-0" = {
"preferences" = {
"transitionDuration" = "1";
"transitionType" = "center";
"wallpaperPath" = "/home/tux/Wallpapers/";
};
}; };
}; };
}; };
}; };
}; };
};
} }

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,26 @@
{ {
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 = { settings = {
name = "${userName}"; user = {
email = "${userEmail}"; 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

@@ -87,68 +87,81 @@
title = "AI Generated Commit Messages"; title = "AI Generated Commit Messages";
key = "CommitMsg"; key = "CommitMsg";
command = '' command = ''
bash -lc ' bash -c "
diff=$(git diff --cached) # Check for staged changes
if [ -z "$diff" ]; then diff=\$(git diff --cached | head -n 10)
echo "No changes in staging. Add changes first." if [ -z \"\$diff\" ]; then
echo \"No changes in staging. Add changes first.\"
exit 1 exit 1
fi fi
SELECTED_TYPE="{{.Form.Type}}" SELECTED_TYPE=\"{{.Form.Type}}\"
COMMITS_TO_SUGGEST=4 COMMITS_TO_SUGGEST=8
opencode run --format json --model=google/gemini-3.5-flash-lite --variant=none " opencode run -m \"google/gemini-2.5-flash-lite\" \"
You are an expert at writing Git commits. Your job is to write commit messages that follow the Conventional Commits format. You are an expert at writing Git commits. Your job is to write commit messages that follow the Conventional Commits format.
The user has selected: $SELECTED_TYPE The user has selected: \$SELECTED_TYPE
Your task is to: Your task is to:
1. Analyze the code changes 1. Analyze the code changes
2. Determine the most appropriate commit type if user selected ai-defined 2. Determine the most appropriate commit type (if user selected 'ai-defined')
3. Determine an appropriate scope, component, or area affected 3. Determine an appropriate scope (component/area affected)
4. Decide if this is a breaking change 4. Decide if this is a breaking change
5. Write clear, concise commit messages 5. Write clear, concise commit messages
Available commit types: Available commit types:
- feat: A new feature - feat: A new feature
- fix: A bug fix - fix: A bug fix
- docs: Documentation only changes - docs: Documentation only changes
- style: Changes that do not affect the meaning of the code - style: Changes that do not affect the meaning of the code
- refactor: A code change that neither fixes a bug nor adds a feature - refactor: A code change that neither fixes a bug nor adds a feature
- perf: A code change that improves performance - perf: A code change that improves performance
- test: Adding missing tests or correcting existing tests - test: Adding missing tests or correcting existing tests
- build: Changes that affect the build system or external dependencies - build: Changes that affect the build system or external dependencies
- ci: Changes to CI configuration files and scripts - ci: Changes to CI configuration files and scripts
- chore: Other changes that do not modify src or test files - chore: Other changes that don't modify src or test files
- revert: Reverts a previous commit - revert: Reverts a previous commit
Follow these guidelines: Follow these guidelines:
- Structure: <type>(<scope>): <description> - Structure: <type>(<scope>): <description>
- If user selected ai-defined, analyze the changes and pick the most suitable type - If user selected 'ai-defined', analyze the changes and pick the most suitable type
- If user selected a specific type, use that type: $SELECTED_TYPE - If user selected a specific type, use that type: \$SELECTED_TYPE
- Add scope in parentheses if applicable, for example auth, api, ui, config - Add scope in parentheses if applicable (e.g., auth, api, ui, config)
- Use exclamation mark after type or scope for breaking changes: type(scope)!: description - Use exclamation mark (!) after type/scope for breaking changes: type(scope)!: description
- Use lowercase for description except proper nouns - Use lowercase for description (except proper nouns)
- Use imperative mood: add, not added - Use imperative mood (\\\"add\\\", not \\\"added\\\")
- Keep description under 50 characters when possible - Keep description under 50 characters when possible
- No period at the end of subject line - No period at the end of subject line
IMPORTANT: Examples:
- Generate exactly $COMMITS_TO_SUGGEST different commit message options - feat(auth): add OAuth login support
- If user selected ai-defined, you can use different types for different options - fix(api): handle null response in user endpoint
- If user selected a specific type, all messages must use that type - docs(readme): update installation instructions
- Only return commit messages, no explanations - style(ui): improve button spacing consistency
- Do not use markdown code blocks - refactor(database): simplify query builder logic
- One message per line - test(auth): add unit tests for login flow
- build(deps): upgrade React to version 18
- ci(github): fix deployment workflow
- chore(config): update ESLint rules
- perf(api)!: optimize database queries
Previous commits for context: IMPORTANT:
$(git log --oneline -10) - Generate exactly \$COMMITS_TO_SUGGEST different commit message options
- If user selected 'ai-defined', you can use different types for different options
- If user selected a specific type, all messages must use that type
- Only return commit messages, no explanations
- Do not use markdown code blocks
- One message per line
Changes to analyze: Previous commits for context:
$(git diff --cached --stat) \$(git log --oneline -10)
$diff
" | JQ_TEXT=text jq -r "select(.type == env.JQ_TEXT) | .part.text? // empty" Changes to analyze:
' \$(git diff --cached --stat)
\$(git diff --cached)
\"
"
''; '';
} }
]; ];

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

View File

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

View File

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

View File

@@ -1,84 +0,0 @@
{inputs, ...}: {
flake.modules.nixos.alpha = {
config,
lib,
...
}: let
hasOptinPersistence = config.tnix.boot.impermanence.enable;
isLegacy = config.tnix.boot.legacy.enable;
in {
imports = [
inputs.disko.nixosModules.disko
];
disko.devices.disk.primary = {
device = "/dev/sda";
type = "disk";
content = {
type = "gpt";
partitions =
{
ESP = {
size = "1G";
type = "EF00";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
mountOptions = [
"defaults"
"umask=0077"
];
};
};
root = {
size = "100%";
type = "8300";
content = {
type = "btrfs";
# Base subvolumes that always exist
subvolumes =
{
"/root" = {
mountOptions = [
"compress=zstd"
"noatime"
"space_cache=v2"
];
mountpoint = "/";
};
"/nix" = {
mountOptions = [
"compress=zstd"
"noatime"
"noacl"
"space_cache=v2"
];
mountpoint = "/nix";
};
}
# Conditionally merge /persist only when impermanence is enabled
// lib.optionalAttrs hasOptinPersistence {
"/persist" = {
mountOptions = [
"compress=zstd"
"noatime"
"space_cache=v2"
];
mountpoint = "/persist";
};
};
};
};
}
// lib.optionalAttrs isLegacy {
boot = {
name = "boot";
size = "1M";
type = "EF02";
};
};
};
};
};
}

View File

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

View File

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

View File

@@ -1,36 +0,0 @@
tux-password: ENC[AES256_GCM,data:tvx3nMoIuQSotxHDWLs7UesnyWY3u3EwkqAIzCw3Z2AJseaiqnt/xeSKAeUXPVSs85rVdIJ6Ys5+6r+NONEG7ujuNevpjJRNkQ==,iv:CB0BIrMfdiWiMCvmRdtsafh3dCAD5Qb3mOuE7eq4nA4=,tag:p/3AESwNCEL4EoU9rJjUPw==,type:str]
gemini-api-key: ENC[AES256_GCM,data:Bo3Z5Jhce0UOBn77I2AcrXYbBgPLDx0eOjPC8J63E/VWNhMPbbxb,iv:iWOsTACOMcK3oqq848WnJ5Ku3tYy1aadmLB4IMgoyqg=,tag:BPzlXoP8/iJaj8c/YFCWyg==,type:str]
openrouter-api-key: ENC[AES256_GCM,data:D+/ImUTg7UvBTh0fMlWMZ0O/GsQS/R4Hz+CO4l42R6mn+zk+udvw79BctXdWWyrFf2ZNOTJ/99QTtWOUOvHISWaEJogXyb+93g==,iv:c7OtgBu1Zaf7lA4InIsKOAPbAvTl3gaO7QGCFNx21Bo=,tag:KXiASj/qC1YzK6DUox57ug==,type:str]
opencode-go-api-key: ENC[AES256_GCM,data:ipKkNcRqBERIQ6f6yFzVm999s+UwJys4elHWhzpL441RfOaG9MmRWMcD+wRLJ7DSWFjYu6uUPF7TKez8J6abWeKDgg==,iv:FDSYE3R8zKVxWiP2S/sCVcwEu3fEXg/hCeqCRSF+c6g=,tag:5RDuMFGMoN6xwAYj0HiyjQ==,type:str]
zai-coding-plan-api-key: ENC[AES256_GCM,data:HrNfR+Ux/Iyt4qkD1uXzDFQb+l0ltMMrbRahEG3pofFbw98VXfRFbhspcxh9vEyqkw==,iv:lzkLxPV7Q38dn0IEgtchVMrvnVBz4e5q282704x/hmU=,tag:IKzE6Tp6D93nJHoEvCPGBQ==,type:str]
netbird-key: ENC[AES256_GCM,data:NilfyafnGhFVYD6q4+jJQxlhXNdNC8BQ1CZfu8a5wc693Y1h,iv:Rpl0OpkQdBMPpIJ08t9Z0AjDAW6c97pFZKO1KPu8ipY=,tag:du3d0SQWuqJtJSwhSgJE4g==,type:str]
cloudflare-credentials:
email: ENC[AES256_GCM,data:K9L6H4dqNNgbCFg=,iv:jirDJb+Y2sXrup6/doRmOdd8tV7zLnttcgG75r4Fs04=,tag:XeyMVC+Q9TEuTxSfOeR2Uw==,type:str]
dns-api-token: ENC[AES256_GCM,data:aLZqasMaxpv08KuGqhe66J/jHqEnMNdZrYtIurv01xk2/5OW//PaHQ==,iv:7tZYpOT27n/RWaj1CqiZbhA/g3aKbxjdkMA6SuW/YpQ=,tag:oetxyD9XMrihSLyDvl7qfw==,type:str]
aiostreams: ENC[AES256_GCM,data:HeV4NONoqTti/4GBpzYaUEGgrSpDfCfcGJ3kbZAUtg5hm1zQCcelx3N4b/woSjaNZrDj98P5R3oZUkgVfv0RS2PKdJc3EdLaPFwXcuJ+W0U373sryU85uIIZi4BvQ4LyCCpuclPU5dgQmb9rzbIvhlu/ftfpKJsRbH2bUgMMo2nohMWUtg==,iv:V60U/omnN+09cSOQGvwwN8DC6/D++MB0axQyzIG97zo=,tag:vwNbXRj3CS+okb0NSwxgYw==,type:str]
mediaflow-proxy: ENC[AES256_GCM,data:jk2eYyOmO3XpqFNo3jucB/VvL6pWBGrquYi/OpIwvSPqjbo=,iv:DIsqykv77/TlLhT9uIPGJRBlCQHVdhcuYlc56qQGZgk=,tag:phMXArjIrNNI51U9hpaUzg==,type:str]
pangolin: ENC[AES256_GCM,data:G6TscTsWsyvBM/L2boxpDIrczV0cycQNT51mOf0vPKOHdifdBxT6Q3PY+Ms5arc=,iv:qh655lwIcD89D8ufIzJWYrDqPKGCrGMUXsgcFYwm9zY=,tag:kGlGzaOADZyY6gsLuI6EHw==,type:str]
sops:
age:
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBaR0kzRXBGRjJaVldDRk90
KzYwSzJBeXBnNVZ0T2VaU2oyLzdRWmo5ZzNVCk9HTDVtMk8xL1cwL2FSRUR5UGdS
bXJnOXhTbWozWm5rd2pnaFNoWk0rWncKLS0tIGFWWmY2WU9YanJ5UElab3lqaXNo
QUhYUWs4bitJaGpXL200b0s0SmVIeVUKevQ1IVqmqGIYf014iL47C02+peSYJyeE
PNluZUA6VzrL2WpdJzDqxAwSWtcgXG0/JADIg+DssnhftiHMHzn3NQ==
-----END AGE ENCRYPTED FILE-----
recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBnL1VPODRnNEs2bXlUVjB5
Z0pBUzBnRDQ0WWcvL2IvUHdmQXUxNjRpTVN3Ck9VLzd2QWpMMlFJck1EQXBVanl0
SC91bDFqNFlJZ2E0UXVZa3BKRjh3TlkKLS0tIENuc1dUZ1dDUTg2VXBueU1ETG9S
c095blJheHhVT0E4bjdGUWlYN0N4MVUKK42sChX4V37HK1SRKQxldLpft2jVfeiG
4TkObqH8ddGpbd7cX5a/wboTjYuEdAviWxjK2oBPgtcFc1f03X3tmA==
-----END AGE ENCRYPTED FILE-----
recipient: age1mzxxxzhy3us3rd960ufqv7vlxj5cnug86md6x69llg9ujzw2pqws057llf
lastmodified: "2026-09-16T14:21:00Z"
mac: ENC[AES256_GCM,data:Aqg1cboHKW5QrJooVIqgbHTFg9EpTEnfCv/RRSp0efzyXvDrR7eG5WTvJPE9IbrmS190yvOlT0fw1Bhzyr8kiyoO71sbyUessw5IMUGcLP+m2FNtt8osc7fSTGseojv3MXBndOMDEOpT+Clv6hbv/rr5eGbb05oK6rW97/pDDfU=,iv:s/9PAHHQ0mHQJosKGclSnumHqm6CG3fDVKD5eT4Q1Y0=,tag:3pgycAwYUz9aEOy4/aW30Q==,type:str]
unencrypted_suffix: _unencrypted
version: 3.13.3

View File

@@ -1,179 +0,0 @@
{config, ...}: {
flake.modules.nixos.arcturus = {
pkgs,
hostName,
userName,
...
} @ innerArgs: {
imports = with config.flake.modules.nixos; [
boot
networking
virtualisation
services
];
tnix = {
boot = {
secure-boot.enable = true;
impermanence = {
enable = true;
home = {
directories = [
"Distrobox"
".bun"
".rustup"
".config/sops"
".config/nix"
".local/share/nvim"
".local/share/opencode"
".local/share/zsh"
".local/share/zoxide"
".local/state/lazygit"
".pi/agent/sessions"
".omp"
];
files = [
".wakatime.cfg"
];
};
};
};
networking = {
openssh.enable = true;
netbird-client.enable = true;
newt = {
enable = true;
environmentFile = innerArgs.config.sops.secrets.newt.path;
};
};
services = {
hermes-agent = {
enable = true;
environmentFiles = [innerArgs.config.sops.secrets.hermes.path];
};
cyber-tux = {
enable = true;
environmentFile = innerArgs.config.sops.secrets.discord-token.path;
};
vaultwarden = {
enable = true;
domain = "bw.lab.tux.rs";
configurePangolin = true;
};
copyparty = {
enable = true;
domain = "files.lab.tux.rs";
accounts.${userName}.passwordFile = innerArgs.config.sops.secrets.copyparty.path;
volumes = {
"/" = {
path = "/var/lib/copyparty/data";
access = {
r = "*";
rwmdgGha = [userName];
};
};
};
configurePangolin = true;
};
coder = {
enable = true;
domain = "coder.lab.tux.rs";
configurePangolin = true;
};
};
virtualisation = {
docker.enable = true;
distrobox.enable = true;
};
};
sops.secrets = {
tux-password = {
sopsFile = ./secrets.yaml;
neededForUsers = true;
};
discord-token = {
sopsFile = ./secrets.yaml;
};
gemini-api-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
openrouter-api-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
opencode-go-api-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
zai-coding-plan-api-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
netbird-key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
newt = {
sopsFile = ./secrets.yaml;
owner = userName;
};
copyparty = {
sopsFile = ./secrets.yaml;
owner = innerArgs.config.services.copyparty.user;
};
hermes = {
sopsFile = ./secrets.yaml;
};
};
# --- Networking ---
networking = {
hostName = hostName;
networkmanager = {
enable = true;
wifi.backend = "iwd";
wifi.powersave = false;
};
wireless.iwd = {
enable = true;
settings = {
Network = {
EnableIPv6 = true;
};
Settings = {
AutoConnect = true;
};
};
};
firewall.enable = false;
};
environment.systemPackages = with pkgs; [
impala
];
system.stateVersion = "26.05";
};
}

View File

@@ -1,75 +0,0 @@
{inputs, ...}: {
flake.modules.nixos.arcturus = {
config,
lib,
...
}: let
hasOptinPersistence = config.tnix.boot.impermanence.enable;
in {
imports = [
inputs.disko.nixosModules.disko
];
disko.devices.disk.primary = {
device = "/dev/nvme0n1";
type = "disk";
content = {
type = "gpt";
partitions = {
ESP = {
size = "1G";
type = "EF00";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
mountOptions = [
"defaults"
"umask=0077"
];
};
};
root = {
size = "100%";
type = "8300";
content = {
type = "btrfs";
# Base subvolumes that always exist
subvolumes =
{
"/root" = {
mountOptions = [
"compress=zstd"
"noatime"
"space_cache=v2"
];
mountpoint = "/";
};
"/nix" = {
mountOptions = [
"compress=zstd"
"noatime"
"noacl"
"space_cache=v2"
];
mountpoint = "/nix";
};
}
# Conditionally merge /persist only when impermanence is enabled
// lib.optionalAttrs hasOptinPersistence {
"/persist" = {
mountOptions = [
"compress=zstd"
"noatime"
"space_cache=v2"
];
mountpoint = "/persist";
};
};
};
};
};
};
};
};
}

View File

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

View File

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

View File

@@ -1,34 +0,0 @@
tux-password: ENC[AES256_GCM,data:eXg28pYQjIi5iPh4oHBOvIYQReM92T79uty/O461mEoLB8awr8ikq3RM7Mux3jZKM+Fk/Ow3NNG0F/154dZentodr1uvy9gD1g==,iv:nQevOumENveBMuiYMJF0OokORyjZCpR8ahTfOuj2Dzo=,tag:64zz8eVuw1OwTltfAUwWSg==,type:str]
discord-token: ENC[AES256_GCM,data:uzxkrNRRplL/1MfvPZ/EL+I8UACuZQBHZ95BSHuxW0nBjxhr2F89D2BXTcKOBI9qO6uMjK5WBtWzSOw3y9EsngTTm/youIdkrIDLP3r/tkpOkLa/VjM=,iv:OxzFa0nEInV5uxgQFww11ZE1NorH5q130Tgp/6l9uOE=,tag:g4U9wLhPAkz72ktbQ8KrSg==,type:str]
gemini-api-key: ENC[AES256_GCM,data:gLZSoYTdKY+rwIpYiXvN9n9PGkUD6q8Oe7dHnYkjEjwDf5qpjubg,iv:ySoNgQWTu9DjvbashF4ulyYP8fJUl4yrCTeBQ0jrGmw=,tag:FctubsQv50AP78JvTb9bpQ==,type:str]
openrouter-api-key: ENC[AES256_GCM,data:6xONCl9lqOoO7b4CEyCz9607tICDUAkpglRjGS5nYq2ppg2UKqYTrWD1BGCA5Xfs/CWskniVhoNG3vscjKiYCCh9gbM6aqdmTQ==,iv:7Iwc9t00HOOBjA7URXcUO41badqYyJCkFHM/uPkLFxY=,tag:Cl39kitr2e0//HVwAdsdUQ==,type:str]
opencode-go-api-key: ENC[AES256_GCM,data:dmeRKn7TWHnqvpyPQpcEG6yHTb2bRby/rh10ytL0jHj5R+lRmNVdmqUF92GTznY9vEaB6ZYCJecWhpm8g4upNfOWBg==,iv:9UMJpAlD8gpcNiN+liu3nawoAZQKapEg7sCp561N9E8=,tag:OZlASpOa5BQaQwFWjoLCRw==,type:str]
zai-coding-plan-api-key: ENC[AES256_GCM,data:lLegmS/RIo7JoBoAyVdcS++rXS8W62cwz+zVsv4dPnlfjGFO/nVlI5InqC34sPxLRQ==,iv:BRC7eYVmdZuWwb+2k2FrnlJih63HXrcvhVp/K5t5td8=,tag:aP8x+Xcnkz2t0hn7erCkKw==,type:str]
netbird-key: ENC[AES256_GCM,data:q6eKisca04qn/CvALrvXF79MsToDhvLRLv2JTiUBAZglCC9m,iv:jj0/ZD7IDgopprTVUgSfJmdAJmUP3iqewU3dqssGYbk=,tag:6IPRdCm2FGdlTEIX7jt3qA==,type:str]
copyparty: ENC[AES256_GCM,data:QXt8IgTekg9rzFyuzpg=,iv:vJYfHqCiheq290K9TGACHNHyOWzIn60j1Kz502SE27w=,tag:ECt7Wavlqw1V6zgXiRZtUg==,type:str]
newt: ENC[AES256_GCM,data:r5Rd81ZrzrIYbXtFkypbJltoGCOYrW6P4IpwGCtaH7lqCg7wD/WMboMx13HN4Mm0J4qbBpDakpfVv9qUTrisYP1xwpKkmY1kqPlFWRZN8hzuuNS2Tv3qUjavTp5XGotVPLHj1Cg/cwGcf8EAssYTwTy7H0PgdQKwqigQD1f1s/j4iXQ=,iv:1xP38/Ayt1xvn2fJGa5zgOrVNOw2J5taG1Orx6uNgZI=,tag:H9JXu9gzyyvTPWgXaoTsiw==,type:str]
hermes: ENC[AES256_GCM,data:9A2T2LIeVGo805k5E8wPHmqfjqQ6Dp7srQrVXHLsJRk+9N9bo2pMZUvAZm9FI89zPyK7tMnmLd56Jwf+W+mmQqbupnmN66jxOxOaB0MQ9/6/1oNHvaii337ed6fviLy6hx24pEOpY3OXwSEdNftwJqzc7YXLZK3UX8thhDDdxd0TSj3VUBd0ZHDWd4NpsgtjRRyVDBjHsnF0vzSZXtomithnHqeVHpp/jWPc+ZGrpnVvU8wxNMGLlDtr4A==,iv:dYCaTygVp1hqunPmBcNaYr7JxrdxfH1pcBE6B5HMgzk=,tag:/fddnR3n6+erzWF+m/bgGQ==,type:str]
sops:
age:
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA3Qkh0cmdHNGJTYmFNUFZW
c244RjlyNjlrSWh1bG1IRFFFeFZZVzhaYVdBCmd1N3JNS0IzWDlUMUJSM0pYdi9L
MzlHRk1pZ1hqaVdIYUQwczh2VDVtZE0KLS0tIEtRYWF6V0I3eDBZSnVmZ2R5S0Z5
Z3hhRitmdEwxbzcrS0cwNTZVK1lXYlUKSFfKk7JGzxRq9weL4NKJqfmAige2O+1T
59PvEFKvvkGb6ajkzwTw0lB3UFzly6FuTnbSLY9r+oT9AMbxLoKdcQ==
-----END AGE ENCRYPTED FILE-----
recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBOYlZiak1CSW1NSGt5QTRi
RjlUeG5EODVkTVJDY1RrZXJ6OU5NQ0RIOG5jCnJxZ1R6MmlGWXY2SmtaY1pQSWdZ
UWp3L2h6c0k0MVpubE9BRSswUEk3ZkkKLS0tIGN4Zm1tcHBiKzAyYWNHVktVZmpU
V3h4dUZLcktrTUZvUm44eVZOWEl4VmMKMTvajoWcktb4jVIP4HyzQiR41Wg8Gdqi
TLKEYsPQgOJ7s8P9gw2uPUY6HRz86CtiC6EbO27u0+8BbI85x1QScg==
-----END AGE ENCRYPTED FILE-----
recipient: age1huqa3hc7wcxk4dpelrzny437nzrx4fnll3d8g9ahznzk268yju5qufapxy
lastmodified: "2026-09-16T14:20:26Z"
mac: ENC[AES256_GCM,data:I33KZL3u+7jfOFu0qn4LVx2nACiURSd6RcEn0ojfT62yC/TcXlGGu4QeN1Dx4Nta77n/h8RzDTcZtiUJylLhiVBmqyMOoNaBOmLDJ+P1L7weYLoWMoaDP7IWyzttGkNTgvyv2nW5IxbdcTZwrcSlPtdupsJeNy76ATHO+eUsvGQ=,iv:FvQKGH5Vzm36huGDnMr15wQL9vsH2hsAhvu0BE/NfEI=,tag:fzAzzgmv3vjWs1VYhh4GeA==,type:str]
unencrypted_suffix: _unencrypted
version: 3.13.3

View File

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

View File

@@ -1,83 +0,0 @@
{inputs, ...}: {
flake.modules.nixos.canopus = {
config,
lib,
...
}: let
hasOptinPersistence = config.tnix.boot.impermanence.enable;
in {
imports = [
inputs.disko.nixosModules.disko
];
disko.devices.disk.primary = {
device = "/dev/nvme0n1";
type = "disk";
content = {
type = "gpt";
partitions = {
ESP = {
size = "1G";
type = "EF00";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
mountOptions = [
"defaults"
"umask=0077"
];
};
};
swap = {
size = "32G";
content = {
type = "swap";
discardPolicy = "both";
resumeDevice = true;
};
};
root = {
size = "100%";
type = "8300";
content = {
type = "btrfs";
# Base subvolumes that always exist
subvolumes =
{
"/root" = {
mountOptions = [
"compress=zstd"
"noatime"
"space_cache=v2"
];
mountpoint = "/";
};
"/nix" = {
mountOptions = [
"compress=zstd"
"noatime"
"noacl"
"space_cache=v2"
];
mountpoint = "/nix";
};
}
# Conditionally merge /persist only when impermanence is enabled
// lib.optionalAttrs hasOptinPersistence {
"/persist" = {
mountOptions = [
"compress=zstd"
"noatime"
"space_cache=v2"
];
mountpoint = "/persist";
};
};
};
};
};
};
};
};
}

View File

@@ -1,150 +0,0 @@
{
inputs,
config,
...
}: {
flake.modules.nixos.canopus = {
lib,
pkgs,
system,
...
} @ innerArgs: {
imports = with config.flake.modules.nixos;
[
hardware
]
++ [
inputs.nixos-hardware.nixosModules.asus-zephyrus-ga503
inputs.cardwire.nixosModules.default
];
boot.kernelParams = ["nvidia-drm.modeset=1"];
boot.initrd.availableKernelModules = [
"nvme"
"xhci_pci"
"ahci"
"usbhid"
"usb_storage"
"sd_mod"
];
boot.initrd.kernelModules = [];
boot.kernelModules = ["kvm-amd"];
boot.extraModulePackages = [];
hardware = {
nvidia = {
modesetting.enable = true;
open = false;
nvidiaSettings = true;
};
cpu.amd.updateMicrocode = lib.mkDefault innerArgs.config.hardware.enableRedistributableFirmware;
};
services = {
xserver.videoDrivers = ["nvidia"];
power-profiles-daemon.enable = true;
upower.enable = true;
cardwire = {
enable = true;
settings = {
auto_apply_gpu_state = true;
experimental_nvidia_block = true;
battery_auto_switch = true;
battery_auto_switch_mode = "hybrid";
};
};
asusd = {
enable = true;
asusdConfig.text = ''
(
charge_control_end_threshold: 80,
disable_nvidia_powerd_on_battery: true,
ac_command: "",
bat_command: "",
platform_profile_linked_epp: true,
platform_profile_on_battery: Quiet,
platform_profile_on_ac: Performance,
change_platform_profile_on_battery: true,
change_platform_profile_on_ac: true,
profile_quiet_epp: Power,
profile_balanced_epp: BalancePower,
profile_custom_epp: Performance,
profile_performance_epp: Performance,
ac_profile_tunings: {},
dc_profile_tunings: {},
armoury_settings: {},
)
'';
profileConfig.text = ''
(
active_profile: Quiet,
)
'';
fanCurvesConfig.text = ''
(
profiles: (
balanced: [
(
fan: CPU,
pwm: (20, 40, 60, 85, 110, 140, 170, 200),
temp: (45, 55, 62, 68, 74, 80, 86, 92),
enabled: true,
),
(
fan: GPU,
pwm: (20, 40, 60, 85, 110, 140, 170, 200),
temp: (45, 55, 62, 68, 74, 80, 86, 92),
enabled: true,
),
],
performance: [
(
fan: CPU,
pwm: (35, 60, 90, 120, 150, 180, 220, 255),
temp: (45, 55, 62, 68, 74, 80, 86, 92),
enabled: true,
),
(
fan: GPU,
pwm: (35, 60, 90, 120, 150, 180, 220, 255),
temp: (45, 55, 62, 68, 74, 80, 86, 92),
enabled: true,
),
],
quiet: [
(
fan: CPU,
pwm: (0, 10, 20, 35, 55, 80, 110, 140),
temp: (45, 55, 62, 68, 74, 80, 86, 92),
enabled: true,
),
(
fan: GPU,
pwm: (0, 10, 20, 35, 55, 80, 110, 140),
temp: (45, 55, 62, 68, 74, 80, 86, 92),
enabled: true,
),
],
custom: [],
),
)
'';
};
};
networking.useDHCP = lib.mkDefault true;
nixpkgs.config.cudaSupport = true;
nixpkgs.hostPlatform = lib.mkDefault system;
environment.systemPackages = with pkgs; [
nvtopPackages.full
];
};
}

View File

@@ -1,85 +0,0 @@
{config, ...}: {
flake.modules.homeManager.canopus = {pkgs, ...}: {
imports = with config.flake.modules.homeManager; [
desktop
];
tnix = {
desktop = {
mangowm = {
enable = true;
monitorRule = [
"name:eDP-1, width:2560, height:1440, refresh:165, x:0, y:0, vrr:1"
];
tagRule = [
"id:1, layout_name:tile"
"id:2, layout_name:tile"
"id:3, layout_name:tile"
"id:4, layout_name:tile"
"id:5, layout_name:scroller"
];
};
};
services.lan-mouse = {
enable = true;
settings = {
authorized_fingerprints = {
"f4:4b:17:61:f7:01:a4:a2:e1:c7:8c:1c:7a:f3:8b:87:14:3d:05:3d:a0:8b:cc:e7:88:d8:d8:d2:a4:c2:75:8b" = "sirius";
};
};
};
};
home.packages = with pkgs; [
(writeShellScriptBin "mirror-display" ''
hyprctl eval 'hl.monitor({
output = "eDP-1",
mode = "2560x1440@165",
position = "0x0",
scale = "1",
disabled = false
})' &&
hyprctl eval 'hl.monitor({
output = "HDMI-A-1",
mode = "preferred",
position = "auto",
scale = "1",
mirror = "eDP-1"
})'
'')
(writeShellScriptBin "extend-display" ''
hyprctl eval 'hl.monitor({
output = "eDP-1",
mode = "2560x1440@165",
position = "0x0",
scale = "1",
disabled = false
})' &&
hyprctl eval 'hl.monitor({
output = "HDMI-A-1",
mode = "preferred",
position = "0x-1440",
scale = "1",
mirror = ""
})'
'')
(writeShellScriptBin "dock-display" ''
hyprctl eval 'hl.monitor({
output = "eDP-1",
disabled = true
})' &&
hyprctl eval 'hl.monitor({
output = "HDMI-A-1",
mode = "preferred",
position = "0x0",
scale = "1",
mirror = ""
})'
'')
];
home.stateVersion = "26.05";
};
}

View File

@@ -1,31 +0,0 @@
tux-password: ENC[AES256_GCM,data:Xb4/JMAZCBnBheDCJdRRGXLnMJ1ej8HbN+AUqA/+2sdYESKeF1PFny4Iq2kqvzdK4D3mp+pdjd7GAGfJp4M7sOcvI3V/coyxPQ==,iv:h+S+MEwHj22uHaTzFoxGZtefNUAQNp3fbU+QRfgtKvQ=,tag:VHrIEIQivPFTfhmm7dWEyQ==,type:str]
gemini-api-key: ENC[AES256_GCM,data:Q6+actg0oyUWiUJVy/9yZmea1QyGu2o8LfMsuAVFD6k7kp0dYIrl,iv:ukyouqrHxzVpBBE98KL6PW8P3j+seemm/e0Gl1urUcM=,tag:Z7MM3dJ414CmdxE72cdzNA==,type:str]
openrouter-api-key: ENC[AES256_GCM,data:SalhWKR6artX/kOVKZGpKSmrgsQDU/heshrdkK3wotOZ3BRn/ZqZRBldvl1JPSenMAMvE2LWUdmBQmwG/id7L7JL1O/+lUHIQw==,iv:hLlHayFJgUkWOirVLfqP0pGRBZAqGKe+EE2yG1ELGNk=,tag:0qoo0tb+xWjjQXr4n1qGmw==,type:str]
opencode-go-api-key: ENC[AES256_GCM,data:zbeTcaXJZFVfYnM/7sgblJFU9WfeosX/44KsXvrzKwiLPfGLLYYo9AFaCvWzzG6jHuSZC5OYrBWfOZv4+3omfCgglQ==,iv:LscUQE+PNhXGim9PSqc9nZIZichWSgAn/zsNxQ/HM/o=,tag:MaBCobnRM42fopiibibe5Q==,type:str]
zai-coding-plan-api-key: ENC[AES256_GCM,data:osUoFOvBgu+PtNiTIDIm3JoxsBJnQ9I8zY//9oeTpJxIvMctSWYnT4GYP4oI5mClZg==,iv:z5qxUPomGF1avLyk8PrAS3t+34ZGlQMRjbxVJ4JH9Cc=,tag:Qbz/LYAMXejXU4RS3RUPqA==,type:str]
netbird-key: ENC[AES256_GCM,data:swmaa+RjxeUmEl8hS2riGrW4lP5jdks9HM3x57/FLpOuqFtR,iv:MrpVjiocrPi+dBGPk7pwgSUNlJ1eryRpMjC8+jkU+T0=,tag:j6sqpQ02apqc6FwkdDvk9g==,type:str]
vicinae-json: ENC[AES256_GCM,data:FarBf6l8pl3hF7kGKPIWztUhwiKoQXmyTufCuJ120K/bPh1Bfiyi+ETt4DLYOGI6FJXfpVz4BbZOA29bXTLhVPxH0QtyBu/F5uEqA015b/c8VevDJSyy9huR13qO9ksLbMBt8RfWbAd9j26t7A1C8/mMyiJOEXCCTV9CEIW3xWrsYmhwsT8RYM+PwrPSeN1gQXHSMyRUjf/kOdJoda8+iXpLfjo4II4r2ELpbqi8QxhrRdsJsoOfAymFM784NtlTjE+h6S4TMehmoF/9ARif6I5SGQ0WfIKt/8orTGCPllL+NupLziSnpIGRGSybdArD+o5NCw59GOAbVRADxq8rCESwEkq3cF+hm8HabfYbiQ==,iv:Y/hXLFTJT3gNF3B6tgKoAh7njVuneoUzjVTlsCZiySw=,tag:2hfrwph6IccJdRu/yGu3XA==,type:str]
sops:
age:
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqS2RZdVJaNTlRamZPMkll
MDRVSVl1b2x2LzZpdlBrdmZtdyt3UE15RldRCldXUXE2a1BFeHg5NGNPbW5IMDht
cHN1QituOU9uWFQwNS9udzNEbVhtUjQKLS0tIEtkTXhlYS9XSUlQRTY1eXBjeXZQ
bThQTFdZU29ISm93TWcwVk5ZTkhRWm8KCcprmLGhahgDkXCBpzjctHgao+gc+rKC
xLIwheUyFJOGK+ixqcdoZ/PC0kY68hVLt1YzLAyxFi4Ur1wltPrNug==
-----END AGE ENCRYPTED FILE-----
recipient: age14vktfes95f33vuefwnmuvryas7az04u76dsgyhfvsx73czkvmp2q7njkl4
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGVW13WFE1Ylh3Uk1HNU1i
bU9kRzFqTmhkQlRzMlRkM0VhMlNmMDUyK25NCkZYUStxM2tScGozRXJGekxGa1RX
b1VXK0Y2Z1U0YU9XRmxRUWdWem50L1EKLS0tIFovcHRlZ1JJd2lRN0RFbHdCdm9m
V1N3eUVjZ0VZRjBZdXRPNng3Y3JoUTAKQau9CG9XfvM+5JZVRwaJr/o/sXMaJiy2
wo2YcDb+4vfT4Wr+/8J3ccQgbLRZH916X5ZPL+A+nFyVXVKOCl3ENg==
-----END AGE ENCRYPTED FILE-----
recipient: age1x36yr8h993srfj29sfpzt4wyz52nztvncpmhgmfs0j26qvfecq3qvcm0an
lastmodified: "2026-09-16T14:20:36Z"
mac: ENC[AES256_GCM,data:mhJvvn/+VBfNrP1pXRweLSNVlHq9/DLDcKQv8k9ZVsEcd077ifEAqduOXVKXcXDM0VTuBzArw9hmih+kZbCHoUZAQrk8LF7FC4a4FFwXG9p45uKWbUloTuq5w3MCxyU8IoyiAufZcWUlYFQjZ8K4n8N0bVrGQGHogemnrBXTUIo=,iv:H3tKQOuIe/pEIp0pUWCSar8VDompXNZ4BZfD1Wg4pb0=,tag:lyPR4Prlal1bpSRLmGfy7A==,type:str]
unencrypted_suffix: _unencrypted
version: 3.13.3

View File

@@ -1,166 +1,99 @@
{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
gaming
virtualisation
];
tnix = { imports = with config.flake.modules.nixos; [
networking
desktop
virtualisation
];
tnix = {
services.openssh.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;
};
openrouter_api_key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
opencode_go_api_key = {
sopsFile = ./secrets.yaml;
owner = userName;
};
"vicinae.json" = {
sopsFile = ./secrets.yaml;
owner = userName;
};
};
# --- Boot ---
boot = { boot = {
secure-boot.enable = true; loader = {
systemd-boot.enable = true;
impermanence = { efi.canTouchEfiVariables = true;
enable = true;
home = {
directories = [
"Distrobox"
".steam"
".bun"
".rustup"
".agents"
".cache/awww"
".cache/serpantinum"
".config/BraveSoftware"
".config/zed"
".config/Vencord"
".config/vesktop"
".config/sops"
".config/nix"
".config/coderv2"
".config/obs-studio"
".config/easyeffects"
".config/DankMaterialShell"
".local/share/Steam"
".local/share/lutris"
".local/share/net.lutris.Lutris"
".local/share/nvim"
".local/share/opencode"
".local/share/zsh"
".local/share/zoxide"
".local/share/voxtype"
".local/state/lazygit"
".local/share/vicinae"
".local/share/TelegramDesktop"
".local/share/GalaxyBudsClient"
".local/state/serpantinum"
".local/share/zed"
".claude"
".orca"
".config/orca"
".zcode"
".config/ZCode"
".pi/agent/sessions"
".omp"
];
files = [
".wakatime.cfg"
".config/lan-mouse/lan-mouse.pem"
".claude.json"
".config/gh/hosts.yml"
];
};
}; };
kernelPackages = pkgs.linuxKernel.packages.linux_zen;
kernelParams = [ "nvidia-drm.modeset=1" ];
}; };
# --- 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;
# --- Hardware / GPU ---
hardware = {
nvidia = {
modesetting.enable = true;
open = false;
nvidiaSettings = true;
};
};
nixpkgs.config.cudaSupport = true;
services.xserver.videoDrivers = [ "nvidia" ];
environment.systemPackages = with pkgs; [ nvtopPackages.full ];
# !!! 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,23 @@
{
inputs,
config,
...
}:
let
hostName = "sirius";
userName = "tux";
userEmail = "t@tux.rs";
system = "x86_64-linux";
unstable = true;
nixpkgs = if unstable then inputs.nixpkgs else inputs.nixpkgs-stable;
in
{
flake.nixosConfigurations."${hostName}" = nixpkgs.lib.nixosSystem {
inherit system;
specialArgs = { inherit hostName userName userEmail; };
modules = [
config.flake.modules.nixos.core
config.flake.modules.nixos.${hostName}
];
};
}

View File

@@ -1,83 +0,0 @@
{inputs, ...}: {
flake.modules.nixos.sirius = {
config,
lib,
...
}: let
hasOptinPersistence = config.tnix.boot.impermanence.enable;
in {
imports = [
inputs.disko.nixosModules.disko
];
disko.devices.disk.primary = {
device = "/dev/nvme1n1";
type = "disk";
content = {
type = "gpt";
partitions = {
ESP = {
size = "1G";
type = "EF00";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
mountOptions = [
"defaults"
"umask=0077"
];
};
};
swap = {
size = "70G";
content = {
type = "swap";
discardPolicy = "both";
resumeDevice = true;
};
};
root = {
size = "100%";
type = "8300";
content = {
type = "btrfs";
# Base subvolumes that always exist
subvolumes =
{
"/root" = {
mountOptions = [
"compress=zstd"
"noatime"
"space_cache=v2"
];
mountpoint = "/";
};
"/nix" = {
mountOptions = [
"compress=zstd"
"noatime"
"noacl"
"space_cache=v2"
];
mountpoint = "/nix";
};
}
# Conditionally merge /persist only when impermanence is enabled
// lib.optionalAttrs hasOptinPersistence {
"/persist" = {
mountOptions = [
"compress=zstd"
"noatime"
"space_cache=v2"
];
mountpoint = "/persist";
};
};
};
};
};
};
};
};
}

View File

@@ -1,61 +1,48 @@
{ {
inputs, flake.modules.nixos.sirius =
config, {
... config,
}: { lib,
flake.modules.nixos.sirius = { ...
lib, }:
pkgs, {
system, boot.initrd.availableKernelModules = [
... "nvme"
} @ innerArgs: { "xhci_pci"
imports = with config.flake.modules.nixos; "ahci"
[ "usbhid"
hardware "usb_storage"
] "sd_mod"
++ [
inputs.cardwire.nixosModules.default
]; ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ];
boot.kernelParams = ["nvidia-drm.modeset=1"]; fileSystems."/" = {
boot.initrd.availableKernelModules = [ device = "/dev/disk/by-uuid/d856ed98-6841-4cbf-89be-e08c6f48b9ea";
"nvme" fsType = "ext4";
"xhci_pci"
"ahci"
"usbhid"
"usb_storage"
"sd_mod"
];
boot.initrd.kernelModules = [];
boot.kernelModules = ["kvm-amd"];
boot.extraModulePackages = [];
hardware = {
nvidia = {
modesetting.enable = true;
open = false;
nvidiaSettings = true;
}; };
cpu.amd.updateMicrocode = lib.mkDefault innerArgs.config.hardware.enableRedistributableFirmware; fileSystems."/boot" = {
}; device = "/dev/disk/by-uuid/7FE1-55C5";
fsType = "vfat";
services = { options = [
xserver.videoDrivers = ["nvidia"]; "fmask=0077"
power-profiles-daemon.enable = true; "dmask=0077"
];
cardwire = {
enable = true;
settings.auto_apply_gpu_state = true;
}; };
swapDevices = [ { device = "/dev/disk/by-uuid/69794aa5-51a9-4816-8d45-7791505165d4"; } ];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's
# still possible to use this option, but it's recommended to use it in conjunction
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
networking.useDHCP = lib.mkDefault true;
# networking.interfaces.eno1.useDHCP = lib.mkDefault true;
# networking.interfaces.wlp10s0f3u2i2.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}; };
networking.useDHCP = lib.mkDefault true;
nixpkgs.config.cudaSupport = true;
nixpkgs.hostPlatform = lib.mkDefault system;
environment.systemPackages = with pkgs; [
nvtopPackages.full
];
};
} }

View File

@@ -1,53 +1,21 @@
{config, ...}: { { config, ... }:
{
flake.modules.homeManager.sirius = { flake.modules.homeManager.sirius = {
imports = with config.flake.modules.homeManager; [ imports = with config.flake.modules.homeManager; [
desktop desktop
]; ];
tnix = { tnix.services.lan-mouse = {
desktop = { enable = true;
mangowm = { settings = {
enable = true; clients = [
monitorRule = [ {
"name:DP-2, width:1440, height:2560, refresh:144, x:0, y:0, vrr:0, rr:1" position = "bottom";
"name:DP-3, width:2560, height:1440, refresh:144, x:1440, y:0, vrr:0" hostname = "canopus";
"name:DP-1, width:1080, height:1920, refresh:144, x:4000, y:0, vrr:0, rr:3" activate_on_startup = true;
]; ips = [ "192.168.8.2" ];
}
tagRule = [ ];
"id:1, layout_name:vertical_tile, monitor_name:DP-2, no_hide:1"
"id:2, layout_name:vertical_tile, monitor_name:DP-2, no_hide:1"
"id:3, layout_name:vertical_tile, monitor_name:DP-2, no_hide:1"
"id:4, layout_name:vertical_tile, monitor_name:DP-2, no_hide:1"
"id:5, layout_name:vertical_tile, monitor_name:DP-2, no_hide:1"
"id:1, layout_name:tile, monitor_name:DP-3, no_hide:1"
"id:2, layout_name:tile, monitor_name:DP-3, no_hide:1"
"id:3, layout_name:tile, monitor_name:DP-3, no_hide:1"
"id:4, layout_name:tile, monitor_name:DP-3, no_hide:1"
"id:5, layout_name:tile, monitor_name:DP-3, no_hide:1"
"id:1, layout_name:vertical_tile, monitor_name:DP-1, no_hide:1"
"id:2, layout_name:vertical_tile, monitor_name:DP-1, no_hide:1"
"id:3, layout_name:vertical_tile, monitor_name:DP-1, no_hide:1"
"id:4, layout_name:vertical_tile, monitor_name:DP-1, no_hide:1"
"id:5, layout_name:vertical_tile, monitor_name:DP-1, no_hide:1"
];
};
};
services.lan-mouse = {
enable = true;
settings = {
clients = [
{
position = "bottom";
hostname = "canopus";
activate_on_startup = true;
ips = ["192.168.8.2"];
}
];
};
}; };
}; };

View File

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

View File

@@ -1,51 +0,0 @@
{config, ...}: {
flake.modules.nixOnDroid.vega = {
pkgs,
userEmail,
...
}: {
imports = with config.flake.modules.nixOnDroid; [
networking
];
# @TODO: Broken currently
# android-integration.am.enable = true;
# android-integration.termux-open-url.enable = true;
# android-integration.xdg-open.enable = true;
# android-integration.termux-setup-storage.enable = true;
# android-integration.termux-reload-settings.enable = true;
terminal.font = let
firacode = pkgs.nerd-fonts.fira-code;
fontPath = "share/fonts/truetype/NerdFonts/FiraCode/FiraCodeNerdFont-Regular.ttf";
in "${firacode}/${fontPath}";
time.timeZone = "Asia/Kolkata";
tnix.networking.openssh = {
enable = true;
ports = [8033];
authorizedKeys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL+OzPUe2ECPC929DqpkM39tl/vdNAXfsRnmrGfR+X3D ${userEmail}"
];
};
user = {
uid = 10481;
gid = 10481;
shell = "${pkgs.zsh}/bin/zsh";
};
environment.etcBackupExtension = ".backup";
environment.motd = "";
environment.packages = with pkgs; [
ncurses
procps
util-linux
rsync
gnutar
];
system.stateVersion = "24.05";
};
}

View File

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

View File

@@ -1,84 +0,0 @@
{inputs, ...}: {
flake.modules.nixos.vps = {
config,
lib,
...
}: let
hasOptinPersistence = config.tnix.boot.impermanence.enable;
isLegacy = config.tnix.boot.legacy.enable;
in {
imports = [
inputs.disko.nixosModules.disko
];
disko.devices.disk.primary = {
device = "/dev/sda";
type = "disk";
content = {
type = "gpt";
partitions =
{
ESP = {
size = "1G";
type = "EF00";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
mountOptions = [
"defaults"
"umask=0077"
];
};
};
root = {
size = "100%";
type = "8300";
content = {
type = "btrfs";
# Base subvolumes that always exist
subvolumes =
{
"/root" = {
mountOptions = [
"compress=zstd"
"noatime"
"space_cache=v2"
];
mountpoint = "/";
};
"/nix" = {
mountOptions = [
"compress=zstd"
"noatime"
"noacl"
"space_cache=v2"
];
mountpoint = "/nix";
};
}
# Conditionally merge /persist only when impermanence is enabled
// lib.optionalAttrs hasOptinPersistence {
"/persist" = {
mountOptions = [
"compress=zstd"
"noatime"
"space_cache=v2"
];
mountpoint = "/persist";
};
};
};
};
}
// lib.optionalAttrs isLegacy {
boot = {
name = "boot";
size = "1M";
type = "EF02";
};
};
};
};
};
}

View File

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

View File

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

View File

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

View File

@@ -1,32 +0,0 @@
{
flake.modules.nixos.boot = {
config,
lib,
...
}: let
cfg = config.tnix.boot;
in {
options.tnix.boot.legacy = {
enable = lib.mkEnableOption "legacy boot (GRUB) instead of systemd-boot";
};
config = lib.mkMerge [
{
boot.binfmt.emulatedSystems = ["aarch64-linux"];
boot.loader = {
timeout = 1;
efi.canTouchEfiVariables = true;
};
}
(lib.mkIf (!cfg.legacy.enable && !cfg.secure-boot.enable) {
boot.loader.systemd-boot.enable = true;
})
(lib.mkIf cfg.legacy.enable {
boot.loader.grub.enable = true;
})
];
};
}

View File

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

View File

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

View File

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

View File

@@ -1,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,12 +0,0 @@
{inputs, ...}: {
flake.modules.nixos.core = {pkgs, ...}: {
imports = [
inputs.nix-index-database.nixosModules.default
];
programs = {
nix-index.package = pkgs.nix-index-small;
nix-index-database.comma.enable = true;
};
};
}

View File

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

View File

@@ -1,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,47 @@
{ {
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 { {
programs.zsh.enable = true; 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 = config.sops.secrets.tux-password.path;
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,5 +1,6 @@
{ {
flake.modules.nixos.hardware = {pkgs, ...}: { flake.modules.nixos.desktop = {
security.rtkit.enable = true; security.rtkit.enable = true;
services.pipewire = { services.pipewire = {
@@ -9,10 +10,5 @@
pulse.enable = true; pulse.enable = true;
wireplumber.enable = true; wireplumber.enable = true;
}; };
environment.systemPackages = with pkgs; [
alsa-utils
pavucontrol
];
}; };
} }

View File

@@ -1,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 +0,0 @@
{
flake.modules.nixos.desktop = {pkgs, ...}: {
programs.gpu-screen-recorder = {
enable = true;
};
environment.systemPackages = with pkgs; [
gpu-screen-recorder-gtk
];
};
}

View File

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

View File

@@ -1,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

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

View File

@@ -1,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 +0,0 @@
{
flake.modules.nixos.desktop = {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 +0,0 @@
{
flake.modules.nixos.desktop = {pkgs, ...}: {
services = {
gvfs.enable = true;
tumbler.enable = true;
};
programs.thunar = {
enable = true;
plugins = with pkgs; [
thunar-archive-plugin
thunar-volman
];
};
};
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,27 +0,0 @@
{
flake.modules.nixos.networking = {
config,
lib,
...
}:
with lib; let
cfg = config.tnix.networking.newt;
in {
options.tnix.networking.newt = {
enable = mkEnableOption "Newt";
environmentFile = mkOption {
type = types.nullOr types.path;
default = null;
description = "Environment file with secrets passed to Newt";
};
};
config = mkIf cfg.enable {
services.newt = {
enable = true;
environmentFile = cfg.environmentFile;
};
};
};
}

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