103 Commits

Author SHA1 Message Date
kenji 400b1a89d2 remove(hypr): hypr-window-rules is removed
for unknown reason, it slows down firefox
2026-06-07 09:19:58 -05:00
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
kenji 679f2e8f6b fix(zathura): preserve original colors in dark mode
Enabled 'recolor-keephue' to prevent documents from becoming purely monochrome
when recolor mode is active. This ensures images and colored text retain their
hue while still adapting brightness for the theme.
2026-01-15 16:18:18 -06:00
kenji 9aae7d6df9 feat(yazi): sort by newest (mtime) as default 2026-01-15 16:17:22 -06:00
kenji c6cd00f955 feat(yazi): enable full mouse support
Added 'mouse_events' to the Yazi manager configuration, enabling click, scroll,
touch, move, and drag interactions for better navigation and control.
2026-01-15 16:16:13 -06:00
kenji 33cb851539 fix(yazi): set as default handler for directories
This fixes the issue where "Show in folder" (e.g., in Firefox) would incorrectly
open other applications like Zathura. By explicitly associating 'inode/directory'
with 'yazi.desktop', folders will now open in Yazi as expected.
2026-01-15 16:14:27 -06:00
kenji 5ec7f5edc7 style(matugen): update zathura template to mimic pywal aesthetic
- Flattened UI elements (statusbar, inputbar, notifications) to use the
  surface background color, creating a seamless look similar to pywal themes.
- Changed highlight colors to use 'tertiary' and 'secondary' accents for
  better visibility and style consistency.
- Updated completion highlights for higher contrast.
2026-01-15 16:11:59 -06:00
kenji e7e5226c87 fix(zathura): use absolute path for matugen config and ensure file exists
- Updated 'extraConfig' to use an absolute path for the 'zathura-matugen'
  include, fixing path resolution issues.
- Added a home activation script to create an empty 'zathura-matugen' file
  if it doesn't exist, preventing zathura from crashing on fresh installs
  before matugen has run.
