Compare commits

..

No commits in common. "master" and "hyprland" have entirely different histories.

27 changed files with 350 additions and 476 deletions

View File

@ -10,11 +10,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1775689345, "lastModified": 1764289441,
"narHash": "sha256-tM3s7CX+tgxlYW0Sk3nzVThg2MHn08foIuMxABupxIs=", "narHash": "sha256-ak+lgFiYE5PHByN1/BRkO5JP498hno6Ix24C1Qf/vec=",
"owner": "aylur", "owner": "aylur",
"repo": "ags", "repo": "ags",
"rev": "bbee2f18939f1ec7ff720e717cf305e73635628f", "rev": "e169694390548dfd38ff40f1ef2163d6c3ffe3ea",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -30,11 +30,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1777578913, "lastModified": 1769774308,
"narHash": "sha256-2Hzr8T4oUtw2q0ZYxrgDB8kvy85QawlhpiQDk4eGOHQ=", "narHash": "sha256-8Ve6VdUpcYbl8bS5oyDwVnnNobyPxdPmUHGgSDyOazQ=",
"owner": "aylur", "owner": "aylur",
"repo": "astal", "repo": "astal",
"rev": "67ddc83e0bdbda6de7f6f15e4fbc5d6b9d2d1b18", "rev": "eb235f8813bdea2a4a38ac228f2efc4e2a8a90af",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -132,11 +132,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1778144356, "lastModified": 1773093840,
"narHash": "sha256-dGM+QCstz/DyLB68+JK5GWyMx4QSqmOJEVgZmy63d/g=", "narHash": "sha256-u/96NoAyN8BSRuM3ZimGf7vyYgXa3pLx4MYWjokuoH4=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "e4419d3123b780d5f4c0bceeace450424387638c", "rev": "bb014746edb2a98d975abde4dd40fa240de4cf86",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -184,11 +184,11 @@
}, },
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1777954456, "lastModified": 1772963539,
"narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=", "narHash": "sha256-9jVDGZnvCckTGdYT53d/EfznygLskyLQXYwJLKMPsZs=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1", "rev": "9dcb002ca1690658be4a04645215baea8b95f31d",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -200,11 +200,11 @@
}, },
"nixpkgs_3": { "nixpkgs_3": {
"locked": { "locked": {
"lastModified": 1777954456, "lastModified": 1772963539,
"narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=", "narHash": "sha256-9jVDGZnvCckTGdYT53d/EfznygLskyLQXYwJLKMPsZs=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1", "rev": "9dcb002ca1690658be4a04645215baea8b95f31d",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -215,6 +215,22 @@
} }
}, },
"nixpkgs_4": { "nixpkgs_4": {
"locked": {
"lastModified": 1772542754,
"narHash": "sha256-WGV2hy+VIeQsYXpsLjdr4GvHv5eECMISX1zKLTedhdg=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "8c809a146a140c5c8806f13399592dbcb1bb5dc4",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_5": {
"locked": { "locked": {
"lastModified": 1730200266, "lastModified": 1730200266,
"narHash": "sha256-l253w0XMT8nWHGXuXqyiIC/bMvh1VRszGXgdpQlfhvU=", "narHash": "sha256-l253w0XMT8nWHGXuXqyiIC/bMvh1VRszGXgdpQlfhvU=",
@ -236,11 +252,11 @@
"nixpkgs": "nixpkgs_3" "nixpkgs": "nixpkgs_3"
}, },
"locked": { "locked": {
"lastModified": 1778165192, "lastModified": 1773125003,
"narHash": "sha256-RgflEUfqht5XBXXFqt/XmC7/wUQgrYw+D34pYWCtCBw=", "narHash": "sha256-EF89LT3zxm8dM2pgoAohUcdQoTVVv1v02Jq+z6j8u+0=",
"owner": "nix-community", "owner": "nix-community",
"repo": "NUR", "repo": "NUR",
"rev": "25abd5cb8f57397fa34d49eddcd8d0b23e19efc0", "rev": "eb59c1e77102b9f836cdea9f12568f191a9aff57",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -258,13 +274,48 @@
"nixos-06cb-009a-fingerprint-sensor": "nixos-06cb-009a-fingerprint-sensor", "nixos-06cb-009a-fingerprint-sensor": "nixos-06cb-009a-fingerprint-sensor",
"nixpkgs": "nixpkgs_2", "nixpkgs": "nixpkgs_2",
"nur": "nur", "nur": "nur",
"vicinae": "vicinae",
"worktimer": "worktimer" "worktimer": "worktimer"
} }
}, },
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"vicinae": {
"inputs": {
"nixpkgs": "nixpkgs_4",
"systems": "systems"
},
"locked": {
"lastModified": 1773099334,
"narHash": "sha256-ciiNQFZ2m2JOEDDg9ZZxOuxykl4Aw/2C1EQsOcq+F+E=",
"owner": "vicinaehq",
"repo": "vicinae",
"rev": "2a427670116461a4ce0207db2c089aee9f40428e",
"type": "github"
},
"original": {
"owner": "vicinaehq",
"repo": "vicinae",
"type": "github"
}
},
"worktimer": { "worktimer": {
"inputs": { "inputs": {
"flake-parts": "flake-parts_3", "flake-parts": "flake-parts_3",
"nixpkgs": "nixpkgs_4" "nixpkgs": "nixpkgs_5"
}, },
"locked": { "locked": {
"lastModified": 1739738223, "lastModified": 1739738223,

View File

@ -7,6 +7,7 @@
}; };
nur.url = "github:nix-community/NUR"; nur.url = "github:nix-community/NUR";
fzgo.url = "git+https://git.thomasave.be/thomasave/fzgo.git"; fzgo.url = "git+https://git.thomasave.be/thomasave/fzgo.git";
vicinae.url = "github:vicinaehq/vicinae";
worktimer = { worktimer = {
type = "git"; type = "git";
url = "https://git.thomasave.be/thomasave/WorkTimer"; url = "https://git.thomasave.be/thomasave/WorkTimer";
@ -37,6 +38,8 @@
} @ inputs: let } @ inputs: let
supportedSystems = ["x86_64-linux" "aarch64-linux"]; supportedSystems = ["x86_64-linux" "aarch64-linux"];
forAllSystems = nixpkgs.lib.genAttrs supportedSystems; forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
system = builtins.currentSystem;
pkgs = nixpkgs.legacyPackages.${system};
commonModules = host: user: [ commonModules = host: user: [
./hosts/${host}/hardware-configuration.nix ./hosts/${host}/hardware-configuration.nix
{ {
@ -45,17 +48,19 @@
(self: super: {utillinux = super.util-linux;}) (self: super: {utillinux = super.util-linux;})
]; ];
} }
({pkgs, ...}: { {
networking.hostName = host; networking.hostName = host;
time.timeZone = "Asia/Bangkok"; time.timeZone = "Asia/Bangkok";
nix.settings = { nix.settings = {
substituters = [ substituters = [
"https://nix-community.cachix.org" "https://nix-community.cachix.org"
"https://cuda-maintainers.cachix.org" "https://cuda-maintainers.cachix.org"
"https://vicinae.cachix.org"
]; ];
trusted-public-keys = [ trusted-public-keys = [
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
"cuda-maintainers.cachix.org-1:0dq3bujKpuEPMCX6U4WylrUDZ9JyUG0VpVZa7CNfq5E=" "cuda-maintainers.cachix.org-1:0dq3bujKpuEPMCX6U4WylrUDZ9JyUG0VpVZa7CNfq5E="
"vicinae.cachix.org-1:1kDrfienkGHPYbkpNj1mWTr7Fm1+zcenzgTizIcI3oc="
]; ];
experimental-features = ["nix-command" "flakes"]; experimental-features = ["nix-command" "flakes"];
trusted-users = ["root" user]; trusted-users = ["root" user];
@ -65,7 +70,7 @@
}; };
users.users.${user} = { users.users.${user} = {
isNormalUser = true; isNormalUser = true;
extraGroups = ["wheel" "video"]; # Enable 'sudo' for the user. extraGroups = ["wheel" "video"]; # Enable sudo for the user.
openssh.authorizedKeys.keys = [ openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKAa3tMzSCRuprEACrBsKI0F/o73o6J9L1qR3TaZn/N8 user@Kell" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKAa3tMzSCRuprEACrBsKI0F/o73o6J9L1qR3TaZn/N8 user@Kell"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIByLwLAdJbmoDV5sx4hg5NbzKbOh1GmWEhDOUJ1GQBhK user@Riva" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIByLwLAdJbmoDV5sx4hg5NbzKbOh1GmWEhDOUJ1GQBhK user@Riva"
@ -80,7 +85,7 @@
shell = pkgs.zsh; shell = pkgs.zsh;
}; };
system.stateVersion = "23.11"; system.stateVersion = "23.11";
}) }
home-manager.nixosModules.home-manager home-manager.nixosModules.home-manager
{ {
home-manager = { home-manager = {

View File

@ -15,10 +15,7 @@
}; };
in { in {
imports = [ imports = [
(import ./utils/desktop.nix { (import ./utils/desktop.nix {inherit inputs config pkgs;})
inherit inputs config pkgs;
scale = 1.2;
})
(import ./utils/fzgo_links.nix {inherit config pkgs fzgo_paths;}) (import ./utils/fzgo_links.nix {inherit config pkgs fzgo_paths;})
]; ];
@ -28,7 +25,6 @@ in {
jetbrains.pycharm jetbrains.pycharm
rclone rclone
opencode opencode
claude-code
# zed-editor # zed-editor
uv uv
google-cloud-sdk google-cloud-sdk
@ -39,14 +35,26 @@ in {
vscode vscode
texliveFull texliveFull
gnome-power-manager gnome-power-manager
discord
smile smile
podman-compose podman-compose
vesktop
]; ];
wayland.windowManager.hyprland.settings = {
monitor = [
"eDP-1,2880x1800@120.00Hz,480x0,1.2,vrr,1"
"HDMI-A-1,3840x2160@60.00Hz,0x-2160,1"
"DP-3,1920x1080,3840x-540,1"
"DP-1,1920x1080,3840x-540,1"
];
bind = [
", XF86PowerOff, exec, ${pkgs.rofi}/bin/rofi -show power-menu -modi power-menu:${
./hyprland/files/rofi-power-menu.sh
}"
];
general.gaps_out = 1;
};
programs.alacritty.settings.font.size = 13; programs.alacritty.settings.font.size = 13;
programs.kitty.font.size = 13; programs.kitty.font.size = 13;
systemd.user.services.vicinae.Service.Environment = [
"QT_SCALE_FACTOR=1.5"
];
} }

View File

@ -15,20 +15,13 @@
}; };
in { in {
imports = [ imports = [
(import ./utils/desktop.nix { (import ./utils/desktop.nix {inherit inputs config pkgs;})
inherit inputs config pkgs;
scale = 1.0;
})
(import ./utils/fzgo_links.nix {inherit config pkgs fzgo_paths;}) (import ./utils/fzgo_links.nix {inherit config pkgs fzgo_paths;})
]; ];
programs.ssh.matchBlocks."*".identityFile = "/home/user/.secrets/SSH/Arendia/id_ed25519"; programs.ssh.matchBlocks."*".identityFile = "/home/user/.secrets/SSH/Arendia/id_ed25519";
home.packages = with pkgs; [ home.packages = with pkgs; [
rclone
uv
claude-code
awscli2
distrobox distrobox
gnome-disk-utility gnome-disk-utility
moonlight-qt moonlight-qt
@ -36,15 +29,33 @@ in {
texliveFull texliveFull
gnome-power-manager gnome-power-manager
# jetbrains.pycharm-professional # jetbrains.pycharm-professional
discord
smile smile
podman-compose
vesktop
]; ];
services.hyprpaper = {
settings = {
wallpaper = [
"HDMI-A-1,${./hyprland/files/wallpaper.png}"
"eDP-1,${./hyprland/files/wallpaper.png}"
];
};
};
wayland.windowManager.hyprland.settings = {
monitor = [
"eDP-1,2560x1440@60.01,0x0,1"
"HDMI-A-1,1920x1080@60,0x-1080,1"
];
bind = [
", XF86PowerOff, exec, ${pkgs.rofi}/bin/rofi -show power-menu -modi power-menu:${
./hyprland/files/rofi-power-menu.sh
}"
];
general.gaps_out = 1;
};
programs.alacritty.settings.font.size = 13; programs.alacritty.settings.font.size = 13;
programs.kitty.font.size = 15; programs.kitty.font.size = 15;
programs.foot.settings.main.font = pkgs.lib.mkForce "DejaVu Sans Mono:size=15"; programs.foot.settings.main.font = pkgs.lib.mkForce "DejaVu Sans Mono:size=15";
systemd.user.services.vicinae.Service.Environment = [
"QT_SCALE_FACTOR=1.2"
];
} }

View File

@ -36,8 +36,18 @@ in {
moonlight-qt moonlight-qt
vscode vscode
jetbrains.rider jetbrains.rider
discord
]; ];
services.hyprpaper = {
settings = {
wallpaper = [
"DP-1,${./hyprland/files/wallpaper.png}"
"DP-2,${./hyprland/files/wallpaper.png}"
"HDMI-A-1,${./hyprland/files/wallpaper.png}"
];
};
};
wayland.windowManager.hyprland.settings = { wayland.windowManager.hyprland.settings = {
monitor = [ monitor = [
"DP-2,preferred,0x550,1" "DP-2,preferred,0x550,1"

View File

@ -30,6 +30,13 @@ in {
jq jq
rclone rclone
]; ];
services.hyprpaper = {
settings = {
wallpaper = [
"Virtual-1,${./hyprland/files/wallpaper.png}"
];
};
};
wayland.windowManager.hyprland.settings = { wayland.windowManager.hyprland.settings = {
monitor = [ monitor = [
"Virtual-1,2560x1440,0x0,1" "Virtual-1,2560x1440,0x0,1"

View File

@ -2,9 +2,9 @@ import { Astal, Gdk, Gtk } from "ags/gtk4";
import app from "ags/gtk4/app"; import app from "ags/gtk4/app";
import { createBinding, createState, For, With, Accessor } from "ags"; import { createBinding, createState, For, With, Accessor } from "ags";
import { createPoll } from "ags/time"; import { createPoll } from "ags/time";
import { subprocess, execAsync } from "ags/process";
import Pango from "gi://Pango";
import Tray from "gi://AstalTray"; import Tray from "gi://AstalTray";
import { execAsync } from "ags/process";
import Hyprland from "gi://AstalHyprland";
import { getIconName } from "./utils"; import { getIconName } from "./utils";
import Wp from "gi://AstalWp"; import Wp from "gi://AstalWp";
import Battery from "gi://AstalBattery"; import Battery from "gi://AstalBattery";
@ -16,36 +16,6 @@ const sensorsAvailable = await execAsync(["sensors"])
.catch(() => false); .catch(() => false);
const wirePlumber = Wp.get_default(); const wirePlumber = Wp.get_default();
// --- NIRI IPC INTEGRATION ---
const [workspaces, setWorkspaces] = createState<any[]>([]);
const [windows, setWindows] = createState<any[]>([]);
async function updateNiriState() {
try {
const wsOut = await execAsync(["niri", "msg", "-j", "workspaces"]);
setWorkspaces(JSON.parse(wsOut) || []);
const winOut = await execAsync(["niri", "msg", "-j", "windows"]);
setWindows(JSON.parse(winOut) || []);
} catch (e) {
console.error("Failed to fetch Niri state:", e);
}
}
// Initialize state immediately
updateNiriState();
// Subscribe to Niri's native event stream
subprocess(
["niri", "msg", "-j", "event-stream"],
(line) => {
// A state change happened in Niri. Re-fetching guarantees perfect sync
updateNiriState();
},
(err) => console.error("Niri event stream error:", err)
);
// ----------------------------
function SysTray(): JSX.Element { function SysTray(): JSX.Element {
const tray = Tray.get_default(); const tray = Tray.get_default();
let items = createBinding(tray, "items"); let items = createBinding(tray, "items");
@ -82,18 +52,18 @@ function SysTray(): JSX.Element {
); );
} }
function Left({ connector }: { connector: string }): JSX.Element { function Left(): JSX.Element {
return ( return (
<box hexpand halign={Gtk.Align.START}> <box hexpand halign={Gtk.Align.START}>
<Clients connector={connector} /> <Clients />
</box> </box>
); );
} }
function Center({ connector }: { connector: string }): JSX.Element { function Center(): JSX.Element {
return ( return (
<box> <box>
<Workspaces connector={connector} /> <Workspaces />
</box> </box>
); );
} }
@ -274,77 +244,91 @@ function Volume(): JSX.Element {
); );
} }
function Workspaces({ connector }: { connector: string }): JSX.Element { function Workspaces(): JSX.Element {
const hyprland = Hyprland.get_default();
let workspaces = createBinding(hyprland, "workspaces");
return ( return (
<box class="workspaces"> <box class="workspaces">
{/* Generate a derived binding by passing a transformation function into the `workspaces` state */} <With value={workspaces}>
<For each={workspaces((wss: any[]) => {(wss: Array<Hyprland.Workspace>) => (
wss.filter((ws) => ws.output === connector) <box>
.filter((ws) => ws.is_active || windows().some((w: any) => w.workspace_id === ws.id)) <With value={createBinding(hyprland, "focusedMonitor")}>
.sort((a, b) => a.idx - b.idx) {(fm: Hyprland.Monitor) => {
)}> let filtered_wss = new Accessor(() =>
{(ws: any) => ( wss
.sort((a, b) => a.id - b.id)
.filter(
(ws) =>
ws &&
ws.get_monitor() &&
ws.get_monitor().get_id() === fm.get_id(),
),
);
return (
<box>
<For each={filtered_wss}>
{(ws: Hyprland.Workspace, _index) => (
<button <button
class={ws.is_active ? "focused" : ""} class={createBinding(hyprland, "focusedWorkspace").as(
onClicked={() => execAsync(["niri", "msg", "action", "focus-workspace", ws.idx.toString()])} (fw) => (ws === fw ? "focused" : ""),
)}
onClicked={() => ws.focus()}
> >
{ws.name || ws.idx.toString()} {`${ws.id}`.slice(-1)}
</button> </button>
)} )}
</For> </For>
</box> </box>
); );
}}
</With>
</box>
)}
</With>
</box>
);
} }
const MAX_TOTAL_CHARS = 120; function shorten(title: string) {
const MIN_TITLE_CHARS = 10; return title.length > 40 ? title.slice(0, 20) + "..." : title;
const OVERHEAD_PER_WINDOW = 5; // icon + padding + margin in character-width equivalents
function computeTitleBudgets(wins: any[]): any[] {
const totalLength = wins.reduce((sum, w) => sum + (w.title || "").length, 0);
const count = wins.length;
const totalWithOverhead = totalLength + count * OVERHEAD_PER_WINDOW;
let maxChars: number;
if (count === 0 || totalWithOverhead <= MAX_TOTAL_CHARS) {
maxChars = -1;
} else {
const charsAvailable = MAX_TOTAL_CHARS - count * OVERHEAD_PER_WINDOW;
maxChars = Math.max(MIN_TITLE_CHARS, Math.floor(charsAvailable / count));
} }
return wins.map(w => ({ ...w, maxChars })); function Clients(): JSX.Element {
} const hyprland = Hyprland.get_default();
let clients = createBinding(hyprland, "clients");
function Clients({ connector }: { connector: string }): JSX.Element {
return ( return (
<box>
<With value={createBinding(hyprland, "focusedWorkspace")}>
{(fw: Hyprland.Workspace) => (
<box class="clients"> <box class="clients">
{/* Use With to react to workspace changes, so we know which WS is active */} <With value={clients}>
<With value={workspaces}> {(cls: Array<Hyprland.Client>) => {
{(wss: any[]) => { let filtered_clients = new Accessor(() =>
let active_ws_for_monitor = wss.find((ws: any) => ws.is_active && ws.output === connector)?.id; cls
.sort((a, b) => a.pid - b.pid)
.filter((cl) => !cl.title.includes("rofi"))
.filter(
(cl) => fw && cl.get_workspace().get_id() === fw.get_id(),
),
);
return ( return (
<box> <box>
{/* Generate a derived binding for windows, depending on the active workspace */} <For each={filtered_clients}>
<For each={windows((wins: any[]) => {(cl: Hyprland.Client, _index) => (
computeTitleBudgets( <box
wins.filter((w: any) => !w.title?.includes("rofi")) class={createBinding(hyprland, "focusedClient").as(
.filter((w: any) => w.workspace_id === active_ws_for_monitor) (a) =>
.sort((a: any, b: any) => { a && a.address === cl.address
const posA = a.layout?.pos_in_scrolling_layout?.[0] ?? 0; ? "focused"
const posB = b.layout?.pos_in_scrolling_layout?.[0] ?? 0; : "unfocused",
return posA - posB; )}
}) >
) <image iconName={getIconName(cl)} class="app-icon" />
)}>
{(win: any) => (
<box class={win.is_focused ? "focused" : "unfocused"}>
<image iconName={getIconName(win.app_id, win.title)} class="app-icon" />
<label <label
label={win.title || ""} label={createBinding(cl, "title").as((title) =>
maxWidthChars={win.maxChars} shorten(title),
ellipsize={Pango.EllipsizeMode.END} )}
/> />
</box> </box>
)} )}
@ -354,13 +338,14 @@ function Clients({ connector }: { connector: string }): JSX.Element {
}} }}
</With> </With>
</box> </box>
)}
</With>
</box>
); );
} }
export default function Bar(gdkmonitor: Gdk.Monitor, scaleFactor: number = 1) { export default function Bar(gdkmonitor: Gdk.Monitor, scaleFactor: number = 1) {
console.log("Creating Bar on monitor:", gdkmonitor.get_connector()); console.log("Creating Bar on monitor:", gdkmonitor);
const connector = gdkmonitor.get_connector() || "";
return ( return (
<window <window
visible visible
@ -374,11 +359,11 @@ export default function Bar(gdkmonitor: Gdk.Monitor, scaleFactor: number = 1) {
} }
application={app} application={app}
class="Bar" class="Bar"
name={`top-bar-${connector}`} name="top-bar"
> >
<centerbox class="window-box"> <centerbox class="window-box">
<Left $type="start" connector={connector} /> <Left $type="start" />
<Center $type="center" connector={connector} /> <Center $type="center" />
<Right $type="end" /> <Right $type="end" />
</centerbox> </centerbox>
</window> </window>

View File

@ -1,19 +1,60 @@
import app from "ags/gtk4/app"; import app from "ags/gtk4/app";
import { Gdk } from "ags/gtk4";
import style from "./style.scss"; import style from "./style.scss";
import Bar from "./Bar"; import Bar from "./Bar";
import Hyprland from "gi://AstalHyprland";
import NotificationPopups from "./notifications/NotificationPopups"; import NotificationPopups from "./notifications/NotificationPopups";
function register_windows(monitor: Gdk.Monitor) { const hyprland = Hyprland.get_default();
let scale = (monitor.get_geometry().width >= 3000) ? 1.2 : 1;
Bar(monitor, scale); function find_main_monitor(): Hyprland.Monitor {
let monitors = hyprland.get_monitors();
for (let j = 0; j < monitors.length; j++) {
for (const monitor of ["eDP", "DP", "HDMI-A"]) {
for (let i = 0; i < monitors.length; i++) {
console.log(
"Checking monitor:",
monitors[i].get_name(),
"against",
monitor + "-" + j,
);
if (monitors[i].get_name() == monitor + "-" + j) {
return monitors[i];
}
}
}
}
return monitors[0];
}
function register_windows(monitor: Hyprland.Monitor) {
let gtkMonitor = app.get_monitors()[0];
let scale = monitor.get_width() >= 3000 ? 1.2 : 1;
Bar(gtkMonitor, scale);
NotificationPopups(); NotificationPopups();
} }
function switch_to_best_monitor() {
let mainMonitor = find_main_monitor();
for (var wd of app.get_windows()) {
wd.destroy();
}
register_windows(mainMonitor);
}
hyprland.connect("monitor-added", (_, _monitor: Hyprland.Monitor) => {
switch_to_best_monitor();
});
hyprland.connect("monitor-removed", () => {
switch_to_best_monitor();
});
console.log("Trying to find the best monitor");
app.start({ app.start({
css: style, css: style,
iconTheme: "Papirus", iconTheme: "Papirus",
main() { main() {
register_windows(app.get_monitors()[0]); switch_to_best_monitor();
}, },
}); });

View File

@ -1,4 +1,5 @@
import Apps from "gi://AstalApps"; import Apps from "gi://AstalApps";
import AstalHyprland from "gi://AstalHyprland";
const app_icons = new Apps.Apps().list.reduce( const app_icons = new Apps.Apps().list.reduce(
(acc, app) => { (acc, app) => {
@ -15,39 +16,57 @@ const app_icons = new Apps.Apps().list.reduce(
{ classOrNames: {} as Record<string, string>, executables: {} as Record<string, string> }, { classOrNames: {} as Record<string, string>, executables: {} as Record<string, string> },
); );
export function getIconName(app_id: string | null | undefined, title: string | null | undefined) { export function getIconName(client: AstalHyprland.Client | null | undefined) {
if (!app_id && !title) return ""; if (!client) return "";
// try fields matching Niri outputs // try a bunch of fields (snake_case and camelCase variants)
const possibleKeys = [ const possibleKeys = [
app_id, // common client properties (snake_case)
title (client as any).wm_class,
(client as any).initial_class,
(client as any).executable,
// camelCase variants (some bindings expose these)
(client as any).class,
(client as any).initialClass,
(client as any).initialTitle,
(client as any).title,
(client as any).name,
].filter(Boolean) as string[]; ].filter(Boolean) as string[];
// 1) direct exact match // 1) direct exact match
for (const k of possibleKeys) { for (const k of possibleKeys) {
const icon = app_icons.classOrNames[k] ?? app_icons.executables[k]; const icon = app_icons.classOrNames[k] ?? app_icons.executables[k];
if (icon) { if (icon) {
// cache the mapping // cache the mapping for this client's canonical class (prefer wm_class or class)
const cacheKey = app_id ?? title ?? k; const cacheKey = (client as any).wm_class ?? (client as any).class ?? (client as any).name ?? k;
app_icons.classOrNames[cacheKey] = icon; app_icons.classOrNames[cacheKey] = icon;
return icon; return icon;
} }
} }
// 2) fuzzy match: see if any stored key includes any of the client strings (title, name, etc.) // 2) fuzzy match: see if any stored key includes any of the client strings (title, name, etc.)
for (const s of possibleKeys) { const searchStrings = [
(client as any).title,
(client as any).initialTitle,
(client as any).initial_class,
(client as any).initialClass,
(client as any).wm_class,
(client as any).class,
(client as any).name,
].filter(Boolean) as string[];
for (const s of searchStrings) {
const matchKey = Object.keys(app_icons.classOrNames).find((key) => key.includes(s)); const matchKey = Object.keys(app_icons.classOrNames).find((key) => key.includes(s));
if (matchKey) { if (matchKey) {
const icon = app_icons.classOrNames[matchKey]; const icon = app_icons.classOrNames[matchKey];
const cacheKey = app_id ?? title ?? s; const cacheKey = (client as any).wm_class ?? (client as any).class ?? (client as any).name ?? s;
app_icons.classOrNames[cacheKey] = icon; app_icons.classOrNames[cacheKey] = icon;
return icon; return icon;
} }
} }
// nothing found — cache empty string so we don't repeat work // nothing found — cache empty string so we don't repeat work
const cacheKey = app_id ?? title ?? ""; const cacheKey = (client as any).wm_class ?? (client as any).class ?? (client as any).name ?? "";
if (cacheKey) app_icons.classOrNames[cacheKey] = ""; if (cacheKey) app_icons.classOrNames[cacheKey] = "";
return ""; return "";
} }

View File

@ -21,7 +21,7 @@
pkgs.accountsservice pkgs.accountsservice
battery battery
# hyprland hyprland
tray tray
powerprofiles powerprofiles
wireplumber wireplumber

View File

@ -1,4 +1,4 @@
{pkgs, config, ...}: let {pkgs, ...}: let
lock-false = { lock-false = {
Value = false; Value = false;
Status = "locked"; Status = "locked";
@ -6,7 +6,6 @@
in { in {
programs.firefox = { programs.firefox = {
enable = true; enable = true;
configPath = "${config.xdg.configHome}/mozilla/firefox";
package = pkgs.wrapFirefox pkgs.firefox-unwrapped { package = pkgs.wrapFirefox pkgs.firefox-unwrapped {
pkcs11Modules = [ pkcs11Modules = [
pkgs.eid-mw pkgs.eid-mw

View File

@ -2,14 +2,6 @@
programs.git = { programs.git = {
enable = true; enable = true;
lfs.enable = true; lfs.enable = true;
# 1. Update the signing configuration
signing = {
format = "ssh";
key = "/home/user/.secrets/SSH/Aloria/id_ed25519";
signByDefault = true;
};
settings = { settings = {
alias = { alias = {
s = "status"; s = "status";
@ -19,10 +11,6 @@
name = "Thomas Avé"; name = "Thomas Avé";
email = "email@thomasave.be"; email = "email@thomasave.be";
}; };
# 2. Tell Git where your allowed_signers file is located
gpg.ssh.allowedSignersFile = "~/.ssh/allowed_signers";
credentials.helper = "store"; credentials.helper = "store";
pull.rebase = false; pull.rebase = false;
push.autoSetupRemove = true; push.autoSetupRemove = true;
@ -36,24 +24,11 @@
}; };
rerere.enabled = true; rerere.enabled = true;
}; };
ignores = [ ignores = [
"*.direnv/" "*.direnv/"
"*.nix/"
"uv.lock"
".dmypy.json" ".dmypy.json"
".envrc"
]; ];
}; };
programs.delta = {
enable = true;
options = {
diff-so-fancy = true;
file-style = "omit";
# hunk-header-style = "omit";
};
};
programs.lazygit = { programs.lazygit = {
enable = true; enable = true;
settings = { settings = {
@ -61,18 +36,6 @@
editPreset = "nvim"; editPreset = "nvim";
autoStageResolvedConflicts = false; autoStageResolvedConflicts = false;
}; };
git.overrideGpg = true;
git.pagers = [
{
colorArg = "always";
pager = "delta --dark --color-only --paging=never";
}
];
}; };
}; };
# 3. Declaratively create the allowed_signers file (Assuming Home Manager)
home.file.".ssh/allowed_signers".text = ''
email@thomasave.be namespaces="git" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBxMq4kubz4wWr4S8xU3GRkPcn6XRS3y7IP+qylN5QAp user@Aloria
'';
} }

View File

@ -4,11 +4,9 @@
pname = "Helium"; pname = "Helium";
version = "0.4.7.1"; version = "0.4.7.1";
src = pkgs.fetchurl { src = pkgs.fetchurl {
url = "https://github.com/imputnet/helium-linux/releases/download/0.11.7.1/helium-0.11.7.1-x86_64.AppImage"; url = "https://github.com/imputnet/helium-linux/releases/download/0.9.4.1/helium-0.9.4.1-x86_64.AppImage";
sha256 = "sha256-qzc135IP5F2btxtOMUGMz+0azJhYL9KI0lcPG2KjcxU="; sha256 = "sha256-N5gdWuxOrIudJx/4nYo4/SKSxakpTFvL4zzByv6Cnug=";
}; };
extraPkgs = pkgs: [pkgs.tzdata];
profile = "export TZ=Asia/Bangkok";
}) })
]; ];
xdg.desktopEntries = { xdg.desktopEntries = {

View File

@ -147,6 +147,7 @@ in {
"rounding 0, match:float 0, match:workspace f[1]" "rounding 0, match:float 0, match:workspace f[1]"
]; ];
# UPDATED: New Layer Rule Syntax (0.53.0)
# Syntax: effect value, match:namespace regex # Syntax: effect value, match:namespace regex
layerrule = [ layerrule = [
"no_anim on, match:namespace ags_bar_0" "no_anim on, match:namespace ags_bar_0"

View File

@ -1,224 +0,0 @@
{pkgs, scale ? null, ...}: let
terminal = "${pkgs.foot}/bin/footclient";
nautilus = "${pkgs.nautilus}/bin/nautilus";
playerctl = "${pkgs.playerctl}/bin/playerctl";
wpctl = "${pkgs.wireplumber}/bin/wpctl";
brightnessctl = "${pkgs.brightnessctl}/bin/brightnessctl";
terminal-name = "foot";
launch_terminal = pkgs.writeShellScriptBin "launch_terminal" ''
function find_leaf_pid(){
local PID
local RET
local NAME
PID=$1
for CHILD_PID in $(pgrep -P "$PID"); do
RET=$(find_leaf_pid "$CHILD_PID")
if [ "$RET" != "" ]; then
PID="$RET"
fi
done
NAME=$(ps -p "$PID" -o comm=)
if [ "$NAME" == "zsh" ]; then
echo "$PID"
elif [ "$NAME" == "ssh" ]; then
echo "$PID"
fi
}
LEAF_PID=$(find_leaf_pid "$1")
if [ "$(ps -p "$LEAF_PID" -o comm=)" == "ssh" ]; then
SSH_COMMAND=$(ps -p "$LEAF_PID" -o args --no-headers)
if [[ "$SSH_COMMAND" == *"waypipe"* ]]; then
CLIENT=$(echo "$SSH_COMMAND" | awk '{ print $5 }')
PREVIOUS_SESSION_ID=$(grep -z "SSH_SESSION_ID" "/proc/$LEAF_PID/environ" | xargs -0 -n 1 | grep -oP "[0-9]*")
SSH_SESSION_ID=$RANDOM
${terminal} -e zsh -c "SSH_SESSION_ID=$SSH_SESSION_ID waypipe ssh -t \"$CLIENT\" env SSH_SESSION_ID=\"$SSH_SESSION_ID\" PREVIOUS_SESSION_ID=\"$PREVIOUS_SESSION_ID\" \"zsh --login\""
else
${terminal} -e zsh -c "ssh -t \"$(echo "$SSH_COMMAND" | awk '{ print $2 }')\""
fi
else # Not an ssh session
if [ "$(ps -p "$1" -o comm=)" == "${terminal-name}" ]; then
CWD=$(readlink -e /proc/"$LEAF_PID"/cwd)
if [ "$CWD" != "" ]; then
${terminal} --working-directory "$CWD"
else
${terminal}
fi
else
${terminal}
fi
fi
'';
in {
# Since native Home Manager doesn't have a programs.niri module yet,
# we generate the KDL configuration file directly.
programs.hyprlock = {
enable = true;
settings = {
input-field = [
{
size = "200, 50";
position = "0, -80";
monitor = "";
dots_center = true;
fade_on_empty = true;
font_color = "rgb(202, 211, 245)";
inner_color = "rgb(91, 96, 120)";
outer_color = "rgb(24, 25, 38)";
outline_thickness = 3;
placeholder_text = "<span foreground=\"##cad3f5\">Password...</span>";
shadow_passes = 2;
}
];
general = {
no_fade_in = false;
};
background = [
{
path = "screenshot";
blur_passes = 3;
blur_size = 8;
}
];
};
};
xdg.configFile."niri/config.kdl".text = ''
spawn-at-startup "${pkgs.swaybg}/bin/swaybg" "-i" "${../hyprland/files/wallpaper.png}" "-m" "fill"
spawn-at-startup "foot" "--server"
spawn-at-startup "ags" "run"
spawn-at-startup "${pkgs.mate-polkit}/bin/polkit-mate"
prefer-no-csd
hotkey-overlay {
skip-at-startup
}
gestures {
hot-corners {
off
}
}
layout {
gaps 5
border {
off
}
focus-ring {
width 4
active-color "rgba(0, 47, 95, 238)"
inactive-color "rgba(255, 255, 255, 0)"
}
}
input {
mouse {
accel-speed 0.5
}
touchpad {
tap
}
keyboard {
xkb {
options "compose:rctrl"
}
}
focus-follows-mouse max-scroll-amount="10%"
warp-mouse-to-focus
}
${if scale != null then ''
output "eDP-1" {
scale ${toString scale}
}
'' else ""} window-rule {
match app-id="vicinae"
open-floating true
}
binds {
// General Binds
Mod+Return { spawn "sh" "-c" "${launch_terminal}/bin/launch_terminal $(niri msg --json focused-window | ${pkgs.jq}/bin/jq .pid)"; }
Mod+Shift+Return { spawn "${terminal}"; }
Mod+Q { close-window; }
Mod+A { spawn "${nautilus}"; }
Mod+B { spawn "Helium"; }
Mod+M { maximize-column; }
Mod+F {maximize-window-to-edges;}
Mod+Tab { toggle-overview; }
// Vicinae Binds
Mod+C { spawn "vicinae" "vicinae://extensions/vicinae/clipboard/history"; }
Mod+N { spawn "vicinae" "vicinae://extensions/vicinae/wm/switch-windows"; }
Mod+Escape { spawn "vicinae" "open" "-q" "Power Management "; }
Mod+Space { spawn "vicinae" "toggle"; }
Mod+Comma { consume-or-expel-window-left; }
Mod+Period { consume-or-expel-window-right; }
Mod+Alt+H { set-column-width "-5%"; }
Mod+Alt+L { set-column-width "+5%"; }
Mod+Alt+K { set-window-height "-5%"; }
Mod+Alt+J { set-window-height "+5%"; }
// Movement
Mod+H { focus-column-left; }
Mod+J { focus-window-down; }
Mod+K { focus-window-up; }
Mod+L { focus-column-right; }
Mod+Shift+H { move-column-left; }
Mod+Shift+L { move-column-right; }
Mod+Shift+J { move-window-down; }
Mod+Shift+K { move-window-up; }
// Workspaces
Mod+Shift+U { move-column-to-workspace-down; }
Mod+Shift+I { move-column-to-workspace-up; }
Mod+I { focus-workspace-up; }
Mod+U { focus-workspace-down; }
Mod+1 { focus-workspace 1; }
Mod+2 { focus-workspace 2; }
Mod+3 { focus-workspace 3; }
Mod+4 { focus-workspace 4; }
Mod+5 { focus-workspace 5; }
Mod+6 { focus-workspace 6; }
Mod+7 { focus-workspace 7; }
Mod+8 { focus-workspace 8; }
Mod+9 { focus-workspace 9; }
// Move to workspace
Mod+Shift+1 { move-column-to-workspace 1; }
Mod+Shift+2 { move-column-to-workspace 2; }
Mod+Shift+3 { move-column-to-workspace 3; }
Mod+Shift+4 { move-column-to-workspace 4; }
Mod+Shift+5 { move-column-to-workspace 5; }
Mod+Shift+6 { move-column-to-workspace 6; }
Mod+Shift+7 { move-column-to-workspace 7; }
Mod+Shift+8 { move-column-to-workspace 8; }
Mod+Shift+9 { move-column-to-workspace 9; }
Print { screenshot; }
Ctrl+Alt+L {spawn "${pkgs.hyprlock}/bin/hyprlock"; }
XF86MonBrightnessUp { spawn "${brightnessctl}" "set" "+10%"; }
XF86MonBrightnessDown { spawn "${brightnessctl}" "set" "10%-"; }
// Volume
XF86AudioRaiseVolume { spawn "${wpctl}" "set-volume" "@DEFAULT_AUDIO_SINK@" "10%+" "--limit" "1.0"; }
XF86AudioLowerVolume { spawn "${wpctl}" "set-volume" "@DEFAULT_AUDIO_SINK@" "10%-"; }
XF86AudioMute { spawn "${wpctl}" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; }
XF86AudioMicMute { spawn "${wpctl}" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; }
// Media
XF86AudioNext { spawn "${playerctl}" "next"; }
XF86AudioPrev { spawn "${playerctl}" "previous"; }
Mod+XF86AudioMute { spawn "${playerctl}" "play-pause"; }
Mod+XF86AudioRaiseVolume { spawn "${playerctl}" "next"; }
Mod+XF86AudioLowerVolume { spawn "${playerctl}" "previous"; }
}
'';
}

View File

@ -2,19 +2,9 @@
config, config,
pkgs, pkgs,
... ...
}: let }: {
basedpyrightShim = pkgs.symlinkJoin {
name = "basedpyright-with-pyright-shim";
paths = [pkgs.basedpyright];
postBuild = ''
ln -s $out/bin/basedpyright-langserver $out/bin/pyright-langserver
ln -s $out/bin/basedpyright $out/bin/pyright
'';
};
in {
home.packages = with pkgs; [ home.packages = with pkgs; [
# codeium # codeium
basedpyrightShim
nixd nixd
alejandra alejandra
clang-tools clang-tools

View File

@ -5,13 +5,12 @@ end
return { return {
{ {
'saghen/blink.compat', 'saghen/blink.compat',
version = '*',
lazy = true, lazy = true,
opts = {}, opts = {},
}, },
{ {
'saghen/blink.cmp', 'saghen/blink.cmp',
branch = 'v1',
version = "1.*",
dependencies = { dependencies = {
'rafamadriz/friendly-snippets', 'rafamadriz/friendly-snippets',
'honza/vim-snippets', 'honza/vim-snippets',
@ -23,8 +22,8 @@ return {
}, },
build = 'nix run --extra-experimental-features flakes --extra-experimental-features nix-command .#build-plugin', build = 'nix run --extra-experimental-features flakes --extra-experimental-features nix-command .#build-plugin',
keys = { keys = {
{ "<leader>n", function() vim.diagnostic.jump({ count = 1 }) end }, { "<leader>n", vim.diagnostic.goto_next },
{ "<leader>p", function() vim.diagnostic.jump({ count = -1 }) end }, { "<leader>p", vim.diagnostic.goto_prev },
{ "<leader>f", vim.lsp.buf.code_action }, { "<leader>f", vim.lsp.buf.code_action },
{ "gd", vim.lsp.buf.definition }, { "gd", vim.lsp.buf.definition },
{ "gi", vim.lsp.buf.implementation }, { "gi", vim.lsp.buf.implementation },

View File

@ -23,7 +23,6 @@
htop htop
ghostscript ghostscript
waypipe waypipe
tree
inputs.worktimer.packages.${pkgs.stdenv.hostPlatform.system}.default inputs.worktimer.packages.${pkgs.stdenv.hostPlatform.system}.default
usbutils usbutils
gocryptfs gocryptfs

View File

@ -2,14 +2,12 @@
inputs, inputs,
config, config,
pkgs, pkgs,
scale ? null,
... ...
}: { }: {
imports = [ imports = [
(import ./common.nix {inherit inputs config pkgs;}) (import ./common.nix {inherit inputs config pkgs;})
(import ./python.nix {inherit inputs config pkgs;}) (import ./python.nix {inherit inputs config pkgs;})
# (import ../hyprland {inherit inputs pkgs;}) (import ../hyprland {inherit inputs pkgs;})
(import ../niri {inherit inputs config pkgs scale;})
(import ../ags {inherit inputs pkgs;}) (import ../ags {inherit inputs pkgs;})
../rofi ../rofi
../vicinae ../vicinae
@ -120,5 +118,4 @@
}; };
fonts.fontconfig.enable = true; fonts.fontconfig.enable = true;
gtk.gtk4.theme = config.gtk.theme; # Silence warning
} }

View File

@ -1,9 +1,17 @@
{...}: { {inputs, ...}:
programs.vicinae = { # Add inputs here
{
# Import the module definition here
imports = [inputs.vicinae.homeManagerModules.default];
services.vicinae = {
enable = true; enable = true;
systemd = { systemd = {
enable = true; enable = true;
autoStart = true; autoStart = true;
environment = {
QT_SCALE_FACTOR = "1.5";
};
}; };
}; };
} }

View File

@ -5,12 +5,12 @@
config, config,
... ...
}: let }: let
# serverIP = "10.0.0.1"; serverIP = "10.0.0.1";
in { in {
imports = [ imports = [
(import ../Common/default.nix {inherit inputs pkgs config;}) (import ../Common/default.nix {inherit inputs pkgs config;})
(import ../Common/desktop.nix {inherit inputs pkgs config;}) (import ../Common/desktop.nix {inherit inputs pkgs config;})
# (import ../Common/nfs.nix {inherit pkgs serverIP;}) (import ../Common/nfs.nix {inherit pkgs serverIP;})
(import ../Common/zfs.nix {inherit inputs pkgs config;}) (import ../Common/zfs.nix {inherit inputs pkgs config;})
]; ];
@ -150,6 +150,21 @@ in {
} }
]; ];
}; };
GCP = {
address = ["10.5.0.5/24"];
privateKeyFile = "/home/user/.secrets/Wireguard/GCP.key";
listenPort = 51820;
autostart = false;
postUp = "resolvectl dns GCP 1.1.1.1;resolvectl dns wlan0 1.1.1.1;";
peers = [
{
publicKey = "NEBNE4Czf2MkZF2X5aVhmofENH1uXjDpvXjIMJvfMFA=";
allowedIPs = ["0.0.0.0/0"];
endpoint = "35.201.231.151:443";
persistentKeepalive = 25;
}
];
};
}; };
systemd.services."wg-quick-OPNsense" = { systemd.services."wg-quick-OPNsense" = {
serviceConfig = { serviceConfig = {
@ -158,13 +173,6 @@ in {
}; };
unitConfig.StartLimitIntervalSec = 0; unitConfig.StartLimitIntervalSec = 0;
}; };
services.tailscale = {
enable = true;
extraUpFlags = [
"--login-server=https://headscale.thomasave.be"
];
authKeyFile = "/home/user/.secrets/Tailscale/Aloria/authkey";
};
services.usbmuxd.enable = true; services.usbmuxd.enable = true;
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
libcamera libcamera

View File

@ -56,8 +56,7 @@
nixpkgs.config.packageOverrides = pkgs: { nixpkgs.config.packageOverrides = pkgs: {
zfs = pkgs.zfs_unstable; zfs = pkgs.zfs_unstable;
}; };
boot.kernelPackages = pkgs.linuxPackages; boot.kernelPackages = pkgs.linuxPackages_latest;
boot.zfs.forceImportRoot = false;
hardware.firmware = with pkgs; [ hardware.firmware = with pkgs; [
ipu6-camera-bins ipu6-camera-bins
ivsc-firmware ivsc-firmware

View File

@ -11,6 +11,7 @@ in {
imports = [ imports = [
(import ../Common/default.nix {inherit inputs pkgs config;}) (import ../Common/default.nix {inherit inputs pkgs config;})
(import ../Common/desktop.nix {inherit inputs pkgs config;}) (import ../Common/desktop.nix {inherit inputs pkgs config;})
(import ../Common/nfs.nix {inherit pkgs serverIP;})
(import ../Common/zfs.nix {inherit inputs pkgs config;}) (import ../Common/zfs.nix {inherit inputs pkgs config;})
]; ];

View File

@ -12,7 +12,6 @@
boot.initrd.kernelModules = []; boot.initrd.kernelModules = [];
boot.kernelModules = ["kvm-intel"]; boot.kernelModules = ["kvm-intel"];
boot.extraModulePackages = []; boot.extraModulePackages = [];
boot.zfs.forceImportRoot = false;
fileSystems."/" = { fileSystems."/" = {
device = "rpool/root"; device = "rpool/root";

View File

@ -15,17 +15,15 @@
vulkan-extension-layer vulkan-extension-layer
]; ];
}; };
# programs.hyprland = { programs.hyprland = {
# enable = true; enable = true;
# withUWSM = true; withUWSM = true;
# }; };
programs.niri.enable = true;
services.greetd = { services.greetd = {
enable = pkgs.lib.mkDefault true; enable = pkgs.lib.mkDefault true;
settings = rec { settings = rec {
initial_session = { initial_session = {
# command = "uwsm start hyprland-uwsm.desktop"; command = "uwsm start hyprland-uwsm.desktop";
command = "niri-session";
user = "user"; user = "user";
}; };
default_session = initial_session; default_session = initial_session;

View File

@ -12,6 +12,7 @@ in {
# (import ../Common/nvidia.nix { inherit inputs pkgs config; }) # (import ../Common/nvidia.nix { inherit inputs pkgs config; })
(import ../Common/desktop.nix {inherit inputs pkgs config;}) (import ../Common/desktop.nix {inherit inputs pkgs config;})
(import ../Common/nfs.nix {inherit pkgs serverIP;}) (import ../Common/nfs.nix {inherit pkgs serverIP;})
(import ../Common/android.nix {inherit pkgs;})
]; ];
# Kernel # Kernel
@ -39,6 +40,7 @@ in {
nixpkgs.config.rocmSupport = true; nixpkgs.config.rocmSupport = true;
services.ollama = { services.ollama = {
enable = true; enable = true;
acceleration = "rocm";
}; };
# nixpkgs.config.cudaSupport = true; # nixpkgs.config.cudaSupport = true;
services.logind.settings.Login = { services.logind.settings.Login = {