80 Commits

Author SHA1 Message Date
kenji f4bb5e4ca8 fix(bitwarden): resize, center, and fix background execution
- Float to 600x800 centered on the active monitor after title match
- Fix socat -u so the daemon works when launched in the background
- Add debug logging to /tmp/hypr-window-rules.log

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 13:03:58 -05:00
kenji 1a435a8676 add(bitwarden): added window rule for bitwarden extension via socket listening 2026-05-31 12:47:43 -05:00
kenji 53f9e2d925 feat(hyprpaper): now hovers over previously selected wallpaper 2026-05-31 12:21:53 -05:00
kenji c85ba7f69b fix(matugen): source dominant color as priority
it will no longer prompt user to pick a color
2026-05-31 12:10:59 -05:00
kenji 263133a86a fix(matugen): update to version 4.1.0
issue regarding old version as to error change of color
2026-05-31 12:02:50 -05:00
kenji 4c37e35d2c fix(monitor): removed HDR
deadlock is not compatible with HDR (will have graphical issue)
2026-05-31 11:48:10 -05:00
kenji 99f57dca0c fix(monitor): DP-1 sdrbrightness has incorrect syntax 2026-05-30 10:36:12 -05:00
kenji b5f2538c19 update(hyprland): switched to hyprland 0.55.1 2026-05-28 12:12:21 -05:00
kenji 91f91212db update(apps): vicinae updated 2026-05-28 10:14:27 -05:00
kenji 9071abeacc fix(steam): steam now only shows up on special workspace. 2026-05-28 09:27:09 -05:00
CLAUDE AI f7ab887ed0 revert(hypr): remove game-focus-watcher, restore steam rules
Keep only DP-1 forcing changes: gamingMonitor variable, monitor rules
for steam_app/mkGameRules, gaming-focus script, and SUPER+G binding.

Remove game-focus-watcher (caused game freeze on workspace switch).
Revert steam workspace rule back to title:Steam only.
Revert ghostty exec-once order.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-28 08:18:42 -05:00
CLAUDE AI fe0d006f2e fix(hypr): reliable gaming workspace focus across monitors
- Add gaming-focus script: closes special workspace on DP-1 via
  --batch dispatch (fixes async race), then focuses gaming workspace;
  replaces raw workspace binding for SUPER+G
- Add game-focus-watcher: listens on Hyprland socket, auto-focuses
  gaming workspace when a game launches regardless of current monitor
- Fix monitor 0 → DP-1 in mkGameRules and steam_app windowrules
- Fix steam dialogs leaking to normal workspaces (broaden workspace
  rule from title:Steam to all class:steam)
- Extract gamingMonitor variable as single source of truth
- Drop redundant workspace dispatch after togglespecialworkspace to
  prevent game freeze on special→gaming transition

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-28 08:13:47 -05:00
CLAUDE AI 40b7db2c00 fix(hypr): reliable gaming workspace focus across monitors
- Add game-focus-watcher: listens on hyprland socket, auto-focuses
  gaming workspace when a game opens, closing any special workspace
  on DP-1 first via --batch to avoid async dispatch races
- Add gaming-focus script: SUPER+G now handles special workspaces on
  DP-1 regardless of focused monitor, with toggle-back behavior
- Fix steam windowrule to send all class:steam windows to special:steam,
  not just title:Steam, preventing dialogs leaking to normal workspaces
- Fix monitor 0 -> monitor DP-1 in mkGameRules and steam_app rules
  so games always launch at correct resolution on the gaming monitor
