This commit is contained in:
2026-08-02 01:38:50 +01:00
parent b8c6862880
commit 47c31cc539
12 changed files with 321 additions and 229 deletions
-16
View File
@@ -16,22 +16,6 @@
home.packages = [
pkgs.claude-code
];
sops = {
secrets.scug-io-ai-key = {
# sopsFile = ./secrets.yaml;
# Decrypted file path (available at runtime, not eval time)
path = config.home.homeDirectory + "/.secrets/scug_io_api_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
set -x PI_LENS_STARTUP_MODE quick
'';
};
programs.opencode = {
enable = true;
+102 -44
View File
@@ -7,66 +7,101 @@
{
modules.pi-coding = {
homeManager =
{ pkgs, ... }:
{ pkgs, config, ... }:
{
sops = {
secrets.scug-io-ai-key = {
# sopsFile = ./secrets.yaml;
# 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 = {
# sopsFile = ./secrets.yaml;
# 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
set -x PI_LENS_STARTUP_MODE quick
'';
};
programs.pi-coding-agent = {
enable = true;
extraPackages = [
pkgs.nodejs
# pkgs.lean-lsp-mcp
];
package = pkgs.pi-coding-agent.overrideAttrs (
new: old: {
version = "0.81.1";
src = pkgs.fetchFromGitHub {
owner = "earendil-works";
repo = "pi";
tag = "v${new.version}";
hash = "sha256-xo3uoR7HceOCL3wqoMcacOe8WXP1o7ReAXne5t6Hgao=";
};
npmDepsHash = "sha256-lzKQZbnITzgV9koucsMno6f61ubBLYUcwQEXtak1r1s=";
# npmDepsHash = pkgs.lib.fakeHash;
# npmDepsHash = "sha256-lDoj/94tjJd4ZGU9WgrMOqNSmdpeCljU4c6jGX+TSDY=";
npmDeps = pkgs.fetchNpmDeps {
inherit (new) src;
name = "pi-coding-agent-0.81.1-npm-deps";
hash = new.npmDepsHash;
};
modelData = pkgs.fetchurl {
url = "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-${new.version}.tgz";
hash = "sha256-x53MD5DU370ZdNoz36P+OWZjGVpoM5sfVcEU2/ckDy8=";
# hash = pkgs.lib.fakeHash;
};
preConfigure = ''
mkdir -p packages/ai/src/providers/data
tar --extract --gzip --file=${new.modelData} \
--directory=packages/ai/src/providers/data \
--strip-components=4 \
package/dist/providers/data
'';
passthru.updateScript = pkgs.nix-update-script {
extraArgs = [
"--custom-dep"
"modelData"
];
};
}
);
# package = pkgs.pi-coding-agent.overrideAttrs (
# new: old: {
# version = "0.81.1";
#
# src = pkgs.fetchFromGitHub {
# owner = "earendil-works";
# repo = "pi";
# tag = "v${new.version}";
# hash = "sha256-xo3uoR7HceOCL3wqoMcacOe8WXP1o7ReAXne5t6Hgao=";
# };
#
# npmDepsHash = "sha256-lzKQZbnITzgV9koucsMno6f61ubBLYUcwQEXtak1r1s=";
# # npmDepsHash = pkgs.lib.fakeHash;
#
# # npmDepsHash = "sha256-lDoj/94tjJd4ZGU9WgrMOqNSmdpeCljU4c6jGX+TSDY=";
#
# npmDeps = pkgs.fetchNpmDeps {
# inherit (new) src;
# name = "pi-coding-agent-0.81.1-npm-deps";
# hash = new.npmDepsHash;
# };
# modelData = pkgs.fetchurl {
# url = "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-${new.version}.tgz";
# hash = "sha256-x53MD5DU370ZdNoz36P+OWZjGVpoM5sfVcEU2/ckDy8=";
# # hash = pkgs.lib.fakeHash;
# };
# preConfigure = ''
# mkdir -p packages/ai/src/providers/data
# tar --extract --gzip --file=${new.modelData} \
# --directory=packages/ai/src/providers/data \
# --strip-components=4 \
# package/dist/providers/data
# '';
# passthru.updateScript = pkgs.nix-update-script {
# extraArgs = [
# "--custom-dep"
# "modelData"
# ];
# };
# }
# );
settings = {
"openrouter" = {
"compat" = {
"sendSessionAffinityHeaders" = true;
};
};
"providers" = {
"opencode-go" = {
# "type" = "api_key";
# "apiKey" = "$OPENCODE_GO_API_KEY";
"compat" = {
"supportsLongCacheRetention" = true;
"sendSessionAffinityHeaders" = true;
};
};
};
"litellm" = {
"providers" = {
"litellm" = {
"displayName" = "scuggo";
"baseUrl" = "https://9f5db439.fwds.scug.io";
"baseUrl" = "https://ai-proxy.fwds.scug.io";
"apiKey" = "$SCUG_IO_API_KEY";
"compat" = {
"sendSessionAffinityHeaders" = true;
@@ -83,6 +118,7 @@
"mcp" = {
"enabled" = true;
};
"uiMode" = "fullscreen";
"showCacheMissNotices" = true;
"vstack" = {
"extensionManager" = {
@@ -110,7 +146,7 @@
# "npm:pi-web-access"
# "npm:@gotgenes/pi-permission-system"
"npm:@vanillagreen/pi-extension-manager"
"npm:@vanillagreen/pi-qol"
# "npm:@vanillagreen/pi-qol"
"npm:pi-vitals"
"npm:pi-spark"
"npm:@zhushanwen/pi-context-engineering"
@@ -251,6 +287,28 @@
};
};
};
home.file.".pi/agent/auth.json" = {
text = builtins.toJSON {
"opencode-go" = {
"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;
# sendSessionAffinityHeaders = true;
};
};
};
};
};
# pi-spark config
home.file.".pi/agent/spark.json" = {
+1
View File
@@ -4,6 +4,7 @@
homeManager = {
services.dunst = {
enable = true;
# systemd.enable = true;
settings = {
global = {
font = "Noto Nerd Font 8";
@@ -228,6 +228,10 @@
];
};
};
# systemd.user.services.hyprpaper = {
# partOf = [ "hyprland-session.target" ];
# after = [ "hyprland-session.target" ];
# };
xdg.configFile."hypr/hyprland.lua" = {
source = pkgs.writeText "hyprland.lua" hlBindCode;
};
+49 -43
View File
@@ -3,56 +3,62 @@
inputs,
lib,
...
}: {
}:
{
flake-file.inputs = {
hyprland.url = "github:hyprwm/Hyprland";
};
modules.hyprland = {
nixos = {pkgs, ...}: {
imports = [inputs.hyprland.nixosModules.default];
environment.systemPackages = with pkgs; [
wayfreeze
grim
slurp
wlogout
ranger
];
programs.xwayland.enable = true;
programs.hyprland = {
enable = true;
# withUWSM = true;
# set the flake package
package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
# make sure to also set the portal package, so that they are in sync
portalPackage =
inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland;
};
# gtk.enable = lib.mkForce false;
xdg.portal = {
enable = true;
extraPortals = [
inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland
nixos =
{ pkgs, ... }:
{
imports = [ inputs.hyprland.nixosModules.default ];
environment.systemPackages = with pkgs; [
wayfreeze
grim
slurp
wlogout
ranger
];
};
environment.sessionVariables.NIXOS_OZONE_WL = "1";
hardware.graphics = {
# package = pkgs-unstable.mesa;
programs.xwayland.enable = true;
programs.hyprland = {
enable = true;
# withUWSM = true;
# set the flake package
package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
# make sure to also set the portal package, so that they are in sync
portalPackage =
inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland;
};
# gtk.enable = lib.mkForce false;
xdg.portal = {
enable = true;
extraPortals = [
inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland
];
};
environment.sessionVariables.NIXOS_OZONE_WL = "1";
hardware.graphics = {
# package = pkgs-unstable.mesa;
# if you also want 32-bit support (e.g for Steam)
# enable32Bit = true;
# package32 = pkgs-unstable.pkgsi686Linux.mesa;
# if you also want 32-bit support (e.g for Steam)
# enable32Bit = true;
# package32 = pkgs-unstable.pkgsi686Linux.mesa;
};
};
};
homeManager = {pkgs, ...}: {
gtk = {
enable = true;
homeManager =
{ pkgs, ... }:
{
gtk = {
enable = true;
};
# backupFileExtension = "backupHM";
wayland.windowManager.hyprland = {
enable = true;
systemd.enable = true;
systemd.variables = [ "--all" ];
configType = "lua";
};
};
# backupFileExtension = "backupHM";
wayland.windowManager.hyprland = {
enable = true;
systemd.variables = ["--all"];
configType = "lua";
};
};
};
}
+5 -1
View File
@@ -2,7 +2,8 @@
den,
modules,
...
}: {
}:
{
modules.kitty = {
homeManager = {
programs.kitty = {
@@ -16,6 +17,9 @@
background_opacity = 0.6;
cursor_trail = 1;
auto_reload_config = -1;
input_delay = 1;
repaint_delay = 2;
wayland_enable_ime = "no";
};
};
};
+5
View File
@@ -11,12 +11,17 @@
{
programs.quickshell = {
systemd.enable = true;
systemd.target = "hyprland-session.target";
enable = true;
activeConfig = "main";
configs = {
main = config.lib.file.mkOutOfStoreSymlink "/home/doloro/dotfiles/config/modules/quickshell/quickshell";
};
};
# systemd.user.services.quickshell = {
# partOf = [ "hyprland-session.target" ];
# after = [ "hyprland-session.target" ];
# };
};
};
}
+4 -3
View File
@@ -4,6 +4,7 @@ wakatime-scug-io-api-key: ENC[AES256_GCM,data:XQUccNW4210U8ZpHSGVcsdbAirzyTvmcy4
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]
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:
age:
- enc: |
@@ -69,7 +70,7 @@ sops:
61QsSqCuJyEwSPpOzeWa5NChcCjitOUG1jEMsSHlpIslKA1P7g/P9g==
-----END AGE ENCRYPTED FILE-----
recipient: age1kc0xu0ue2nrrr7w4gam7wlzackv8jv243rxwwndgxjqklgtnp5csdtpgzp
lastmodified: "2026-07-22T22:45:05Z"
mac: ENC[AES256_GCM,data:jfbsnWcZ6yJSUbRn8VbONhj3oin1+DsHzJ590BbdPtikZwjD/0f06NQ86b0DI5/M+LKP4Dy5Cyf7xyJ99iWuOKbF9y12qK17IqMaNZCmPkw8Y+v7q38ESsW/Iizr3hfQ2L2GwJNTWsoifCeQphxGby7s2lKjMPYGKhYrgicZ5Fs=,iv:bbL+59d0S1fdfDInLS5z9Vx+AVW6nb0z2BNgZ+5PbUM=,tag:jJYnLsORyEuClRm/t4mwcA==,type:str]
lastmodified: "2026-08-01T18:33:13Z"
mac: ENC[AES256_GCM,data:sTTpvCTBPsY4OABqIvgujUT2+Yye+H44mxN3G3ybhoj05omgFajYN86sc3zL9vbiTl7SNxCWMkGCerCvS4QrtRZ0vRTNuYNkFPNHDKniSybbxKzjHqyXWGCOoNYqHW211ktB9vmiXQd+zYart87kUU6d6p2FrVDBLU03eQwJO6k=,iv:8zT8W34A8f/EXRYxFeK2PC2Ko6UrjFrPL5+lwNXpb4Q=,tag:WugeYbmrVcUZ9xVC+r3c7w==,type:str]
unencrypted_suffix: _unencrypted
version: 3.13.2
version: 3.13.3
+61
View File
@@ -0,0 +1,61 @@
{ 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
];
};
};
}