2026-01-15 16:08:45 -06:00
kenji b550064a15 fix(hyprland): set warps to false for stability 2026-01-15 15:56:30 -06:00
kenji 9ff47e94b2 fix(swayosd): ensure swayosd starts reliably
- Add explicit 'systemctl --user start swayosd' to Hyprland exec-once
- Harden systemd service definition with proper dependencies and targets
2026-01-15 15:52:35 -06:00
kenji 3dc170984b docs: add TODO to revise 2026-01-14 19:20:57 -06:00
kenji 97a23a26dd add(binds): focus between nonfloating and floaters 2026-01-14 19:20:13 -06:00
kenji da383a3526 feat(apps): add anki flashcards 2026-01-14 18:31:38 -06:00
kenji ad8b59f314 feat(apps): add zathura document viewer with matugen theming 2026-01-14 16:14:17 -06:00
kenji cfcf9d6f3a fix(nextcloud): removed redundant setsid 2026-01-14 16:10:52 -06:00
kenji 44af726a53 fix(nextcloud): use uwsm app for nexcloud 2026-01-14 09:14:42 -06:00
kenji 35f810dcf1 feat(nextcloud): add hyprland autostart 2026-01-13 16:27:47 -06:00
kenji af331d967a feat(apps): add nextcloud client 2026-01-13 16:25:45 -06:00
kenji d54fa4e999 feat(ghostty): optimize configuration 2026-01-11 20:11:42 -06:00
kenji 0197c58ea1 fix(waybar): resolve keybinding conflicts for system popups 2026-01-11 19:47:57 -06:00
kenji 1b4cfbe350 feat(waybar): add hyprland keybindings for system popups 2026-01-11 19:46:07 -06:00
kenji c4ed00e6c8 refactor(terminal): more modularity for default terminal font 2026-01-11 19:32:56 -06:00
kenji b720c1ff02 docs: add FIXME for nixovim 2026-01-11 19:32:29 -06:00
kenji 9ee5f40aa8 docs: add FIXME for waybar popup 2026-01-11 19:32:11 -06:00
60 changed files with 1190 additions and 308 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 ## Build Commands
```bash ```bash
# Rebuild and switch to new configuration # Rebuild and switch to new configuration (desktop x86_64)
sudo nixos-rebuild switch --flake ~/.config/nixos/#hakase 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 # Manage SOPS secrets
nix-shell -p sops --run "sops secrets/secrets.yaml" nix-shell -p sops --run "sops secrets/secrets.yaml"
nix-shell -p sops --run "sops updatekeys 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 ## 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 ### Key Entry Points
- `flake.nix` - Declares inputs and creates NixOS configuration - `flake.nix` - Declares inputs and creates both NixOS configurations (hakase, macbook)
- `config.nix` - Central configuration values (username, hostname, paths, theme settings, bookmarks) - `config.nix` - Central configuration values separated by host (hakase, macbook keys)
- `hosts/hakase/configuration.nix` - Host-level entry point that imports system modules - `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 ### Module Organization
**Two-tier module system:** **Three-tier system:**
- `modules/nixos/` - NixOS system-level modules (boot, kernel, services, hardware) 1. **System modules** (`modules/nixos/`) - NixOS-level settings (boot, kernel, services, hardware)
- `modules/home/` - Home Manager user-level modules (imported via `home/hakase.nix`) 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 ### Configuration Flow
``` ```
flake.nix flake.nix (outputs)
nixosConfigurations.hakase hakase (x86_64-linux)
├─ hosts/hakase/configuration.nix ├─ hosts/hakase/configuration.nix
│ └─ modules/nixos/default.nix (imports all system modules) │ └─ modules/nixos/default.nix (imports system modules)
└─ home-manager └─ home-manager
└─ home/hakase.nix └─ home/hakase.nix
└─ modules/home/* → apps/* └─ 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 ### Module Pattern
Modules receive these parameters: Modules receive standard NixOS parameters plus custom ones:
```nix ```nix
{ pkgs, config, myConfig, inputs, ... }: { pkgs, config, lib, myConfig, inputs, system, ... }:
``` ```
Access configuration values via `myConfig`: **Key patterns:**
```nix - Access host config: `myConfig.nixos.username`, `myConfig.terminal.default`
myConfig.nixos.username # "hakase" - Use host-specific packages: `pkgs.unstable` (from nixpkgs), `inputs.neovim` (from flake inputs)
myConfig.nixos.hostname # "hakase" - Reference other modules via `config` (e.g., `config.home.homeDirectory`)
myConfig.terminal.default # Terminal emulator - Conditional logic: Check `system` or `myConfig` values
myConfig.hyprland.monitors # Monitor configuration
```
### Secrets Management ### 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 ```nix
config.sops.secrets.secret_name.path config.sops.secrets.secret_name.path
``` ```
## Key Technologies ## Key Technologies
- **Hyprland** with UWSM (systemd session management) - **Hyprland** with UWSM (systemd user session management)
- **Stylix** for system-wide theming from wallpaper colors - **Matugen** for automatic system-wide theming from wallpaper colors
- **Home Manager** for user environment - **Home Manager** for user environment and program configuration
- **nixovim** flake for Neovim 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 ## 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.
+12
View File
@@ -0,0 +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 = { programs.btop = {
enable = true; enable = true;
settings = { settings = {
vim_keys = true; vim_keys = true;
color_theme = "TTY"; color_theme = "TTY";
theme_background = false; 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" "special:jellyfin, on-created-empty:uwsm app -- firefox -P web-app --name jellyfin https://watch.sakamoto.dev"
]; ];
windowrulev2 = [ windowrule = [
"workspace special:youtube, class:^(youtube)$" "match:class (?i)(firefox|youtube|jellyfin), opacity 1 1"
"workspace special:jellyfin, class:^(jellyfin)$" "match:class ^(youtube)$, workspace special:youtube"
"match:class ^(jellyfin)$, workspace special:jellyfin"
]; ];
}; };
imports = [ imports = [
@@ -47,6 +48,17 @@
set newtab about:newtab 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 = { programs.firefox = {
enable = true; enable = true;
languagePacks = ["en-US"]; languagePacks = ["en-US"];
@@ -83,6 +95,7 @@
ublock-origin ublock-origin
bitwarden bitwarden
tridactyl tridactyl
new-tab-override
]; ];
bookmarks = { bookmarks = {
+5 -1
View File
@@ -55,12 +55,16 @@
enableFishIntegration = true; enableFishIntegration = true;
settings = { settings = {
font-family = myConfig.font.monospace; font-family = myConfig.terminal.font;
confirm-close-surface = false; confirm-close-surface = false;
app-notifications = false; app-notifications = false;
window-padding-x = 15; window-padding-x = 15;
window-padding-y = 15; window-padding-y = 15;
window-padding-balance = true; window-padding-balance = true;
gtk-titlebar = false;
mouse-hide-while-typing = true;
copy-on-select = "clipboard";
auto-update = "off";
}; };
}; };
+5 -3
View File
@@ -14,13 +14,15 @@
./hypr/rules.nix ./hypr/rules.nix
./scripts/movement.nix ./scripts/movement.nix
./scripts/window-rules.nix
./scripts/workspace-toggle.nix
]; ];
wayland.windowManager.hyprland.enable = true; wayland.windowManager.hyprland.enable = true;
wayland.windowManager.hyprland.systemd.enable = false; # for UWSM support... wayland.windowManager.hyprland.systemd.enable = false; # for UWSM support...
wayland.windowManager.hyprland.plugins = [ wayland.windowManager.hyprland.plugins = [
pkgs.hyprlandPlugins.hyprsplit inputs.hyprsplit.packages.${pkgs.system}.hyprsplit
pkgs.hyprlandPlugins.hypr-dynamic-cursors # inputs.hypr-dynamic-cursors.packages.${pkgs.system}.hypr-dynamic-cursors
pkgs.hyprlandPlugins.hyprspace # inputs.hyprspace.packages.${pkgs.system}.Hyprspace
pkgs.hyprlandPlugins.hyprbars pkgs.hyprlandPlugins.hyprbars
]; ];
} }
+13 -4
View File
@@ -1,6 +1,9 @@
{pkgs, ...}: { {pkgs, ...}: {
# TODO: implement a way to show binds, preferably use vicinae. # TODO: implement a way to show binds, preferably use vicinae.
wayland.windowManager.hyprland.settings = { wayland.windowManager.hyprland.settings = {
binds = {
workspace_back_and_forth = true;
};
bindel = [ bindel = [
", XF86MonBrightnessUp, exec, ddcutil setvcp 10 + 10" ", XF86MonBrightnessUp, exec, ddcutil setvcp 10 + 10"
", XF86MonBrightnessDown, exec, ddcutil setvcp 10 - 10" ", XF86MonBrightnessDown, exec, ddcutil setvcp 10 - 10"
@@ -27,6 +30,7 @@
"SUPER, K, Move focus up, movefocus, u" "SUPER, K, Move focus up, movefocus, u"
"SUPER, H, Move focus left, movefocus, l" "SUPER, H, Move focus left, movefocus, l"
"SUPER, L, Move focus right, movefocus, r" "SUPER, L, Move focus right, movefocus, r"
"SUPER, G, Switch Focus (Float/Tile), exec, hakase-focus-switch"
# move window # move window
"SUPER SHIFT, h, Move window left, movewindow, l" "SUPER SHIFT, h, Move window left, movewindow, l"
@@ -45,7 +49,6 @@
# "SUPER, SPACE, Open App Launcher, exec, nc -U $XDG_RUNTIME_DIR/walker/walker.sock" # "SUPER, SPACE, Open App Launcher, exec, nc -U $XDG_RUNTIME_DIR/walker/walker.sock"
# TODO: # TODO:
# add text clipping from pictures
# add screen recording # add screen recording
# Special workspace # Special workspace
@@ -55,18 +58,24 @@
# [Workspaces] Toggle between most recent workspaces # [Workspaces] Toggle between most recent workspaces
"SUPER, Tab, Cycle workspaces, workspace, previous" "SUPER, Tab, Cycle workspaces, workspace, previous"
# [Workspaces] Move to another workspace
"CTRL SHIFT, H, Move to previous workspace, split:workspace, -1"
"CTRL SHIFT, L, Move to next workspace, split:workspace, +1"
"CTRL SHIFT, K, Move to previous workspace, split:workspace, -1"
"CTRL SHIFT, J, Move to next workspace, split:workspace, +1"
# hyprspace - workspace overview # 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 # and Super + Shift + [1-5] to move window to workspace on current monitor
builtins.concatLists (builtins.genList ( builtins.concatLists (builtins.genList (
i: let i: let
ws = i + 1; ws = i + 1;
key = toString ws; key = toString ws;
in [ 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}" "SUPER SHIFT, ${key}, Move window to workspace ${toString ws}, split:movetoworkspace, ${toString ws}"
] ]
) )
+2 -1
View File
@@ -15,7 +15,8 @@
# essentials # essentials
"hyprpm reload -n" "hyprpm reload -n"
"systemctl --user start hyprpolkitagent" "systemctl --user start hyprpolkitagent"
"hyprsunset -t 4500" # TODO: must be optional "systemctl --user start swayosd"
# "hyprsunset -t 4500" # TODO: must be optional
]; ];
}; };
} }
+5 -3
View File
@@ -4,11 +4,13 @@
gaps_in = 5; gaps_in = 5;
gaps_out = 15; gaps_out = 15;
layout = "dwindle"; layout = "dwindle";
allow_tearing = true;
resize_on_border = true;
}; };
decoration = { decoration = {
rounding = 0; rounding = 0;
active_opacity = 0.99; active_opacity = 1;
inactive_opacity = 0.70; inactive_opacity = 0.99;
shadow = { shadow = {
enabled = true; enabled = true;
range = 2; range = 2;
@@ -19,6 +21,7 @@
enabled = true; enabled = true;
size = 8; size = 8;
passes = 2; passes = 2;
new_optimizations = true;
special = true; special = true;
brightness = 0.60; brightness = 0.60;
contrast = 0.75; contrast = 0.75;
@@ -26,7 +29,6 @@
}; };
monitor = myConfig.hyprland.monitors; monitor = myConfig.hyprland.monitors;
dwindle = { dwindle = {
pseudotile = true;
preserve_split = true; preserve_split = true;
smart_split = false; smart_split = false;
}; };
+3 -2
View File
@@ -1,13 +1,14 @@
{ {myConfig, ...}: {
wayland.windowManager.hyprland.settings = { wayland.windowManager.hyprland.settings = {
input = { input = {
repeat_rate = 50; repeat_rate = 50;
repeat_delay = 300; repeat_delay = 300;
numlock_by_default = true; numlock_by_default = true;
kb_options = myConfig.hyprland.kb_options;
}; };
cursor = { cursor = {
hide_on_key_press = false; hide_on_key_press = false;
no_warps = true; no_warps = false;
}; };
}; };
} }
+1 -6
View File
@@ -1,12 +1,7 @@
{pkgs, ...}: { {pkgs, ...}: {
wayland.windowManager.hyprland.settings = { wayland.windowManager.hyprland.settings = {
layerrule = [ layerrule = [
# Blur and transparency for vicinae "match:namespace vicinae, blur true, ignore_alpha 0.0, no_anim true"
"blur, vicinae"
"ignorealpha 0, vicinae"
# Disable animation for vicinae
"noanim, vicinae"
]; ];
}; };
} }
+5 -1
View File
@@ -5,9 +5,13 @@
disable_splash_rendering = true; disable_splash_rendering = true;
focus_on_activate = true; focus_on_activate = true;
anr_missed_pings = 3; anr_missed_pings = 3;
new_window_takes_over_fullscreen = 1; on_focus_under_fullscreen = 1;
}; };
# experimental = {
# hdr = true;
# };
cursor = { cursor = {
no_hardware_cursors = true; no_hardware_cursors = true;
no_break_fs_vrr = true; no_break_fs_vrr = true;
+5
View File
@@ -1,5 +1,10 @@
{ {
wayland.windowManager.hyprland.settings = { 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 = [ workspace = [
]; ];
}; };
+21
View File
@@ -28,8 +28,29 @@
exit 0 exit 0
''; '';
# TODO: revise
hakase-focus-switch = pkgs.writeShellScriptBin "hakase-focus-switch" ''
HYPRCTL="${pkgs.hyprland}/bin/hyprctl"
JQ="${pkgs.jq}/bin/jq"
workspace_id=$($HYPRCTL activeworkspace -j | $JQ '.id')
active_window=$($HYPRCTL activewindow -j)
is_floating=$(echo "$active_window" | $JQ '.floating')
if [ "$is_floating" == "true" ]; then
target_addr=$($HYPRCTL clients -j | $JQ -r --argjson ws "$workspace_id" '[.[] | select(.workspace.id == $ws and .floating == false)] | .[0].address')
else
target_addr=$($HYPRCTL clients -j | $JQ -r --argjson ws "$workspace_id" '[.[] | select(.workspace.id == $ws and .floating == true)] | .[0].address')
fi
if [ "$target_addr" != "null" ] && [ -n "$target_addr" ]; then
$HYPRCTL dispatch focuswindow address:$target_addr
fi
'';
in { in {
home.packages = [ home.packages = [
hakase-workspace-switch-force hakase-workspace-switch-force
hakase-focus-switch
]; ];
} }
+71
View File
@@ -0,0 +1,71 @@
{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 = [
# FIXME: removed `hypr-window-rule` for excessive CPU usage. Reason unknown.
# "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=( combined=(
"''${greetings[@]}" "''${greetings[@]}"
"''${inspirations[@]}" "''${inspirations[@]}"
"''${cyberpunk[@]}" # "''${cyberpunk[@]}"
"''${yojijukugo[@]}" "''${yojijukugo[@]}"
"''${habits[@]}" "''${habits[@]}"
"''${dev[@]}" "''${dev[@]}"
+27 -14
View File
@@ -22,13 +22,24 @@
fi fi
tmp_file=$(mktemp) tmp_file=$(mktemp)
target_dir="$HOME/Pictures/Wallpapers" LAST_WALLPAPER_FILE="$HOME/.cache/last_wallpaper_path"
if [ ! -d "$target_dir" ]; then
target_dir="$HOME" 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 fi
# Ensure we are in a terminal that supports yazi # 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 if [ ! -f "$tmp_file" ]; then
echo "No selection file created." echo "No selection file created."
@@ -46,13 +57,14 @@
# Persistence logic # Persistence logic
CACHE_FILE="$HOME/.cache/current_wallpaper" CACHE_FILE="$HOME/.cache/current_wallpaper"
cp "$WALLPAPER" "$CACHE_FILE" cp "$WALLPAPER" "$CACHE_FILE"
echo "$WALLPAPER" > "$HOME/.cache/last_wallpaper_path"
# Reload hyprpaper # Reload hyprpaper
${pkgs.hyprland}/bin/hyprctl hyprpaper unload all ${pkgs.hyprland}/bin/hyprctl hyprpaper unload all
${pkgs.hyprland}/bin/hyprctl hyprpaper preload "$CACHE_FILE" ${pkgs.hyprland}/bin/hyprctl hyprpaper preload "$CACHE_FILE"
${pkgs.hyprland}/bin/hyprctl hyprpaper wallpaper ",$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 { in {
wayland.windowManager.hyprland.settings = { wayland.windowManager.hyprland.settings = {
@@ -64,22 +76,23 @@ in {
"SUPER CTRL, I, Switch Wallpaper, exec, hakase-wallpaper-switch" "SUPER CTRL, I, Switch Wallpaper, exec, hakase-wallpaper-switch"
]; ];
windowrulev2 = [ windowrule = [
# --- WALLPAPER PICKER --- # --- WALLPAPER PICKER ---
"float, class:^(org\.hakase\.switch-wallpaper)$" "match:class ^(org\.hakase\.switch-wallpaper)$, float on"
"float, initialTitle:^(Wallpaper Selector)$" "match:initial_title ^(Wallpaper Selector)$, float on"
"center, class:^(org\.hakase\.switch-wallpaper)$" "match:class ^(org\.hakase\.switch-wallpaper)$, center on"
"center, initialTitle:^(Wallpaper Selector)$" "match:initial_title ^(Wallpaper Selector)$, center on"
"size 60% 60%, class:^(org\.hakase\.switch-wallpaper)$" "match:class ^(org\.hakase\.switch-wallpaper)$, size 60% 60%"
"size 60% 60%, initialTitle:^(Wallpaper Selector)$" "match:initial_title ^(Wallpaper Selector)$, size 60% 60%"
"dimaround, class:^(org\.hakase\.switch-wallpaper)$" "match:class ^(org\.hakase\.switch-wallpaper)$, dim_around on"
"dimaround, initialTitle:^(Wallpaper Selector)$" "match:initial_title ^(Wallpaper Selector)$, dim_around on"
]; ];
}; };
services.hyprpaper = { services.hyprpaper = {
enable = true; enable = true;
settings = { settings = {
splash = false;
preload = [cacheWallpaper]; preload = [cacheWallpaper];
wallpaper = [ wallpaper = [
",${cacheWallpaper}" ",${cacheWallpaper}"
+3 -3
View File
@@ -73,9 +73,9 @@ in {
show = no show = no
''; '';
wayland.windowManager.hyprland.settings.windowrulev2 = [ wayland.windowManager.hyprland.settings.windowrule = [
# --- IMAGE VIEWER (swayimg) --- # --- IMAGE VIEWER (swayimg) ---
"float, class:^(swayimg)$" "match:class ^(swayimg)$, float on"
"center, class:^(swayimg)$" "match:class ^(swayimg)$, center on"
]; ];
} }
+7 -7
View File
@@ -62,14 +62,14 @@
wayland.windowManager.hyprland.settings = { wayland.windowManager.hyprland.settings = {
exec-once = [ "systemctl --user start jellyfin-mpv-shim" ]; exec-once = [ "systemctl --user start jellyfin-mpv-shim" ];
windowrulev2 = [ windowrule = [
# --- JELLYFIN MPV SHIM --- # --- JELLYFIN MPV SHIM ---
"float, class:^(jellyfin-mpv-shim)$" "match:class ^(jellyfin-mpv-shim)$, float on"
"center, class:^(jellyfin-mpv-shim)$" "match:class ^(jellyfin-mpv-shim)$, center on"
"size 70% 70%, class:^(jellyfin-mpv-shim)$" "match:class ^(jellyfin-mpv-shim)$, size 70% 70%"
"opacity 1.0 override 1.0 override, class:^(jellyfin-mpv-shim)$" "match:class ^(jellyfin-mpv-shim)$, opacity 1.0 override 1.0 override"
"idleinhibit focus, class:^(jellyfin-mpv-shim)$" "match:class ^(jellyfin-mpv-shim)$, idle_inhibit focus"
"noblur, class:^(jellyfin-mpv-shim)$" "match:class ^(jellyfin-mpv-shim)$, no_blur on"
]; ];
}; };
} }
+5
View File
@@ -0,0 +1,5 @@
{pkgs, ...}: {
home.packages = with pkgs; [
libreoffice-fresh
];
}
+4
View File
@@ -24,6 +24,10 @@ output_path = "~/.config/starship.toml"
input_path = "~/.config/matugen/templates/walker" input_path = "~/.config/matugen/templates/walker"
output_path = "~/.config/walker/themes/nixos/style.css" output_path = "~/.config/walker/themes/nixos/style.css"
[templates.zathura]
input_path = "~/.config/matugen/templates/zathura"
output_path = "~/.config/zathura/zathura-matugen"
[templates.pywalfox] [templates.pywalfox]
input_path = '~/.config/matugen/templates/firefox' input_path = '~/.config/matugen/templates/firefox'
output_path = '~/.cache/wal/colors.json' output_path = '~/.cache/wal/colors.json'
+23 -1
View File
@@ -5,7 +5,7 @@
... ...
}: { }: {
home.packages = with pkgs; [ home.packages = with pkgs; [
matugen inputs.matugen.packages.${pkgs.system}.default
dconf dconf
psmisc # for killall psmisc # for killall
]; ];
@@ -36,6 +36,7 @@
home.file.".config/matugen/templates/hyprlock".source = ./templates/hyprlock; home.file.".config/matugen/templates/hyprlock".source = ./templates/hyprlock;
home.file.".config/matugen/templates/starship".source = ./templates/starship; home.file.".config/matugen/templates/starship".source = ./templates/starship;
home.file.".config/matugen/templates/waybar".source = ./templates/waybar; home.file.".config/matugen/templates/waybar".source = ./templates/waybar;
home.file.".config/matugen/templates/zathura".source = ./templates/zathura;
home.file.".config/matugen/templates/vicinae".text = '' home.file.".config/matugen/templates/vicinae".text = ''
# Vicinae Matugen Theme Template # Vicinae Matugen Theme Template
@@ -351,6 +352,15 @@
platformTheme.name = "gtk"; 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 theming with adw-gtk3 and Matugen colors
gtk = { gtk = {
enable = true; enable = true;
@@ -363,7 +373,19 @@
package = pkgs.papirus-icon-theme; package = pkgs.papirus-icon-theme;
}; };
gtk3.extraCss = ''@import url("colors.css");''; 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.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"; programs.ghostty.settings.theme = "matugen";
+41
View File
@@ -0,0 +1,41 @@
set default-bg "#{{colors.surface.default.hex_stripped}}"
set default-fg "#{{colors.on_surface.default.hex_stripped}}"
set statusbar-bg "#{{colors.surface.default.hex_stripped}}"
set statusbar-fg "#{{colors.on_surface.default.hex_stripped}}"
set inputbar-bg "#{{colors.surface.default.hex_stripped}}"
set inputbar-fg "#{{colors.on_surface.default.hex_stripped}}"
set notification-bg "#{{colors.surface.default.hex_stripped}}"
set notification-fg "#{{colors.on_surface.default.hex_stripped}}"
set notification-error-bg "#{{colors.error.default.hex_stripped}}"
set notification-error-fg "#{{colors.on_error.default.hex_stripped}}"
set notification-warning-bg "#{{colors.tertiary.default.hex_stripped}}"
set notification-warning-fg "#{{colors.on_tertiary.default.hex_stripped}}"
set highlight-color "#{{colors.tertiary.default.hex_stripped}}"
set highlight-active-color "#{{colors.secondary.default.hex_stripped}}"
set completion-bg "#{{colors.surface.default.hex_stripped}}"
set completion-fg "#{{colors.on_surface.default.hex_stripped}}"
set completion-group-bg "#{{colors.surface.default.hex_stripped}}"
set completion-group-fg "#{{colors.on_surface.default.hex_stripped}}"
set completion-highlight-bg "#{{colors.on_surface.default.hex_stripped}}"
set completion-highlight-fg "#{{colors.surface.default.hex_stripped}}"
set index-bg "#{{colors.surface.default.hex_stripped}}"
set index-fg "#{{colors.on_surface.default.hex_stripped}}"
set index-active-bg "#{{colors.surface_container.default.hex_stripped}}"
set index-active-fg "#{{colors.on_surface.default.hex_stripped}}"
set render-loading-bg "#{{colors.surface.default.hex_stripped}}"
set render-loading-fg "#{{colors.on_surface.default.hex_stripped}}"
set recolor-lightcolor "#{{colors.surface.default.hex_stripped}}"
set recolor-darkcolor "#{{colors.on_surface.default.hex_stripped}}"
+10 -5
View File
@@ -10,6 +10,11 @@
osc = "no"; osc = "no";
osd-bar = "no"; osd-bar = "no";
border = "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) --- # --- VIDEO PLAYER (mpv) ---
"float, class:^(mpv)$" "match:class ^(mpv)$, float on"
"center, class:^(mpv)$" "match:class ^(mpv)$, center on"
"size 70% 70%, class:^(mpv)$" "match:class ^(mpv)$, size 60% 70%"
]; ];
} }
+1
View File
@@ -5,6 +5,7 @@
... ...
}: { }: {
home.packages = [ home.packages = [
# FIXME: does not dynamically update with matugen when open
inputs.nixovim.packages.${pkgs.system}.full inputs.nixovim.packages.${pkgs.system}.full
]; ];
} }
+9
View File
@@ -0,0 +1,9 @@
{pkgs, ...}: {
home.packages = with pkgs; [
nextcloud-client
];
wayland.windowManager.hyprland.settings.exec-once = [
"uwsm app -- nextcloud --background"
];
}
+8 -1
View File
@@ -27,8 +27,13 @@
wl-copy < "$filepath" wl-copy < "$filepath"
notify-send "Screenshot saved" "Saved and copied to clipboard" 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 exit 1
;; ;;
esac esac
@@ -40,6 +45,7 @@ in {
swappy # Annotation tool swappy # Annotation tool
jq # For window selection jq # For window selection
wl-clipboard # For copying to clipboard wl-clipboard # For copying to clipboard
tesseract # OCR tool
screenshot # Our wrapper script screenshot # Our wrapper script
]; ];
@@ -66,5 +72,6 @@ in {
"SUPER SHIFT, S, Screenshot Active Window, exec, screenshot window" "SUPER SHIFT, S, Screenshot Active Window, exec, screenshot window"
"SUPER ALT, S, Quick Screenshot (no edit), exec, screenshot region-save" "SUPER ALT, S, Quick Screenshot (no edit), exec, screenshot region-save"
"SUPER ALT SHIFT, S, Screenshot Current Monitor, exec, screenshot screen" "SUPER ALT SHIFT, S, Screenshot Current Monitor, exec, screenshot screen"
"SUPER ALT, E, OCR Selection, exec, screenshot ocr"
]; ];
} }
+5 -2
View File
@@ -10,11 +10,14 @@
Unit = { Unit = {
StartLimitBurst = lib.mkForce 5; StartLimitBurst = lib.mkForce 5;
StartLimitIntervalSec = lib.mkForce 30; StartLimitIntervalSec = lib.mkForce 30;
After = [ "graphical-session.target" ];
PartOf = [ "graphical-session.target" ];
}; };
Service = { Service = {
Restart = lib.mkForce "on-failure"; Restart = lib.mkForce "on-failure";
RestartSec = lib.mkForce "100ms"; RestartSec = lib.mkForce "1s";
}; };
Install.WantedBy = [ "graphical-session.target" ];
}; };
wayland.windowManager.hyprland.settings = { wayland.windowManager.hyprland.settings = {
@@ -24,7 +27,7 @@
]; ];
bindl = [ bindl = [
", XF86AudioMute, exec, swayosd-client --output-volume mute-toggle" ", 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 = [ bindd = [
"SUPER, SPACE, Open Vicinae, exec, vicinae-toggle" "SUPER, SPACE, Open Vicinae, exec, vicinae-toggle"
"SUPER, period, Open Emoji Picker, exec, vicinae-toggle deeplink vicinae://extensions/vicinae/core/search-emojis" "SUPER, period, Open Emoji Picker, exec, vicinae-toggle deeplink vicinae://launch/core/search-emojis"
# FIXME: calculator history does not allow you to calculate "SUPER, C, Open Calculator, exec, vicinae-toggle deeplink vicinae://launch/calculator/history"
"SUPER, C, Open Calculator, exec, vicinae-toggle deeplink vicinae://extensions/vicinae/calculator/history" "SUPER, V, Open Clipboard History, exec, vicinae-toggle deeplink vicinae://launch/clipboard/history"
"SUPER, V, Open Clipboard History, exec, vicinae-toggle deeplink vicinae://extensions/vicinae/clipboard/history"
]; ];
}; };
} }
+85 -53
View File
@@ -4,53 +4,53 @@
myConfig, myConfig,
... ...
}: let }: let
# FIXME: waybar overlaps fullscreen display when restarting waybar
hakase-popup-launch = pkgs.writeShellScriptBin "hakase-popup-launch" '' hakase-popup-launch = pkgs.writeShellScriptBin "hakase-popup-launch" ''
tui_name=$1 tui_name=$1
active_popup=$(${pkgs.hyprland}/bin/hyprctl clients -j | ${pkgs.jq}/bin/jq -r '.[] | select(.class | startswith("org.hakase.")) | .class') active_popup=$(${pkgs.hyprland}/bin/hyprctl clients -j | ${pkgs.jq}/bin/jq -r '.[] | select(.class | startswith("org.hakase.")) | .class')
if [[ -z "''${tui_name}" ]]; then if [[ -z "''${tui_name}" ]]; then
echo "Usage: $(basename "$0") [tui-name]" echo "Usage: $(basename "$0") [tui-name]"
exit 1 exit 1
fi fi
popup_checker() {
if [[ -z "$active_popup" ]]; then
echo "no_popup"
elif [[ "$active_popup" != "org.hakase.popup.''${tui_name}" ]]; then
echo "different"
else
echo "same"
fi
}
popup_checker() {
if [[ -z "$active_popup" ]]; then
echo "no_popup"
elif [[ "$active_popup" != "org.hakase.popup.''${tui_name}" ]]; then
echo "different"
else
echo "same"
fi
}
launch() { launch() {
exec ${pkgs.util-linux}/bin/setsid uwsm-app -- xdg-terminal-exec --app-id=org.hakase.popup."''${tui_name}" -e "''${tui_name}" exec ${pkgs.util-linux}/bin/setsid uwsm-app -- xdg-terminal-exec --app-id=org.hakase.popup."''${tui_name}" -e "''${tui_name}"
} }
focus() { focus() {
exec ${pkgs.hyprland}/bin/hyprctl dispatch focuswindow "class:org.hakase.popup.''${tui_name}" exec ${pkgs.hyprland}/bin/hyprctl dispatch focuswindow "class:org.hakase.popup.''${tui_name}"
} }
replace() { replace() {
${pkgs.hyprland}/bin/hyprctl dispatch closewindow "class:''${active_popup}" ${pkgs.hyprland}/bin/hyprctl dispatch closewindow "class:''${active_popup}"
sleep 0.3 sleep 0.3
launch launch
} }
run() { run() {
local status local status
status=$(popup_checker) status=$(popup_checker)
if [[ "$status" == "no_popup" ]]; then if [[ "$status" == "no_popup" ]]; then
launch launch
elif [[ "$status" == "same" ]]; then elif [[ "$status" == "same" ]]; then
focus focus
elif [[ "$status" == "different" ]]; then elif [[ "$status" == "different" ]]; then
replace replace
fi fi
} }
run run
''; '';
in { in {
wayland.windowManager.hyprland.settings = { wayland.windowManager.hyprland.settings = {
@@ -58,13 +58,20 @@ in {
"uwsm app -- waybar" "uwsm app -- waybar"
]; ];
windowrulev2 = [ bind = [
"SUPER, Escape, exec, hakase-popup-launch btop"
"SUPER, N, exec, hakase-popup-launch impala"
"SUPER, B, exec, hakase-popup-launch bluetui"
"SUPER, T, exec, hakase-popup-launch wiremix"
];
windowrule = [
# --- POPUP RULES (Wifi, BT, Audio) --- # --- POPUP RULES (Wifi, BT, Audio) ---
"float, class:^(org\.hakase\.popup\..*)$" "match:class ^(org\.hakase\.popup\..*)$, float on"
"size 900 600, class:^(org\.hakase\.popup\..*)$" "match:class ^(org\.hakase\.popup\..*)$, size 900 600"
"center, class:^(org\.hakase\.popup\..*)$" "match:class ^(org\.hakase\.popup\..*)$, center on"
"animation slide right, class:^(org\.hakase\.popup\..*)$" "match:class ^(org\.hakase\.popup\..*)$, animation slide right"
"dimaround, class:^(org\.hakase\.popup\..*)$" "match:class ^(org\.hakase\.popup\..*)$, dim_around on"
]; ];
}; };
imports = [ imports = [
@@ -109,18 +116,38 @@ in {
all-outputs = true; all-outputs = true;
format = "{icon}"; format = "{icon}";
format-icons = { format-icons = {
"music" = "󰎆";
"gaming" = "󰊖";
"default" = ""; "default" = "";
"active" = "󱓻";
# Numbered workspaces 1-5
"1" = "1"; "1" = "1";
"2" = "2"; "2" = "2";
"3" = "3"; "3" = "3";
"4" = "4"; "4" = "4";
"5" = "5"; "5" = "5";
"6" = "6";
"7" = "7"; # Kanji for workspaces 6-10
"8" = "8"; "6" = "1";
"9" = "9"; "7" = "2";
"10" = "0"; "8" = "3";
"active" = "󱓻"; "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 = { persistent-workspaces = {
"1" = []; "1" = [];
@@ -128,6 +155,11 @@ in {
"3" = []; "3" = [];
"4" = []; "4" = [];
"5" = []; "5" = [];
"6" = [];
"7" = [];
"8" = [];
"9" = [];
"10" = [];
}; };
}; };
@@ -136,16 +168,16 @@ in {
show-special = true; show-special = true;
special-visible-only = true; special-visible-only = true;
all-outputs = true; all-outputs = true;
ignore-workspaces = ["^[0-9]+$"]; ignore-workspaces = ["^([0-9]+|gaming|music|jellyfin)$"];
format = "{icon}"; format = "{icon}";
format-icons = { format-icons = {
"special:youtube" = "󰗃"; "special:youtube" = "󰗃";
"special:music" = "󰎆";
"special:steam" = "󰓓"; "special:steam" = "󰓓";
"special:custom" = "󱗼"; "special:custom" = "󱗼";
"special:preload" = "󱗼"; "special:preload" = "󱗼";
"special:jellyfin" = "󰟞";
"jellyfin" = "󰟞";
"youtube" = "󰗃"; "youtube" = "󰗃";
"music" = "󰎆";
"steam" = "󰓓"; "steam" = "󰓓";
"custom" = "󱗼"; "custom" = "󱗼";
"preload" = "󱗼"; "preload" = "󱗼";
+12
View File
@@ -36,6 +36,18 @@
opacity: 0.5; 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, #cpu,
#battery, #battery,
#pulseaudio, #pulseaudio,
+5
View File
@@ -0,0 +1,5 @@
{
programs.wireshark.enable = true;
# dumpcap.enable = true;
usbmon.enable = true;
}
+53 -7
View File
@@ -71,19 +71,57 @@
fi fi
''; '';
in { in {
wayland.windowManager.hyprland.settings = {
bindd = [
"SUPER, X, Open File Manager, exec, uwsm app -- yazi"
];
};
programs.yazi = { programs.yazi = {
enable = true; enable = true;
enableFishIntegration = true; enableFishIntegration = true;
settings = { settings = {
manager = { manager = {
show_hidden = true; show_hidden = false;
sort_by = "natural"; sort_by = "mtime";
sort_dir_first = true; sort_reverse = true;
sort_dir_first = false;
linemode = "size"; linemode = "size";
mouse_events = ["click" "scroll" "touch" "move" "drag"];
}; };
tasks = { tasks = {
image_bound = [10000 10000]; 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";
}
];
};
}; };
}; };
@@ -107,10 +145,18 @@ in {
default=hyprland;gtk default=hyprland;gtk
org.freedesktop.impl.portal.FileChooser=termfilechooser org.freedesktop.impl.portal.FileChooser=termfilechooser
''; '';
wayland.windowManager.hyprland.settings.windowrulev2 = [
xdg.mimeApps = {
enable = true;
defaultApplications = {
"inode/directory" = "yazi.desktop";
};
};
wayland.windowManager.hyprland.settings.windowrule = [
# File picker yazi - floating, centered, smaller size # File picker yazi - floating, centered, smaller size
"float, class:^(org\\.hakase\\.popup\\.yazi)$" "match:class ^(org\\.hakase\\.popup\\.yazi)$, float on"
"size 60% 70%, class:^(org\\.hakase\\.popup\\.yazi)$" "match:class ^(org\\.hakase\\.popup\\.yazi)$, size 60% 70%"
"center, class:^(org\\.hakase\\.popup\\.yazi)$" "match:class ^(org\\.hakase\\.popup\\.yazi)$, center on"
]; ];
} }
+38
View File
@@ -0,0 +1,38 @@
{
pkgs,
config,
lib,
...
}: {
home.packages = with pkgs; [
ocrmypdf
];
programs.zathura = {
enable = true;
options = {
selection-clipboard = "clipboard";
adjust-open = "best-fit";
pages-per-row = 1;
scroll-page-aware = "true";
scroll-full-overlap = "0.01";
scroll-step = 100;
zoom-min = 10;
recolor = true;
recolor-keephue = true;
};
extraConfig = "include ${config.home.homeDirectory}/.config/zathura/zathura-matugen";
};
home.activation.createZathuraMatugen = lib.hm.dag.entryAfter ["writeBoundary"] ''
if [ ! -f "${config.home.homeDirectory}/.config/zathura/zathura-matugen" ]; then
touch "${config.home.homeDirectory}/.config/zathura/zathura-matugen"
fi
'';
xdg.mimeApps = {
enable = true;
defaultApplications = {
"application/pdf" = "org.pwmt.zathura.desktop";
};
};
}
+27 -1
View File
@@ -16,20 +16,37 @@
email = "kenji@hakase"; email = "kenji@hakase";
defaultBranch = "master"; defaultBranch = "master";
}; };
theme = {
mode = "dark";
};
terminal = { terminal = {
default = "ghostty"; default = "ghostty";
font = "MonoLisa";
aliases = { aliases = {
update = "sudo nixos-rebuild switch --flake ~/.config/nixos/#hakase"; update = "sudo nixos-rebuild switch --flake ~/.config/nixos/#hakase";
}; };
}; };
btop = {
autostart = true;
monitor = "HDMI-A-1";
};
hyprland = { hyprland = {
monitors = [ 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" "DP-2, highres@165,760x0,1"
"HDMI-A-1, highres@highrr@120, 3440x1440, 1.6" "HDMI-A-1, highres@highrr@120, 3440x1440, 1.6"
]; ];
wallpaper = "firewatch.png"; wallpaper = "firewatch.png";
kb_options = "";
};
wakeup = {
mouse = {
disable = true;
vendor = "3710";
product = "5406";
};
}; };
firefox = { firefox = {
bookmarks = [ bookmarks = [
@@ -73,12 +90,20 @@
email = "kenji@macbook"; email = "kenji@macbook";
defaultBranch = "master"; defaultBranch = "master";
}; };
theme = {
mode = "dark";
};
terminal = { terminal = {
default = "ghostty"; default = "ghostty";
font = "MonoLisa";
aliases = { aliases = {
update = "sudo nixos-rebuild switch --flake ~/.config/nixos/#macbook"; update = "sudo nixos-rebuild switch --flake ~/.config/nixos/#macbook";
}; };
}; };
btop = {
autostart = false;
monitor = "eDP-1";
};
hyprland = { hyprland = {
# M1 Pro/Max/Air screens are usually built-in eDP-1. # M1 Pro/Max/Air screens are usually built-in eDP-1.
# HiDPI scale 2.0 is safe for Retina. # HiDPI scale 2.0 is safe for Retina.
@@ -86,6 +111,7 @@
"eDP-1, highres, auto, 2" "eDP-1, highres, auto, 2"
]; ];
wallpaper = "firewatch.png"; wallpaper = "firewatch.png";
kb_options = "";
}; };
firefox = { firefox = {
bookmarks = [ bookmarks = [
Generated
+222 -93
View File
@@ -41,11 +41,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1765900596, "lastModified": 1778857089,
"narHash": "sha256-+hn8v9jkkLP9m+o0Nm5SiEq10W0iWDSotH2XfjU45fA=", "narHash": "sha256-TclWRW2SdFeETLaiTG4BA8C8C4m/LppQEldncqyTzAQ=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "aquamarine", "repo": "aquamarine",
"rev": "d83c97f8f5c0aae553c1489c7d9eff3eadcadace", "rev": "ab2b0af63fbc9fb779d684f19149b790978be8a8",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -141,15 +141,15 @@
"flake-compat_2": { "flake-compat_2": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1761588595, "lastModified": 1767039857,
"narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=", "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
"owner": "edolstra", "owner": "NixOS",
"repo": "flake-compat", "repo": "flake-compat",
"rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5", "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "edolstra", "owner": "NixOS",
"repo": "flake-compat", "repo": "flake-compat",
"type": "github" "type": "github"
} }
@@ -181,11 +181,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1765835352, "lastModified": 1778716662,
"narHash": "sha256-XswHlK/Qtjasvhd1nOa1e8MgZ8GS//jBoTqWtrS1Giw=", "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
"owner": "hercules-ci", "owner": "hercules-ci",
"repo": "flake-parts", "repo": "flake-parts",
"rev": "a34fae9c08a15ad73f295041fec82323541400a9", "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -231,7 +231,7 @@
}, },
"flake-utils": { "flake-utils": {
"inputs": { "inputs": {
"systems": "systems_4" "systems": "systems_6"
}, },
"locked": { "locked": {
"lastModified": 1731533236, "lastModified": 1731533236,
@@ -310,6 +310,27 @@
"type": "github" "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": { "hyprcursor": {
"inputs": { "inputs": {
"hyprlang": [ "hyprlang": [
@@ -326,11 +347,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1753964049, "lastModified": 1776511930,
"narHash": "sha256-lIqabfBY7z/OANxHoPeIrDJrFyYy9jAM4GQLzZ2feCM=", "narHash": "sha256-fCpwFiTW0rT7oKJqr3cqHMnkwypSwQKpbtUEtxdkgrM=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprcursor", "repo": "hyprcursor",
"rev": "44e91d467bdad8dcf8bbd2ac7cf49972540980a5", "rev": "39435900785d0c560c6ae8777d29f28617d031ef",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -355,11 +376,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1763733840, "lastModified": 1776426399,
"narHash": "sha256-JnET78yl5RvpGuDQy3rCycOCkiKoLr5DN1fPhRNNMco=", "narHash": "sha256-RUESLKNikIeEq9ymGJ6nmcDXiSFQpUW1IhJ245nL3xM=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprgraphics", "repo": "hyprgraphics",
"rev": "8f1bec691b2d198c60cccabca7a94add2df4ed1a", "rev": "68d064434787cf1ed4a2fe257c03c5f52f33cf84",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -387,11 +408,11 @@
"xdph": "xdph" "xdph": "xdph"
}, },
"locked": { "locked": {
"lastModified": 1767300597, "lastModified": 1779983308,
"narHash": "sha256-lGE1j1bEuNp7XoDP+oyyF/c+MzYAs6S+sz0NK71nXZE=", "narHash": "sha256-mvjt5EqRubXF5w1RnyLsWOduJQzHDZCjohWJz/TUvJM=",
"ref": "refs/heads/main", "ref": "refs/heads/main",
"rev": "31d3181e1ee91e338fb4fb8207d64b8d689310fc", "rev": "ebc1816dfb27f1091c9713876669e092a215382d",
"revCount": 6766, "revCount": 7376,
"submodules": true, "submodules": true,
"type": "git", "type": "git",
"url": "https://github.com/hyprwm/Hyprland" "url": "https://github.com/hyprwm/Hyprland"
@@ -435,11 +456,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1765643131, "lastModified": 1776426575,
"narHash": "sha256-CCGohW5EBIRy4B7vTyBMqPgsNcaNenVad/wszfddET0=", "narHash": "sha256-KI6nIfVihn/DPaeB5Et46Xg3dkNHrrEtUd5LBBVomB0=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprland-guiutils", "repo": "hyprland-guiutils",
"rev": "e50ae912813bdfa8372d62daf454f48d6df02297", "rev": "a968d211048e3ed538e47b84cb3649299578f19d",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -465,11 +486,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1767304464, "lastModified": 1779209205,
"narHash": "sha256-HsdfmPf5291Y3yXScMoj53P/9SS1DK3KgbprBuR8A4k=", "narHash": "sha256-asc7NpeB8vD66gvZeYcQkaWOs2X6Jgd29vBtP17vjxo=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprland-plugins", "repo": "hyprland-plugins",
"rev": "7a8521112361997d071fd1fef06d6becc7e53240", "rev": "1cb37fad68dff5f5840010c314fed5809b4ee66f",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -490,11 +511,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1765214753, "lastModified": 1772460177,
"narHash": "sha256-P9zdGXOzToJJgu5sVjv7oeOGPIIwrd9hAUAP3PsmBBs=", "narHash": "sha256-/6G/MsPvtn7bc4Y32pserBT/Z4SUUdBd4XYJpOEKVR4=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprland-protocols", "repo": "hyprland-protocols",
"rev": "3f3860b869014c00e8b9e0528c7b4ddc335c21ab", "rev": "1cb6db5fd6bb8aee419f4457402fa18293ace917",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -519,11 +540,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1764612430, "lastModified": 1777320127,
"narHash": "sha256-54ltTSbI6W+qYGMchAgCR6QnC1kOdKXN6X6pJhOWxFg=", "narHash": "sha256-Qu+Wf2Bp5qUjyn2YpZNq8a7JyzTGowhT1knrwE38a9U=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprlang", "repo": "hyprlang",
"rev": "0d00dc118981531aa731150b6ea551ef037acddd", "rev": "090117506ddc3d7f26e650ff344d378c2ec329cc",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -532,18 +553,40 @@
"type": "github" "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": { "hyprsplit": {
"inputs": { "inputs": {
"hyprland": [ "hyprland": [
"hyprland" "hyprland"
] ],
"nixpkgs": "nixpkgs_2"
}, },
"locked": { "locked": {
"lastModified": 1766546378, "lastModified": 1779414137,
"narHash": "sha256-GSoSLHErh1mRfgXM57W98L67MMBHKCemHzxoZPrejSI=", "narHash": "sha256-XpwuFhwnfwPbzImZeUWWns///UEpoKNkpl1hN90C3Ag=",
"owner": "shezdy", "owner": "shezdy",
"repo": "hyprsplit", "repo": "hyprsplit",
"rev": "9a8b55f4269bfa5c59d03ed9f4502f433572c616", "rev": "0fc01e7930625ecb3e069f5dc8e1d61eab929f3b",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -591,11 +634,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1764592794, "lastModified": 1772462885,
"narHash": "sha256-7CcO+wbTJ1L1NBQHierHzheQGPWwkIQug/w+fhTAVuU=", "narHash": "sha256-5pHXrQK9zasMnIo6yME6EOXmWGFMSnCITcfKshhKJ9I=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprtoolkit", "repo": "hyprtoolkit",
"rev": "5cfe0743f0e608e1462972303778d8a0859ee63e", "rev": "9af245a69fa6b286b88ddfc340afd288e00a6998",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -616,11 +659,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1766160771, "lastModified": 1779475241,
"narHash": "sha256-roINUGikWRqqgKrD4iotKbGj3ZKJl3hjMz5l/SyKrHw=", "narHash": "sha256-Nw4DN0A5krWNcPBvuWe5Gz2yuxsUUPiDgtu6SVPJQeU=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprutils", "repo": "hyprutils",
"rev": "5ac060bfcf2f12b3a6381156ebbc13826a05b09f", "rev": "3cd3972b2ee658a14d2610d8494e09259e530124",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -641,11 +684,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1763640274, "lastModified": 1777159683,
"narHash": "sha256-Uan1Nl9i4TF/kyFoHnTq1bd/rsWh4GAK/9/jDqLbY5A=", "narHash": "sha256-Jxixw6wZphUp+nHYxOKUYSckL17QMBx2d5Zp0rJHr1g=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprwayland-scanner", "repo": "hyprwayland-scanner",
"rev": "f6cf414ca0e16a4d30198fd670ec86df3c89f671", "rev": "b8632713a6beaf28b56f2a7b0ab2fb7088dbb404",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -670,11 +713,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1766253200, "lastModified": 1778410714,
"narHash": "sha256-26qPwrd3od+xoYVywSB7hC2cz9ivN46VPLlrsXyGxvE=", "narHash": "sha256-o6RzFj4nJXaPRY7EM01siuCQeT41RfwwmcmFQqwFJJg=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprwire", "repo": "hyprwire",
"rev": "1079777525b30a947c8d657fac158e00ae85de9d", "rev": "85148a8e612808cf5ddb25d0b3c5840f3498a7dc",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -705,6 +748,27 @@
"type": "github" "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": { "nix-github-actions": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
@@ -738,11 +802,11 @@
"rust-overlay": "rust-overlay_2" "rust-overlay": "rust-overlay_2"
}, },
"locked": { "locked": {
"lastModified": 1766882181, "lastModified": 1779062503,
"narHash": "sha256-Xmu3JL68gT623ySytIOoyKqoH0tj3qhtNOnT79RRews=", "narHash": "sha256-CYyaA/qV6TzccHJuEwi8LE9x/rVpMAFztsymq+HYsQ8=",
"ref": "refs/heads/master", "ref": "refs/heads/master",
"rev": "ddb728dae4c9d6842664395635c9d55fb65c8b56", "rev": "4fd264f24fdf87d701ec82e7c6a4ca3e15c1c0aa",
"revCount": 78, "revCount": 79,
"type": "git", "type": "git",
"url": "https://git.sakamoto.dev/kenji/nixovim.git" "url": "https://git.sakamoto.dev/kenji/nixovim.git"
}, },
@@ -753,16 +817,16 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1744536153, "lastModified": 1768127708,
"narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=", "narHash": "sha256-1Sm77VfZh3mU0F5OqKABNLWxOuDeHIlcFjsXeeiPazs=",
"owner": "NixOS", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11", "rev": "ffbc9f8cbaacfb331b6017d5a5abb21a492c9a38",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "NixOS", "owner": "nixos",
"ref": "nixpkgs-unstable", "ref": "nixos-unstable",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
@@ -781,11 +845,43 @@
}, },
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1766309749, "lastModified": 1778869304,
"narHash": "sha256-3xY8CZ4rSnQ0NqGhMKAy5vgC+2IVK0NoVEzDoOh4DA4=", "narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "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" "type": "github"
}, },
"original": { "original": {
@@ -802,14 +898,14 @@
"nixovim", "nixovim",
"nixpkgs" "nixpkgs"
], ],
"systems": "systems_3" "systems": "systems_5"
}, },
"locked": { "locked": {
"lastModified": 1766443759, "lastModified": 1779023681,
"narHash": "sha256-iGDhUPOPyY9NOTNHkhNzZKoz3+OlBNGg451qtvPq/Ic=", "narHash": "sha256-K7RLGyiK3J6wHr/JDxXdlGF0+0DEsdBf1w9mXjSyL8I=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nixvim", "repo": "nixvim",
"rev": "1787eeda5a2ce35bcd57dbb482718b0d897786ae", "rev": "0d05726bfb060f6559f6d64c1d427f3663dba178",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -849,11 +945,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1765911976, "lastModified": 1778507602,
"narHash": "sha256-t3T/xm8zstHRLx+pIHxVpQTiySbKqcQbK+r+01XVKc0=", "narHash": "sha256-kTwur1wV+01SdqskVMSo6JMEpg71ps3HpbFY2GsflKs=",
"owner": "cachix", "owner": "cachix",
"repo": "git-hooks.nix", "repo": "git-hooks.nix",
"rev": "b68b780b69702a090c8bb1b973bab13756cc7a27", "rev": "61ab0e80d9c7ab14c256b5b453d8b3fb0189ba0a",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -868,11 +964,14 @@
"chaotic": "chaotic", "chaotic": "chaotic",
"elephant": "elephant", "elephant": "elephant",
"home-manager": "home-manager_2", "home-manager": "home-manager_2",
"hypr-dynamic-cursors": "hypr-dynamic-cursors",
"hyprland": "hyprland", "hyprland": "hyprland",
"hyprland-plugins": "hyprland-plugins", "hyprland-plugins": "hyprland-plugins",
"hyprspace": "hyprspace",
"hyprsplit": "hyprsplit", "hyprsplit": "hyprsplit",
"matugen": "matugen",
"nixovim": "nixovim", "nixovim": "nixovim",
"nixpkgs": "nixpkgs_2", "nixpkgs": "nixpkgs_4",
"nur": "nur", "nur": "nur",
"sops-nix": "sops-nix", "sops-nix": "sops-nix",
"textfox": "textfox", "textfox": "textfox",
@@ -904,7 +1003,7 @@
}, },
"rust-overlay_2": { "rust-overlay_2": {
"inputs": { "inputs": {
"nixpkgs": "nixpkgs" "nixpkgs": "nixpkgs_3"
}, },
"locked": { "locked": {
"lastModified": 1766544144, "lastModified": 1766544144,
@@ -927,11 +1026,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1766289575, "lastModified": 1777944972,
"narHash": "sha256-BOKCwOQQIP4p9z8DasT5r+qjri3x7sPCOq+FTjY8Z+o=", "narHash": "sha256-VfGRo1qTBKOe3s2gOv8LSoA6Fk19PvBlwQ1ECN0Evn8=",
"owner": "Mic92", "owner": "Mic92",
"repo": "sops-nix", "repo": "sops-nix",
"rev": "9836912e37aef546029e48c8749834735a6b9dad", "rev": "c591bf665727040c6cc5cb409079acb22dcce33c",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -972,31 +1071,31 @@
}, },
"systems_3": { "systems_3": {
"locked": { "locked": {
"lastModified": 1681028828, "lastModified": 1689347949,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
"owner": "nix-systems", "owner": "nix-systems",
"repo": "default", "repo": "default-linux",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nix-systems", "owner": "nix-systems",
"repo": "default", "repo": "default-linux",
"type": "github" "type": "github"
} }
}, },
"systems_4": { "systems_4": {
"locked": { "locked": {
"lastModified": 1681028828, "lastModified": 1689347949,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
"owner": "nix-systems", "owner": "nix-systems",
"repo": "default", "repo": "default-linux",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nix-systems", "owner": "nix-systems",
"repo": "default", "repo": "default-linux",
"type": "github" "type": "github"
} }
}, },
@@ -1016,6 +1115,36 @@
} }
}, },
"systems_6": { "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": { "locked": {
"lastModified": 1689347949, "lastModified": 1689347949,
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
@@ -1077,14 +1206,14 @@
"nixpkgs": [ "nixpkgs": [
"nixpkgs" "nixpkgs"
], ],
"systems": "systems_5" "systems": "systems_7"
}, },
"locked": { "locked": {
"lastModified": 1767353605, "lastModified": 1779832601,
"narHash": "sha256-j2nuPawvb33wjTV93htSiMRxGeTLLrKhwOEqmmTu5uY=", "narHash": "sha256-/dtn1sOTEcb/rNInzkdnK8PNIIDfQi7fEJfQEq+Is4g=",
"owner": "vicinaehq", "owner": "vicinaehq",
"repo": "vicinae", "repo": "vicinae",
"rev": "d89a9c9656486de144fd035bea7c2ea3b97fedf8", "rev": "dc1f7d47725c68debdb31be26781a96c14bac059",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1101,7 +1230,7 @@
"nixpkgs": [ "nixpkgs": [
"nixpkgs" "nixpkgs"
], ],
"systems": "systems_6" "systems": "systems_8"
}, },
"locked": { "locked": {
"lastModified": 1766324177, "lastModified": 1766324177,
@@ -1145,11 +1274,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1761431178, "lastModified": 1778265244,
"narHash": "sha256-xzjC1CV3+wpUQKNF+GnadnkeGUCJX+vgaWIZsnz9tzI=", "narHash": "sha256-8jlPtGSsv/CQY6tVVyLF4Jjd0gnS+Zbn9yk/V13A9nM=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "xdg-desktop-portal-hyprland", "repo": "xdg-desktop-portal-hyprland",
"rev": "4b8801228ff958d028f588f0c2b911dbf32297f9", "rev": "813ea5ca9a1702a9a2d1f5836bc00172ef698968",
"type": "github" "type": "github"
}, },
"original": { "original": {
+16
View File
@@ -34,6 +34,14 @@
url = "github:hyprwm/hyprland-plugins"; url = "github:hyprwm/hyprland-plugins";
inputs.hyprland.follows = "hyprland"; 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 = { nixovim = {
# FIXME: treesitter does not install automatically (disabled due to read-only problems) # FIXME: treesitter does not install automatically (disabled due to read-only problems)
url = "git+https://git.sakamoto.dev/kenji/nixovim.git"; url = "git+https://git.sakamoto.dev/kenji/nixovim.git";
@@ -60,6 +68,13 @@
url = "git+https://git.sakamoto.dev/kenji/nix-fonts.git"; url = "git+https://git.sakamoto.dev/kenji/nix-fonts.git";
inputs.nixpkgs.follows = "nixpkgs"; 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 = { outputs = {
@@ -85,6 +100,7 @@
} }
// allConfig.hakase; // allConfig.hakase;
modules = [ modules = [
inputs.matugen.nixosModules.default
home-manager.nixosModules.home-manager home-manager.nixosModules.home-manager
sops-nix.nixosModules.sops sops-nix.nixosModules.sops
chaotic.nixosModules.default chaotic.nixosModules.default
+1
View File
@@ -6,6 +6,7 @@
}: { }: {
imports = [ imports = [
../modules/home/terminal.nix ../modules/home/terminal.nix
# ../modules/home/flatpak.nix
../modules/home/apps.nix ../modules/home/apps.nix
../modules/home/apps-optional.nix ../modules/home/apps-optional.nix
../modules/home/hyprland.nix ../modules/home/hyprland.nix
+1
View File
@@ -9,5 +9,6 @@
../../modules/nixos/hyprland.nix ../../modules/nixos/hyprland.nix
../../modules/nixos/gaming.nix ../../modules/nixos/gaming.nix
../../modules/nixos/amd.nix ../../modules/nixos/amd.nix
../../modules/nixos/amdcpu.nix
]; ];
} }
+10 -1
View File
@@ -1,12 +1,21 @@
{ {pkgs, ...}: {
imports = [ imports = [
../../apps/btop ../../apps/btop
../../apps/bottom
../../apps/anki
../../apps/gemini ../../apps/gemini
../../apps/jellyfin ../../apps/jellyfin
../../apps/tickrs ../../apps/tickrs
../../apps/claude ../../apps/claude
../../apps/delfin ../../apps/delfin
../../apps/jellyfin-mpv-shim ../../apps/jellyfin-mpv-shim
../../apps/nextcloud
../../apps/ttyper ../../apps/ttyper
../../apps/libreoffice
];
home.packages = with pkgs; [
chromium
imagemagick
hidapitester
]; ];
} }
+1
View File
@@ -3,6 +3,7 @@
../../apps/yazi ../../apps/yazi
../../apps/firefox ../../apps/firefox
../../apps/imv ../../apps/imv
../../apps/zathura
../../apps/mpv ../../apps/mpv
../../apps/mako ../../apps/mako
# ../../apps/starship # ../../apps/starship
+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; [ home.packages = with pkgs; [
protonup-qt protonup-qt
protontricks protontricks
mangohud mangohud
via gaming-focus
# via
]; ];
programs.mangohud = { programs.mangohud = {
@@ -19,31 +68,65 @@
}; };
wayland.windowManager.hyprland.settings = { wayland.windowManager.hyprland.settings = {
workspace = [
"name:gaming, monitor:${gamingMonitor}, default:true"
];
exec-once = [ exec-once = [
"[workspace special:steam silent] uwsm app -- steam" "[workspace special:steam silent] steam"
]; ];
bindd = [ bindd = [
"SUPER, T, Toggle Steam, togglespecialworkspace, steam" "SUPER, A, Toggle Steam, togglespecialworkspace, steam"
"SUPER SHIFT, T, Move to Steam Special Workspace, movetoworkspace, special: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 = [ windowrule =
# --- STEAM RULES --- [
"workspace special:steam silent, class:^(steam)$" "match:class ^(steam)$, hyprbars:no_bar on"
"noinitialfocus, class:^(steam)$" "match:class ^(steam_app_\\d+)$, hyprbars:no_bar on"
"suppressevent activate, class:^(steam)$"
# --- GAMING RULES --- # --- STEAM GENERAL RULES ---
"fullscreen, class:^steam_app_\d+$" # Default ALL steam class windows to float. This catches all dialogs & properties windows.
"monitor 0, class:^steam_app_\d+$" "match:class ^(steam)$, float on"
"workspace 1, class:^steam_app_\d+$" # Suppress focus stealing from dialogs/etc.
"match:class ^(steam)$, no_initial_focus on"
"match:class ^(steam)$, suppress_event activate fullscreen maximize"
"fullscreen, class:^(gamescope)$" # --- STEAM CLIENT OVERRIDE ---
"fullscreen, class:^(lutris)$" # Override the float for the main Steam client, tile it, and move it to the special workspace.
"fullscreen, class:^(heroic)$" "match:class ^(steam)$, tile on"
"fullscreen, class:^wine-.*$" "match:class ^(steam)$, workspace special:steam"
"fullscreen, title:^Wine .*$"
]; # --- 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 = { wayland.windowManager.hyprland.settings = {
workspace = [ workspace = [
"special:music, on-created-empty:hakase-music-launch" "name:music, on-created-empty:hakase-music-launch"
]; ];
bindd = [ bindd = [
"SUPER, M, Toggle Music, togglespecialworkspace, music" "SUPER, M, Switch to Music, workspace, name:music"
"SUPER SHIFT, M, Move to Music Special Workspace, movetoworkspace, special:music" "SUPER SHIFT, M, Move to Music Workspace, movetoworkspace, name:music"
]; ];
windowrulev2 = [ windowrule = [
# --- MUSIC RULES (Jellyfin-TUI) --- # --- MUSIC RULES (Jellyfin-TUI) ---
"workspace special:music silent, title:^(jellyfin-tui)$" "match:title ^(jellyfin-tui)$, workspace name:music silent"
"workspace special:music silent, initialTitle:^(jellyfin-tui)$" "match:initial_title ^(jellyfin-tui)$, workspace name:music silent"
# --- CAVA RULES --- # --- CAVA RULES ---
"workspace special:music silent, title:^(cava)$" "match:title ^(cava)$, workspace name:music silent"
"workspace special:music silent, initialTitle:^(cava)$" "match:initial_title ^(cava)$, workspace name:music silent"
]; ];
}; };
} }
+3 -3
View File
@@ -5,13 +5,13 @@
home.pointerCursor = { home.pointerCursor = {
gtk.enable = true; gtk.enable = true;
package = pkgs.catppuccin-cursors.mochaDark; package = pkgs.bibata-cursors;
name = "Catppuccin Mocha Dark"; name = "Bibata-Modern-Ice";
size = 24; size = 24;
}; };
wayland.windowManager.hyprland.settings = { wayland.windowManager.hyprland.settings = {
env = [ env = [
"HYPRCURSOR_THEME,Catppuccin Mocha Dark" "HYPRCURSOR_THEME,Bibata-Modern-Ice"
"HYPRCURSOR_SIZE,24" "HYPRCURSOR_SIZE,24"
]; ];
}; };
+2 -2
View File
@@ -1,7 +1,7 @@
{pkgs, ...}: { {pkgs, ...}: {
hardware.amdgpu = { hardware.amdgpu = {
overdrive.enable = false; overdrive.enable = true;
initrd.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 = [ imports = [
../../apps/qmk ../../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 = [ imports = [
./apps-optional.nix ./apps-optional.nix
./backlight.nix ./backlight.nix
./flatpak.nix
./btop.nix
./boot.nix ./boot.nix
./fonts.nix ./fonts.nix
./hardware.nix ./hardware.nix
@@ -10,6 +12,7 @@
./kernel.nix ./kernel.nix
./nix.nix ./nix.nix
./power.nix # TODO: this one has to be optional ./power.nix # TODO: this one has to be optional
./mouse-wakeup.nix
./programs.nix ./programs.nix
./security.nix ./security.nix
./services.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 # This file is intentionally left blank.
# Disabling USB wakeups to prevent accidental wakeups from mouse/keyboard/bluetooth # USB wakeup is now handled by modules/nixos/mouse-wakeup.nix
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;
};
};
} }
+12 -4
View File
@@ -8,11 +8,11 @@
enable = true; enable = true;
settings = { settings = {
initial_session = { initial_session = {
command = "${pkgs.hyprland}/bin/Hyprland"; command = "${pkgs.uwsm}/bin/start-hyprland";
user = "${myConfig.nixos.username}"; user = "${myConfig.nixos.username}";
}; };
default_session = { 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; gnome.gnome-keyring.enable = true;
# Complements printer support # Complements printer support
printing.enable = true; printing = {
enable = true;
drivers = with pkgs; [
gutenprint
cups-filters
hplip
cups-browsed
];
};
avahi = { avahi = {
enable = true; enable = true;
nssmdns4 = true; nssmdns4 = true;
openFirewall = false; openFirewall = true;
}; };
pipewire = { pipewire = {
enable = true; enable = true;
+1 -1
View File
@@ -9,7 +9,7 @@
users = { users = {
${myConfig.nixos.username} = { ${myConfig.nixos.username} = {
isNormalUser = true; isNormalUser = true;
extraGroups = ["wheel" "networkmanager" "input" "video"]; extraGroups = ["wheel" "networkmanager" "input" "video" "wireshark"];
initialPassword = "password"; initialPassword = "password";
useDefaultShell = true; useDefaultShell = true;
}; };
+4
View File
@@ -3,5 +3,9 @@
git git
cloudflared cloudflared
cachix cachix
appimage-run
python314
usbutils
wireshark
]; ];
} }
+30
View File
@@ -0,0 +1,30 @@
#!/usr/bin/env bash
# Get current workspace ID
workspace_id=$(hyprctl activeworkspace -j | jq '.id')
# Get active window info
active_window=$(hyprctl activewindow -j)
is_floating=$(echo "$active_window" | jq '.floating')
echo "Current Workspace: $workspace_id"
echo "Active Window Floating: $is_floating"
if [ "$is_floating" == "true" ]; then
echo "Switching to Tiled..."
# Find a tiled window on the current workspace
# We sort by focus history or just pick the first one
target_addr=$(hyprctl clients -j | jq -r --argjson ws "$workspace_id" '[.[] | select(.workspace.id == $ws and .floating == false)] | sort_by(.focusHistoryID) | .[0].address')
else
echo "Switching to Floating..."
# Find a floating window on the current workspace
target_addr=$(hyprctl clients -j | jq -r --argjson ws "$workspace_id" '[.[] | select(.workspace.id == $ws and .floating == true)] | sort_by(.focusHistoryID) | .[0].address')
fi
echo "Target Address: $target_addr"
if [ "$target_addr" != "null" ] && [ -n "$target_addr" ]; then
hyprctl dispatch focuswindow address:$target_addr
else
echo "No target window found."
fi