Compare commits

...

26 Commits

Author SHA1 Message Date
2913f0c8e1 fix(scripts): correct aichat role syntax
Some checks are pending
Flake checker / Build Nix targets (push) Waiting to run
2026-01-28 14:34:31 +05:30
fb7c219cf2 feat: Disable mpv on macos
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-28 13:49:31 +05:30
581fa74f19 feat: Add embedding model and extraPackages to aichat
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-27 16:37:57 +05:30
3f1f23391a feat: Disable nixvim grammarPackages for now because of is-not treesitter
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-26 23:54:38 +05:30
ddb0345587 feat: Update use local model
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-26 20:59:27 +05:30
99494b8777 feat: Remove command runner 2026-01-26 20:55:15 +05:30
4c385b2653 feat: Update to latest flake.lock
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-26 01:06:30 +05:30
f32d7d3643 feat: Added hytale
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-25 15:30:45 +05:30
ab4c22592a feat(games): add Hytale game module and Flatpak support
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-24 23:50:55 +05:30
869778df2a feat(nix): integrate cratesNix across Darwin and home modules
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-23 16:27:52 +05:30
0a2ad32dfb feat: Use different partition for swapfile
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-23 12:59:50 +05:30
230547eb92 feat: extend ghostty shader, add shadps4 builds, update nix, homepage
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-21 20:21:25 +05:30
3beb85c474 chore(flake): update flake.lock 2026-01-21 10:41:33 +05:30
101331cbc9 refactor: switch ping to siteMonitor and enable GLSL analyzer 2026-01-21 02:09:15 +05:30
d803dd9dc8 refactor(nixos): add ping to homepage 2026-01-20 17:00:57 +05:30
509a9b49ed feat(nixos): enable immich ml; bind localhost; add ollama env 2026-01-18 21:35:15 +05:30
a97ff2c46d chore(flake): update flake.lock
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-15 02:16:54 +05:30
6453bb62a1 feat(kellnr): add sops config and docs flag, dynamic domain vhost
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-14 12:08:19 +05:30
67305549bc feat: Added kellnr
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-14 11:45:10 +05:30
6ff14a1aa4 feat(vicinae): Adde pactl for sound plugin
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-13 17:14:45 +05:30
9a6d19b101 feat(atuin): add macOS launchd daemon agent
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-13 16:23:45 +05:30
2494e8ce83 feat(yazi): add config arg and preview cache_dir
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-13 16:01:52 +05:30
f90f84b3f7 feat(overlays): override libfprint to CS9711 fork with deps
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-13 15:36:16 +05:30
3db69c9e41 chore(darwin): prune kuro packages, update shiro casks, add 1password
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-13 15:23:12 +05:30
ac55fa4426 refactor: update aichat model; add atuin daemon; cleanup gui
Some checks failed
Flake checker / Build Nix targets (push) Has been cancelled
2026-01-13 15:20:13 +05:30
5a195af336 feat(home): added binwalk 2026-01-13 14:46:19 +05:30
50 changed files with 1303 additions and 575 deletions

1
.ignore Normal file
View File

@@ -0,0 +1 @@
*.lock

View File

@@ -1,6 +1,6 @@
# Machines # Machines
1. Ryu Dektop (Intel i9-14900KS / Nvidia 5090 / DDR5 64GB CL36@6000MTs) 1. Ryu Dektop (Intel i9-14900KS / Nvidia RTX 5090 / DDR5 64GB CL36@6000MTs)
``` ```
deploy -s .#ryu deploy -s .#ryu
``` ```

View File

