Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
32caab0
chore: update
shunkakinoki Feb 6, 2026
98990d9
chore: update
shunkakinoki Feb 6, 2026
8a70a45
feat(matic): add hyprland keyd agenix
shunkakinoki Feb 6, 2026
7e5d92f
chore: update
shunkakinoki Feb 6, 2026
eda6868
feat: enhance Hyprland configuration with new components and styles
shunkakinoki Feb 6, 2026
74a9b5d
feat(matic): add SSH and GPG key configurations for agenix deployment
shunkakinoki Feb 6, 2026
210b92e
feat(matic): update secrets.nix to reflect synchronization from galac…
shunkakinoki Feb 6, 2026
9112ab7
feat(matic): update GPG and SSH key files for synchronization
shunkakinoki Feb 6, 2026
03b6ef5
feat(hyprland): update window rule syntax and remove workspace swipe …
shunkakinoki Feb 6, 2026
5bd8414
feat(hyprland): update gesture settings and refine window rules syntax
shunkakinoki Feb 6, 2026
518d507
feat(hyprland): refine window animation settings for improved perform…
shunkakinoki Feb 6, 2026
4c364db
feat(hyprland): update window rule for wofi to focus on activation
shunkakinoki Feb 6, 2026
92ea474
feat(hyprland): change key binding for killing active window from Q to W
shunkakinoki Feb 6, 2026
8bc9e03
feat(hyprland): update workspace format to display workspace ID
shunkakinoki Feb 6, 2026
c7bb5be
feat(hyprland): update gesture setting for horizontal workspace navig…
shunkakinoki Feb 6, 2026
41affeb
feat(hyprland): add gesture setting for three-finger horizontal works…
shunkakinoki Feb 6, 2026
eb74328
feat(hyprland): update app launch hotkeys to use application IDs
shunkakinoki Feb 6, 2026
addf261
feat(hyprland): update clipboard binding to use Shift modifier and ad…
shunkakinoki Feb 6, 2026
5fff3b6
feat(hyprland): remove redundant window rule for wofi focus behavior
shunkakinoki Feb 6, 2026
ebfee4b
feat(hyprland): update app launch bindings to use direct commands
shunkakinoki Feb 6, 2026
ec059c7
feat(hyprland): integrate Hyprland and its plugins into the Nix confi…
shunkakinoki Feb 6, 2026
3b7bd2e
feat(hyprland): enhance media and hardware key bindings for improved …
shunkakinoki Feb 6, 2026
9b5516c
feat(hyprland): update clock format to include full date and time
shunkakinoki Feb 6, 2026
879744e
feat(hyprland): add CPU and memory modules to waybar configuration
shunkakinoki Feb 6, 2026
c261980
feat(hyprland): add color definitions for CPU and memory modules in w…
shunkakinoki Feb 6, 2026
0a3b3c1
feat(hyprland): add spacing for CPU and memory modules in waybar style
shunkakinoki Feb 6, 2026
31dcb7e
feat(hyprland): update waybar color scheme for CPU and memory modules
shunkakinoki Feb 6, 2026
4d15728
chore: add hyprland cachix binary cache globally
shunkakinoki Feb 6, 2026
48b5822
feat(hyprland): update gesture configuration for workspace management
shunkakinoki Feb 6, 2026
f833a86
feat(hyprland): update gesture configuration for workspace management
shunkakinoki Feb 6, 2026
e542a54
feat(hyprland): update fullscreen binding to use hyprctl for workspac…
shunkakinoki Feb 6, 2026
b1c864d
feat(hyprland): add package definition for hyprland in default.nix
shunkakinoki Feb 6, 2026
ede5b9e
feat(hyprland): refactor plugin configuration for hyprexpo in default…
shunkakinoki Feb 6, 2026
54e0a1c
feat(hyprland): fix formatting of extraConfig in default.nix
shunkakinoki Feb 6, 2026
80ad0ed
feat(hyprland): update Hyprland URL to specific version v0.53.3 in fl…
shunkakinoki Feb 6, 2026
cf3ac92
Revert "feat(hyprland): update Hyprland URL to specific version v0.53…
shunkakinoki Feb 6, 2026
8012ff8
feat(hyprland): simplify hyprexpo plugin and package references in de…
shunkakinoki Feb 6, 2026
9a84a02
feat(hyprland): remove hyprland and hyprland-plugins inputs from flak…
shunkakinoki Feb 6, 2026
bc47c24
feat(hyprland): add gesture bindings for hyprexpo and adjust plugin s…
shunkakinoki Feb 6, 2026
28b68e4
feat(hyprland): update gesture settings and enhance keyd configuratio…
shunkakinoki Feb 6, 2026
781c776
feat(keyd): add leftmeta key mapping and update restart triggers in d…
shunkakinoki Feb 6, 2026
9c54d03
feat(hyprland): add key bindings for function keys to control audio a…
shunkakinoki Feb 6, 2026
41dcbde
feat(hyprland): update F9 key binding to toggle display scale between…
shunkakinoki Feb 6, 2026
4859b7a
feat(ghostty): add key bindings for copy and paste functionality
shunkakinoki Feb 6, 2026
89e3008
feat(hyprland): add key binding for emoji selection and update gestur…
shunkakinoki Feb 6, 2026
3022a3c
feat(hyprland): update fullscreen key binding to use Ctrl+Super+F
shunkakinoki Feb 6, 2026
98945b3
feat(hyprland): update fullscreen key binding to use Ctrl+Alt+Shift+F
shunkakinoki Feb 6, 2026
2f2d4ca
feat(hyprland): update fullscreen key binding to use Ctrl+Alt+Shift+F
shunkakinoki Feb 6, 2026
247d0b6
feat(fish): add key bindings for clipboard paste functionality
shunkakinoki Feb 6, 2026
0d18047
feat(ghostty): enable clipboard write and copy-on-select functionality
shunkakinoki Feb 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ DOCKER_IMAGE_TAGGED := $(DOCKER_IMAGE_NAME_BASE):$(GIT_COMMIT_SHA)
NIX_EXEC := $(shell which nix)

