matic: hyprland settings and services - #754
Conversation
|
You do not have enough credits to review this pull request. Please purchase more credits to continue. |
Summary of ChangesHello @shunkakinoki, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request introduces minor but impactful configuration updates to improve the user experience. It ensures that network management is readily accessible upon system startup and modifies the power button's default action to enhance system security and usability. Highlights
Changelog
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
Mesa DescriptionTL;DRReplaced Waybar/SwayNC/Wofi/Wlogout/wob/nm‑applet with HyprPanel and added Walker, fingerprint unlock, and dynamic Steam Wallpaper Engine wallpapers. Also restored fullscreen opacity override and lowered Chrome/VS Code opacity for better contrast. What changed?
Description generated by Mesa. Update settings |
📝 WalkthroughWalkthroughReplaces legacy bar/launcher stack with HyprPanel and Walker, expands Hyprland environment/behaviour (env vars, window/layerrules, binds, animations), adds helper scripts (toggle-terminal, record-screen), moves login to greetd/tuigreet, updates packages/modules, and removes Waybar/Wofi/Wlogout/SwayNC configs. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant Slurp as "slurp (region picker)"
participant WF as "wf-recorder"
participant FS as "Filesystem"
participant Notify as "notify-send"
User->>Slurp: select region (if needed)
Slurp-->>User: geometry
User->>WF: start wf-recorder --geometry -> spawns process
WF->>FS: write output file (timestamped in ~/Videos)
WF-->>User: returns PID (written to /tmp/wf-recorder.pid)
WF->>Notify: send "Recording started"
Note over User,WF: On stop -> kill PID
User->>WF: stop (kill)
WF->>FS: finalize file
WF->>Notify: send "Recording saved"
Estimated code review effort🎯 4 (Complex) | ⏱️ ~65 minutes Possibly related PRs
Suggested labels
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Code Review
This pull request introduces two configuration changes for the user's desktop environment. First, it adds the NetworkManager applet to the Hyprland startup sequence, providing a tray icon for network management. Second, it modifies the system's power button behavior to lock the screen instead of initiating a shutdown. Both changes are implemented correctly and improve the user experience on the configured machine.
There was a problem hiding this comment.
Pull request overview
Updates host and Hyprland configuration to improve desktop usability on the matic machine by changing power-button behavior and adding a network tray applet.
Changes:
- Configure systemd-logind to lock the session on power key press instead of shutting down.
- Autostart
nm-appletin Hyprland to provide a NetworkManager tray icon for Wi‑Fi management.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| named-hosts/matic/default.nix | Sets services.logind.powerKey = "lock" to lock on power button press. |
| config/hyprland/hyprland.conf | Adds exec-once = nm-applet --indicator to start a NetworkManager tray applet. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…nv improvements Add fingerprint authentication to hyprlock, hyprshot/hyprpicker/clipse keybindings, hyprsunset blue light filter, wl-clip-persist clipboard persistence, Wayland-native env vars, and improved window/layer rules based on omarchy-nix recommendations.
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Fix all issues with AI agents
In `@config/hyprland/scripts/osd-brightness.sh`:
- Around line 19-20: Change the awk substr call to use 1-based indexing (replace
substr($4, 0, length($4)-1) with substr($4, 1, length($4)-1)) when computing
BRIGHTNESS, and guard the echo to WOBPIPE so it won't block if the pipe/device
isn't present (e.g., check [ -p "$WOBPIPE" ] or that it exists and is writable
before running echo "$BRIGHTNESS" >"$WOBPIPE"); reference the BRIGHTNESS
assignment and the echo to "$WOBPIPE" to locate the lines to modify.
In `@config/hyprland/scripts/osd-volume.sh`:
- Around line 35-39: Guard writes to the wob FIFO by checking the pipe exists
before echoing: in the branch that writes to "$WOBPIPE" (references to MUTED,
VOL, and WOBPIPE) wrap both write actions with a test like `[ -p "$WOBPIPE" ] &&
echo ...` (or an equivalent check) so the script won't block if wob hasn't
created the FIFO; apply the same guard to the MUTED and non-MUTED branches and
ensure the check is done before any redirection to "$WOBPIPE".
🧹 Nitpick comments (6)
config/ghostty/config (2)
31-34: Note:ctrl+loverrides the common "clear screen" shortcut.
ctrl+lis traditionally used to clear the terminal screen, andctrl+hoften maps to backspace. If you use these frequently, you may want to rebind them or use alternative keys. Otherwise, this Vim-style navigation is a solid setup.
46-50: Minor: split-divider color uses Nord palette while the theme is Dracula.
#88c0d0is a Nord frost color, but the dark theme is set to Dracula (line 6) and the unfocused fill#1e1e2eis Catppuccin Mocha base. Consider aligning the divider color with your active theme palette for visual consistency, or add a comment noting the intentional mix.config/hyprland/scripts/toggle-terminal.sh (1)
6-12: Race condition:sleep 0.3may not be enough for Ghostty to register its window.If Ghostty takes longer to initialize (e.g., first launch, slow disk), the
togglespecialworkspacewill fire before the window is ready. A more robust approach would be to poll for the window:Optional: poll-based approach
else ghostty --class="$CLASS" & - sleep 0.3 + for _ in $(seq 1 20); do + hyprctl clients -j | grep -q "\"class\": \"$CLASS\"" && break + sleep 0.1 + done hyprctl dispatch togglespecialworkspace scratchpad ficonfig/hyprland/default.nix (1)
33-52: Consider reducing repetition with a helper function.The four script entries share the same
executable = true; force = true;pattern. A small helper could DRY this up:♻️ Optional refactor
Add a helper in the
letblock:mkScript = name: { source = ./scripts/${name}; executable = true; force = true; };Then use it:
- xdg.configFile."hypr/scripts/osd-volume.sh" = { - source = ./scripts/osd-volume.sh; - executable = true; - force = true; - }; - xdg.configFile."hypr/scripts/osd-brightness.sh" = { - source = ./scripts/osd-brightness.sh; - executable = true; - force = true; - }; - xdg.configFile."hypr/scripts/toggle-terminal.sh" = { - source = ./scripts/toggle-terminal.sh; - executable = true; - force = true; - }; - xdg.configFile."hypr/scripts/record-screen.sh" = { - source = ./scripts/record-screen.sh; - executable = true; - force = true; - }; + xdg.configFile."hypr/scripts/osd-volume.sh" = mkScript "osd-volume.sh"; + xdg.configFile."hypr/scripts/osd-brightness.sh" = mkScript "osd-brightness.sh"; + xdg.configFile."hypr/scripts/toggle-terminal.sh" = mkScript "toggle-terminal.sh"; + xdg.configFile."hypr/scripts/record-screen.sh" = mkScript "record-screen.sh";config/hyprland/hyprland.conf (2)
63-64: Two daemons chained with&in a singleexec-once— consider splitting.If
wl-clip-persistcrashes or exits, the&makes it a fire-and-forget background job with no supervision. More importantly, ifclipse -listenis the foreground process and it exits, Hyprland won't restart either. Splitting into twoexec-oncelines gives each process independent lifecycle management and clearer logs.♻️ Suggested change
-# Clipboard persistence -exec-once = wl-clip-persist --clipboard regular & clipse -listen +# Clipboard persistence +exec-once = wl-clip-persist --clipboard regular +exec-once = clipse -listen
333-334: Hardcoded~/.config/hypr/scripts/paths are fragile.These paths assume
XDG_CONFIG_HOMEis~/.config. While this is the default and thexdg.configFileentries indefault.nixdeploy there, using$XDG_CONFIG_HOMEor$HOME/.configwould be marginally more robust. That said, since the config itself is deployed viaxdg.configFile, the assumption is consistent.
| BRIGHTNESS=$(brightnessctl -m | awk -F, '{print substr($4, 0, length($4)-1)}') | ||
| echo "$BRIGHTNESS" >"$WOBPIPE" |
There was a problem hiding this comment.
awk substr uses 1-based indexing; starting at 0 is non-portable.
substr($4, 0, length($4)-1) should use index 1. While GNU awk silently treats 0 as 1, this is not guaranteed across all awk implementations and is technically incorrect.
Also, if WOBPIPE doesn't exist (e.g., wob hasn't started yet), writing to it will block indefinitely. Consider guarding the write.
Proposed fix
-BRIGHTNESS=$(brightnessctl -m | awk -F, '{print substr($4, 0, length($4)-1)}')
-echo "$BRIGHTNESS" >"$WOBPIPE"
+BRIGHTNESS=$(brightnessctl -m | awk -F, '{print substr($4, 1, length($4)-1)}')
+[ -p "$WOBPIPE" ] && echo "$BRIGHTNESS" >"$WOBPIPE"📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| BRIGHTNESS=$(brightnessctl -m | awk -F, '{print substr($4, 0, length($4)-1)}') | |
| echo "$BRIGHTNESS" >"$WOBPIPE" | |
| BRIGHTNESS=$(brightnessctl -m | awk -F, '{print substr($4, 1, length($4)-1)}') | |
| [ -p "$WOBPIPE" ] && echo "$BRIGHTNESS" >"$WOBPIPE" |
🤖 Prompt for AI Agents
In `@config/hyprland/scripts/osd-brightness.sh` around lines 19 - 20, Change the
awk substr call to use 1-based indexing (replace substr($4, 0, length($4)-1)
with substr($4, 1, length($4)-1)) when computing BRIGHTNESS, and guard the echo
to WOBPIPE so it won't block if the pipe/device isn't present (e.g., check [ -p
"$WOBPIPE" ] or that it exists and is writable before running echo "$BRIGHTNESS"
>"$WOBPIPE"); reference the BRIGHTNESS assignment and the echo to "$WOBPIPE" to
locate the lines to modify.
| if [ "$MUTED" = "1" ]; then | ||
| echo 0 >"$WOBPIPE" | ||
| else | ||
| echo "$VOL" >"$WOBPIPE" | ||
| fi |
There was a problem hiding this comment.
Same WOBPIPE guard recommendation as the brightness script.
If wob hasn't started and the FIFO doesn't exist, the echo will block. Consider [ -p "$WOBPIPE" ] && echo ... to guard the write.
Proposed fix
if [ "$MUTED" = "1" ]; then
- echo 0 >"$WOBPIPE"
+ [ -p "$WOBPIPE" ] && echo 0 >"$WOBPIPE"
else
- echo "$VOL" >"$WOBPIPE"
+ [ -p "$WOBPIPE" ] && echo "$VOL" >"$WOBPIPE"
fi📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| if [ "$MUTED" = "1" ]; then | |
| echo 0 >"$WOBPIPE" | |
| else | |
| echo "$VOL" >"$WOBPIPE" | |
| fi | |
| if [ "$MUTED" = "1" ]; then | |
| [ -p "$WOBPIPE" ] && echo 0 >"$WOBPIPE" | |
| else | |
| [ -p "$WOBPIPE" ] && echo "$VOL" >"$WOBPIPE" | |
| fi |
🤖 Prompt for AI Agents
In `@config/hyprland/scripts/osd-volume.sh` around lines 35 - 39, Guard writes to
the wob FIFO by checking the pipe exists before echoing: in the branch that
writes to "$WOBPIPE" (references to MUTED, VOL, and WOBPIPE) wrap both write
actions with a test like `[ -p "$WOBPIPE" ] && echo ...` (or an equivalent
check) so the script won't block if wob hasn't created the FIFO; apply the same
guard to the MUTED and non-MUTED branches and ensure the check is done before
any redirection to "$WOBPIPE".
Add shell test coverage for osd-brightness, osd-volume, record-screen, and toggle-terminal scripts. Update coverage_spec.sh to include them.
Add Walker (Wayland-native app runner) with Dracula-themed config, Super+Space keybinding, blur layer rules, and service autostart. Also fix shellcheck issues in wofi-wifi.sh and add its spec file.
There was a problem hiding this comment.
1 issue found across 9 files (changes from recent commits).
Prompt for AI agents (all issues)
Check if these issues are valid — if so, understand the root cause of each and fix them.
<file name="config/hyprland/scripts/wofi-wifi.sh">
<violation number="1" location="config/hyprland/scripts/wofi-wifi.sh:41">
P2: Use a fixed-string grep when matching SSIDs; regex matching can mis-handle SSIDs containing special characters or leading dashes, causing incorrect saved-connection detection.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
Map Framework+Space → Ctrl+Alt+Shift+Space in keyd, bind that combo to launch Walker in Hyprland.
There was a problem hiding this comment.
Actionable comments posted: 5
🤖 Fix all issues with AI agents
In `@config/hyprland/hyprland.conf`:
- Around line 34-35: The configuration sets both ELECTRON_OZONE_PLATFORM_HINT
and OZONE_PLATFORM to "wayland", which forces Chromium-based apps to Wayland and
can override the Electron hint; remove or comment out the hard override by
deleting or disabling the env entry for OZONE_PLATFORM (the line setting
OZONE_PLATFORM,wayland) so only ELECTRON_OZONE_PLATFORM_HINT remains, unless
you've explicitly tested all Chromium/Electron apps under forced Wayland and
want to keep the override.
In `@config/hyprland/scripts/wofi-wifi.sh`:
- Around line 7-16: The current NETWORKS pipeline uses nmcli -t and awk -F:
which breaks when SSIDs contain ":"; update the nmcli invocation to enable
escaping (add --escape yes) and change the awk parsing to handle escaped colons:
parse fields by recognizing only unescaped colons (or use awk's FPAT to capture
the three columns), then unescape SSID by replacing '\:' sequences back to ':'
before using $1, and keep the existing signal/security logic (refer to the
NETWORKS variable and the awk -F: block) so security detection uses the
corrected $2/$3 fields.
- Around line 33-38: The active-connection check uses CURRENT=$(nmcli -t -f NAME
connection show --active | head -1) which can return a non-WiFi connection
(e.g., Ethernet); change the check to only consider active WiFi connections by
querying active connections with type wifi (use nmcli connection show --active
--type wifi and the NAME field) and set CURRENT from that filtered result before
comparing to SSID so the script correctly detects if the selected SSID is
already connected.
- Line 41: The current check in the wofi-wifi.sh script uses grep -qx which
treats the SSID variable as a regex; change the invocation that tests nmcli
output (the line using nmcli -t -f NAME connection show | grep -qx "$SSID") to
use fixed-string matching by replacing grep -qx with grep -qFx so literal SSIDs
(the $SSID variable) containing regex metacharacters are matched exactly; update
that single pipeline in the script accordingly.
In `@config/walker/default.nix`:
- Around line 3-15: Replace the xdg.configFile entries that forcibly install
walker/config.toml and walker/themes/dracula/style.css with the walker module
options: remove the xdg.configFile."walker/config.toml" and
xdg.configFile."walker/themes/dracula/style.css" blocks and instead populate
programs.walker.config to provide the contents or path for config.toml and
programs.walker.themes to register the dracula style.css theme (referencing the
same source files ./config.toml and ./style.css); do not use force = true and
ensure the values conform to the programs.walker.config and
programs.walker.themes option shapes expected by the walker home-manager module.
🧹 Nitpick comments (7)
config/walker/config.toml (2)
29-55: Consider adding brief comments for the provider prefix mappings.The prefix-to-provider mappings (e.g.,
=→ calc,@→ websearch) are not immediately obvious to future readers. A short inline comment block would improve discoverability. As per coding guidelines: "Add comments for complex configurations" for TOML files.
1-8: Top-level keys are not sorted alphabetically.As per coding guidelines: "Sort keys alphabetically when possible in configuration files." The top-level keys could be reordered (e.g.,
click_to_close,close_when_open,disable_mouse,force_keyboard_focus, …).config/hyprland/hyprland.conf (1)
66-67: Split the two daemons into separateexec-oncelines.Running
wl-clip-persistandclipse -listenon the same exec-once line via&ties their lifecycle together and makes it harder to debug if one fails silently. Each daemon should have its own exec-once entry for independent process management.Proposed fix
# Clipboard persistence -exec-once = wl-clip-persist --clipboard regular & clipse -listen +exec-once = wl-clip-persist --clipboard regular +exec-once = clipse -listenspec/hyprland_record_screen_spec.sh (1)
1-44: Spec tests are purely static (string-presence checks) with no behavioral coverage.All tests just
catorheadthe script and check for substring presence. This verifies the script mentions certain tools but not that it uses them correctly. For example, checking for'date'(line 40) could match a comment. Consider adding at least one behavioral test (similar to theargument validationblock in the volume/brightness specs) that runs the script with mocks to verify toggle logic or error paths.spec/hyprland_wofi_wifi_spec.sh (1)
1-44: Consistent with other specs — same static-only coverage note applies.Same pattern as the other spec files. Consider adding behavioral tests with
mock_bin_setup nmcli wofi notify-sendto validate error handling and connection flows, similar to how osd-volume and osd-brightness specs validate argument handling.config/walker/default.nix (1)
1-1: Unused parametersconfigandpkgs.Neither
confignorpkgsis referenced in this module. You can simplify to{ ... }:to avoid lint noise, or prefix with_if you want to keep them for future use.Proposed fix
-{ config, pkgs, ... }: +{ ... }:spec/hyprland_osd_brightness_spec.sh (1)
13-21: Brittle: exact occurrence counts forraiseandlower.
grep -c 'raise'andgrep -c 'lower'assert exact counts of 2. Any future change (adding a comment, refactoring a case label) will break these tests. Consider usingThe output should include 'raise)'like the volume spec does, which is more resilient to incidental matches.Proposed fix
It 'handles raise action' -When run bash -c "grep -c 'raise' '$SCRIPT'" -The output should eq '2' +When run bash -c "cat '$SCRIPT'" +The output should include 'raise)' End It 'handles lower action' -When run bash -c "grep -c 'lower' '$SCRIPT'" -The output should eq '2' +When run bash -c "cat '$SCRIPT'" +The output should include 'lower)' End
| env = ELECTRON_OZONE_PLATFORM_HINT,wayland | ||
| env = OZONE_PLATFORM,wayland |
There was a problem hiding this comment.
OZONE_PLATFORM=wayland may conflict with ELECTRON_OZONE_PLATFORM_HINT.
ELECTRON_OZONE_PLATFORM_HINT=wayland (line 34) lets Electron apps gracefully choose Wayland when available. OZONE_PLATFORM=wayland (line 35) is a hard override for all Chromium-based apps — it can break apps that don't fully support Wayland (e.g., some Electron apps may crash or have rendering issues). With both set, the hard override wins, making the hint redundant.
Consider removing OZONE_PLATFORM and relying on the hint alone, unless you've verified all your Chromium/Electron apps work under forced Wayland.
🤖 Prompt for AI Agents
In `@config/hyprland/hyprland.conf` around lines 34 - 35, The configuration sets
both ELECTRON_OZONE_PLATFORM_HINT and OZONE_PLATFORM to "wayland", which forces
Chromium-based apps to Wayland and can override the Electron hint; remove or
comment out the hard override by deleting or disabling the env entry for
OZONE_PLATFORM (the line setting OZONE_PLATFORM,wayland) so only
ELECTRON_OZONE_PLATFORM_HINT remains, unless you've explicitly tested all
Chromium/Electron apps under forced Wayland and want to keep the override.
| NETWORKS=$(nmcli -t -f SSID,SIGNAL,SECURITY device wifi list --rescan yes | | ||
| awk -F: '!seen[$1]++ && $1!=""' | | ||
| sort -t: -k2 -rn | | ||
| awk -F: '{ | ||
| signal=$2 | ||
| sec=$3 | ||
| lock="" | ||
| if (sec != "" && sec != "--") lock=" [secured]" | ||
| printf "%s %s%%%s\n", $1, signal, lock | ||
| }') |
There was a problem hiding this comment.
SSIDs containing colons break the awk field parsing.
nmcli -t uses : as the field separator, but SSIDs can legitimately contain : (e.g., My:Network). This would shift the $2 (SIGNAL) and $3 (SECURITY) fields, producing garbled output or wrong security detection.
Use \: escaping that nmcli -t provides, or switch to a different delimiter with nmcli -t -f SSID,SIGNAL,SECURITY --escape yes and handle the escapes, or use nmcli -f SSID,SIGNAL,SECURITY --terse --fields ... with \n-based record parsing.
🤖 Prompt for AI Agents
In `@config/hyprland/scripts/wofi-wifi.sh` around lines 7 - 16, The current
NETWORKS pipeline uses nmcli -t and awk -F: which breaks when SSIDs contain ":";
update the nmcli invocation to enable escaping (add --escape yes) and change the
awk parsing to handle escaped colons: parse fields by recognizing only unescaped
colons (or use awk's FPAT to capture the three columns), then unescape SSID by
replacing '\:' sequences back to ':' before using $1, and keep the existing
signal/security logic (refer to the NETWORKS variable and the awk -F: block) so
security detection uses the corrected $2/$3 fields.
| # Check if already connected | ||
| CURRENT=$(nmcli -t -f NAME connection show --active | head -1) | ||
| if [ "$CURRENT" = "$SSID" ]; then | ||
| notify-send "WiFi" "Already connected to $SSID" | ||
| exit 0 | ||
| fi |
There was a problem hiding this comment.
Active connection check doesn't filter by connection type.
nmcli -t -f NAME connection show --active | head -1 returns the first active connection regardless of type. If an Ethernet connection is active, it will be returned first, and the WiFi comparison will never match even if you're already connected to the selected SSID.
Consider filtering for wifi connections specifically:
Proposed fix
-CURRENT=$(nmcli -t -f NAME connection show --active | head -1)
+CURRENT=$(nmcli -t -f NAME,TYPE connection show --active | awk -F: '$2=="802-11-wireless"{print $1; exit}')📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| # Check if already connected | |
| CURRENT=$(nmcli -t -f NAME connection show --active | head -1) | |
| if [ "$CURRENT" = "$SSID" ]; then | |
| notify-send "WiFi" "Already connected to $SSID" | |
| exit 0 | |
| fi | |
| # Check if already connected | |
| CURRENT=$(nmcli -t -f NAME,TYPE connection show --active | awk -F: '$2=="802-11-wireless"{print $1; exit}') | |
| if [ "$CURRENT" = "$SSID" ]; then | |
| notify-send "WiFi" "Already connected to $SSID" | |
| exit 0 | |
| fi |
🤖 Prompt for AI Agents
In `@config/hyprland/scripts/wofi-wifi.sh` around lines 33 - 38, The
active-connection check uses CURRENT=$(nmcli -t -f NAME connection show --active
| head -1) which can return a non-WiFi connection (e.g., Ethernet); change the
check to only consider active WiFi connections by querying active connections
with type wifi (use nmcli connection show --active --type wifi and the NAME
field) and set CURRENT from that filtered result before comparing to SSID so the
script correctly detects if the selected SSID is already connected.
| fi | ||
|
|
||
| # Check if we have a saved connection | ||
| if nmcli -t -f NAME connection show | grep -qx "$SSID"; then |
There was a problem hiding this comment.
Use grep -qFx instead of grep -qx for literal SSID matching.
If the SSID contains regex metacharacters (e.g., ., +, *), grep -qx will treat them as regex, potentially matching unintended connection names. -F forces fixed-string matching.
Proposed fix
-if nmcli -t -f NAME connection show | grep -qx "$SSID"; then
+if nmcli -t -f NAME connection show | grep -qFx "$SSID"; then📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| if nmcli -t -f NAME connection show | grep -qx "$SSID"; then | |
| if nmcli -t -f NAME connection show | grep -qFx "$SSID"; then |
🤖 Prompt for AI Agents
In `@config/hyprland/scripts/wofi-wifi.sh` at line 41, The current check in the
wofi-wifi.sh script uses grep -qx which treats the SSID variable as a regex;
change the invocation that tests nmcli output (the line using nmcli -t -f NAME
connection show | grep -qx "$SSID") to use fixed-string matching by replacing
grep -qx with grep -qFx so literal SSIDs (the $SSID variable) containing regex
metacharacters are matched exactly; update that single pipeline in the script
accordingly.
| programs.walker = { | ||
| enable = true; | ||
| runAsService = true; | ||
| }; | ||
|
|
||
| xdg.configFile."walker/config.toml" = { | ||
| source = ./config.toml; | ||
| force = true; | ||
| }; | ||
| xdg.configFile."walker/themes/dracula/style.css" = { | ||
| source = ./style.css; | ||
| force = true; | ||
| }; |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# Check the home-manager source for the walker module
find . -name "*walker*" -type f | head -20Repository: shunkakinoki/dotfiles
Length of output: 47
🏁 Script executed:
# Search for any existing walker module references in the repo
rg -rn "programs\.walker" --type nix | head -20Repository: shunkakinoki/dotfiles
Length of output: 98
🏁 Script executed:
# Check if there are any nixpkgs references or flake inputs that might contain walker module
cat flake.nix | head -50Repository: shunkakinoki/dotfiles
Length of output: 1405
🏁 Script executed:
# Look for home-manager related files that might document walker
rg -rn "walker" --type nix | head -30Repository: shunkakinoki/dotfiles
Length of output: 313
🏁 Script executed:
cat -n config/walker/default.nixRepository: shunkakinoki/dotfiles
Length of output: 472
🏁 Script executed:
# Check the structure of home-manager configuration
ls -la home-manager/Repository: shunkakinoki/dotfiles
Length of output: 521
🏁 Script executed:
# Look for any walker-related imports or configurations
rg -rn "import.*walker\|walker.*import" --type nixRepository: shunkakinoki/dotfiles
Length of output: 47
🌐 Web query:
home-manager programs.walker module configuration files
💡 Result:
With the Home Manager module shipped by Walker (imports = [ inputs.walker.homeManagerModules.default ];), the module mainly materializes Walker’s normal on-disk config under $XDG_CONFIG_HOME/walker (usually ~/.config/walker). Walker itself also documents this as the configuration directory. [1]
What files/directories get created
-
Main config
~/.config/walker/config.toml- In Home Manager you fill this via
programs.walker.config = { ...; };(it maps to Walker’sconfig.tomloptions). [1][2]
-
Themes
~/.config/walker/themes/<theme-name>/style.css~/.config/walker/themes/<theme-name>/*.xml(GTK layout files; e.g.layout.xml, per-provider item layouts, etc.)- In Home Manager you typically provide these via
programs.walker.themes."<theme-name>".styleandprograms.walker.themes."<theme-name>".layouts."<file>". The upstream README points you atresources/themes/defaultas the reference structure. [1]
Upstream reference locations (useful when translating to HM)
- Default config reference:
resources/config.toml. [2] - Default theme reference:
resources/themes/default/*. [1]
Sources: Walker README (config + theming paths and HM example) [1]; Walker docs (config.toml default path + link to default config) [2].
🏁 Script executed:
cat -n home-manager/default.nixRepository: shunkakinoki/dotfiles
Length of output: 1261
🏁 Script executed:
# Check if walker input is available in the flake
rg -n "walker" flake.nixRepository: shunkakinoki/dotfiles
Length of output: 47
🏁 Script executed:
# Look for how modules are imported in the home-manager config
cat -n home-manager/modules/default.nix | head -40Repository: shunkakinoki/dotfiles
Length of output: 234
🏁 Script executed:
ls -la config/Repository: shunkakinoki/dotfiles
Length of output: 1967
🏁 Script executed:
cat -n config/default.nixRepository: shunkakinoki/dotfiles
Length of output: 832
🏁 Script executed:
# Check if walker is directly available in home-manager (it should be in nixpkgs-unstable)
# Search for how programs.walker is implemented
rg -n "walker" --type nix home-manager/ | head -10Repository: shunkakinoki/dotfiles
Length of output: 111
Use programs.walker.config and programs.walker.themes instead of xdg.configFile for walker configuration.
Home-manager's walker module is designed to manage config files through its own options. Instead of using xdg.configFile with force = true (which bypasses the module's configuration system), configure walker using:
programs.walker.configforconfig.tomlsettingsprograms.walker.themesfor theme files
This approach is idiomatic, maintains consistency with home-manager's module design, and prevents potential conflicts or maintenance issues if the walker module is updated.
🤖 Prompt for AI Agents
In `@config/walker/default.nix` around lines 3 - 15, Replace the xdg.configFile
entries that forcibly install walker/config.toml and
walker/themes/dracula/style.css with the walker module options: remove the
xdg.configFile."walker/config.toml" and
xdg.configFile."walker/themes/dracula/style.css" blocks and instead populate
programs.walker.config to provide the contents or path for config.toml and
programs.walker.themes to register the dracula style.css theme (referencing the
same source files ./config.toml and ./style.css); do not use force = true and
ensure the values conform to the programs.walker.config and
programs.walker.themes option shapes expected by the walker home-manager module.
The home-manager version doesn't include programs.walker module. Use plain xdg.configFile for config and theme deployment instead.
services.logind.powerKey has been renamed to services.logind.settings.Login.HandlePowerKey.
…ules Add timewall flake input and configure it as a home-manager service on matic for macOS Sequoia-style dynamic wallpapers using swww with fade transitions. Remove static catppuccin wallpaper in favor of timewall daemon. Fix Hyprland v0.53 breaking changes: rename nofocus, stayfocused, suppressevent, noanim to snake_case equivalents, add explicit `on` values for center and blur, and update walker layerrules to use match:namespace syntax.
The network module on-click now launches the floating wofi-wifi script instead of opening nm-connection-editor as a separate window.
Kill existing wofi process if already open, allowing the waybar click or Super+I keybind to act as a toggle to close the picker.
Replace 6+ fragmented tools (waybar, swaync, wofi, wlogout, wob, nm-applet) with HyprPanel — an all-in-one panel with built-in bar, notification daemon, WiFi/bluetooth menus, OSD, and power menu. Dracula theme applied across all panels and menus.
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In `@config/hyprpanel/default.nix`:
- Line 70: There is a typo in the color value for the
"theme.bar.buttons.dashboard.icon" key: replace the incorrect hex "#8be8fd" with
the correct Dracula cyan "#8be9fd" so it matches the other uses (e.g., other
theme color entries and hyprland.conf); update only the hex literal for the
"theme.bar.buttons.dashboard.icon" setting.
🧹 Nitpick comments (3)
config/hyprland/hyprland.conf (1)
219-220: Fragile JSON-with-grep pattern for focus-or-launch.
grep -q '"class": "google-chrome"'onhyprctl clients -joutput is brittle — it matches substrings and depends on exact JSON formatting. Consider usingjqfor reliable class matching, consistent with how you already usejqelsewhere in this file (e.g., lines 368–369).♻️ Example using jq
-bind = $mod, G, exec, hyprctl clients -j | grep -q '"class": "google-chrome"' && hyprctl dispatch focuswindow class:google-chrome || google-chrome-stable -bind = $mod, S, exec, hyprctl clients -j | grep -q '"class": "Slack"' && hyprctl dispatch focuswindow class:Slack || slack +bind = $mod, G, exec, hyprctl clients -j | jq -e '[.[] | select(.class == "google-chrome")] | length > 0' > /dev/null && hyprctl dispatch focuswindow class:google-chrome || google-chrome-stable +bind = $mod, S, exec, hyprctl clients -j | jq -e '[.[] | select(.class == "Slack")] | length > 0' > /dev/null && hyprctl dispatch focuswindow class:Slack || slackhome-manager/packages/default.nix (1)
21-21:clipseis in the cross-platform package list but is only used on Wayland.
clipse(line 21) is in the top-level list shared across all platforms (including macOS/Darwin), but it's only referenced in the Hyprland config (clipse -listenon line 58,ghostty -e clipseon line 337). Consider moving it to thelib.optionals (stdenv.isLinux && isDesktop)block alongsidewl-clip-persistandcliphist.named-hosts/matic/default.nix (1)
129-135: Consider addingDesktopNames=Hyprlandto the session .desktop file.Some XDG portal and environment detection logic relies on
DesktopNamesto identify the session type. Whileprograms.hyprlandhandles portal configuration at the system level, adding this field improves compatibility with tools that inspect the session desktop entry.Proposed change
environment.etc."greetd/wayland-sessions/hyprland.desktop".text = '' [Desktop Entry] Name=Hyprland + DesktopNames=Hyprland Exec=uwsm start hyprland-uwsm.desktop Type=Application '';
| "theme.bar.buttons.borderColor" = "#bd93f9"; | ||
|
|
||
| # Dashboard | ||
| "theme.bar.buttons.dashboard.icon" = "#8be8fd"; |
There was a problem hiding this comment.
Likely typo: #8be8fd should be #8be9fd (Dracula cyan).
Every other use of Dracula cyan in this file (lines 80, 114, 174, 340, etc.) and in hyprland.conf (line 8) uses #8be9fd. This one instance uses #8be8fd (digit 8 instead of 9).
🐛 Fix
- "theme.bar.buttons.dashboard.icon" = "#8be8fd";
+ "theme.bar.buttons.dashboard.icon" = "#8be9fd";📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "theme.bar.buttons.dashboard.icon" = "#8be8fd"; | |
| "theme.bar.buttons.dashboard.icon" = "#8be9fd"; |
🤖 Prompt for AI Agents
In `@config/hyprpanel/default.nix` at line 70, There is a typo in the color value
for the "theme.bar.buttons.dashboard.icon" key: replace the incorrect hex
"#8be8fd" with the correct Dracula cyan "#8be9fd" so it matches the other uses
(e.g., other theme color entries and hyprland.conf); update only the hex literal
for the "theme.bar.buttons.dashboard.icon" setting.
The bare `hyprpanel` string in hyprland.conf wasn't resolvable since
hyprland.systemd.enable = false means PATH doesn't include
home-manager profile bins. Move exec-once to Nix extraConfig using
${pkgs.hyprpanel}/bin/hyprpanel, matching the swww-daemon pattern.
…ments - Add 15 custom commands to Walker (lock, screensaver, power, wifi, bluetooth, etc.) - Remove duplicate Super+D walker binding (Framework+Space only) - Set Walker layer to noanim for instant appearance - Update Ghostty split navigation to Super+hjkl - Enhance tmux with session persistence, vim-navigator, and clean green theme
Add Earth, Greenland, Caribbean, and ISS Flare aerials in a shuffled playlist that loops infinitely, matching macOS screensaver behavior.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…lscreen Apply 95%/90% opacity to Ghostty, Chrome, and Slack only when not in fullscreen mode using match:fullscreen:0. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…iscord Workspace rules applied to ALL windows of a class, so Cmd+N in Chrome would force the new window to workspace 2 instead of the current one. Focus-or-launch bindings (Super+G/S/D) handle initial placement. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In `@config/hyprland/hyprland.conf`:
- Line 43: The exec-once command string is fragile because it uses && so a
failure in any systemctl --user restart call aborts the rest; update the
exec-once line (the command after exec-once) to either use ; between the three
systemctl --user restart invocations so all restarts are attempted regardless of
failures, or split the operations into separate exec-once entries so each
systemctl restart runs independently (refer to the existing exec-once line that
contains the sleep and systemctl --user restart calls).
🧹 Nitpick comments (3)
config/hyprland/hyprlock.conf (1)
22-42: Input field placeholder text may not render the icon on all setups.Line 35: the placeholder relies on a Nerd Font glyph (
). This is fine givenfont_family = JetBrainsMono Nerd Fontis set on line 32, but if the Nerd Font package isn't installed the icon will render as a missing-glyph box. Worth keeping in mind if this config is shared across machines.config/hyprland/default.nix (1)
17-18: Consider documenting the mpvpaper options.The mpvpaper command line packs several non-obvious flags (
no-audio loop-playlist=inf shuffle hwdec=auto-copy vf=crop=3240:2160). A brief inline comment explaining the crop dimensions and key choices would help future maintainers. Based on learnings, major changes in Nix configurations should be documented.config/hyprland/hyprland.conf (1)
56-56: Backgrounding only the first process may leave clipse blocking the exec-once slot.
wl-clip-persist --clipboard regular & clipse -listenbackgroundswl-clip-persistbut runsclipse -listenin the foreground of the spawned shell. While Hyprland'sexec-onceis non-blocking, it's cleaner and more explicit to background both:♻️ Suggested
-exec-once = wl-clip-persist --clipboard regular & clipse -listen +exec-once = wl-clip-persist --clipboard regular & clipse -listen &
|
|
||
| # Notification daemon | ||
| exec-once = swaync | ||
| exec-once = sleep 1 && systemctl --user restart xdg-desktop-portal-hyprland && sleep 0.5 && systemctl --user restart xdg-desktop-portal-gtk && sleep 0.5 && systemctl --user restart xdg-desktop-portal |
There was a problem hiding this comment.
Portal restart chain is fragile with hardcoded sleeps.
If any systemctl --user restart command fails, the && chain aborts and downstream portals won't restart. Consider using ; instead of && so all three restarts are attempted regardless, or splitting into separate exec-once lines.
♻️ Proposed fix
-exec-once = sleep 1 && systemctl --user restart xdg-desktop-portal-hyprland && sleep 0.5 && systemctl --user restart xdg-desktop-portal-gtk && sleep 0.5 && systemctl --user restart xdg-desktop-portal
+exec-once = sleep 1; systemctl --user restart xdg-desktop-portal-hyprland; sleep 0.5; systemctl --user restart xdg-desktop-portal-gtk; sleep 0.5; systemctl --user restart xdg-desktop-portal📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| exec-once = sleep 1 && systemctl --user restart xdg-desktop-portal-hyprland && sleep 0.5 && systemctl --user restart xdg-desktop-portal-gtk && sleep 0.5 && systemctl --user restart xdg-desktop-portal | |
| exec-once = sleep 1; systemctl --user restart xdg-desktop-portal-hyprland; sleep 0.5; systemctl --user restart xdg-desktop-portal-gtk; sleep 0.5; systemctl --user restart xdg-desktop-portal |
🤖 Prompt for AI Agents
In `@config/hyprland/hyprland.conf` at line 43, The exec-once command string is
fragile because it uses && so a failure in any systemctl --user restart call
aborts the rest; update the exec-once line (the command after exec-once) to
either use ; between the three systemctl --user restart invocations so all
restarts are attempted regardless of failures, or split the operations into
separate exec-once entries so each systemctl restart runs independently (refer
to the existing exec-once line that contains the sleep and systemctl --user
restart calls).
Replace invalid match:fullscreen:0 with a separate fullscreen:1 override rule that resets opacity to 1.0 for all fullscreen windows. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fullscreen:1 is invalid; correct syntax is match:fullscreen 1. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
1 issue found across 1 file (changes from recent commits).
Prompt for AI agents (all issues)
Check if these issues are valid — if so, understand the root cause of each and fix them.
<file name="config/hyprland/hyprland.conf">
<violation number="1" location="config/hyprland/hyprland.conf:399">
P2: The new lock screen binding reuses `$mod SHIFT, L`, which is already bound to `movewindow, r` earlier in the config. This creates a keybinding conflict and can prevent either moving windows right or locking the screen from working reliably.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
| # Lock Screen | ||
| # ============================================================================= | ||
| bind = $mod CTRL, L, exec, hyprlock | ||
| bind = $mod SHIFT, L, exec, hyprlock |
There was a problem hiding this comment.
P2: The new lock screen binding reuses $mod SHIFT, L, which is already bound to movewindow, r earlier in the config. This creates a keybinding conflict and can prevent either moving windows right or locking the screen from working reliably.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At config/hyprland/hyprland.conf, line 399:
<comment>The new lock screen binding reuses `$mod SHIFT, L`, which is already bound to `movewindow, r` earlier in the config. This creates a keybinding conflict and can prevent either moving windows right or locking the screen from working reliably.</comment>
<file context>
@@ -396,7 +396,7 @@ binde = CTRL ALT SHIFT, minus, exec, hyprctl -j monitors | jq -r '.[0].scale' |
# Lock Screen
# =============================================================================
-bind = $mod CTRL, L, exec, hyprlock
+bind = $mod SHIFT, L, exec, hyprlock
# =============================================================================
</file context>
| bind = $mod SHIFT, L, exec, hyprlock | |
| bind = $mod CTRL, L, exec, hyprlock |
Replace mpvpaper + Apple Aerial videos with linux-wallpaperengine which uses Steam Workshop wallpapers. Enable Steam on matic for Wallpaper Engine assets. Uses home-manager service for declarative wallpaper management with auto-restart.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Semi-transparent backgrounds, white text at varying opacities, and Nord-inspired accent colors for a frosted glass aesthetic.
The match:fullscreen 1 override rule was likely overriding all opacity rules. Removed it so translucent windows work again. Fullscreen windows at 97% opacity is barely noticeable anyway. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…anslucency" This reverts commit c86eaf6.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Chrome class regex changed from ^(google-chrome)$ to ^(google-chrome.*)$ to match variants like google-chrome-stable. Fullscreen override kept so all windows get full opacity in fullscreen mode. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The 'override' keyword was preventing Chrome from getting translucent opacity. Using plain opacity values so class-specific rules still apply when not in fullscreen. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…cency Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…lity Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Summary by cubic
Replaces Waybar/SwayNC/Wofi/Wlogout/wob/nm‑applet with HyprPanel and adds Walker, fingerprint unlock, and dynamic Steam Wallpaper Engine wallpapers. Restores the fullscreen opacity override and lowers Chrome/VS Code opacity to 90/85% for better contrast.
New Features
Migration
Written for commit f578378. Summary will update on new commits.