@@ -3,6 +3,7 @@
inputs, inputs,
nix-darwin, nix-darwin,
overlays, overlays,
nixpkgs,
... ...
}: (builtins.mapAttrs ( }: (builtins.mapAttrs (
name: device: name: device:
@@ -11,6 +12,7 @@
specialArgs = { specialArgs = {
inherit device inputs; inherit device inputs;
stablePkgs = inputs.nixpkgs-stable.legacyPackages.${device.system}; stablePkgs = inputs.nixpkgs-stable.legacyPackages.${device.system};
cratesNix = inputs.crates-nix.mkLib {pkgs = nixpkgs.legacyPackages.${device.system};};
}; };
modules = [ modules = [
inputs.home-manager.darwinModules.home-manager inputs.home-manager.darwinModules.home-manager

View File

@@ -28,7 +28,7 @@
extra-nix-path = nixpkgs=flake:nixpkgs extra-nix-path = nixpkgs=flake:nixpkgs
builders-use-substitutes = true builders-use-substitutes = true
''; '';
package = pkgs.nixVersions.latest; package = pkgs.nixVersions.nix_2_32;
buildMachines = [ buildMachines = [
../../builders/tako.nix ../../builders/tako.nix
../../builders/shiro.nix ../../builders/shiro.nix

View File

@@ -8,11 +8,8 @@
"lunar" "lunar"
"orcaslicer" "orcaslicer"
"raycast" "raycast"
"shapr3d"
"vlc"
"zed" "zed"
"zen" "zen"
"lm-studio"
]; ];
}; };
} }

View File

@@ -1,6 +1,5 @@
{stablePkgs, ...}: { {...}: {
services.tailscale = { services.tailscale = {
enable = true; enable = true;
# package = stablePkgs.tailscale;
}; };
} }

View File

@@ -5,12 +5,10 @@
"docker-compose" "docker-compose"
]; ];
casks = [ casks = [
"1password"
"docker" "docker"
"raycast" "raycast"
"lunar" "lunar"
"virtual-desktop-streamer"
"kicad"
"shapr3d"
"orcaslicer" "orcaslicer"
"zed" "zed"
"zen" "zen"

665
flake.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -189,11 +189,6 @@
url = "github:uttarayan21/ddcbacklight"; url = "github:uttarayan21/ddcbacklight";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
command-runner = {
url = "github:uttarayan21/command-runner";
# url = "path:/home/servius/Projects/command-runner";
inputs.nixpkgs.follows = "nixpkgs";
};
hyprmonitors = { hyprmonitors = {
url = "git+https://git.darksailor.dev/servius/hyprmonitors"; url = "git+https://git.darksailor.dev/servius/hyprmonitors";
# url = "path:/home/servius/Projects/hyprmonitors"; # url = "path:/home/servius/Projects/hyprmonitors";
@@ -230,7 +225,14 @@
url = "github:xatuke/handoff"; url = "github:xatuke/handoff";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
crates-nix.url = "github:uttarayan21/crates.nix"; crates-io-index = {
url = "git+https://github.com/rust-lang/crates.io-index?shallow=1";
flake = false;
};
crates-nix = {
url = "github:uttarayan21/crates.nix";
inputs.crates-io-index.follows = "crates-io-index";
};
headplane = { headplane = {
url = "github:tale/headplane"; url = "github:tale/headplane";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
@@ -247,6 +249,9 @@
url = "github:christo-auer/eilmeldung"; url = "github:christo-auer/eilmeldung";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
hytale-launcher = {
url = "github:JPyke3/hytale-launcher-nix";
};
}; };
outputs = { outputs = {

View File

@@ -12,10 +12,63 @@
"Hasklug Nerd Font Mono" "Hasklug Nerd Font Mono"
]; ];
window-decoration = false; window-decoration = false;
title = ""; title = "ghostty";
command = "fish"; command = "fish";
background-opacity = 0.8; background-opacity = 0.8;
theme = "catppuccin-mocha"; theme = "catppuccin-mocha";
custom-shader = "~/.config/ghostty/shader.glsl";
# custom-shader = toString (pkgs.writeText "shader.glsl"
# /*
# glsl
# */
# ''
# const float CURSOR_ANIMATION_SPEED = 150.0; // ms
# const float TRAILING_CURSORS = 3.0;
# bool at_pos(vec2 fragCoord, vec2 pos, vec2 size) {
# return (pos.x <= fragCoord.x && fragCoord.x <= pos.x + size.x &&
# pos.y - size.y <= fragCoord.y && fragCoord.y <= pos.y);
# }
# void mainImage(out vec4 fragColor, in vec2 fragCoord) {
# // Normalized pixel coordinates (from 0 to 1)
# vec2 uv = fragCoord / iResolution.xy;
# vec2 current_cursor = iCurrentCursor.xy;
# vec2 previous_cursor = iPreviousCursor.xy;
# float time_passed = (iTime - iTimeCursorChange) * 1000.0; // in ms
#
# if (time_passed > CURSOR_ANIMATION_SPEED) {
# // No animation, just render normally
# fragColor = texture(iChannel0, uv);
# return;
# }
# // Animate cursor meovement
# vec4 col = texture(iChannel0, uv);
# // linear interpolation between current and previous cursor position based on time passed
# vec2 animated_cursor_pos = mix(previous_cursor, current_cursor, time_passed / CURSOR_ANIMATION_SPEED);
# // make 3 trailing cursors for smoother animation
# for (int i = 1; i <= int(TRAILING_CURSORS); i++) {
# float t = float(i) / TRAILING_CURSORS;
# vec2 trail_pos = mix(previous_cursor, current_cursor, (time_passed / CURSOR_ANIMATION_SPEED) * t);
# if (at_pos(fragCoord, trail_pos, iCurrentCursor.zw)) {
# col = mix(col, iCurrentCursorColor, t);
# }
# }
#
# // vec4 cursor_color = mix(iPreviousCursorColor, iCurrentCursorColor, time_passed / CURSOR_ANIMATION_SPEED);
# vec4 cursor_color = iCurrentCursorColor; // no color animation for now
# vec2 cursor_size = iCurrentCursor.zw;
# // check if fragCoord is within the animated cursor rectangle
# // y is in the negative direction
# // if (animated_cursor_pos.x <= fragCoord.x && fragCoord.x <= animated_cursor_pos.x + cursor_size.x &&
# // animated_cursor_pos.y - cursor_size.y <= fragCoord.y && fragCoord.y <= animated_cursor_pos.y) {
# // col = cursor_color;
# // }
# if (at_pos(fragCoord, animated_cursor_pos, cursor_size)) {
# col = cursor_color;
# }
#
# fragColor = col;
# }
# '');
}; };
systemd.enable = true; systemd.enable = true;
themes = { themes = {

View File

@@ -1,6 +1,6 @@
{...}: { {pkgs, ...}: {
programs.mpv = { programs.mpv = {
enable = true; enable = pkgs.stdenv.isLinux;
config = { config = {
vo = "gpu-next"; vo = "gpu-next";
gpu-api = "vulkan"; gpu-api = "vulkan";

View File

@@ -2,12 +2,122 @@
pkgs, pkgs,
lib, lib,
... ...
}: { }: let
shadps4_qtlauncher = pkgs.fetchFromGitHub {
owner = "shadps4-emu";
repo = "shadps4-qtlauncher";
rev = "1f4e59f6110d5f991cead5a3e9f72671fced2c70";
sha256 = "sha256-AAxj3Eqp7iGJgRgJki/93fln5Z6ae8AydJLGZ6Dbb00=";
fetchSubmodules = true;
};
# diegolixShadps4 = pkgs.fetchFromGitHub {
# owner = "diegolix";
# repo = "shadps4-qtlauncher";
# rev = "a1b2c3d4e5f67890123456789abcdef01234567";
# sha256 = "sha256-PLACEHOLDERFORHASHVALUE1234567890ABCDEFGH=";
# fetchSubmodules = true;
# };
bblauncher = pkgs.fetchFromGitHub {
owner = "rainmakerv3";
repo = "BB_Launcher";
rev = "2280c90974d2d741ce927dfc88f0ecf98c8bd2df";
sha256 = "sha256-jPcIQp2EBAEiaTLvC/OBH0BgcfYv3zo2H7akHJSlPaI=";
fetchSubmodules = true;
};
in {
home.packages = lib.optionals pkgs.stdenv.isLinux [ home.packages = lib.optionals pkgs.stdenv.isLinux [
(pkgs.shadps4.overrideAttrs (pkgs.shadps4.overrideAttrs
(oldAttrs: { (oldAttrs: {
nativeBuildInputs = oldAttrs.nativeBuildInputs ++ [pkgs.cudatoolkit]; nativeBuildInputs = oldAttrs.nativeBuildInputs ++ [pkgs.cudatoolkit];
buildInputs = oldAttrs.buildInputs ++ [pkgs.cudatoolkit]; buildInputs = oldAttrs.buildInputs ++ [pkgs.cudatoolkit];
})) }))
(pkgs.stdenv.mkDerivation {
pname = "shadps4-qt";
version = "1.0.0";
src = shadps4_qtlauncher;
nativeBuildInputs = [
pkgs.cmake
pkgs.pkg-config
pkgs.qt6.wrapQtAppsHook
];
buildInputs = [
pkgs.alsa-lib
pkgs.ffmpeg
pkgs.fmt
pkgs.glslang
pkgs.jack2
pkgs.libedit
pkgs.libevdev
pkgs.libpng
pkgs.libpulseaudio
pkgs.libxkbcommon
pkgs.openal
pkgs.openssl
pkgs.qt6.qtbase
pkgs.qt6.qtmultimedia
pkgs.qt6.qttools
pkgs.qt6.qtwayland
pkgs.SDL2
pkgs.sdl3
pkgs.sndio
pkgs.stb
pkgs.udev
pkgs.vulkan-headers
pkgs.vulkan-tools
pkgs.vulkan-utility-libraries
pkgs.wayland
pkgs.wayland-protocols
pkgs.xorg.libxcb
pkgs.xorg.xcbutil
pkgs.xorg.xcbutilkeysyms
pkgs.xorg.xcbutilwm
pkgs.zlib
];
})
(pkgs.stdenv.mkDerivation {
pname = "BBLauncher";
version = "1.0.0";
src = bblauncher;
nativeBuildInputs = [
pkgs.cmake
pkgs.pkg-config
pkgs.qt6.wrapQtAppsHook
];
buildInputs = [
pkgs.alsa-lib
pkgs.ffmpeg
pkgs.fmt
pkgs.glslang
pkgs.jack2
pkgs.libedit
pkgs.libevdev
pkgs.libpng
pkgs.libpulseaudio
pkgs.libxkbcommon
pkgs.openal
pkgs.openssl
pkgs.qt6.qtbase
pkgs.qt6.qtmultimedia
pkgs.qt6.qttools
pkgs.qt6.qtwayland
pkgs.qt6.qtwebview
pkgs.SDL2
pkgs.sdl3
pkgs.sndio
pkgs.stb
pkgs.udev
pkgs.vulkan-headers
pkgs.vulkan-tools
pkgs.vulkan-utility-libraries
pkgs.wayland
pkgs.wayland-protocols
pkgs.xorg.libxcb
pkgs.xorg.xcbutil
pkgs.xorg.xcbutilkeysyms
pkgs.xorg.xcbutilwm
pkgs.zlib
];
})
]; ];
} }

View File

@@ -12,4 +12,7 @@
autoStart = true; autoStart = true;
}; };
}; };
home.packages = with pkgs; [
pulseaudio
];
} }

View File

@@ -35,26 +35,6 @@
username = device.user; username = device.user;
homeDirectory = lib.mkForce device.home; homeDirectory = lib.mkForce device.home;
file = {
".config/fish/themes".source = pkgs.catppuccinThemes.fish + "/themes";
".cargo/config.toml".text =
# toml
''
[alias]
lldb = ["with", "rust-lldb", "--"]
t = ["nextest", "run"]
[net]
git-fetch-with-cli = true
[registries.catscii]
index = "https://git.shipyard.rs/catscii/crate-index.git"
[http]
user-agent = "shipyard J0/QFq2Sa5y6nTxJQAb8t+e/3qLSub1/sa3zn0leZv6LKG/zmQcoikT9U3xPwbzp8hQ="
'';
};
sessionVariables = { sessionVariables = {
EDITOR = "nvim"; EDITOR = "nvim";
SHELL = "${pkgs.bash}/bin/bash"; SHELL = "${pkgs.bash}/bin/bash";

View File

@@ -1,6 +1,7 @@
{ {
device, device,
inputs, inputs,
pkgs,
... ...
}: { }: {
nixpkgs.config.allowUnfree = true; nixpkgs.config.allowUnfree = true;
@@ -12,6 +13,7 @@
inherit inputs; inherit inputs;
inherit device; inherit device;
stablePkgs = inputs.nixpkgs-stable.legacyPackages.${device.system}; stablePkgs = inputs.nixpkgs-stable.legacyPackages.${device.system};
cratesNix = inputs.crates-nix.mkLib {inherit pkgs;};
}; };
users.${device.user}.imports = [ users.${device.user}.imports = [
inputs.nixvim.homeModules.nixvim inputs.nixvim.homeModules.nixvim

View File

@@ -1,4 +1,8 @@
{config, ...}: { {
pkgs,
config,
...
}: {
sops = { sops = {
secrets."llama/api_key" = {}; secrets."llama/api_key" = {};
secrets."openai/api_key" = {}; secrets."openai/api_key" = {};
@@ -17,7 +21,7 @@
settings = { settings = {
save_session = true; save_session = true;
model = "ryu:qwen3:30b-a3b"; model = "ryu:qwen3:30b-a3b";
rag_embedding_model = "ollama:RobinBially/nomic-embed-text-8k"; rag_embedding_model = "ryu:RobinBially/nomic-embed-text-8k";
clients = [ clients = [
{ {
type = "openai-compatible"; type = "openai-compatible";
@@ -33,11 +37,13 @@
name = "qwen3:30b-a3b"; name = "qwen3:30b-a3b";
type = "chat"; type = "chat";
} }
# { {
# name = "RobinBially/nomic-embed-text-8k"; name = "RobinBially/nomic-embed-text-8k";
# type = "embedding"; type = "embedding";
# default_chunk_size = 8000; default_chunk_size = 1000;
# } max_tokens_per_chunk = 8192;
max_batch_size = 100;
}
# { # {
# name = "deepseek-r1:14b"; # name = "deepseek-r1:14b";
# type = "chat"; # type = "chat";
@@ -133,9 +139,16 @@
}; };
} }
]; ];
document_loaders = {
git =
/*
sh
*/
''sh -c "yek $1 --json | jq '[.[] | { path: .filename, contents: .content }]'"'';
};
}; };
roles = { roles = {
"%git-commit%" = "git-commit" =
/* /*
md md
*/ */
@@ -146,5 +159,9 @@
Your task is to generate a concise and informative commit message based on the provided diff. Use the conventional commit format, which includes a type (feat, fix, chore, docs, style, refactor, perf, test) and an optional scope. The message should be in the imperative mood and should not exceed 72 characters in the subject line. Do not under any circumstance include any additional text or explanations, just add the commit message. Your task is to generate a concise and informative commit message based on the provided diff. Use the conventional commit format, which includes a type (feat, fix, chore, docs, style, refactor, perf, test) and an optional scope. The message should be in the imperative mood and should not exceed 72 characters in the subject line. Do not under any circumstance include any additional text or explanations, just add the commit message.
''; '';
}; };
extraPackages = with pkgs; [
jq
yek
];
}; };
} }

View File

@@ -9,9 +9,49 @@
auto_sync = true; auto_sync = true;
sync_frequency = "1m"; sync_frequency = "1m";
sync_address = "https://atuin.darksailor.dev"; sync_address = "https://atuin.darksailor.dev";
sync = {
records = true;
};
daemon = {
enabled = true;
};
}; };
enable = true; enable = true;
enableFishIntegration = true; enableFishIntegration = true;
enableNushellIntegration = true; enableNushellIntegration = true;
}; };
systemd.user.services.atuin-daemon = {
Unit = {
Description = "Atuin Daemon";
After = ["network.target"];
};
Install = {
WantedBy = ["default.target"];
};
Service = {
ExecStart = "${pkgs.atuin}/bin/atuin daemon";
Restart = "on-failure";
RestartSec = "10s";
# Environment = lib.mkForce "ATUIN_DATA_DIR=${device.home}/.local/share/atuin";
};
};
launchd.agents.atuin-daemon = {
enable = true;
config = {
# A label for the service
Label = "dev.darksailor.atuin-daemon";
# The command to run
ProgramArguments = [
"${pkgs.atuin}/bin/atuin"
"daemon"
];
# Run the service when you log in
RunAtLoad = true;
# Keep the process alive, or restart if it dies
KeepAlive = true;
# Log files
StandardOutPath = "${device.home}/Library/Logs/atuin-daemon.log";
StandardErrorPath = "${device.home}/Library/Logs/atuin-daemon.error.log";
};
};
} }