# Common cache settings (only applied when user is trusted to avoid warnings)
NIX_SUBSTITUTERS := https://cache.nixos.org https://devenv.cachix.org https://cachix.cachix.org
NIX_TRUSTED_KEYS := cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw= cachix.cachix.org-1:eWNHQldwUO7G2VkjpnjDbWwy4KQ/HNxht7H4SSoMckM=
NIX_SUBSTITUTERS := https://cache.nixos.org https://devenv.cachix.org https://cachix.cachix.org https://hyprland.cachix.org
NIX_TRUSTED_KEYS := cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw= cachix.cachix.org-1:eWNHQldwUO7G2VkjpnjDbWwy4KQ/HNxht7H4SSoMckM= hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=
NIX_CACHIX_CONF := /etc/nix/cachix.conf
# Check if user is trusted (to avoid "ignoring untrusted substituter" warnings)
NIX_USER_TRUSTED := $(shell grep -qE "trusted-users.*=.*(\\*|$(shell whoami))" /etc/nix/nix.conf 2>/dev/null && echo "yes" || echo "no")
Expand Down Expand Up @@ -749,15 +749,14 @@ launchctl-ollama: ## Restart ollama launchd agent.
##@ Systemd Services (Linux)

.PHONY: systemctl
systemctl: systemctl-cliproxyapi systemctl-openclaw systemctl-code-syncer systemctl-docker-postgres systemctl-dotfiles-updater systemctl-ollama ## Restart all systemd user services.
systemctl: systemctl-cliproxyapi systemctl-code-syncer systemctl-docker-postgres systemctl-dotfiles-updater systemctl-ollama systemctl-openclaw systemctl-waybar ## Restart all systemd user services.

.PHONY: systemctl-cliproxyapi
systemctl-cliproxyapi: ## Pull latest image and restart cliproxyapi systemd user service.
@echo "🔄 Restarting cliproxyapi..."
@systemctl --user restart cliproxyapi.service || true
@echo "✅ cliproxyapi restarted"


.PHONY: systemctl-code-syncer
systemctl-code-syncer: ## Restart code-syncer systemd user service.
@echo "🔄 Restarting code-syncer..."
Expand Down Expand Up @@ -788,6 +787,14 @@ systemctl-openclaw: ## Restart OpenClaw gateway systemd user service.
@systemctl --user restart openclaw-gateway.service || true
@echo "✅ openclaw restarted"

