77 Commits

Author SHA1 Message Date
kenji 17cb857271 added virtualbox 2025-12-22 18:51:43 -06:00
kenji 86742306cb removed virtual box 2025-12-22 08:38:46 -06:00
kenji 47f2d1bd2a added adwaita icons 2025-12-15 10:11:07 -06:00
kenji 92d6e19fa8 added easy effects 2025-12-15 10:11:03 -06:00
kenji a8f6af8fc9 fix print not detecting printers 2025-12-13 09:42:34 -06:00
kenji e914ffd552 updated illogical impulse 2025-12-13 09:40:04 -06:00
kenji a308923512 a 2025-12-13 09:35:21 -06:00
kenji c148be1a99 omarchy-nix: resoulte 2025-12-12 11:11:39 -06:00
kenji ced387584e omarchy-nix: fixed missing config 2025-12-12 10:12:10 -06:00
kenji ac840fb5e9 omarchy-nix: added 2025-12-12 10:10:37 -06:00
kenji 71d1da366d README: added more broke stuff 2025-12-12 10:10:25 -06:00
kenji e0b9f8b91a README: added problems 2025-12-12 09:34:01 -06:00
kenji c510e43618 hardware: update 2025-12-12 09:33:51 -06:00
kenji fb2ae2d470 update: illogical-impulse 2025-12-12 09:33:43 -06:00
kenji 035b8522ff git: added user and email 2025-12-12 09:33:35 -06:00
kenji 4ccfeb12fe remove: fcitx5 due to weird icon 2025-12-12 09:33:22 -06:00
kenji 67adb36f6b moved lanzaboote to default modules 2025-11-24 14:25:36 -06:00
kenji 8b6d867659 removed lanzaboote 2025-11-24 14:24:38 -06:00
kenji 84ee68cb1f jovian change again 2025-11-24 14:04:30 -06:00
kenji 2d7fcc8801 force preferred monitor jovian 2025-11-24 11:11:26 -06:00
kenji ec2293db2e modified jovian environment to support preferred monitor 2025-11-24 10:58:44 -06:00
kenji b6974cb4a2 removed wireless support for now 2025-11-14 10:04:00 -06:00
kenji 3dfb455a1c added lact 2025-09-13 08:13:52 -05:00
kenji 636cac904e a 2025-08-31 21:00:02 -05:00
kenji 12da637cf8 a 2025-08-24 17:22:33 -05:00
kenji a39ffa9cc7 added sunshine at startup 2025-08-21 20:07:15 -05:00
kenji 36399861f0 added login 2025-08-21 20:03:07 -05:00
kenji ac892bcff7 a 2025-08-20 14:21:37 -05:00
kenji 9579fafceb upd ii 2025-08-19 10:02:21 -05:00
kenji 3dcc23facb upd 2025-08-19 10:01:57 -05:00
kenji 009a7145b8 updated modules 2025-08-19 09:59:20 -05:00
kenji 226b61bf21 updated solaar fix 2025-08-18 23:15:23 -05:00
kenji 4586dd1d9c updated ii 2025-08-18 23:01:51 -05:00
kenji 291f442a45 updatee ii 2025-08-17 09:46:23 -05:00
kenji 45010d5f0a minor changes 2025-08-17 09:46:09 -05:00
kenji e1cf3ad59d added lanzaboote.nix for secure boot 2025-08-14 15:13:56 -05:00
kenji bc268218a5 added security.nix for secure boot 2025-08-14 15:07:51 -05:00
kenji 9a05a5546f autostart steamOS 2025-08-14 14:40:51 -05:00
kenji cb224894b8 removed moondeck buddy 2025-08-13 18:16:22 -05:00
kenji 29453240ed vanilla changes with added nvim 2025-08-13 15:01:11 -05:00
kenji c3526e6eac added vanilla for testing 2025-08-13 14:51:15 -05:00
kenji e0ca2aa3bf organized 2025-08-13 09:11:03 -05:00
kenji 8aa7f53eca starship now works as Pure 2025-08-13 09:06:26 -05:00
kenji 9b4c4991c4 updated ii 2025-08-13 08:26:22 -05:00
kenji f040c4b610 enables starship 2025-08-13 08:14:24 -05:00
kenji fac71ff78d updated fonts 2025-08-12 08:19:22 -05:00
kenji 1aa0ab9044 fixed missing icons 2025-08-11 22:58:40 -05:00
kenji 0f17915e8c updated illogical-impulse 2025-08-11 19:30:26 -05:00
kenji 171564d6dc added solaar 2025-08-11 19:30:12 -05:00
kenji 4920a65aa2 upd 2025-08-11 17:23:25 -05:00
kenji fc71417bc7 uses apps.nix for firefox installation 2025-08-11 16:38:14 -05:00
lsoriano-mcm 1aa742d2b2 added illogical impulse 2025-08-09 13:26:38 -05:00
lsoriano-mcm d0339032fa cleaned up a lot 2025-08-09 12:29:57 -05:00
lsoriano-mcm 4f7a30197a major fix macos 2025-08-07 16:03:52 -05:00
lsoriano-mcm 2dcdd0b29a upd 2025-08-07 15:10:14 -05:00
lsoriano-mcm 638b2e54dc organized 2025-08-07 14:51:45 -05:00
lsoriano-mcm c11b7205bd reorganized boot 2025-08-07 14:43:11 -05:00
kenji caada5a969 added flatpak on conf 2025-08-03 15:55:09 -05:00
kenji ceb17c3a34 enable steam os conf 2025-08-03 14:20:35 -05:00
kenji e619754e92 test 2025-08-03 11:37:24 -05:00
kenji 068a46a9bf added mkOverride 2025-07-31 07:07:46 -05:00
kenji 2cbe32f561 t 2025-07-31 06:41:23 -05:00
kenji e90d182cde added virtualbox 2025-07-23 19:47:13 -05:00
kenji 2bede8d2bc test 2025-07-23 17:55:04 -05:00
kenji 1bb5ea283f a 2025-07-23 17:51:25 -05:00
kenji 173f9a08ca added vrr 2025-07-23 16:35:47 -05:00
kenji 61e3f29db2 test 2025-07-23 16:30:20 -05:00
kenji 9a44776d59 added config file for nixos 2025-07-23 16:30:16 -05:00
kenji c83ad31922 monitor fix 2025-07-23 15:35:53 -05:00
kenji 990b154250 enabled HDR 2025-07-23 14:10:58 -05:00
kenji 4cb03bcbbb fixed quickshell 2025-07-23 12:56:32 -05:00
kenji 5f6dbaac10 minor fixes 2025-07-23 12:46:36 -05:00
kenji 9a24848f21 fixed sunshine not installed 2025-07-22 20:08:29 -05:00
kenji 10e9e6e426 added more support 2025-07-22 20:03:46 -05:00
kenji e11b3547d4 fix unmatched sha 2025-07-22 20:03:39 -05:00
kenji d80c5c1074 added alternative to qs main menu 2025-07-22 20:03:27 -05:00
kenji 954407bfa0 modified hardware 2025-07-22 20:03:15 -05:00
106 changed files with 4763 additions and 1107 deletions
-7
View File
@@ -1,7 +0,0 @@
keys:
- &user_kenji age1dhmt5tdyxd9zam542zkr9hq4tku7lzmf6j057sjtepk80deky5fqemczs5
creation_rules:
- path_regex: secrets/[^/]+\.(yaml|json|env|ini)$
key_groups:
- age:
- *user_kenji
+59 -54
View File
@@ -1,58 +1,63 @@
# HakaseOS
HakaseOS is an opinionated NixOS configuration heavily inspired by OmarchyOS.
# Nix Sakamoto
A rewrite of the original Sakamoto NixOS configuration.
## Features
* Vim keybindings
* TUI applications
* Simple Setup
* Pre-configured Firefox
## Installation
Installing Sakamoto Nix configuration may vary on your current operating system.
## How to Use SOPS
SOPS is an important aspect of this operating system. Learning to use it is important for security and modularity. It is impertinent that you do not lose the `private key`, as it is irrecoverable.
| Hosts | Description |
|----------|--------------|
| hakase | gaming desktop (linux) |
| sakamoto | \[unavailable] server that uses containers (linux) |
| nano | \[unavailable] windows configuration |
| macos | macos configuration |
To get started, follow the instructions below.
1. Create a folder.
```sh
mkdir -p ~/.config/sops/age
```
2. Generate a private key using `age`
```sh
nix-shell -p age --run "age-keygen -o ~/.config/sops/age/keys.txt"
```
**OR**
Use `ssh-to-age` to convert `id_ed22519` to `age`.
```sh
nix-shell -p ssh-to-age --run "ssh-to-age -private-key -i ~/.ssh/id_ed25519 > ~/.config/sops/age/keys.txt"
```
There are other ways of generating a private key. Refer to [sops-nix](https://github.com/Mic92/sops-nix).
3. Get a **public key**.
```sh
nix-shell -p age --run "age-keygen -y ~/.config/sops/age/keys.txt"
```
4. On the same directory as `flake.nix`, create `.sops.yaml` and paste the following below.
```yaml
# This example uses YAML anchors which allows reuse of multiple keys
# without having to repeat yourself.
# Also see https://github.com/Mic92/dotfiles/blob/d6114726d859df36ccaa32891c4963ae5717ef7f/nixos/.sops.yaml
# for a more complex example.
keys:
- &admin_alice 2504791468b153b8a3963cc97ba53d1919c5dfd4
- &admin_bob age12zlz6lvcdk6eqaewfylg35w0syh58sm7gh53q5vvn7hd7c6nngyseftjxl
creation_rules:
- path_regex: secrets/[^/]+\.(yaml|json|env|ini)$
key_groups:
- pgp:
- *admin_alice
age:
- *admin_bob
**Note: Replace `${Hosts}` with one of the options from the table above.**
```
Replace as according to your needs.
5. Create a sops `.yaml` file.
```sh
nix-shell -p sops --run "sops secrets/example.yaml"
```
NOTE: If you add a new host to your `.sops.yaml`, you will need to update the keys for all secrets.
```sh
nix-shell -p sops --run "sops updatekeys secrets/example.yaml"
```
### Linux Installation
1. Install [Nix](https://nixos.org).
2. Clone this directory.
```sh
$ git clone https://git.sakamoto.dev/kenji/nixos.git ~/.config/nixos
```
3. Create a hardware-configuration.conf
```sh
$ sudo nixos-generate-config --dir ~/.config/nixos/hosts/${Hosts}/
```
4. ⚠️ Modify `config.nix` that suits your configuration. **Be sure to edit `config.nix`! Most especially `myConfig.essentials.Username`. Otherwise, your OS could break!!!**
5. Rebuild.
```sh
$ sudo nixos-rebuild switch --flake ~/.config/nixos/hosts/#${Hosts}
```
6. Install unstable channel (fixes `pkgs.fish` misconfiguration).
```sh
$ nix-channel --add https://nixos.org/channels/nixos-unstable nixos nix-channel --update
```
7. (Optional) You can install `proton-ge` by running the following command:
```sh
protonup
```
8. (Optional) Add Decky Loader for Steam via this command:
```sh
touch ~/.steam/steam/.cef-enable-remote-debugging
```
### MacOS (Darwin) Installation
1. Install [Nix](https://nixos.org).
2. Clone this directory.
```sh
$ git clone https://git.sakamoto.dev/kenji/nixos.git ~/.config/nixos
```
3. ⚠️ Modify `config.nix` that suits your configuration. **Be sure to edit `config.nix`! Most especially `myConfig.essentials.Username`. Otherwise, configuration would not work!!!**
4. Rebuild.
```sh
$ sudo nix run nix-darwin --extra-experimental-features "nix-command flakes" -- switch --flake ~/.config/nixos#macos
```
## Problems:
* XDG defaults (file manager default is terminal)
* File Manager must be TUI
* Bluetooth and WiFi should open at TUI
* Steam and Heroic incompatible
* Broken switchwall.sh
* Box fonts
-15
View File
@@ -1,15 +0,0 @@
{pkgs, ...}: {
programs.ghostty = {
enable = true;
package =
if pkgs.stdenv.isDarwin
then pkgs.ghostty-bin
else pkgs.ghostty;
enableFishIntegration = true;
settings = {
window-padding-x = 15;
window-padding-y = 15;
window-padding-balance = true;
};
};
}
-10
View File
@@ -1,10 +0,0 @@
{myConfig, ...}: {
programs.git = {
enable = true;
settings = {
user.name = "${myConfig.git.username}";
user.email = "${myConfig.git.email}";
init.defaultBranch = "${myConfig.git.defaultBranch}";
};
};
}
-38
View File
@@ -1,38 +0,0 @@
{
myConfig,
inputs,
pkgs,
...
}: {
programs.hyprland = {
enable = true;
package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland;
withUWSM = true;
};
environment.systemPackages = [
pkgs.hyprpicker
pkgs.hyprlock
pkgs.hypridle
pkgs.hyprpaper
pkgs.hyprsunset
pkgs.hyprpolkitagent
];
xdg.terminal-exec = {
enable = true;
settings = {
default = myConfig.terminal.default;
};
};
# systemd.user.services.hyprpolkitagent = {
# description = "Hyprland Polkit Agent";
# wantedBy = ["graphical-session.target"];
# serviceConfig = {
# ExecStart = "${pkgs.hyprpolkitagent}/libexec/hyprpolkitagent";
# Restart = "on-failure";
# };
# };
}
-9
View File
@@ -1,9 +0,0 @@
{
imports = [
./hypr/binds.nix
./hypr/general.nix
./hypr/exec.nix
];
wayland.windowManager.hyprland.enable = true;
wayland.windowManager.hyprland.systemd.enable = false; # for UWSM support...
}
-44
View File
@@ -1,44 +0,0 @@
{
wayland.windowManager.hyprland.settings = {
bindd =
[
# essential
"SUPER, Return, Open Terminal, exec, uwsm app -- xdg-terminal-exec"
"SUPER, Q, Kill active, killactive"
# move focus
"SUPER, J, Move focus down, movefocus, d"
"SUPER, K, Move focus up, movefocus, u"
"SUPER, H, Move focus left, movefocus, l"
"SUPER, L, Move focus right, movefocus, r"
# fullscreen
"SUPER, F, Toggle Fullscreen, fullscreen, 0"
"SUPER SHIFT, F, Toggle Maximized Fullscreen, fullscreen, 1"
# apps
"SUPER, W, Open browser, exec, uwsm app -- firefox" # FIXME: must be xdg-open
# [Workspaces] Toggle between most recent workspaces
"SUPER, Tab, Cycle workspaces, workspace, previous"
]
++ (
# Generate binds for Super + [1-10] to switch workspaces
# and Super + Shift + [1-10] to move window to workspace
builtins.concatLists (builtins.genList (
i: let
ws = i + 1;
key = toString (
if ws == 10
then 0
else ws
);
in [
"SUPER, ${key}, Switch to workspace ${toString ws}, workspace, ${toString ws}"
"SUPER SHIFT, ${key}, Move window to workspace ${toString ws}, movetoworkspace, ${toString ws}"
]
)
10)
);
};
}
-7
View File
@@ -1,7 +0,0 @@
{
wayland.windowManager.hyprland.settings = {
exec-once = [
"uwsm app -- waybar"
];
};
}
-9
View File
@@ -1,9 +0,0 @@
{myConfig, ...}: {
wayland.windowManager.hyprland.settings = {
general = {
gaps_in = 5;
gaps_out = 15;
};
monitor = myConfig.hyprland.monitors;
};
}
-59
View File
@@ -1,59 +0,0 @@
{
programs.starship = {
enable = true;
settings = {
# Pro layout: one-line, clear spacing
format = ''
[](surface0)$os$directory[](fg:surface0 bg:peach)$git_branch$git_status[](fg:peach bg:surface1)$c$rust$nodejs$python$golang[](fg:surface1 bg:surface0)$nix_shell[](surface0)
$character'';
# Palette definition (Catppuccin Mocha-inspired)
palette = "pro_theme";
palettes.pro_theme = {
surface0 = "#313244";
surface1 = "#45475a";
text = "#cdd6f4";
peach = "#fab387";
sapphire = "#74c7ec";
lavender = "#b4befe";
green = "#a6e3a1";
};
os = {
disabled = false;
format = "[$symbol]($style)";
style = "bg:surface0 fg:text";
symbols = {NixOS = " ";};
};
directory = {
style = "bg:surface0 fg:lavender";
format = "[ $path ]($style)";
truncation_length = 3;
truncation_symbol = "/";
};
git_branch = {
symbol = "󰊢 ";
style = "bg:peach fg:surface0";
format = "[[ $symbol $branch ]($style)]($style)";
};
git_status = {
style = "bg:peach fg:surface0";
format = "[[($all_status$ahead_behind )]($style)]($style)";
};
nix_shell = {
symbol = "󱄅 ";
style = "bg:surface0 fg:sapphire";
format = "[ $symbol $state ]($style)";
};
character = {
success_symbol = "[󱞩](bold green)";
error_symbol = "[󱞩](bold red)";
};
};
};
}
-2
View File
@@ -1,2 +0,0 @@
{
}
-170
View File
@@ -1,170 +0,0 @@
{
config,
pkgs,
...
}: {
imports = [
./style.nix
];
programs.waybar = {
enable = true;
settings = {
mainBar = {
reload_style_on_change = true;
layer = "top";
position = "top";
spacing = 0;
height = 26;
modules-left = ["custom/omarchy" "hyprland/workspaces"];
modules-center = ["clock" "custom/update" "custom/screenrecording-indicator"];
modules-right = [
"group/tray-expander"
"bluetooth"
"network"
"pulseaudio"
"cpu"
"battery"
];
"hyprland/workspaces" = {
on-click = "activate";
format = "{icon}";
format-icons = {
"default" = "";
"1" = "1";
"2" = "2";
"3" = "3";
"4" = "4";
"5" = "5";
"6" = "6";
"7" = "7";
"8" = "8";
"9" = "9";
"10" = "0";
"active" = "󱓻";
};
persistent-workspaces = {
"1" = [];
"2" = [];
"3" = [];
"4" = [];
"5" = [];
};
};
"custom/omarchy" = {
format = "<span font='omarchy'>\ue900</span>";
on-click = "omarchy-menu";
on-click-right = "xdg-terminal-exec";
tooltip-format = "Omarchy Menu\n\nSuper + Alt + Space";
};
"custom/update" = {
format = "";
exec = "omarchy-update-available";
on-click = "omarchy-launch-floating-terminal-with-presentation omarchy-update";
tooltip-format = "Omarchy update available";
signal = 7;
interval = 21600;
};
"cpu" = {
interval = 5;
format = "󰍛";
on-click = "omarchy-launch-or-focus-tui btop";
on-click-right = "alacritty";
};
"clock" = {
format = "{:%H:%M %a %b %d}";
format-alt = "{:L%d %B W%V %Y}";
tooltip = false;
on-click-right = "omarchy-launch-floating-terminal-with-presentation omarchy-tz-select";
};
"network" = {
format-icons = ["󰤯" "󰤟" "󰤢" "󰤥" "󰤨"];
format = "{icon}";
format-wifi = "{icon}";
format-ethernet = "󰀂";
format-disconnected = "󰤮";
tooltip-format-wifi = "{essid} ({frequency} GHz)\n{bandwidthDownBytes} {bandwidthUpBytes}";
tooltip-format-ethernet = "{bandwidthDownBytes} {bandwidthUpBytes}";
tooltip-format-disconnected = "Disconnected";
interval = 3;
spacing = 1;
on-click = "omarchy-launch-wifi";
};
"battery" = {
format = "{capacity}% {icon}";
format-discharging = "{icon}";
format-charging = "{icon}";
format-plugged = "";
format-icons = {
charging = ["󰢜" "󰂆" "󰂇" "󰂈" "󰢝" "󰂉" "󰢞" "󰂊" "󰂋" "󰂅"];
default = ["󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹"];
};
format-full = "󰂅";
tooltip-format-discharging = "{power:>1.0f}W {capacity}%";
tooltip-format-charging = "{power:>1.0f}W {capacity}%";
interval = 5;
on-click = "omarchy-menu power";
states = {
warning = 20;
critical = 10;
};
};
"bluetooth" = {
format = "";
format-disabled = "󰂲";
format-connected = "󰂱";
format-no-controller = "";
tooltip-format = "Devices connected: {num_connections}";
on-click = "omarchy-launch-bluetooth";
};
"pulseaudio" = {
format = "{icon}";
on-click = "omarchy-launch-or-focus-tui wiremix";
on-click-right = "pamixer -t";
tooltip-format = "Playing at {volume}%";
scroll-step = 5;
format-muted = "";
format-icons = {
default = ["" "" ""];
};
};
"group/tray-expander" = {
orientation = "inherit";
drawer = {
transition-duration = 600;
children-class = "tray-group-item";
};
modules = ["custom/expand-icon" "tray"];
};
"custom/expand-icon" = {
format = "";
tooltip = false;
};
"custom/screenrecording-indicator" = {
on-click = "omarchy-cmd-screenrecord";
# Note: $OMARCHY_PATH must be defined in your environment
exec = "$OMARCHY_PATH/default/waybar/indicators/screen-recording.sh";
signal = 8;
return-type = "json";
};
"tray" = {
icon-size = 12;
spacing = 17;
};
};
};
};
}
-88
View File
@@ -1,88 +0,0 @@
{
programs.waybar = {
style = ''
* {
background-color: #cdd6f4;
color: #181824;
border: none;
border-radius: 0;
min-height: 0;
font-family: 'JetBrainsMono Nerd Font';
font-size: 12px;
}
.modules-left {
margin-left: 8px;
}
.modules-right {
margin-right: 8px;
}
#workspaces button {
all: initial;
padding: 0 6px;
margin: 0 1.5px;
min-width: 9px;
}
#workspaces button.empty {
opacity: 0.5;
}
#cpu,
#battery,
#pulseaudio,
#custom-omarchy,
#custom-screenrecording-indicator,
#custom-update {
min-width: 12px;
margin: 0 7.5px;
}
#tray {
margin-right: 16px;
}
#bluetooth {
margin-right: 17px;
}
#network {
margin-right: 13px;
}
#custom-expand-icon {
margin-right: 18px;
}
tooltip {
padding: 2px;
}
#custom-update {
font-size: 10px;
}
#clock {
margin-left: 8.75px;
}
.hidden {
opacity: 0;
}
#custom-screenrecording-indicator {
min-width: 12px;
margin-left: 8.75px;
font-size: 10px;
}
#custom-screenrecording-indicator.active {
color: #a55555;
}
'';
};
}
-14
View File
@@ -1,14 +0,0 @@
{pkgs, ...}: {
programs.yazi = {
enable = true;
enableFishIntegration = true;
settings = {
manager = {
show_hidden = true;
sort_by = "natural";
sort_dir_first = true;
linemode = "size";
};
};
};
}
+78 -45
View File
@@ -1,55 +1,88 @@
{
myConfig = {
nixos = {
username = "kenji";
hostname = "hakase";
timezone = "America/Chicago";
shell = "fish"; # FIXME: unassigned variable
macos = {
Username = "lsoriano";
};
git = {
username = "kenji";
email = "kenji@hakase";
defaultBranch = "master";
essentials = {
# !!! replace it with your own, else system might malfunction.
Username = "kenji";
};
general = {
Terminal = {
font = "JetBrainsMono Nerd Font";
size = "18";
shell = "fish"; # or zsh
aliases = {};
};
allowUnfree = true;
};
ssh = {
# FIXME: anonymize
extraConfig = ''
Host macair
User biscuit
HostName 192.168.68.81
Host gitea.sakamoto.dev
User kenji
ProxyCommand cloudflared access ssh --hostname %h
HostName gitea.sakamoto.dev
'';
};
terminal = {
default = ["ghostty.desktop"];
aliases = {
update = "sudo nixos-rebuild switch --flake ~/.config/nixos-new/#hakase";
nixos = {
Hostname = "hakase";
Timezone = "America/Chicago";
enableSteamOS = false;
Boot = {
mode = "systemd"; # systemd or grub
};
Apps = {
packages = pkgs:
with pkgs; [
adwaita-icon-theme
jellyfin-media-player
delfin
goverlay
geekbench_6
gparted
ntfs3g
feishin
discord
xfce.thunar
];
};
Hyprland = {
monitors = [
# "DP-2, highres@165,0x1080,1,vrr,1"
# "DP-2, highres@180,0x1080,1,cm,hdr, sdrbrightness, 1.5, sdrsaturation, 0.98"
"DP-2, highres@180,0x1080,1,bitdepth,10,cm,hdr,sdrbrightness,1.4,sdrsaturation,0.98"
"DP-1, highres@highrr,760x0,1"
"HDMI-A-1, 1920x1080@120, 20000x20000,1"
# "HDMI-A-1, disabled"
];
};
Git = {
user = "kenji";
email = "kenji@hakase";
defaultBranch = "master";
};
};
hyprland = {
monitors = ["HDMI-A-1, 1920x1080@120, auto, 1"];
};
firefox = {
bookmarks = [
{
name = "Home Manager";
url = "https://mynixos.com/home-manager/options/programs";
}
{
name = "YouTube";
url = "https://youtube.com";
}
];
newtabpage = [
{
title = "Dashboard";
url = "https://dash.sakamoto.dev";
}
];
optionals = {
Builds = {
trustedUsers = [
"@groups"
];
buildMachines = [
{
hostName = "";
sshUser = "";
sshKey = "";
system = "";
supportedFeatures = ["apple-virt" "big-parallel" "kvm" "nixos-test"];
}
];
};
Ssh = {
extraConfig = ''
Host macair
User biscuit
HostName 192.168.68.81
Host gitea.sakamoto.dev
User kenji
ProxyCommand cloudflared access ssh --hostname %h
HostName gitea.sakamoto.dev
'';
};
};
};
}
Generated
+1784 -182
View File
File diff suppressed because it is too large Load Diff
+102 -9
View File
@@ -1,33 +1,70 @@
{
description = "Hakase Configuration";
description = "A rewrite of the original Sakamoto NixOS config.";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable";
jovian = {
url = "github:Jovian-Experiments/Jovian-NixOS";
inputs.nixpkgs.follows = "nixpkgs";
};
matugen = {
url = "github:/InioX/Matugen";
inputs.nixpkgs.follows = "nixpkgs";
# ref = "refs/tags/matugen-v0.10.0";
};
erosanix = {
url = "github:emmanuelrosa/erosanix";
inputs.nixpkgs.follows = "nixpkgs";
};
hyprland = {
url = "git+https://github.com/hyprwm/Hyprland?submodules=1";
inputs.nixpkgs.follows = "nixpkgs";
};
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
hyprland = {
url = "git+https://github.com/hyprwm/Hyprland?submodules=1";
darwin = {
url = "github:lnl7/nix-darwin";
inputs.nixpkgs.follows = "nixpkgs";
};
nixovim = {
# FIXME: treesitter does not install automatically (disabled due to read-only problems)
url = "git+https://git.sakamoto.dev/kenji/nixovim.git";
inputs.nixpkgs.follows = "nixpkgs";
};
sops-nix = {
url = "github:Mic92/sops-nix";
illogical-impulse = {
url = "git+https://git.sakamoto.dev/kenji/illogical-impulse.git";
inputs.nixpkgs.follows = "nixpkgs";
};
omarchy-nix = {
url = "git+https://git.sakamoto.dev/kenji/omarchy-nix.git";
inputs.nixpkgs.follows = "nixpkgs";
inputs.home-manager.follows = "home-manager";
};
};
outputs = {
self,
nixpkgs,
home-manager,
nixovim, # FIXME: should be inside of modules
sops-nix,
darwin,
chaotic,
jovian,
nixovim,
illogical-impulse,
erosanix,
omarchy-nix,
...
} @ inputs: let
config = import ./config.nix;
@@ -42,11 +79,67 @@
hakase = nixpkgs.lib.nixosSystem {
specialArgs = args;
modules = [
chaotic.nixosModules.default
home-manager.nixosModules.home-manager
sops-nix.nixosModules.sops
jovian.nixosModules.default
erosanix.nixosModules.protonvpn
./hosts/hakase/configuration.nix
];
};
hakase-omarchy = nixpkgs.lib.nixosSystem {
specialArgs = args;
modules = [
chaotic.nixosModules.default
omarchy-nix.nixosModules.default
home-manager.nixosModules.home-manager
./hosts/hakase-omarchy/configuration.nix
];
};
vanilla = nixpkgs.lib.nixosSystem {
specialArgs = args;
modules = [
./hosts/vanilla/configuration.nix
# nixovim.packages.${system}.full
];
};
};
homeConfigurations = {
hakase = home-manager.lib.homeManagerConfiguration {
pkgs = import nixpkgs {
config.allowUnfree = true;
extraSpecialArgs = args;
};
modules = [
home-manager.nixosModules.home-manager
./home/hakase.nix
];
};
hakase-omarchy = home-manager.lib.homeManagerConfiguration {
pkgs = import nixpkgs {
config.allowUnfree = true;
extraSpecialArgs = args;
};
modules = [
home-manager.nixosModules.home-manager
./home/hakase-omarchy.nix
];
};
};
darwinConfigurations = {
macos = darwin.lib.darwinSystem {
system = "aarch64-darwin";
specialArgs =
{
inherit inputs;
system = "aarch64-darwin";
}
// config;
modules = [
home-manager.darwinModules.home-manager
./hosts/macos/darwin.nix
];
};
};
};
}
+15
View File
@@ -0,0 +1,15 @@
{
config,
pkgs,
inputs,
...
}: {
imports = [
../modules/home/terminal.nix
];
programs.home-manager.enable = true;
home.packages = [];
home.stateVersion = "25.11";
}
+15
View File
@@ -0,0 +1,15 @@
{
config,
pkgs,
inputs,
...
}: {
imports = [
# ... your other imports
inputs.omarchy-nix.homeManagerModules.default # Assuming you have a system module too
];
# ADD THIS BLOCK
home.stateVersion = "25.05";
}
+11 -5
View File
@@ -1,11 +1,17 @@
{pkgs, ...}: {
{
pkgs,
inputs,
...
}: let
info = import ../config.nix;
in {
imports = [
# inputs.chaotic.homeManagerModules.default
../modules/home/desktop.nix
../modules/home/terminal.nix
../modules/home/apps.nix
../modules/home/apps-optional.nix
../modules/home/hyprland.nix
../modules/home/waybar.nix
];
# nix.package = pkgs.nix;
home.packages = info.myConfig.nixos.Apps.packages pkgs;
home.stateVersion = "25.05";
}
+156
View File
@@ -0,0 +1,156 @@
{
pkgs,
myConfig,
specialArgs,
...
}: {
imports = [
../../modules/default/boot.nix
./hardware-configuration.nix
];
system.stateVersion = "25.05";
i18n.defaultLocale = "en_US.UTF-8";
time.timeZone = "${myConfig.nixos.Timezone}";
nixpkgs.config.allowUnfree = myConfig.general.allowUnfree;
console = {
earlySetup = false;
font = "${pkgs.terminus_font}/share/consolefonts/ter-132n.psf.gz";
packages = with pkgs; [terminus_font];
useXkbConfig = true;
};
users = {
# defaultUserShell = pkgs.${myConfig.general.Terminal.shell};
users = {
${myConfig.essentials.Username} = {
isNormalUser = true;
extraGroups = ["wheel" "networkmanager" "input" "video"];
initialHashedPassword = "$y$j9T$NHFtSwF4NJtEmgMjy4Xdg.$9WQltjEx3eEfZ7GbpGLW8lBhJtiXPOeIawrxdmx0.vB";
useDefaultShell = true;
packages = [];
};
};
};
omarchy = {
full_name = "${myConfig.essentials.Username}"; # Or variable
email_address = "${myConfig.nixos.Git.email}";
};
home-manager = {
backupFileExtension = "backup";
useGlobalPkgs = true;
useUserPackages = true;
extraSpecialArgs = specialArgs;
users.${myConfig.essentials.Username} = import ../../home/hakase-omarchy.nix;
};
networking = {
useDHCP = false;
wireless = {
enable = false;
};
networkmanager.enable = true;
firewall = {
enable = true;
allowedTCPPorts = [22 80 531];
allowedUDPPorts = [53 531 5353];
};
proxy = {
default = null;
noProxy = null;
};
};
systemd = {
# network.enable = true;
# extraConfig = "DefaultTimeoutStopSec=5s";
};
nix = {
settings = {
experimental-features = ["nix-command" "flakes"];
};
};
#
# hardware = {
# enableAllFirmware = true;
# logitech.wireless.enable = true;
#
# bluetooth = {
# enable = true;
# powerOnBoot = true;
# settings = {
# General = {
# # AutoEnable = true;
# Experimental = true;
# MultiProfile = "multiple";
# FastConnectable = true;
# # ControllerMode = "bredr";
# };
# Policy = {
# AutoEnable = true;
# };
# };
# };
#
# graphics = {
# enable = true;
# enable32Bit = true;
# };
#
# xone.enable = true;
# };
#
# security.rtkit.enable = true;
# programs = {
# bash.interactiveShellInit = ''
# if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]; then
# shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
# exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
# fi
# '';
# zsh.enable = true;
# fish.enable = true;
#
# appimage = {
# enable = true;
# binfmt = true;
# };
#
# ssh.extraConfig = myConfig.optionals.Ssh.extraConfig;
# };
# jovian.steamos.enableMesaPatches = true;
#
# services = {
# displayManager.sessionPackages = [
# inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland
# ];
#
# getty.autologinUser = lib.mkOverride 10 "${myConfig.essentials.Username}";
#
# flatpak.enable = true;
# seatd.enable = true;
# upower.enable = true;
# scx.enable = true;
# libinput.enable = true;
# blueman.enable = true;
# printing.enable = true;
# openssh.enable = true;
#
# pipewire = {
# enable = true;
# alsa = {
# enable = true;
# support32Bit = true;
# };
# pulse.enable = true;
# };
# };
}
@@ -0,0 +1,33 @@
# Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{
imports =
[ (modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/mapper/luks-9091013c-0763-40a6-8316-d44d52df3530";
fsType = "ext4";
};
boot.initrd.luks.devices."luks-9091013c-0763-40a6-8316-d44d52df3530".device = "/dev/disk/by-uuid/9091013c-0763-40a6-8316-d44d52df3530";
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/B332-BF84";
fsType = "vfat";
options = [ "fmask=0077" "dmask=0077" ];
};
swapDevices = [ ];
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}
+168 -5
View File
@@ -1,11 +1,174 @@
{
pkgs,
myConfig,
inputs,
lib,
specialArgs,
...
}: {
imports = [
./hardware-configuration.nix
../../modules/system/default.nix
../../modules/system/hyprland.nix
];
imports =
[
./hardware-configuration.nix
../../modules/default/apps.nix
../../modules/default/desktop.nix
../../modules/default/remote.nix
../../modules/default/gaming.nix
../../modules/default/udev.nix
../../modules/default/boot.nix
../../modules/default/dev.nix
../../modules/default/security.nix
]
++ lib.optionals (myConfig.nixos.enableSteamOS == false) [
../../modules/default/login.nix
];
system.stateVersion = "25.05";
i18n.defaultLocale = "en_US.UTF-8";
time.timeZone = "${myConfig.nixos.Timezone}";
console = {
earlySetup = false;
font = "${pkgs.terminus_font}/share/consolefonts/ter-132n.psf.gz";
packages = with pkgs; [terminus_font];
useXkbConfig = true;
};
users = {
defaultUserShell = pkgs.${myConfig.general.Terminal.shell};
users = {
${myConfig.essentials.Username} = {
isNormalUser = true;
extraGroups = ["wheel" "networkmanager" "input" "video"];
initialHashedPassword = "$y$j9T$NHFtSwF4NJtEmgMjy4Xdg.$9WQltjEx3eEfZ7GbpGLW8lBhJtiXPOeIawrxdmx0.vB";
useDefaultShell = true;
packages = [];
};
};
};
home-manager = {
backupFileExtension = "backup";
useGlobalPkgs = true;
useUserPackages = true;
extraSpecialArgs = specialArgs;
users.${myConfig.essentials.Username} = import ../../home/hakase.nix;
};
nixpkgs.config.allowUnfree = myConfig.general.allowUnfree;
nix = {
distributedBuilds = true;
settings = {
builders-use-substitutes = true;
trusted-users = myConfig.optionals.Builds.trustedUsers;
experimental-features = ["nix-command" "flakes"];
};
};
hardware = {
enableAllFirmware = true;
logitech.wireless.enable = true;
bluetooth = {
enable = true;
powerOnBoot = true;
settings = {
General = {
Enable = "Source,Sink,Media,Socket";
# AutoEnable = true;
Experimental = true;
MultiProfile = "multiple";
FastConnectable = true;
# ControllerMode = "bredr";
};
Policy = {
AutoEnable = true;
};
};
};
graphics = {
enable = true;
enable32Bit = true;
};
xone.enable = true;
};
networking = {
useDHCP = false;
wireless = {
enable = false;
};
networkmanager.enable = true;
firewall = {
enable = true;
allowedTCPPorts = [22 80];
allowedUDPPorts = [53];
};
proxy = {
default = null;
noProxy = null;
};
};
systemd = {
# network.enable = true;
# extraConfig = "DefaultTimeoutStopSec=5s";
};
security.rtkit.enable = true;
programs = {
bash.interactiveShellInit = ''
if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]; then
shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
fi
'';
zsh.enable = true;
fish.enable = true;
appimage = {
enable = true;
binfmt = true;
};
ssh.extraConfig = myConfig.optionals.Ssh.extraConfig;
};
# jovian.steamos.enableMesaPatches = true;
services = {
displayManager.sessionPackages = [
inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland
];
getty.autologinUser = lib.mkOverride 10 "${myConfig.essentials.Username}";
flatpak.enable = true;
seatd.enable = true;
upower.enable = true;
scx.enable = true;
libinput.enable = true;
blueman.enable = true;
printing.enable = true;
openssh.enable = true;
pipewire = {
enable = true;
alsa = {
enable = true;
support32Bit = true;
};
pulse.enable = true;
};
avahi = {
enable = true;
nssmdns4 = true;
openFirewall = true;
};
};
}
+34
View File
@@ -0,0 +1,34 @@
{
pkgs,
myConfig,
inputs,
system,
specialArgs,
...
}: {
imports = [
../../modules/default/darwin.nix
];
environment.systemPackages = [];
nix.settings.experimental-features = "nix-command flakes";
# nix.settings.trusted-users = myConfig.optionals.Builds.trustedUsers;
programs.zsh.enable = true; # default shell on catalina
programs.fish.enable = true;
system.stateVersion = 5;
nixpkgs.hostPlatform = "aarch64-darwin";
security.pam.services.sudo_local.touchIdAuth = true;
users.users.${myConfig.macos.Username} = {
name = "${myConfig.macos.Username}";
home = "/Users/${myConfig.macos.Username}";
};
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = specialArgs;
home-manager.users.${myConfig.macos.Username} = import ../../home/darwin.nix;
}
+133
View File
@@ -0,0 +1,133 @@
# Edit this configuration file to define what should be installed on
# your system. Help is available in the configuration.nix(5) man page, on
# https://search.nixos.org/options and in the NixOS manual (`nixos-help`).
{
config,
lib,
pkgs,
myConfig,
inputs,
...
}: {
imports = [
# Include the results of the hardware scan.
./hardware-configuration.nix
];
# Use the systemd-boot EFI boot loader.
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
# networking.hostName = "nixos"; # Define your hostname.
# Pick only one of the below networking options.
# networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.
networking.networkmanager.enable = true; # Easiest to use and most distros use this by default.
# Set your time zone.
time.timeZone = "${myConfig.nixos.Timezone}";
# Configure network proxy if necessary
# networking.proxy.default = "http://user:password@proxy:port/";
# networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";
# Select internationalisation properties.
i18n.defaultLocale = "en_US.UTF-8";
console = {
earlySetup = false;
font = "${pkgs.terminus_font}/share/consolefonts/ter-132n.psf.gz";
packages = with pkgs; [terminus_font];
useXkbConfig = true;
};
# Enable the X11 windowing system.
# services.xserver.enable = true;
# Configure keymap in X11
# services.xserver.xkb.layout = "us";
# services.xserver.xkb.options = "eurosign:e,caps:escape";
# Enable CUPS to print documents.
# services.printing.enable = true;
# Enable sound.
# services.pulseaudio.enable = true;
# OR
services.pipewire = {
enable = true;
pulse.enable = true;
};
hardware.bluetooth.enable = true;
services = {
blueman.enable = true;
};
# Enable touchpad support (enabled default in most desktopManager).
# services.libinput.enable = true;
# Define a user account. Don't forget to set a password with passwd.
users.users.${myConfig.essentials.Username} = {
isNormalUser = true;
extraGroups = ["wheel"]; # Enable sudo for the user.
packages = with pkgs; [
tree
];
};
# programs.firefox.enable = true;
# List packages installed in system profile.
# You can use https://search.nixos.org/ to find more packages (and options).
environment.systemPackages = with pkgs; [
inputs.nixovim.packages.${system}.full
# linux-firmware
vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
wget
];
hardware.firmware = [
pkgs.linux-firmware
];
# Some programs need SUID wrappers, can be configured further or are
# started in user sessions.
# programs.mtr.enable = true;
# programs.gnupg.agent = {
# enable = true;
# enableSSHSupport = true;
# };
# List services that you want to enable:
# Enable the OpenSSH daemon.
services.openssh.enable = true;
# Open ports in the firewall.
# networking.firewall.allowedTCPPorts = [ ... ];
# networking.firewall.allowedUDPPorts = [ ... ];
# Or disable the firewall altogether.
# networking.firewall.enable = false;
# Copy the NixOS configuration file and link it from the resulting system
# (/run/current-system/configuration.nix). This is useful in case you
# accidentally delete configuration.nix.
# system.copySystemConfiguration = true;
# This option defines the first version of NixOS you have installed on this particular machine,
# and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions.
#
# Most users should NEVER change this value after the initial install, for any reason,
# even if you've upgraded your system to a new NixOS release.
#
# This value does NOT affect the Nixpkgs version your packages and OS are pulled from,
# so changing it will NOT upgrade your system - see https://nixos.org/manual/nixos/stable/#sec-upgrading for how
# to actually do that.
#
# This value being lower than the current NixOS release does NOT mean your system is
# out of date, out of support, or vulnerable.
#
# Do NOT change this value unless you have manually inspected all the changes it would make to your configuration,
# and migrated your data accordingly.
#
# For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion .
system.stateVersion = "25.11"; # Did you read the comment?
}
+47
View File
@@ -0,0 +1,47 @@
# Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{
imports =
[ (modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usbhid" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/disk/by-uuid/9f701bae-3392-4927-b27d-a905dd67edab";
fsType = "btrfs";
options = [ "subvol=@" ];
};
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/894C-F998";
fsType = "vfat";
options = [ "fmask=0077" "dmask=0077" ];
};
fileSystems."/home" =
{ device = "/dev/disk/by-uuid/780aa81f-c4d6-478b-9c51-2d60362fdb07";
fsType = "ext4";
};
swapDevices =
[ { device = "/dev/disk/by-uuid/b02ef55c-4caf-4a24-a6a2-fb8001eafe22"; }
];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's
# still possible to use this option, but it's recommended to use it in conjunction
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
networking.useDHCP = lib.mkDefault true;
# networking.interfaces.enp11s0.useDHCP = lib.mkDefault true;
# networking.interfaces.wlp10s0.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}
+28
View File
@@ -0,0 +1,28 @@
{pkgs, ...}: {
environment.systemPackages = with pkgs; [
usbutils
pciutils
pavucontrol
wget
dualsensectl
protontricks
wl-clipboard
tldr
anki
lact
lm_sensors
grim
];
imports = [
../../packages/virtualbox/default.nix
# ../../packages/lact/default.nix
];
hardware.amdgpu.overdrive.enable = true;
services.lact.enable = true;
# services = {
# protonvpn = {
# enable = true;
# autostart = true;
# };
# };
}
+68
View File
@@ -0,0 +1,68 @@
{
myConfig,
lib,
pkgs,
...
}: {
boot = {
loader = {
timeout = 0;
efi = {
canTouchEfiVariables = true;
efiSysMountPoint = "/boot";
};
limine = lib.mkIf (myConfig.nixos.Boot.mode == "limine") {
enable = true;
maxGenerations = 5;
};
systemd-boot = lib.mkIf (myConfig.nixos.Boot.mode == "systemd") {
enable = true;
# xbootldrMountPoint = "/boot";
edk2-uefi-shell.enable = true;
edk2-uefi-shell.sortKey = "z_edk2";
};
# grub ain't that great for advanced setups such as using a secure boot.
grub = lib.mkIf (myConfig.nixos.Boot.mode == "grub") {
enable = true;
efiSupport = true;
device = "nodev";
useOSProber = true;
};
};
plymouth = {
enable = false;
theme = "seal";
themePackages = with pkgs; [
(adi1090x-plymouth-themes.override {
selected_themes = ["seal"];
})
];
};
# blacklistedKernelModules = ["tpm_crb" "tpm_tis" "tpm"];
kernelPackages = pkgs.linuxPackages_cachyos;
kernelParams = [
# "quiet"
# "splash"
"boot.shell_on_fail"
"udev.log_priority=3"
"rd.systemd.show_status=auto"
"kvm.enable_virt_at_load=0"
];
initrd = {
systemd.enable = true;
kernelModules = [];
verbose = false;
};
consoleLogLevel = 0;
};
hardware.amdgpu.initrd.enable = true;
}
+5
View File
@@ -0,0 +1,5 @@
{
imports = [
../../packages/python/default.nix
];
}
+12
View File
@@ -0,0 +1,12 @@
{
lib,
myConfig,
pkgs,
...
}: {
imports = [
# ../../packages/quickshell/default.nix
../../packages/hyprland/default.nix
../../packages/sunshine/default.nix
];
}
+8
View File
@@ -0,0 +1,8 @@
{pkgs, ...}: {
imports = [
../../packages/python/default.nix
];
environment.systemPackages = with pkgs; [
p7zip
];
}
+14
View File
@@ -0,0 +1,14 @@
{
lib,
myConfig,
...
}: {
imports =
[
../../packages/steam/default.nix
]
++ lib.optionals (myConfig.nixos.enableSteamOS == true)
[
../../packages/steam/jovian.nix
];
}
+27
View File
@@ -0,0 +1,27 @@
# file: configuration.nix
{
pkgs,
lib,
...
}: let
sources = import ./nix/sources.nix;
lanzaboote = import sources.lanzaboote;
in {
imports = [lanzaboote.nixosModules.lanzaboote];
environment.systemPackages = [
# For debugging and troubleshooting Secure Boot.
pkgs.sbctl
];
# Lanzaboote currently replaces the systemd-boot module.
# This setting is usually set to true in configuration.nix
# generated at installation time. So we force it to false
# for now.
boot.loader.systemd-boot.enable = lib.mkForce false;
boot.lanzaboote = {
enable = true;
pkiBundle = "/var/lib/sbctl";
};
}
+13
View File
@@ -0,0 +1,13 @@
{
lib,
myConfig,
...
}: {
services.greetd = {
enable = true;
settings.default_session = {
user = lib.mkOverride 10 "${myConfig.essentials.Username}";
command = lib.mkOverride 10 "Hyprland";
};
};
}
+6
View File
@@ -0,0 +1,6 @@
{
imports = [
# ../../packages/moondeck-buddy/appimage.nix
../../packages/sunshine/default.nix
];
}
+9
View File
@@ -0,0 +1,9 @@
{pkgs, ...}: {
imports = [
# ./lanzaboote.nix
];
environment.systemPackages = with pkgs; [
niv
sbctl
];
}
+9
View File
@@ -0,0 +1,9 @@
{pkgs, ...}: {
# services.udev.extraRules = ''
# SUBSYSTEM=="usb", ATTR{idVendor}=="0e8d", ATTR{idProduct}=="0616", ATTR{power/wakeup}="enabled"
#
# '';
services.udev.packages = with pkgs; [
game-devices-udev-rules
];
}
-5
View File
@@ -1,5 +0,0 @@
{
imports = [
../../apps/jellyfin-tui/home.nix
];
}
+16 -5
View File
@@ -1,8 +1,19 @@
{
{pkgs, ...}: {
imports = [
../../apps/yazi/home.nix
../../apps/gemini/home.nix
../../apps/firefox/home.nix
../../apps/starship/home.nix
../../packages/firefox/home.nix
];
home.packages = with pkgs; [
heroic
# fcitx5
# fcitx5-mozc-ut
# kdePackages.fcitx5-configtool
solaar
parted
edk2-uefi-shell
libreoffice
];
services.easyeffects = {
enable = true;
};
}
+28
View File
@@ -0,0 +1,28 @@
{
inputs,
pkgs,
lib,
...
}: {
imports = [
inputs.illogical-impulse.homeManagerModules.default
../../packages/fonts/home.nix
];
programs.illogical-impulse.enable = true;
programs.illogical-impulse.settings = {
hyprland.useNixForConf = false;
simpleStarship.enable = true;
};
# wayland.windowManager.hyprland = {
# settings = {
# monitor = lib.mkForce [
# "DP-1, highres@180,0x1080,1,bitdepth,10,cm,hdr,sdrbrightness,1.4,sdrsaturation,0.98"
# "DP-2, highres@highrr,760x0,1"
# ];
# };
# };
# programs.illogical-impulse.settings.simpleStarship.enable = true;
home.packages = [
];
}
-5
View File
@@ -1,5 +0,0 @@
{
imports = [
../../apps/hyprland/home.nix
];
}
+6
View File
@@ -0,0 +1,6 @@
{
imports = [
# ../../packages/moondeck-buddy/appimage.nix
../../packages/sunshine/default.nix
];
}
+15 -5
View File
@@ -1,9 +1,19 @@
{
imports = [
../../apps/neovim/neovim.nix
../../apps/git/home.nix
../../apps/zoxide/home.nix
../../apps/fish/home.nix
../../apps/ghostty/home.nix
../../packages/fish/home.nix
../../packages/kitty/home.nix
../../packages/neovim/home.nix
# ../../packages/starship/home.nix
../../packages/fastfetch/home.nix
../../packages/zsh/home.nix
../../packages/zoxide/home.nix
../../packages/fonts/home.nix
../../packages/git/home.nix
../../packages/btop/home.nix
../../packages/eza/home.nix
../../packages/cloudflared/home.nix
];
}
-6
View File
@@ -1,6 +0,0 @@
{
imports = [
../../apps/waybar/home.nix
../../apps/waybar/deps.nix
];
}
-21
View File
@@ -1,21 +0,0 @@
{pkgs, ...}: {
imports = [
../../system/time.nix
../../system/boot.nix
../../system/amd.nix
../../system/hardware.nix
../../system/home-manager.nix
../../system/services.nix
../../system/user.nix
../../system/version.nix
../../system/fonts.nix
../../system/programs.nix
../../system/security.nix
../../system/variables.nix
];
environment.systemPackages = with pkgs; [
# FIXME: must be on their own app
git
cloudflared
];
}
-6
View File
@@ -1,6 +0,0 @@
{
imports = [
../../apps/hyprland/default.nix
../../apps/walker/default.nix
];
}
+27
View File
@@ -0,0 +1,27 @@
{
"lanzaboote": {
"branch": "master",
"description": "Secure Boot for NixOS [maintainers=@blitz @raitobezarius @nikstur]",
"homepage": "",
"owner": "nix-community",
"repo": "lanzaboote",
"rev": "v0.4.2",
"sha256": "0xc1wawnb0297h5khxblmf9pd1fry950xkcm7mwlck19s2906h80",
"type": "tarball",
"url": "https://github.com/nix-community/lanzaboote/archive/v0.4.2.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz",
"version": "0.4.2"
},
"nixpkgs": {
"branch": "nixos-unstable",
"description": "Nix Packages collection",
"homepage": null,
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "6c43a3495a11e261e5f41e5d7eda2d71dae1b2fe",
"sha256": "16f329z831bq7l3wn1dfvbkh95l2gcggdwn6rk3cisdmv2aa3189",
"type": "tarball",
"url": "https://github.com/NixOS/nixpkgs/archive/6c43a3495a11e261e5f41e5d7eda2d71dae1b2fe.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
}
}
+198
View File
@@ -0,0 +1,198 @@
# This file has been generated by Niv.
let
#
# The fetchers. fetch_<type> fetches specs of type <type>.
#
fetch_file = pkgs: name: spec:
let
name' = sanitizeName name + "-src";
in
if spec.builtin or true then
builtins_fetchurl { inherit (spec) url sha256; name = name'; }
else
pkgs.fetchurl { inherit (spec) url sha256; name = name'; };
fetch_tarball = pkgs: name: spec:
let
name' = sanitizeName name + "-src";
in
if spec.builtin or true then
builtins_fetchTarball { name = name'; inherit (spec) url sha256; }
else
pkgs.fetchzip { name = name'; inherit (spec) url sha256; };
fetch_git = name: spec:
let
ref =
spec.ref or (
if spec ? branch then "refs/heads/${spec.branch}" else
if spec ? tag then "refs/tags/${spec.tag}" else
abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!"
);
submodules = spec.submodules or false;
submoduleArg =
let
nixSupportsSubmodules = builtins.compareVersions builtins.nixVersion "2.4" >= 0;
emptyArgWithWarning =
if submodules
then
builtins.trace
(
"The niv input \"${name}\" uses submodules "
+ "but your nix's (${builtins.nixVersion}) builtins.fetchGit "
+ "does not support them"
)
{ }
else { };
in
if nixSupportsSubmodules
then { inherit submodules; }
else emptyArgWithWarning;
in
builtins.fetchGit
({ url = spec.repo; inherit (spec) rev; inherit ref; } // submoduleArg);
fetch_local = spec: spec.path;
fetch_builtin-tarball = name: throw
''[${name}] The niv type "builtin-tarball" is deprecated. You should instead use `builtin = true`.
$ niv modify ${name} -a type=tarball -a builtin=true'';
fetch_builtin-url = name: throw
''[${name}] The niv type "builtin-url" will soon be deprecated. You should instead use `builtin = true`.
$ niv modify ${name} -a type=file -a builtin=true'';
#
# Various helpers
#
# https://github.com/NixOS/nixpkgs/pull/83241/files#diff-c6f540a4f3bfa4b0e8b6bafd4cd54e8bR695
sanitizeName = name:
(
concatMapStrings (s: if builtins.isList s then "-" else s)
(
builtins.split "[^[:alnum:]+._?=-]+"
((x: builtins.elemAt (builtins.match "\\.*(.*)" x) 0) name)
)
);
# The set of packages used when specs are fetched using non-builtins.
mkPkgs = sources: system:
let
sourcesNixpkgs =
import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) { inherit system; };
hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath;
hasThisAsNixpkgsPath = <nixpkgs> == ./.;
in
if builtins.hasAttr "nixpkgs" sources
then sourcesNixpkgs
else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then
import <nixpkgs> { }
else
abort
''
Please specify either <nixpkgs> (through -I or NIX_PATH=nixpkgs=...) or
add a package called "nixpkgs" to your sources.json.
'';
# The actual fetching function.
fetch = pkgs: name: spec:
if ! builtins.hasAttr "type" spec then
abort "ERROR: niv spec ${name} does not have a 'type' attribute"
else if spec.type == "file" then fetch_file pkgs name spec
else if spec.type == "tarball" then fetch_tarball pkgs name spec
else if spec.type == "git" then fetch_git name spec
else if spec.type == "local" then fetch_local spec
else if spec.type == "builtin-tarball" then fetch_builtin-tarball name
else if spec.type == "builtin-url" then fetch_builtin-url name
else
abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}";
# If the environment variable NIV_OVERRIDE_${name} is set, then use
# the path directly as opposed to the fetched source.
replace = name: drv:
let
saneName = stringAsChars (c: if (builtins.match "[a-zA-Z0-9]" c) == null then "_" else c) name;
ersatz = builtins.getEnv "NIV_OVERRIDE_${saneName}";
in
if ersatz == "" then drv else
# this turns the string into an actual Nix path (for both absolute and
# relative paths)
if builtins.substring 0 1 ersatz == "/" then /. + ersatz else /. + builtins.getEnv "PWD" + "/${ersatz}";
# Ports of functions for older nix versions
# a Nix version of mapAttrs if the built-in doesn't exist
mapAttrs = builtins.mapAttrs or (
f: set: with builtins;
listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set))
);
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295
range = first: last: if first > last then [ ] else builtins.genList (n: first + n) (last - first + 1);
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L257
stringToCharacters = s: map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1));
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L269
stringAsChars = f: s: concatStrings (map f (stringToCharacters s));
concatMapStrings = f: list: concatStrings (map f list);
concatStrings = builtins.concatStringsSep "";
# https://github.com/NixOS/nixpkgs/blob/8a9f58a375c401b96da862d969f66429def1d118/lib/attrsets.nix#L331
optionalAttrs = cond: as: if cond then as else { };
# fetchTarball version that is compatible between all the versions of Nix
builtins_fetchTarball = { url, name ? null, sha256 }@attrs:
let
inherit (builtins) lessThan nixVersion fetchTarball;
in
if lessThan nixVersion "1.12" then
fetchTarball ({ inherit url; } // (optionalAttrs (name != null) { inherit name; }))
else
fetchTarball attrs;
# fetchurl version that is compatible between all the versions of Nix
builtins_fetchurl = { url, name ? null, sha256 }@attrs:
let
inherit (builtins) lessThan nixVersion fetchurl;
in
if lessThan nixVersion "1.12" then
fetchurl ({ inherit url; } // (optionalAttrs (name != null) { inherit name; }))
else
fetchurl attrs;
# Create the final "sources" from the config
mkSources = config:
mapAttrs
(
name: spec:
if builtins.hasAttr "outPath" spec
then
abort
"The values in sources.json should not have an 'outPath' attribute"
else
spec // { outPath = replace name (fetch config.pkgs name spec); }
)
config.sources;
# The "config" used by the fetchers
mkConfig =
{ sourcesFile ? if builtins.pathExists ./sources.json then ./sources.json else null
, sources ? if sourcesFile == null then { } else builtins.fromJSON (builtins.readFile sourcesFile)
, system ? builtins.currentSystem
, pkgs ? mkPkgs sources system
}: rec {
# The sources, i.e. the attribute set of spec name to spec
inherit sources;
# The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers
inherit pkgs;
};
in
mkSources (mkConfig { }) // { __functor = _: settings: mkSources (mkConfig settings); }
@@ -1,7 +1,5 @@
{pkgs, ...}: {
home.packages = with pkgs; [
pamixer
wiremix
impala
bibata-cursors
];
}
+9
View File
@@ -0,0 +1,9 @@
{
programs.btop = {
enable = true;
settings = {
vim_keys = true;
theme_background = false;
};
};
}
@@ -1,5 +1,5 @@
{pkgs, ...}: {
home.packages = with pkgs; [
jellyfin-tui
cloudflared
];
}
+12
View File
@@ -0,0 +1,12 @@
{pkgs, ...}: {
programs.eza = {
enable = true;
git = true;
colors = "auto";
icons = "auto";
enableZshIntegration = true;
enableFishIntegration = true;
enableBashIntegration = true;
};
}
+131
View File
@@ -0,0 +1,131 @@
{
programs.fastfetch = {
enable = true;
settings = {
logo = {
padding = {
top = 2;
left = 1;
right = 2;
};
};
display = {
separator = " ";
};
modules = [
# Title
{
type = "title";
format = "{#1} {#}{user-name-colored}";
}
# System Information Header
{
type = "custom";
format = "{#1} {#}System Information";
}
{
type = "os";
key = " {#keys}󰍹 OS";
}
{
type = "kernel";
key = " {#keys}󰒋 Kernel";
}
{
type = "uptime";
key = " {#keys}󰅐 Uptime";
}
{
type = "packages";
key = " {#keys}󰏖 Packages";
format = "{all}";
}
{
type = "custom";
format = "{#1}";
}
# Desktop Environment
{
type = "custom";
format = "{#1} {#}Desktop Environment";
}
{
type = "de";
key = " {#keys}󰧨 DE";
}
{
type = "wm";
key = " {#keys}󱂬 WM";
}
{
type = "wmtheme";
key = " {#keys}󰉼 Theme";
}
{
type = "display";
key = " {#keys}󰹑 Resolution";
}
{
type = "shell";
key = " {#keys}󰞷 Shell";
}
{
type = "terminalfont";
key = " {#keys}󰛖 Font";
}
{
type = "custom";
format = "{#1}";
}
# Hardware Information
{
type = "custom";
format = "{#1} {#}Hardware Information";
}
{
type = "cpu";
key = " {#keys}󰻠 CPU";
}
{
type = "gpu";
key = " {#keys}󰢮 GPU";
}
{
type = "memory";
key = " {#keys}󰍛 Memory";
}
{
type = "disk";
key = " {#keys}󰋊 Disk (/)";
folders = "/";
}
{
type = "custom";
format = "{#1}";
}
# Colors
{
type = "colors";
key = "";
symbol = "circle";
}
# Footer
{
type = "custom";
format = "{#1}";
}
];
};
};
}
@@ -1,47 +1,16 @@
{
pkgs,
myConfig,
...
}: {
programs.firefox = {
enable = true;
languagePacks = ["en-US"];
languagePacks = [
"en-US"
];
profiles = {
hakase = {
search.force = true;
isDefault = true;
search.default = "ddg";
# Full declarative mode enabled.
# Note: Manual bookmarks added in the UI will be overwritten on next rebuild.
bookmarks = {
force = true;
settings = [
{
name = "Toolbar Bookmarks";
toolbar = true;
bookmarks = myConfig.firefox.bookmarks;
}
];
};
settings = {
# --- Privacy & Hardening ---
"browser.contentblocking.category" = "strict";
"privacy.trackingprotection.enabled" = true;
"privacy.resistFingerprinting" = true; # Note: Spoofs timezone and caps FPS to 60
"geo.enabled" = false;
"media.peerconnection.enabled" = false; # Prevents WebRTC IP leaks
"network.dns.disablePrefetch" = true;
"network.prefetch-next" = false;
# --- NixOS / Hyprland Integration ---
"widget.use-xdg-desktop-portal.file-picker" = 1; # Use native file picker
# --- UI & Behavior ---
"browser.compactmode.show" = true;
"browser.tabs.closeWindowWithLastTab" = false;
"extensions.pocket.enabled" = false;
"extensions.screenshots.disabled" = true;
"browser.topsites.contile.enabled" = false;
@@ -59,14 +28,31 @@
"browser.newtabpage.activity-stream.showSponsored" = false;
"browser.newtabpage.activity-stream.system.showSponsored" = false;
"browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
# --- Homepage & Navigation ---
"browser.startup.homepage" = "https://dash.sakamoto.dev";
"browser.newtabpage.pinned" = myConfig.firefox.newtabpage;
# --- DNS over HTTPS (Quad9) ---
"network.trr.mode" = 2; # Use DoH with system fallback
"network.trr.uri" = "https://dns.quad9.net/dns-query";
"browser.newtabpage.pinned" = [
{
title = "Dashboard";
url = "https://dash.sakamoto.dev";
}
];
};
bookmarks = {
force = true;
settings = [
{
toolbar = true;
bookmarks = [
{
name = "Home Manager";
url = "https://mynixos.com/home-manager/options/programs";
}
{
name = "YouTube";
url = "https://youtube.com";
}
];
}
];
};
};
};
@@ -76,7 +62,7 @@
DisableFirefoxStudies = true;
EnableTrackingProtection = {
Value = true;
Locked = false;
Locked = true;
Cryptomining = true;
Fingerprinting = true;
};
@@ -87,31 +73,40 @@
OverrideFirstRunPage = "";
OverridePostUpdatePage = "";
DontCheckDefaultBrowser = true;
DisplayBookmarksToolbar = "always";
SearchBar = "unified";
# Power User Messaging
UserMessaging = {
ExtensionRecommendations = false;
SkipOnboarding = true;
FeatureRecommendations = false;
UrlbarInterventions = false;
WhatsNew = false;
};
DisplayBookmarksToolbar = "always"; # alternatives: "always" or "newtab"
DisplayMenuBar = "default-off"; # alternatives: "always", "never" or "default-on"
SearchBar = "unified"; # alternative: "separate"
/*
---- EXTENSIONS ----
*/
# Check about:support for extension/add-on ID strings.
# Valid strings for installation_mode are "allowed", "blocked",
# "force_installed" and "normal_installed".
ExtensionSettings = {
"*".installation_mode = "allowed";
"uBlock0@raymondhill.net" = {
install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi";
installation_mode = "force_installed";
};
"{446900e4-71c2-419f-a6a7-df9c091e268b}" = {
install_url = "https://addons.mozilla.org/firefox/downloads/latest/bitwarden-password-manager/latest.xpi";
install_url = "https://addons.mozilla.org/firefox/downloads/file/4493940/bitwarden_password_manager-2025.5.0.xpi";
installation_mode = "force_installed";
};
"tridactyl.vim@cmcaine.co.uk" = {
install_url = "https://addons.mozilla.org/firefox/downloads/latest/tridactyl-vim/latest.xpi";
install_url = "https://addons.mozilla.org/firefox/downloads/file/4405615/tridactyl_vim-1.24.2.xpi";
installation_mode = "force_installed";
};
# Privacy Badger:
# "jid1-MnnxcxisBPnSXQ@jetpack" = {
# install_url = "https://addons.mozilla.org/firefox/downloads/latest/privacy-badger17/latest.xpi";
# installation_mode = "force_installed";
# };
# 1Password:
# "{d634138d-c276-4fc8-924b-40a0ea21d284}" = {
# install_url = "https://addons.mozilla.org/firefox/downloads/latest/1password-x-password-manager/latest.xpi";
# installation_mode = "force_installed";
# };
};
};
};
@@ -9,9 +9,9 @@
set fish_greeting
fish_vi_key_bindings
zoxide init fish | source
zoxide init fish --cmd cd | source
'';
shellAliases = myConfig.terminal.aliases;
shellAliases = myConfig.general.Terminal.aliases;
plugins = with pkgs.fishPlugins; [
];
+8
View File
@@ -0,0 +1,8 @@
{pkgs, ...}: {
fonts = {
fontconfig.enable = true;
};
home.packages = with pkgs; [
nerd-fonts.jetbrains-mono
];
}
+10
View File
@@ -0,0 +1,10 @@
{myConfig, ...}: {
programs.git = {
enable = true;
extraConfig = {
user.name = "${myConfig.nixos.Git.user}";
user.email = "${myConfig.nixos.Git.email}";
init.defaultBranch = "${myConfig.nixos.Git.defaultBranch}";
};
};
}
+38
View File
@@ -0,0 +1,38 @@
{...}: {
services.hypridle = {
enable = true;
settings = {
general = {
lock_cmd = "pidof hyprlock || hyprlock"; # avoid starting multiple hyprlock instances.
before_sleep_cmd = "loginctl lock-session"; # lock before suspend.
after_sleep_cmd = "hyprctl dispatch dpms on && agu"; # avoid needing to press a key twice to turn on the display.
};
listener = [
# {
# timeout = 150;
# on-timeout = "brightnessctl -s set 10"; # set monitor backlight to minimum, avoid 0 on OLED monitor.
# on-resume = "brightnessctl -r"; # restore monitor backlight.
# }
# {
# timeout = 150;
# on-timeout = "brightnessctl -sd rgb:kbd_backlight set 0"; # turn off keyboard backlight.
# on-resume = "brightnessctl -rd rgb:kbd_backlight"; # turn on keyboard backlight.
# }
# {
# timeout = 300;
# on-timeout = "loginctl lock-session"; # lock screen when timeout has passed.
# }
# {
# timeout = 330;
# on-timeout = "hyprctl dispatch dpms off"; # screen off after 5.5min.
# on-resume = "hyprctl dispatch dpms on && brightnessctl -r"; # screen on and restore brightness on resume.
# }
{
timeout = 500;
on-timeout = "systemctl suspend"; # suspend PC after 30min.
}
];
};
};
}
+42
View File
@@ -0,0 +1,42 @@
{
config,
pkgs,
myConfig,
...
}: {
wayland.windowManager.hyprland.settings = {
animations = {
enabled = true;
bezier = [
"linear, 0, 0, 1, 1"
"md3_standard, 0.2, 0, 0, 1"
"md3_decel, 0.05, 0.7, 0.1, 1"
"md3_accel, 0.3, 0, 0.8, 0.15"
"overshot, 0.05, 0.9, 0.1, 1.1"
"crazyshot, 0.1, 1.5, 0.76, 0.92"
"hyprnostretch, 0.05, 0.9, 0.1, 1.0"
"menu_decel, 0.1, 1, 0, 1"
"menu_accel, 0.38, 0.04, 1, 0.07"
"easeInOutCirc, 0.85, 0, 0.15, 1"
"easeOutCirc, 0, 0.55, 0.45, 1"
"easeOutExpo, 0.16, 1, 0.3, 1"
"softAcDecel, 0.26, 0.26, 0.15, 1"
"md2, 0.4, 0, 0.2, 1"
];
animation = [
"windows, 1, 3, md3_decel, popin 60%"
"windowsIn, 1, 3, md3_decel, popin 60%"
"windowsOut, 1, 3, md3_accel, popin 60%"
"border, 1, 10, default"
"fade, 1, 3, md3_decel"
"layersIn, 1, 3, menu_decel, slide"
"layersOut, 1, 1.6, menu_accel"
"fadeLayersIn, 1, 2, menu_decel"
"fadeLayersOut, 1, 0.5, menu_accel"
"workspaces, 1, 7, menu_decel, slide"
"specialWorkspace, 1, 3, md3_decel, slidevert"
];
};
};
}
+300
View File
@@ -0,0 +1,300 @@
{
config,
pkgs,
...
}: {
wayland.windowManager.hyprland.settings = {
exec = [
"hyprctl dispatch submap global"
];
submap = [
"global"
];
# Shell keybinds
bindi = [
"$mod, Super_L, global, caelestia:launcher" # bind to `bind` because `bindi` maps to it
# Launcher
];
bindin =
[
"$mod, catchall, global, caelestia:launcherInterrupt"
"$mod, mouse:272, global, caelestia:launcherInterrupt"
"$mod, mouse:273, global, caelestia:launcherInterrupt"
"$mod, mouse:274, global, caelestia:launcherInterrupt"
"$mod, mouse:275, global, caelestia:launcherInterrupt"
"$mod, mouse:276, global, caelestia:launcherInterrupt"
"$mod, mouse:277, global, caelestia:launcherInterrupt"
"$mod, mouse_up, global, caelestia:launcherInterrupt"
"$mod, mouse_down, global, caelestia:launcherInterrupt"
"$mod, K, global, caelestia:launcherInterrupt"
"$mod, H, global, caelestia:launcherInterrupt"
"$mod, J, global, caelestia:launcherInterrupt"
"$mod, L, global, caelestia:launcherInterrupt"
"$mod, S, global, caelestia:launcherInterrupt"
"$mod, G, global, caelestia:launcherInterrupt"
"$mod, T, global, caelestia:launcherInterrupt"
"$mod, D, global, caelestia:launcherInterrupt"
"$mod, Escape, global, caelestia:launcherInterrupt"
"$mod, PERIOD, global, caelestia:launcherInterrupt"
"$mod, SPACE, global, caelestia:launcherInterrupt"
"$mod, E, global, caelestia:launcherInterrupt"
"$mod, V, global, caelestia:launcherInterrupt"
"$mod, W, global, caelestia:launcherInterrupt"
"$mod, Q, global, caelestia:launcherInterrupt"
"$mod, C, global, caelestia:launcherInterrupt"
"$mod, Return, global, caelestia:launcherInterrupt"
]
++ (
# Go to workspace group #
builtins.concatLists (builtins.genList (
i: let
ws = i + 1;
in [
"$mod, ${toString ws}, global, caelestia:launcherInterrupt"
]
)
9)
)
++ [
"$mod, 0, global, caelestia:launcherInterrupt"
];
bind =
[
# Misc
"Control+Alt, Delete, exec, caelestia:session"
"$mod ALT, A, global, caelestia:showall"
"$mod ALT, L, global, caelestia:lock"
"$mod, SPACE, exec, rofi -show drun"
# Restore lock - these are `bindl` in your original, but `exec` should be fine here.
# However, `bindl` is typically for a *release* event. If `caelestia shell -d` is a daemon,
# and `caelestia:lock` is a quickshell internal, you might need to reconsider.
# For direct translation, they go into `bindl` list.
# Media - handled by bindl below
# Apps
"$mod, Return, exec, app2unit -- kitty"
"$mod, W, exec, app2unit -- firefox"
"$mod, E, exec, app2unit -- thunar"
"$mod, Q, killactive"
"$mod ALT, E, exec, app2unit -- nemo"
"Control+Alt, Escape, exec, app2unit -- qps"
"Control+Alt, V, exec, app2unit -- pavucontrol"
# Utilities
"$mod SHIFT, S, global, caelestia:screenshotFreeze"
"$mod SHIFT ALT, S, global, caelestia:screenshot"
"$mod ALT, R, exec, caelestia record -s"
"Control+Alt, R, exec, caelestia record"
"$mod SHIFT ALT, R, exec, caelestia record -r"
"$mod SHIFT, C, exec, hyprpicker -a" # Colour picker
# Sleep
"$mod SHIFT, PRINT, exec, systemctl suspend-then-hibernate"
# Clipboard and emoji picker
"$mod, V, exec, pkill fuzzel || caelestia clipboard"
"$mod ALT, V, exec, pkill fuzzel || caelestia clipboard -d"
"$mod, Period, exec, pkill fuzzel || caelestia emoji -p"
# Testing
# This is a `bindl` (key release), so move it to `bindl` list below.
# Window actions
"$mod, H, movefocus, l"
"$mod, L, movefocus, r"
"$mod, K, movefocus, u"
"$mod, J, movefocus, d"
"$mod SHIFT, H, movewindow, l"
"$mod SHIFT, L, movewindow, r"
"$mod SHIFT, K, movewindow, u"
"$mod SHIFT, J, movewindow, d"
"$mod CTRL, Backslash, centerwindow, 1"
"$mod CTRL ALT, Backslash, resizeactive, exact 55% 70%"
"$mod CTRL ALT, Backslash, centerwindow, 1"
"$mod ALT, Backslash, exec, caelestia pip"
"$mod, P, pin"
"$mod, F, fullscreen, 0"
"$mod ALT, F, fullscreen, 1"
# Special workspace toggles
"Control+Shift, Escape, exec, caelestia toggle sysmon"
"$mod, Escape, exec, caelestia toggle sysmon"
"$mod, M, exec, caelestia toggle music"
"$mod, D, exec, caelestia toggle communication"
"$mod, R, exec, caelestia toggle todo"
"$mod, G, togglespecialworkspace, gaming"
"$mod SHIFT, G, movetoworkspace, special:gaming"
"$mod, T, exec, caelestia toggle steam"
# "$mod, T, togglespecialworkspace, special:steam"
# "$mod SHIFT, T, movetoworkspace, special:steam"
# Toggle special workspace
"$mod, S, exec, caelestia toggle specialws"
# Window groups
"$mod, Comma, togglegroup"
"$mod SHIFT, Comma, lockactivegroup, toggle"
# Go to workspace -1/+1 (mouse binds are `bind` for mouse-wheel)
"$mod, mouse_down, workspace, -1"
"$mod, mouse_up, workspace, +1"
# Move window to workspace -1/+1
"$mod ALT, mouse_down, movetoworkspace, -1"
"$mod ALT, mouse_up, movetoworkspace, +1"
# Move window to/from special workspace
"$mod CTRL SHIFT, up, movetoworkspace, special:special"
"$mod CTRL SHIFT, down, movetoworkspace, e+0"
"$mod ALT, S, movetoworkspace, special:special"
]
++ (
# Go to workspace #
let
wsaction = "~/.config/hypr/scripts/wsaction.fish";
in
builtins.concatLists (builtins.genList (
i: let
ws = i + 1;
in [
"$mod, ${toString ws}, exec, ${wsaction} workspace ${toString ws}"
]
)
9) # For workspaces 1-9
)
++ [
# "$mod, 0, exec, ${config.wayland.windowManager.hyprland.settings.workspaceRule."0".exec} workspace 10" # Workaround for workspace 0
# Re-adding `wsaction` since it's used here.
"$mod, 0, exec, ~/.config/hypr/scripts/wsaction.fish workspace 10"
]
++ (
# Go to workspace group #
let
wsaction = "~/.config/hypr/scripts/wsaction.fish";
in
builtins.concatLists (builtins.genList (
i: let
ws = i + 1;
in [
"Control+$mod, ${toString ws}, exec, ${wsaction} -g workspace ${toString ws}"
]
)
9)
)
++ [
"Control+$mod, 0, exec, ~/.config/hypr/scripts/wsaction.fish -g workspace 10"
]
++ (
# Move window to workspace #
let
wsaction = "~/.config/hypr/scripts/wsaction.fish";
in
builtins.concatLists (builtins.genList (
i: let
ws = i + 1;
in [
"$mod SHIFT, ${toString ws}, exec, ${wsaction} movetoworkspace ${toString ws}"
]
)
9)
)
++ [
"$mod SHIFT, 0, exec, ~/.config/hypr/scripts/wsaction.fish movetoworkspace 10"
]
++ (
# Move window to workspace group #
let
wsaction = "~/.config/hypr/scripts/wsaction.fish";
in
builtins.concatLists (builtins.genList (
i: let
ws = i + 1;
in [
"Control+$mod ALT, ${toString ws}, exec, ${wsaction} -g movetoworkspace ${toString ws}"
]
)
9)
)
++ [
"Control+$mod ALT, 0, exec, ~/.config/hypr/scripts/wsaction.fish -g movetoworkspace 10"
];
binde = [
"$mod, Minus, splitratio, -0.1"
"$mod, Equal, splitratio, 0.1"
"Control+$mod, left, workspace, -1"
"$mod, Page_Up, workspace, -1"
"Control+$mod, right, workspace, +1"
"$mod, Page_Down, workspace, +1"
"$mod ALT, Page_Up, movetoworkspace, -1"
"$mod ALT, Page_Down, movetoworkspace, +1"
"Control+$mod SHIFT, right, movetoworkspace, +1"
"Control+$mod SHIFT, left, movetoworkspace, -1"
"Alt, Tab, cyclenext, activewindow" # `binde` for cycle next
"Control+Alt, Tab, changegroupactive, f" # `binde` for change group active
];
bindm = [
"$mod, mouse:272, movewindow"
"$mod, Z, movewindow"
"$mod, mouse:273, resizewindow"
"$mod, X, resizewindow"
];
bindl = [
# Restore lock
"$mod ALT, L, exec, caelestia shell -d"
"$mod ALT, L, global, caelestia:lock" # This is a Hyprland `global` command, not an `exec`
# Brightness
", XF86MonBrightnessUp, global, caelestia:brightnessUp"
", XF86MonBrightnessDown, global, caelestia:brightnessDown"
# Media
"Control+$mod, Space, global, caelestia:mediaToggle"
", XF86AudioPlay, global, caelestia:mediaToggle"
", XF86AudioPause, global, caelestia:mediaToggle"
"Control+$mod, Equal, global, caelestia:mediaNext"
", XF86AudioNext, global, caelestia:mediaNext"
"Control+$mod, Minus, global, caelestia:mediaPrev"
", XF86AudioPrev, global, caelestia:mediaPrev"
", XF86AudioStop, global, caelestia:mediaStop"
# Utilities (screenshot is `bindl` in your original)
", Print, exec, caelestia screenshot" # Full screen capture > clipboard
# Volume
", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
"$mod SHIFT, M, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
# Clipboard and emoji picker (alternate paste is `bindl`)
"Control+Shift+Alt, V, exec, sleep 0.5s && ydotool type -d 1 \"$(cliphist list | head -1 | cliphist decode)\""
# Testing
"$mod ALT, f12, exec, notify-send -u low -i dialog-information-symbolic 'Test notification' \"Here's a really long message to test truncation and wrapping\\nYou can middle click or flick this notification to dismiss it!\" -a 'Shell' -A \"Test1=I got it!\" -A \"Test2=Another action\""
];
bindel = [
# Volume
", XF86AudioRaiseVolume, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ 0; wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 10%+"
", XF86AudioLowerVolume, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ 0; wpctl set-volume @DEFAULT_AUDIO_SINK@ 10%-"
];
bindr = [
# Kill/restart
"Control+$mod SHIFT, R, exec, qs -c caelestia kill"
"Control+$mod ALT, R, exec, qs -c caelestia kill; caelestia shell -d"
];
};
}
+27
View File
@@ -0,0 +1,27 @@
{
config,
pkgs,
myConfig,
...
}: {
wayland.windowManager.hyprland.settings = {
exec = [
"cp -L --no-preserve=mode --update=none ~/.config/hypr/scheme/default.conf ~/.config/hypr/scheme/current.conf"
];
source = [
"~/.config/hypr/scheme/current.conf"
];
group = {
groupbar = {
"text_color" = "rgb($onPrimary)";
"col.active" = "rgba($primaryd4)";
"col.inactive" = "rgba($outlined4)";
"col.locked_active" = "rgba($primaryd4)";
"col.locked_inactive" = "rgba($secondaryd4)";
};
};
misc = {
background_color = "rgb($surfaceVariant)";
};
};
}
+33
View File
@@ -0,0 +1,33 @@
{
config,
pkgs,
myConfig,
...
}: {
wayland.windowManager.hyprland.settings = {
decoration = {
rounding = 10;
rounding_power = 2;
active_opacity = 1.0;
inactive_opacity = 1.0;
dim_inactive = true;
dim_strength = 0.1;
dim_special = 0.8;
shadow = {
enabled = true;
range = 4;
render_power = 3;
color = "rgba(1a1a1aee)";
};
blur = {
enabled = true;
size = 3;
passes = 1;
vibrancy = 0.1696;
};
};
};
}
+31
View File
@@ -0,0 +1,31 @@
{
config,
pkgs,
myConfig,
...
}: {
wayland.windowManager.hyprland.settings = {
env = [
"HYPRCURSOR_THEME, Bibata-Original-Classic"
"HYPRCURSOR_SIZE, 24"
"QT_QPA_PLATFORMTHEME, qt5ct"
"QT_WAYLAND_DISABLE_WINDOWDECORATION, 1"
"QT_AUTO_SCREEN_SCALE_FACTOR, 1"
"XCURSOR_THEME, sweet-rainbow"
"XCURSOR_SIZE, 24"
"GDK_BACKEND, wayland,x11"
"QT_QPA_PLATFORM, wayland;xcb"
"SDL_VIDEODRIVER, wayland,x11"
"CLUTTER_BACKEND, wayland"
"ELECTRON_OZONE_PLATFORM_HINT, auto"
"XDG_CURRENT_DESKTOP, Hyprland"
"XDG_SESSION_TYPE, wayland"
"XDG_SESSION_DESKTOP, Hyprland"
"_JAVA_AWT_WM_NONREPARENTING, 1"
];
};
}
+27
View File
@@ -0,0 +1,27 @@
{
config,
pkgs,
myConfig,
...
}: {
wayland.windowManager.hyprland.settings = {
exec-once = [
# "[workspace special:communication silent] discord"
"[workspace special:steam silent] steam"
"[workspace special:preload silent] kitty --single-instance --hold fastfetch"
"[workspace special:preload silent] firefox"
"[workspace 1] kitty --single-instance --hold -e fish -C fastfetch"
"hyprctl setcursor Bibata-Modern-Ice 24"
"solaar -w hide"
# "sunshine"
# "moondeck-buddy"
"wl-paste --type text --watch cliphist store"
"wl-paste --type image --watch cliphist store"
"sleep 3 && caelestia shell"
];
};
}
+128
View File
@@ -0,0 +1,128 @@
{
config,
pkgs,
myConfig,
...
}: {
wayland.windowManager.hyprland.settings = {
# ######## Window rules ########
windowrule = [
"opaque, class:foot|equibop"
"center 1, floating:1, xwayland:0"
# Float
"float, class:guifetch"
"float, class:yad"
"float, class:zenity"
"float, class:wev"
"float, class:org\\.gnome\\.FileRoller" # Escaped backslash
"float, class:file-roller"
"float, class:blueman-manager"
"float, class:com\\.github\\.GradienceTeam\\.Gradience" # Escaped backslash
"float, class:feh"
"float, class:imv"
"float, class:system-config-printer"
"float, class:quickshell"
# Float, resize and center
"float, class:foot, title:nmtui"
"size 60% 70%, class:foot, title:nmtui"
"center 1, class:foot, title:nmtui"
"float, class:org\\.gnome\\.Settings"
"size 70% 80%, class:org\\.gnome\\.Settings"
"center 1, class:org\\.gnome\\.Settings"
"float, class:org\\.pulseaudio\\.pavucontrol|yad-icon-browser"
"size 60% 70%, class:org\\.pulseaudio\\.pavucontrol|yad-icon-browser"
"center 1, class:org\\.pulseaudio\\.pavucontrol|yad-icon-browser"
"float, class:nwg-look"
"size 50% 60%, class:nwg-look"
"center 1, class:nwg-look"
# Special workspaces
"workspace special:sysmon, class:btop"
"workspace special:music, class:feishin|Spotify|Supersonic"
"workspace special:music, initialTitle:Spotify( Free)?"
"workspace special:communication, class:discord|equibop|vesktop|whatsapp"
"workspace special:todo, class:Todoist"
"noinitialfocus, class:discord"
"focusonactivate 0, class:discord"
# Always full screen
# "fullscreen, title:^(Steam Big Picture Mode)$"
# "fullscreen, title:^(steam_app_.*)$"
# Dialogs
"float, title:(Select|Open)( a)? (File|Folder)(s)?"
"float, title:File (Operation|Upload)( Progress)?"
"float, title:.* Properties"
"float, title:Export Image as PNG"
"float, title:GIMP Crash Debug"
"float, title:Save As"
"float, title:Library"
# Picture in picture (resize and move done via script)
"move 100%-w-2% 100%-w-3%, title:Picture(-| )in(-| )[Pp]icture"
"keepaspectratio, title:Picture(-| )in(-| )[Pp]icture"
"float, title:Picture(-| )in(-| )[Pp]icture"
"pin, title:Picture(-| )in(-| )[Pp]icture"
# Steam
"workspace special:steam, class:steam"
"workspace special:gaming, class:^(steam_app_.*)$"
"rounding 10, title:, class:steam"
"float, title:Friends List, class:steam"
"immediate, class:steam_app_[0-9]+"
"idleinhibit always, class:steam_app_[0-9]+"
# ATLauncher console
"float, class:com-atlauncher-App, title:ATLauncher Console"
# Autodesk Fusion 360
"noblur, title:Fusion360|(Marking Menu), class:fusion360\\.exe" # Escaped backslash
# Ugh xwayland popups
"nodim, xwayland:1, title:win[0-9]+"
"noshadow, xwayland:1, title:win[0-9]+"
"rounding 10, xwayland:1, title:win[0-9]+"
];
# ######## Workspace rules ########
workspace = [
"w[tv1]s[false], gapsout:20, gapsin:20"
"f[1]s[false], gapsout:20, gapsin:20"
"1, monitor:DP-2, default:true"
"2, monitor:DP-2"
"3, monitor:DP-2"
"4, monitor:DP-1"
"5, monitor:DP-1"
"6, monitor:DP-1"
"special:gaming, monitor:DP-2, persistent:true"
"special:steam, monitor:DP-2, persistent:true, on-created-empty:steam"
];
# ######## Layer rules ########
layerrule = [
"animation fade, hyprpicker"
"animation fade, logout_dialog"
"animation fade, selection"
"animation fade, wayfreeze"
# Fuzzel
"animation popin 80%, launcher"
"blur, launcher"
# Shell
"noanim, caelestia-(launcher|osd|notifications|border-exclusion|area-picker)"
"animation fade, caelestia-(drawers|background)"
"order 1, caelestia-border-exclusion"
"order 2, caelestia-bar"
# The commented out lines below need to remain commented if you don't want them active
#"xray 1, caelestia-(border|launcher|bar|sidebar|navbar|mediadisplay|screencorners)"
#"blur, caelestia-.*"
#"blurpopups, caelestia-.*"
#"ignorealpha 0.57, caelestia-.*"
];
};
}
+13
View File
@@ -0,0 +1,13 @@
{
pkgs,
inputs,
myConfig,
lib,
...
}: {
programs.hyprland = {
enable = true;
package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland;
};
}
+86
View File
@@ -0,0 +1,86 @@
{
myConfig,
pkgs,
...
}: {
imports = [
./config/binds.nix
./config/execs.nix
./config/rules.nix
./config/animation.nix
./config/decoration.nix
./config/env.nix
./config/colours.nix
];
home.file.".config/hypr/scripts/wsaction.fish" = {
source = builtins.toPath ./scripts/wsaction.fish;
executable = true;
};
wayland.windowManager.hyprland = {
enable = true;
xwayland.enable = true;
systemd.enable = true;
settings = {
"$mod" = "SUPER";
"$term" = "kitty --single-instance";
"$browser" = "firefox";
"$wsaction" = "fish -c ./scripts/wsaction.fish";
"$widget" = "qs -c caelestia";
monitor = myConfig.nixos.Hyprland.monitors;
general = {
gaps_in = 2;
gaps_out = 5;
border_size = 2;
# col.active_border = "#0DB7D4FF";
# col.inactive_border = "#31313600";
# col = {
# "inactive_border" = "rgba(595959aa)";
# "active_border" = "rgba(33ccffee) rgba(00ff99ee) 45deg";
# };
resize_on_border = false;
allow_tearing = false;
layout = "dwindle";
};
dwindle = {
pseudotile = true;
preserve_split = true;
};
master = {
new_status = "master";
};
misc = {
force_default_wallpaper = -1;
disable_hyprland_logo = true;
};
input = {
kb_layout = "us";
follow_mouse = 1;
sensitivity = 0;
force_no_accel = true;
repeat_delay = 250;
repeat_rate = 35;
touchpad = {
natural_scroll = false;
};
numlock_by_default = true;
};
gestures = {
workspace_swipe = false;
};
binds = {
workspace_back_and_forth = true;
scroll_event_delay = 0;
};
};
};
}
+21
View File
@@ -0,0 +1,21 @@
#!/usr/bin/env fish
if test "$argv[1]" = '-g'
set group
set -e $argv[1]
end
if test (count $argv) -ne 2
echo 'Wrong number of arguments. Usage: ./wsaction.fish [-g] <dispatcher> <workspace>'
exit 1
end
set -l active_ws (hyprctl activeworkspace -j | jq -r '.id')
if set -q group
# Move to group
hyprctl dispatch $argv[1] (math "($argv[2] - 1) * 10 + $active_ws % 10")
else
# Move to ws in group
hyprctl dispatch $argv[1] (math "floor(($active_ws - 1) / 10) * 10 + $argv[2]")
end
+7
View File
@@ -0,0 +1,7 @@
{...}: {
programs.hyprlock = {
enable = true;
settings = {
};
};
}
+8
View File
@@ -0,0 +1,8 @@
{pkgs, ...}: {
# home.packages = with pkgs; [
# hyprsunset
# ];
services.hyprsunset = {
enable = true;
};
}
+31
View File
@@ -0,0 +1,31 @@
{
myConfig,
pkgs,
...
}: {
programs.kitty = {
enable = true;
# themeFile = "kanagawa";
themeFile = "Catppuccin-Mocha";
settings = {
confirm_os_window_close = 0;
window_padding_width = 10;
font_size = myConfig.general.Terminal.size;
font_family = myConfig.general.Terminal.font;
bold_font = "auto";
italic_font = "auto";
bold_italic_font = "auto";
shell = "${pkgs.${myConfig.general.Terminal.shell}}/bin/${myConfig.general.Terminal.shell}";
# optimization
input_delay = 0;
repaint_delay = 2;
sync_to_monitor = false;
wayland_enable_ime = false;
allow_remote_control = true;
};
# extraConfig = "include colors.conf";
};
}
+50
View File
@@ -0,0 +1,50 @@
{
config,
lib,
pkgs,
...
}: let
inherit (lib) mkEnableOption mkOption mkIf;
this = config.custom.lact;
configFile =
pkgs.runCommand "lact-config.yaml" {
json = pkgs.writers.writeJSON "lact-config.json" this.settings;
} ''
# Merge with the defaults
${lib.getExe pkgs.yq} -s '.[0] * .[1]' $json ${./lact-default-config.yaml} > config.json
# Convert keys to numeric values where possible. It depends on this for some reason.
${lib.getExe pkgs.yj} -jy -k < config.json > $out
'';
in {
options.custom.lact = {
enable = mkEnableOption "my LACT module";
settings = mkOption {
default = {};
type = lib.types.submodule {
freeformType = (pkgs.formats.yaml {}).type;
};
description = ''
Settings for LACT. Settings are merged with the defaults.
The easiest method of acquiring the settings is to delete
`/etc/lact/config.yaml`, enter your settings and look at the file.
'';
};
};
config = mkIf this.enable {
systemd.packages = with pkgs; [
lact
];
systemd.services.lactd.wantedBy = ["multi-user.target"];
environment.etc."lact/config.yaml" = mkIf (this.settings != {}) {
source = configFile;
};
systemd.services.lactd = {
# Restart if config changed
restartTriggers = mkIf (this.settings != {}) [configFile];
};
};
}
+8
View File
@@ -0,0 +1,8 @@
daemon:
log_level: info
admin_groups:
- wheel
- sudo
disable_clocks_cleanup: false
apply_settings_timer: 5
gpus: {}
@@ -1,5 +1,5 @@
{pkgs, ...}: {
home.packages = with pkgs; [
gemini-cli
lutris
];
}
+88
View File
@@ -0,0 +1,88 @@
{myConfig, ...}: {
programs.mangohud = {
enable = true;
enableSessionWide = true;
settings = {
legacy_layout = false;
horizontal = true;
background_alpha = 0.6;
round_corners = 10;
background_color = "000000";
font_size = 24;
text_color = "FFFFFF";
position = "top-left";
toggle_hud = "Shift_R+F12";
no_display = true;
pci_dev = "0:03:00.0";
table_columns = 3;
gpu_text = "GPU";
gpu_stats = true;
gpu_load_change = true;
gpu_load_value = [50 90];
gpu_load_color = ["FFFFFF" "FFAA7F" "CC0000"];
gpu_temp = true;
gpu_power = true;
gpu_color = "2E9762";
cpu_text = "CPU";
cpu_stats = true;
cpu_load_change = true;
cpu_load_value = [50 90];
cpu_load_color = ["FFFFFF" "FFAA7F" "CC0000"];
cpu_temp = true;
cpu_power = true;
cpu_color = "2E97CB";
vram = true;
vram_color = "AD64C1";
ram = true;
ram_color = "C26693";
battery = true;
battery_color = "00FF00";
fps = true;
fps_metrics = ["avg" "0.01"];
engine_version = true;
engine_color = "EB5B5B";
arch = true;
frame_timing = true;
frametime_color = "FA8000";
fps_limit_method = "late";
toggle_fps_limit = "Shift_L+F1";
fps_limit = 0;
resolution = true;
refresh_rate = true;
# custom_text = [
# "-"
# "$(cat /home/kenji/.config/goverlay/distro)"
# "-"
# "$(uname -r)"
# "Session:"
# "$(echo $XDG_SESSION_TYPE)"
# ];
fps_color_change = true;
fps_color = ["B22222" "FDFD09" "39F900"];
fps_value = [30 60];
time = true;
output_folder = "/home/${myConfig.essentials.Username}/.mangohud/";
log_duration = 30;
autostart_log = false;
log_interval = 100;
toggle_logging = "Shift_L+F2";
blacklist = [
"pamac-manager"
"lact"
"ghb"
"bitwig-studio"
"ptyxis"
"yumex"
];
};
};
}
+88
View File
@@ -0,0 +1,88 @@
# /etc/nixos/configuration.nix
{
config,
pkgs,
lib,
fetchurl,
myConfig,
...
}: let
moondeckBuddyWrapped = pkgs.appimageTools.wrapType2 {
pname = "moondeck-buddy";
version = "1.8.2";
src = pkgs.fetchurl {
url = "https://github.com/FrogTheFrog/moondeck-buddy/releases/download/v1.8.2/MoonDeckBuddy-1.8.2-x86_64.AppImage";
hash = "sha256-D+9XIi3pIwaAq22DGHWAUqKub778qHQSjCU0aIjXmYY="; # Don't forget to update this!
};
extraPkgs = pkgs:
with pkgs; [
steam
libappindicator-gtk3
];
desktopItems = [
(pkgs.makeDesktopItem {
name = "Moondeck Buddy";
exec = "moondeck-buddy";
icon = "applications-other";
comment = "A Sunshine/Moondeck Buddy.";
categories = ["Utility" "Productivity"];
})
];
meta = with lib; {
description = "Moondeck Buddy is an companion app for NVIDIA Sunshine/Moonlight.";
homepage = "https://github.com/FrogTheFrog/moondeck-buddy";
license = licenses.gpl3Only;
platforms = platforms.linux;
mainProgram = "moondeck-buddy";
};
};
in {
environment.systemPackages = with pkgs; [
moondeckBuddyWrapped
];
programs.appimage.enable = true;
programs.appimage.binfmt = true;
# --- Firewall Configuration ---
networking.firewall.allowedTCPPorts = [
59999 # Allow Moondeck Buddy to listen on this port
];
# If Moondeck Buddy also needs UDP, uncomment and add it here:
networking.firewall.allowedUDPPorts = [
59999
];
systemd.services.moondeck-buddy = {
description = "Moondeck Buddy service for Sunshine/Moonlight integration";
after = ["network-online.target" "display-manager.service"]; # Ensure display manager is up
wantedBy = ["multi-user.target"]; # Still autostart with multi-user target
serviceConfig = {
Type = "simple";
User = "${myConfig.essentials.Username}"; # <--- IMPORTANT: User *must* have access to the display
Group = "users";
ExecStart = "${moondeckBuddyWrapped}/bin/moondeck-buddy";
Restart = "on-failure";
RestartSec = 5;
# Crucial for GUI applications running as system services:
Environment = [
"DISPLAY=:0" # Assuming your main display is :0. This can vary.
# "XAUTHORITY=/home/your-username/.Xauthority" # Needed if using Xauthority
# If using Wayland, you might need XDG_RUNTIME_DIR and WAYLAND_DISPLAY
# "XDG_RUNTIME_DIR=/run/user/$(id -u your-username)"
# "WAYLAND_DISPLAY=wayland-0" # Or specific to your compositor
];
# You might also need to explicitly grant access, e.g., with xhost +
# but that's a security hole. Best is to rely on user authentication.
};
};
}
@@ -1,4 +1,5 @@
{
pkgs,
inputs,
system,
...
@@ -1,5 +1,5 @@
{pkgs, ...}: {
environment.systemPackages = with pkgs; [
git
python313Full
];
}
+16
View File
@@ -0,0 +1,16 @@
{
inputs,
pkgs,
system,
...
}: {
environment.systemPackages = [
inputs.caelestia-shell.packages.${system}.caelestia-shell
inputs.caelestia-shell.packages.${system}.caelestia-cli
inputs.caelestia-shell.packages.${system}.beat-detector
];
environment.sessionVariables = {
# Set CAELESTIA_BD_PATH to the store path of beat-detector
CAELESTIA_BD_PATH = "${inputs.caelestia-shell.packages.${system}.beat-detector}/bin/beat_detector";
};
}
+48
View File
@@ -0,0 +1,48 @@
{
pkgs,
inputs,
system,
...
}: let
caelestia-shell = pkgs.fetchFromGitea {
domain = "git.sakamoto.dev";
owner = "caelestia-dots";
repo = "shell";
rev = "main";
sha256 = "sha256-y9Wkh+9ND8GcUYhybXdEPTVY6gUb0jclnbbVi70l70Y=";
};
in {
imports = [
];
home.packages = with pkgs; [
inputs.quickshell.packages.${system}.default
wl-screenrec
libnotify
grim
foot
hyprpicker
qalculate-qt
fuzzel
inotify-tools
app2unit
fish
jq
fd
cliphist
(pkgs.python3.withPackages (python-pkgs:
with python-pkgs; [
aubio
pyaudio
numpy
]))
cava
bluez
ddcutil
brightnessctl
curl
material-symbols
];
home.file.".config/quickshell/caelestia" = {
source = caelestia-shell;
};
}
+8
View File
@@ -0,0 +1,8 @@
{pkgs, ...}: {
programs.rofi = {
enable = true;
plugins = with pkgs; [
rofi-calc
];
};
}
+4
View File
@@ -0,0 +1,4 @@
{pkgs, ...}: {
home.packages = with pkgs; [
];
}
+62
View File
@@ -0,0 +1,62 @@
{lib, ...}: {
programs.starship = {
enable = true;
settings = {
format = lib.concatStrings [
"$username"
"$hostname"
"$directory"
"$git_branch"
"$git_state"
"$git_status"
"$cmd_duration"
"$line_break"
"$python"
"$character"
];
directory = {
style = "blue";
};
character = {
success_symbol = "[](purple)";
error_symbol = "[](red)";
vimcmd_symbol = "[](green)";
};
git_branch = {
format = "[$branch]($style)";
style = "bright-black";
};
git_status = {
format = "[(*$conflicted$untracked$modified$staged$renamed$deleted) $ahead_behind$stashed]($style)";
style = "cyan";
conflicted = "";
untracked = "";
modified = "";
staged = "";
renamed = "";
deleted = "";
stashed = "";
};
git_state = {
format = "([$state( $progress_current/$progress_total)]($style)) ";
style = "bright-black";
};
cmd_duration = {
format = "[$duration]($style) ";
style = "yellow";
};
python = {
format = "[$virtualenv]($style) ";
style = "bright-black";
};
};
};
# home.file.".config/starship.toml" = {
# source = builtins.toPath ./pure.toml;
# };
}
+17
View File
@@ -0,0 +1,17 @@
{
pkgs,
myConfig,
...
}: {
programs.steam = {
enable = true;
remotePlay.openFirewall = true;
gamescopeSession.enable = true;
extraCompatPackages = with pkgs; [proton-ge-bin];
extraPackages = with pkgs; [
mangohud
gamescope-wsi
];
};
programs.gamemode.enable = true;
}
+35
View File
@@ -0,0 +1,35 @@
{pkgs, ...}: {
xdg.desktopEntries = {
steam = {
name = "Steam";
genericName = "Game Platform";
comment = "Play and discuss games.";
# exec = "${pkgs.mangohud}/bin/mangohud ${pkgs.steam}/bin/steam %U"; # The standard command to launch Steam
exec = "${pkgs.steam}/bin/steam %U"; # The standard command to launch Steam
terminal = false;
icon = "steam"; # Assumes the 'steam' icon is available in your icon theme
type = "Application";
categories = ["Game" "Network"];
mimeType = [
"x-scheme-handler/steam" # For handling steam:// links
];
actions = {
BigPicture = {
name = "Big Picture Mode";
# exec = "${pkgs.mangohud}/bin/mangohud ${pkgs.steam}/bin/steam steam://open/bigpicture";
exec = "${pkgs.steam}/bin/steam steam://open/bigpicture";
};
Store = {
name = "Store";
# exec = "${pkgs.mangohud}/bin/mangohud ${pkgs.steam}/bin/steam steam://store";
exec = "${pkgs.steam}/bin/steam steam://open/bigpicture";
};
Library = {
name = "Library";
# exec = "${pkgs.mangohud}/bin/mangohud ${pkgs.steam}/bin/steam steam://library";
exec = "${pkgs.steam}/bin/steam steam://open/bigpicture";
};
};
};
};
}
+46
View File
@@ -0,0 +1,46 @@
{
inputs,
pkgs,
myConfig,
lib,
...
}: {
imports = [
];
environment.sessionVariables = {
DECKY_HOME = "/home/${myConfig.essentials.Username}/homebrew";
DECKY_USER_HOME = "/home/${myConfig.essentials.Username}";
};
# environment.systemPackages = with pkgs; [inputs.jovian.packages.${system}.default];
jovian.steam = {
enable = true;
autoStart = true;
desktopSession = "hyprland";
user = "${myConfig.essentials.Username}";
environment = {
OUTPUT_CONNECTOR = "DP-1"; # Keep this
STEAM_GAMESCOPE_CMD_OPTIONS = "-O DP-1"; # Force override flag
};
};
jovian.decky-loader = {
enable = true;
stateDir = "/home/${myConfig.essentials.Username}/Games/Decky";
user = "${myConfig.essentials.Username}";
};
jovian.devices.steamdeck = {
enableControllerUdevRules = true;
};
# programs.gamescope = {
# enable = true;
# args = ["--output-name" "DP-1"];
# };
jovian.hardware.has.amd.gpu = true;
jovian.steamos.enableBluetoothConfig = true;
# jovian.steamos.useSteamOSConfig = true;
# jovian.devices.steamdeck.enableControllerUdevRules = true;
}
+57
View File
@@ -0,0 +1,57 @@
{pkgs, ...}: let
mangoConfigList = ["cpu_temp" "gpu_temp" "ram" "vram"];
mangoConfigStr = builtins.concatStringsSep "," mangoConfigList;
gamescopeArgsList = [
"--adaptive-sync"
"--hdr-enabled"
"--mangoapp"
"--rt"
"--steam"
];
gamescopeArgsStr = builtins.concatStringsSep " " gamescopeArgsList;
steamArgsList = [
"-pipewire-dmabuf"
"-tenfoot"
];
steamArgsStr = builtins.concatStringsSep " " steamArgsList;
myGamescopeSteamScript = pkgs.writeShellApplication {
name = "start-gamescope-steam";
runtimeInputs = [
pkgs.gamescope
pkgs.steam
pkgs.mangohud
];
text = ''
#!/usr/bin/env bash
set -xeuo pipefail
export MANGOHUD=1
export MANGOHUD_CONFIG="${mangoConfigStr}"
exec ${pkgs.gamescope}/bin/gamescope ${gamescopeArgsStr} -- ${pkgs.steam}/bin/steam ${steamArgsStr}
'';
};
in {
programs = {
gamescope = {
enable = true;
capSysNice = true;
};
steam = {
enable = true;
remotePlay.openFirewall = true;
dedicatedServer.openFirewall = true;
localNetworkGameTransfers.openFirewall = true;
gamescopeSession.enable = true;
};
};
hardware.xone.enable = true;
environment.loginShellInit = ''
[[ "$(tty)" = "/dev/tty1" ]] && ${myGamescopeSteamScript}/bin/start-gamescope-steam
'';
}
+43
View File
@@ -0,0 +1,43 @@
{
config,
lib,
pkgs,
...
}: let
cfg = config.programs.sunshine;
in {
options.programs.sunshine = with lib; {
enable = mkEnableOption "sunshine";
};
config = lib.mkIf cfg.enable {
networking.firewall.allowedTCPPortRanges = [
{
from = 47984;
to = 48010;
}
];
networking.firewall.allowedUDPPortRanges = [
{
from = 47998;
to = 48010;
}
];
security.wrappers.sunshine = {
owner = "root";
group = "root";
capabilities = "cap_sys_admin+p";
source = "${pkgs.sunshine}/bin/sunshine";
};
systemd.user.services.sunshine = {
description = "Sunshine self-hosted game stream host for Moonlight";
startLimitBurst = 5;
startLimitIntervalSec = 500;
serviceConfig = {
ExecStart = "${config.security.wrapperDir}/sunshine";
Restart = "on-failure";
RestartSec = "5s";
};
};
};
}
+6
View File
@@ -0,0 +1,6 @@
{
imports = [
./config.nix
];
programs.sunshine.enable = true;
}
+5
View File
@@ -0,0 +1,5 @@
{myConfig, ...}: {
virtualisation.virtualbox.host.enable = true;
users.extraGroups.vboxusers.members = ["${myConfig.essentials.Username}"];
virtualisation.virtualbox.host.enableExtensionPack = true;
}
@@ -2,8 +2,7 @@
programs.zoxide = {
enable = true;
enableFishIntegration = true;
options = [
"--cmd cd"
];
enableZshIntegration = true;
enableBashIntegration = true;
};
}
+36
View File
@@ -0,0 +1,36 @@
{
pkgs,
myConfig,
...
}: {
programs.zsh.enable = true;
programs.zoxide.enable = true;
programs.zsh = {
enableCompletion = false;
syntaxHighlighting.enable = false;
shellAliases = myConfig.general.Terminal.aliases;
history.size = 10000;
antidote = {
enable = true;
plugins = [
"MichaelAquilina/zsh-autoswitch-virtualenv"
"jeffreytse/zsh-vi-mode"
"zdharma-continuum/fast-syntax-highlighting kind:defer"
"zsh-users/zsh-autosuggestions kind:defer"
"zsh-users/zsh-history-substring-search kind:defer"
];
};
initContent = ''
# zsh-autocomplete
# bindkey -M menuselect '^M' .accept-line # run code when selected completion
autoload -Uz compinit
if [ "$(date +'%j')" != "$(stat -f '%Sm' -t '%j' ~/.zcompdump 2>/dev/null)" ]; then
compinit
else
compinit -C
fi
'';
};
}
Symlink
+1
View File
@@ -0,0 +1 @@
/nix/store/bbmjfn520yfij7z284imjm3dcfvs8fkx-nixos-system-nixos-25.11.20250630.3016b4b
-26
View File
@@ -1,26 +0,0 @@
hello: ENC[AES256_GCM,data:0NxDMh13g5abuc46q8WYpcVxZalJalE+dIhWZr0Ta6u1pbcrA1HH/8PQnRUIew==,iv:lQz0qVjjWJ6jajApiJ8x/fhAhpPLpDICR4eZnu0dCVw=,tag:F9brrGmlpOGaeFxTEJA54w==,type:str]
example_key: ENC[AES256_GCM,data:IJeH/2DXBN/WL7SMOQ==,iv:SFhmVUSiMTWrNxCRbSnQj1/Q4L1J+1H+YDWXRqQGgfk=,tag:T0LxlvqPc0ajqWFe1NR+Vw==,type:str]
#ENC[AES256_GCM,data:BFKNA5aiPIt5oWQIF6a9Cw==,iv:ez3Omp4B6bBYlt1tlpTYSXAfi/SrbJ03ILDUetAnf20=,tag:CFd05yXHZhu+lzLIe95azg==,type:comment]
example_array:
- ENC[AES256_GCM,data:bh+AhmfAe9Tp0D6WGLI=,iv:WSOnTzHWhkNJUcyhvHizb9RheYFNESZbJJ+G79GMQJs=,tag:chpWcINudyQIiWgdgrzSXA==,type:str]
- ENC[AES256_GCM,data:U+vm05ISl8ldk21+vwk=,iv:MKrw0o1FZ6Hzt0c6/gagbZb1jV12FSOUwiLoXr3QPac=,tag:LXOGzJSxkbEDbrIQuzWMog==,type:str]
example_number: ENC[AES256_GCM,data:ZVyoML4H0yZF3g==,iv:WTEu085WG5byuAPaPbAR0wCkBoMwvL2F6A6pFGkiuck=,tag:ZDdUBzl7tUJUhXv3bUlnZg==,type:float]
example_booleans:
- ENC[AES256_GCM,data:kPkHPw==,iv:dgj2RjGkfsRJoEB+cju5ceZa3/IBXccR0rcS+uYa4LA=,tag:8uDEVNqnq4DbiVHYTCvGFQ==,type:bool]
- ENC[AES256_GCM,data:mHvy44o=,iv:4KI2SHpq+as27W77puR7NEi5ILeYD0/YnYcF5/4Uq3I=,tag:QB5D0JOFZqZX5mVGf7j3NQ==,type:bool]
default_password: ENC[AES256_GCM,data:h+D4/V4Dstnlhut5LBIg9A==,iv:yrckE1BCwjvCGZYp/WlpYyRMZeWJMZE26QNQ/tvZIyY=,tag:S5it0ySU1MUNrItWNeYW/A==,type:str]
sops:
age:
- recipient: age1dhmt5tdyxd9zam542zkr9hq4tku7lzmf6j057sjtepk80deky5fqemczs5
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBKR0x1eHFCV1FvODF6MDVr
bXlQcTdQOUIyZW90RDhzYWxjU2pMQS84eFg4CjJvdDRyY1g3VmFzVUVMZFhwcEFv
OUk4U0U2SHFUWXVRTmcxdGpiSHhJZ00KLS0tICt1VjBvZWJRVlRqOHF2MTZyWmZq
UHFNTUdHdE9WaGJraW5OY25DQUdiYmMK2yANe44uUYavGc9UvLwOzpQH/kuY/g5D
8lNECUT7gfna7T0lEuBqafiUtRMJFgWLPqSk83pVg0FhQ5PJVtEqzw==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2025-12-24T22:27:52Z"
mac: ENC[AES256_GCM,data:etJw5g4joy063Y64ohU3H7KH6gpN1FBCbnlvf/HiMQW48rlHI8RnGWZDxMUAa0oO/cTcWpbQU9U6wLrn5lT2879m2lTqa/MuoibeViWdNMb9HrJ7nzlceWJlhCGq3feC91R1o/d3E90EXm3PC0s0AXx9PsaJ5k3rHdeITs7zbZQ=,iv:zUvj2+rS/T0lvzVbL/eFwTOMqd2pVwE9LtWEpxMaw6k=,tag:2SWFeV8dSI4wkbIYaA6IzA==,type:str]
unencrypted_suffix: _unencrypted
version: 3.11.0
-3
View File
@@ -1,3 +0,0 @@
{pkgs, ...}: {
hardware.amdgpu.initrd.enable = true;
}
-36
View File
@@ -1,36 +0,0 @@
{pkgs, ...}: {
boot = {
consoleLogLevel = 3;
initrd.verbose = false;
kernelParams = [
"quiet"
"splash"
"intremap=on"
"boot.shell_on_fail"
"udev.log_priority=3"
"rd.systemd.show_status=auto"
];
loader = {
systemd-boot = {
enable = true;
};
efi = {
canTouchEfiVariables = true;
efiSysMountPoint = "/boot";
};
};
initrd = {
systemd.enable = true;
};
plymouth = {
enable = true;
# themePackages = [
# (pkgs.adi1090x-plymouth-themes.override {
# selected_themes = ["circle_hud"];
# })
# ];
# theme = "circle_hud";
};
};
}
-6
View File
@@ -1,6 +0,0 @@
{pkgs, ...}: {
fonts.packages = with pkgs; [
nerd-fonts.fira-code
nerd-fonts.jetbrains-mono
];
}
-16
View File
@@ -1,16 +0,0 @@
{pkgs, ...}: {
hardware = {
bluetooth = {
enable = true;
powerOnBoot = true;
};
};
networking = {
networkmanager.enable = true;
firewall = {
enable = true;
allowedTCPPorts = [22 80];
allowedUDPPorts = [53];
};
};
}
-16
View File
@@ -1,16 +0,0 @@
{
specialArgs,
myConfig,
...
}: {
home-manager = {
backupFileExtension = "backup";
useGlobalPkgs = true;
useUserPackages = true;
extraSpecialArgs = specialArgs;
users.${myConfig.nixos.username} = import ../home/hakase.nix;
};
imports = [
];
}
-16
View File
@@ -1,16 +0,0 @@
{
pkgs,
myConfig,
...
}: {
programs = {
ssh.extraConfig = myConfig.ssh.extraConfig;
bash.interactiveShellInit = ''
if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]; then
shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
fi
'';
fish.enable = true;
};
}

Some files were not shown because too many files have changed in this diff Show More