View File

@@ -0,0 +1 @@
{pkgs, ...}: {home.packages = [pkgs.binwalk];}

27
home/programs/cargo.nix Normal file
View File

@@ -0,0 +1,27 @@
{
lib,
device,
cratesNix,
...
}:
lib.mkIf (!device.isServer) {
home.file.".cargo/config.toml".text =
# toml
''
[alias]
lldb = ["with", "rust-lldb", "--"]
t = ["nextest", "run"]
[net]
git-fetch-with-cli = true
[registries.kellnr]
index = "sparse+https://crates.darksailor.dev/api/v1/crates/"
[registry]
global-credential-providers = ["cargo:token", "/etc/profiles/per-user/fs0c131y/bin/cargo-credential-1password --account my.1password.com"]
'';
home.packages = [
(cratesNix.buildCrate "cargo-credential-1password" {})
];
}

View File

@@ -73,10 +73,7 @@
# ./xh.nix # ./xh.nix
# ./zellij.nix # ./zellij.nix
./dysk.nix ./dysk.nix
./binwalk.nix
./cargo.nix
]; ];
# home.packages = with pkgs;
# []
# ++ lib.optionals (!device.isServer) []
# ++ lib.optionals device.isLinux []
# ++ lib.optionals device.isDarwin [];
} }

View File

@@ -6,6 +6,9 @@
... ...
}: }:
{ {
home.file = {
".config/fish/themes".source = pkgs.catppuccinThemes.fish + "/themes";
};
programs.fish = { programs.fish = {
enable = true; enable = true;
shellAbbrs = { shellAbbrs = {

View File

@@ -12,4 +12,12 @@
defaultSopsFormat = "yaml"; defaultSopsFormat = "yaml";
age.keyFile = "${config.home.homeDirectory}/.config/sops/age/keys.txt"; age.keyFile = "${config.home.homeDirectory}/.config/sops/age/keys.txt";
}; };
launchd.agents.sops-nix = pkgs.lib.mkIf pkgs.stdenv.isDarwin {
enable = true;
config = {
EnvironmentVariables = {
PATH = pkgs.lib.mkForce "/usr/bin:/bin:/usr/sbin:/sbin";
};
};
};
} }

View File

@@ -1,4 +1,4 @@
{...}: { {config, ...}: {
programs. yazi = { programs. yazi = {
enable = true; enable = true;
enableFishIntegration = true; enableFishIntegration = true;
@@ -13,6 +13,9 @@
} }
]; ];
}; };
preview = {
cache_dir = config.home.homeDirectory + "/.cache/yazi/previews";
};
}; };
}; };
} }

View File

@@ -1,31 +0,0 @@
{
config,
lib,
pkgs,
inputs,
...
}: {
imports = [
inputs.command-runner.homeManagerModules.command-runner
];
services.command-runner = {
enable = true;
port = 5599;
database.path = "${config.home.homeDirectory}/.local/share/command-runner.db";
commands = let
hyprctl = "${pkgs.hyprland}/bin/hyprctl";
in
{
"display_on" = [hyprctl "-i" "{instance}" "dispatch" "dpms" "on"];
"display_off" = [hyprctl "-i" "{instance}" "dispatch" "dpms" "off"];
"display_toggle" = [hyprctl "-i" "{instance}" "dispatch" "dpms" "toggle"];
"display_status" = [hyprctl "-i" "{instance}" "-j" "monitors"];
"hyprland_instance" = [hyprctl "-j" "instances"];
}
// (builtins.foldl' (acc: elem: acc // elem) {} (lib.map (name: {
"display_on_${name}" = [hyprctl "-i" "{instance}" "dispatch" "dpms" "on" name];
"display_off_${name}" = [hyprctl "-i" "{instance}" "dispatch" "dpms" "off" name];
"display_toggle_${name}" = [hyprctl "-i" "{instance}" "dispatch" "dpms" "toggle" name];
}) ["HDMI-A-1" "DP-3" "DP-1"]));
};
}

View File