- Extract gamingMonitor variable as single source of truth
2026-05-28 07:57:33 -05:00
kenji 4205ab5429 fix(firefox): now used as default instead of chromium
there were instance where chromium is opened by default.
2026-05-25 07:54:52 -05:00
kenji 8c43b183eb add(flatpak): some auto-installation on .flatpak extension.
will remain unused for now...
2026-05-24 22:35:33 -05:00
kenji 8c5200d2fb add(nixos): flatpak support
used for deadlock mod manager flatpak
2026-05-24 22:16:57 -05:00
kenji 38ba89c2b7 update(nix): updated nixpkgs 2026-05-21 20:59:55 -05:00
kenji d22beb4580 fix(hypr): plugins future proofing via following hyprland pkgs
although hyprlandPlugins is an easy way to handle plugins, it is not
great due to pkg incompatibility.
2026-05-21 20:59:17 -05:00
kenji ccbd2362b2 upd 2026-05-17 18:51:07 -05:00
kenji 9b85f9edd5 upd 2026-05-07 11:45:52 -05:00
kenji 459ad6081b fix(mpv): changed size again for testing 2026-05-07 11:42:09 -05:00
kenji 1c1ba8b776 add(hyprland): workspace-toggle
workspace-toggle force workspace toggle between special and nonspecial;
improve user intuitive action.
2026-05-07 11:34:56 -05:00
kenji f76b350d94 feat(waybar): workspace 6-... replaced with 1-5
visual clarity
2026-05-07 11:30:59 -05:00
kenji 25ad6502fc feat(cursor): replaced cursor with modern ice bibata
for visual clarity
2026-05-07 11:30:27 -05:00
kenji ba8c0bdf3d refactor(optional-apps): wireshark removed
finished with testing
2026-05-07 11:29:49 -05:00
kenji c161673102 fix(wireshark): removed dumpcap 2026-05-07 11:29:16 -05:00
kenji 6929369c28 feat(mpv): size change 2026-05-07 11:29:00 -05:00
kenji ee4ab0e8a6 add(CLAUDE): more info 2026-05-07 09:00:08 -05:00
kenji f7108a173a add(nixos): wireshark and her tools
used for testing wh80 keyboard
2026-04-11 07:46:30 -05:00
kenji 0a3f0ada27 refactor(apps): removed redundant via
i added `via` originally to test out qmk keyboard, but it turns out to
be redundant.
2026-04-04 17:14:14 -05:00
kenji 74699ff880 add(anki): set .apkg files open to anki by default
mostly a personal taste. may adjust later if conflict arise
2026-04-04 17:10:31 -05:00
kenji 1b5cf2cf39 fix(yazi): can open non-assigned extensions again
needed to change a few lines to enable defaults again.
2026-04-04 17:09:47 -05:00
kenji a4f0cbb017 refactor(firefox): moved hypr rule firefox opacity to firefox default.nix instead.
organized even more.
2026-03-29 08:11:10 -05:00
kenji 6b5dedb3e6 add(firefox): bitwarden floats 2026-03-29 08:09:04 -05:00
kenji 2f11bf580d feat(gaming): added godot 2026-03-29 07:49:03 -05:00
kenji f58cd9a516 add(system): python added [finally!!] 2026-03-26 18:36:02 -05:00
kenji 7bf2c6fea2 add(nixos): mouse-wakeup 2026-03-21 19:08:49 -05:00
kenji ba09321f6b feat(yazi): added open with options 2026-03-19 16:30:05 -05:00
kenji 7d938288ab add(print): added print support 2026-03-19 16:29:47 -05:00
kenji 9f16735547 feat(btop): updated binds for btop-power
this allows for
2026-03-19 16:29:35 -05:00
kenji 19a4870450 add(system): btop.nix
gives more permission to btop (specifically for reading CPU power)
2026-03-15 17:22:25 -05:00
kenji f33330b2d6 add(system): amdcpu.nix 2026-03-15 17:10:44 -05:00
kenji 2de8603b49 fix(gaming): revamped how steam and gaming works
1. hyprbars are now disabled for steam
2. set float for steam extended windows (e.g., settings, friends list)
3. fix game `properties` forced to `gaming` workspace
2026-03-15 17:04:15 -05:00
kenji 13524322a2 revert(gaming): move steam back to special workspace
Reverts the recent change that moved Steam into a named workspace. Steam is now handled via a special workspace again. The Waybar module configuration has also been updated to reflect this change.
2026-03-15 09:22:00 -05:00
kenji ecb13d8b19 feat(hypr): firefox will always have the same opacity as active.
vidoes are now easier to look at even when unfocused
2026-03-14 09:02:06 -05:00
kenji 3558d604eb fix(firefox): Use noblur rule to prevent blur
Resolve the persistent issue of Firefox windows blurring when inactive by:
- Removing the ineffective  rule from .
- Implementing the direct  window rule for all relevant Firefox classes (, , ), ensuring explicit exemption from Hyprland's blur effect.
2026-03-14 08:45:13 -05:00
kenji fffe6bc7cc fix(hyprland): Resolve Firefox blur issue
Address the issue where Firefox windows were still blurring when inactive, despite a specific window rule.
- Refined the  in  to use a simplified and more robust regex, , ensuring it targets all relevant Firefox profiles.
- Adjusted the opacity for inactive Firefox windows to  (from ) in , as a potential workaround for Hyprland's blur handling with fully opaque windows.
- Ensured  is  and  is  in  for the global blur effect.
2026-03-14 08:40:32 -05:00
kenji 1c71784ac9 feat(hyprland): Refactor workspaces and add blur effect
Refactor Hyprland configuration to:
- Move Steam and Music from special workspaces to unique, named workspaces for better integration into the regular workflow.
- Update Waybar's workspace module to correctly display icons for these new named workspaces and filter them out from the special workspaces module.
- Implement a global blur effect for inactive windows, with a specific exception to keep Firefox windows fully opaque, enhancing focus on active content.
2026-03-14 08:29:12 -05:00
kenji dca67e19bc fix(gaming): now only stay focus on selected games
an issue in `Deadlock` does not focus its mouse even when the player is
not in the menu
2026-03-14 07:54:19 -05:00
kenji 4a9aa15b77 feat(hyprlock): removed cyberpunk random-text
it does not fit the theme very well.
2026-03-09 17:47:07 -05:00
kenji 86f044235a fix(btop): monitor is now setup to HDMI-A-1 (the mini-monitor) instead of DP-1 2026-03-09 08:38:02 -05:00
kenji 5b6477cab6 feat(btop): added ctrl+shift+esc keybind for preset 2 2026-03-08 11:39:16 -05:00
kenji c86358010c feat(btop): autostart btop on misc monitor
note: may not work on very small monitor. needs to auto change to `btm`
if conditions are met.
2026-03-08 11:36:13 -05:00
kenji 318718aabd feat(btop): added new preset for minimalistic configuration
note that it may not work on small monitors. keep that in mind. also the
new preset is located at `btop -p 2`
2026-03-08 11:29:05 -05:00
kenji d592750de7 move(btm): switched to apps-optional 2026-03-08 11:07:41 -05:00
kenji 688f8e8a1e feat(btm): added current usage to the field 2026-03-08 11:05:12 -05:00
kenji c986952c50 fix(btm): missing parameters 2026-03-08 10:35:20 -05:00
kenji d914905d01 add(apps): bottom
Added `btm`; a lightweight, diagnostic application. It is preferrable to
`btop`.
2026-03-08 10:31:56 -05:00
kenji 784e44901d fix(btop): enable rocmSupport for AMD GPU monitoring
Fixes btop not displaying GPU information by compiling it with rocm support enabled.
2026-03-08 10:18:41 -05:00
kenji 35707279b4 fix(asrock): spacing for nct
note that this is read-only. the nct6683d did not work
2026-03-08 10:15:07 -05:00
kenji 4fb3325326 add(asrock-a620i): new setup for testing fan
by default, system does not automatically detect fan configuration for
chassis and the cpu. quite inconvenient to setup fan speeds
2026-03-08 08:48:01 -05:00
kenji ae3a43d25d feat(amd): added overdrive for testing
may remove later. tested for fan noise.
2026-03-07 07:19:19 -06:00
kenji acadd94b31 fix(zathura): added ocr for easier ctrl+f
zathura had an issue where pdf's cannot be read via `find word` due to
the process being unable to read `image text`. a solution is to convert
it to ocr.
2026-03-07 07:18:57 -06:00
kenji 7cadace240 feat(binds): exchanged wiremix bind to that of steam
steam is mouse-based application; preferrable to have a commonly used
bind use only one hand.
2026-03-07 07:17:04 -06:00
kenji f097c9e15f feat(hypr): re-enabled HDR and removed hyprsunset
HDR is still quite buggy with the current ASUS ultrawide monitor.
2026-03-07 07:17:04 -06:00
kenji 9b5134c32d fix(swayosd): capslock improper interpretation 2026-02-28 13:40:14 -06:00
kenji e39f5d46ff minor change 2026-02-26 18:50:15 -06:00
kenji b21bcf5e7a fix(hypr): keyboard formatting fix 2026-01-30 20:10:32 -06:00
kenji 0bb78842c0 feat(gaming): comment out stayfocused rule 2026-01-25 16:44:01 -06:00
kenji d148acd6dd fix(gaming): add Deadlock window classes and enable stayfocused
- Adds 'project8' and 'citadel' to the games list to correctly match Valve's Deadlock window class.
- Enables 'stayfocused' rule in mkGameRules to prevent focus loss.
2026-01-25 16:43:07 -06:00
kenji 00011ed365 fix(gaming): removed workspace 2026-01-21 20:05:57 -06:00
kenji 54737695af feat(gaming): unify and automate game window rules
Refactors 'modules/home/gaming.nix' to use a unified 'mkGameRules' function.
Applies full gaming rules (monitor 0, workspace gaming, immediate, fullscreen) to:
- Steam apps (class:^steam_app_\d+$)
- Gamescope, Lutris, Heroic
- Wine/Proton windows
Preserves manual overrides in the 'games' list.
2026-01-21 20:02:25 -06:00
kenji ac3232ac80 feat(yazi): hide hidden files by default 2026-01-20 11:07:12 -06:00
kenji 5bb996c93f add(apps): libreoffice 2026-01-20 10:27:44 -06:00
kenji 8a7b475562 feat(hyprland): add OCR bind (SUPER+ALT+E) and remove TODO 2026-01-18 10:33:37 -06:00
kenji dccc191c24 add(firefox): new-tab-override 2026-01-17 09:10:57 -06:00
kenji 25477c0f7c feat(yazi): changed sort directory first to false 2026-01-17 08:51:36 -06:00
kenji 6351495541 add(utils): appimage-run 2026-01-17 08:51:16 -06:00
kenji 428488f11d feat(hyprland): improve gaming experience and workspace navigation
- Implemented a modular gaming configuration with a local games list.
- Added dynamic window rules for games: monitor 0, dedicated 'gaming' workspace, fullscreen, immediate mode, and stayfocused.
- Enabled 'allow_tearing' to support immediate mode for reduced latency.
- Created a dedicated 'name:gaming' workspace bound to monitor 0 with a 'SUPER+G' shortcut.
- Enabled 'workspace_back_and_forth' for intuitive workspace toggling.
2026-01-16 19:36:10 -06:00
kenji f8e843ec94 feat: add global theme mode and Yazi shortcut
- Added theme.mode to config.nix for global dark/light mode control.
- Updated Matugen to apply GTK dark mode preferences based on the global theme.
- Added a Hyprland bind (SUPER+X) to launch Yazi via uwsm.
2026-01-16 14:38:41 -06:00
52 changed files with 972 additions and 269 deletions
+73 -32
View File
@@ -5,9 +5,15 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## Build Commands
```bash
# Rebuild and switch to new configuration
# Rebuild and switch to new configuration (desktop x86_64)
sudo nixos-rebuild switch --flake ~/.config/nixos/#hakase
# Rebuild MacBook configuration (aarch64)
sudo nixos-rebuild switch --flake ~/.config/nixos/#macbook
# Dry-run build to check for errors without applying
sudo nixos-rebuild build --flake ~/.config/nixos/#hakase
# Manage SOPS secrets
nix-shell -p sops --run "sops secrets/secrets.yaml"
nix-shell -p sops --run "sops updatekeys secrets/secrets.yaml"
@@ -15,65 +21,100 @@ nix-shell -p sops --run "sops updatekeys secrets/secrets.yaml"
## Architecture Overview
This is a modular, flake-based NixOS configuration for a single host (`hakase`).
This is a modular, flake-based NixOS configuration supporting two hosts: `hakase` (x86_64 desktop) and `macbook` (aarch64 Apple Silicon).
### Key Entry Points
- `flake.nix` - Declares inputs and creates NixOS configuration
- `config.nix` - Central configuration values (username, hostname, paths, theme settings, bookmarks)
- `hosts/hakase/configuration.nix` - Host-level entry point that imports system modules
- `flake.nix` - Declares inputs and creates both NixOS configurations (hakase, macbook)
- `config.nix` - Central configuration values separated by host (hakase, macbook keys)
- `hosts/{hakase,macbook}/configuration.nix` - Host-level entry points importing system modules
- `home/hakase.nix` - Home Manager entry point for user environment (referenced from flake)
### Module Organization
**Two-tier module system:**
- `modules/nixos/` - NixOS system-level modules (boot, kernel, services, hardware)
- `modules/home/` - Home Manager user-level modules (imported via `home/hakase.nix`)
**Three-tier system:**
1. **System modules** (`modules/nixos/`) - NixOS-level settings (boot, kernel, services, hardware)
2. **Home Manager modules** (`modules/home/`) - User-level environment and applications
3. **Application configs** (`apps/`) - Per-application configuration directories with `default.nix` files
**Application configs:** Each application has its own directory in `apps/` with a `default.nix` and optional sub-modules (e.g., `apps/hyprland/hypr/*.nix` for Hyprland settings).
Examples:
- `apps/hyprland/default.nix` + `apps/hyprland/hypr/*.nix` - Hyprland compositor config
- `apps/firefox/default.nix` - Browser with bookmarks and theming
- `apps/ghostty/default.nix` - Terminal emulator
- `apps/neovim/default.nix` - Editor (via nixovim external flake)
### Configuration Flow
```
flake.nix
nixosConfigurations.hakase
├─ hosts/hakase/configuration.nix
│ └─ modules/nixos/default.nix (imports all system modules)
└─ home-manager
└─ home/hakase.nix
└─ modules/home/* → apps/*
flake.nix (outputs)
hakase (x86_64-linux)
├─ hosts/hakase/configuration.nix
│ └─ modules/nixos/default.nix (imports system modules)
└─ home-manager
└─ home/hakase.nix
└─ modules/home/* (imports Home Manager modules)
│ └─ apps/* (application configurations)
└─ macbook (aarch64-linux)
├─ hosts/macbook/configuration.nix
│ └─ modules/nixos/default.nix
└─ Similar home-manager structure
config.nix provides myConfig via specialArgs to both configurations
```
### Configuration Structure (config.nix)
The `config.nix` file defines host-specific configuration under `hakase` and `macbook` keys. Common values include:
```nix
myConfig = {
nixos = { username, hostname, timezone }
git = { username, email, defaultBranch }
theme = { mode } # "dark" or "light"
terminal = { default, font, aliases }
font = { monospace, monospaceScript, sans }
hyprland = { monitors, wallpaper, kb_options }
firefox = { bookmarks, newtabpage }
# ... more app-specific configs
}
```
To add a host-specific override, define it in the host's `myConfig` section in `config.nix`. The flake passes `allConfig.{hostname}` as specialArgs, so modules access the correct host configuration.
### Module Pattern
Modules receive these parameters:
Modules receive standard NixOS parameters plus custom ones:
```nix
{ pkgs, config, myConfig, inputs, ... }:
{ pkgs, config, lib, myConfig, inputs, system, ... }:
```
Access configuration values via `myConfig`:
```nix
myConfig.nixos.username # "hakase"
myConfig.nixos.hostname # "hakase"
myConfig.terminal.default # Terminal emulator
myConfig.hyprland.monitors # Monitor configuration
```
**Key patterns:**
- Access host config: `myConfig.nixos.username`, `myConfig.terminal.default`
- Use host-specific packages: `pkgs.unstable` (from nixpkgs), `inputs.neovim` (from flake inputs)
- Reference other modules via `config` (e.g., `config.home.homeDirectory`)
- Conditional logic: Check `system` or `myConfig` values
### Secrets Management
Uses SOPS for encrypted secrets. Keys stored at `~/.config/sops/age/keys.txt`.
SOPS-encrypted secrets stored in `secrets/secrets.yaml`. Age key at `~/.config/sops/age/keys.txt`.
Access secrets in modules:
In modules, reference secrets via:
```nix
config.sops.secrets.secret_name.path
```
## Key Technologies
- **Hyprland** with UWSM (systemd session management)
- **Stylix** for system-wide theming from wallpaper colors
- **Home Manager** for user environment
- **nixovim** flake for Neovim configuration
- **Hyprland** with UWSM (systemd user session management)
- **Matugen** for automatic system-wide theming from wallpaper colors
- **Home Manager** for user environment and program configuration
- **nixovim** external flake for Neovim configuration (treesitter disabled due to read-only NixOS constraints)
- **SOPS-Nix** for secrets encryption
- **CachyOS kernel** on hakase (x86_64), **Asahi Linux** on macbook (aarch64)
## Git Commit Convention
Use conventional commits: `feat(scope):`, `fix(scope):`, `refactor:`, `add:`, `remove:`, `cleanup:`
Use conventional commits with scope: `feat(scope):`, `fix(scope):`, `refactor:`, `add:`, `remove:`, `cleanup:`
Common scopes: `nixos`, `home`, `apps`, `config`, `modules`, `hyprland`, `firefox`, etc.
+9
View File
@@ -1,3 +1,12 @@
{pkgs, ...}: {
home.packages = with pkgs; [anki-bin];
xdg.mimeApps = {
enable = true;
defaultApplications = {
"application/x-apkg" = "anki.desktop";
"application/x-anki-deck" = "anki.desktop";
"application/x-anki-collection" = "anki.desktop";
};
};
}
+39
View File
@@ -0,0 +1,39 @@
{pkgs, ...}: {
programs.bottom = {
enable = true;
settings = {
flags = {
rate = 1000;
hide_table_gap = true;
hide_time = true;
left_legend = true;
network_use_bytes = true;
temperature_type = "c";
mem_as_value = true;
current_usage = true;
};
row = [
{
ratio = 4;
child = [
{ type = "cpu"; }
];
}
{
ratio = 3;
child = [
{ type = "mem"; }
{ type = "net"; }
];
}
{
ratio = 3;
child = [
{ type = "temp"; }
{ type = "disk"; }
];
}
];
};
};
}
+26 -1
View File
@@ -1,10 +1,35 @@
{
pkgs,
lib,
myConfig,
...
}: {
# This enables the btop configuration file generation in your home directory.
# The btop package itself is now installed system-wide via modules/nixos/btop.nix
programs.btop = {
enable = true;
settings = {
vim_keys = true;
color_theme = "TTY";
theme_background = false;
presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty cpu:0:default,mem:0:default,net:0:default,gpu0:0:default";
};
};
}
# This updates your Hyprland settings to use the btop-power wrapper.
wayland.windowManager.hyprland.settings = lib.mkMerge [
{
bindd = [
"CTRL SHIFT, Escape, Open Btop Minimal, exec, uwsm app -- xdg-terminal-exec -e btop-power -p 2"
];
}
(lib.mkIf (myConfig.btop.autostart) {
exec-once = [
"uwsm app -- xdg-terminal-exec -e btop-power -p 2"
];
windowrule = [
"match:title ^(btop)$, monitor ${myConfig.btop.monitor}"
];
})
];
}
+16 -3
View File
@@ -22,9 +22,10 @@
"special:jellyfin, on-created-empty:uwsm app -- firefox -P web-app --name jellyfin https://watch.sakamoto.dev"
];
windowrulev2 = [
"workspace special:youtube, class:^(youtube)$"
"workspace special:jellyfin, class:^(jellyfin)$"
windowrule = [
"match:class (?i)(firefox|youtube|jellyfin), opacity 1 1"
"match:class ^(youtube)$, workspace special:youtube"
"match:class ^(jellyfin)$, workspace special:jellyfin"
];
};
imports = [
@@ -47,6 +48,17 @@
set newtab about:newtab
'';
xdg.mimeApps = {
enable = true;
defaultApplications = {
"text/html" = "firefox.desktop";
"x-scheme-handler/http" = "firefox.desktop";
"x-scheme-handler/https" = "firefox.desktop";
"x-scheme-handler/about" = "firefox.desktop";
"x-scheme-handler/unknown" = "firefox.desktop";
};
};
programs.firefox = {
enable = true;
languagePacks = ["en-US"];
@@ -83,6 +95,7 @@
ublock-origin
bitwarden
tridactyl
new-tab-override
];
bookmarks = {
+5 -3
View File
@@ -14,13 +14,15 @@
./hypr/rules.nix
./scripts/movement.nix
./scripts/window-rules.nix
./scripts/workspace-toggle.nix
];
wayland.windowManager.hyprland.enable = true;
wayland.windowManager.hyprland.systemd.enable = false; # for UWSM support...
wayland.windowManager.hyprland.plugins = [
pkgs.hyprlandPlugins.hyprsplit
pkgs.hyprlandPlugins.hypr-dynamic-cursors
pkgs.hyprlandPlugins.hyprspace
inputs.hyprsplit.packages.${pkgs.system}.hyprsplit
# inputs.hypr-dynamic-cursors.packages.${pkgs.system}.hypr-dynamic-cursors
# inputs.hyprspace.packages.${pkgs.system}.Hyprspace
pkgs.hyprlandPlugins.hyprbars
];
}
+6 -4
View File
@@ -1,6 +1,9 @@
{pkgs, ...}: {
# TODO: implement a way to show binds, preferably use vicinae.
wayland.windowManager.hyprland.settings = {
binds = {
workspace_back_and_forth = true;
};
bindel = [
", XF86MonBrightnessUp, exec, ddcutil setvcp 10 + 10"
", XF86MonBrightnessDown, exec, ddcutil setvcp 10 - 10"
@@ -46,7 +49,6 @@
# "SUPER, SPACE, Open App Launcher, exec, nc -U $XDG_RUNTIME_DIR/walker/walker.sock"
# TODO:
# add text clipping from pictures
# add screen recording
# Special workspace
@@ -63,17 +65,17 @@
"CTRL SHIFT, J, Move to next workspace, split:workspace, +1"
# hyprspace - workspace overview
"SUPER, E, Toggle Workspace Overview, overview:toggle"
# "SUPER, E, Toggle Workspace Overview, overview:toggle"
]
++ (
# Generate binds for Super + [1-5] to switch workspaces on current monitor
# Generate binds for Super + [1-5] to switch workspaces with special workspace toggle support
# and Super + Shift + [1-5] to move window to workspace on current monitor
builtins.concatLists (builtins.genList (
i: let
ws = i + 1;
key = toString ws;
in [
"SUPER, ${key}, Switch to workspace ${toString ws}, split:workspace, ${toString ws}"
"SUPER, ${key}, Switch to workspace ${toString ws}, exec, workspace-toggle ${toString ws}"
"SUPER SHIFT, ${key}, Move window to workspace ${toString ws}, split:movetoworkspace, ${toString ws}"
]
)
+1 -1
View File
@@ -16,7 +16,7 @@
"hyprpm reload -n"
"systemctl --user start hyprpolkitagent"
"systemctl --user start swayosd"
"hyprsunset -t 4500" # TODO: must be optional
# "hyprsunset -t 4500" # TODO: must be optional
];
};
}
+5 -3
View File
@@ -4,11 +4,13 @@
gaps_in = 5;
gaps_out = 15;
layout = "dwindle";
allow_tearing = true;
resize_on_border = true;
};
decoration = {
rounding = 0;
active_opacity = 0.99;
inactive_opacity = 0.70;
active_opacity = 1;
inactive_opacity = 0.99;
shadow = {
enabled = true;
range = 2;
@@ -19,6 +21,7 @@
enabled = true;
size = 8;
passes = 2;
new_optimizations = true;
special = true;
brightness = 0.60;
contrast = 0.75;
@@ -26,7 +29,6 @@
};
monitor = myConfig.hyprland.monitors;
dwindle = {
pseudotile = true;
preserve_split = true;
smart_split = false;
};
+2 -1
View File
@@ -1,9 +1,10 @@
{
{myConfig, ...}: {
wayland.windowManager.hyprland.settings = {
input = {
repeat_rate = 50;
repeat_delay = 300;
numlock_by_default = true;
kb_options = myConfig.hyprland.kb_options;
};
cursor = {
hide_on_key_press = false;
+1 -6
View File
@@ -1,12 +1,7 @@
{pkgs, ...}: {
wayland.windowManager.hyprland.settings = {
layerrule = [
# Blur and transparency for vicinae
"blur, vicinae"
"ignorealpha 0, vicinae"
# Disable animation for vicinae
"noanim, vicinae"
"match:namespace vicinae, blur true, ignore_alpha 0.0, no_anim true"
];
};
}
+5 -1
View File
@@ -5,9 +5,13 @@
disable_splash_rendering = true;
focus_on_activate = true;
anr_missed_pings = 3;
new_window_takes_over_fullscreen = 1;
on_focus_under_fullscreen = 1;
};
# experimental = {
# hdr = true;
# };
cursor = {
no_hardware_cursors = true;
no_break_fs_vrr = true;
+5
View File
@@ -1,5 +1,10 @@
{
wayland.windowManager.hyprland.settings = {
windowrule = [
# Make all inactive windows transparent
"match:class .*, opacity 1 0.8"
"match:class firefox, match:title (?i).*bitwarden.*, no_screen_share on"
];
workspace = [
];
};
+70
View File
@@ -0,0 +1,70 @@
{pkgs, ...}: let
hyprctl = "${pkgs.hyprland}/bin/hyprctl";
jq = "${pkgs.jq}/bin/jq";
socat = "${pkgs.socat}/bin/socat";
hypr-window-rules = pkgs.writeShellScriptBin "hypr-window-rules" ''
LOG=/tmp/hypr-window-rules.log
log() { echo "[$(date +%T)] $*" >> "$LOG"; }
handle() {
local event="$1"
case "$event" in
windowtitlev2*)
local data="''${event#windowtitlev2>>}"
local addr="0x''${data%%,*}"
local title="''${data#*,}"
if echo "$title" | grep -qi "bitwarden"; then
log "bitwarden title detected: addr=$addr title=$title"
local info
info=$(${hyprctl} clients -j | ${jq} -r --arg addr "$addr" \
'.[] | select(.address == $addr) | "\(.class)|\(.floating)"')
local class="''${info%|*}"
local floating="''${info#*|}"
log " -> class=$class floating=$floating"
if [[ "$class" == "firefox" && "$floating" == "false" ]]; then
${hyprctl} dispatch togglefloating "address:$addr"
local target_w=600
local target_h=800
local mon_id
mon_id=$(${hyprctl} clients -j | ${jq} -r --arg addr "$addr" \
'.[] | select(.address == $addr) | .monitor')
local center
center=$(${hyprctl} monitors -j | ${jq} -r \
--argjson id "$mon_id" --argjson tw "$target_w" --argjson th "$target_h" \
'.[] | select(.id == $id) |
"\(.x + ((.width / .scale) - $tw) / 2 | floor)|\(.y + ((.height / .scale) - $th) / 2 | floor)"')
local cx="''${center%%|*}"
local cy="''${center#*|}"
${hyprctl} dispatch resizewindowpixel "exact $target_w $target_h, address:$addr"
${hyprctl} dispatch movewindowpixel "exact $cx $cy, address:$addr"
log " -> floated, resized to $target_w x $target_h, moved to $cx,$cy"
else
log " -> skipped (class or floating mismatch)"
fi
fi
;;
esac
}
log "started (HYPRLAND_INSTANCE_SIGNATURE=$HYPRLAND_INSTANCE_SIGNATURE)"
${socat} -u \
"UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock" \
- \
| while IFS= read -r line; do handle "$line"; done
log "socat exited"
'';
in {
home.packages = [hypr-window-rules];
wayland.windowManager.hyprland.settings.exec-once = [
"hypr-window-rules"
];
}
@@ -0,0 +1,27 @@
{pkgs, ...}: let
workspace-toggle = pkgs.writeShellScriptBin "workspace-toggle" ''
#!/usr/bin/env bash
target_workspace="$1"
# activeworkspace always returns the underlying workspace, even when a special
# workspace is open. Check the monitor's specialWorkspace field instead.
special=$(${pkgs.hyprland}/bin/hyprctl monitors -j | ${pkgs.jq}/bin/jq -r '.[] | select(.focused) | .specialWorkspace.name')
if [[ -n "$special" ]]; then
${pkgs.hyprland}/bin/hyprctl dispatch togglespecialworkspace "''${special#special:}"
current=$(${pkgs.hyprland}/bin/hyprctl activeworkspace -j | ${pkgs.jq}/bin/jq -r '.id')
if [[ $current -ne $target_workspace ]]; then
${pkgs.hyprland}/bin/hyprctl dispatch focusworkspaceoncurrentmonitor "$target_workspace"
fi
else
current=$(${pkgs.hyprland}/bin/hyprctl activeworkspace -j | ${pkgs.jq}/bin/jq -r '.id')
if [[ $current -eq $target_workspace ]]; then
${pkgs.hyprland}/bin/hyprctl dispatch workspace previous
else
${pkgs.hyprland}/bin/hyprctl dispatch split:workspace "$target_workspace"
fi
fi
'';
in {
home.packages = [workspace-toggle];
}
+1 -1
View File
@@ -227,7 +227,7 @@
combined=(
"''${greetings[@]}"
"''${inspirations[@]}"
"''${cyberpunk[@]}"
# "''${cyberpunk[@]}"
"''${yojijukugo[@]}"
"''${habits[@]}"
"''${dev[@]}"
+27 -14
View File
@@ -22,13 +22,24 @@
fi
tmp_file=$(mktemp)
target_dir="$HOME/Pictures/Wallpapers"
if [ ! -d "$target_dir" ]; then
target_dir="$HOME"
LAST_WALLPAPER_FILE="$HOME/.cache/last_wallpaper_path"
if [ -f "$LAST_WALLPAPER_FILE" ]; then
last_path=$(cat "$LAST_WALLPAPER_FILE")
if [ -f "$last_path" ]; then
yazi_target="$last_path"
fi
fi
if [ -z "$yazi_target" ]; then
yazi_target="$HOME/Pictures/Wallpapers"
if [ ! -d "$yazi_target" ]; then
yazi_target="$HOME"
fi
fi
# Ensure we are in a terminal that supports yazi
${pkgs.yazi}/bin/yazi "$target_dir" --chooser-file="$tmp_file"
${pkgs.yazi}/bin/yazi "$yazi_target" --chooser-file="$tmp_file"
if [ ! -f "$tmp_file" ]; then
echo "No selection file created."
@@ -46,13 +57,14 @@
# Persistence logic
CACHE_FILE="$HOME/.cache/current_wallpaper"
cp "$WALLPAPER" "$CACHE_FILE"
echo "$WALLPAPER" > "$HOME/.cache/last_wallpaper_path"
# Reload hyprpaper
${pkgs.hyprland}/bin/hyprctl hyprpaper unload all
${pkgs.hyprland}/bin/hyprctl hyprpaper preload "$CACHE_FILE"
${pkgs.hyprland}/bin/hyprctl hyprpaper wallpaper ",$CACHE_FILE"
exec matugen image "$CACHE_FILE"
exec matugen image "$CACHE_FILE" --source-color-index 0
'';
in {
wayland.windowManager.hyprland.settings = {
@@ -64,22 +76,23 @@ in {
"SUPER CTRL, I, Switch Wallpaper, exec, hakase-wallpaper-switch"
];
windowrulev2 = [
windowrule = [
# --- WALLPAPER PICKER ---
"float, class:^(org\.hakase\.switch-wallpaper)$"
"float, initialTitle:^(Wallpaper Selector)$"
"center, class:^(org\.hakase\.switch-wallpaper)$"
"center, initialTitle:^(Wallpaper Selector)$"
"size 60% 60%, class:^(org\.hakase\.switch-wallpaper)$"
"size 60% 60%, initialTitle:^(Wallpaper Selector)$"
"dimaround, class:^(org\.hakase\.switch-wallpaper)$"
"dimaround, initialTitle:^(Wallpaper Selector)$"
"match:class ^(org\.hakase\.switch-wallpaper)$, float on"
"match:initial_title ^(Wallpaper Selector)$, float on"
"match:class ^(org\.hakase\.switch-wallpaper)$, center on"
"match:initial_title ^(Wallpaper Selector)$, center on"
"match:class ^(org\.hakase\.switch-wallpaper)$, size 60% 60%"
"match:initial_title ^(Wallpaper Selector)$, size 60% 60%"
"match:class ^(org\.hakase\.switch-wallpaper)$, dim_around on"
"match:initial_title ^(Wallpaper Selector)$, dim_around on"
];
};
services.hyprpaper = {
enable = true;
settings = {
splash = false;
preload = [cacheWallpaper];
wallpaper = [
",${cacheWallpaper}"
+3 -3
View File
@@ -73,9 +73,9 @@ in {
show = no
'';
wayland.windowManager.hyprland.settings.windowrulev2 = [
wayland.windowManager.hyprland.settings.windowrule = [
# --- IMAGE VIEWER (swayimg) ---
"float, class:^(swayimg)$"
"center, class:^(swayimg)$"
"match:class ^(swayimg)$, float on"
"match:class ^(swayimg)$, center on"
];
}
+7 -7
View File
@@ -62,14 +62,14 @@
wayland.windowManager.hyprland.settings = {
exec-once = [ "systemctl --user start jellyfin-mpv-shim" ];
windowrulev2 = [
windowrule = [
# --- JELLYFIN MPV SHIM ---
"float, class:^(jellyfin-mpv-shim)$"
"center, class:^(jellyfin-mpv-shim)$"
"size 70% 70%, class:^(jellyfin-mpv-shim)$"
"opacity 1.0 override 1.0 override, class:^(jellyfin-mpv-shim)$"
"idleinhibit focus, class:^(jellyfin-mpv-shim)$"
"noblur, class:^(jellyfin-mpv-shim)$"
"match:class ^(jellyfin-mpv-shim)$, float on"
"match:class ^(jellyfin-mpv-shim)$, center on"
"match:class ^(jellyfin-mpv-shim)$, size 70% 70%"
"match:class ^(jellyfin-mpv-shim)$, opacity 1.0 override 1.0 override"
"match:class ^(jellyfin-mpv-shim)$, idle_inhibit focus"
"match:class ^(jellyfin-mpv-shim)$, no_blur on"
];
};
}
+5
View File
@@ -0,0 +1,5 @@
{pkgs, ...}: {
home.packages = with pkgs; [
libreoffice-fresh
];
}
+22 -1
View File
@@ -5,7 +5,7 @@
...
}: {
home.packages = with pkgs; [
matugen
inputs.matugen.packages.${pkgs.system}.default
dconf
psmisc # for killall
];
@@ -352,6 +352,15 @@
platformTheme.name = "gtk";
};
dconf.settings = {
"org/gnome/desktop/interface" = {
color-scheme =
if myConfig.theme.mode == "dark"
then "prefer-dark"
else "prefer-light";
};
};
# GTK theming with adw-gtk3 and Matugen colors
gtk = {
enable = true;
@@ -364,7 +373,19 @@
package = pkgs.papirus-icon-theme;
};
gtk3.extraCss = ''@import url("colors.css");'';
gtk3.extraConfig = {
gtk-application-prefer-dark-theme =
if myConfig.theme.mode == "dark"
then 1
else 0;
};
gtk4.extraCss = ''@import url("colors.css");'';
gtk4.extraConfig = {
gtk-application-prefer-dark-theme =
if myConfig.theme.mode == "dark"
then 1
else 0;
};
};
programs.ghostty.settings.theme = "matugen";
+10 -5
View File
@@ -10,6 +10,11 @@
osc = "no";
osd-bar = "no";
border = "no";
# Subtitle preferences - prefer full subtitles over forced
# slang = "eng,en,enm"; # English subtitle preference order
# subs-fallback = "default"; # Use default if preferred not found
# sub-forced-events-only = "no"; # Don't limit to forced subtitle events
};
};
@@ -25,10 +30,10 @@
};
};
wayland.windowManager.hyprland.settings.windowrulev2 = [
wayland.windowManager.hyprland.settings.windowrule = [
# --- VIDEO PLAYER (mpv) ---
"float, class:^(mpv)$"
"center, class:^(mpv)$"
"size 70% 70%, class:^(mpv)$"
"match:class ^(mpv)$, float on"
"match:class ^(mpv)$, center on"
"match:class ^(mpv)$, size 60% 70%"
];
}
}
+8 -1
View File
@@ -27,8 +27,13 @@
wl-copy < "$filepath"
notify-send "Screenshot saved" "Saved and copied to clipboard"
;;
ocr)
# OCR Selection
grim -g "$(slurp)" - | tesseract stdin stdout | wl-copy
notify-send "OCR" "Text extracted to clipboard"
;;
*)
echo "Usage: screenshot {region|window|screen|all|region-save}"
echo "Usage: screenshot {region|window|screen|all|region-save|ocr}"
exit 1
;;
esac
@@ -40,6 +45,7 @@ in {
swappy # Annotation tool
jq # For window selection
wl-clipboard # For copying to clipboard
tesseract # OCR tool
screenshot # Our wrapper script
];
@@ -66,5 +72,6 @@ in {
"SUPER SHIFT, S, Screenshot Active Window, exec, screenshot window"
"SUPER ALT, S, Quick Screenshot (no edit), exec, screenshot region-save"
"SUPER ALT SHIFT, S, Screenshot Current Monitor, exec, screenshot screen"
"SUPER ALT, E, OCR Selection, exec, screenshot ocr"
];
}
+1 -1
View File
@@ -27,7 +27,7 @@
];
bindl = [
", XF86AudioMute, exec, swayosd-client --output-volume mute-toggle"
", Caps_Lock, exec, swayosd-client --caps-lock"
", Caps_Lock, exec, sleep 0.1 && swayosd-client --caps-lock"
];
};
}
+3 -4
View File
@@ -78,10 +78,9 @@ in {
bindd = [
"SUPER, SPACE, Open Vicinae, exec, vicinae-toggle"
"SUPER, period, Open Emoji Picker, exec, vicinae-toggle deeplink vicinae://extensions/vicinae/core/search-emojis"
# FIXME: calculator history does not allow you to calculate
"SUPER, C, Open Calculator, exec, vicinae-toggle deeplink vicinae://extensions/vicinae/calculator/history"
"SUPER, V, Open Clipboard History, exec, vicinae-toggle deeplink vicinae://extensions/vicinae/clipboard/history"
"SUPER, period, Open Emoji Picker, exec, vicinae-toggle deeplink vicinae://launch/core/search-emojis"
"SUPER, C, Open Calculator, exec, vicinae-toggle deeplink vicinae://launch/calculator/history"
"SUPER, V, Open Clipboard History, exec, vicinae-toggle deeplink vicinae://launch/clipboard/history"
];
};
}
+41 -16
View File
@@ -62,16 +62,16 @@ in {
"SUPER, Escape, exec, hakase-popup-launch btop"
"SUPER, N, exec, hakase-popup-launch impala"
"SUPER, B, exec, hakase-popup-launch bluetui"
"SUPER, A, exec, hakase-popup-launch wiremix"
"SUPER, T, exec, hakase-popup-launch wiremix"
];
windowrulev2 = [
windowrule = [
# --- POPUP RULES (Wifi, BT, Audio) ---
"float, class:^(org\.hakase\.popup\..*)$"
"size 900 600, class:^(org\.hakase\.popup\..*)$"
"center, class:^(org\.hakase\.popup\..*)$"
"animation slide right, class:^(org\.hakase\.popup\..*)$"
"dimaround, class:^(org\.hakase\.popup\..*)$"
"match:class ^(org\.hakase\.popup\..*)$, float on"
"match:class ^(org\.hakase\.popup\..*)$, size 900 600"
"match:class ^(org\.hakase\.popup\..*)$, center on"
"match:class ^(org\.hakase\.popup\..*)$, animation slide right"
"match:class ^(org\.hakase\.popup\..*)$, dim_around on"
];
};
imports = [
@@ -116,18 +116,38 @@ in {
all-outputs = true;
format = "{icon}";
format-icons = {
"music" = "󰎆";
"gaming" = "󰊖";
"default" = "";
"active" = "󱓻";
# Numbered workspaces 1-5
"1" = "1";
"2" = "2";
"3" = "3";
"4" = "4";
"5" = "5";
"6" = "6";
"7" = "7";
"8" = "8";
"9" = "9";
"10" = "0";
"active" = "󱓻";
# Kanji for workspaces 6-10
"6" = "1";
"7" = "2";
"8" = "3";
"9" = "4";
"10" = "5";
# Dice for workspaces 11-15
"11" = "1";
"12" = "2";
"13" = "3";
"14" = "4";
"15" = "5";
# Circled numbers for 16-20
"16" = "1";
"17" = "2";
"18" = "3";
"19" = "4";
"20" = "5";
};
persistent-workspaces = {
"1" = [];
@@ -135,6 +155,11 @@ in {
"3" = [];
"4" = [];
"5" = [];
"6" = [];
"7" = [];
"8" = [];
"9" = [];
"10" = [];
};
};
@@ -143,16 +168,16 @@ in {
show-special = true;
special-visible-only = true;
all-outputs = true;
ignore-workspaces = ["^[0-9]+$"];
ignore-workspaces = ["^([0-9]+|gaming|music|jellyfin)$"];
format = "{icon}";
format-icons = {
"special:youtube" = "󰗃";
"special:music" = "󰎆";
"special:steam" = "󰓓";
"special:custom" = "󱗼";
"special:preload" = "󱗼";
"special:jellyfin" = "󰟞";
"jellyfin" = "󰟞";
"youtube" = "󰗃";
"music" = "󰎆";
"steam" = "󰓓";
"custom" = "󱗼";
"preload" = "󱗼";
+12
View File
@@ -36,6 +36,18 @@
opacity: 0.5;
}
/* Add spacing separator every 5 workspaces */
#workspaces button:nth-child(5),
#workspaces button:nth-child(10),
#workspaces button:nth-child(15) {
margin-right: 10px;
}
/* Separator between normal and special workspaces */
#workspaces.special {
margin-left: 12px;
}
#cpu,
#battery,
#pulseaudio,
+5
View File
@@ -0,0 +1,5 @@
{
programs.wireshark.enable = true;
# dumpcap.enable = true;
usbmon.enable = true;
}
+43 -7
View File
@@ -71,21 +71,57 @@
fi
'';
in {
wayland.windowManager.hyprland.settings = {
bindd = [
"SUPER, X, Open File Manager, exec, uwsm app -- yazi"
];
};
programs.yazi = {
enable = true;
enableFishIntegration = true;
settings = {
manager = {
show_hidden = true;
show_hidden = false;
sort_by = "mtime";
sort_reverse = true;
sort_dir_first = true;
sort_dir_first = false;
linemode = "size";
mouse_events = ["click" "scroll" "touch" "move" "drag"];
};
tasks = {
image_bound = [10000 10000];
};
opener = {
anki = [
{
run = "anki \"$@\"";
desc = "Open with Anki";
}
];
pdf = [
{
run = "zathura \"$@\"";
desc = "Open with Zathura";
}
{
run = "firefox \"$@\"";
desc = "Open with Firefox";
}
];
};
open = {
prepend_rules = [
{
name = "*.{apkg,colpkg}";
use = "anki";
}
{
mime = "application/pdf";
use = "pdf";
}
];
};
};
};
@@ -109,7 +145,7 @@ in {
default=hyprland;gtk
org.freedesktop.impl.portal.FileChooser=termfilechooser
'';
xdg.mimeApps = {
enable = true;
defaultApplications = {
@@ -117,10 +153,10 @@ in {
};
};
wayland.windowManager.hyprland.settings.windowrulev2 = [
wayland.windowManager.hyprland.settings.windowrule = [
# File picker yazi - floating, centered, smaller size
"float, class:^(org\\.hakase\\.popup\\.yazi)$"
"size 60% 70%, class:^(org\\.hakase\\.popup\\.yazi)$"
"center, class:^(org\\.hakase\\.popup\\.yazi)$"
"match:class ^(org\\.hakase\\.popup\\.yazi)$, float on"
"match:class ^(org\\.hakase\\.popup\\.yazi)$, size 60% 70%"
"match:class ^(org\\.hakase\\.popup\\.yazi)$, center on"
];
}
+8 -1
View File
@@ -1,5 +1,12 @@
{ pkgs, config, lib, ... }:
{
pkgs,
config,
lib,
...
}: {
home.packages = with pkgs; [
ocrmypdf
];
programs.zathura = {
enable = true;
options = {
+25 -1
View File
@@ -16,6 +16,9 @@
email = "kenji@hakase";
defaultBranch = "master";
};
theme = {
mode = "dark";
};
terminal = {
default = "ghostty";
font = "MonoLisa";
@@ -23,14 +26,27 @@
update = "sudo nixos-rebuild switch --flake ~/.config/nixos/#hakase";
};
};
btop = {
autostart = true;
monitor = "HDMI-A-1";
};
hyprland = {
monitors = [
"DP-1,highres@165,0x1080,1,vrr,0"
# "DP-1,highres@180,0x1080,1,vrr,1,bitdepth,10,cm,hdr,sdrbrightness,2.5"
"DP-1,highres@180,0x1080,1,vrr,0"
"DP-2, highres@165,760x0,1"
"HDMI-A-1, highres@highrr@120, 3440x1440, 1.6"
];
wallpaper = "firewatch.png";
kb_options = "";
};
wakeup = {
mouse = {
disable = true;
vendor = "3710";
product = "5406";
};
};
firefox = {
bookmarks = [
@@ -74,6 +90,9 @@
email = "kenji@macbook";
defaultBranch = "master";
};
theme = {
mode = "dark";
};
terminal = {
default = "ghostty";
font = "MonoLisa";
@@ -81,6 +100,10 @@
update = "sudo nixos-rebuild switch --flake ~/.config/nixos/#macbook";
};
};
btop = {
autostart = false;
monitor = "eDP-1";
};
hyprland = {
# M1 Pro/Max/Air screens are usually built-in eDP-1.
# HiDPI scale 2.0 is safe for Retina.
@@ -88,6 +111,7 @@
"eDP-1, highres, auto, 2"
];
wallpaper = "firewatch.png";
kb_options = "";
};
firefox = {
bookmarks = [
Generated
+222 -93
View File
@@ -41,11 +41,11 @@
]
},
"locked": {
"lastModified": 1765900596,
"narHash": "sha256-+hn8v9jkkLP9m+o0Nm5SiEq10W0iWDSotH2XfjU45fA=",
"lastModified": 1778857089,
"narHash": "sha256-TclWRW2SdFeETLaiTG4BA8C8C4m/LppQEldncqyTzAQ=",
"owner": "hyprwm",
"repo": "aquamarine",
"rev": "d83c97f8f5c0aae553c1489c7d9eff3eadcadace",
"rev": "ab2b0af63fbc9fb779d684f19149b790978be8a8",
"type": "github"
},
"original": {
@@ -141,15 +141,15 @@
"flake-compat_2": {
"flake": false,
"locked": {
"lastModified": 1761588595,
"narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=",
"owner": "edolstra",
"lastModified": 1767039857,
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
"owner": "NixOS",
"repo": "flake-compat",
"rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5",
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
"type": "github"
},
"original": {
"owner": "edolstra",
"owner": "NixOS",
"repo": "flake-compat",
"type": "github"
}
@@ -181,11 +181,11 @@
]
},
"locked": {
"lastModified": 1765835352,
"narHash": "sha256-XswHlK/Qtjasvhd1nOa1e8MgZ8GS//jBoTqWtrS1Giw=",
"lastModified": 1778716662,
"narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "a34fae9c08a15ad73f295041fec82323541400a9",
"rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
"type": "github"
},
"original": {
@@ -231,7 +231,7 @@
},
"flake-utils": {
"inputs": {
"systems": "systems_4"
"systems": "systems_6"
},
"locked": {
"lastModified": 1731533236,
@@ -310,6 +310,27 @@
"type": "github"
}
},
"hypr-dynamic-cursors": {
"inputs": {
"hyprland": [
"hyprland"
],
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1779050734,
"narHash": "sha256-uE/I8TrhVEyQJb8t+HeHNYQRv7VlwbZxXlTrMfP0x/A=",
"owner": "Virtcode",
"repo": "hypr-dynamic-cursors",
"rev": "39fe4ab66b45b011667f548d759d58e707521378",
"type": "github"
},
"original": {
"owner": "Virtcode",
"repo": "hypr-dynamic-cursors",
"type": "github"
}
},
"hyprcursor": {
"inputs": {
"hyprlang": [
@@ -326,11 +347,11 @@
]
},
"locked": {
"lastModified": 1753964049,
"narHash": "sha256-lIqabfBY7z/OANxHoPeIrDJrFyYy9jAM4GQLzZ2feCM=",
"lastModified": 1776511930,
"narHash": "sha256-fCpwFiTW0rT7oKJqr3cqHMnkwypSwQKpbtUEtxdkgrM=",
"owner": "hyprwm",
"repo": "hyprcursor",
"rev": "44e91d467bdad8dcf8bbd2ac7cf49972540980a5",
"rev": "39435900785d0c560c6ae8777d29f28617d031ef",
"type": "github"
},
"original": {
@@ -355,11 +376,11 @@
]
},
"locked": {
"lastModified": 1763733840,
"narHash": "sha256-JnET78yl5RvpGuDQy3rCycOCkiKoLr5DN1fPhRNNMco=",
"lastModified": 1776426399,
"narHash": "sha256-RUESLKNikIeEq9ymGJ6nmcDXiSFQpUW1IhJ245nL3xM=",
"owner": "hyprwm",
"repo": "hyprgraphics",
"rev": "8f1bec691b2d198c60cccabca7a94add2df4ed1a",
"rev": "68d064434787cf1ed4a2fe257c03c5f52f33cf84",
"type": "github"
},
"original": {
@@ -387,11 +408,11 @@
"xdph": "xdph"
},
"locked": {
"lastModified": 1767300597,
"narHash": "sha256-lGE1j1bEuNp7XoDP+oyyF/c+MzYAs6S+sz0NK71nXZE=",
"lastModified": 1779983308,
"narHash": "sha256-mvjt5EqRubXF5w1RnyLsWOduJQzHDZCjohWJz/TUvJM=",
"ref": "refs/heads/main",
"rev": "31d3181e1ee91e338fb4fb8207d64b8d689310fc",
"revCount": 6766,
"rev": "ebc1816dfb27f1091c9713876669e092a215382d",
"revCount": 7376,
"submodules": true,
"type": "git",
"url": "https://github.com/hyprwm/Hyprland"
@@ -435,11 +456,11 @@
]
},
"locked": {
"lastModified": 1765643131,
"narHash": "sha256-CCGohW5EBIRy4B7vTyBMqPgsNcaNenVad/wszfddET0=",
"lastModified": 1776426575,
"narHash": "sha256-KI6nIfVihn/DPaeB5Et46Xg3dkNHrrEtUd5LBBVomB0=",
"owner": "hyprwm",
"repo": "hyprland-guiutils",
"rev": "e50ae912813bdfa8372d62daf454f48d6df02297",
"rev": "a968d211048e3ed538e47b84cb3649299578f19d",
"type": "github"
},
"original": {
@@ -465,11 +486,11 @@
]
},
"locked": {
"lastModified": 1767304464,
"narHash": "sha256-HsdfmPf5291Y3yXScMoj53P/9SS1DK3KgbprBuR8A4k=",
"lastModified": 1779209205,
"narHash": "sha256-asc7NpeB8vD66gvZeYcQkaWOs2X6Jgd29vBtP17vjxo=",
"owner": "hyprwm",
"repo": "hyprland-plugins",
"rev": "7a8521112361997d071fd1fef06d6becc7e53240",
"rev": "1cb37fad68dff5f5840010c314fed5809b4ee66f",
"type": "github"
},
"original": {
@@ -490,11 +511,11 @@
]
},
"locked": {
"lastModified": 1765214753,
"narHash": "sha256-P9zdGXOzToJJgu5sVjv7oeOGPIIwrd9hAUAP3PsmBBs=",
"lastModified": 1772460177,
"narHash": "sha256-/6G/MsPvtn7bc4Y32pserBT/Z4SUUdBd4XYJpOEKVR4=",
"owner": "hyprwm",
"repo": "hyprland-protocols",
"rev": "3f3860b869014c00e8b9e0528c7b4ddc335c21ab",
"rev": "1cb6db5fd6bb8aee419f4457402fa18293ace917",
"type": "github"
},
"original": {
@@ -519,11 +540,11 @@
]
},
"locked": {
"lastModified": 1764612430,
"narHash": "sha256-54ltTSbI6W+qYGMchAgCR6QnC1kOdKXN6X6pJhOWxFg=",
"lastModified": 1777320127,
"narHash": "sha256-Qu+Wf2Bp5qUjyn2YpZNq8a7JyzTGowhT1knrwE38a9U=",
"owner": "hyprwm",
"repo": "hyprlang",
"rev": "0d00dc118981531aa731150b6ea551ef037acddd",
"rev": "090117506ddc3d7f26e650ff344d378c2ec329cc",
"type": "github"
},
"original": {
@@ -532,18 +553,40 @@
"type": "github"
}
},
"hyprspace": {
"inputs": {
"hyprland": [
"hyprland"
],
"systems": "systems_3"
},
"locked": {
"lastModified": 1775071961,
"narHash": "sha256-LXkeeH9Blr6ohS1LAsVZbkJ/EAkkMDATh5qu45hC7Zo=",
"owner": "KZDKM",
"repo": "Hyprspace",
"rev": "12ddde04f8584bf7de3151e6169918e0dda9f822",
"type": "github"
},
"original": {
"owner": "KZDKM",
"repo": "Hyprspace",
"type": "github"
}
},
"hyprsplit": {
"inputs": {
"hyprland": [
"hyprland"
]
],
"nixpkgs": "nixpkgs_2"
},
"locked": {
"lastModified": 1766546378,
"narHash": "sha256-GSoSLHErh1mRfgXM57W98L67MMBHKCemHzxoZPrejSI=",
"lastModified": 1779414137,
"narHash": "sha256-XpwuFhwnfwPbzImZeUWWns///UEpoKNkpl1hN90C3Ag=",
"owner": "shezdy",
"repo": "hyprsplit",
"rev": "9a8b55f4269bfa5c59d03ed9f4502f433572c616",
"rev": "0fc01e7930625ecb3e069f5dc8e1d61eab929f3b",
"type": "github"
},
"original": {
@@ -591,11 +634,11 @@
]
},
"locked": {
"lastModified": 1764592794,
"narHash": "sha256-7CcO+wbTJ1L1NBQHierHzheQGPWwkIQug/w+fhTAVuU=",
"lastModified": 1772462885,
"narHash": "sha256-5pHXrQK9zasMnIo6yME6EOXmWGFMSnCITcfKshhKJ9I=",
"owner": "hyprwm",
"repo": "hyprtoolkit",
"rev": "5cfe0743f0e608e1462972303778d8a0859ee63e",
"rev": "9af245a69fa6b286b88ddfc340afd288e00a6998",
"type": "github"
},
"original": {
@@ -616,11 +659,11 @@
]
},
"locked": {
"lastModified": 1766160771,
"narHash": "sha256-roINUGikWRqqgKrD4iotKbGj3ZKJl3hjMz5l/SyKrHw=",
"lastModified": 1779475241,
"narHash": "sha256-Nw4DN0A5krWNcPBvuWe5Gz2yuxsUUPiDgtu6SVPJQeU=",
"owner": "hyprwm",
"repo": "hyprutils",
"rev": "5ac060bfcf2f12b3a6381156ebbc13826a05b09f",
"rev": "3cd3972b2ee658a14d2610d8494e09259e530124",
"type": "github"
},
"original": {
@@ -641,11 +684,11 @@
]
},
"locked": {
"lastModified": 1763640274,
"narHash": "sha256-Uan1Nl9i4TF/kyFoHnTq1bd/rsWh4GAK/9/jDqLbY5A=",
"lastModified": 1777159683,
"narHash": "sha256-Jxixw6wZphUp+nHYxOKUYSckL17QMBx2d5Zp0rJHr1g=",
"owner": "hyprwm",
"repo": "hyprwayland-scanner",
"rev": "f6cf414ca0e16a4d30198fd670ec86df3c89f671",
"rev": "b8632713a6beaf28b56f2a7b0ab2fb7088dbb404",
"type": "github"
},
"original": {
@@ -670,11 +713,11 @@
]
},
"locked": {
"lastModified": 1766253200,
"narHash": "sha256-26qPwrd3od+xoYVywSB7hC2cz9ivN46VPLlrsXyGxvE=",
"lastModified": 1778410714,
"narHash": "sha256-o6RzFj4nJXaPRY7EM01siuCQeT41RfwwmcmFQqwFJJg=",
"owner": "hyprwm",
"repo": "hyprwire",
"rev": "1079777525b30a947c8d657fac158e00ae85de9d",
"rev": "85148a8e612808cf5ddb25d0b3c5840f3498a7dc",
"type": "github"
},
"original": {
@@ -705,6 +748,27 @@
"type": "github"
}
},
"matugen": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"systems": "systems_4"
},
"locked": {
"lastModified": 1780068618,
"narHash": "sha256-LFiV5gdD4MkPrzBrc3Lq966vTQGuwwXC5WkgglWz7i4=",
"owner": "InioX",
"repo": "Matugen",
"rev": "74bfe9369a46589c5048072142796343a8d74168",
"type": "github"
},
"original": {
"owner": "InioX",
"repo": "Matugen",
"type": "github"
}
},
"nix-github-actions": {
"inputs": {
"nixpkgs": [
@@ -738,11 +802,11 @@
"rust-overlay": "rust-overlay_2"
},
"locked": {
"lastModified": 1766882181,
"narHash": "sha256-Xmu3JL68gT623ySytIOoyKqoH0tj3qhtNOnT79RRews=",
"lastModified": 1779062503,
"narHash": "sha256-CYyaA/qV6TzccHJuEwi8LE9x/rVpMAFztsymq+HYsQ8=",
"ref": "refs/heads/master",
"rev": "ddb728dae4c9d6842664395635c9d55fb65c8b56",
"revCount": 78,
"rev": "4fd264f24fdf87d701ec82e7c6a4ca3e15c1c0aa",
"revCount": 79,
"type": "git",
"url": "https://git.sakamoto.dev/kenji/nixovim.git"
},
@@ -753,16 +817,16 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1744536153,
"narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=",
"owner": "NixOS",
"lastModified": 1768127708,
"narHash": "sha256-1Sm77VfZh3mU0F5OqKABNLWxOuDeHIlcFjsXeeiPazs=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11",
"rev": "ffbc9f8cbaacfb331b6017d5a5abb21a492c9a38",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
@@ -781,11 +845,43 @@
},
"nixpkgs_2": {
"locked": {
"lastModified": 1766309749,
"narHash": "sha256-3xY8CZ4rSnQ0NqGhMKAy5vgC+2IVK0NoVEzDoOh4DA4=",
"lastModified": 1778869304,
"narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816",
"rev": "d233902339c02a9c334e7e593de68855ad26c4cb",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_3": {
"locked": {
"lastModified": 1744536153,
"narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_4": {
"locked": {
"lastModified": 1778869304,
"narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "d233902339c02a9c334e7e593de68855ad26c4cb",
"type": "github"
},
"original": {
@@ -802,14 +898,14 @@
"nixovim",
"nixpkgs"
],
"systems": "systems_3"
"systems": "systems_5"
},
"locked": {
"lastModified": 1766443759,
"narHash": "sha256-iGDhUPOPyY9NOTNHkhNzZKoz3+OlBNGg451qtvPq/Ic=",
"lastModified": 1779023681,
"narHash": "sha256-K7RLGyiK3J6wHr/JDxXdlGF0+0DEsdBf1w9mXjSyL8I=",
"owner": "nix-community",
"repo": "nixvim",
"rev": "1787eeda5a2ce35bcd57dbb482718b0d897786ae",
"rev": "0d05726bfb060f6559f6d64c1d427f3663dba178",
"type": "github"
},
"original": {
@@ -849,11 +945,11 @@
]
},
"locked": {
"lastModified": 1765911976,
"narHash": "sha256-t3T/xm8zstHRLx+pIHxVpQTiySbKqcQbK+r+01XVKc0=",
"lastModified": 1778507602,
"narHash": "sha256-kTwur1wV+01SdqskVMSo6JMEpg71ps3HpbFY2GsflKs=",
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "b68b780b69702a090c8bb1b973bab13756cc7a27",
"rev": "61ab0e80d9c7ab14c256b5b453d8b3fb0189ba0a",
"type": "github"
},
"original": {
@@ -868,11 +964,14 @@
"chaotic": "chaotic",
"elephant": "elephant",
"home-manager": "home-manager_2",
"hypr-dynamic-cursors": "hypr-dynamic-cursors",
"hyprland": "hyprland",
"hyprland-plugins": "hyprland-plugins",
"hyprspace": "hyprspace",
"hyprsplit": "hyprsplit",
"matugen": "matugen",
"nixovim": "nixovim",
"nixpkgs": "nixpkgs_2",
"nixpkgs": "nixpkgs_4",
"nur": "nur",
"sops-nix": "sops-nix",
"textfox": "textfox",
@@ -904,7 +1003,7 @@
},
"rust-overlay_2": {
"inputs": {
"nixpkgs": "nixpkgs"
"nixpkgs": "nixpkgs_3"
},
"locked": {
"lastModified": 1766544144,
@@ -927,11 +1026,11 @@
]
},
"locked": {
"lastModified": 1766289575,
"narHash": "sha256-BOKCwOQQIP4p9z8DasT5r+qjri3x7sPCOq+FTjY8Z+o=",
"lastModified": 1777944972,
"narHash": "sha256-VfGRo1qTBKOe3s2gOv8LSoA6Fk19PvBlwQ1ECN0Evn8=",
"owner": "Mic92",
"repo": "sops-nix",
"rev": "9836912e37aef546029e48c8749834735a6b9dad",
"rev": "c591bf665727040c6cc5cb409079acb22dcce33c",
"type": "github"
},
"original": {
@@ -972,31 +1071,31 @@
},
"systems_3": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"lastModified": 1689347949,
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"repo": "default-linux",
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"repo": "default-linux",
"type": "github"
}
},
"systems_4": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"lastModified": 1689347949,
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"repo": "default-linux",
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"repo": "default-linux",
"type": "github"
}
},
@@ -1016,6 +1115,36 @@
}
},
"systems_6": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"systems_7": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"systems_8": {
"locked": {
"lastModified": 1689347949,
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
@@ -1077,14 +1206,14 @@
"nixpkgs": [
"nixpkgs"
],
"systems": "systems_5"
"systems": "systems_7"
},
"locked": {
"lastModified": 1767353605,
"narHash": "sha256-j2nuPawvb33wjTV93htSiMRxGeTLLrKhwOEqmmTu5uY=",
"lastModified": 1779832601,
"narHash": "sha256-/dtn1sOTEcb/rNInzkdnK8PNIIDfQi7fEJfQEq+Is4g=",
"owner": "vicinaehq",
"repo": "vicinae",
"rev": "d89a9c9656486de144fd035bea7c2ea3b97fedf8",
"rev": "dc1f7d47725c68debdb31be26781a96c14bac059",
"type": "github"
},
"original": {
@@ -1101,7 +1230,7 @@
"nixpkgs": [
"nixpkgs"
],
"systems": "systems_6"
"systems": "systems_8"
},
"locked": {
"lastModified": 1766324177,
@@ -1145,11 +1274,11 @@
]
},
"locked": {
"lastModified": 1761431178,
"narHash": "sha256-xzjC1CV3+wpUQKNF+GnadnkeGUCJX+vgaWIZsnz9tzI=",
"lastModified": 1778265244,
"narHash": "sha256-8jlPtGSsv/CQY6tVVyLF4Jjd0gnS+Zbn9yk/V13A9nM=",
"owner": "hyprwm",
"repo": "xdg-desktop-portal-hyprland",
"rev": "4b8801228ff958d028f588f0c2b911dbf32297f9",
"rev": "813ea5ca9a1702a9a2d1f5836bc00172ef698968",
"type": "github"
},
"original": {
+16
View File
@@ -34,6 +34,14 @@
url = "github:hyprwm/hyprland-plugins";
inputs.hyprland.follows = "hyprland";
};
hyprspace = {
url = "github:KZDKM/Hyprspace";
inputs.hyprland.follows = "hyprland";
};
hypr-dynamic-cursors = {
url = "github:Virtcode/hypr-dynamic-cursors";
inputs.hyprland.follows = "hyprland";
};
nixovim = {
# FIXME: treesitter does not install automatically (disabled due to read-only problems)
url = "git+https://git.sakamoto.dev/kenji/nixovim.git";
@@ -60,6 +68,13 @@
url = "git+https://git.sakamoto.dev/kenji/nix-fonts.git";
inputs.nixpkgs.follows = "nixpkgs";
};
# TODO: unstable.nixpkgs `matugen` is stuck at v4.0.0
# may need to use `git` version first
matugen = {
url = "github:/InioX/Matugen";
inputs.nixpkgs.follows = "nixpkgs";
# ...
};
};
outputs = {
@@ -85,6 +100,7 @@
}
// allConfig.hakase;
modules = [
inputs.matugen.nixosModules.default
home-manager.nixosModules.home-manager
sops-nix.nixosModules.sops
chaotic.nixosModules.default
+1
View File
@@ -6,6 +6,7 @@
}: {
imports = [
../modules/home/terminal.nix
# ../modules/home/flatpak.nix
../modules/home/apps.nix
../modules/home/apps-optional.nix
../modules/home/hyprland.nix
+1
View File
@@ -9,5 +9,6 @@
../../modules/nixos/hyprland.nix
../../modules/nixos/gaming.nix
../../modules/nixos/amd.nix
../../modules/nixos/amdcpu.nix
];
}
+8 -1
View File
@@ -1,6 +1,7 @@
{
{pkgs, ...}: {
imports = [
../../apps/btop
../../apps/bottom
../../apps/anki
../../apps/gemini
../../apps/jellyfin
@@ -10,5 +11,11 @@
../../apps/jellyfin-mpv-shim
../../apps/nextcloud
../../apps/ttyper
../../apps/libreoffice
];
home.packages = with pkgs; [
chromium
imagemagick
hidapitester
];
}
+25
View File
@@ -0,0 +1,25 @@
{pkgs, ...}: let
flatpak-install = pkgs.writeShellScriptBin "flatpak-install" ''
flatpak install --user --bundle "$1"
echo
read -p "Press Enter to close..."
'';
in {
home.packages = [flatpak-install];
xdg.mimeApps = {
enable = true;
defaultApplications = {
"application/vnd.flatpak" = "flatpak-bundle-installer.desktop";
};
};
xdg.desktopEntries.flatpak-bundle-installer = {
name = "Flatpak Bundle Installer";
exec = "flatpak-install %f";
terminal = true;
noDisplay = true;
type = "Application";
mimeType = ["application/vnd.flatpak"];
};
}
+103 -20
View File
@@ -1,9 +1,58 @@
{pkgs, ...}: {
{
pkgs,
lib,
myConfig,
...
}: let
gamingMonitor = "DP-1";
gaming-focus = pkgs.writeShellScriptBin "gaming-focus" ''
# If already on gaming workspace on the gaming monitor, go back
current=$(${pkgs.hyprland}/bin/hyprctl activeworkspace -j | ${pkgs.jq}/bin/jq -r '.name')
focused=$(${pkgs.hyprland}/bin/hyprctl monitors -j | ${pkgs.jq}/bin/jq -r '.[] | select(.focused) | .name')
if [[ "$current" == "gaming" && "$focused" == "${gamingMonitor}" ]]; then
${pkgs.hyprland}/bin/hyprctl dispatch workspace previous
exit 0
fi
# Close special workspace on gaming monitor if open
special=$(${pkgs.hyprland}/bin/hyprctl monitors -j | ${pkgs.jq}/bin/jq -r '.[] | select(.name == "${gamingMonitor}") | .specialWorkspace.name')
if [[ -n "$special" ]]; then
# Gaming workspace is already underneath just close the special overlay
${pkgs.hyprland}/bin/hyprctl --batch "dispatch focusmonitor ${gamingMonitor};dispatch togglespecialworkspace ''${special#special:}"
else
${pkgs.hyprland}/bin/hyprctl --batch "dispatch focusmonitor ${gamingMonitor};dispatch workspace name:gaming"
fi
'';
# Games that should have `stayfocused` applied (to avoid multi-monitor focus issues)
stayFocusedGames = [
# "Deadlock"
# "project8"
# "citadel"
];
mkGameRules = selector: [
"match:${selector}, monitor ${gamingMonitor}"
"match:${selector}, fullscreen on"
"match:${selector}, immediate on"
"match:${selector}, tile on"
];
stayFocusedRules = lib.flatten (map (
game: [
"match:title ^(${game})$, stay_focused on"
"match:class ^(${game})$, stay_focused on"
]
)
stayFocusedGames);
in {
home.packages = with pkgs; [
protonup-qt
protontricks
mangohud
via
gaming-focus
# via
];
programs.mangohud = {
@@ -19,31 +68,65 @@
};
wayland.windowManager.hyprland.settings = {
workspace = [
"name:gaming, monitor:${gamingMonitor}, default:true"
];
exec-once = [
"[workspace special:steam silent] uwsm app -- steam"
"[workspace special:steam silent] steam"
];
bindd = [
"SUPER, T, Toggle Steam, togglespecialworkspace, steam"
"SUPER SHIFT, T, Move to Steam Special Workspace, movetoworkspace, special:steam"
"SUPER, A, Toggle Steam, togglespecialworkspace, steam"
"SUPER SHIFT, A, Move to Steam Special Workspace, movetoworkspace, special:steam"
"SUPER, G, Switch to Gaming Workspace, exec, gaming-focus"
"SUPER SHIFT, G, Move to Gaming Workspace, movetoworkspace, name:gaming"
];
windowrulev2 = [
# --- STEAM RULES ---
"workspace special:steam silent, class:^(steam)$"
"noinitialfocus, class:^(steam)$"
"suppressevent activate, class:^(steam)$"
windowrule =
[
"match:class ^(steam)$, hyprbars:no_bar on"
"match:class ^(steam_app_\\d+)$, hyprbars:no_bar on"
# --- GAMING RULES ---
"fullscreen, class:^steam_app_\d+$"
"monitor 0, class:^steam_app_\d+$"
"workspace 1, class:^steam_app_\d+$"
# --- STEAM GENERAL RULES ---
# Default ALL steam class windows to float. This catches all dialogs & properties windows.
"match:class ^(steam)$, float on"
# Suppress focus stealing from dialogs/etc.
"match:class ^(steam)$, no_initial_focus on"
"match:class ^(steam)$, suppress_event activate fullscreen maximize"
"fullscreen, class:^(gamescope)$"
"fullscreen, class:^(lutris)$"
"fullscreen, class:^(heroic)$"
"fullscreen, class:^wine-.*$"
"fullscreen, title:^Wine .*$"
];
# --- STEAM CLIENT OVERRIDE ---
# Override the float for the main Steam client, tile it, and move it to the special workspace.
"match:class ^(steam)$, tile on"
"match:class ^(steam)$, workspace special:steam"
# --- STEAM GAME OVERRIDES ---
# Override the float for actual games and move them to the gaming workspace.
# 1. Auto-detected steam_app games (like Deadlock).
"match:class ^(steam_app_\\d+)$, monitor ${gamingMonitor}"
"match:class ^(steam_app_\\d+)$, tile on"
"match:class ^(steam_app_\\d+)$, fullscreen on"
"match:class ^(steam_app_\\d+)$, immediate on"
"match:class ^(steam_app_\\d+)$, workspace name:gaming"
# 2. Behavior-detected manual games (e.g. ARC Raiders).
# This moves any steam game to the gaming workspace and tiles it when it becomes fullscreen.
"match:class ^(steam)$, match:fullscreen true, tile on"
"match:class ^(steam)$, match:fullscreen true, workspace name:gaming"
]
# Other auto-detected non-steam games
++ (mkGameRules "class ^(gamescope)$")
++ (mkGameRules "class ^(lutris)$")
++ (mkGameRules "class ^(heroic)$")
++ (mkGameRules "class ^wine-.*$")
++ (mkGameRules "title ^Wine .*$")
++ (mkGameRules "initial_title ^(?i)godot.*$")
# ++ [
# "monitor 0, initialTitle:^(?i)godot.*$"
# "fullscreen, initialTitle:^(?i)godot.*$"
# "tile, initialTitle:^(?i)godot.*$"
# ]
# Stayfocused rules
++ stayFocusedRules;
};
}
+8 -8
View File
@@ -34,22 +34,22 @@ in {
wayland.windowManager.hyprland.settings = {
workspace = [
"special:music, on-created-empty:hakase-music-launch"
"name:music, on-created-empty:hakase-music-launch"
];
bindd = [
"SUPER, M, Toggle Music, togglespecialworkspace, music"
"SUPER SHIFT, M, Move to Music Special Workspace, movetoworkspace, special:music"
"SUPER, M, Switch to Music, workspace, name:music"
"SUPER SHIFT, M, Move to Music Workspace, movetoworkspace, name:music"
];
windowrulev2 = [
windowrule = [
# --- MUSIC RULES (Jellyfin-TUI) ---
"workspace special:music silent, title:^(jellyfin-tui)$"
"workspace special:music silent, initialTitle:^(jellyfin-tui)$"
"match:title ^(jellyfin-tui)$, workspace name:music silent"
"match:initial_title ^(jellyfin-tui)$, workspace name:music silent"
# --- CAVA RULES ---
"workspace special:music silent, title:^(cava)$"
"workspace special:music silent, initialTitle:^(cava)$"
"match:title ^(cava)$, workspace name:music silent"
"match:initial_title ^(cava)$, workspace name:music silent"
];
};
}
+3 -3
View File
@@ -5,13 +5,13 @@
home.pointerCursor = {
gtk.enable = true;
package = pkgs.catppuccin-cursors.mochaDark;
name = "Catppuccin Mocha Dark";
package = pkgs.bibata-cursors;
name = "Bibata-Modern-Ice";
size = 24;
};
wayland.windowManager.hyprland.settings = {
env = [
"HYPRCURSOR_THEME,Catppuccin Mocha Dark"
"HYPRCURSOR_THEME,Bibata-Modern-Ice"
"HYPRCURSOR_SIZE,24"
];
};
+2 -2
View File
@@ -1,7 +1,7 @@
{pkgs, ...}: {
hardware.amdgpu = {
overdrive.enable = false;
overdrive.enable = true;
initrd.enable = true;
};
services.lact.enable = false;
services.lact.enable = true;
}
+4
View File
@@ -0,0 +1,4 @@
{pkgs, ...}: {
boot.kernelModules = ["zenpower"];
boot.blacklistedKernelModules = ["k10temp"];
}
+2
View File
@@ -1,5 +1,7 @@
{
imports = [
../../apps/qmk
./asrock-a620i.nix
# ../../apps/wireshark
];
}
+8
View File
@@ -0,0 +1,8 @@
{pkgs, ...}: {
# fan setup
programs.coolercontrol.enable = true;
boot.kernelModules = ["nct6683"];
boot.extraModprobeConfig = ''
options nct6683 force=1
'';
}
+15
View File
@@ -0,0 +1,15 @@
{ pkgs, ... }: {
# Install btop system-wide with ROCm support for GPU monitoring.
environment.systemPackages = [
(pkgs.btop.override { rocmSupport = true; })
];
# Create a security wrapper for btop to grant it capabilities
# to read CPU power information without running as root.
security.wrappers."btop-power" = {
source = "${pkgs.btop.override { rocmSupport = true; }}/bin/btop";
owner = "root";
group = "root";
capabilities = "cap_dac_read_search,cap_sys_ptrace+ep";
};
}
+3
View File
@@ -2,6 +2,8 @@
imports = [
./apps-optional.nix
./backlight.nix
./flatpak.nix
./btop.nix
./boot.nix
./fonts.nix
./hardware.nix
@@ -10,6 +12,7 @@
./kernel.nix
./nix.nix
./power.nix # TODO: this one has to be optional
./mouse-wakeup.nix
./programs.nix
./security.nix
./services.nix
+6
View File
@@ -0,0 +1,6 @@
{pkgs, ...}: {
services.flatpak.enable = true;
# GTK portal required by most Flatpak apps for file chooser and other dialogs
xdg.portal.extraPortals = [pkgs.xdg-desktop-portal-gtk];
}
+14
View File
@@ -0,0 +1,14 @@
{ lib, myConfig, ... }:
with lib;
let
cfg = myConfig.wakeup.mouse or {};
in
{
config = mkIf (cfg.disable or false && cfg.vendor != null && cfg.product != null) {
services.udev.extraRules = ''
# Disable wakeup for mouse configured in config.nix
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="${cfg.vendor}", ATTRS{idProduct}=="${cfg.product}", ATTR{power/wakeup}="disabled"
'';
};
}
+3 -20
View File
@@ -1,21 +1,4 @@
{pkgs, ...}: {
# USB wakeup configuration
# Disabling USB wakeups to prevent accidental wakeups from mouse/keyboard/bluetooth
systemd.services.disable-usb-wakeups = {
description = "Disable USB wakeup triggers";
wantedBy = ["multi-user.target" "post-resume.target"];
after = ["post-resume.target"];
serviceConfig = {
Type = "oneshot";
ExecStart = pkgs.writeShellScript "disable-usb-wakeups" ''
for device in XHC0 XHC1 XHC2 XH00 GPP0 GPP7; do
if grep -q "$device.*enabled" /proc/acpi/wakeup; then
echo "Disabling wakeup for $device"
echo "$device" > /proc/acpi/wakeup
fi
done
'';
RemainAfterExit = true;
};
};
{
# This file is intentionally left blank.
# USB wakeup is now handled by modules/nixos/mouse-wakeup.nix
}
+12 -4
View File
@@ -8,11 +8,11 @@
enable = true;
settings = {
initial_session = {
command = "${pkgs.hyprland}/bin/Hyprland";
command = "${pkgs.uwsm}/bin/start-hyprland";
user = "${myConfig.nixos.username}";
};
default_session = {
command = "${pkgs.tuigreet}/bin/tuigreet --time --remember --cmd Hyprland";
command = "${pkgs.tuigreet}/bin/tuigreet --time --remember --cmd start-hyprland";
};
};
};
@@ -24,11 +24,19 @@
gnome.gnome-keyring.enable = true;
# Complements printer support
printing.enable = true;
printing = {
enable = true;
drivers = with pkgs; [
gutenprint
cups-filters
hplip
cups-browsed
];
};
avahi = {
enable = true;
nssmdns4 = true;
openFirewall = false;
openFirewall = true;
};
pipewire = {
enable = true;
+1 -1
View File
@@ -9,7 +9,7 @@
users = {
${myConfig.nixos.username} = {
isNormalUser = true;
extraGroups = ["wheel" "networkmanager" "input" "video"];
extraGroups = ["wheel" "networkmanager" "input" "video" "wireshark"];
initialPassword = "password";
useDefaultShell = true;
};
+4
View File
@@ -3,5 +3,9 @@
git
cloudflared
cachix
appimage-run
python314
usbutils
wireshark
];
}