.PHONY: systemctl-waybar
systemctl-waybar: ## Restart waybar.
@echo "🔄 Restarting waybar..."
@pkill waybar 2>/dev/null || true
@sleep 1
@hyprctl dispatch exec waybar 2>/dev/null || true
@echo "✅ waybar restarted"

##@ Git Submodule

.PHONY: git-submodule-sync
Expand Down
2 changes: 2 additions & 0 deletions config/codex/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ notify = [

suppress_unstable_features_warning = true
web_search = "cached"
model = "gpt-5.3-codex"
model_reasoning_effort = "medium"

[features]
ghost_commit = false
Expand Down
17 changes: 17 additions & 0 deletions config/default.nix
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
{ inputs }:
let
inherit (inputs.host) isDesktop;
in
[
./aichat
./amp
Expand All @@ -23,3 +27,16 @@
./starship
./zellij
]
++ (
if isDesktop then
[
./gtk
./hyprland
./swaync
./waybar
./wlogout
./wofi
]
else
[ ]
)
4 changes: 4 additions & 0 deletions config/ghostty/config
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,12 @@ cursor-style = bar
cursor-style-blink = true
mouse-hide-while-typing = true
clipboard-read = "allow"
clipboard-write = "allow"
clipboard-paste-protection = false
copy-on-select = clipboard

keybind = ctrl+c=copy_to_clipboard
keybind = ctrl+v=paste_from_clipboard
Comment on lines +21 to +22

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🌐 Web query:

Ghostty performable keybind prefix syntax documentation

💡 Result:

Ghostty keybind “prefix” syntax is documented under Keybindings → Trigger Prefixes. A keybind is:

keybind = <prefixes>:<trigger>=<action>

Prefixes are written before the trigger, separated by : (and you can stack multiple): e.g.

keybind = global:unconsumed:ctrl+a=reload_config [1]

performable: prefix

performable: means only consume the key if the action can actually run (otherwise Ghostty acts like the binding doesn’t exist, so the key falls through to the app in the terminal). Example:
keybind = performable:ctrl+c=copy_to_clipboard [1][2]

Notes:

  • It has no effect with global: or all: prefixed keybinds. [1][2]
  • For key sequences, if the action isn’t performable it resets the sequence (as if no keybind was set). [1][2]
  • performable: keybinds won’t show as menu shortcuts. [1][2]

Related docs

  • Keybindings / Trigger Prefixes (includes performable:): [1]
  • Option reference for the same prefixes (with “Available since” info): [2]
  • Trigger sequences (if you mean “prefix key” sequences like ctrl+a>n=...): [5]

🌐 Web query:

Ghostty ctrl+c copy clipboard keybind SIGINT terminal

💡 Result:

To make Ctrl+C act as Copy only when there’s a selection, and otherwise pass through to the PTY as SIGINT (interrupt), bind it with Ghostty’s performable: prefix:

# ~/.config/ghostty/ghostty.conf
keybind = performable:ctrl+c=copy_to_clipboard
  • copy_to_clipboard copies the current selection. (ghostty.org)
  • performable: means Ghostty only consumes the keypress if the action can be performed (i.e., there is something selected). If not, Ghostty behaves as if the keybind isn’t set—so Ctrl+C is sent to the running program, producing SIGINT in shells/programs like sleep 100. (ghostty.org)

Tip: you can inspect what’s currently bound (defaults and overrides) with:

ghostty +list-keybinds --default

(ghostty.org)

Citations:


🏁 Script executed:

# Check the keyd config mentioned in the review to understand the Framework key mapping
find . -name "default.conf" -path "*/keyd/*" | head -5

Repository: shunkakinoki/dotfiles

Length of output: 91


🏁 Script executed:

# Search for Ghostty documentation or config examples in the repo
find . -name "ghostty" -o -name "*ghostty*" -type d 2>/dev/null | head -10

Repository: shunkakinoki/dotfiles

Length of output: 81


🏁 Script executed:

# Check the keyd config to understand the Framework key to Ctrl+C mapping context
cat -n ./config/keyd/default.conf | head -40

Repository: shunkakinoki/dotfiles

Length of output: 954


🏁 Script executed:

# Check the current Ghostty config around the mentioned lines
cat -n ./config/ghostty/config | head -30

Repository: shunkakinoki/dotfiles

Length of output: 960


ctrl+c=copy_to_clipboard intercepts SIGINT — use performable: prefix instead.

Binding ctrl+c unconditionally to copy_to_clipboard prevents sending interrupt signals to running processes. The keyd cmd_mac layer (Framework+C → Ctrl+C) will still work, but users cannot send SIGINT directly via bare Ctrl+C from the keyboard.

Ghostty's performable: prefix triggers the action only when it can be performed (i.e., text is selected); otherwise the key passes through to the terminal. This preserves both copy on selection and SIGINT when needed.

Proposed fix
-keybind = ctrl+c=copy_to_clipboard
-keybind = ctrl+v=paste_from_clipboard
+keybind = performable:ctrl+c=copy_to_clipboard
+keybind = performable:ctrl+v=paste_from_clipboard
📝 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.

Suggested change
keybind = ctrl+c=copy_to_clipboard
keybind = ctrl+v=paste_from_clipboard
keybind = performable:ctrl+c=copy_to_clipboard
keybind = performable:ctrl+v=paste_from_clipboard
🤖 Prompt for AI Agents
In `@config/ghostty/config` around lines 19 - 20, The current keybind entries bind
bare Ctrl+C to copy_to_clipboard, which intercepts SIGINT; change the bindings
to use the performable: prefix so the copy action only runs when applicable and
otherwise the key is passed through — update the entries referencing the keybind
lines (e.g., the existing "keybind = ctrl+c=copy_to_clipboard" rule) to "keybind
= ctrl+c=performable:copy_to_clipboard" while leaving "keybind =
ctrl+v=paste_from_clipboard" as-is or apply performable: if desired.

keybind = super+alt+left=previous_tab
keybind = super+alt+right=next_tab
keybind = super+shift+left=move_tab:-1
Expand Down
35 changes: 35 additions & 0 deletions config/gtk/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
config,
pkgs,
lib,
...
}:
{
gtk = lib.mkIf pkgs.stdenv.isLinux {
enable = true;
theme = {
name = "Adwaita-dark";
package = pkgs.gnome-themes-extra;
};
iconTheme = {
name = "Adwaita";
package = pkgs.adwaita-icon-theme;
};
cursorTheme = {
name = "Adwaita";
size = 24;
};
gtk3.extraConfig = {
gtk-application-prefer-dark-theme = 1;
};
gtk4.extraConfig = {
gtk-application-prefer-dark-theme = 1;
};
};

dconf.settings = lib.mkIf pkgs.stdenv.isLinux {
"org/gnome/desktop/interface" = {
color-scheme = "prefer-dark";
};
};
}
29 changes: 29 additions & 0 deletions config/hyprland/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
config,
inputs,
pkgs,
...
}:
let
hyprexpoPlugin = pkgs.hyprlandPlugins.hyprexpo;
in
{
wayland.windowManager.hyprland = {
enable = true;
package = pkgs.hyprland;
systemd.enable = false;
extraConfig = ''
plugin = ${hyprexpoPlugin}/lib/libhyprexpo.so
''
+ builtins.readFile ./hyprland.conf;
};

xdg.configFile."hypr/hypridle.conf" = {
source = ./hypridle.conf;
force = true;
};
xdg.configFile."hypr/hyprlock.conf" = {
source = ./hyprlock.conf;
force = true;
};
}
31 changes: 31 additions & 0 deletions config/hyprland/hypridle.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
general {
lock_cmd = pidof hyprlock || hyprlock
before_sleep_cmd = loginctl lock-session
after_sleep_cmd = hyprctl dispatch dpms on
}

# Dim screen after 2.5 minutes
listener {
timeout = 150
on-timeout = brightnessctl -s set 10
on-resume = brightnessctl -r
}

# Lock screen after 5 minutes
listener {
timeout = 300
on-timeout = loginctl lock-session
}

# Turn off display after 5.5 minutes
listener {
timeout = 330
on-timeout = hyprctl dispatch dpms off
on-resume = hyprctl dispatch dpms on
}

# Suspend after 30 minutes
listener {
timeout = 1800
on-timeout = systemctl suspend
}
Loading
Loading