@@ -2,24 +2,8 @@
pkgs, pkgs,
device, device,
lib, lib,
inputs,
... ...
}: { }: {
systemd.user.services.onepassword-gui = lib.optionalAttrs (device.is "ryu") {
Unit = {
Description = "1Password GUI";
BindsTo = ["graphical-session.target"];
After = ["graphical-session-pre.target"];
};
Service = {
ExecStart = "${pkgs._1password-gui}/bin/1password";
Restart = "always";
};
Install = {
WantedBy = ["graphical-session.target"];
};
};
home.packages = with pkgs; home.packages = with pkgs;
lib.optionals (device.is "ryu") [ lib.optionals (device.is "ryu") [
nautilus nautilus

View File

@@ -190,8 +190,8 @@
]; ];
bind = [ bind = [
# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more # Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
"$mainMod, Return, exec, ${lib.getExe pkgs.wezterm}" "$mainMod, Return, exec, ${lib.getExe pkgs.kitty}"
"$mainModShift, Return, exec, ${lib.getExe pkgs.kitty}" "$mainModShift, Return, exec, ${lib.getExe pkgs.ghostty}"
# "$mainModShift, Return, exec, ${pkgs.foot}/bin/foot" # "$mainModShift, Return, exec, ${pkgs.foot}/bin/foot"
"$mainModShift, Q, killactive," "$mainModShift, Q, killactive,"
"$mainModShift, s, exec, ${lib.getExe pkgs.hyprshot} -m region -o ~/Pictures/Screenshots/" "$mainModShift, s, exec, ${lib.getExe pkgs.hyprshot} -m region -o ~/Pictures/Screenshots/"

View File

@@ -3,12 +3,11 @@
lib, lib,
device, device,
... ...
}: }: {
lib.optionalAttrs (device.is "ryu") {
xdg.portal = { xdg.portal = {
enable = pkgs.stdenv.isLinux; enable = device.is "ryu";
config = { config = {
hyprland.default = ["kde" "hyprland"]; hyprland.default = ["hyprland"];
common.default = ["*" "hyprland"]; common.default = ["*" "hyprland"];
}; };
extraPortals = with pkgs; [ extraPortals = with pkgs; [

View File

@@ -81,6 +81,14 @@ in {
type = lib.types.attrsOf lib.types.str; type = lib.types.attrsOf lib.types.str;
description = "Roles for the AI chat clients"; description = "Roles for the AI chat clients";
}; };
extraPackages = mkOption {
type = lib.types.listOf lib.types.package;
default = [];
example = literalExpression "with pkgs; [ jq yek ];";
description = ''
Additional packages to install.
'';
};
}; };
}; };
@@ -99,7 +107,7 @@ in {
''; '';
}; };
in { in {
home.packages = mkIf cfg.enable [aichat-wrapped]; home.packages = mkIf cfg.enable ([aichat-wrapped] ++ cfg.extraPackages);
programs.fish.interactiveShellInit = mkIf cfg.enableFishIntegration fishIntegration; programs.fish.interactiveShellInit = mkIf cfg.enableFishIntegration fishIntegration;
programs.bash.initExtra = mkIf cfg.enableBashIntegration bashIntegration; programs.bash.initExtra = mkIf cfg.enableBashIntegration bashIntegration;

View File

@@ -358,17 +358,17 @@ in {
}; };
}; };
folding.enable = true; folding.enable = true;
grammarPackages = # grammarPackages =
(with pkgs.tree-sitter-grammars; [ # (with pkgs.tree-sitter-grammars; [
tree-sitter-norg # tree-sitter-norg
tree-sitter-norg-meta # tree-sitter-norg-meta
tree-sitter-just # tree-sitter-just
tree-sitter-nu # tree-sitter-nu
tree-sitter-pest # tree-sitter-pest
tree-sitter-slint # tree-sitter-slint
]) # ])
++ pkgs.vimPlugins.nvim-treesitter.allGrammars; # ++ pkgs.vimPlugins.nvim-treesitter.allGrammars;
nixGrammars = true; # nixGrammars = true;
}; };
telescope = { telescope = {
@@ -548,6 +548,7 @@ in {
pyright.enable = true; pyright.enable = true;
slint_lsp.enable = true; slint_lsp.enable = true;
wgsl_analyzer.enable = true; wgsl_analyzer.enable = true;
glsl_analyzer.enable = true;
# sourcekit.enable = true; # sourcekit.enable = true;
openscad_lsp.enable = true; openscad_lsp.enable = true;
tinymist.enable = true; tinymist.enable = true;

View File

@@ -1,7 +1,8 @@
{pkgs, ...}: { {pkgs, ...}: {
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
wlx-overlay-s wayvr
wayvr-dashboard # wlx-overlay-s
# wayvr-dashboard
# bs-manager # bs-manager
monado-vulkan-layers monado-vulkan-layers
# envision # envision

View File

@@ -11,6 +11,7 @@
./containers ./containers
./apps ./apps
./vms ./vms
./games
]; ];
security.tpm2 = { security.tpm2 = {
@@ -25,6 +26,7 @@
withUWSM = true; withUWSM = true;
xwayland.enable = true; xwayland.enable = true;
}; };
uwsm.enable = true;
}; };
systemd.services.NetworkManager-wait-online.enable = lib.mkForce false; systemd.services.NetworkManager-wait-online.enable = lib.mkForce false;
@@ -67,7 +69,7 @@
dates = "daily"; dates = "daily";
options = "--delete-older-than +5"; options = "--delete-older-than +5";
}; };
package = pkgs.nixVersions.latest; # deploy-rs doesn't work with nix >= 2.32 package = pkgs.nixVersions.nix_2_32; # deploy-rs doesn't work with nix >= 2.33
buildMachines = [ buildMachines = [
../../builders/tako.nix ../../builders/tako.nix
../../builders/shiro.nix ../../builders/shiro.nix

View File

@@ -2,12 +2,11 @@
port = 3003; port = 3003;
in { in {
virtualisation.oci-containers = { virtualisation.oci-containers = {
backend = "docker";
containers = { containers = {
immich-machine-learning = { immich-machine-learning = {
image = "ghcr.io/immich-app/immich-machine-learning:v${pkgs.immich.version}-cuda"; image = "ghcr.io/immich-app/immich-machine-learning:v${pkgs.immich.version}-cuda";
ports = [ ports = [
"0.0.0.0:${toString port}:3003" "127.0.0.1:${toString port}:3003"
]; ];
volumes = [ volumes = [
"model-cache:/cache" "model-cache:/cache"
@@ -20,7 +19,4 @@ in {
nvidia-docker nvidia-docker
nvidia-container-toolkit nvidia-container-toolkit
]; ];
# services.caddy.virtualHosts."ml.ryu.darksailor.dev".extraConfig = ''
# reverse_proxy localhost:${toString port}
# '';
} }

View File

@@ -0,0 +1,5 @@
{...}: {
imports = [
./hytale.nix
];
}

499
nixos/ryu/games/hytale.nix Normal file
View File

@@ -0,0 +1,499 @@
# {pkgs, ...}: let
# version = "2026.01.21-11273a4";
# hytale-launcher = pkgs.fetchzip {
# url = "https://launcher.hytale.com/builds/release/linux/amd64/hytale-launcher-${version}.zip";
# sha256 = "sha256-PPdYmLxAVyqSkhulZXLcaEuhofCHZ4JcDJXIQ+lBhFg=";
# };
# in {
# environment.systemPackages = with pkgs; [
# # (pkgs.buildFHSEnv {
# # pname = "hytale";
# # inherit version;
# # targetPkgs = p:
# # with p; [
# # # Launcher
# # libsoup_3
# # gdk-pixbuf
# # glib
# # gtk3
# # webkitgtk_4_1
# #
# # # Game
# # alsa-lib
# # icu
# # libGL
# # openssl
# # udev
# # xorg.libX11
# # xorg.libXcursor
# # xorg.libXrandr
# # xorg.libXi
# # ];
# # runScript = "${hytale-launcher}/hytale-launcher";
# # })
# hytale-launcher
# ];
# }
#
# { pkgs }:
#
# let
# # === AUTO-UPDATE MARKERS - DO NOT MODIFY FORMAT ===
# version = "2026.01.24-997c2cb";
# sha256 = "sha256-G+FFMOtLVPH2zaWQ87jymf6+JUAVFEKA4SMyuYE9MZ0=";
# # === END AUTO-UPDATE MARKERS ===
#
# pname = "hytale-launcher";
# downloadUrl = "https://launcher.hytale.com/builds/release/linux/amd64/hytale-launcher-${version}.zip";
#
# # Unwrapped derivation - extracts and patches the binary
# hytale-launcher-unwrapped = pkgs.stdenv.mkDerivation {
# pname = "${pname}-unwrapped";
# inherit version;
#
# src = pkgs.fetchurl {
# url = downloadUrl;
# inherit sha256;
# };
#
# nativeBuildInputs = with pkgs; [
# autoPatchelfHook
# unzip
# ];
#
# unpackPhase = ''
# runHook preUnpack
# unzip $src -d .
# runHook postUnpack
# '';
#
# buildInputs = with pkgs; [
# webkitgtk_4_1
# gtk3
# glib
# gdk-pixbuf
# libsoup_3
# cairo
# pango
# at-spi2-atk
# harfbuzz
# glibc
# ];
#
# runtimeDependencies = with pkgs; [
# libGL
# libxkbcommon
# xorg.libX11
# xorg.libXcomposite
# xorg.libXdamage
# xorg.libXext
# xorg.libXfixes
# xorg.libXrandr
# ];
#
# # No build phase needed - just unpack and install
# dontBuild = true;
#
# installPhase = ''
# runHook preInstall
#
# mkdir -p $out/lib/hytale-launcher
# install -m755 hytale-launcher $out/lib/hytale-launcher/
#
# runHook postInstall
# '';
#
# meta = with pkgs.lib; {
# description = "Official launcher for Hytale game (unwrapped)";
# homepage = "https://hytale.com";
# license = licenses.unfree;
# sourceProvenance = with sourceTypes; [ binaryNativeCode ];
# maintainers = [{
# name = "Jacob Pyke";
# email = "github@pyk.ee";
# github = "JPyke3";
# githubId = 13283054;
# }];
# platforms = [ "x86_64-linux" ];
# };
# };
#
# # FHS-wrapped derivation - allows self-updates to work
# hytale-launcher = pkgs.buildFHSEnv {
# name = "hytale-launcher";
# inherit version;
#
# targetPkgs = pkgs: with pkgs; [
# # Core dependencies
# hytale-launcher-unwrapped
#
# # WebKit/GTK stack (for launcher UI)
# webkitgtk_4_1
# gtk3
# glib
# gdk-pixbuf
# libsoup_3
# cairo
# pango
# at-spi2-atk
# harfbuzz
#
# # Graphics - OpenGL/Vulkan/EGL (for game client via SDL3)
# libGL
# libGLU
# libglvnd
# mesa
# vulkan-loader
# egl-wayland
#
# # X11 (SDL3 dlopens these)
# xorg.libX11
# xorg.libXcomposite
# xorg.libXdamage
# xorg.libXext
# xorg.libXfixes
# xorg.libXrandr
# xorg.libXcursor
# xorg.libXi
# xorg.libxcb
# xorg.libXScrnSaver
# xorg.libXinerama
# xorg.libXxf86vm
#
# # Wayland (SDL3 can use Wayland backend)
# wayland
# libxkbcommon
#
# # Audio (for game client via bundled OpenAL)
# alsa-lib
# pipewire
# pulseaudio
#
# # System libraries
# dbus
# fontconfig
# freetype
# glibc
# nspr
# nss
# systemd
# zlib
#
# # C++ runtime (needed by libNoesis.so, libopenal.so in game client)
# stdenv.cc.cc.lib
#
# # .NET runtime dependencies (HytaleClient is a .NET application)
# icu
# openssl
# krb5
#
# # TLS/SSL support for GLib networking (launcher)
# glib-networking
# cacert
# ];
#
# runScript = pkgs.writeShellScript "hytale-launcher-wrapper" ''
# # Hytale data directory
# LAUNCHER_DIR="''${XDG_DATA_HOME:-$HOME/.local/share}/Hytale"
# LAUNCHER_BIN="$LAUNCHER_DIR/hytale-launcher"
# BUNDLED_HASH_FILE="$LAUNCHER_DIR/.bundled_hash"
# BUNDLED_BIN="${hytale-launcher-unwrapped}/lib/hytale-launcher/hytale-launcher"
#
# mkdir -p "$LAUNCHER_DIR"
#
# # Compute hash of bundled binary to detect Nix package updates
# BUNDLED_HASH=$(sha256sum "$BUNDLED_BIN" | cut -d" " -f1)
#
# # Copy bundled binary if needed (new install or Nix package update)
# if [ ! -x "$LAUNCHER_BIN" ] || [ ! -f "$BUNDLED_HASH_FILE" ] || [ "$(cat "$BUNDLED_HASH_FILE")" != "$BUNDLED_HASH" ]; then
# install -m755 "$BUNDLED_BIN" "$LAUNCHER_BIN"
# echo "$BUNDLED_HASH" > "$BUNDLED_HASH_FILE"
# fi
#
# # Required environment variable from Flatpak metadata
# export WEBKIT_DISABLE_COMPOSITING_MODE=1
#
# # Enable GLib TLS backend (glib-networking)
# export GIO_MODULE_DIR=/usr/lib/gio/modules
#
# # SSL certificates
# export SSL_CERT_FILE=/etc/ssl/certs/ca-bundle.crt
#
# exec "$LAUNCHER_BIN" "$@"
# '';
#
# extraInstallCommands = ''
# # Install desktop file
# mkdir -p $out/share/applications
# cat > $out/share/applications/hytale-launcher.desktop << EOF
# [Desktop Entry]
# Name=Hytale Launcher
# Comment=Official launcher for Hytale
# Exec=$out/bin/hytale-launcher
# Icon=hytale-launcher
# Terminal=false
# Type=Application
# Categories=Game;
# Keywords=hytale;game;launcher;hypixel;
# StartupWMClass=com.hypixel.HytaleLauncher
# EOF
#
# '';
#
# meta = with pkgs.lib; {
# description = "Official launcher for Hytale game";
# longDescription = ''
# The official launcher for Hytale, developed by Hypixel Studios.
# This package wraps the launcher from the official distribution,
# providing FHS compatibility for self-updates.
# '';
# homepage = "https://hytale.com";
# license = licenses.unfree;
# sourceProvenance = with sourceTypes; [ binaryNativeCode ];
# maintainers = [{
# name = "Jacob Pyke";
# email = "github@pyk.ee";
# github = "JPyke3";
# githubId = 13283054;
# }];
# platforms = [ "x86_64-linux" ];
# mainProgram = "hytale-launcher";
# };
# };
#
# in {
# inherit hytale-launcher hytale-launcher-unwrapped;
# }
{pkgs, ...}: let
# === AUTO-UPDATE MARKERS - DO NOT MODIFY FORMAT ===
version = "2026.01.24-997c2cb";
sha256 = "sha256-G+FFMOtLVPH2zaWQ87jymf6+JUAVFEKA4SMyuYE9MZ0=";
# === END AUTO-UPDATE MARKERS ===
pname = "hytale-launcher";
downloadUrl = "https://launcher.hytale.com/builds/release/linux/amd64/hytale-launcher-${version}.zip";
# Unwrapped derivation - extracts and patches the binary
hytale-launcher-unwrapped = pkgs.stdenv.mkDerivation {
pname = "${pname}-unwrapped";
inherit version;
src = pkgs.fetchurl {
url = downloadUrl;
inherit sha256;
};
nativeBuildInputs = with pkgs; [
autoPatchelfHook
unzip
];
unpackPhase = ''
runHook preUnpack
unzip $src -d .
runHook postUnpack
'';
buildInputs = with pkgs; [
webkitgtk_4_1
gtk3
glib
gdk-pixbuf
libsoup_3
cairo
pango
at-spi2-atk
harfbuzz
glibc
];
runtimeDependencies = with pkgs; [
libGL
libxkbcommon
# xorg.libX11
# xorg.libXcomposite
# xorg.libXdamage
# xorg.libXext
# xorg.libXfixes
# xorg.libXrandr
];
# No build phase needed - just unpack and install
dontBuild = true;
installPhase = ''
runHook preInstall
mkdir -p $out/lib/hytale-launcher
install -m755 hytale-launcher $out/lib/hytale-launcher/
runHook postInstall
'';
meta = with pkgs.lib; {
description = "Official launcher for Hytale game (unwrapped)";
homepage = "https://hytale.com";
license = licenses.unfree;
sourceProvenance = with sourceTypes; [binaryNativeCode];
maintainers = [
{
name = "Jacob Pyke";
email = "github@pyk.ee";
github = "JPyke3";
githubId = 13283054;
}
];
platforms = ["x86_64-linux"];
};
};
# FHS-wrapped derivation - allows self-updates to work
hytale-launcher = pkgs.buildFHSEnv {
name = "hytale-launcher";
inherit version;
targetPkgs = pkgs:
with pkgs; [
# Core dependencies
hytale-launcher-unwrapped
# WebKit/GTK stack (for launcher UI)
webkitgtk_4_1
gtk3
glib
gdk-pixbuf
libsoup_3
cairo
pango
at-spi2-atk
harfbuzz
# Graphics - OpenGL/Vulkan/EGL (for game client via SDL3)
libGL
libGLU
libglvnd
mesa
vulkan-loader
egl-wayland
# X11 (SDL3 dlopens these)
# xorg.libX11
# xorg.libXcomposite
# xorg.libXdamage
# xorg.libXext
# xorg.libXfixes
# xorg.libXrandr
# xorg.libXcursor
# xorg.libXi
# xorg.libxcb
# xorg.libXScrnSaver
# xorg.libXinerama
# xorg.libXxf86vm
# Wayland (SDL3 can use Wayland backend)
wayland
libxkbcommon
# Audio (for game client via bundled OpenAL)
alsa-lib
pipewire
pulseaudio
# System libraries
dbus
fontconfig
freetype
glibc
nspr
nss
systemd
zlib
# C++ runtime (needed by libNoesis.so, libopenal.so in game client)
stdenv.cc.cc.lib
# .NET runtime dependencies (HytaleClient is a .NET application)
icu
openssl
krb5
# TLS/SSL support for GLib networking (launcher)
glib-networking
cacert
];
runScript = pkgs.writeShellScript "hytale-launcher-wrapper" ''
# Hytale data directory
LAUNCHER_DIR="''${XDG_DATA_HOME:-$HOME/.local/share}/Hytale"
LAUNCHER_BIN="$LAUNCHER_DIR/hytale-launcher"
BUNDLED_HASH_FILE="$LAUNCHER_DIR/.bundled_hash"
BUNDLED_BIN="${hytale-launcher-unwrapped}/lib/hytale-launcher/hytale-launcher"
mkdir -p "$LAUNCHER_DIR"
# Compute hash of bundled binary to detect Nix package updates
BUNDLED_HASH=$(sha256sum "$BUNDLED_BIN" | cut -d" " -f1)
# Copy bundled binary if needed (new install or Nix package update)
if [ ! -x "$LAUNCHER_BIN" ] || [ ! -f "$BUNDLED_HASH_FILE" ] || [ "$(cat "$BUNDLED_HASH_FILE")" != "$BUNDLED_HASH" ]; then
install -m755 "$BUNDLED_BIN" "$LAUNCHER_BIN"
echo "$BUNDLED_HASH" > "$BUNDLED_HASH_FILE"
fi
# Required environment variable from Flatpak metadata
export WEBKIT_DISABLE_COMPOSITING_MODE=1
# Enable GLib TLS backend (glib-networking)
export GIO_MODULE_DIR=/usr/lib/gio/modules
# SSL certificates
export SSL_CERT_FILE=/etc/ssl/certs/ca-bundle.crt
exec "$LAUNCHER_BIN" "$@"
'';
extraInstallCommands = ''
# Install desktop file
mkdir -p $out/share/applications
cat > $out/share/applications/hytale-launcher.desktop << EOF
[Desktop Entry]
Name=Hytale Launcher
Comment=Official launcher for Hytale
Exec=$out/bin/hytale-launcher
Icon=hytale-launcher
Terminal=false
Type=Application
Categories=Game;
Keywords=hytale;game;launcher;hypixel;
StartupWMClass=com.hypixel.HytaleLauncher
EOF
'';
meta = with pkgs.lib; {
description = "Official launcher for Hytale game";
longDescription = ''
The official launcher for Hytale, developed by Hypixel Studios.
This package wraps the launcher from the official distribution,
providing FHS compatibility for self-updates.
'';
homepage = "https://hytale.com";
license = licenses.unfree;
sourceProvenance = with sourceTypes; [binaryNativeCode];
maintainers = [
{
name = "Jacob Pyke";
email = "github@pyk.ee";
github = "JPyke3";
githubId = 13283054;
}
];
platforms = ["x86_64-linux"];
mainProgram = "hytale-launcher";
};
};
in {
environment.systemPackages = with pkgs; [
hytale-launcher
];
}

View File

@@ -11,5 +11,6 @@
./gamemode.nix ./gamemode.nix
./droidcam.nix ./droidcam.nix
./wireshark.nix ./wireshark.nix
./flatpak.nix
]; ];
} }

View File

@@ -0,0 +1,5 @@
{...}: {
services.flatpak = {
enable = true;
};
}

View File

@@ -138,7 +138,7 @@
swapDevices = [ swapDevices = [
{ {
device = "/var/lib/swapfile"; device = "/home/swapfile";
size = 64 * 1024; size = 64 * 1024;
} }
]; ];

View File

@@ -1,26 +1,26 @@
{...}: { {...}: {
imports = [ imports = [
# ./rsyncd.nix # ./rsyncd.nix
# ./sunshine.nix
# ./zerotier.nix # ./zerotier.nix
# ./dnscrypt.nix # ./dnscrypt.nix
./ollama.nix
./tailscale.nix
./samba.nix
./mullvad.nix
./openrgb.nix
./command-runner.nix
./resolved.nix
./minecraft.nix
./fwupd.nix
./caddy.nix ./caddy.nix
./monitoring.nix ./command-runner.nix
./wivrn.nix
./sshd.nix
./fprintd.nix
./handoff.nix
./gstreamer.nix
./dualsense.nix ./dualsense.nix
./fprintd.nix
./fwupd.nix
./gstreamer.nix
./handoff.nix
./minecraft.nix
./monitoring.nix
./mullvad.nix
./ollama.nix
./openrgb.nix
./openssh.nix ./openssh.nix
./resolved.nix
./samba.nix
./sshd.nix
# ./sunshine.nix
./tailscale.nix
./wivrn.nix
]; ];
} }

View File

@@ -25,6 +25,8 @@
OLLAMA_LLM_LIBRARY = "cuda"; OLLAMA_LLM_LIBRARY = "cuda";
LD_LIBRARY_PATH = "run/opengl-driver/lib"; LD_LIBRARY_PATH = "run/opengl-driver/lib";
HTTP_PROXY = "https://ollama.darksailor.dev"; HTTP_PROXY = "https://ollama.darksailor.dev";
OLLAMA_CONTEXT_LENGTH = "32000";
OLLAMA_KEEP_ALIVE = "30m";
}; };
package = pkgs.ollama-cuda; package = pkgs.ollama-cuda;
}; };

View File

@@ -65,7 +65,7 @@
dates = "daily"; dates = "daily";
options = "--delete-older-than 5d"; options = "--delete-older-than 5d";
}; };
package = pkgs.nixVersions.latest; # deploy-rs doesn't work with nix >= 2.32 package = pkgs.nixVersions.nix_2_32; # deploy-rs doesn't work with nix >= 2.32
distributedBuilds = true; distributedBuilds = true;
}; };

