Compare commits

...

23 Commits

Author SHA1 Message Date
soraefir 887634421c Update Valinor and vscodium 2026-06-26 19:48:20 +02:00
soraefir 9514a3006c move system to build it 2026-06-21 23:30:56 +02:00
soraefir 5c61353575 remove soft if not needed 2026-06-21 23:23:40 +02:00
soraefir 0f3b542ae5 fix build 2026-06-21 23:17:49 +02:00
soraefir 6366d9b313 improve size and swap for gateway 2026-06-21 23:09:33 +02:00
soraefir 473b290258 Reduce build size via config restriction 2026-06-21 22:51:54 +02:00
soraefir 798c222bd6 fix typo 2026-06-21 19:00:05 +02:00
soraefir 546b9cb09d cleanup 2026-06-21 18:38:02 +02:00
soraefir c357d13b21 container fixes 2026-06-21 17:57:12 +02:00
soraefir a34135d5a7 add drawio & robots to sandbox 2026-06-21 17:13:04 +02:00
soraefir 878b660bf2 small refactor 2026-06-20 13:07:06 +02:00
soraefir e5a75cb3b7 Multi system and pkgs cleanup 2026-06-20 12:50:42 +02:00
soraefir 8e21f3dae8 Cleanup 2026-06-20 10:54:17 +02:00
soraefir b55afcfdf6 dunst wayland 2026-06-19 00:12:58 +02:00
soraefir 662388bb91 better color for active modes 2026-06-18 20:43:51 +02:00
soraefir 21c39abe32 mpv browser 2026-06-18 20:37:27 +02:00
soraefir 0611ab0077 Merge remote-tracking branch 'ext/dev' into dev 2026-06-17 21:25:04 +02:00
soraefir 9936f538e1 more and fixes 2026-06-17 20:04:08 +02:00
sora-ext ece075ffaf Update modules/nixos/system/network/base/default.nix 2026-06-17 17:15:52 +02:00
sora-ext bae41101e3 Add modules/server/containers/apps/drawio.nix 2026-06-17 17:14:41 +02:00
sora-ext 5effa640cc Add modules/server/containers/apps/excalidraw.nix 2026-06-17 17:14:28 +02:00
sora-ext a66c08551c Update modules/server/containers/apps/influx.nix 2026-06-17 17:14:13 +02:00
sora-ext 4fee8726a9 Add modules/server/containers/apps/robotstxt.nix 2026-06-17 17:13:59 +02:00
56 changed files with 768 additions and 282 deletions
+22 -12
View File
@@ -39,25 +39,35 @@
outputs = inputs: outputs = inputs:
let let
lib = inputs.nixpkgs.lib; lib = inputs.nixpkgs.lib;
gen = import ./generator.nix { inherit inputs; }; linuxSystems = [ "x86_64-linux" "aarch64-linux" ];
supportedSystems = linuxSystems ++ [ "x86_64-darwin" "aarch64-darwin" ];
overlays = import ./overlays { inherit inputs; };
mkPkgs = system:
import inputs.nixpkgs {
inherit system;
inherit overlays;
config.allowUnfree = true;
};
gen = import ./generator.nix { inherit inputs mkPkgs supportedSystems; };
systemsDir = ./systems; systemsDir = ./systems;
isIgnoredSystemDir = name: lib.hasPrefix "_" name || lib.hasPrefix "." name; isIgnoredSystemDir = name: lib.hasPrefix "_" name || lib.hasPrefix "." name;
systemNames = lib.attrNames (lib.filterAttrs systemNames = lib.attrNames (
(name: type: lib.filterAttrs (
name: type:
type == "directory" type == "directory"
&& !isIgnoredSystemDir name && !isIgnoredSystemDir name
&& builtins.pathExists (systemsDir + "/${name}/cfg.nix")) && builtins.pathExists (systemsDir + "/${name}/cfg.nix")
(builtins.readDir systemsDir)); ) (builtins.readDir systemsDir)
);
hostsByType = systemType: hostsByType = systemType:
lib.filter lib.filter (host: ((import (systemsDir + "/${host}/cfg.nix")).syscfg.type or "nixos") == systemType) systemNames;
(host: (import (systemsDir + "/${host}/cfg.nix")).syscfg.type == systemType)
systemNames;
generateHosts = systemType: generateHosts = systemType:
lib.genAttrs lib.genAttrs (hostsByType systemType) (host: gen.generate { inherit host; });
(hostsByType systemType)
(host: gen.generate { inherit host; });
in { in {
devShells = import ./shells { inherit inputs; }; devShells = import ./shells {
inherit inputs mkPkgs;
systems = linuxSystems;
};
nixosConfigurations = generateHosts "nixos"; nixosConfigurations = generateHosts "nixos";
darwinConfigurations = generateHosts "macos"; darwinConfigurations = generateHosts "macos";
+65 -45
View File
@@ -1,31 +1,27 @@
{ inputs, ... }: { { inputs, mkPkgs, supportedSystems, ... }:
{
generate = { host }: generate = { host }:
let let
syscfg = import ./systems/${host}/cfg.nix; syscfg = import ./systems/${host}/cfg.nix;
nameValuePair = name: value: { inherit name value; }; nameValuePair = name: value: { inherit name value; };
in ({ systemType = syscfg.syscfg.type or "nixos";
"nixos" = inputs.nixpkgs.lib.nixosSystem { defaultSystem =
system = "x86_64-linux";
specialArgs = { inherit inputs; };
modules = [
./modules/shared/syscfg
./modules/shared/sops
./modules/nixos
syscfg
./systems/${host}
inputs.sops-nix.nixosModules.sops
inputs.home-manager.nixosModules.home-manager
inputs.nixos-wsl.nixosModules.wsl
inputs.vscode-server.nixosModules.default
{ {
home-manager.useGlobalPkgs = true; nixos = "x86_64-linux";
home-manager.useUserPackages = true; macos = "x86_64-darwin";
home-manager.extraSpecialArgs = { inherit inputs; }; home = "x86_64-linux";
home-manager.users = builtins.listToAttrs (map (userConfig: }
nameValuePair userConfig.username { .${systemType} or (throw "Unsupported system type: ${systemType}");
imports = [ requestedSystem = syscfg.syscfg.system or defaultSystem;
system =
if builtins.elem requestedSystem supportedSystems then
requestedSystem
else
throw "Unsupported system '${requestedSystem}' for host '${host}'";
users = syscfg.syscfg.users or [ ];
mkLinuxHomeImports =
userConfig:
[
./modules/shared/syscfg ./modules/shared/syscfg
./modules/shared/colors ./modules/shared/colors
./modules/home ./modules/home
@@ -34,37 +30,61 @@
inputs.nix-colors.homeManagerModule inputs.nix-colors.homeManagerModule
inputs.sops-nix.homeManagerModules.sops inputs.sops-nix.homeManagerModules.sops
]; ];
}) syscfg.syscfg.users); mkDarwinHomeImports = [ inputs.nix-colors.homeManagerModule inputs.sops-nix.homeManagerModules.sops ];
} mkHomeUsers = importsForUser:
]; builtins.listToAttrs (
map (userConfig: nameValuePair userConfig.username { imports = importsForUser userConfig; }) users
);
mkHomeManager = importsForUser: {
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = { inherit inputs; };
home-manager.users = mkHomeUsers importsForUser;
}; };
sharedModules = [
"macos" = inputs.darwin.lib.darwinSystem {
system = "x86_64-darwin";
modules = [
./modules/shared/syscfg ./modules/shared/syscfg
./modules/shared/sops ./modules/shared/sops
syscfg syscfg
./systems/${host} ./systems/${host}
inputs.sops-nix.nixosModules.sops
inputs.home-manager.darwinModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = { inherit inputs; };
home-manager.users = builtins.listToAttrs (map (userConfig:
nameValuePair userConfig.username {
imports = [
inputs.nix-colors.homeManagerModule
inputs.sops-nix.homeManagerModules.sops
]; ];
}) syscfg.syscfg.users); defaultUser =
} builtins.head (
builtins.filter (user: user.username == syscfg.syscfg.defaultUser) users
++ [ { username = syscfg.syscfg.defaultUser; } ]
);
in
(
{
"nixos" = inputs.nixpkgs.lib.nixosSystem {
inherit system;
specialArgs = { inherit inputs; };
modules = sharedModules ++ [
./modules/nixos
inputs.sops-nix.nixosModules.sops
inputs.home-manager.nixosModules.home-manager
inputs.nixos-wsl.nixosModules.wsl
inputs.vscode-server.nixosModules.default
(mkHomeManager mkLinuxHomeImports)
];
};
"macos" = inputs.darwin.lib.darwinSystem {
inherit system;
modules = sharedModules ++ [
inputs.sops-nix.darwinModules.sops
inputs.home-manager.darwinModules.home-manager
(mkHomeManager (_: mkDarwinHomeImports))
]; ];
}; };
"home" = inputs.home-manager.lib.homeManagerConfiguration { "home" = inputs.home-manager.lib.homeManagerConfiguration {
modules = [ ./modules/home ]; pkgs = mkPkgs system;
extraSpecialArgs = { inherit inputs; };
modules = mkLinuxHomeImports defaultUser;
}; };
_ = throw "Unsupported system"; _ = throw "Unsupported system";
}.${syscfg.syscfg.type}); }
.${systemType}
);
} }
+7 -3
View File
@@ -1,12 +1,16 @@
{ lib, config, ... }: { { lib, config, pkgs, ... }: {
#environment.sessionVariables.SOPS_AGE_KEY_FILE = keyFilePath; #environment.sessionVariables.SOPS_AGE_KEY_FILE = keyFilePath;
systemd.user.startServices = "sd-switch"; systemd.user.startServices = lib.mkIf pkgs.stdenv.isLinux "sd-switch";
programs.home-manager.enable = true; programs.home-manager.enable = true;
home = { home = {
username = "${config.usercfg.username}"; username = "${config.usercfg.username}";
homeDirectory = "/home/${config.usercfg.username}"; homeDirectory =
if pkgs.stdenv.isDarwin then
"/Users/${config.usercfg.username}"
else
"/home/${config.usercfg.username}";
stateVersion = "26.05"; stateVersion = "26.05";
}; };
+1 -1
View File
@@ -28,7 +28,7 @@ let
logoColor1 = p.base07; logoColor1 = p.base07;
logoColor2 = p.base07; logoColor2 = p.base07;
# ───────────────────────────────────────────────────────────────────────── # ─────────────────────────────────────────────────────────────────────────
in { in lib.mkIf config.syscfg.make.gui {
home.packages = with pkgs; [ fastfetch ]; home.packages = with pkgs; [ fastfetch ];
xdg.configFile."neofetch/config.conf".source = ./config.conf; xdg.configFile."neofetch/config.conf".source = ./config.conf;
xdg.configFile."fastfetch/logo.txt".source = ./logo.txt; xdg.configFile."fastfetch/logo.txt".source = ./logo.txt;
+2 -2
View File
@@ -1,5 +1,5 @@
{ config, ... }: { { config, lib, ... }: {
programs.kitty = { programs.kitty = lib.mkIf config.syscfg.make.gui {
enable = true; enable = true;
settings = { settings = {
foreground = "#${config.colorScheme.palette.base07}"; foreground = "#${config.colorScheme.palette.base07}";
+3 -3
View File
@@ -1,16 +1,16 @@
{ pkgs, ... }: { { config, lib, pkgs, ... }: {
home.packages = with pkgs; [ home.packages = with pkgs; [
ripgrep ripgrep
unzip unzip
socat socat
appimage-run
cbonsai cbonsai
pipes-rs pipes-rs
cmatrix cmatrix
#cava #cava
sl sl
] ++ lib.optionals (config.syscfg.make.gui || config.syscfg.make.develop) [
pkgs.appimage-run
]; ];
} }
@@ -1,18 +1,22 @@
{ lib, config, pkgs, ... }: { { lib, config, pkgs, ... }:
let
exts = with pkgs.vscode-extensions; [
bbenoist.nix
esbenp.prettier-vscode
anthropic.claude-code
# openai.codex
];
in {
config = lib.mkIf (config.syscfg.make.develop) { config = lib.mkIf (config.syscfg.make.develop) {
programs.vscodium = { programs.vscodium = {
enable = true; enable = true;
#profiles.default = { profiles.default.extensions = exts;
profiles.default.extensions = with pkgs.vscode-extensions; [ };
bbenoist.nix programs.antigravity = {
esbenp.prettier-vscode enable = true;
golang.go profiles.default.extensions = exts;
ms-python.vscode-pylance
ms-vscode.cpptools
dbaeumer.vscode-eslint
];
#};
}; };
}; };
} }
+2 -1
View File
@@ -4,8 +4,9 @@
programs.imv.enable = true; programs.imv.enable = true;
programs.obs-studio.enable = true; programs.obs-studio.enable = true;
services.jellyfin-mpv-shim.enable = true;
home.packages = with pkgs; [ jellyfin-mpv-shim krita gimp darktable ]; home.packages = with pkgs; [ krita gimp darktable ];
}; };
} }
+1 -3
View File
@@ -6,13 +6,11 @@ in{
config = lib.mkIf (config.syscfg.make.gui) { config = lib.mkIf (config.syscfg.make.gui) {
programs.mpv = { programs.mpv = {
enable = true; enable = true;
scripts = with pkgs.mpvScripts; [ mpris modernz ]; scripts = with pkgs.mpvScripts; [ mpris ];
config = { config = {
hwdec ="auto"; hwdec ="auto";
profile ="high-quality"; profile ="high-quality";
ytdl-format = "bestvideo+bestaudio"; ytdl-format = "bestvideo+bestaudio";
osc ="no";
}; };
bindings = bindings =
+8 -8
View File
@@ -8,14 +8,11 @@
settings = { settings = {
global = { global = {
follow = "mouse"; follow = "mouse";
height = "200"; height = "(0, 200)";
width = "350"; width = "350";
scale = "0"; scale = "0";
origin = "top-right"; origin = "bottom-right";
offset = "${ offset = "(${config.colorScheme.palette.gaps-screen},${config.colorScheme.palette.gaps-screen})";
toString ((lib.strings.toInt config.colorScheme.palette.gaps-bar)
+ (lib.strings.toInt config.colorScheme.palette.gaps-screen))
}x${config.colorScheme.palette.gaps-screen}";
notification_limit = "0"; notification_limit = "0";
progress_bar = "true"; progress_bar = "true";
progress_bar_height = "10"; progress_bar_height = "10";
@@ -62,8 +59,8 @@
corner_radius = "${config.colorScheme.palette.border-radius}"; corner_radius = "${config.colorScheme.palette.border-radius}";
ignore_dbusclose = "false"; ignore_dbusclose = "false";
layer = "top"; layer = "top";
force_xwayland = "true"; # force_xwayland = "true";
force_xinerama = "false"; # force_xinerama = "false";
mouse_left_click = "close_current"; mouse_left_click = "close_current";
mouse_middle_click = "context"; mouse_middle_click = "context";
@@ -91,6 +88,9 @@
timeout = "10"; timeout = "10";
highlight = "#${config.colorScheme.palette.base0E}"; highlight = "#${config.colorScheme.palette.base0E}";
}; };
experimental = {
per_monitor_dpi = true;
};
}; };
}; };
}; };
@@ -61,8 +61,8 @@ calendar {
} }
.quick-btn-active { .quick-btn-active {
.quick-icon { @include color-accent; } .quick-icon { color: $base0E; }
.quick-label { @include color-accent; } .quick-label { color: $base0E; }
} }
.quick-icon { font-size: 1.5em; @include color-body; } .quick-icon { font-size: 1.5em; @include color-body; }
@@ -0,0 +1,19 @@
#!/usr/bin/env bash
is_active() {
rfkill list wifi 2>/dev/null | grep -q "Soft blocked: yes"
}
case "$1" in
status)
is_active && echo true || echo false
;;
*)
if is_active; then
rfkill unblock all
echo false
else
rfkill block all
echo true
fi
;;
esac
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
case "$1" in
status)
dunstctl is-paused
;;
*)
if dunstctl is-paused | grep -q true; then
dunstctl set-paused false
echo false
else
dunstctl set-paused true
echo true
fi
;;
esac
@@ -0,0 +1,23 @@
#!/usr/bin/env bash
SHADER="$HOME/.config/eww/shaders/read-mode.glsl"
is_active() {
hyprctl getoption decoration:screen_shader | grep -qF "$SHADER"
}
case "$1" in
status)
is_active && echo true || echo false
;;
*)
if is_active; then
hyprctl eval 'hl.config({ decoration = { screen_shader = "" } })'
hyprctl eval 'hl.config({ render = { use_fp16 = 2 } })'
echo false
else
hyprctl eval 'hl.config({ render = { use_fp16 = 0 } })'
hyprctl eval "hl.config({ decoration = { screen_shader = \"$SHADER\" } })"
echo true
fi
;;
esac
@@ -0,0 +1,133 @@
#version 320 es
/*
I love e-ink displays!
The mathematical philosophy here is using deterministic logic (Bayer matrices, arithmetic hashing)
to simulate physical chaos (paper grain, ink bleed). I picked up these concepts in a course
and this is easily the best real-world application of them I've found.
It works brilliantly-looks like real paper, killed my eye strain, and even reduced the insane
reflections from my glossy surface display.
by @snes19xx, https://github.com/snes19xx
*/
precision highp float;
in vec2 v_texcoord;
uniform sampler2D tex;
out vec4 fragColor;
// 4x4 Bayer Matrix
// this grid helps break up smooth gradients into texture so it looks less "digital"
float getBayer(vec2 pos) {
int x = int(mod(pos.x, 4.0));
int y = int(mod(pos.y, 4.0));
const mat4 bayer = mat4(
0.0, 12.0, 3.0, 15.0,
8.0, 4.0, 11.0, 7.0,
2.0, 14.0, 1.0, 13.0,
10.0, 6.0, 9.0, 5.0
);
return bayer[x][y] / 16.0;
}
// High-performance "Hash12" - No trigonometry
// old hash used sin() which is slow on gpu. this one just mashes bits together.
// (https://www.shadertoy.com/view/4djSRW)
float hash(vec2 p) {
// fract() keeps only the decimal part for the wave-like dusty pattern
// .1031 is a special prime number to avoid perfect alignments with pixel grid
vec3 p3 = fract(vec3(p.xyx) * .1031);
// dot product mixes the x, y, z values so they depend on each other
p3 += dot(p3, p3.yzx + 33.33);
// return the final entangled decimal. deterministically random (afaik).
return fract((p3.x + p3.y) * p3.z);
}
// Multi-octave noise for realistic paper fiber texture
float paperTexture(vec2 uv) {
float n = 0.0;
n += hash(uv * 0.3) * 0.6; // Very large fibers
n += hash(uv * 0.8) * 0.4; // Large fibers
n += hash(uv * 2.5) * 0.3; // Medium detail
n += hash(uv * 6.0) * 0.2; // Fine grain
n += hash(uv * 15.0) * 0.1; // Very fine grain
return n / 1.6; // Normalize
}
// Directional paper grain (simulates paper fibers running in one direction)
float directionalGrain(vec2 uv) {
vec2 direction = vec2(0.7, 0.3); // Fiber direction
float grain = 0.0;
grain += hash(uv * 3.0 + direction * 2.0) * 0.5;
grain += hash(uv * 8.0 + direction * 5.0) * 0.3;
return grain / 0.8;
}
// Subtle vignette for paper edge darkening
float vignette(vec2 uv) {
vec2 center = uv - 0.5;
float dist = length(center);
// smoothstep creates a signmoid (S-curve) so the shadow falls off naturally
return 1.0 - smoothstep(0.4, 1.2, dist) * 0.15;
}
void main() {
vec4 pixColor = texture(tex, v_texcoord);
// Luma Conversion
// not using average (r+g+b)/3 because eyes see green brighter than blue.
float gray = dot(pixColor.rgb, vec3(0.299, 0.587, 0.114));
// E-ink characteristic response curve
// real e-ink isn't linear. this exponent simulates ink clumping.
gray = pow(gray, 1.2);
// Better contrast with slight S-curve
// clips pure blacks/whites but keeps the middle smooth.
gray = smoothstep(0.08, 0.92, gray);
// Mid-tone boost
float midBoost = smoothstep(0.3, 0.5, gray) * (1.0 - smoothstep(0.5, 0.7, gray));
gray += midBoost * 0.1;
vec2 screenPos = gl_FragCoord.xy;
// PAPER GRAIN
float paperGrain = (paperTexture(screenPos * 0.3) - 0.5) * 0.035;
float dirGrain = (directionalGrain(screenPos * 0.4) - 0.5) * 0.025; // directional grain
float bayerValue = getBayer(screenPos);
// Apply to bright areas (paper), but also slightly to mid-tones for more visible grain
float textureMask = smoothstep(0.5, 0.95, gray); // Lower threshold for more coverage
// Apply both grain types
gray += paperGrain * textureMask;
gray += dirGrain * textureMask * 0.7; // Directional grain is slightly weaker
// Increased dithering for more texture
float ditherStrength = 0.025; // Increased from 0.018
gray += (bayerValue - 0.5) * ditherStrength * textureMask;
// Vignette for paper edges
float vig = vignette(v_texcoord);
gray *= vig;
gray = clamp(gray, 0.0, 1.0);
// E-ink colors with slight warmth variation
vec3 paperColor = vec3(0.94, 0.92, 0.86);
vec3 inkColor = vec3(0.10, 0.10, 0.12);
// More noticeable color variation for paper texture
float colorVariation = hash(screenPos * 0.08) * 0.02; // Increased from 0.01
paperColor += vec3(colorVariation, colorVariation * 0.5, -colorVariation * 0.2);
// linear interpolation. paints the gray value onto our specific color palette.
vec3 finalColor = mix(inkColor, paperColor, gray);
fragColor = vec4(finalColor, pixColor.a);
}
@@ -71,6 +71,9 @@
(defpoll power-save :interval "5s" :initial "false" "scripts/power-save status") (defpoll power-save :interval "5s" :initial "false" "scripts/power-save status")
(defpoll night-light :interval "5s" :initial "false" "scripts/nightlight status") (defpoll night-light :interval "5s" :initial "false" "scripts/nightlight status")
(defpoll read-mode :interval "5s" :initial "false" "scripts/read-mode status")
(defpoll airplane-mode :interval "5s" :initial "false" "scripts/airplane-mode status")
(defpoll do-not-disturb :interval "5s" :initial "false" "scripts/do-not-disturb status")
(defwidget quick-btn [icon label onclick active] (defwidget quick-btn [icon label onclick active]
(button :class "quick-btn ${active ? 'quick-btn-active' : ''}" (button :class "quick-btn ${active ? 'quick-btn-active' : ''}"
@@ -84,9 +87,13 @@
(section-header :title "Quick Actions" :accent "quick-accent") (section-header :title "Quick Actions" :accent "quick-accent")
(box :orientation "v" :space-evenly false :class "quick-grid" :spacing 4 (box :orientation "v" :space-evenly false :class "quick-grid" :spacing 4
(box :orientation "h" :space-evenly true (box :orientation "h" :space-evenly true
(quick-btn :icon "󰸉" :label "Wallpaper" :onclick "scripts/wallpaper" :active false) (quick-btn :icon "󰌵" :label "Night Light" :onclick "scripts/nightlight" :active {night-light})
(quick-btn :icon "󰂺" :label "Read Mode" :onclick "scripts/read-mode" :active {read-mode})
(quick-btn :icon "󰸉" :label "Wallpaper" :onclick "scripts/wallpaper" :active false))
(box :orientation "h" :space-evenly true
(quick-btn :icon "󱐋" :label "Power Save" :onclick "scripts/power-save" :active {power-save}) (quick-btn :icon "󱐋" :label "Power Save" :onclick "scripts/power-save" :active {power-save})
(quick-btn :icon "󰌵" :label "Night Light" :onclick "scripts/nightlight" :active {night-light})) (quick-btn :icon "󰀞" :label "Airplane" :onclick "scripts/airplane-mode" :active {airplane-mode})
(quick-btn :icon "󰂛" :label "Do Not Dist" :onclick "scripts/do-not-disturb" :active {do-not-disturb}))
(box :orientation "h" :space-evenly true (box :orientation "h" :space-evenly true
(quick-btn :icon "󰹑" :label "Screenshot" :onclick "scripts/screenshot" :active false) (quick-btn :icon "󰹑" :label "Screenshot" :onclick "scripts/screenshot" :active false)
(quick-btn :icon "󰌾" :label "Lock" :onclick "scripts/lock" :active false) (quick-btn :icon "󰌾" :label "Lock" :onclick "scripts/lock" :active false)
@@ -23,6 +23,9 @@ let
scripts = { scripts = {
"scripts/brightness" = mkScript "brightness" ./bar/scripts/brightness [ pkgs.brightnessctl ]; "scripts/brightness" = mkScript "brightness" ./bar/scripts/brightness [ pkgs.brightnessctl ];
"scripts/nightlight" = mkScript "nightlight" ./bar/scripts/nightlight [ pkgs.wlsunset ]; "scripts/nightlight" = mkScript "nightlight" ./bar/scripts/nightlight [ pkgs.wlsunset ];
"scripts/read-mode" = mkScript "read-mode" ./bar/scripts/read-mode [ pkgs.hyprland ];
"scripts/airplane-mode" = mkScript "airplane-mode" ./bar/scripts/airplane-mode [ pkgs.util-linux ];
"scripts/do-not-disturb" = mkScript "do-not-disturb" ./bar/scripts/do-not-disturb [ pkgs.dunst ];
"scripts/panel-toggle" = mkScript "panel-toggle" ./bar/scripts/panel-toggle [ pkgs.eww pkgs.util-linux openOnCurrentScreen ]; "scripts/panel-toggle" = mkScript "panel-toggle" ./bar/scripts/panel-toggle [ pkgs.eww pkgs.util-linux openOnCurrentScreen ];
"scripts/powermenu-toggle" = mkScript "powermenu-toggle" ./bar/scripts/powermenu-toggle [ pkgs.eww openOnCurrentScreen ]; "scripts/powermenu-toggle" = mkScript "powermenu-toggle" ./bar/scripts/powermenu-toggle [ pkgs.eww openOnCurrentScreen ];
"scripts/power-save" = mkScript "power-save" ./bar/scripts/power-save [ pkgs.eww ]; "scripts/power-save" = mkScript "power-save" ./bar/scripts/power-save [ pkgs.eww ];
+54 -71
View File
@@ -1,5 +1,13 @@
{ config, lib, pkgs, ... }: { config, lib, pkgs, ... }:
let let
# Close the bar if it's already open (wrong screen), then open on the target screen.
moveOrOpenBar = screen: "${pkgs.writeShellScript "kanshi-eww-bar-${toString screen}" ''
if ${pkgs.eww}/bin/eww active-windows 2>/dev/null | grep -qx "bar"; then
${pkgs.eww}/bin/eww close bar
fi
${pkgs.eww}/bin/eww open bar --screen ${toString screen}
''}";
baseOutput = { baseOutput = {
position = "0,0"; position = "0,0";
scale = 1.0; scale = 1.0;
@@ -7,7 +15,10 @@ let
status = "enable"; status = "enable";
transform = "normal"; transform = "normal";
}; };
aocT = "AOC 24E1W1 GNSKCHA086899";
aocB = "AOC 24E1W1 GNSKBHA080346";
lgM = "LG Electronics LG ULTRAGEAR+ 511NTDVGC194";
valinorM = "Lenovo Group Limited *";
in { in {
config = lib.mkIf (config.usercfg.wm == "Wayland") { config = lib.mkIf (config.usercfg.wm == "Wayland") {
@@ -31,17 +42,9 @@ in {
mode = "1920x1080@60.000"; mode = "1920x1080@60.000";
};} };}
{output = baseOutput//{ {output = baseOutput//{
criteria = "LG UNKNOWN_TBD"; criteria = "Lenovo Group Limited *";
mode = "1920x1080@144.000";
};}
{output = baseOutput//{
criteria = "LG Display 0x060A Unknown";
mode = "1920x1080@60.020"; mode = "1920x1080@60.020";
};} };}
{output = baseOutput//{
criteria = "CEX CX133 0x00000001";
mode = "2560x1600@59.972";
};}
{output = baseOutput//{ {output = baseOutput//{
criteria = "AOC 16G3 1DDP7HA000348"; criteria = "AOC 16G3 1DDP7HA000348";
mode = "1920x1080@144.000"; mode = "1920x1080@144.000";
@@ -50,44 +53,45 @@ in {
name = "tower_00"; name = "tower_00";
outputs = [ outputs = [
{ {
criteria = "AOC 24E1W1 GNSKCHA086899"; criteria = aocT;
position = "0,0"; position = "0,0";
} }
{ {
criteria = "AOC 24E1W1 GNSKBHA080346"; criteria = aocB;
position = "0,1080"; position = "0,1080";
} }
{ {
criteria = "LG Electronics LG ULTRAGEAR+ 511NTDVGC194"; criteria = lgM;
position = "1920,720"; position = "1920,720";
} }
]; ];
exec = [ exec = [
"${pkgs.eww}/bin/eww open bar --screen 0" (moveOrOpenBar 0)
"${pkgs.writeShellScript "kanshi-hyprland-init" '' "${pkgs.writeShellScript "kanshi-hyprland-init" ''
#!/usr/bin/env bash #!/usr/bin/env bash
${pkgs.hyprland}/bin/hyprctl eval ' ${pkgs.hyprland}/bin/hyprctl eval '
hl.workspace_rule({ workspace = "1", monitor = "DP-1", default = true }) hl.workspace_rule({ workspace = "1", monitor = "desc:${aocB}", default = true })
hl.workspace_rule({ workspace = "2", monitor = "DP-2", default = true }) hl.workspace_rule({ workspace = "2", monitor = "desc:${aocT}", default = true })
hl.workspace_rule({ workspace = "3", monitor = "DP-1", default = true }) hl.workspace_rule({ workspace = "3", monitor = "desc:${aocB}", default = true })
hl.workspace_rule({ workspace = "4", monitor = "DP-1", default = true }) hl.workspace_rule({ workspace = "4", monitor = "desc:${aocB}", default = true })
hl.workspace_rule({ workspace = "5", monitor = "DP-1", default = true }) hl.workspace_rule({ workspace = "5", monitor = "desc:${aocB}", default = true })
hl.workspace_rule({ workspace = "6", monitor = "DP-1", default = true }) hl.workspace_rule({ workspace = "6", monitor = "desc:${aocB}", default = true })
hl.workspace_rule({ workspace = "7", monitor = "DP-1", default = true }) hl.workspace_rule({ workspace = "7", monitor = "desc:${aocB}", default = true })
hl.workspace_rule({ workspace = "8", monitor = "DP-2", default = true }) hl.workspace_rule({ workspace = "8", monitor = "desc:${aocT}", default = true })
hl.workspace_rule({ workspace = "9", monitor = "DP-1", default = true }) hl.workspace_rule({ workspace = "9", monitor = "desc:${aocB}", default = true })
hl.workspace_rule({ workspace = "name:X", monitor = "DP-3", default = true }) hl.workspace_rule({ workspace = "name:X", monitor = "desc:${lgM}", default = true })
' '
${pkgs.hyprland}/bin/hyprctl eval 'hl.dispatch(hl.dsp.focus({ monitor = "DP-2" })); hl.dispatch(hl.dsp.focus({ workspace = "2" }));' ${pkgs.hyprland}/bin/hyprctl eval 'hl.dispatch(hl.dsp.focus({ monitor = "desc:${aocT}" })); hl.dispatch(hl.dsp.focus({ workspace = "2" }));'
${pkgs.hyprland}/bin/hyprctl eval 'hl.dispatch(hl.dsp.focus({ monitor = "DP-3" })); hl.dispatch(hl.dsp.focus({ workspace = "name:X" }));' ${pkgs.hyprland}/bin/hyprctl eval 'hl.dispatch(hl.dsp.focus({ monitor = "desc:${lgM}" })); hl.dispatch(hl.dsp.focus({ workspace = "name:X" }));'
#${pkgs.hyprland}/bin/hyprctl eval 'hl.monitor({ output = "DP-3", cm = "hdr" });' #${pkgs.hyprland}/bin/hyprctl eval 'hl.monitor({ output = "desc:${lgM}", cm = "hdr" });'
${pkgs.hyprland}/bin/hyprctl eval 'hl.dispatch(hl.dsp.focus({ monitor = "desc:${aocB}" }));'
''}" ''}"
"${pkgs.awww}/bin/awww restore" "${pkgs.awww}/bin/awww restore"
]; ];
};} };}
{profile = { {profile = {
name = "tower_0"; name = "tower_01";
outputs = [ outputs = [
{ {
criteria = "AOC 24E1W1 GNSKCHA086899"; criteria = "AOC 24E1W1 GNSKCHA086899";
@@ -118,57 +122,36 @@ in {
''}" ''}"
"${pkgs.awww}/bin/awww restore" "${pkgs.awww}/bin/awww restore"
"${pkgs.eww}/bin/eww open bar --screen 0" (moveOrOpenBar 0)
]; ];
};} };}
{profile = { {profile = {
name = "tower_1"; name = "valinor00";
outputs = [ outputs = [
{ {
criteria = "AOC 24E1W1 GNSKCHA086899"; criteria = "Lenovo Group Limited *";
position = "0,0";
}
{
criteria = "AOC 24E1W1 GNSKBHA080346";
position = "0,0";
}
{
criteria = "LG UNKNOWN_TBD";
position = "0,0"; position = "0,0";
} }
]; ];
};} exec = [
{profile = { "${pkgs.writeShellScript "kanshi-hyprland-init" ''
name = "laptop_0"; #!/usr/bin/env bash
outputs = [{ ${pkgs.hyprland}/bin/hyprctl eval '
criteria = "LG Display 0x060A Unknown"; hl.workspace_rule({ workspace = "1", monitor = "eDP-1", default = true })
position = "0,0"; hl.workspace_rule({ workspace = "2", monitor = "eDP-1", default = true })
}]; hl.workspace_rule({ workspace = "3", monitor = "eDP-1", default = true })
};} hl.workspace_rule({ workspace = "4", monitor = "eDP-1", default = true })
{profile = { hl.workspace_rule({ workspace = "5", monitor = "eDP-1", default = true })
name = "laptop_1"; hl.workspace_rule({ workspace = "6", monitor = "eDP-1", default = true })
outputs = [ hl.workspace_rule({ workspace = "7", monitor = "eDP-1", default = true })
{ hl.workspace_rule({ workspace = "8", monitor = "eDP-1", default = true })
criteria = "CEX CX133 0x00000001"; hl.workspace_rule({ workspace = "9", monitor = "eDP-1", default = true })
position = "0,0"; '
} ${pkgs.hyprland}/bin/hyprctl eval 'hl.dispatch(hl.dsp.focus({ monitor = "eDP-1" })); hl.dispatch(hl.dsp.focus({ workspace = "1" }));'
{
criteria = "LG Display 0x060A Unknown"; ''}"
position = "2560,0"; "${pkgs.awww}/bin/awww restore"
} (moveOrOpenBar 0)
];
};}
{profile = {
name = "laptop_2";
outputs = [
{
criteria = "AOC 16G3 1DDP7HA000348";
position = "0,0";
}
{
criteria = "LG Display 0x060A Unknown";
position = "1920,0";
}
]; ];
};} };}
]; ];
+90 -10
View File
@@ -1,4 +1,17 @@
{ lib, config, pkgs, ... }: { { lib, config, pkgs, ... }:
let
#Bookmark: javascript:(function(){window.location.href='mpv://'+encodeURIComponent(window.location.href);})();
mpvHandler = pkgs.writeShellScriptBin "mpv-handler" ''
#!/bin/bash
exec 2>> /tmp/mpv-handler-debug.log
set -x
RAW_URL="$1"
STRIPPED_URL="''${RAW_URL:6}"
URL=$(printf '%b' "''${STRIPPED_URL//%/\\x}")
exec ${config.programs.mpv.finalPackage}/bin/mpv "$URL"
'';
in
{
config = lib.mkIf (config.usercfg.wm == "Wayland") { config = lib.mkIf (config.usercfg.wm == "Wayland") {
home.packages = with pkgs; [ home.packages = with pkgs; [
@@ -14,17 +27,23 @@
glib glib
]; ];
xdg.desktopEntries."mpv-handler" = {
name = "MPV Scheme Handler";
exec = "${mpvHandler}/bin/mpv-handler %u";
terminal = false;
mimeType = [ "x-scheme-handler/mpv" ];
};
xdg.mimeApps = { xdg.mimeApps = {
enable = true; enable = true;
defaultApplications = { defaultApplications = {
"x-scheme-handler/discord-409416265891971072" = # --- System & Directories ---
[ "discord-409416265891971072.desktop" ]; "inode/directory" = [ "thunar.desktop" ];
"x-scheme-handler/discord-402572971681644545" = "x-scheme-handler/file" = [ "thunar.desktop" ];
[ "discord-402572971681644545.desktop" ];
"x-scheme-handler/discord-696343075731144724" = # --- Web & Browsing ---
[ "discord-696343075731144724.desktop" ]; "x-scheme-handler/unknown" = [ "firefox.desktop" ];
"x-scheme-handler/tg" = [ "org.telegram.desktop.desktop" ];
"x-scheme-handler/tonsite" = [ "org.telegram.desktop.desktop" ];
"x-scheme-handler/http" = [ "firefox.desktop" ]; "x-scheme-handler/http" = [ "firefox.desktop" ];
"x-scheme-handler/https" = [ "firefox.desktop" ]; "x-scheme-handler/https" = [ "firefox.desktop" ];
"x-scheme-handler/chrome" = [ "firefox.desktop" ]; "x-scheme-handler/chrome" = [ "firefox.desktop" ];
@@ -36,16 +55,77 @@
"application/x-extension-xhtml" = [ "firefox.desktop" ]; "application/x-extension-xhtml" = [ "firefox.desktop" ];
"application/x-extension-xht" = [ "firefox.desktop" ]; "application/x-extension-xht" = [ "firefox.desktop" ];
# --- Chat & Social Protocol Schemes ---
"x-scheme-handler/tg" = [ "org.telegram.desktop.desktop" ];
"x-scheme-handler/tonsite" = [ "org.telegram.desktop.desktop" ];
"x-scheme-handler/discord-409416265891971072" = [ "discord-409416265891971072.desktop" ];
"x-scheme-handler/discord-402572971681644545" = [ "discord-402572971681644545.desktop" ];
"x-scheme-handler/discord-696343075731144724" = [ "discord-696343075731144724.desktop" ];
# --- Documents & Source Code (VSCodium) ---
"application/pdf" = [ "org.pwmt.zathura-pdf-mupdf.desktop" ]; "application/pdf" = [ "org.pwmt.zathura-pdf-mupdf.desktop" ];
"text/plain" = [ "vscodium.desktop" ]; "text/plain" = [ "vscodium.desktop" ];
"text/markdown" = [ "vscodium.desktop" ];
"text/xml" = [ "vscodium.desktop" ];
"text/csv" = [ "vscodium.desktop" ];
"text/css" = [ "vscodium.desktop" ];
"application/xml" = [ "vscodium.desktop" ];
"application/json" = [ "vscodium.desktop" ];
"application/toml" = [ "vscodium.desktop" ];
"application/yaml" = [ "vscodium.desktop" ];
"application/javascript" = [ "vscodium.desktop" ];
"application/x-shellscript" = [ "vscodium.desktop" ];
# --- Video & Audio (MPV) ---
"x-scheme-handler/mpv" = [ "mpv-handler.desktop" ];
"video/mp4" = [ "mpv.desktop" ]; "video/mp4" = [ "mpv.desktop" ];
"video/mkv" = [ "mpv.desktop" ];
"video/webm" = [ "mpv.desktop" ];
"video/x-matroska" = [ "mpv.desktop" ];
"video/quicktime" = [ "mpv.desktop" ];
"video/x-msvideo" = [ "mpv.desktop" ];
"video/x-flv" = [ "mpv.desktop" ];
"video/3gpp" = [ "mpv.desktop" ];
"audio/mp3" = [ "mpv.desktop" ];
"audio/mpeg" = [ "mpv.desktop" ];
"audio/ogg" = [ "mpv.desktop" ];
"audio/wav" = [ "mpv.desktop" ];
"audio/x-wav" = [ "mpv.desktop" ];
"audio/flac" = [ "mpv.desktop" ];
"audio/x-flac" = [ "mpv.desktop" ];
"audio/mp4" = [ "mpv.desktop" ];
"audio/aac" = [ "mpv.desktop" ];
"audio/x-matroska-audio" = [ "mpv.desktop" ];
"audio/x-mpegurl" = [ "mpv.desktop" ];
"audio/mpegurl" = [ "mpv.desktop" ];
# --- Images (IMV) ---
"image/png" = [ "imv-dir.desktop" ]; "image/png" = [ "imv-dir.desktop" ];
"image/jpg" = [ "imv-dir.desktop" ]; "image/jpg" = [ "imv-dir.desktop" ];
"image/jpeg" = [ "imv-dir.desktop" ];
"image/webp" = [ "imv-dir.desktop" ];
"image/gif" = [ "imv-dir.desktop" ];
"image/svg+xml" = [ "imv-dir.desktop" ];
"image/x-canon-cr2" = [ "imv-dir.desktop" ];
"image/bmp" = [ "imv-dir.desktop" ];
"image/tiff" = [ "imv-dir.desktop" ];
"image/heic" = [ "imv-dir.desktop" ];
"image/avif" = [ "imv-dir.desktop" ];
# --- Archives (Engrampa) ---
"application/zip" = [ "engrampa.desktop" ];
"application/x-tar" = [ "engrampa.desktop" ];
"application/x-gzip" = [ "engrampa.desktop" ];
"application/x-bzip2" = [ "engrampa.desktop" ];
"application/x-7z-compressed" = [ "engrampa.desktop" ];
"application/x-rar" = [ "engrampa.desktop" ];
}; };
associations = { associations = {
removed = { "application/pdf" = [ "krita_pdf.desktop" ]; }; removed = {
"application/pdf" = [ "krita_pdf.desktop" ];
"application/zip" = [ "org.prismlauncher.PrismLauncher.desktop" ];
};
}; };
}; };
}; };
+1 -1
View File
@@ -24,13 +24,13 @@
startupScript = pkgs.writeShellScriptBin "hyprland-start" '' startupScript = pkgs.writeShellScriptBin "hyprland-start" ''
${pkgs.eww}/bin/eww open bar &
${pkgs.awww}/bin/awww-daemon & ${pkgs.awww}/bin/awww-daemon &
${pkgs.awww}/bin/awww restore & ${pkgs.awww}/bin/awww restore &
sleep 2 sleep 2
keepassxc & keepassxc &
firefox & firefox &
jellyfin-mpv-shim &
easyeffects --gapplication-service & easyeffects --gapplication-service &
sleep 2 sleep 2
-1
View File
@@ -109,7 +109,6 @@
telegram-desktop & telegram-desktop &
nextcloud & nextcloud &
jellyfin-mpv-shim &
#flameshot & #flameshot &
sleep 2 sleep 2
+1 -1
View File
@@ -1,5 +1,5 @@
{ config, lib, ... }: { { config, lib, ... }: {
imports = [ ./dbus ./fonts ./hw ./locale ./network ./nix ./security ./xdg ]; imports = [ ./dbus ./docs ./fonts ./hw ./locale ./network ./nix ./security ./xdg ];
services.journald.extraConfig = '' services.journald.extraConfig = ''
SystemMaxUse=512M SystemMaxUse=512M
+14
View File
@@ -0,0 +1,14 @@
{ config, lib, ... }:
let
cfg = config.syscfg.make;
withDocs = cfg.gui || cfg.develop || cfg.serverExtras;
in
{
documentation = lib.mkIf (!withDocs) {
enable = false;
man.enable = false;
info.enable = false;
doc.enable = false;
nixos.enable = false;
};
}
+2 -2
View File
@@ -1,6 +1,6 @@
{ pkgs, ... }: { { config, lib, pkgs, ... }: {
fonts = { fonts = lib.mkIf (config.syscfg.make.gui || config.syscfg.make.serverExtras) {
enableDefaultPackages = false; enableDefaultPackages = false;
fontDir.enable = true; fontDir.enable = true;
+3 -3
View File
@@ -1,5 +1,5 @@
{ lib, ... }: { { config, lib, ... }: {
services.fwupd.enable = true; services.fwupd.enable = lib.mkDefault (config.syscfg.make.gui || config.syscfg.make.power);
hardware.enableAllFirmware = false; hardware.enableAllFirmware = false;
services.power-profiles-daemon.enable = lib.mkDefault true; services.power-profiles-daemon.enable = lib.mkDefault config.syscfg.make.gui;
} }
+6 -3
View File
@@ -1,6 +1,9 @@
{ pkgs, ... }: { { config, lib, pkgs, ... }:
let
hasNfsFileSystems = lib.any (fs: fs.fsType == "nfs" || fs.fsType == "nfs4") (lib.attrValues config.fileSystems);
in {
services.fstrim.enable = true; # Improves SSD life services.fstrim.enable = true; # Improves SSD life
services.gvfs.enable = true; # User Mounted FS services.gvfs.enable = config.syscfg.make.gui; # User Mounted FS
environment.systemPackages = with pkgs; [ nfs-utils ]; environment.systemPackages = lib.optionals hasNfsFileSystems [ pkgs.nfs-utils ];
} }
+3 -3
View File
@@ -1,4 +1,4 @@
{ ... }: { { config, ... }: {
hardware.graphics.enable = true; hardware.graphics.enable = config.syscfg.make.gui || config.syscfg.make.serverExtras || config.syscfg.make.game;
hardware.graphics.enable32Bit = true; hardware.graphics.enable32Bit = config.syscfg.make.game;
} }
@@ -4,7 +4,6 @@
useDHCP = true; useDHCP = true;
nameservers = [ "1.1.1.1" "9.9.9.9" ]; nameservers = [ "1.1.1.1" "9.9.9.9" ];
dhcpcd = { dhcpcd = {
enable = true;
wait = "background"; wait = "background";
}; };
+5 -7
View File
@@ -1,14 +1,10 @@
{ inputs, pkgs, ... }: { { config, inputs, lib, pkgs, ... }: {
nixpkgs.config = { nixpkgs.config = {
permittedInsecurePackages = [ ]; permittedInsecurePackages = [ ];
allowUnfree = true; allowUnfree = true;
android_sdk.accept_license = true; android_sdk.accept_license = true;
packageOverrides = pkgs: rec {
custom = import ../../../../packages { inherit pkgs; };
}; };
nixpkgs.overlays = import ../../../../overlays { inherit inputs; };
};
nixpkgs.overlays = import ../../../../overlays { inherit inputs pkgs; };
nix = { nix = {
package = pkgs.nixVersions.stable; package = pkgs.nixVersions.stable;
extraOptions = '' extraOptions = ''
@@ -37,7 +33,9 @@
]; ];
}; };
}; };
programs.nix-ld = { programs.nix-ld = lib.mkIf (
config.syscfg.make.gui || config.syscfg.make.develop || config.syscfg.make.serverExtras
) {
enable = true; enable = true;
libraries = with pkgs; [ libraries = with pkgs; [
libx11 libxcb libxi libxext libxkbfile xcbutilcursor libx11 libxcb libxi libxext libxkbfile xcbutilcursor
@@ -1,4 +1,5 @@
{ pkgs, ... }: { { config, lib, pkgs, ... }: {
config = lib.mkIf config.syscfg.make.gui {
security.polkit.enable = true; security.polkit.enable = true;
security.pam.services.hyprlock = { #swaylock security.pam.services.hyprlock = { #swaylock
text = '' text = ''
@@ -6,5 +7,6 @@
''; '';
}; };
environment.systemPackages = with pkgs; [ polkit_gnome ]; environment.systemPackages = [ pkgs.polkit_gnome ];
};
} }
+1
View File
@@ -3,6 +3,7 @@
config = lib.mkIf (config.syscfg.make.develop) { config = lib.mkIf (config.syscfg.make.develop) {
programs.wireshark.enable = true; programs.wireshark.enable = true;
programs.dconf.enable = true;
environment.systemPackages = with pkgs; [ wget dconf wireshark mtr android-tools ]; environment.systemPackages = with pkgs; [ wget dconf wireshark mtr android-tools ];
}; };
+2 -1
View File
@@ -1,4 +1,5 @@
{ pkgs, ... }: { { config, lib, pkgs, ... }: {
imports = [ ./debug ./develop ./telegraf ]; imports = [ ./debug ./develop ./telegraf ];
environment.systemPackages = lib.optionals config.syscfg.make.gui [ pkgs.engrampa ];
} }
+55
View File
@@ -0,0 +1,55 @@
{ config, containerCfg, pkgs, lib, builder, name, ... }:
let
version = "latest";
serverCfg = config.syscfg.server;
in
{
runtime = {
paths = [
{
path = "${serverCfg.path.data.path}/drawio/";
owner = "root:root";
mode = "0777";
}
];
containers = {
server = builder.mkContainer {
subdomain = containerCfg.subdomain;
image = "jgraph/drawio:${version}";
port = 8080;
extraEnv = {
VIRTUAL_HOST = "${containerCfg.subdomain}.${serverCfg.domain}";
VIRTUAL_PORT = "8080";
LETS_ENCRYPT_ENABLED = "false";
DRAWIO_SERVER_URL = "https://${containerCfg.subdomain}.${serverCfg.domain}";
DRAWIO_SELF_CONTAINED = "1";
EXPORT_URL = "http://drawio-exporter:8000/";
DRAWIO_CONFIG = ''
{
"defaultFonts": [
"Helvetica", "Arial", "Verdana",
"IBM Plex Mono",
"IBM Plex Sans",
"Noto Sans",
"Latin Modern Math"
]
}
'';
};
overrides = {
ports = ["8080:8080"];
};
};
exporter = builder.mkContainer {
image = "jgraph/export-server:${version}";
extraEnv = {
DRAWIO_SERVER_URL = "https://${containerCfg.subdomain}.${serverCfg.domain}";
};
overrides = {
volumes = ["/run/current-system/sw/share/X11/fonts:/usr/share/fonts/drawio:ro" "/nix/store:/nix/store:ro"];
};
};
};
};
}
@@ -0,0 +1,35 @@
{ config, containerCfg, pkgs, lib, builder, name,... }:
let
version = "latest";
serverCfg = config.syscfg.server;
in {
runtime = {
paths = [{
path="${serverCfg.path.data.path}/excalidraw/";
owner = "root:root";
mode = "0777";
}];
containers = {
server = builder.mkContainer {
subdomain = containerCfg.subdomain;
image = "excalidraw/excalidraw:${version}";
port = 80;
tmpfs = true;
# secret = name;
extraEnv = {
NODE_ENV="production";
VITE_APP_WS_SERVER_URL="${containerCfg.subdomain}.${serverCfg.domain}";
};
extraLabels = {
};
overrides = {
volumes = [
"${serverCfg.path.data.path}/excalidraw:/app/data"
];
};
};
};
};
}
@@ -111,6 +111,11 @@ in {
GF_LIVE_HA_ENGINE_ADRESS = "${builder.host}:6379"; GF_LIVE_HA_ENGINE_ADRESS = "${builder.host}:6379";
DEFAULT_INFLUX_SERVER = "http://${builder.host}:8181"; DEFAULT_INFLUX_SERVER = "http://${builder.host}:8181";
}; };
extraLabels = {
"traefik.http.routers.grafana-pub.rule" = "Host(`${containerCfg.subdomain}.${serverCfg.domain}`) && PathPrefix(`/public-dashboards`)";
"traefik.http.routers.grafana-pub.entrypoints" = "web-secure";
"traefik.http.routers.grafana-pub.tls" = "true";
};
overrides = { overrides = {
user = "1500:1500"; user = "1500:1500";
environmentFiles = [ config.sops.secrets."INFLUX".path config.sops.secrets."CUSTOM".path ] ; environmentFiles = [ config.sops.secrets."INFLUX".path config.sops.secrets."CUSTOM".path ] ;
@@ -0,0 +1,2 @@
{ name, ... }:
throw "Container app `${name}` is not implemented yet."
@@ -0,0 +1,52 @@
{ containerCfg, pkgs, builder, name, ... }:
let
port = 8080;
priority = toString (containerCfg.extra.priority or 2147482647);
defaultRobots = ''
User-agent: *
Disallow: /
'';
robots =
if containerCfg.extra ? robots then
containerCfg.extra.robots
else
defaultRobots + (containerCfg.extra.extraRobots or "");
robotsRoot = pkgs.writeTextDir "robots.txt" robots;
image = pkgs.dockerTools.streamLayeredImage {
name = "robots";
tag = "1";
contents = [
robotsRoot
pkgs.busybox
];
config = {
Entrypoint = [
"${pkgs.busybox}/bin/httpd"
"-f"
"-p"
"0.0.0.0:${toString port}"
"-h"
"${robotsRoot}"
];
ExposedPorts = { "${toString port}/tcp" = { }; };
WorkingDir = "/";
};
};
in {
runtime = {
containers = {
server = builder.mkContainer {
imageStream = image;
port = port;
extraLabels = {
"traefik.enable" = "true";
"traefik.http.routers.${name}.entrypoints" = "web-secure";
"traefik.http.routers.${name}.rule" = "Path(`/robots.txt`)";
"traefik.http.routers.${name}.priority" = priority;
"traefik.http.routers.${name}.tls" = "true";
"traefik.http.services.${name}.loadbalancer.server.port" = toString port;
};
};
};
};
}
+2 -3
View File
@@ -1,3 +1,2 @@
{...}:{ { name, ... }:
throw "Container app `${name}` is not implemented yet."
}
+4 -2
View File
@@ -37,7 +37,9 @@ let
environment = { environment = {
TZ = config.time.timeZone; TZ = config.time.timeZone;
} // extraEnv; } // extraEnv;
autoRemoveOnStop = false;
autoStart = true;
pull = "newer";
labels = (if subdomain!=null then ({ labels = (if subdomain!=null then ({
"traefik.enable" = "true"; "traefik.enable" = "true";
"traefik.http.routers.${routerName}.entrypoints" = "web-secure"; "traefik.http.routers.${routerName}.entrypoints" = "web-secure";
@@ -61,7 +63,7 @@ let
}; };
in lib.recursiveUpdate base overrides; in lib.recursiveUpdate base overrides;
vmBuilder = { name, vm }: ((import "${pkgs.path}/nixos/lib/eval-config.nix" { vmBuilder = { name, vm }: ((import "${pkgs.path}/nixos/lib/eval-config.nix" {
system = "x86_64-linux"; system = pkgs.stdenv.hostPlatform.system;
modules = [ vm.cfg modules = [ vm.cfg
({ config, lib, modulesPath, ... }: { ({ config, lib, modulesPath, ... }: {
imports = [ imports = [
+6 -3
View File
@@ -16,7 +16,9 @@ let
basePathConfigs = basePathConfigs =
lib.mapAttrsToList (_: cfg: cfg) (lib.filterAttrs (name: _: name != "config" && name != "data") serverCfg.path); lib.mapAttrsToList (_: cfg: cfg) (lib.filterAttrs (name: _: name != "config" && name != "data") serverCfg.path);
runtimePathConfigs = concatRuntimeLists "paths"; runtimePathConfigs = concatRuntimeLists "paths";
allSetupConfigs = map (app: ({ name = app.name; envFile = ""; } // app.runtime.setup)) appsList; allSetupConfigs = builtins.filter
(setup: setup.script != null)
(map (app: ({ name = app.name; envFile = [ ]; } // app.runtime.setup)) appsList);
allCronsConfigs = concatRuntimeLists "cron"; allCronsConfigs = concatRuntimeLists "cron";
allVMConfigs = builtins.filter (app: app.runtime.vm != null) appsList; allVMConfigs = builtins.filter (app: app.runtime.vm != null) appsList;
mkPathSetup = cfg: mkPathSetup = cfg:
@@ -88,7 +90,7 @@ in {
value = { value = {
description = "Run ${e.name} setup"; description = "Run ${e.name} setup";
after = [ "podman-${e.name}-${e.trigger}.service" ]; after = [ "podman-${e.name}-${e.trigger}.service" ];
wants = [ "podman-${e.name}-${e.trigger}.service" ]; # wants = [ "podman-${e.name}-${e.trigger}.service" ];
partOf = [ "podman-${e.name}-${e.trigger}.service" ]; partOf = [ "podman-${e.name}-${e.trigger}.service" ];
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
restartTriggers = [ e.script ]; restartTriggers = [ e.script ];
@@ -96,7 +98,8 @@ in {
Type = "simple"; Type = "simple";
Restart = "on-failure"; Restart = "on-failure";
RestartSec = "15s"; RestartSec = "15s";
TimeoutStartSec = "360s"; # TimeoutStartSec = "360s";
TimeoutStartSec = "30s";
EnvironmentFile = e.envFile; EnvironmentFile = e.envFile;
ExecStart = e.script; ExecStart = e.script;
RemainAfterExit = true; RemainAfterExit = true;
+3
View File
@@ -3,7 +3,9 @@ let
listNames = config.syscfg.server.db; listNames = config.syscfg.server.db;
containerNames = lib.concatMap (app: app.requires.secrets) (builtins.attrValues config.syscfg.server.loadedContainers); containerNames = lib.concatMap (app: app.requires.secrets) (builtins.attrValues config.syscfg.server.loadedContainers);
allApps = lib.unique (listNames ++ containerNames); allApps = lib.unique (listNames ++ containerNames);
needsServerSops = config.syscfg.server.loadedContainers != {} || allApps != [];
in{ in{
config = lib.mkIf needsServerSops {
sops.secrets = { sops.secrets = {
CUSTOM = { CUSTOM = {
mode = "0444"; mode = "0444";
@@ -13,4 +15,5 @@ in{
mode = "0444"; mode = "0444";
sopsFile = ./server.yaml; sopsFile = ./server.yaml;
})); }));
};
} }
+5 -3
View File
@@ -1,6 +1,8 @@
{ config, lib, pkgs, ... }: { config, lib, pkgs, ... }:
let let
isCI = builtins.elem config.syscfg.hostname [ "ci" "sandbox" ]; isCI = builtins.elem config.syscfg.hostname [ "ci" "sandbox" ];
defaultUser = config.users.users.${config.syscfg.defaultUser} or { };
defaultGroup = if pkgs.stdenv.isDarwin then "staff" else "users";
keyFilePath = (if isCI then keyFilePath = (if isCI then
"/var/lib/sops-nix/mock-key.txt" "/var/lib/sops-nix/mock-key.txt"
else else
@@ -8,7 +10,7 @@ let
sopsFilePath = (if isCI then ./mock.yaml else ./common.yaml); sopsFilePath = (if isCI then ./mock.yaml else ./common.yaml);
in { in {
environment.systemPackages = with pkgs; [ sops ]; environment.systemPackages = with pkgs; [ sops ];
environment.sessionVariables.SOPS_AGE_KEY_FILE = keyFilePath; environment.variables.SOPS_AGE_KEY_FILE = keyFilePath;
sops.defaultSopsFile = sopsFilePath; sops.defaultSopsFile = sopsFilePath;
sops.age.keyFile = keyFilePath; sops.age.keyFile = keyFilePath;
@@ -19,8 +21,8 @@ in {
{ {
"${config.syscfg.hostname}_ssh_priv" = { "${config.syscfg.hostname}_ssh_priv" = {
mode = "0400"; mode = "0400";
owner = config.users.users.${config.syscfg.defaultUser}.name; owner = defaultUser.name or config.syscfg.defaultUser;
group = config.users.users.${config.syscfg.defaultUser}.group; group = defaultUser.group or defaultGroup;
}; };
} }
(lib.mkIf config.syscfg.net.wlp.enable { (lib.mkIf config.syscfg.net.wlp.enable {
+15 -6
View File
@@ -1,11 +1,15 @@
{ inputs, lib, ... }: { lib, ... }:
let let
systemsDir = ../../../systems; systemsDir = ../../../systems;
systemNames = lib.attrNames (lib.filterAttrs isIgnoredSystemDir = name: lib.hasPrefix "_" name || lib.hasPrefix "." name;
(name: type: type == "directory" && builtins.pathExists (systemsDir + "/${name}/cfg.nix")) systemNames = lib.attrNames (
(builtins.readDir systemsDir)); lib.filterAttrs
(name: type:
type == "directory"
&& !isIgnoredSystemDir name
&& builtins.pathExists (systemsDir + "/${name}/cfg.nix"))
(builtins.readDir systemsDir)
);
in with lib; { in with lib; {
options.usercfg = import ./user.nix {inherit lib;}; options.usercfg = import ./user.nix {inherit lib;};
options.syscfg = { options.syscfg = {
@@ -14,6 +18,11 @@ in with lib; {
type = types.enum [ "nixos" "macos" "home" ]; type = types.enum [ "nixos" "macos" "home" ];
default = "nixos"; default = "nixos";
}; };
system = mkOption {
type = types.enum [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
default = "x86_64-linux";
description = "Nix platform used to evaluate this host.";
};
defaultUser = mkOption { type = types.str; }; defaultUser = mkOption { type = types.str; };
make = import ./make.nix {inherit lib;}; make = import ./make.nix {inherit lib;};
net = import ./net.nix {inherit lib;}; net = import ./net.nix {inherit lib;};
+1 -1
View File
@@ -6,6 +6,6 @@ with lib; {
domain = mkOption { type = types.str; default = ""; }; domain = mkOption { type = types.str; default = ""; };
port = mkOption { type = types.str; default = ""; }; port = mkOption { type = types.str; default = ""; };
noProxy = mkOption { type = types.str; default = ""; }; noProxy = mkOption { type = types.str; default = ""; };
cert = mkOption { type = types.path; default = null; }; cert = mkOption { type = types.nullOr types.path; default = null; };
}; };
} }
+1
View File
@@ -2,6 +2,7 @@
with lib; { with lib; {
cli = mkOption { type = types.bool; default = true; }; cli = mkOption { type = types.bool; default = true; };
gui = mkOption { type = types.bool; default = false; }; gui = mkOption { type = types.bool; default = false; };
serverExtras = mkOption { type = types.bool; default = false; };
virt = mkOption { type = types.bool; default = false; }; virt = mkOption { type = types.bool; default = false; };
power = mkOption { type = types.bool; default = false; }; power = mkOption { type = types.bool; default = false; };
game = mkOption { type = types.bool; default = false; }; game = mkOption { type = types.bool; default = false; };
+2 -3
View File
@@ -1,15 +1,14 @@
{ inputs, pkgs, ... }: { inputs, ... }:
[ [
(final: prev: { (final: prev: {
#openttd-jgrpp = import ./openttd-jgrpp { inherit final prev; }; #openttd-jgrpp = import ./openttd-jgrpp { inherit final prev; };
#yarn-berry = import ./yarn-berry { inherit final prev; }; #yarn-berry = import ./yarn-berry { inherit final prev; };
#eww = import ./eww { inherit final prev; }; #eww = import ./eww { inherit final prev; };
# ags = import ./ags { inherit final prev; }; # ags = import ./ags { inherit final prev; };
custom = import ../packages { pkgs = final; };
wine = final.unstable.wineWow64Packages.unstableFull; wine = final.unstable.wineWow64Packages.unstableFull;
unstable = import inputs.nixUnstable { unstable = import inputs.nixUnstable {
system = final.stdenv.hostPlatform.system; system = final.stdenv.hostPlatform.system;
stdenv.hostPlatform.system = final.stdenv.hostPlatform.system;
config.allowUnfree = true; config.allowUnfree = true;
}; };
}) })
+2 -9
View File
@@ -1,15 +1,8 @@
{ pkgs, ... }: { { pkgs, ... }:
{
amdgpu_top = pkgs.callPackage ./amdgpu_top { }; amdgpu_top = pkgs.callPackage ./amdgpu_top { };
simc = pkgs.qt6.callPackage ./simc { }; simc = pkgs.qt6.callPackage ./simc { };
repalette = pkgs.callPackage ./repalette { }; repalette = pkgs.callPackage ./repalette { };
vosk = pkgs.callPackage ./vosk { }; vosk = pkgs.callPackage ./vosk { };
pythonPackages = {
};
nodePackages = {
};
} }
+6 -10
View File
@@ -1,13 +1,9 @@
{ inputs, ... }: { inputs, mkPkgs, systems, ... }:
let inputs.nixpkgs.lib.genAttrs systems (
forEachSystem = system:
inputs.nixpkgs.lib.genAttrs [ "aarch64-linux" "x86_64-linux" ]; let pkgs = mkPkgs system;
in forEachSystem (system:
let
overlays = import ../overlays { inherit inputs pkgs; };
overrides = { custom = import ../packages { inherit pkgs; }; };
pkgs = import inputs.nixpkgs { inherit system overlays; } // overrides;
in { in {
default = import ./devsh { inherit pkgs; }; default = import ./devsh { inherit pkgs; };
devsh = import ./devsh { inherit pkgs; }; devsh = import ./devsh { inherit pkgs; };
}) }
)
+1
View File
@@ -3,5 +3,6 @@
hostname = "asgard"; hostname = "asgard";
defaultUser = "sora"; defaultUser = "sora";
type = "macos"; type = "macos";
system = "x86_64-darwin";
}; };
} }
+7 -5
View File
@@ -12,8 +12,7 @@
}; };
fonts = { fonts = {
fontDir.enable = true; packages = with pkgs; [ ibm-plex openmoji-color material-design-icons ];
fonts = with pkgs; [ ibm-plex openmoji-color material-design-icons ];
}; };
environment = { environment = {
@@ -33,8 +32,6 @@
programs = { zsh.enable = true; }; programs = { zsh.enable = true; };
services = { nix-daemon.enable = true; };
homebrew = { homebrew = {
enable = true; enable = true;
onActivation = { onActivation = {
@@ -54,7 +51,11 @@
''; '';
gc = { gc = {
automatic = true; automatic = true;
dates = "weekly"; interval = {
Weekday = 0;
Hour = 3;
Minute = 0;
};
options = "--delete-older-than 7d"; options = "--delete-older-than 7d";
}; };
settings = { settings = {
@@ -67,6 +68,7 @@
}; };
system = { system = {
primaryUser = "sora";
defaults = { defaults = {
NSGlobalDomain = { NSGlobalDomain = {
KeyRepeat = 1; KeyRepeat = 1;
+5
View File
@@ -17,4 +17,9 @@
10.10.1.2 avalon.helcel.net 10.10.1.2 avalon.helcel.net
''; '';
swapDevices = [ {
device = "/swapfile";
size = 2 * 1024; # Size in megabytes (4 GB)
} ];
} }
+2
View File
@@ -5,10 +5,12 @@
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
boot.loader.systemd-boot.enable = lib.mkForce false; boot.loader.systemd-boot.enable = lib.mkForce false;
boot.loader.efi.canTouchEfiVariables = lib.mkForce false;
boot.loader.grub = { boot.loader.grub = {
enable = true; enable = true;
device = "/dev/sda"; device = "/dev/sda";
efiSupport = true; efiSupport = true;
efiInstallAsRemovable = true;
}; };
boot.initrd.availableKernelModules = boot.initrd.availableKernelModules =
+6 -3
View File
@@ -32,6 +32,7 @@
# ===== BASE ===== # ===== BASE =====
traefik.subdomain = "traefik"; traefik.subdomain = "traefik";
traefik.extra={provider="infomaniak";}; traefik.extra={provider="infomaniak";};
robotstxt.extra = {};
umami.subdomain = "umami"; umami.subdomain = "umami";
authentik.subdomain = "sso"; authentik.subdomain = "sso";
searxng.subdomain = "searx"; searxng.subdomain = "searx";
@@ -42,14 +43,19 @@
collabora.subdomain = "office"; collabora.subdomain = "office";
etherpad.subdomain = "pad"; etherpad.subdomain = "pad";
# ethercalc.subdomain = "calc"; # ethercalc.subdomain = "calc";
drawio.subdomain = "draw";
immich.subdomain = "pic"; immich.subdomain = "pic";
# ===== FLIX ===== # ===== FLIX =====
# invidious.subdomain = "yt"; # invidious.subdomain = "yt";
# jellyfin.subdomain = "flix"; # jellyfin.subdomain = "flix";
# suwayomi.subdomain = "manga";
# calibre.subdomain = "books";
# ===== ARR =====
# servarr.subdomain = "arr"; # servarr.subdomain = "arr";
# servarr.extra.modules = ["prowlarr" "sonarr" "radarr" "flaresolverr" ]; # servarr.extra.modules = ["prowlarr" "sonarr" "radarr" "flaresolverr" ];
# transmission = { subdomain = "arr"; subpath = "transmission"; }; # transmission = { subdomain = "arr"; subpath = "transmission"; };
# handbrake = { subdomain = "arr"; subpath = "hb"; }; # handbrake = { subdomain = "arr"; subpath = "hb"; };
# selfmark = { subdomain = "arr"; subpath = "selfmark"; };
# ===== DEV ===== # ===== DEV =====
gitea.subdomain = "git"; gitea.subdomain = "git";
# ===== HOME ===== # ===== HOME =====
@@ -58,9 +64,6 @@
influx.subdomain = "metrum"; influx.subdomain = "metrum";
freshrss.subdomain = "rss"; freshrss.subdomain = "rss";
suwayomi.subdomain = "manga";
calibre.subdomain = "books";
selfmark = { subdomain = "arr"; subpath = "selfmark"; };
favicon.extra = { favicon.extra = {
mappings = { mappings = {