Compare commits

..

2 Commits

Author SHA1 Message Date
doloro d10b195c7e meow 2026-04-30 11:43:18 +01:00
doloro 119148c764 swapped out flake 2026-04-30 11:35:18 +01:00
55 changed files with 832 additions and 2747 deletions
-144
View File
@@ -1,144 +0,0 @@
# Doloro's Dotfiles
NixOS dotfiles managed via **flake-parts** + **den** (custom flake framework). Multi-host: desktop, laptop, WSL, RPi5 server.
## Architecture
```
dotfiles/
├── flake.nix # Entry point: `outputs = inputs.flake-parts.lib.mkFlake { inherit inputs; } (inputs.import-tree ./config);`
├── .sops.yaml # Age-encrypted secrets (6 keys: desktop/laptop user+system, rpi5)
├── config/
│ ├── dendritic.nix # Root config import
│ ├── inputs.nix # Flake input definitions
│ ├── namespace.nix # Namespace setup
│ ├── defaults.nix # Default values
│ ├── hosts/
│ │ ├── computers.nix # desktop (x86_64), laptop (aarch64), wsl (aarch64), doloro-bootable
│ │ ├── servers.nix # rpi5 (aarch64)
│ │ └── aspects/ # Host-specific configurations
│ │ ├── doloro-shared.nix # Common to all doloro hosts (nixvim, tmux, git, ssh, hyfetch)
│ │ ├── doloro-desktop/ # Desktop-specific (disko, hardware, home, host)
│ │ ├── doloro-laptop/ # Laptop-specific (disko, hardware, home, host, power-management)
│ │ ├── doloro-wsl/ # WSL-specific (home, host)
│ │ ├── doloro-bootable/ # Bootable USB (home, host)
│ │ └── servers/rpi5.nix # Raspberry Pi 5
│ └── modules/ # Reusable configuration modules
│ ├── ai/ # AI tools (pi-coding-agent, OpenMeteo)
│ ├── gaming/ # Steam, gamemode, gamepad
│ ├── hyprland/ # Window manager
│ ├── niri/ # Alternative WM
│ ├── nixvim/ # Neovim config
│ ├── power-management/ # TLP, auto-cpufreq, battery targets
│ ├── secrets/ # SOPS-managed secrets
│ ├── services/ # Caddy, DDNS, Home Assistant, Traefik, RTMP
│ └── ...
```
## Hosts
| Host | Arch | Type | Key Modules |
| ------ | ------ | ------ | ------------- |
| `desktop` | x86_64 | NixOS + HM | Hyprland, gaming, disko, full stack |
| `laptop` | aarch64 | NixOS + HM | Power management, Hyprland |
| `wsl` | aarch64 | NixOS | WSL setup |
| `doloro-bootable` | x86_64 | NixOS | Bootable USB recovery |
| `rpi5` | aarch64 | NixOS | Server, no GUI |
## Key Tools & Stack
- **Window Manager**: Hyprland (primary), Niri (alternative)
- **Editor**: Nixvim (Neovim) — Gruvbox Material, LSP (rust-analyzer, nixd, tsserver), Treesitter, Lualine, Telescope, LazyGit
- **Shell**: Fish
- **AI**: Pi Coding Agent v0.81.1 (LiteLLM via `scuggo` proxy)
- Models: meow (litellm), claude-opus-4-8, gpt-5.5, gpt-5.4-mini (recap/title)
- Skills: pi-lens, pi-lean-ctx, pi-vitals, pi-spark, pi-caveman, pi-pretty, pi-context-engineering
- **Terminal**: Kitty
- **Browser**: Zen Browser, Helium
- **Music**: Spicetify (Spotify)
- **Aurora**: Stylix (themes), NixOS-Hardware
- **Container**: Podman
- **Flatpak**: nix-flatpak
- **Secrets**: SOPS + Age (6 keys for desktop/laptop user+system, rpi5)
- **Nerd Fonts**: Custom patched (Doloro1978/nix-nerd-fonts-patcher)
## Conventions
1. **Never edit `flake.nix` directly** — run `nix run .#write-flake` to regenerate
2. **Secrets** live in `config/modules/secrets/` — encrypted via SOPS age keys in `.sops.yaml`
3. **Modules** are modular: split by concern (ai, gaming, hyprland, power-management, services)
4. **Hosts** split into `computers.nix` and `servers.nix` — each host gets `aspect` references
5. **Shared config** lives in `doloro-shared.nix` — imported by all doloro hosts
6. **Disko** handles disk layouts for desktop/laptop
7. **Power management** is laptop-specific: TLP, auto-cpufreq, battery AC targets, Intel GPU, TDP
8. **CachyOS kernel** available as module for desktop
## Common Operations
```bash
# Apply configuration
sudo nixos-rebuild switch --flake .#desktop
# Home Manager (doloro user)
home-manager switch --flake .#doloro-desktop
# Update flake inputs
nix flake update
# Write regenerated flake.nix
nix run .#write-flake
# Encrypt a secret
nix run .#sops-encrypt <file>
# Enter development shell
nix develop
```
## Validating Config Changes
Standard validation sequence before relying on any edit to a `.nix` module (used for opencode, ai, and other module changes):
1. **Parse check** (fast, catches syntax/brace errors):
```bash
nix-instantiate --parse config/modules/ai/ai.nix >/dev/null && echo "PARSE OK"
```
2. **Hash verification** for any downloaded file pinned via `pkgs.fetchurl` — compute the sha256 locally and confirm it matches the `sha256` in the module:
```bash
nix hash file token-tracker.tsx # or: sha256sum token-tracker.tsx
```
3. **Flake evaluation** — full `nix flake check` may fail on unrelated pre-existing issues (e.g. `<den/primary-user>` not on NIX_PATH in pure mode). Distinguish pre-existing failures from edit-induced ones before touching the code. `nix flake show --impure` lists the configuration names (`nixosConfigurations: desktop, doloro-bootable, laptop, rpi5, wsl`).
4. **Runtime output check** — the generated config is a home-manager symlink into `/nix/store`. After a rebuild, confirm the live files actually contain the change:
```bash
readlink -f ~/.config/opencode/opencode.json # → /nix/store/...-opencode.json
rg -n "my-change" "$(readlink -f ~/.config/opencode/opencode.json)"
```
Also verify supporting files that the change depends on (plugins dir, extra packages, etc.):
```bash
ls -la ~/.config/opencode/plugins/ && readlink -f ~/.config/opencode/plugins/*.tsx
```
5. **Cache check** for npm-resolved opencode plugins — confirm opencode actually downloaded the package into its plugin cache:
```bash
ls ~/.cache/opencode/packages/ | rg "plugin-name"
```
If the package is absent or an old version, the plugin won't load regardless of config.
6. **Log check** — search opencode's log for plugin-load errors, filtering out your own tool-call noise:
```bash
rg -i "plugin" ~/.local/share/opencode/log/opencode.log | rg -v "evaluated permission" | tail -30
```
7. **Config is loaded once at startup** — a running opencode session keeps the config it loaded at launch. After changing any config file, restart opencode (and run a home-manager rebuild first) before expecting the change to take effect.
## Important Notes
- `allowUnfree = true` globally for proprietary packages (Steam, Spotify, etc.)
- Multiple cachix substitutes configured for speed (hyprland, nix-community, niri, raspberrypi, cuda)
- Pi coding agent uses `scuggo` LiteLLM proxy at `https://9f5db439.fwds.scug.io`
- API key via env var `$SCUG_IO_API_KEY`
- WSL host uses `nixos-wsl` flake input
- RPi5 uses `nixos-raspberrypi` and `raspberry-pi-nix`
## File Rules
- `.gitignore`: exclude `nix/result`, `result`, `nvim`, `tmux/plugins`, `modules/quickshell/quickshell/.qmlls.ini`
- `.new` file exists (empty) — likely a marker
- `.claude/` directory present (Claude Code config)
@@ -1,33 +0,0 @@
{
den,
modules,
inputs,
...
}:
{
den.aspects.doloro-bootable = {
includes = [
<den/primary-user>
den.aspects.doloro-shared
modules.nixvim
];
homeManager = {
pkgs,
lib,
...
}: {
home.packages = with pkgs; [
btrfs-progs
chntpw
ddrescue
fd
gpart
ntfs3g
parted
ranger
rsync
testdisk
];
};
};
}
@@ -1,77 +0,0 @@
{ den, modules, ... }:
{
den.aspects.doloro-bootable = {
nixos = {
pkgs,
lib,
...
}: {
networking.hostName = "doloro-recovery";
networking.networkmanager.enable = true;
services.openssh.enable = true;
boot.loader.grub.enable = true;
boot.loader.grub.device = "/dev/sda";
boot.loader.grub.efiSupport = true;
boot.loader.grub.efiInstallAsRemovable = true;
boot.initrd.availableKernelModules = [
"ata_piix"
"uhci_hcd"
"ehci_pci"
"xen_blkfront"
"sr_mod"
"nvme"
"virtio_pci"
"virtio_scsi"
];
nixpkgs.config.allowUnfree = true;
fileSystems."/" = {
device = "/dev/disk/by-label/nixos";
fsType = "ext4";
};
environment.systemPackages = with pkgs; [
btrfs-progs
btop
chntpw
ddrescue
e2fsprogs
fastfetch
fd
gpart
git
ntfs3g
parted
pavucontrol
pciutils
ranger
rsync
testdisk
util-linux
wl-clipboard
];
users.users.doloro = {
isNormalUser = true;
group = "doloro";
extraGroups = [ "wheel" "networkmanager" ];
initialPassword = "recovery";
};
users.groups.doloro = {};
security.sudo.wheelNeedsPassword = false;
services.getty.autologinUser = "doloro";
systemd.services."getty@tty1".enable = false;
systemd.services."autovt@tty1".enable = false;
services.xserver.enable = false;
system.stateVersion = "25.11";
};
};
}
+24 -90
View File
@@ -11,22 +11,17 @@
<den/primary-user> <den/primary-user>
den.aspects.doloro-shared den.aspects.doloro-shared
modules.sops modules.sops
modules.flatpaks
modules.gamemode
modules.hyprland modules.hyprland
modules.fish modules.fish
modules.tuigreet modules.tuigreet
modules.kitty modules.kitty
modules.nikpkgs
modules.fonts modules.fonts
modules.unity
<modules/hyprland/doloro-settings> <modules/hyprland/doloro-settings>
(modules.obs { (modules.obs {
audio = true; audio = true;
autostart = true; autostart = true;
}) })
<modules/common/gaming> <modules/common/gaming>
modules.hytale-launcher
# modules.helium # modules.helium
(<modules/helium> { (<modules/helium> {
default = true; default = true;
@@ -36,58 +31,38 @@
modules.quickshell modules.quickshell
modules.nix-ld modules.nix-ld
modules.spotify modules.spotify
# modules.easyeffects modules.easyeffects
# modules.lavd modules.lavd
<modules/ai/secrets> modules.ai
# modules.ai <modules/ai/ollama-cuda>
modules.pi-coding # inactive: swapped to opencode
# modules.omp
modules.podman
modules.wivrn
# <modules/ai/ollama-cuda>
]; ];
nixos = nixos =
{ { config, pkgs, ... }:
config,
pkgs,
...
}:
{ {
users.users.doloro = { users.users.doloro = {
shell = pkgs.fish; shell = pkgs.fish;
hashedPasswordFile = config.sops.secrets."doloro-hashed_password".path; hashedPasswordFile = config.sops.secrets."doloro-hashed_password".path;
extraGroups = [
"libvirtd"
"gamemode"
];
}; };
# Register GSettings schemas so GTK/GLib apps (orca-slicer) can find
# them; without this GLib aborts with "No GSettings schemas are
# installed on the system" on non-GNOME desktops.
programs.dconf.enable = true;
virtualisation.libvirtd.enable = false;
# virtualisation.waydroid.enable = true;
# # Newer kernel versions may need
# virtualisation.waydroid.package = pkgs.waydroid-nftables;
programs.virt-manager.enable = false;
}; };
homeManager = homeManager =
{ home, pkgs, ... }:
{ {
home, wayland.windowManager.hyprland.settings = {
pkgs, monitor = [
... "HDMI-A-1, 1920x1080@60, 0x0, 1"
}: "DP-3, 1920x1080@144, 1920x0, 1"
{ ];
xdg.configFile."hypr/hyprland-local.lua" = { exec-once = [
text = '' "hyprctl dispatch workspace 2" # shit solution to get quickshell on the right monitor
exec-once = hyprctl dispatch workspace 2 # shit solution to get quickshell on the right monitor ];
workspace = name:2, monitor:DP-2 workspace = [
input { "name:2, monitor:DP-3"
kb_layout = "gb" ];
follow_mouse = 2 input = {
sensitivity = -0.5 kb_layout = "gb";
} follow_mouse = 2;
''; sensitivity = -0.5;
};
}; };
home.packages = with pkgs; [ home.packages = with pkgs; [
equibop equibop
@@ -95,52 +70,11 @@
obsidian obsidian
# pear-desktop # pear-desktop
prismlauncher prismlauncher
# deadlock-mod-manager deadlock-mod-manager
inputs.nik-pkgs.packages.x86_64-linux.grimoire gamescope
# gamescope
android-studio android-studio
blender
qbittorrent
mpv
krita
# (tetrio-desktop.override { withTetrioPlus = true; })
# bottles
# orca-slicer's wrapGAppsHook does not actually wrap the installed
# binary, so neither the GSettings schema path nor the NVIDIA/zink
# workaround env from `withNvidiaGLWorkaround` reach the process.
# Wrap it ourselves: prepend the gtk3 + gsettings-desktop schema dirs
# to XDG_DATA_DIRS (fixes "No GSettings schemas are installed on the
# system") and set the zink GL workaround explicitly.
(pkgs.symlinkJoin {
name = "orca-slicer";
paths = [ (pkgs.orca-slicer.override { withNvidiaGLWorkaround = true; }) ];
nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = ''
wrapProgram $out/bin/orca-slicer \
--prefix XDG_DATA_DIRS : "${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}:${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}" \
--set __GLX_VENDOR_LIBRARY_NAME mesa \
--set __EGL_VENDOR_LIBRARY_FILENAMES /run/opengl-driver/share/glvnd/egl_vendor.d/50_mesa.json \
--set MESA_LOADER_DRIVER_OVERRIDE zink \
--set GALLIUM_DRIVER zink \
--set WEBKIT_DISABLE_DMABUF_RENDERER 1
'';
})
# prusa-slicer
];
programs.lutris.enable = true;
nixpkgs.overlays = [
# Skipping tests while upstream sorts it out, revert once
# Hydra consistently builds openldap green.
# (final: prev: {
# openldap = prev.openldap.overrideAttrs (_: {
# doCheck = false;
# });
# })
]; ];
nixpkgs.config.allowUnfree = true; nixpkgs.config.allowUnfree = true;
nixpkgs.config.problems.handlers = {
tetrio-plus.broken = "warn";
};
programs.home-manager.enable = true; programs.home-manager.enable = true;
}; };
}; };
+7 -54
View File
@@ -13,11 +13,7 @@
modules.nix modules.nix
]; ];
nixos = nixos =
{ { pkgs, config, ... }:
pkgs,
config,
...
}:
{ {
boot.loader.grub.enable = true; boot.loader.grub.enable = true;
boot.loader.grub.device = "nodev"; boot.loader.grub.device = "nodev";
@@ -38,36 +34,15 @@
"rd.systemd.show_status=auto" "rd.systemd.show_status=auto"
]; ];
services.openssh.enable = true; services.openssh.enable = true;
xdg.portal = { networking.networkmanager.enable = true;
enable = true;
configPackages = [ pkgs.xdg-desktop-portal-wlr ];
wlr = {
enable = true;
};
};
networking.networkmanager.enable = true;
networking.firewall.enable = false; networking.firewall.enable = false;
environment.systemPackages = with pkgs; [ polkit_gnome ]; security.rtkit.enable = true;
security.rtkit.enable = true; hardware.graphics = {
security.polkit.enable = true;
hardware.graphics = {
enable = true; enable = true;
extraPackages = with pkgs; [
libva-minimal
vulkan-loader
];
};
environment.sessionVariables = {
LIBVA_DRIVER_NAME = "nvidia";
NVD_BACKEND = "direct";
}; };
services.xserver.videoDrivers = [ "nvidia" ]; services.xserver.videoDrivers = [ "nvidia" ];
@@ -87,6 +62,7 @@ hardware.graphics = {
services.gnome.gnome-keyring.enable = true; services.gnome.gnome-keyring.enable = true;
hardware.nvidia = { hardware.nvidia = {
# Modesetting is required. # Modesetting is required.
modesetting.enable = true; modesetting.enable = true;
@@ -94,7 +70,7 @@ hardware.graphics = {
# Enable this if you have graphical corruption issues or application crashes after waking # Enable this if you have graphical corruption issues or application crashes after waking
# up from sleep. This fixes it by saving the entire VRAM memory to /tmp/ instead # up from sleep. This fixes it by saving the entire VRAM memory to /tmp/ instead
# of just the bare essentials. # of just the bare essentials.
powerManagement.enable = false; powerManagement.enable = true;
# Fine-grained power management. Turns off GPU when not in use. # Fine-grained power management. Turns off GPU when not in use.
# Experimental and only works on modern Nvidia GPUs (Turing or newer). # Experimental and only works on modern Nvidia GPUs (Turing or newer).
@@ -116,30 +92,7 @@ hardware.graphics = {
# Optionally, you may need to select the appropriate driver version for your specific GPU. # Optionally, you may need to select the appropriate driver version for your specific GPU.
package = config.boot.kernelPackages.nvidiaPackages.stable; package = config.boot.kernelPackages.nvidiaPackages.stable;
}; };
swapDevices = [
{
device = "/swapfile";
size = 8192;
}
];
boot.binfmt.emulatedSystems = [
"aarch64-linux"
];
services.scx = {
enable = true;
package = pkgs.scx.rustscheds;
};
systemd.services.scx.environment = {
SCX_SCHEDULER_OVERRIDE = "scx_lavd";
SCX_FLAGS_OVERRIDE = "--performance --no-core-compaction";
};
systemd.oomd = {
enable = true;
enableUserSlices = true;
enableRootSlice = true;
enableSystemSlice = true;
};
}; };
}; };
} }
+17 -14
View File
@@ -21,7 +21,6 @@
modules.stylix modules.stylix
modules.quickshell modules.quickshell
modules.lavd modules.lavd
modules.omp
# modules.podman # modules.podman
# modules.openvivo # modules.openvivo
]; ];
@@ -37,19 +36,23 @@
homeManager = homeManager =
{ pkgs, ... }: { pkgs, ... }:
{ {
xdg.configFile."hypr/hyprland-local.lua" = { wayland.windowManager.hyprland.settings = {
text = '' # monitor = [
decoration { # "eDP-1, 2880x1800@120, 0x0, 2"
blur { # ];
enabled = false input = {
} kb_layout = "gb";
} follow_mouse = 2;
input { sensitivity = 0;
kb_layout = "gb" };
follow_mouse = 2 decoration = {
sensitivity = 0 blur = lib.mkForce {
} enabled = false;
''; passes = 1;
new_optimizations = true;
ignore_opacity = false;
};
};
}; };
home.packages = with pkgs; [ home.packages = with pkgs; [
telegram-desktop telegram-desktop
+3 -3
View File
@@ -171,12 +171,12 @@
# "mem_sleep_default=deep" # "mem_sleep_default=deep"
# "i915.fastboot=1" # "i915.fastboot=1"
# "i915.modeset=1" # "i915.modeset=1"
"ahci.mobile_lpm_policy=1" # "ahci.mobile_lpm_policy=1"
# "intel_idle.max_cstate=10" # "intel_idle.max_cstate=10"
"processor.max_cstate=10" "processor.max_cstate=10"
"pci=noaer" "pci=noaer"
"quiet" # "quiet"
"splash" # "splash"
# "idle=halt" # "idle=halt"
]; ];
boot.binfmt.emulatedSystems = [ boot.binfmt.emulatedSystems = [
+19 -20
View File
@@ -3,7 +3,8 @@
modules, modules,
__findFile, __findFile,
... ...
}: { }:
{
den.aspects.doloro-shared = { den.aspects.doloro-shared = {
includes = [ includes = [
modules.nixvim modules.nixvim
@@ -13,25 +14,23 @@
modules.hyfetch modules.hyfetch
modules.ssh modules.ssh
]; ];
homeManager = { homeManager =
pkgs, { pkgs, lib, ... }:
lib, {
... home = {
}: { username = "doloro";
home = { homeDirectory = "/home/doloro";
username = "doloro"; packages = with pkgs; [
homeDirectory = "/home/doloro"; wl-clipboard
packages = with pkgs; [ # home-manager
wl-clipboard btop
# home-manager ];
btop };
pavucontrol programs.home-manager.enable = true;
]; };
nixos =
{ lib, ... }:
{
}; };
programs.home-manager.enable = true;
};
nixos = { lib, ... }: {
boot.kernelModules = [ "ntsync" ];
};
}; };
} }
-34
View File
@@ -1,34 +0,0 @@
{
den,
modules,
__findFile,
...
}: {
den.aspects.doloro-wsl = {
includes = [
<den/primary-user>
den.aspects.doloro-shared
modules.fish
modules.tmux
modules.nix
modules.omp
modules.hyfetch
modules.git
];
nixos = {
config,
pkgs,
...
}: {
users.users.doloro = {
isNormalUser = true;
shell = pkgs.fish;
uid = 1000;
# hashedPasswordFile = config.sops.secrets."doloro-hashed_password".path;
};
};
homeManager = {...}: {
};
};
}
-22
View File
@@ -1,22 +0,0 @@
{
den,
modules,
...
}: {
flake-file.inputs = {
};
den.aspects.wsl = {
includes = [
modules.wsl
modules.tmux
modules.nix
modules.omp
modules.hyfetch
modules.git
];
nixos = {lib, ...}: {
wsl.enable = true;
wsl.defaultUser = "doloro";
};
};
}
+16 -60
View File
@@ -11,70 +11,26 @@
# <modules/services/traefik> # <modules/services/traefik>
<modules/services/caddy> <modules/services/caddy>
<modules/services/home-assistant> <modules/services/home-assistant>
<modules/services/docker-registry>
<modules/services/ddns> <modules/services/ddns>
<modules/services/rtmp-to-whip>
]; ];
nixos = nixos = {
{ pkgs, ... }: networking.hostName = "nixos-001-rp5";
{
networking.hostName = "nixos-001-rp5";
fileSystems = { networking.firewall = {
"/" = { enable = true;
device = "/dev/disk/by-uuid/44444444-4444-4444-8888-888888888888"; allowedTCPPorts = [
fsType = "ext4"; 80
options = [ "noatime" ]; 443
}; 8080
"/boot/firmware" = {
device = "/dev/disk/by-uuid/2175-794E";
fsType = "vfat";
options = [ "noatime" ];
};
};
networking.firewall = {
enable = true;
allowedTCPPorts = [
80
443
8080
];
allowedUDPPortRanges = [ ];
};
system.activationScripts.docker-config-fix = ''
if [ -d /root/.docker/config.json ]; then
rm -rf /root/.docker/config.json
echo '{}' > /root/.docker/config.json
fi
'';
virtualisation.docker.enable = true;
virtualisation.docker.package = pkgs.docker;
virtualisation.docker.autoPrune = {
enable = true;
dates = "weekly";
flags = [
"--all"
"--volumes"
];
};
virtualisation.oci-containers.backend = "docker";
services.openssh.enable = true;
nixpkgs.hostPlatform = "aarch64-linux";
nix.gc = {
automatic = true;
};
};
homeManager =
{ pkgs, ... }:
{
home.packages = [
pkgs.btop
]; ];
allowedUDPPortRanges = [ ];
}; };
virtualisation.docker.enable = true;
virtualisation.oci-containers.backend = "docker";
services.openssh.enable = true;
nixpkgs.hostPlatform = "aarch64-linux";
};
}; };
} }
+4 -18
View File
@@ -3,7 +3,8 @@
__findFile, __findFile,
lib, lib,
... ...
}: { }:
{
# Homes # Homes
den.homes.x86_64-linux.doloro-desktop = { den.homes.x86_64-linux.doloro-desktop = {
aspect = "doloro-desktop"; aspect = "doloro-desktop";
@@ -13,9 +14,6 @@
den.homes.aarch64-linux.doloro-laptop = { den.homes.aarch64-linux.doloro-laptop = {
userName = "doloro"; userName = "doloro";
}; };
den.homes.aarch64-linux.doloro-wsl = {
userName = "doloro";
};
# Machines # Machines
den.hosts.x86_64-linux.desktop = { den.hosts.x86_64-linux.desktop = {
users.doloro = { users.doloro = {
@@ -30,25 +28,13 @@
home-manager.enable = true; home-manager.enable = true;
}; };
}; };
den.hosts.aarch64-linux.wsl = {
users.doloro = {
aspect = "doloro-wsl";
home-manager.enable = true;
};
};
den.hosts.x86_64-linux.doloro-bootable = { den.schema.user.classes = lib.mkDefault [ "homeManager" ];
users.doloro = {
aspect = "doloro-bootable";
homeManager.enable = true;
};
};
den.schema.user.classes = lib.mkDefault ["homeManager"];
# Fixes 'The option `flake.homeConfigurations' is defined multiple times while it's expected to be unique.' # Fixes 'The option `flake.homeConfigurations' is defined multiple times while it's expected to be unique.'
flake.options.homeConfigurations = lib.mkOption { flake.options.homeConfigurations = lib.mkOption {
type = lib.types.attrs; type = lib.types.attrs;
description = "Home Manager configurations for users."; description = "Home Manager configurations for users.";
}; };
} }
-1
View File
@@ -6,6 +6,5 @@
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
den.url = "github:vic/den?ref=8101ec865c0bf4027d40b9fd8951e3e435a86d64"; den.url = "github:vic/den?ref=8101ec865c0bf4027d40b9fd8951e3e435a86d64";
nixpkgs-master.url = "github:NixOS/nixpkgs/master";
}; };
} }
+2 -66
View File
@@ -11,73 +11,9 @@
}; };
}; };
homeManager = homeManager =
{ pkgs, config, ... }: { pkgs, ... }:
{ {
home.packages = [ home.packages = [ pkgs.opencode ];
pkgs.claude-code
pkgs.snip
];
programs.opencode = {
enable = true;
extraPackages = with pkgs; [
rust-analyzer
typescript-language-server
];
context = ''
Instructions:
- Do NOT preemptively load all references - use lazy loading based on actual need
- When loaded, treat content as mandatory instructions that override defaults
- Follow references recursively when needed
- NO EMOJIS
'';
settings = {
"lsp" = true;
plugin = [
"@tarquinen/opencode-dcp@latest"
"@xberg-io/opencode-xberg"
"@xberg-io/opencode-crawlberg"
"@xberg-io/opencode-html-to-markdown"
"@xberg-io/opencode-liter-llm"
"opencode-plugin-litellm@latest"
"@xberg-io/opencode-tree-sitter-language-pack"
# Token slimming: filters shell command output via snip CLI
# (https://github.com/VincentHardouin/opencode-snip)
"opencode-snip@latest"
# Replace/extend the per-model system prompt via
# ~/.config/opencode/system-prompts.json
# (https://github.com/kmcquade/opencode-sysprompt-override-plugin)
"opencode-sysprompt-override@latest"
];
provider.litellm = {
npm = "@ai-sdk/openai-compatible";
name = "LiteLLM (scuggo)";
options = {
baseURL = "https://9f5db439.fwds.scug.io/v1";
apiKey = "{env:SCUG_IO_API_KEY}";
};
};
# Built-in OpenCode Go provider (https://opencode.ai/zen/go) —
# key from sops secret opencode-go-zen-key via $OPENCODE_GO_API_KEY
provider.opencode-go = {
options = {
apiKey = "{env:OPENCODE_GO_API_KEY}";
};
};
};
# TUI plugin: token-tracker (https://github.com/eserete/opencode-token-tracker)
tui = {
plugin = [ "./plugins/token-tracker.tsx" ];
};
};
xdg.configFile."opencode/plugins/token-tracker.tsx" = {
source = pkgs.fetchurl {
url = "https://raw.githubusercontent.com/eserete/opencode-token-tracker/main/token-tracker.tsx";
sha256 = "a1d56f6d86f512ca2e81653a57ff372c2ea0a3398bcdbebda6de9f9ed89ee45a";
};
};
}; };
}; };
} }
-74
View File
@@ -1,74 +0,0 @@
// @ts-nocheck — jiti-loaded pi extension: package imports resolve via pi's
// extension loader aliases at runtime, not from this directory. No typecheck.
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { getBuiltinModels } from "@earendil-works/pi-ai/providers/all";
import type { Model } from "@earendil-works/pi-ai";
interface ProviderFilter {
/** Keep only models whose cost is all zero (free). */
freeOnly?: boolean;
/** Keep only these model ids. */
keep?: string[];
/** Drop these model ids. */
drop?: string[];
/** Keep only models whose id contains any of these substrings. */
keepIdContaining?: string[];
}
const isFree = (m: Model): boolean => {
const c = m.cost;
const baseFree =
c.input === 0 && c.output === 0 && c.cacheRead === 0 && c.cacheWrite === 0;
// A model with cost tiers is not free: tiers kick in above a token threshold.
return baseFree && !(c.tiers && c.tiers.length > 0);
};
const matches = (m: Model, f: ProviderFilter): boolean => {
if (f.freeOnly && !isFree(m)) return false;
if (f.keep && f.keep.length > 0 && !f.keep.includes(m.id)) return false;
if (f.drop && f.drop.includes(m.id)) return false;
if (f.keepIdContaining && f.keepIdContaining.length > 0) {
if (!f.keepIdContaining.some((s) => m.id.includes(s))) return false;
}
return true;
};
export default function (pi: ExtensionAPI): void {
const configPath = path.join(
os.homedir(),
".pi",
"agent",
"model-filters.json",
);
let config: { providers?: Record<string, ProviderFilter> };
try {
config = JSON.parse(fs.readFileSync(configPath, "utf8"));
} catch {
return; // no config, no-op
}
for (const [providerId, filter] of Object.entries(config.providers ?? {})) {
const all = getBuiltinModels(providerId);
if (all.length === 0) {
console.warn(
"[model-filter] no built-in catalog for provider: " + providerId,
);
continue;
}
const models = all.filter((m) => matches(m, filter));
// registerProvider with `models` replaces the provider's full model list;
// auth and streaming are inherited from the built-in provider.
pi.registerProvider(providerId, { models });
console.log(
"[model-filter] " +
providerId +
": " +
all.length +
" -> " +
models.length +
" models",
);
}
}
-17
View File
@@ -1,17 +0,0 @@
{
modules,
den,
inputs,
...
}:
{
flake-file.inputs = {
omp-nix.url = "git+https://git.molez.org/mandlm/omp-nix?ref=main";
};
modules.omp = {
homeManager = {
imports = [ inputs.omp-nix.homeManagerModules.omp ];
oh-my-pi.enable = true;
};
};
}
-239
View File
@@ -1,239 +0,0 @@
{
den,
modules,
inputs,
...
}:
{
modules.pi-coding = {
homeManager =
{ pkgs, config, ... }:
{
programs.pi-coding-agent = {
enable = true;
extraPackages = [
pkgs.nodejs
# pkgs.lean-lsp-mcp
];
settings = {
"litellm" = {
"providers" = {
"litellm" = {
"displayName" = "scuggo";
"baseUrl" = "https://ai-proxy.fwds.scug.io";
"apiKey" = "$SCUG_IO_API_KEY";
"compat" = {
"sendSessionAffinityHeaders" = true;
};
};
};
"skills" = {
"enabled" = true;
};
"compat" = {
"sendSessionAffinityHeaders" = true;
};
};
"mcp" = {
"enabled" = true;
};
"uiMode" = "fullscreen";
"showCacheMissNotices" = true;
"vstack" = {
"extensionManager" = {
"config" = { };
};
};
packages = [
# "npm:@odinlayer/pi-provider-litellm"
"npm:pi-provider-litellm"
# Web search / content extraction (opencode-crawlberg + opencode-html-to-markdown equivalent)
"npm:pi-web-access"
# Local document parsing / OCR (opencode-xberg equivalent)
"npm:pi-docparser"
# "npm:@gotgenes/pi-permission-system"
"npm:@vanillagreen/pi-extension-manager"
# "npm:@vanillagreen/pi-qol"
"npm:pi-vitals"
"npm:pi-spark"
"npm:pi-caveman"
"npm:@tmustier/pi-usage-extension"
"npm:@heyhuynhgiabuu/pi-pretty"
"npm:pi-lens"
# "npm:pi-lean-ctx"
# "npm:@rohaquinlop/pi-deepseek-cache"
"npm:pi-cache-optimizer"
"npm:pi-opencode-go-cache"
];
};
context = ''
Core Directive: precise execution, strict safety, long-term solutions.
1. Standards: hard fail unless overridden; files <=300 lines (refactor if exceeded); no hardcoding config/env/consts only; no defaults fail on missing config; no legacy/shims/auto-migrations, assume clean state; root fixes only, no cosmetic patches (report unrelated bugs).
2. Safety: never run destructive ops (rm, reset --hard, deletions) without explicit prior approval; respect sandbox mode (ro/write), request approval if blocked; new code = creative, existing code = minimal deltas (no style/rename drift).
3. Tools: todowrite for multi-step exactly one in_progress, update on completion; rg for search; outputs truncated (~256 lines/10KB), read large files in chunks (<250 lines); edit = trust tool, no re-read, no added headers/comments; build/test/lint before yielding, yield only after todowrite done.
4. Communication: AGENTS.md governs deepest file wins, user prompt overrides; 1-sentence next-action preamble before any tool call; final output GFM with clickable file refs (src/main.ts:50), no file://, technical/dense/impersonal.
[CORE TOOLING DOCTRINE]
- Files: read truncates at 2000 lines/50KB (use offset/limit); write creates/overwrites/auto-parents; edit = smallest unique oldText, merge nearby, never include huge unchanged regions. Never cat/echo/tee/sed -i/head/tail for file content.
- Search: rg -n for text; grep tool (glob filter) for content; find tool for glob discovery only.
- Navigation: symbol_search module_report read_symbol/read_enclosing; never find + manual parsing.
- Diagnostics: lens_diagnostics (delta=this turn, all=session, full=project-wide before done); lsp_diagnostics before builds.
- Context: recall_context(id) to recover compressed/expired/truncated content.
- bash: only for git/nix/builds/scripts/network/system mgmt; set timeout for long ops.
- CRITICAL: never find on /nix/store unpruned walk locks up execution; ls known paths, ask user for unknown paths. ABSOLUTE.
- You have a web-search tool. Use it sparingly but reach for it in situations where info isnt directly known. (i.e, "common problem" -> get from memory, think hard if needed, "hard problem that isnt in your training data or request for you to read docs for a lib or program" -> search online)
- Searching for anything (including with wildcards ("/nix/store/*/**" or others)) isnt permitted at all. You must find paths inside the project, such a result/
'';
};
# pi-vitals config
home.file.".pi/agent/powerline.json" = {
text = builtins.toJSON {
leftSegments = [
"pi"
"separator"
"model"
"thinking"
"ext_status"
"separator"
"path"
"git"
"separator"
"token_total"
"token_in"
"token_out"
"cache_read"
"cache_write"
];
rightSegments = [
"separator"
"cost"
"context_pct"
];
icons = {
pi = "π";
model = "";
thinking = "🧠";
folder = "📁";
repo = "📦";
git = "";
tokens = "";
input = "";
output = "";
cacheRead = "";
cacheWrite = "";
contextPct = "";
cost = "$";
separator = "";
};
colors = {
pi = "accent";
model = "#d787af";
path = "#00afaf";
git = "success";
gitDirty = "warning";
gitClean = "success";
thinking = "muted";
context = "dim";
contextWarn = "warning";
contextError = "error";
cost = "text";
tokens = "muted";
separator = "dim";
};
segmentOptions = {
path = {
mode = "basename";
};
git = {
showBranch = true;
showStaged = true;
showUnstaged = true;
showUntracked = true;
};
context_pct = {
showAutoIcon = false;
};
};
};
};
home.file.".pi/agent/auth.json" = {
text = builtins.toJSON {
"opencode-go" = {
"type" = "api_key";
"key" = "$OPENCODE_GO_API_KEY";
};
"opencode" = {
"type" = "api_key";
"key" = "$OPENCODE_GO_API_KEY";
};
};
};
# Cache/routing compat overrides (provider-level minimal)
home.file.".pi/agent/models.json" = {
text = builtins.toJSON {
providers = {
"opencode-go" = {
compat = {
supportsLongCacheRetention = true;
};
};
};
};
};
# Restrict providers to a subset of their built-in models.
# Filter config: ~/.pi/agent/model-filters.json (see below).
home.file.".pi/agent/extensions/model-filter.ts" = {
source = ./model-filter.ts;
};
# Model filter config: per-provider filters applied by model-filter.ts
home.file.".pi/agent/model-filters.json" = {
text = builtins.toJSON {
providers = {
# opencode: only free models (all cost zero)
opencode = {
freeOnly = true;
};
};
};
};
# pi-web-access config: raw results, no curator / no AI summarising
home.file.".pi/web-search.json" = {
text = builtins.toJSON {
workflow = "none";
};
};
# pi-spark config
home.file.".pi/agent/spark.json" = {
text = builtins.toJSON {
editor = {
spinner = "tildes";
};
footer = false;
presets = {
"scuggo" = {
provider = "litellm";
model = "Ornith-1.0-9B";
thinkingLevel = "medium";
};
"claude" = {
provider = "anthropic";
model = "claude-opus-4-8";
thinkingLevel = "high";
};
"gpt" = {
provider = "openai-codex";
model = "gpt-5.5";
thinkingLevel = "medium";
};
};
};
};
};
};
}
-35
View File
@@ -1,35 +0,0 @@
{ modules, ... }:
{
modules.ai = {
provides = {
secrets = {
homeManager =
{ config, ... }:
{
sops = {
secrets.scug-io-ai-key = {
# Decrypted file path (available at runtime, not eval time)
path = config.home.homeDirectory + "/.secrets/scug_io_api_key";
sopsFile = ../secrets/content/secrets.yaml;
};
secrets.opencode-go-zen-key = {
# Decrypted file path (available at runtime, not eval time)
path = config.home.homeDirectory + "/.secrets/opencode-go-zen-key";
sopsFile = ../secrets/content/secrets.yaml;
};
};
programs.fish = {
shellInit = ''
if test -f "$HOME/.secrets/scug_io_api_key"
set -x SCUG_IO_API_KEY (cat "$HOME/.secrets/scug_io_api_key")
end
if test -f "$HOME/.secrets/opencode-go-zen-key"
set -x OPENCODE_GO_API_KEY (cat "$HOME/.secrets/opencode-go-zen-key")
end
'';
};
};
};
};
};
}
-2
View File
@@ -4,11 +4,9 @@
homeManager = { homeManager = {
services.dunst = { services.dunst = {
enable = true; enable = true;
# systemd.enable = true;
settings = { settings = {
global = { global = {
font = "Noto Nerd Font 8"; font = "Noto Nerd Font 8";
monitor = "DP-2";
}; };
}; };
}; };
+5 -17
View File
@@ -1,12 +1,5 @@
{ modules, ... }:
{ {
modules,
inputs,
...
}:
{
flake-file.inputs = {
direnv-instant.url = "github:Mic92/direnv-instant";
};
modules.fish = { modules.fish = {
nixos = { nixos = {
programs.fish.enable = true; programs.fish.enable = true;
@@ -15,10 +8,7 @@
{ pkgs, ... }: { pkgs, ... }:
{ {
home.shell.enableFishIntegration = true; home.shell.enableFishIntegration = true;
home.packages = [ home.packages = [ pkgs.nix-output-monitor ];
pkgs.nix-output-monitor
# pkgs.devenv
];
programs = { programs = {
fish = { fish = {
enable = true; enable = true;
@@ -28,11 +18,9 @@
set -g theme_display_user yes set -g theme_display_user yes
set -g fish_color_autosuggestion 6F6578 set -g fish_color_autosuggestion 6F6578
alias nik 'nix' alias nik 'nix'
if not set -q TMUX
set -gx COLORTERM truecolor
end
''; '';
# alias nos 'sudo echo; sudo nixos-rebuild switch --flake .#${aspect-name} --log-format internal-json -v &| nom --json'
# alias hms 'home-manager switch --flake .#${aspect-name} --log-format internal-json -v &| nom --json'
plugins = [ plugins = [
{ {
name = "bobthefish"; name = "bobthefish";
@@ -54,7 +42,7 @@
}; };
direnv = { direnv = {
enable = true; enable = true;
enableFishIntegration = true; nix-direnv.enable = true;
}; };
}; };
}; };
-36
View File
@@ -1,36 +0,0 @@
{ modules, inputs, ... }:
{
flake-file.inputs = {
nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=latest";
};
modules.flatpaks = {
nixos = {
imports = [
inputs.nix-flatpak.nixosModules.nix-flatpak
];
services.flatpak = {
enable = true;
};
};
homeManager = {
imports = [
inputs.nix-flatpak.homeManagerModules.nix-flatpak
];
services.flatpak = {
enable = true;
packages = [
{
flatpakref = "https://dl.flathub.org/repo/appstream/org.vinegarhq.Sober.flatpakref";
sha256 = "15ak2i5nk64wbmswqml2cqfgidczawqybmc7pmw94yp8wcd4yv6i";
}
];
};
services.flatpak.remotes = [
{
name = "flathub-beta";
location = "https://flathub.org/beta-repo/flathub-beta.flatpakrepo";
}
];
};
};
}
-40
View File
@@ -1,40 +0,0 @@
{ modules, ... }:
{
modules.gamemode = {
homeManager =
{ home, ... }:
{
};
nixos =
{ nixos, ... }:
{
programs.gamemode = {
enable = true;
enableRenice = true;
settings = {
general = {
renice = 10;
ioprio = 0;
inhibit_screensaver = 1;
disable_splitlock = 1;
};
cpu = {
park_cores = "no";
pin_cores = "yes";
};
gpu = {
apply_gpu_optimisations = "accept-responsibility";
gpu_device = 1;
nv_powermizer_mode = 1;
nv_perf_level = -1;
};
script = {
gamestart = "nvidia-smi --power-limit=175";
gamestop = "nvidia-smi --power-limit=125";
};
};
};
};
};
}
+11 -18
View File
@@ -4,18 +4,6 @@
nixos = nixos =
{ pkgs, ... }: { pkgs, ... }:
{ {
programs.gamescope = {
enable = true;
package = (
pkgs.gamescope.overrideAttrs {
enableWsi = true;
# Fixes some games being blurry under wayland backend
NIX_CFLAGS_COMPILE = [ "-fno-fast-math" ];
}
);
# Breaks steam launching gamescope
# capSysNice = true;
};
programs.steam = { programs.steam = {
enable = true; enable = true;
remotePlay.openFirewall = true; remotePlay.openFirewall = true;
@@ -23,14 +11,14 @@
localNetworkGameTransfers.openFirewall = true; localNetworkGameTransfers.openFirewall = true;
# Ensure gamescope is inside the steam "fhs" # Ensure gamescope is inside the steam "fhs"
package = pkgs.steam.override { package = pkgs.steam.override {
extraLibraries = pkgs: [ pkgs.libxcb ]; extraLibraries = pkgs: [ pkgs.xorg.libxcb ];
extraPkgs = extraPkgs =
pkgs: with pkgs; [ pkgs: with pkgs; [
attr attr
libxcursor xorg.libXcursor
libxi xorg.libXi
libxinerama xorg.libXinerama
libxscrnsaver xorg.libXScrnSaver
libpng libpng
libpulseaudio libpulseaudio
libvorbis libvorbis
@@ -38,8 +26,13 @@
libkrb5 libkrb5
keyutils keyutils
mangohud mangohud
# gamemode gamemode
lsof lsof
(gamescope.overrideAttrs {
enableWsi = true;
# Fixes some games being blurry under wayland backend
NIX_CFLAGS_COMPILE = [ "-fno-fast-math" ];
})
]; ];
}; };
}; };
+3 -32
View File
@@ -16,39 +16,10 @@
modules.helium = settings: { modules.helium = settings: {
homeManager = homeManager =
{ pkgs, ... }: { pkgs, ... }:
let
heliumPkg = inputs.heliumFlake.packages.${pkgs.stdenv.hostPlatform.system}.helium;
# The upstream `helium` launcher is a plain Nix wrapper that ignores any
# *-flags.conf file (that convention is Arch-specific, not NixOS). So to
# actually pass command-line flags we re-wrap the launcher here.
#
# Flag names verified against this Helium build's binary strings.
# - AcceleratedVideoDecodeLinuxGL / ...ZeroCopyGL: the VA-API GL decode
# path (renamed from the old Vaapi* names, which are no-ops here).
# - VaapiOnNvidiaGPUs: required. Chromium disables VA-API on NVIDIA by
# default and hard-skips the nvidia-drm device ("Should skip nVidia
# device named: nvidia-drm" in the logs); this re-enables it, routing
# decode to NVDEC through the nvidia-vaapi-driver bridge.
# - VaapiIgnoreDriverChecks: bypass the driver allowlist.
# HEVC decode itself needs no runtime flag in this build (enable_platform_hevc
# is compiled in and on by default). Wayland-only: the NVIDIA VA-API path
# is broken under X11. Upstream considers nvidia-vaapi-driver unsupported,
# so confirm via chrome://media-internals (decoder should read VaapiVideoDecoder).
helium = pkgs.symlinkJoin {
name = "helium-wrapped";
paths = [ heliumPkg ];
nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = ''
wrapProgram $out/bin/helium \
--prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ pkgs.vulkan-loader ]}" \
--add-flags "--enable-features=AcceleratedVideoDecodeLinuxGL,AcceleratedVideoDecodeLinuxZeroCopyGL,VaapiOnNvidiaGPUs,VaapiIgnoreDriverChecks" \
--add-flags "--ignore-gpu-blocklist" \
--add-flags "--disable-gpu-sandbox"
'';
};
in
{ {
home.packages = [ helium ]; home.packages = [
inputs.heliumFlake.packages.${pkgs.stdenv.hostPlatform.system}.helium
];
nixpkgs.config.allowUnfree = true; nixpkgs.config.allowUnfree = true;
# Gives me widevine support. yay # Gives me widevine support. yay
xdg.configFile."net.imput.helium/WidevineCdm/latest-component-updated-widevine-cdm" = { xdg.configFile."net.imput.helium/WidevineCdm/latest-component-updated-widevine-cdm" = {
+169 -209
View File
@@ -7,195 +7,7 @@
modules.dunst modules.dunst
]; ];
homeManager = homeManager =
{ { pkgs, home, ... }:
pkgs,
home,
...
}:
let
tofiCfg = pkgs.writeTextFile {
name = "hyprland-tofi-config";
text = ''
width = 100%
height = 100%
border-width = 0
outline-width = 0
padding-left = 35%
padding-top = 35%
result-spacing = 25
num-results = 5
font = monospace
background-color = #000A
'';
};
meowScript = pkgs.writeShellScript "meow" ''
fish -c 'grim -g $(slurp) -t png - &| wl-copy -t image/png; killall wayfreeze'
'';
mreowScript = pkgs.writeShellScript "mreow" ''
exec $(tofi-drun -c ${tofiCfg})
'';
mainMod = "SUPER";
hlBind = key: dispatcher: "hl.bind(\"${key}\", ${dispatcher})";
workspaceLines = pkgs.lib.concatLists (
builtins.genList (
i:
let
ws = toString (i + 1);
in
[
(hlBind "${mainMod} + ${ws}" "hl.dsp.focus({ workspace = ${ws} })")
(hlBind "${mainMod} + SHIFT + ${ws}" "hl.dsp.window.move({ workspace = ${ws} })")
]
) 9
);
hlBindCode = pkgs.lib.concatStringsSep "\n" (
[
"-- Hyprland configuration"
""
"local mainMod = \"${mainMod}\""
""
"-- Config"
"hl.config({"
" general = {"
" gaps_in = 1,"
" gaps_out = 1,"
" border_size = 1,"
" resize_on_border = false,"
" allow_tearing = true,"
" layout = \"dwindle\","
" },"
" input = {"
" follow_mouse = 2,"
" kb_layout = \"gb\","
" },"
" decoration = {"
" rounding = 4,"
" rounding_power = 1,"
" active_opacity = 1.0,"
" inactive_opacity = 1.0,"
" shadow = {"
" enabled = false,"
" },"
" blur = {"
" enabled = true,"
" passes = 1,"
" new_optimizations = true,"
" ignore_opacity = false,"
" },"
" },"
" cursor = {"
" no_hardware_cursors = false,"
" },"
" dwindle = {"
" preserve_split = true,"
" },"
" misc = {"
" force_default_wallpaper = -1,"
" disable_hyprland_logo = false,"
" enable_anr_dialog = false,"
" },"
"})"
""
"-- Monitors"
"hl.monitor({ output = \"HDMI-A-1\", mode = \"1920x1080@60\", position = \"0x0\", scale = \"1\" })"
"hl.monitor({ output = \"DP-2\", mode = \"1920x1080@120\", position = \"1920x0\", scale = \"1\" })"
""
"-- Input"
"hl.device({ name = \"default\", kb_layout = \"gb\", sensitivity = -0.5 })"
""
"-- Curves"
"hl.curve(\"easeOutQuint\", { type = \"bezier\", points = { {0.23, 1}, {0.32, 1} } })"
"hl.curve(\"easeInOutCubic\", { type = \"bezier\", points = { {0.65, 0.05}, {0.36, 1} } })"
"hl.curve(\"linear\", { type = \"bezier\", points = { {0, 0}, {1, 1} } })"
"hl.curve(\"almostLinear\", { type = \"bezier\", points = { {0.5, 0.5}, {0.75, 1} } })"
"hl.curve(\"quick\", { type = \"bezier\", points = { {0.15, 0}, {0.1, 1} } })"
""
"-- Animations"
"hl.animation({ leaf = \"global\", enabled = true, speed = 10, bezier = \"default\" })"
"hl.animation({ leaf = \"border\", enabled = true, speed = 5.39, bezier = \"easeOutQuint\" })"
"hl.animation({ leaf = \"windows\", enabled = true, speed = 2.79, bezier = \"easeOutQuint\" })"
"hl.animation({ leaf = \"windowsIn\", enabled = true, speed = 1, bezier = \"easeOutQuint\", style = \"popin 87%\" })"
"hl.animation({ leaf = \"windowsOut\", enabled = true, speed = 1, bezier = \"linear\", style = \"popin 87%\" })"
"hl.animation({ leaf = \"windowsMove\", enabled = true, speed = 1, bezier = \"easeInOutCubic\" })"
"hl.animation({ leaf = \"fadeIn\", enabled = true, speed = 0.5, bezier = \"almostLinear\" })"
"hl.animation({ leaf = \"fadeOut\", enabled = true, speed = 0.5, bezier = \"almostLinear\" })"
"hl.animation({ leaf = \"fade\", enabled = true, speed = 1, bezier = \"quick\" })"
"hl.animation({ leaf = \"layers\", enabled = true, speed = 3.81, bezier = \"easeOutQuint\" })"
"hl.animation({ leaf = \"layersIn\", enabled = true, speed = 4, bezier = \"easeOutQuint\", style = \"fade\" })"
"hl.animation({ leaf = \"layersOut\", enabled = true, speed = 1.5, bezier = \"linear\", style = \"fade\" })"
"hl.animation({ leaf = \"fadeLayersIn\", enabled = true, speed = 1.79, bezier = \"almostLinear\" })"
"hl.animation({ leaf = \"fadeLayersOut\", enabled = true, speed = 1.39, bezier = \"almostLinear\" })"
"hl.animation({ leaf = \"workspaces\", enabled = true, speed = 1, bezier = \"almostLinear\", style = \"slide\" })"
"hl.animation({ leaf = \"workspacesIn\", enabled = true, speed = 1, bezier = \"easeInOutCubic\", style = \"slide\" })"
"hl.animation({ leaf = \"workspacesOut\", enabled = true, speed = 1, bezier = \"easeInOutCubic\", style = \"slide\" })"
"hl.animation({ leaf = \"zoomFactor\", enabled = true, speed = 7, bezier = \"quick\" })"
""
"-- Binds"
(hlBind "${mainMod} + R" "hl.dsp.exec_cmd(\"${mreowScript}\")")
(hlBind "${mainMod} + C" "hl.dsp.window.close()")
(hlBind "${mainMod} + M" "hl.dsp.exec_cmd(\"uwsm stop\")")
(hlBind "${mainMod} + Q" "hl.dsp.exec_cmd(\"kitty\")")
(hlBind "${mainMod} + V" "hl.dsp.window.float({ action = \"toggle\" })")
(hlBind "${mainMod} + left" "hl.dsp.focus({ direction = \"left\" })")
(hlBind "${mainMod} + right" "hl.dsp.focus({ direction = \"right\" })")
(hlBind "${mainMod} + up" "hl.dsp.focus({ direction = \"up\" })")
(hlBind "${mainMod} + down" "hl.dsp.focus({ direction = \"down\" })")
(hlBind "${mainMod} + L" "hl.dsp.exec_cmd(\"wlogout\")")
(hlBind "${mainMod} + S" "hl.dsp.exec_cmd(\"wayfreeze --after-freeze-cmd '${meowScript}'\")")
(hlBind "${mainMod} + F" "hl.dsp.window.fullscreen({ action = \"toggle\" })")
(hlBind "${mainMod} + SHIFT + Q" "hl.dsp.window.close()")
(hlBind "${mainMod} + mouse_down" "hl.dsp.focus({ workspace = \"e+1\" })")
(hlBind "${mainMod} + mouse_up" "hl.dsp.focus({ workspace = \"e-1\" })")
""
"-- Mouse binds"
(hlBind "${mainMod} + mouse:272" "hl.dsp.window.drag()")
(hlBind "${mainMod} + mouse:273" "hl.dsp.window.resize()")
""
"-- Media keys"
(hlBind "XF86AudioLowerVolume" "hl.dsp.exec_cmd(\"wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-\")")
(hlBind "XF86AudioRaiseVolume" "hl.dsp.exec_cmd(\"wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+\")")
(hlBind "XF86AudioMute" "hl.dsp.exec_cmd(\"wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle\")")
(hlBind "XF86AudioPlay" "hl.dsp.exec_cmd(\"playerctl play-pause\")")
(hlBind "XF86AudioNext" "hl.dsp.exec_cmd(\"playerctl next\")")
(hlBind "XF86AudioPrev" "hl.dsp.exec_cmd(\"playerctl previous\")")
(hlBind "XF86AudioMicMute" "hl.dsp.exec_cmd(\"wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle\")")
(hlBind "home" "hl.dsp.exec_cmd(\"wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle\")")
(hlBind "end" "hl.dsp.exec_cmd(\"wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle\")")
(hlBind "F8" "hl.dsp.pass({ window = [[match:class:^(com.obsproject.Studio)$]] })")
""
"-- Workspaces"
(hlBind "${mainMod} + 0" "hl.dsp.focus({ workspace = 10 })")
(hlBind "${mainMod} + SHIFT + 0" "hl.dsp.window.move({ workspace = 10 })")
]
++ workspaceLines
++ [
""
"-- Window rules"
"hl.window_rule({ suppress_event = \"maximize\" })"
"hl.window_rule({ match = { class = \"gamescope\" }, workspace = \"5\", immediate = true, confine_pointer = true })"
"hl.window_rule({ match = { class = \"steam\" }, workspace = \"6 silent\" })"
"hl.window_rule({ match = { class = \"vesktop\" }, workspace = \"8 silent\" })"
"hl.window_rule({ match = { class = \"org.telegram.desktop\" }, workspace = \"8 silent\" })"
"hl.window_rule({ match = { class = \"com.obsproject.Studio\" }, workspace = \"10 silent\" })"
"hl.window_rule({ match = { initial_title = \"OBS Studio Crash Detected\" }, pin = true })"
"hl.window_rule({ match = { initial_title = \"Discord Popout\" }, workspace = \"1 silent\" })"
""
"-- Layer rules"
"hl.layer_rule({ match = { namespace = \"notifications\" }, no_screen_share = true })"
""
"-- Host-specific overrides"
"local home = os.getenv(\"HOME\")"
"if home then"
" local f = io.open(home .. '/.config/hypr/hyprland-local.lua', 'r')"
" if f then"
" _ = f:close()"
" local config = loadfile(home .. '/.config/hypr/hyprland-local.lua')"
" if config then config() end"
" end"
"end"
]
);
in
{ {
home.packages = [ home.packages = [
pkgs.hyprcursor pkgs.hyprcursor
@@ -212,28 +24,176 @@
package = pkgs.rose-pine-hyprcursor; package = pkgs.rose-pine-hyprcursor;
hyprcursor.enable = true; hyprcursor.enable = true;
}; };
services.hyprpaper = { wayland.windowManager.hyprland.settings = {
enable = true; env = [
settings = { "XCURSOR_THEME,BreezeX-RosePine-Linux"
splash = true; "XCURSOR_SIZE,24"
wallpaper = [ "HYPRCURSOR_SIZE,24"
{ "__GLX_VENDOR_LIBRARY_NAME,nvidia"
monitor = "HDMI-A-1"; "WEBKIT_DISABLE_DMABUF_RENDERER,1" # maybe disable if nixos fixes alcom
path = "/home/doloro/Wallpaper.jpg"; ];
} general = {
{ gaps_in = 1;
monitor = "DP-2"; gaps_out = 1;
path = "/home/doloro/Wallpaper.jpg"; border_size = 1;
} # "col.active_border" =
# "rgb(${toString base16.rgb."base06".r},${toString base16.rgb."base06".g},${toString base16.rgb."base06".b})";
# "col.inactive_border" =
# "rgb(${toString base16.rgb."base03".r},${toString base16.rgb."base03".g},${toString base16.rgb."base03".b})";
resize_on_border = false;
allow_tearing = true;
layout = "dwindle";
};
decoration = {
rounding = 4;
rounding_power = 1;
active_opacity = 1.0;
inactive_opacity = 1.0;
shadow = {
enabled = false;
};
blur = {
enabled = true;
passes = 1;
new_optimizations = true;
ignore_opacity = false;
};
};
cursor = {
no_hardware_cursors = true;
};
animations = {
enabled = true;
bezier = [
"easeOutQuint,0.23,1,0.32,1"
"easeInOutCubic,0.65,0.05,0.36,1"
"linear,0,0,1,1"
"almostLinear,0.5,0.5,0.75,1.0"
"quick,0.15,0,0.1,1"
];
animation = [
"global, 1, 10, default"
"border, 1, 5.39, easeOutQuint"
"windows, 1, 2.79, easeOutQuint"
"windowsIn, 1, 1, easeOutQuint, popin 87%"
"windowsOut, 1, 1, linear, popin 87%"
"windowsMove, 1, 1, easeInOutCubic"
"fadeIn, 1, 0.5, almostLinear"
"fadeOut, 1, 0.5, almostLinear"
"fade, 1, 1, quick"
"layers, 1, 3.81, easeOutQuint"
"layersIn, 1, 4, easeOutQuint, fade"
"layersOut, 1, 1.5, linear, fade"
"fadeLayersIn, 1, 1.79, almostLinear"
"fadeLayersOut, 1, 1.39, almostLinear"
"workspaces, 1, 1, almostLinear, slide"
"workspacesIn, 1, 1, easeInOutCubic, slide"
"workspacesOut, 1, 1, easeInOutCubic, slide"
"zoomFactor, 1, 7, quick"
]; ];
}; };
}; dwindle = {
# systemd.user.services.hyprpaper = { pseudotile = true;
# partOf = [ "hyprland-session.target" ]; preserve_split = true;
# after = [ "hyprland-session.target" ]; };
# }; # master = {
xdg.configFile."hypr/hyprland.lua" = { # new_status = master;
source = pkgs.writeText "hyprland.lua" hlBindCode; # };
misc = {
force_default_wallpaper = -1;
disable_hyprland_logo = false;
enable_anr_dialog = false;
vfr = true;
};
"$mainMod" = "SUPER";
bind = [
(
let
config = pkgs.writeTextFile {
name = "config";
text = ''
width = 100%
height = 100%
border-width = 0
outline-width = 0
padding-left = 35%
padding-top = 35%
result-spacing = 25
num-results = 5
font = monospace
background-color = #000A
'';
};
script = pkgs.writeShellScript "mreow" ''
exec $(tofi-drun -c ${config})
'';
in
"$mainMod, R, exec, ${script}"
)
"$mainMod, C, killactive"
"$mainMod, M, exec, uwsm stop"
"$mainMod, Q, exec, kitty"
"$mainMod, V, togglefloating,"
"$mainMod, P, pseudo, # dwindle"
"$mainMod, J, togglesplit, # dwindle"
"$mainMod, left, movefocus, l"
"$mainMod, right, movefocus, r"
"$mainMod, up, movefocus, u"
"$mainMod, down, movefocus, d"
"$mainMod, L, exec, wlogout"
(
let
script = pkgs.writeShellScript "meow" ''
fish -c 'grim -g $(slurp) -t png - &| wl-copy -t image/png; killall wayfreeze'
'';
in
"$mainMod, S, exec, " + "wayfreeze --after-freeze-cmd '${script}'"
)
"$mainMod, F, fullscreen"
"$mainMod, mouse_down, workspace, e+1"
"$mainMod, mouse_up, workspace, e-1"
", home, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
", end, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"
", F8, pass, class:^(com\.obsproject\.Studio)$"
"$mainMod, 0, workspace, 10"
"$mainMod SHIFT, 0, movetoworkspace, 10"
]
++ (builtins.concatLists (
builtins.genList (
i:
let
ws = i + 1;
in
[
"$mainMod, ${toString ws}, workspace, ${toString ws}"
"$mainMod SHIFT, ${toString ws}, movetoworkspace, ${toString ws}"
]
) 9
));
bindm = [
"$mainMod, mouse:272, movewindow"
"$mainMod, mouse:273, resizewindow"
];
windowrule = [
"match:class .*, suppress_event maximize"
"match:class ^(gamescope)$, workspace 5"
"match:class ^(gamescope)$, immediate true"
"match:class ^(steam)$, workspace 6 silent"
"match:class ^(vesktop)$, workspace 8 silent"
"match:class ^(org.telegram.desktop)$, workspace 8 silent"
"match:class ^(com.obsproject.Studio)$, workspace 10 silent"
"match:initial_title ^(OBS Studio Crash Detected)$, pin true"
"match:initial_title ^(Discord Popout)$, workspace 1 silent"
];
layerrule = [
"match:namespace ^(notifications)$, no_screen_share true"
# "match:namespace ^(quickshell)$, blur true"
];
# exec-once = [
# ];
# we need to auto launch: quickshell, steam, ar_rpc (maybe), vesktop, telegram, qbit, and obs
}; };
}; };
}; };
-3
View File
@@ -52,12 +52,9 @@
gtk = { gtk = {
enable = true; enable = true;
}; };
# backupFileExtension = "backupHM";
wayland.windowManager.hyprland = { wayland.windowManager.hyprland = {
enable = true; enable = true;
systemd.enable = true;
systemd.variables = [ "--all" ]; systemd.variables = [ "--all" ];
configType = "lua";
}; };
}; };
}; };
-20
View File
@@ -1,20 +0,0 @@
{
den,
modules,
inputs,
...
}:
{
flake-file.inputs = {
hytale-launcher.url = "github:JPyke3/hytale-launcher-nix";
};
modules.hytale-launcher = {
homeManager =
{ pkgs, ... }:
{
home.packages = [
inputs.hytale-launcher.packages.${pkgs.system}.default
];
};
};
}
+1 -9
View File
@@ -1,8 +1,4 @@
{ { den, modules, ... }:
den,
modules,
...
}:
{ {
modules.kitty = { modules.kitty = {
homeManager = { homeManager = {
@@ -16,10 +12,6 @@
sync_to_monitor = "yes"; sync_to_monitor = "yes";
background_opacity = 0.6; background_opacity = 0.6;
cursor_trail = 1; cursor_trail = 1;
auto_reload_config = -1;
input_delay = 1;
repaint_delay = 2;
wayland_enable_ime = "no";
}; };
}; };
}; };
+4 -4
View File
@@ -3,17 +3,17 @@
modules, modules,
inputs, inputs,
... ...
}: { }:
{
flake-file.inputs = { flake-file.inputs = {
nik-pkgs = { nik-pkgs = {
url = "git+https://git.scug.io/nikkuss/pkgs.git?ref=main"; url = "git+https://git.scug.io/nikkuss/pkgs.git";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
}; };
modules.nikpkgs = { modules.nikpkgs = {
nixos = { nixos = {
nixpkgs.overlays = [inputs.nik-pkgs.overlays.default]; nixpkgs.overlays = [ inputs.nik-pkgs.overlays.default ];
}; };
# debug = inputs.nik-pkgs;
}; };
} }
+21 -21
View File
@@ -24,19 +24,19 @@
systemd systemd
# My own additions # My own additions
libxcomposite xorg.libXcomposite
libxtst xorg.libXtst
libxrandr xorg.libXrandr
libxext xorg.libXext
libx11 xorg.libX11
libxfixes xorg.libXfixes
libGL libGL
libva libva
pipewire pipewire
libxcb xorg.libxcb
libxdamage xorg.libXdamage
libxshmfence xorg.libxshmfence
libxxf86vm xorg.libXxf86vm
libelf libelf
# Required # Required
@@ -56,13 +56,13 @@
# glibc_multi.bin # Seems to cause issue in ARM # glibc_multi.bin # Seems to cause issue in ARM
# # Without these it silently fails # # Without these it silently fails
libxinerama xorg.libXinerama
libxcursor xorg.libXcursor
libxrender xorg.libXrender
libxscrnsaver xorg.libXScrnSaver
libxi xorg.libXi
libsm xorg.libSM
libice xorg.libICE
gnome2.GConf gnome2.GConf
nspr nspr
nss nss
@@ -88,13 +88,13 @@
# other issue: (Unity:377230): GLib-GIO-CRITICAL **: 21:09:04.706: g_dbus_proxy_call_sync_internal: assertion 'G_IS_DBUS_PROXY (proxy)' failed # other issue: (Unity:377230): GLib-GIO-CRITICAL **: 21:09:04.706: g_dbus_proxy_call_sync_internal: assertion 'G_IS_DBUS_PROXY (proxy)' failed
# Verified games requirements # Verified games requirements
libxt xorg.libXt
libxmu xorg.libXmu
libogg libogg
libvorbis libvorbis
SDL SDL
SDL2_image SDL2_image
glew_1_10 glew110
libidn libidn
tbb tbb
@@ -123,7 +123,7 @@
libgcrypt libgcrypt
libvpx libvpx
librsvg librsvg
libxft xorg.libXft
libvdpau libvdpau
# ... # ...
# Some more libraries that I needed to run programs # Some more libraries that I needed to run programs
+32 -34
View File
@@ -1,38 +1,36 @@
{...}: { { ... }:
flake-file.inputs = { {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
};
modules.nix = { modules.nix = {
nixos = {...}: { nixos =
nixpkgs.config.allowUnfree = true; { ... }:
nix.settings = { {
extra-substituters = [ nixpkgs.config.allowUnfree = true;
"https://hyprland.cachix.org" nix.settings = {
"https://nix-community.cachix.org" substituters = [
"https://cache.nixos.org/" "https://hyprland.cachix.org"
"https://attic.scug.io/pkgs" "https://nix-community.cachix.org"
"https://cache.nixos-cuda.org" "https://cache.nixos.org/"
"https://niri.cachix.org" "https://attic.scug.io/pkgs"
"https://attic.xuyh0120.win/lantian" "https://cache.nixos-cuda.org"
"https://nixos-raspberrypi.cachix.org" "https://niri.cachix.org"
]; "https://attic.xuyh0120.win/lantian"
trusted-public-keys = [ ];
"hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=" trusted-public-keys = [
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="
"pkgs:+sRbfiZMMX5R3PuAPtIRz/emowDoGZNpozibrnrAvuc=" "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
"cache.nixos-cuda.org:74DUi4Ye579gUqzH4ziL9IyiJBlDpMRn9MBN8oNan9M=" "pkgs:+sRbfiZMMX5R3PuAPtIRz/emowDoGZNpozibrnrAvuc="
"niri.cachix.org-1:Wv0OmO7PsuocRKzfDoJ3mulSl7Z6oezYhGhR+3W2964=" "cache.nixos-cuda.org:74DUi4Ye579gUqzH4ziL9IyiJBlDpMRn9MBN8oNan9M="
"lantian:EeAUQ+W+6r7EtwnmYjeVwx5kOGEBpjlBfPlzGlTNvHc=" "niri.cachix.org-1:Wv0OmO7PsuocRKzfDoJ3mulSl7Z6oezYhGhR+3W2964="
"nixos-raspberrypi.cachix.org-1:4iMO9LXa8BqhU+Rpg6LQKiGa2lsNh/j2oiYLNOQ5sPI=" "lantian:EeAUQ+W+6r7EtwnmYjeVwx5kOGEBpjlBfPlzGlTNvHc="
]; ];
experimental-features = [ experimental-features = [
"flakes" "flakes"
"nix-command" "nix-command"
]; ];
trusted-users = [ trusted-users = [
"doloro" "doloro"
]; ];
};
}; };
};
}; };
} }
+25 -239
View File
@@ -10,6 +10,7 @@
flake-file.inputs = { flake-file.inputs = {
nixvim = { nixvim = {
url = "github:nix-community/nixvim"; url = "github:nix-community/nixvim";
# inputs.nixpkgs.follows = "nixpkgs";
}; };
}; };
modules = { modules = {
@@ -20,18 +21,6 @@
}; };
homeManager = homeManager =
{ pkgs, ... }: { pkgs, ... }:
let
tiny-code-action = pkgs.vimUtils.buildVimPlugin {
name = "tiny-code-action.nvim";
src = pkgs.fetchFromGitHub {
owner = "rachartier";
repo = "tiny-code-action.nvim";
rev = "0d040ed81f7953118b81cd12681fcdfcac069803";
hash = "sha256-UF9zeO5Uujdt2MEwy2d2Lhk6JRnEN4vrEvYslv0/zaA";
};
nvimSkipModules = [ "tiny-code-action.previewers.snacks" ];
};
in
{ {
imports = [ imports = [
inputs.nixvim.homeModules.nixvim inputs.nixvim.homeModules.nixvim
@@ -43,24 +32,17 @@
config = { config = {
allowUnfree = true; allowUnfree = true;
}; };
source = inputs.nixpkgs;
}; };
colorschemes.gruvbox-material.enable = true; colorschemes.gruvbox-material.enable = true;
# colorschemes.melange = {
# enable = true;
# autoLoad = false;
# };
extraPackages = with pkgs; [ extraPackages = with pkgs; [
# formatters # formatters
nixfmt-rs nixfmt
rustfmt rustfmt
# misc # misc
ripgrep ripgrep
# misc
nixd nixd
tree-sitter tree-sitter
rust-analyzer
rustc
cargo
]; ];
performance.byteCompileLua = { performance.byteCompileLua = {
enable = true; enable = true;
@@ -70,15 +52,10 @@
configs = true; configs = true;
}; };
plugins = { plugins = {
luasnip.enable = true;
cmp_luasnip.enable = true;
fidget.enable = true;
mini-comment.enable = true;
# cord.enable = true;
todo-comments.enable = true; todo-comments.enable = true;
lsp-status.enable = true;
transparent.enable = true; transparent.enable = true;
which-key.enable = true; which-key.enable = true;
snacks.enable = true;
conform-nvim = { conform-nvim = {
enable = true; enable = true;
settings = { settings = {
@@ -109,12 +86,12 @@
lsp = { lsp = {
enable = true; enable = true;
servers = { servers = {
# qmlls = { qmlls = {
# enable = true; enable = true;
# config = { config = {
# cmd = "-E"; cmd = "-E";
# }; };
# }; };
rust_analyzer = { rust_analyzer = {
enable = true; enable = true;
installCargo = false; installCargo = false;
@@ -122,26 +99,14 @@
}; };
nixd = { nixd = {
enable = true; enable = true;
settings = {
nixd = {
nixpkgs.expr = "import (builtins.getFlake \"${toString /home/doloro/dotfiles}\").inputs.nixpkgs { }";
options = {
nixos.expr = "(builtins.getFlake \"${toString /home/doloro/dotfiles}\").nixosConfigurations.desktop.options";
home_manager.expr = "(builtins.getFlake \"${toString /home/doloro/dotfiles}\").homeConfigurations.doloro-desktop.options";
};
};
};
}; };
astro = { astro = {
enable = false; enable = true;
}; };
ts_ls = { ts_ls = {
enable = true; enable = true;
}; };
cssls = { cssls.enable = true;
enable = true;
package = pkgs.vscode-langservers-extracted;
};
svelte.enable = true; svelte.enable = true;
}; };
}; };
@@ -173,7 +138,7 @@
"fileformat" "fileformat"
"filetype" "filetype"
]; ];
lualine_y = [ "progress" ]; lualine_y = [ "lsp_status" ];
lualine_z = [ "location" ]; lualine_z = [ "location" ];
}; };
inactive_sections = { inactive_sections = {
@@ -188,10 +153,7 @@
}; };
web-devicons.enable = true; web-devicons.enable = true;
vim-dadbod-completion.enable = true; vim-dadbod-completion.enable = true;
telescope = { telescope.enable = true;
enable = true;
extensions.file-browser.enable = true;
};
lazygit.enable = true; lazygit.enable = true;
mini-indentscope = { mini-indentscope = {
enable = true; enable = true;
@@ -209,55 +171,15 @@
}; };
}; };
}; };
lsp-lines.enable = true; trouble.enable = true;
trouble = {
enable = true;
settings = {
auto_close = true;
use_diagnostic_signs = true;
};
};
cmp = { cmp = {
enable = true; enable = true;
autoEnableSources = true; autoEnableSources = true;
cmdline = {
":" = {
mapping.__raw = "cmp.mapping.preset.cmdline()";
sources = [
{ name = "path"; }
{ name = "cmdline"; }
];
};
"/" = {
mapping.__raw = "cmp.mapping.preset.cmdline()";
sources = [
{ name = "buffer"; }
];
};
};
settings = { settings = {
snippet.expand.__raw = "function(args) require('luasnip').lsp_expand(args.body) end";
sources = [ sources = [
{ { name = "nvim_lsp"; }
name = "nvim_lsp"; { name = "path"; }
priority = 100; { name = "buffer"; }
}
{
name = "nvim_lsp_signature_help";
priority = 90;
}
{
name = "luasnip";
priority = 75;
}
{
name = "buffer";
priority = 50;
}
{
name = "path";
priority = 40;
}
]; ];
mapping = { mapping = {
"<C-Space>" = "cmp.mapping.complete()"; "<C-Space>" = "cmp.mapping.complete()";
@@ -265,26 +187,13 @@
"<C-e>" = "cmp.mapping.close()"; "<C-e>" = "cmp.mapping.close()";
"<C-f>" = "cmp.mapping.scroll_docs(4)"; "<C-f>" = "cmp.mapping.scroll_docs(4)";
"<CR>" = "cmp.mapping.confirm({ select = true })"; "<CR>" = "cmp.mapping.confirm({ select = true })";
"<S-Tab>" = "<S-Tab>" = "cmp.mapping(cmp.mapping.select_prev_item(), {'i', 's'})";
"cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item() elseif require('luasnip').jumpable(-1) then require('luasnip').jump(-1) else fallback() end end, {'i', 's'})"; "<Tab>" = "cmp.mapping(cmp.mapping.select_next_item(), {'i', 's'})";
"<Tab>" =
"cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() elseif require('luasnip').expand_or_jumpable() then require('luasnip').expand_or_jump() else fallback() end end, {'i', 's'})";
};
window = {
completion = {
border = "rounded";
winhighlight = "Normal:Pmenu,FloatBorder:Pmenu,CursorLine:PmenuSel,Search:None";
};
documentation = {
border = "rounded";
winhighlight = "Normal:Pmenu,FloatBorder:Pmenu";
};
}; };
}; };
}; };
lspkind.enable = true; lspkind.enable = true;
tiny-inline-diagnostic.enable = true; tiny-inline-diagnostic.enable = true;
# tiny-code-action.enable = true;
# persisted.enable = true; # persisted.enable = true;
auto-session = { auto-session = {
enable = false; enable = false;
@@ -299,9 +208,6 @@
enable = true; enable = true;
grammarPackages = with pkgs.vimPlugins.nvim-treesitter.builtGrammars; [ grammarPackages = with pkgs.vimPlugins.nvim-treesitter.builtGrammars; [
bash bash
css
html
javascript
json json
lua lua
make make
@@ -310,8 +216,6 @@
nix nix
regex regex
toml toml
tsx
typescript
vim vim
vimdoc vimdoc
xml xml
@@ -320,13 +224,15 @@
]; ];
settings = { settings = {
highlight.enable = true; highlight.enable = true;
indent.enable = false;
}; };
}; };
}; };
extraPlugins = with pkgs; [ extraPlugins = with pkgs; [
vimPlugins.cmp-nvim-lsp-signature-help # vimPlugins.mini-completion
tiny-code-action vimPlugins.mini-comment
vimPlugins.melange-nvim
vimPlugins.telescope-file-browser-nvim
vimPlugins.lsp-progress-nvim
]; ];
opts = { opts = {
number = true; number = true;
@@ -334,25 +240,10 @@
tabstop = 2; tabstop = 2;
shiftwidth = 2; shiftwidth = 2;
termguicolors = true; termguicolors = true;
completeopt = "menu,menuone,noselect";
}; };
globals = { globals = {
mapleader = " "; mapleader = " ";
}; };
extraConfigLua = ''
-- tree-sitter-nix uses (#is-not? local) which the new nvim-treesitter main branch no longer registers
vim.treesitter.query.add_predicate("is-not?", function() return true end, { force = true })
require('tiny-code-action').setup({
backend = 'vim',
picker = 'snacks',
resolve_timeout = 100,
notify = {
enabled = true,
on_empty = true,
},
})
'';
keymaps = [ keymaps = [
{ {
action = "<cmd>Telescope persisted<cr>"; action = "<cmd>Telescope persisted<cr>";
@@ -401,111 +292,6 @@
key = "<leader>fd"; key = "<leader>fd";
options = { options = {
silent = true; silent = true;
desc = "Toggle diagnostics (Trouble)";
};
}
{
action = "<cmd>lua require('tiny-code-action').code_action()<cr>";
key = "<leader>ca";
mode = [
"n"
"x"
];
options = {
silent = true;
};
}
# LSP
{
action = "<cmd>lua vim.lsp.buf.definition()<cr>";
key = "gd";
options = {
silent = true;
desc = "Go to definition";
};
}
{
action = "<cmd>lua vim.lsp.buf.declaration()<cr>";
key = "gD";
options = {
silent = true;
desc = "Go to declaration";
};
}
{
action = "<cmd>lua vim.lsp.buf.implementation()<cr>";
key = "gi";
options = {
silent = true;
desc = "Go to implementation";
};
}
{
action = "<cmd>lua vim.lsp.buf.type_definition()<cr>";
key = "<leader>D";
options = {
silent = true;
desc = "Go to type definition";
};
}
{
action = "<cmd>Telescope lsp_references<cr>";
key = "gr";
options = {
silent = true;
desc = "LSP references";
};
}
{
action = "<cmd>lua vim.lsp.buf.hover()<cr>";
key = "K";
options = {
silent = true;
desc = "Hover docs";
};
}
{
action = "<cmd>lua vim.lsp.buf.signature_help()<cr>";
key = "<C-k>";
mode = [
"n"
"i"
];
options = {
silent = true;
desc = "Signature help";
};
}
{
action = "<cmd>lua vim.lsp.buf.rename()<cr>";
key = "<leader>rn";
options = {
silent = true;
desc = "Rename symbol";
};
}
{
action = "<cmd>lua vim.diagnostic.goto_prev()<cr>";
key = "[d";
options = {
silent = true;
desc = "Previous diagnostic";
};
}
{
action = "<cmd>lua vim.diagnostic.goto_next()<cr>";
key = "]d";
options = {
silent = true;
desc = "Next diagnostic";
};
}
{
action = "<cmd>lua vim.diagnostic.open_float()<cr>";
key = "<leader>e";
options = {
silent = true;
desc = "Show diagnostic float";
}; };
} }
]; ];
+11 -30
View File
@@ -1,8 +1,4 @@
{ { den, modules, ... }:
den,
modules,
...
}:
{ {
modules.obs = settings: { modules.obs = settings: {
homeManager = homeManager =
@@ -16,29 +12,14 @@
programs = { programs = {
obs-studio = { obs-studio = {
enable = true; enable = true;
# package = ( package = (
# (pkgs.obs-studio.overrideAttrs (old: { pkgs.obs-studio.override {
# version = "32.2.0-beta2-unstable"; cudaSupport = true;
# src = pkgs.fetchFromGitHub { }
# owner = "obsproject"; );
# repo = "obs-studio";
# rev = "27ac23ef750aafb2bb7ddd499ede5755a5a3087f";
# hash = "sha256-3wPHNgYzR+ZIbCYMh5ocyK/nsQxy24Wfa03kheYOU88=";
# fetchSubmodules = true;
# };
# cmakeFlags = (old.cmakeFlags or []) ++ [
# "-DOBS_VERSION_OVERRIDE=32.2.0-beta2"
# ];
# })).override
# {
# cudaSupport = true;
# }
# );
package = pkgs.obs-studio.override { cudaSupport = true; };
plugins = with pkgs.obs-studio-plugins; [ plugins = with pkgs.obs-studio-plugins; [
obs-pipewire-audio-capture obs-pipewire-audio-capture
obs-vkcapture obs-vkcapture
obs-gstreamer
]; ];
}; };
}; };
@@ -55,8 +36,8 @@
}; };
Service = { Service = {
ExecStart = "${pkgs.writeShellScript "discord_audio_virt_device" '' ExecStart = "${pkgs.writeShellScript "discord_audio_virt_device" ''
pw-loopback -m '[ FL FR]' --capture-props='media.class=Audio/Sink node.name=DiscordSink' -n DiscordSink pw-loopback -m '[ FL FR]' --capture-props='media.class=Audio/Sink node.name=DiscordSink' -n DiscordSink
''}"; ''}";
Restart = "on-failure"; Restart = "on-failure";
RestartSec = "5s"; RestartSec = "5s";
}; };
@@ -71,8 +52,8 @@
}; };
Service = { Service = {
ExecStart = "${pkgs.writeShellScript "game_audio_virt_device" '' ExecStart = "${pkgs.writeShellScript "game_audio_virt_device" ''
pw-loopback -m '[ FL FR]' --capture-props='media.class=Audio/Sink node.name=GameAudioSink' -n GameAudioSink pw-loopback -m '[ FL FR]' --capture-props='media.class=Audio/Sink node.name=GameAudioSink' -n GameAudioSink
''}"; ''}";
Restart = "on-failure"; Restart = "on-failure";
RestartSec = "5s"; RestartSec = "5s";
}; };
@@ -82,7 +63,7 @@
lib.mergeAttrsList [ audio-set ]; lib.mergeAttrsList [ audio-set ];
wayland.windowManager.hyprland.settings = { wayland.windowManager.hyprland.settings = {
# exec-once = ["${config.programs.obs-studio.finalPackage}/bin/obs --startreplaybuffer"]; exec-once = [ "${config.programs.obs-studio.finalPackage}/bin/obs --startreplaybuffer" ];
}; };
}; };
}; };
+1 -1
View File
@@ -18,7 +18,7 @@
# Most energy efficent scheduler setup.. # Most energy efficent scheduler setup..
systemd.services.scx.environment = { systemd.services.scx.environment = {
SCX_SCHEDULER_OVERRIDE = "scx_lavd"; SCX_SCHEDULER_OVERRIDE = "scx_lavd";
SCX_FLAGS_OVERRIDE = "--powersave --no-core-compaction"; SCX_FLAGS_OVERRIDE = "--powersave --cpu-pref-order=0-4,5-11";
}; };
}; };
}; };
-5
View File
@@ -11,17 +11,12 @@
{ {
programs.quickshell = { programs.quickshell = {
systemd.enable = true; systemd.enable = true;
systemd.target = "hyprland-session.target";
enable = true; enable = true;
activeConfig = "main"; activeConfig = "main";
configs = { configs = {
main = config.lib.file.mkOutOfStoreSymlink "/home/doloro/dotfiles/config/modules/quickshell/quickshell"; main = config.lib.file.mkOutOfStoreSymlink "/home/doloro/dotfiles/config/modules/quickshell/quickshell";
}; };
}; };
# systemd.user.services.quickshell = {
# partOf = [ "hyprland-session.target" ];
# after = [ "hyprland-session.target" ];
# };
}; };
}; };
} }
@@ -1 +1 @@
/run/user/1000/quickshell/vfs/ca6d8e2cdd46bffdf799708f31d409fa/.qmlls.ini /run/user/1000/quickshell/vfs/6e389f6b800776b0595d9d90e42ebd04/.qmlls.ini
+8 -24
View File
@@ -22,31 +22,15 @@ Rectangle {
id: content id: content
height: 20 height: 20
anchors.centerIn: parent anchors.centerIn: parent
spacing: 4 Text {
Rectangle { id: speaker
implicitWidth: 24 text: root.defaultSpeaker.audio.muted ? "muted" : "unmuted"
implicitHeight: 20 color: Colors.textPrimary
color: "transparent"
Text {
anchors.centerIn: parent
text: root.defaultSpeaker.audio.muted ? "󰖁" : "󰕾"
font.family: "CaskaydiaCove NF"
font.pixelSize: 20
color: Colors.textPrimary
}
} }
Rectangle { Text {
implicitWidth: 24 id: mic
implicitHeight: 20 text: root.defaultMic.audio.muted ? "muted" : "unmuted"
color: "transparent" color: Colors.textPrimary
radius: 3
Text {
anchors.centerIn: parent
text: root.defaultMic.audio.muted ? "" : ""
font.family: "CaskaydiaCove NFM"
font.pixelSize: 30
color: Colors.textPrimary
}
} }
} }
} }
+13 -8
View File
@@ -7,28 +7,33 @@
}: }:
{ {
flake-file.inputs = { flake-file.inputs = {
raspberry-pi-nix.url = "github:cmyk/raspberry-pi-nix"; raspberry-pi-nix.url = "github:nix-community/raspberry-pi-nix";
nixos-raspberrypi.url = "github:nvmd/nixos-raspberrypi/main";
nixos-hardware.url = "github:NixOS/nixos-hardware/master";
}; };
modules.raspberry-pi = { modules.raspberry-pi = {
provides = { provides = {
"5" = { "5" = {
nixos = nixos =
{ pkgs, ... }: { pkgs, ... }:
let
rpi-pi = inputs.raspberry-pi-nix;
in
{ {
imports = [ imports = [
inputs.nixos-hardware.nixosModules.raspberry-pi-5 rpi-pi.nixosModules.raspberry-pi
rpi-pi.nixosModules.sd-image
]; ];
boot.kernelPackages = pkgs.linuxPackages;
boot.kernel.sysctl."vm.mmap_rnd_bits" = pkgs.lib.mkForce 16;
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
libraspberrypi libraspberrypi
]; ];
boot.supportedFilesystems.zfs = false; sdImage.compressImage = false;
raspberry-pi-nix.board = "bcm2712"; # Rpi 5 - 64bit
# We need to rebuild kernel for 6.12
# raspberry-pi-nix.kernel-version = "v6_12_17";
raspberry-pi-nix.uboot.enable = false;
hardware.enableRedistributableFirmware = true;
}; };
}; };
}; };
+17 -19
View File
@@ -3,11 +3,10 @@ root-hashed_password: ENC[AES256_GCM,data:vzVtz1Ht4XD+omdKjU/Zvoaftq8jKE4kxOjAGZ
wakatime-scug-io-api-key: ENC[AES256_GCM,data:XQUccNW4210U8ZpHSGVcsdbAirzyTvmcy4y6emk7n4N6MO/W,iv:9/f9ceLshA7l8hJB+IDIPvEwYwSkFlPOLmpvtYXLTpU=,tag:x7hESZCouzYVNef2C+iCSA==,type:str] wakatime-scug-io-api-key: ENC[AES256_GCM,data:XQUccNW4210U8ZpHSGVcsdbAirzyTvmcy4y6emk7n4N6MO/W,iv:9/f9ceLshA7l8hJB+IDIPvEwYwSkFlPOLmpvtYXLTpU=,tag:x7hESZCouzYVNef2C+iCSA==,type:str]
meow: ENC[AES256_GCM,data:JVzenw==,iv:oCOo9//r5s2K4pSeH5UNEj0LL+9h2yq0G0DPOfwjmyQ=,tag:0gu9FNOrjQ8fpB+B+RbGSg==,type:str] meow: ENC[AES256_GCM,data:JVzenw==,iv:oCOo9//r5s2K4pSeH5UNEj0LL+9h2yq0G0DPOfwjmyQ=,tag:0gu9FNOrjQ8fpB+B+RbGSg==,type:str]
meoww: ENC[AES256_GCM,data:WPeszDfMWxY=,iv:JJMOror5wj7cTNKfrUj2LDXlO3WCKzb7jk4AeZ0oD+Q=,tag:qs3oyM7K1FGy5cXvS6OHpQ==,type:str] meoww: ENC[AES256_GCM,data:WPeszDfMWxY=,iv:JJMOror5wj7cTNKfrUj2LDXlO3WCKzb7jk4AeZ0oD+Q=,tag:qs3oyM7K1FGy5cXvS6OHpQ==,type:str]
scug-io-ai-key: ENC[AES256_GCM,data:b2AT2+A5eoGa1eZsCYKDFg449sOgffDcQA==,iv:NDIS3x1unq6/UtjtsyBTHx5v12utagDA3BbNzs5v3L0=,tag:MhbJGATIDWyOZUqXqRAeVA==,type:str]
opencode-go-zen-key: ENC[AES256_GCM,data:fwgV/QK+4tpizC6J3evbGxD57BQCWn5Eyex7iIeNYCQHk6ZD8eTukqhUbLcfXyO4RQot3B1B2xbQVVBsuOWWcQYQKA==,iv:aKwQM8d0gP+MyuqWFk2VfOWDgKPcE/HAvL0I0r6o1nU=,tag:/AeSgscy0mxUMwoP8LaCXg==,type:str]
sops: sops:
age: age:
- enc: | - recipient: age1ykcy2r4kk729e7adqxu8s24ujc60z5eux7ma0ca4ruzydwgm5p6qmdp838
enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiZC9ZVlY2T0tXdy90b2hV YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiZC9ZVlY2T0tXdy90b2hV
dDUxUjNyMjllQStaa0tKRy9YVkNIdFJyWTI4CitYNnhxN3JHQ3lsWXp2Tmgwek9n dDUxUjNyMjllQStaa0tKRy9YVkNIdFJyWTI4CitYNnhxN3JHQ3lsWXp2Tmgwek9n
@@ -15,8 +14,8 @@ sops:
MkVQY3h2OGhGaGNnYkVJUU1kK3F3VWMKs9B74KovGxx8KL5q/lGA/imVRM/i3mo/ MkVQY3h2OGhGaGNnYkVJUU1kK3F3VWMKs9B74KovGxx8KL5q/lGA/imVRM/i3mo/
a6Rbxufscp3WWGMbo70w8tWuRsAnIpUGh3EvWCekZ9nOzeMiVA8I2Q== a6Rbxufscp3WWGMbo70w8tWuRsAnIpUGh3EvWCekZ9nOzeMiVA8I2Q==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1ykcy2r4kk729e7adqxu8s24ujc60z5eux7ma0ca4ruzydwgm5p6qmdp838 - recipient: age1e6vws55p0g23qzthm4qa93hpt6lqmck6670gkygph0sc0j7my4uq5wqjfh
- enc: | enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0dXJzYndvSC92aElvTVpz YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0dXJzYndvSC92aElvTVpz
SUtTOWFzcUJxOHVrTk5scm5tcGkzRmEvK1hVClNVbmp3ZjBRTW5ZNXVNNGh3dSti SUtTOWFzcUJxOHVrTk5scm5tcGkzRmEvK1hVClNVbmp3ZjBRTW5ZNXVNNGh3dSti
@@ -24,8 +23,8 @@ sops:
Tk5Zd0h3OHRpQzZjazJKUStPUVdERzQKGnoKYKq7pPJUrcAWJ4/tm8mSxuthjssz Tk5Zd0h3OHRpQzZjazJKUStPUVdERzQKGnoKYKq7pPJUrcAWJ4/tm8mSxuthjssz
7IsjH4t6VCyug2c7XnLJpcE64yPD+GrXHYixP0r2qj80WMjpv7N7qA== 7IsjH4t6VCyug2c7XnLJpcE64yPD+GrXHYixP0r2qj80WMjpv7N7qA==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1e6vws55p0g23qzthm4qa93hpt6lqmck6670gkygph0sc0j7my4uq5wqjfh - recipient: age1x3lahhkefkap67cdmdjcqaxan9hp62er78akr79v9m73nvgugpeqk0y32a
- enc: | enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBLbGQ3MkVCUldqa3dYRTg0 YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBLbGQ3MkVCUldqa3dYRTg0
NjVoUDdIc0RvSU02R0o0ZVk4KzVQMkZmeXpjClJaUUU3WTJVQmJkRzV4UTc3bXFI NjVoUDdIc0RvSU02R0o0ZVk4KzVQMkZmeXpjClJaUUU3WTJVQmJkRzV4UTc3bXFI
@@ -33,8 +32,8 @@ sops:
QzhtM3V3VGFzdk9UenV6akxGNDh5d3cKdIKNPvM0GRJamiS4AXRNU+TbuZUnM6K7 QzhtM3V3VGFzdk9UenV6akxGNDh5d3cKdIKNPvM0GRJamiS4AXRNU+TbuZUnM6K7
FtC1dmHlyU/tXlFHv6TNlMZQtDgIVnE72Jvk48maq3oKiJAXWk11fg== FtC1dmHlyU/tXlFHv6TNlMZQtDgIVnE72Jvk48maq3oKiJAXWk11fg==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1x3lahhkefkap67cdmdjcqaxan9hp62er78akr79v9m73nvgugpeqk0y32a - recipient: age1exzngtk4d9vcsmcq6ap5xx3ca9qacqjkrv86ymged7msx9z6vfyqsf5sjq
- enc: | enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBoOHlRcnRwWUYwUGRSVW9s YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBoOHlRcnRwWUYwUGRSVW9s
cmdDZjN1RGFRVWtlODBudGpaemd3UDBZcnhRCksyWlk3VW91a3pnOGNQQVppM09z cmdDZjN1RGFRVWtlODBudGpaemd3UDBZcnhRCksyWlk3VW91a3pnOGNQQVppM09z
@@ -42,8 +41,8 @@ sops:
bWFTMlhCL2IrZjlEOUFydmE4cHBzSmMKhIk8TZtRsIFKzopZCyp27SWYeHmf6jKn bWFTMlhCL2IrZjlEOUFydmE4cHBzSmMKhIk8TZtRsIFKzopZCyp27SWYeHmf6jKn
VoIXQ6/VRRQjCYBsseZE5N+ycnr4ZC/RpXJ577G4TfGMCcixX67AfA== VoIXQ6/VRRQjCYBsseZE5N+ycnr4ZC/RpXJ577G4TfGMCcixX67AfA==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1exzngtk4d9vcsmcq6ap5xx3ca9qacqjkrv86ymged7msx9z6vfyqsf5sjq - recipient: age1fw4xnh2q52juce94ffn54js708cr6umfwpv0mykuddkea7kr4f0q7a9h05
- enc: | enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBuTG9LKzVvUjZEZ1lkMVJN YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBuTG9LKzVvUjZEZ1lkMVJN
eldHSkRXQ241bnZmbHBmSXFNMU1seGcyaVNRCjNPaS9ITEJtdGRwOENDRytEMFk1 eldHSkRXQ241bnZmbHBmSXFNMU1seGcyaVNRCjNPaS9ITEJtdGRwOENDRytEMFk1
@@ -51,8 +50,8 @@ sops:
WTR2RU9GUVdsZHdleW1Gd2lyRENzSm8KznMUQ6Ah8O03AzZcCXgUIjjrV1cdkAnq WTR2RU9GUVdsZHdleW1Gd2lyRENzSm8KznMUQ6Ah8O03AzZcCXgUIjjrV1cdkAnq
Pbr2BwdLzJvlF5lzmymIZEt35euv/HzhJGWDLWGpYJmYj/N8qZgBuA== Pbr2BwdLzJvlF5lzmymIZEt35euv/HzhJGWDLWGpYJmYj/N8qZgBuA==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1fw4xnh2q52juce94ffn54js708cr6umfwpv0mykuddkea7kr4f0q7a9h05 - recipient: age1pa8cecxaw4y4zea6zjnt0k0mz38g4qunmp6trwy5fvdvw88ttcgsv2dgrv
- enc: | enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAxSDNMRlNaMXB2ZXBPTlNu YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAxSDNMRlNaMXB2ZXBPTlNu
eG5BWE5xRTNnVUFtN2psUFVHejZVbFVCQTBFCkRXQitoL0VJaXZmMlI3Q0JHVWk1 eG5BWE5xRTNnVUFtN2psUFVHejZVbFVCQTBFCkRXQitoL0VJaXZmMlI3Q0JHVWk1
@@ -60,8 +59,8 @@ sops:
Q0x4bDFBTzV2L0E3UXQxMUdubVJZRTgKcPQZ9zHQAFwP/Odnh5INleUsHSN06U+x Q0x4bDFBTzV2L0E3UXQxMUdubVJZRTgKcPQZ9zHQAFwP/Odnh5INleUsHSN06U+x
X98535uapyJR/Wswxj6ukdciMOou8cLfOInLwJgWOf6mZklEhecVXA== X98535uapyJR/Wswxj6ukdciMOou8cLfOInLwJgWOf6mZklEhecVXA==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1pa8cecxaw4y4zea6zjnt0k0mz38g4qunmp6trwy5fvdvw88ttcgsv2dgrv - recipient: age1kc0xu0ue2nrrr7w4gam7wlzackv8jv243rxwwndgxjqklgtnp5csdtpgzp
- enc: | enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTaE1mUUlyVUxKQmhPMnlT YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTaE1mUUlyVUxKQmhPMnlT
eS81cE5TeE1WWFVIRkdWT3c0ckhNMnFYZGxrCnp4My9nK20zcGVxUFZ0cnVVTDBS eS81cE5TeE1WWFVIRkdWT3c0ckhNMnFYZGxrCnp4My9nK20zcGVxUFZ0cnVVTDBS
@@ -69,8 +68,7 @@ sops:
bzJvaUg2VkFrazBoWmlIY2hKeUdhTjQKbgW+ysm3TWBKfVoKAeqvaPio29SyzjJP bzJvaUg2VkFrazBoWmlIY2hKeUdhTjQKbgW+ysm3TWBKfVoKAeqvaPio29SyzjJP
61QsSqCuJyEwSPpOzeWa5NChcCjitOUG1jEMsSHlpIslKA1P7g/P9g== 61QsSqCuJyEwSPpOzeWa5NChcCjitOUG1jEMsSHlpIslKA1P7g/P9g==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1kc0xu0ue2nrrr7w4gam7wlzackv8jv243rxwwndgxjqklgtnp5csdtpgzp lastmodified: "2026-02-14T00:08:39Z"
lastmodified: "2026-08-01T18:33:13Z" mac: ENC[AES256_GCM,data:lp9ZeDxt5gkOkDmYk+F0VQrVhkR0tQiQlYXbygoA8Dcq+gV0IIKKLwRqr5CVfgfRlo3239IwmKLsGaS6zYC1xX4toZ8oqw3Ic2UvP2CiWt6M7HTrlL+3Y2+PKOUvGl7RAqQxQAw7QaoxB4esqdIiWnMDueVHk5BTKrkay+afhno=,iv:NAMaZ9SMBAtROTBSQtU0RJDB60MAuE82AFoPtDqVHVM=,tag:RGBUTQC1pM+LcBweSJbc6w==,type:str]
mac: ENC[AES256_GCM,data:sTTpvCTBPsY4OABqIvgujUT2+Yye+H44mxN3G3ybhoj05omgFajYN86sc3zL9vbiTl7SNxCWMkGCerCvS4QrtRZ0vRTNuYNkFPNHDKniSybbxKzjHqyXWGCOoNYqHW211ktB9vmiXQd+zYart87kUU6d6p2FrVDBLU03eQwJO6k=,iv:8zT8W34A8f/EXRYxFeK2PC2Ko6UrjFrPL5+lwNXpb4Q=,tag:WugeYbmrVcUZ9xVC+r3c7w==,type:str]
unencrypted_suffix: _unencrypted unencrypted_suffix: _unencrypted
version: 3.13.3 version: 3.11.0
+1 -2
View File
@@ -15,8 +15,7 @@
inputs.sops-nix.homeManagerModules.sops inputs.sops-nix.homeManagerModules.sops
]; ];
sops = { sops = {
age.keyFile = "/home/doloro/.config/sops/age/keys.txt"; # must have no password! age.keyFile = "/home/doloro/.config/sops/age/key.txt"; # must have no password!
# I HATE YOU
defaultSopsFile = ./content/secrets.yaml; defaultSopsFile = ./content/secrets.yaml;
}; };
}; };
+10 -10
View File
@@ -3,18 +3,18 @@
__findFile, __findFile,
modules, modules,
... ...
}: { }:
{
# Basic caddy # Basic caddy
modules.services.provides.caddy = { modules.services.provides.caddy = {
nixos = {config, ...}: { nixos =
services.caddy = { { config, ... }:
enable = true; {
email = "doloroo@proton.me"; services.caddy = {
enableReload = true; enable = true;
globalConfig = '' email = "doloroo@proton.me";
acme_ca https://acme-v02.api.letsencrypt.org/directory enableReload = true;
''; };
}; };
};
}; };
} }
+26 -34
View File
@@ -3,43 +3,35 @@
__findFile, __findFile,
modules, modules,
... ...
}: { }:
{
# Basic traefik # Basic traefik
modules.services.provides.ddns = { modules.services.provides.ddns = {
nixos = { nixos =
config, { config, pkgs, ... }:
pkgs, let
... ddnsImg = pkgs.dockerTools.pullImage {
}: let imageName = "qmcgaw/ddns-updater";
ddnsImg = pkgs.dockerTools.pullImage { imageDigest = "sha256:ee16ab4f6203bf9e5b0925d38a0b4ebf2d9f23771f933cfb2f5a2dbd5f9a2f88";
imageName = "qmcgaw/ddns-updater"; finalImageName = "qmcgaw/ddns-updater";
imageDigest = "sha256:ee16ab4f6203bf9e5b0925d38a0b4ebf2d9f23771f933cfb2f5a2dbd5f9a2f88"; finalImageTag = "latest";
finalImageName = "qmcgaw/ddns-updater"; sha256 = "sha256-dMCHkvoFaORmGwbIM9io4Vc9fq+wBks25k2dmnW7naI=";
finalImageTag = "latest"; arch = "arm64";
sha256 = "sha256-dMCHkvoFaORmGwbIM9io4Vc9fq+wBks25k2dmnW7naI="; };
arch = "arm64"; in
}; {
in { virtualisation.oci-containers.containers = {
virtualisation.oci-containers.containers = { ddns = {
ddns = { image = "qmcgaw/ddns-updater";
image = "qmcgaw/ddns-updater"; imageFile = ddnsImg;
imageFile = ddnsImg; volumes = [
volumes = [ "/data/ddns:/updater/data"
"/data/ddns:/updater/data" "/etc/localtime:/etc/localtime:ro"
"/etc/localtime:/etc/localtime:ro" ];
]; # ports = [ "0.0.0.0:8123:8123" ];
ports = ["0.0.0.0:8125:8000"]; # networks = [ "meow" ];
# networks = [ "meow" ]; };
}; };
}; };
services.caddy = pkgs.lib.mkIf config.services.caddy.enable {
virtualHosts."ddns.h.doloro.co.uk".extraConfig = ''
reverse_proxy :8125
basic_auth {
doloro $2a$14$FH.UkwC0PUsQ7IEV9XLAf.6/11KLsugCbrX/o6dPTx7NBlJWv3aiO
}
'';
};
};
}; };
} }
-49
View File
@@ -1,49 +0,0 @@
{
den,
__findFile,
modules,
...
}: {
# Basic traefik
modules.services.provides.docker-registry = {
nixos = {
config,
pkgs,
...
}: let
registryImg = pkgs.dockerTools.pullImage {
imageName = "registry";
imageDigest = "sha256:85347ed2ecde64161c7a4788a4d7d3dcc9d6f86f7be95834022e3c6a423a945a";
finalImageName = "registry";
finalImageTag = "3";
sha256 = "sha256-rLG0q/MVVz52veqZuZs5W0Qke6FugXkx7fMe3QnE3gU";
arch = "arm64";
};
in {
virtualisation.oci-containers.containers = {
docker-registry = {
image = "registry";
imageFile = registryImg;
volumes = [
"/data/dockerRegistry:/var/lib/registry"
"/run/dbus:/run/dbus:ro"
"/etc/localtime:/etc/localtime:ro"
];
ports = ["0.0.0.0:5000:5000"];
# networks = [ "meow" ];
};
};
networking.firewall = {
allowedTCPPorts = [
5000
];
allowedUDPPortRanges = [];
};
services.caddy = pkgs.lib.mkIf config.services.caddy.enable {
virtualHosts."https://reg.h.doloro.co.uk".extraConfig = ''
reverse_proxy :5000
'';
};
};
};
}
-105
View File
@@ -1,105 +0,0 @@
{
den,
__findFile,
modules,
...
}:
{
modules.services.provides.rtmp-to-whip = {
nixos =
{
config,
pkgs,
...
}:
{
systemd.services.init-rtmp-to-whip-network = {
description = "Create rtmp-to-whip docker network";
after = [
"docker.service"
"docker.socket"
];
requires = [
"docker.service"
"docker.socket"
];
before = [
"docker-rtmp-to-whip.service"
"docker-rtmp-to-whip-frontend.service"
];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
script = ''
${pkgs.docker}/bin/docker network inspect rtmp-to-whip >/dev/null 2>&1 || \
${pkgs.docker}/bin/docker network create rtmp-to-whip
'';
};
virtualisation.oci-containers.containers = {
rtmp-to-whip = {
image = "reg.h.doloro.co.uk/doloro/rtmp-to-whip:latest-aarch64";
ports = [
"0.0.0.0:1935:1935"
"0.0.0.0:6969:6969/udp"
"127.0.0.1:3001:3000"
];
environment = {
PUBLIC_DOMAIN = "stream.h.doloro.co.uk";
RTC_PORT = "6969";
SIGNUP_CODE = "mreowmreow-pawsatyou";
RUST_LOG = "info,warn";
};
volumes = [
"/data/rtmp-to-whip/db:/db"
];
extraOptions = [ "--network=rtmp-to-whip" ];
};
rtmp-to-whip-frontend = {
image = "reg.h.doloro.co.uk/doloro/rtmp-to-whip-frontend:latest-aarch64";
ports = [
"127.0.0.1:3002:3000"
];
environment = {
VITE_API_URL = "https://stream.h.doloro.co.uk/api";
};
extraOptions = [ "--network=rtmp-to-whip" ];
};
rtmp-to-whip-watchtower = {
image = "ghcr.io/nicholas-fedor/watchtower:latest";
volumes = [
"/var/run/docker.sock:/var/run/docker.sock"
];
environment = {
WATCHTOWER_CLEANUP = "true";
WATCHTOWER_POLL_INTERVAL = "300";
};
cmd = [
"rtmp-to-whip"
"rtmp-to-whip-frontend"
];
};
};
networking.firewall = {
allowedTCPPorts = [ 1935 ];
allowedUDPPorts = [ 6969 ];
};
services.caddy = pkgs.lib.mkIf config.services.caddy.enable {
virtualHosts."stream.h.doloro.co.uk".extraConfig = ''
handle /api* {
reverse_proxy :3001
}
handle {
reverse_proxy :3002
}
'';
};
};
};
}
+3 -3
View File
@@ -8,10 +8,10 @@
ssh = { ssh = {
enable = true; enable = true;
enableDefaultConfig = false; enableDefaultConfig = false;
settings = { matchBlocks = {
"*" = { "*" = {
AddKeysToAgent = "yes"; addKeysToAgent = "yes";
IdentityFile = [ identityFile = [
"~/.ssh/id_ed25519" "~/.ssh/id_ed25519"
"~/.ssh/id_gitea_scug" "~/.ssh/id_gitea_scug"
]; ];
+27 -22
View File
@@ -3,7 +3,8 @@
modules, modules,
inputs, inputs,
... ...
}: { }:
{
flake-file.inputs = { flake-file.inputs = {
stylix = { stylix = {
url = "github:nix-community/stylix"; url = "github:nix-community/stylix";
@@ -11,29 +12,33 @@
}; };
}; };
modules.stylix = { modules.stylix = {
homeManager = {pkgs, ...}: { homeManager =
imports = [inputs.stylix.homeModules.stylix]; { pkgs, ... }:
# gtk.gtk4.theme = null; {
stylix = { imports = [ inputs.stylix.homeModules.stylix ];
enable = true; gtk.gtk4.theme = null;
autoEnable = false; stylix = {
targets.gtk.enable = true; enable = true;
targets.qt.enable = true; autoEnable = false;
targets.tmux.enable = false; targets.gtk.enable = true;
fonts = { targets.qt.enable = true;
monospace = { targets.tmux.enable = false;
name = "CaskaydiaCove Nerd Font Mono"; fonts = {
package = pkgs.nerd-fonts.caskaydia-cove; monospace = {
name = "CaskaydiaCove Nerd Font Mono";
package = pkgs.nerd-fonts.caskaydia-cove;
};
}; };
base16Scheme = "${pkgs.base16-schemes}/share/themes/gruvbox-dark-hard.yaml";
}; };
base16Scheme = "${pkgs.base16-schemes}/share/themes/gruvbox-dark-hard.yaml";
}; };
}; nixos =
nixos = {pkgs, ...}: { { pkgs, ... }:
imports = [inputs.stylix.nixosModules.stylix]; {
stylix.enable = false; imports = [ inputs.stylix.nixosModules.stylix ];
stylix.autoEnable = false; stylix.enable = false;
stylix.base16Scheme = "${pkgs.base16-schemes}/share/themes/gruvbox-dark-hard.yaml"; stylix.autoEnable = false;
}; stylix.base16Scheme = "${pkgs.base16-schemes}/share/themes/gruvbox-dark-hard.yaml";
};
}; };
} }
+1 -1
View File
@@ -6,7 +6,7 @@
}: }:
{ {
flake-file.inputs = { flake-file.inputs = {
x1e-kernel.url = "git+https://git.scug.io/nikkuss/x1e-nixos.git"; x1e-kernel.url = "git+https://git.scug.io/doloro/x1e-nixos.git?ref=bump-7.1-rc1";
}; };
modules.surface-patches = { modules.surface-patches = {
nixos = nixos =
+5 -12
View File
@@ -2,11 +2,7 @@
{ {
modules.tmux = { modules.tmux = {
homeManager = homeManager =
{ { home, pkgs, ... }:
home,
pkgs,
...
}:
{ {
programs.tmux = { programs.tmux = {
enable = true; enable = true;
@@ -15,13 +11,10 @@
minimal-tmux-status minimal-tmux-status
]; ];
extraConfig = '' extraConfig = ''
set-option -g default-terminal "tmux-256color" set-option -g default-terminal "xterm-256color"
set -as terminal-features ",xterm-256color:RGB" set -a terminal-features "xterm-256color:RGB"
set -g status-bg black set -g status-bg black
set -g status-fg white set -g status-fg white
set -g mouse on
set -g extended-keys on
set -g allow-passthrough on
''; '';
}; };
}; };
+1 -1
View File
@@ -8,7 +8,7 @@
enable = true; enable = true;
settings = { settings = {
default_session = { default_session = {
command = "${pkgs.tuigreet}/bin/tuigreet --sessions ${config.services.displayManager.sessionData.desktops}/share/xsessions:${config.services.displayManager.sessionData.desktops}/share/wayland-sessions --remember --remember-user-session --greeting 'meow meow meow' --time"; command = "${pkgs.greetd.tuigreet}/bin/tuigreet --sessions ${config.services.xserver.displayManager.sessionData.desktops}/share/xsessions:${config.services.xserver.displayManager.sessionData.desktops}/share/wayland-sessions --remember --remember-user-session --greeting 'meow meow meow' --time";
user = "greeter"; user = "greeter";
}; };
}; };
-11
View File
@@ -1,11 +0,0 @@
{modules, ...}: {
modules.unity = {
homeManager = {pkgs, ...}: {
home.packages = [pkgs.unityhub pkgs.alcom pkgs.unityhub.fhsEnv];
home.file."unityExec" = {
source = "${pkgs.unityhub}/bin/unityhub";
recursive = true;
};
};
};
}
-1
View File
@@ -7,7 +7,6 @@
users.users.${user.userName} = { users.users.${user.userName} = {
extraGroups = [ extraGroups = [
"wheel" "wheel"
"libvirtd"
"networkmanager" "networkmanager"
]; ];
}; };
-61
View File
@@ -1,61 +0,0 @@
{ den, modules, ... }:
{
modules.wivrn = {
homeManager =
{ pkgs, ... }:
{
home.packages = with pkgs; [
wivrn
wayvr
];
};
nixos =
{ pkgs, lib, ... }:
{
services.wivrn = {
enable = true;
openFirewall = true;
autoStart = true;
highPriority = true;
# Low-latency encoder config
extraServerFlags = [ ];
monadoEnvironment = {
# Monado OpenXR runtime env vars
};
steam = {
enable = true;
importOXRRuntimes = true;
};
# Optimal config for low latency:
# - Vulkan encoder (newer kernels) or vaapi (AMD/Intel)
# - H265 codec (3ms overhead, better quality than H264)
# - 90Hz refresh rate (balance quality/battery)
# - 140% render resolution with quality supersampling
# - Up to 200Mbit/s bitrate on good networks
config.enable = true;
config.json = {
encoder = {
encoder = "nvenc";
codec = "h265";
};
# Enable mDNS discovery
"publish-service" = "avahi";
# High priority for async reprojection
highPriority = true;
};
};
# Include monado-vulkan-layers for VR rendering
environment.systemPackages = with pkgs; [
monado-vulkan-layers
];
};
};
}
-15
View File
@@ -1,15 +0,0 @@
{
modules,
den,
inputs,
...
}: {
flake-file.inputs = {
nixos-wsl.url = "github:nix-community/NixOS-WSL";
};
modules.wsl = {
nixos = {
imports = [inputs.nixos-wsl.nixosModules.default];
};
};
}
Generated
+340 -635
View File
File diff suppressed because it is too large Load Diff
+4 -12
View File
@@ -4,7 +4,6 @@
inputs = { inputs = {
den.url = "github:vic/den?ref=8101ec865c0bf4027d40b9fd8951e3e435a86d64"; den.url = "github:vic/den?ref=8101ec865c0bf4027d40b9fd8951e3e435a86d64";
direnv-instant.url = "github:Mic92/direnv-instant";
disko.url = "github:nix-community/disko"; disko.url = "github:nix-community/disko";
flake-file.url = "github:vic/flake-file"; flake-file.url = "github:vic/flake-file";
flake-parts = { flake-parts = {
@@ -21,10 +20,9 @@
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
hyprland.url = "github:hyprwm/Hyprland"; hyprland.url = "github:hyprwm/Hyprland";
hytale-launcher.url = "github:JPyke3/hytale-launcher-nix";
import-tree.url = "github:vic/import-tree"; import-tree.url = "github:vic/import-tree";
nik-pkgs = { nik-pkgs = {
url = "git+https://git.scug.io/nikkuss/pkgs.git?ref=main"; url = "git+https://git.scug.io/nikkuss/pkgs.git";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
niri-flake = { niri-flake = {
@@ -32,15 +30,9 @@
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
nix-cachyos-kernel.url = "github:xddxdd/nix-cachyos-kernel/release"; nix-cachyos-kernel.url = "github:xddxdd/nix-cachyos-kernel/release";
nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=latest"; nixpkgs.url = "https://channels.nixos.org/nixpkgs-unstable/nixexprs.tar.xz";
nixos-hardware.url = "github:NixOS/nixos-hardware/master";
nixos-raspberrypi.url = "github:nvmd/nixos-raspberrypi/main";
nixos-wsl.url = "github:nix-community/NixOS-WSL";
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
nixpkgs-master.url = "github:NixOS/nixpkgs/master";
nixvim.url = "github:nix-community/nixvim"; nixvim.url = "github:nix-community/nixvim";
omp-nix.url = "git+https://git.molez.org/mandlm/omp-nix?ref=main"; raspberry-pi-nix.url = "github:nix-community/raspberry-pi-nix";
raspberry-pi-nix.url = "github:cmyk/raspberry-pi-nix";
sops-nix = { sops-nix = {
url = "github:Mic92/sops-nix"; url = "github:Mic92/sops-nix";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
@@ -50,7 +42,7 @@
url = "github:nix-community/stylix"; url = "github:nix-community/stylix";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
x1e-kernel.url = "git+https://git.scug.io/nikkuss/x1e-nixos.git"; x1e-kernel.url = "git+https://git.scug.io/doloro/x1e-nixos.git?ref=bump-7.1-rc1";
zen-browser = { zen-browser = {
url = "github:youwen5/zen-browser-flake"; url = "github:youwen5/zen-browser-flake";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";