View File

@@ -0,0 +1,19 @@
{
device,
config,
...
}: {
services = {
blocky = {
enable = true;
settings = {
ports.dns = 53;
ports.http = 83838;
ports.dohPath = "/dns-query";
};
};
caddy.virtualHosts."blocky.${device.domain}".extraConfig = ''
reverse_proxy localhost:83838
'';
};
}

View File

@@ -23,6 +23,7 @@
./resolved.nix ./resolved.nix
./searxng.nix ./searxng.nix
./tailscale.nix ./tailscale.nix
./kellnr.nix
]; ];
services = { services = {
nix-serve = { nix-serve = {

View File

View File

@@ -24,6 +24,7 @@
icon = "jellyfin.png"; icon = "jellyfin.png";
description = "Jellyfin Media Server"; description = "Jellyfin Media Server";
href = "https://jellyfin.tsuba.darksailor.dev"; href = "https://jellyfin.tsuba.darksailor.dev";
siteMonitor = "https://jellyfin.tsuba.darksailor.dev";
}; };
} }
{ {
@@ -31,6 +32,7 @@
icon = "sonarr.png"; icon = "sonarr.png";
description = "Sonarr: TV Series Management"; description = "Sonarr: TV Series Management";
href = "https://sonarr.tsuba.darksailor.dev"; href = "https://sonarr.tsuba.darksailor.dev";
siteMonitor = "https://sonarr.tsuba.darksailor.dev";
}; };
} }
{ {
@@ -38,6 +40,7 @@
icon = "bazarr.png"; icon = "bazarr.png";
description = "Bazarr: Subtitles and Metadata"; description = "Bazarr: Subtitles and Metadata";
href = "https://bazarr.tsuba.darksailor.dev"; href = "https://bazarr.tsuba.darksailor.dev";
siteMonitor = "https://bazarr.tsuba.darksailor.dev";
}; };
} }
{ {
@@ -45,6 +48,7 @@
icon = "radarr.png"; icon = "radarr.png";
description = "Radarr: Movie Management"; description = "Radarr: Movie Management";
href = "https://radarr.tsuba.darksailor.dev"; href = "https://radarr.tsuba.darksailor.dev";
siteMonitor = "https://radarr.tsuba.darksailor.dev";
}; };
} }
{ {
@@ -52,13 +56,7 @@
icon = "deluge.png"; icon = "deluge.png";
description = "Deluge: Torrent Client"; description = "Deluge: Torrent Client";
href = "https://deluge.tsuba.darksailor.dev"; href = "https://deluge.tsuba.darksailor.dev";
}; siteMonitor = "https://deluge.tsuba.darksailor.dev";
}
{
"Prowlarr" = {
icon = "prowlarr.png";
description = "Prowlarr: Indexer Manager";
href = "https://prowlarr.tsuba.darksailor.dev";
}; };
} }
{ {
@@ -66,6 +64,15 @@
icon = "home-assistant.png"; icon = "home-assistant.png";
description = "Home Automation"; description = "Home Automation";
href = "https://home.darksailor.dev"; href = "https://home.darksailor.dev";
siteMonitor = "https://home.darksailor.dev";
};
}
{
"Pi Hole" = {
icon = "pi-hole.png";
description = "Pi-hole: Network-wide Ad Blocker";
href = "https://pihole.darksailor.dev";
siteMonitor = "https://pihole.darksailor.dev";
}; };
} }
]; ];
@@ -77,6 +84,7 @@
icon = "gitea.png"; icon = "gitea.png";
description = "Gitea Code Hosting"; description = "Gitea Code Hosting";
href = "https://git.darksailor.dev"; href = "https://git.darksailor.dev";
siteMonitor = "https://git.darksailor.dev";
}; };
} }
{ {
@@ -84,6 +92,7 @@
icon = "nextcloud.png"; icon = "nextcloud.png";
description = "Nextcloud Suite"; description = "Nextcloud Suite";
href = "https://cloud.darksailor.dev"; href = "https://cloud.darksailor.dev";
siteMonitor = "https://cloud.darksailor.dev";
}; };
} }
{ {
@@ -91,13 +100,15 @@
icon = "immich.png"; icon = "immich.png";
description = "Immich: Self-hosted Photo and Video Backup"; description = "Immich: Self-hosted Photo and Video Backup";
href = "https://photos.darksailor.dev"; href = "https://photos.darksailor.dev";
siteMonitor = "https://photos.darksailor.dev";
}; };
} }
{ {
"Excalidraw" = { "Excalidraw" = {
icon = "excalidraw.png"; icon = "excalidraw.png";
description = "Excalidraw: Self-hosted Collaborative Whiteboard"; description = "Excalidraw: Self-hosted Whiteboard";
href = "https://draw.darksailor.dev"; href = "https://draw.darksailor.dev";
siteMonitor = "https://draw.darksailor.dev";
}; };
} }
{ {
@@ -105,13 +116,23 @@
icon = "navidrome.png"; icon = "navidrome.png";
description = "A self-hosted music server and streamer."; description = "A self-hosted music server and streamer.";
href = "https://music.darksailor.dev"; href = "https://music.darksailor.dev";
siteMonitor = "https://music.darksailor.dev";
}; };
} }
{ {
"OpenwebUI" = { "OpenwebUI" = {
icon = "openwebui.png"; icon = "open-webui.png";
description = "OpenwebUI: Self-hosted AI chat interface"; description = "OpenwebUI: Self-hosted AI chat interface";
href = "https://chat.darksailor.dev"; href = "https://chat.darksailor.dev";
siteMonitor = "https://chat.darksailor.dev";
};
}
{
"Prowlarr" = {
icon = "prowlarr.png";
description = "Prowlarr: Indexer Manager";
href = "https://prowlarr.darksailor.dev";
siteMonitor = "https://prowlarr.darksailor.dev";
}; };
} }
]; ];
@@ -166,23 +187,22 @@
}; };
caddy = { caddy = {
virtualHosts."dashboard.darksailor.dev".extraConfig = '' virtualHosts."dashboard.darksailor.dev".extraConfig = ''
# import auth
reverse_proxy localhost:${builtins.toString config.services.homepage-dashboard.listenPort} reverse_proxy localhost:${builtins.toString config.services.homepage-dashboard.listenPort}
''; '';
}; };
authelia = { # authelia = {
instances.darksailor = { # instances.darksailor = {
settings = { # settings = {
access_control = { # access_control = {
rules = [ # rules = [
{ # {
domain = "dashboard.darksailor.dev"; # domain = "dashboard.darksailor.dev";
policy = "one_factor"; # policy = "one_factor";
} # }
]; # ];
}; # };
}; # };
}; # };
}; # };
}; };
} }

View File

@@ -0,0 +1,57 @@
# docker run --rm -it \
# -p 8000:8000 \
# -e "KELLNR_ORIGIN__HOSTNAME=kellnr.example.com" \
# -v $(pwd):/opt/kdata ghcr.io/kellnr/kellnr:5
# E.g. docker run -v /path/to/config.toml:/usr/local/cargo/config.toml:ro ghcr.io/kellnr/kellnr:5.2.4
{config, ...}: let
port = 8899;
domain = "crates.darksailor.dev";
in {
sops = {
secrets."kellnr/password" = {};
secrets."kellnr/token" = {};
templates."kellnr.env".content = ''
KELLNR_SETUP__ADMIN_PWD=${config.sops.placeholder."kellnr/password"}
KELLNR_SETUP__ADMIN_TOKEN=${config.sops.placeholder."kellnr/token"}
'';
};
virtualisation.oci-containers = {
backend = "docker";
containers = {
kellnr = {
image = "ghcr.io/kellnr/kellnr:5";
ports = ["127.0.0.1:${toString port}:8000"];
volumes = [
"/var/lib/kellnr:/opt/kdata"
];
environment = {
KELLNR_ORIGIN__HOSTNAME = domain;
KELLNR_DOCS__ENABLED = "true";
KELLNR_ORIGIN__PROTOCOL = "https";
KELLNR_ORIGIN__PORT = "443";
};
environmentFiles = [
config.sops.templates."kellnr.env".path
];
};
};
};
services.caddy.virtualHosts."${domain}".extraConfig = ''
# import auth
reverse_proxy localhost:${toString port}
'';
# services.authelia = {
# instances.darksailor = {
# settings = {
# access_control = {
# rules = [
# {
# inherit domain;
# policy = "one_factor";
# }
# ];
# };
# };
# };
# };
}

View File

@@ -3,8 +3,9 @@
secrets."llama/api_key".owner = config.services.caddy.user; secrets."llama/api_key".owner = config.services.caddy.user;
secrets."openai/api_key" = {}; secrets."openai/api_key" = {};
templates = { templates = {
"LLAMA_API_KEY.env".content = '' "ollama.env".content = ''
LLAMA_API_KEY=${config.sops.placeholder."llama/api_key"} LLAMA_API_KEY=${config.sops.placeholder."llama/api_key"}
OPENAI_API_KEYS=${config.sops.placeholder."openai/api_key"}
''; '';
}; };
}; };
@@ -21,7 +22,7 @@
WEBUI_URL = "https://chat.darksailor.dev"; WEBUI_URL = "https://chat.darksailor.dev";
OLLAMA_BASE_URL = "https://ollama.darksailor.dev"; OLLAMA_BASE_URL = "https://ollama.darksailor.dev";
}; };
environmentFile = "${config.sops.templates."LLAMA_API_KEY.env".path}"; environmentFile = "${config.sops.templates."ollama.env".path}";
}; };
caddy = { caddy = {
@@ -47,7 +48,7 @@
}; };
systemd.services.caddy = { systemd.services.caddy = {
serviceConfig = { serviceConfig = {
EnvironmentFile = config.sops.templates."LLAMA_API_KEY.env".path; EnvironmentFile = config.sops.templates."ollama.env".path;
}; };
}; };
} }

View File

@@ -3,6 +3,7 @@
inputs, inputs,
overlays, overlays,
home-manager-stable, home-manager-stable,
nixpkgs,
nur, nur,
nixos-raspberrypi, nixos-raspberrypi,
... ...
@@ -15,6 +16,7 @@
inherit device; inherit device;
unstablePkgs = inputs.nixpkgs.legacyPackages.${device.system}; unstablePkgs = inputs.nixpkgs.legacyPackages.${device.system};
masterPkgs = inputs.nixpkgs-master.legacyPackages.${device.system}; masterPkgs = inputs.nixpkgs-master.legacyPackages.${device.system};
cratesNix = inputs.crates-nix.mkLib {pkgs = nixpkgs.legacyPackages.${device.system};};
}; };
system = device.system; system = device.system;
modules = [ modules = [
@@ -40,6 +42,7 @@
inherit inputs; inherit inputs;
inherit device; inherit device;
stablePkgs = inputs.nixpkgs-stable.legacyPackages.${device.system}; stablePkgs = inputs.nixpkgs-stable.legacyPackages.${device.system};
cratesNix = inputs.crates-nix.mkLib {pkgs = nixpkgs.legacyPackages.${device.system};};
}; };
users.${device.user}.imports = [ users.${device.user}.imports = [
inputs.nixvim.homeModules.nixvim inputs.nixvim.homeModules.nixvim

View File

@@ -219,24 +219,25 @@
}; };
}; };
libfprint = final: prev: { libfprint = final: prev: {
# libfprint = prev.libfprint.overrideAttrs (oldAttrs: { libfprint = prev.libfprint.overrideAttrs (oldAttrs: {
# version = "git"; version = "git";
# src = final.fetchFromGitHub { # https://github.com/archeYR/libfprint-CS9711/commits/cs9711-rebase/
# owner = "ericlinagora"; src = final.fetchFromGitHub {
# repo = "libfprint-CS9711"; owner = "archeYR";
# rev = "03ace5b20146eb01c77fb3ea63e1909984d6d377"; repo = "libfprint-CS9711";
# sha256 = "sha256-gr3UvFB6D04he/9zawvQIuwfv0B7fEZb6BGiNAbLids"; rev = "c2d163fbb06d33e80a5177815bb0b8ca2f01739f";
# }; sha256 = "sha256-JygOJ3SybXKR3CjLxLbAZDaYCl9LuQYDQfFC8Si5oaw";
# buildInputs = oldAttrs.buildInputs ++ [final.nss_latest]; };
# nativeBuildInputs = buildInputs = oldAttrs.buildInputs ++ [final.nss_latest];
# oldAttrs.nativeBuildInputs nativeBuildInputs =
# ++ [ oldAttrs.nativeBuildInputs
# final.opencv ++ [
# final.cmake final.opencv
# final.doctest final.cmake
# ]; final.doctest
# }); ];
# # fprintd = inputs.nixpkgs-stable.legacyPackages.${prev.system}.fprintd; });
# fprintd = inputs.nixpkgs-stable.legacyPackages.${prev.system}.fprintd;
# fprintd = prev.fprintd.overrideAttrs (oldAttrs: { # fprintd = prev.fprintd.overrideAttrs (oldAttrs: {
# src = inputs.nixpkgs-stable.legacyPackages.${prev.system}.fprintd.src; # src = inputs.nixpkgs-stable.legacyPackages.${prev.system}.fprintd.src;
# }); # });
@@ -272,8 +273,12 @@
# }); # });
wivrn-nightly = inputs.wivrn.packages.${prev.system}.default; wivrn-nightly = inputs.wivrn.packages.${prev.system}.default;
}; };
games = final: prev: {
hytale-launcher = inputs.hytale-launcher.packages.${prev.system}.default;
};
in in
[ [
games
vr vr
anyrun-overlay anyrun-overlay
catppuccinThemes catppuccinThemes

View File

@@ -7,7 +7,7 @@ SHA1=$3
if [[ -z "$COMMIT_SOURCE" ]] if [[ -z "$COMMIT_SOURCE" ]]
then then
DIFF_OUTPUT=$(git diff --cached) DIFF_OUTPUT=$(git diff --cached)
AI_CHAT_OUTPUT=$(echo "$DIFF_OUTPUT" | aichat --role %git-commit%) AI_CHAT_OUTPUT=$(echo "$DIFF_OUTPUT" | aichat --role git-commit)
CURRENT_MSG=$(cat "$COMMIT_MSG_FILE") CURRENT_MSG=$(cat "$COMMIT_MSG_FILE")
{ {

View File

@@ -80,6 +80,9 @@ pihole:
password: ENC[AES256_GCM,data:xOpsEFN6zbgPwYnSudmFqlYOghY=,iv:isO0RtKgi8G8noumyhIfLLfmH9w5ybt9NVxh7bRVykM=,tag:17UcPypyqquJDTFZAc5iyA==,type:str] password: ENC[AES256_GCM,data:xOpsEFN6zbgPwYnSudmFqlYOghY=,iv:isO0RtKgi8G8noumyhIfLLfmH9w5ybt9NVxh7bRVykM=,tag:17UcPypyqquJDTFZAc5iyA==,type:str]
nas: nas:
password: ENC[AES256_GCM,data:lWb/l3srLrA=,iv:SN8+ziMJZZ1F+RT6JhoqWXcr1c4pSAkiT6gYfsi2LS4=,tag:g5Whb9nV8FHrOA5/Nbg0Fw==,type:str] password: ENC[AES256_GCM,data:lWb/l3srLrA=,iv:SN8+ziMJZZ1F+RT6JhoqWXcr1c4pSAkiT6gYfsi2LS4=,tag:g5Whb9nV8FHrOA5/Nbg0Fw==,type:str]
kellnr:
token: ENC[AES256_GCM,data:te5psUTLr8+NLsliJAgz71j8AT3BUkJ8f0eGgnsRbbk2zF9fH3cCfZbry+mmxwvhmwL8ktNexaPUixatNDrWpA==,iv:Ao6Iqr3z8/3azo9H9lPUeVwto7nQMlMuAZp4Q9fIwJE=,tag:r2FXoxgrvlaCnQlngg12qg==,type:str]
password: ENC[AES256_GCM,data:OZkfHckKHu/EM6+PquknU+aKmyyFw5o25ZENqNGc0d/vYiNBo4FBdCZwj1W0efo43+hTgsxVj7QCDSxFgROdOg==,iv:2G3fy5dIufL7tXEgRaOGBFNaVoKbfKqcFnRiZN1I1F4=,tag:iyHQD5oXy44tL18W7Fw35g==,type:str]
sops: sops:
age: age:
- recipient: age1pw7kluxp7872c63ne4jecq75glj060jkmqwzkk6esatuyck9egfswufdpk - recipient: age1pw7kluxp7872c63ne4jecq75glj060jkmqwzkk6esatuyck9egfswufdpk
@@ -91,7 +94,7 @@ sops:
VGZKdHpVeFRpQUxtSEkyaEhLMlBJcGsKLb0DvPNZosPBUuiX6qz1s5IO5INQh8CK VGZKdHpVeFRpQUxtSEkyaEhLMlBJcGsKLb0DvPNZosPBUuiX6qz1s5IO5INQh8CK
ZtXTVClwMSmaUYhdSB2gKFrKVZHXTJZ4oAL5t/BpC0pOHyr+o96T3Q== ZtXTVClwMSmaUYhdSB2gKFrKVZHXTJZ4oAL5t/BpC0pOHyr+o96T3Q==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
lastmodified: "2025-12-30T01:39:33Z" lastmodified: "2026-01-23T07:40:21Z"
mac: ENC[AES256_GCM,data:dD0EYgJ7vD4bH5l36XJZO5LA495tVCeh5bMUBhKaOoZgf2LmgNXz5oBHwIof1ZrhZ6cYMKCxvt+hllAL5u2N+hE/JjJLDxPj3DS/BXhTzp/OoQohKdLrYoj6IAUfTQppmLj06WLKR+5TCEzOuG01Y/SkAM9tqk3himfrx7guxUQ=,iv:U7a+4syPkM9R9ksIVJ3/vnFi0iS1uPH2rulpWOayPgs=,tag:2r2rrUg6wEC1zqRpeU2GJA==,type:str] mac: ENC[AES256_GCM,data:lmpI0sQJbEz0U8oxJ+gLZTfFBwCyJYdaiCmKcRU1juL7/mqyRYrB4Dh8lMMmW5I+n0Z1P0zZ5+CD/WnRXcqdZ/Yj40ZlaUgIdsH1qMImvdv1wld0OIThDWKxoTSywGcbaMz7PpAsC5FNoRo5v/uBT9y42xBXoxw8urdHCrIi21Y=,iv:KFL4fuyqv1TKg36kHxSZiiHTi4MoGEnRP5JyB6BQq78=,tag:sVbK6UwRC+f0Z3HSCtZ2qQ==,type:str]
unencrypted_suffix: _unencrypted unencrypted_suffix: _unencrypted
version: 3.11.0 version: 3.11.0