7 Commits

Author SHA1 Message Date
75df6d502a split hyprland config: common + per-host monitors 2026-06-14 19:37:35 -04:00
8e9204bc21 New scrip to live ocr screeshot to the clipboard 2026-06-08 16:14:26 -04:00
05a3a8546c Added better hermes-cp function to send folder 2026-06-08 16:14:05 -04:00
d23138ff2c Added a custom emacs agenda 2026-06-08 16:13:44 -04:00
af9fa42cd3 Merge pull request 'fix: add mocha.conf fallback for pywal colors' (#14) from fix/hyprland-color-fallback into master
Reviewed-on: #14
2026-06-08 20:08:03 +00:00
7220066149 fix: remove $schema key from yazi.toml
Yazi's newer TOML parser requires kebab-case key names.
$schema starts with a non-letter character, causing:
  TOML parse error at line 3: must be a kebab-cased string
2026-06-08 16:06:13 -04:00
a7e18db821 fix: add mocha.conf fallback for pywal colors
Add source = mocha.conf before pywal's colors-hyprland.conf so
Catppuccin Mocha colors always load as defaults. Also define
$color1, $color2, $color3, and $background in mocha.conf as
fallbacks for when pywal hasn't generated its color file.

Fixes two Hyprland errors:
- 'source= globbing error: found no match' when pywal file missing
- 'failed to parse $color2 as a color' gradient parsing error
2026-06-08 16:00:30 -04:00
14 changed files with 150 additions and 369 deletions

View File

@@ -17,42 +17,6 @@ I use stow to deploy all this to where it need to go (mostly ~/.confg).
** starship
** tmux
** waybar
*** WireGuard Module
The Waybar includes a custom WireGuard VPN status module that shows connection status, TX/RX stats, and peer info.
Setup:
1. Install openresolv (needed by wg-quick for DNS):
#+begin_src bash :tangle no
sudo pacman -S openresolv
#+end_src
2. Configure sudo for wg-quick (required for click-to-toggle binds):
#+begin_src bash :tangle no
echo "$USER ALL=(ALL) NOPASSWD: /usr/bin/wg-quick" | sudo tee /etc/sudoers.d/wireguard
#+end_src
3. Create a WireGuard config (if not exists):
#+begin_src bash :tangle no
sudo cp /etc/wireguard/work-laptop.conf /etc/wireguard/
sudo chmod 600 /etc/wireguard/work-laptop.conf
#+end_src
4. Refresh Waybar to pick up new config:
#+begin_src bash :tangle no
killall -q waybar && waybar -c ~/.config/waybar/config.jsonc & -s ~/.config/waybar/style.css &
#+end_src
Or use the launch script:
#+begin_src bash :tangle no
~/.config/waybar/launch.sh
#+end_src
Keybinds:
- ~$mainMod+Ctrl+V~ — Connect WireGuard (work-laptop)
- ~$mainMod+Ctrl+Shift+V~ — Disconnect WireGuard
The module polls /usr/bin/wg every 10 seconds. It shows a lock icon with TX/RX when connected, or an unlock icon when disconnected.
** Wireplumber
** wofi
** yazi

View File

@@ -496,6 +496,19 @@ change ~org-directory~. It must be set before org loads!
((org-agenda-tag-filter-preset '("+BA_ON_SITE")))
)
("wA" "Projet Airbus Vision"
((agenda ""
((org-agenda-span 150)
(org-agenda-start-day "2026-05-01")
(org-agenda-overriding-header "📅 Projet Airbus Vision")
(org-agenda-prefix-format " %12t") ;; reserve time space
(org-agenda-todo-keyword-format " %-5s") ;; fixed-width TODO
(org-agenda-tags-column -100) ;; right-align tags
(org-agenda-time-grid nil)
)))
((org-agenda-tag-filter-preset '("+airbus")))
)
)
)
)

View File

@@ -367,6 +367,19 @@
((org-agenda-tag-filter-preset '("+BA_ON_SITE")))
)
("wA" "Projet Airbus Vision"
((agenda ""
((org-agenda-span 150)
(org-agenda-start-day "2026-05-01")
(org-agenda-overriding-header "📅 Projet Airbus Vision")
(org-agenda-prefix-format " %12t") ;; reserve time space
(org-agenda-todo-keyword-format " %-5s") ;; fixed-width TODO
(org-agenda-tags-column -100) ;; right-align tags
(org-agenda-time-grid nil)
)))
((org-agenda-tag-filter-preset '("+airbus")))
)
)
)
)

View File

@@ -0,0 +1,48 @@
# Laptop (Ingenuity/Valkyrie) — NVIDIA + external monitors
################
### MONITORS ###
################
$LAPTOP=eDP-1
$EXTERNAL_L1=DP-4
$EXTERNAL_R1=DP-5
$EXTERNAL_L2=DP-6
$EXTERNAL_R2=DP-7
monitor=$LAPTOP, 1920x1080, 0x0, 1
monitor=DP-3, 1920x1080, 1920x0, 1
monitor=$EXTERNAL_L1, 1920x1080, 0x-1080, 1, transform, 0
monitor=$EXTERNAL_L2, 1920x1080,0x-1080,1,transform,0
monitor=$EXTERNAL_R1, 1920x1080, 1920x-1480, 1, transform, 1
monitor=$EXTERNAL_R2, 1920x1080,1920x-1480,1,transform,1
#############################
### ENVIRONMENT VARIABLES ###
#############################
env = LIBVA_DRIVER_NAME,nvidia
env = __GLX_VENDOR_LIBRARY_NAME,nvidia
env = WLR_NO_HARDWARE_CURSOR,1
env = GBM_BACKEND,nvidia-drm
env = WLR_RENDERER_ALLOW_SOFTWARE,1
####################
### WORKSPACES ###
####################
workspace = 1, name:short-1, monitor:DP-4
workspace = 2, name:short-2, monitor:DP-4
workspace = 3, name:long-1, monitor:DP-5
workspace = 4, name:long-2, monitor:DP-5
workspace = 5, name:smoll, monitor:eDP-1
workspace = special:tools, layout:dwindle, gapsin:0
### WALLPAPER ###
exec-once = swww img ~/.config/wallpapers/green_yellow_forest.jpg --outputs $LAPTOP
exec-once = swww img ~/.config/wallpapers/green_yellow_forest.jpg --outputs $EXTERNAL_L1
exec-once = swww img ~/.config/wallpapers/green_yellow_forest.jpg --outputs $EXTERNAL_L2
exec-once = swww img ~/.config/wallpapers/buck_head.jpg --outputs $EXTERNAL_R1
exec-once = swww img ~/.config/wallpapers/buck_head.jpg --outputs $EXTERNAL_R2

View File

@@ -0,0 +1,27 @@
# uConsole CM5 — DSI display
################
### MONITORS ###
################
monitor=DSI-2, 720x1280, 0x0, 1
#############################
### ENVIRONMENT VARIABLES ###
#############################
env = WLR_NO_HARDWARE_CURSOR,1
####################
### WORKSPACES ###
####################
workspace = 1, name:short-1, monitor:DSI-2
workspace = 2, name:short-2, monitor:DSI-2
workspace = 3, name:long-1, monitor:DSI-2
####################
### AUTOSTART ###
####################
exec-once = swww img ~/.config/wallpapers/green_yellow_forest.jpg --outputs DSI-2

191
hypr/.config/hypr/hyprland.conf Normal file → Executable file
View File

@@ -1,52 +1,14 @@
# This is an example Hyprland config file.
# Refer to the wiki for more information.
# https://wiki.hyprland.org/Configuring/Configuring-Hyprland/
# Common Hyprland configuration — shared across all hosts
# Host-specific settings (monitors, env, workspaces) in host/monitors.conf
# Please note not all available settings / options are set here.
# For a full list, see the wiki
# You can split this configuration into multiple files
# Create your files separately and then link them to this file like this:
# source = ~/.config/hypr/myColors.conf
source = mocha.conf
source = ~/.cache/wal/colors-hyprland.conf
################
### MONITORS ###
################
$LAPTOP=eDP-1
$EXTERNAL_L1=DP-4
$EXTERNAL_R1=DP-5
$EXTERNAL_L2=DP-6
$EXTERNAL_R2=DP-7
# See https://wiki.hyprland.org/Configuring/Monitors/
# Useful command:
# hyprctl monitors all
## Valkyrie setup
# monitor=eDP-1,highres,auto,2 #3200x1800,0x0,2
# monitor=HDMI-A-2,2560x1600,auto,1 #1600x0,1 #x-370,1,transform,1
## Ingenuity setup
monitor=$LAPTOP, 1920x1080, 0x0, 1
monitor=DP-3, 1920x1080, 1920x0, 1 # HDMI screen
# Horizontal setup
#monitor=DP-4,1920x1080,-960x-1080,1 # Left screen
#monitor=DP-6,1920x1080,-960x-1080,1 # Left screen
#monitor=DP-5,1920x1080,960x-1080,1 # Right screen
#monitor=DP-7,1920x1080,960x-1080,1 # Right screen
# Vertical setup
monitor=$EXTERNAL_L1, 1920x1080, 0x-1080, 1, transform, 0 # Left screen
monitor=$EXTERNAL_L2, 1920x1080,0x-1080,1,transform,0 # Left screen
monitor=$EXTERNAL_R1, 1920x1080, 1920x-1480, 1, transform, 1 # Right screen
monitor=$EXTERNAL_R2, 1920x1080,1920x-1480,1,transform,1 # Right screen
source = host/monitors.conf
###################
### MY PROGRAMS ###
###################
# See https://wiki.hyprland.org/Configuring/Keywords/
# Set programs that you use
$terminal = kitty
$editor = emacsclient -c -a emacs
$menu = wofi --show drun
@@ -58,20 +20,10 @@ $monitoring = kitty btop
### AUTOSTART ###
#################
# Autostart necessary processes (like notifications daemons, status bars, etc.)
# Or execute your favorite apps at launch like this:
# exec-once = $terminal
# exec-once = nm-applet &
exec = hyprshade auto
exec-once = udiskie
exec-once = waybar
exec-once = swww-daemon
exec-once = swww img ~/.config/wallpapers/green_yellow_forest.jpg --outputs $LAPTOP
exec-once = swww img ~/.config/wallpapers/green_yellow_forest.jpg --outputs $EXTERNAL_L1
exec-once = swww img ~/.config/wallpapers/green_yellow_forest.jpg --outputs $EXTERNAL_L2
exec-once = swww img ~/.config/wallpapers/buck_head.jpg --outputs $EXTERNAL_R1
exec-once = swww img ~/.config/wallpapers/buck_head.jpg --outputs $EXTERNAL_R2
exec-once = swaync
exec-once = hypridle
exec-once = hyprlock
@@ -82,60 +34,34 @@ exec-once = dbus-update-activation-environment --systemd HYPRLAND_INSTANCE_SIGNA
### ENVIRONMENT VARIABLES ###
#############################
# See https://wiki.hyprland.org/Configuring/Environment-variables/
env = XCURSOR_SIZE,24
env = HYPRCURSOR_SIZE,24
env = LIBVA_DRIVER_NAME,nvidia
env = __GLX_VENDOR_LIBRARY_NAME,nvidia
env = WLR_NO_HARDWARE_CURSOR,1
env = XDG_SESSION_TYPE,wayland
env = GBM_BACKEND,nvidia-drm
env = WLR_RENDERER_ALLOW_SOFTWARE,1
#####################
### LOOK AND FEEL ###
#####################
# Refer to https://wiki.hyprland.org/Configuring/Variables/
# https://wiki.hyprland.org/Configuring/Variables/#general
general {
gaps_in = 7.5
gaps_out = 15
border_size = 2
# https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors
col.active_border = $color1 $color1 $color2 45deg
col.inactive_border = $background
# Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = false
# Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
allow_tearing = false
layout = dwindle
}
# https://wiki.hyprland.org/Configuring/Variables/#decoration
decoration {
rounding = 4
# Change transparency of focused and unfocused windows
active_opacity = 0.9
inactive_opacity = 0.75
}
# https://wiki.hyprland.org/Configuring/Variables/#animations
animations {
enabled = true
# Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
bezier = myBezier, 0.05, 0.9, 0.1, 1.05
animation = windows, 1, 1.6, myBezier
animation = windowsOut, 1, 1.6, default, popin 80%
animation = border, 1, 1.6, default
@@ -145,59 +71,37 @@ animations {
animation = specialWorkspace, 1, 1.6, myBezier, slidefadevert -10%
}
# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
dwindle {
# Note: pseudotile variable removed in 0.55+. Use `pseudo` dispatcher to toggle per-window.
# Bound to $mainMod + P below.
# This prevents the layout from collapsing if you close one window
preserve_split = true # You probably want this
# 0 -> follow mouse, 1 -> always left/top, 2 -> always right/bottom
preserve_split = true
force_split = 2
}
# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
master {
new_status = master
}
# https://wiki.hyprland.org/Configuring/Variables/#misc
misc {
force_default_wallpaper = 0 # Set to 0 or 1 to disable the anime mascot wallpapers
disable_hyprland_logo = true # If true disables the random hyprland logo / anime girl background. :(
force_default_wallpaper = 0
disable_hyprland_logo = true
}
#############
### INPUT ###
#############
# https://wiki.hyprland.org/Configuring/Variables/#input
input {
kb_layout = us,ca #,halmak
kb_layout = us,ca
kb_options = grp:win_space_toggle, ctrl:nocaps
# kb_variant =
# kb_model =
# kb_rules =
follow_mouse = 1
sensitivity = 0.5 # -1.0 - 1.0, 0 means no modification.
sensitivity = 0.5
touchpad {
natural_scroll = true
disable_while_typing = true
}
}
# https://wiki.hyprland.org/Configuring/Variables/#gestures
gestures {
# workspace_swipe = false
}
gestures {}
# Example per-device config
# See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more
device {
name = epic-mouse-v1
sensitivity = -0.5
@@ -207,10 +111,8 @@ device {
### KEYBINDINGS ###
###################
# See https://wiki.hyprland.org/Configuring/Keywords/
$mainMod = SUPER # Sets "Windows" key as main modifier
$mainMod = SUPER
# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
bind = $mainMod, T, exec, $terminal
bind = $mainMod, D, killactive,
bind = $mainMod SHIFT, Q, exit,
@@ -220,60 +122,43 @@ bind = $mainMod, E, exec, $editor
bind = $mainMod, V, togglefloating,
bind = $mainMod, R, exec, $menu
bind = $mainMod, Z, exec, $zen
# togglesplit removed as standalone dispatcher in 0.55+; use `layoutmsg togglesplit` instead
bind = $mainMod, P, pseudo, # dwindle
bind = $mainMod, P, pseudo,
bind = $mainMod, N, movecurrentworkspacetomonitor, -1
bind = $mainMod SHIFT, N, movecurrentworkspacetomonitor, +1
bind = $mainMod, X, swapwindow
bind = $mainMod, B, exec, python /home/tpouplier/ExoKortex/4-Automata/recordntrans/record_transcribe.py
# bind = $mainMod, G, exec, nerd-dictation end
bind = $mainMod, A, exec, $music
bind = $mainMod, C, exec, emacsclient -n -c -e '(gortium/hermes-vterm)'
# WireGuard VPN toggle (uses config file: /etc/wireguard/work-laptop.conf)
bind = $mainMod CTRL, V, exec, sudo wg-quick up work-laptop
bind = $mainMod CTRL SHIFT, V, exec, sudo wg-quick down work-laptop
# Full screen
bind = SUPER, F, fullscreen
# Screenshot
bind = SUPER, F, fullscreen
bind = , PRINT, exec, hyprshot -m output
bind = $mainMod, PRINT, exec, hyprshot -m window
bind = shift, PRINT, exec, hyprshot -m region
# hyprlock
bind = $mainMod, o, exec, hyprlock
# Move focus with mainMod + arrow keys
bind = $mainMod, h, movefocus, l
bind = $mainMod, j, movefocus, d
bind = $mainMod, k, movefocus, u
bind = $mainMod, l, movefocus, r
# Forward and reverse cycle (to focus floating)
bind = $mainMod, Tab, cyclenext
bind = $mainMod SHIFT, Tab, cyclenext, prev
# Resize windows
bind = $mainMod CTRL, l, resizeactive, 20 0
bind = $mainMod CTRL, h, resizeactive, -20 0
bind = $mainMod CTRL, k, resizeactive, 0 -20
bind = $mainMod CTRL, j, resizeactive, 0 20
# Swap window position
bind = $mainMod SHIFT, h, swapwindow, l
bind = $mainMod SHIFT, j, swapwindow, d
bind = $mainMod SHIFT, k, swapwindow, u
bind = $mainMod SHIFT, l, swapwindow, r
# Move floating window
bind = $mainMod SHIFT, l, moveactive, 100 0
bind = $mainMod SHIFT, h, moveactive, -100 0
bind = $mainMod SHIFT, k, moveactive, 0 -100
bind = $mainMod SHIFT, j, moveactive, 0 100
# Switch workspaces with mainMod + [0-9]
bind = $mainMod, 1, workspace, 1
bind = $mainMod, 2, workspace, 2
bind = $mainMod, 3, workspace, 3
@@ -285,7 +170,6 @@ bind = $mainMod, 8, workspace, 8
bind = $mainMod, 9, workspace, 9
bind = $mainMod, 0, workspace, 10
# Move active window to a workspace with mainMod + SHIFT + [0-9]
bind = $mainMod SHIFT, 1, movetoworkspace, 1
bind = $mainMod SHIFT, 2, movetoworkspace, 2
bind = $mainMod SHIFT, 3, movetoworkspace, 3
@@ -297,19 +181,15 @@ bind = $mainMod SHIFT, 8, movetoworkspace, 8
bind = $mainMod SHIFT, 9, movetoworkspace, 9
bind = $mainMod SHIFT, 0, movetoworkspace, 10
# Example special workspace (scratchpad)
bind = $mainMod, S, togglespecialworkspace, tools
bind = $mainMod SHIFT, S, movetoworkspace, special:tools
# Scroll through existing workspaces with mainMod + scroll
bind = $mainMod, mouse_down, workspace, e+1
bind = $mainMod, mouse_up, workspace, e-1
# Move/resize windows with mainMod + LMB/RMB and dragging
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow
# Laptop multimedia keys for volume and LCD brightness
bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+
bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
@@ -317,13 +197,11 @@ bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
bindel = ,XF86MonBrightnessUp, exec, brightnessctl s 10%+
bindel = ,XF86MonBrightnessDown, exec, brightnessctl s 10%-
# Requires playerctl
bindl = , XF86AudioNext, exec, playerctl next
bindl = , XF86AudioPause, exec, playerctl play-pause
bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPrev, exec, playerctl previous
# Emacs-everywhere
bind = $mainMod, W, exec, emacsclient --eval '(thanos/type)'
windowrule {
name = float-emacs
@@ -331,45 +209,16 @@ windowrule {
float = true
}
# Play/Pause
# bind = $mainMod, P, exec, playerctl play-pause
# Next Track
# bind = $mainmod SHIFT, L, exec, playerctl next
# Previous Track
# bind = $mainmod SHIFT, H, exec, playerctl previous
# Volume Up (player volume)
# bind = $mainmod , U, exec, playerctl volume 0.05+
# Volume Down (player volume)
# bind = $mainmod, D, exec, playerctl volume 0.05-
# Stop Playback
# bind = $mainmod, S, exec, playerctl stop
##############################
### WINDOWS AND WORKSPACES ###
##############################
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
# See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules
# Example windowrule v1
# windowrule = float, ^(kitty)$
# Example windowrule v2
# windowrule = float,class:^(kitty)$,title:^(kitty)$
# Ignore maximize requests from apps. You'll probably like this.
windowrule {
name = suppress-maximize-events
match:class = .*
suppress_event = maximize
}
# Fix some dragging issues with XWayland
windowrule {
name = nofocus-xwayland-float
match:class = ^$
@@ -381,15 +230,7 @@ windowrule {
no_focus = true
}
workspace = 1, name:short-1, monitor:DP-4 # Left screen
workspace = 2, name:short-2, monitor:DP-4 # Left screen
workspace = 3, name:long-1, monitor:DP-5 # Right screen
workspace = 4, name:long-2, monitor:DP-5 # Right screen
workspace = 5, name:smoll, monitor:eDP-1 # Laptop screen
#workspace = 4, name:windows, monitor:DP-4, on-created-empty:VBoxManage startvm "Windows 11"
workspace = special:tools, layout:dwindle, gapsin:0
# Top Left: btop
# Dashboard windows for special workspace
windowrule {
name = dashboard-btop
match:class = ^(btop)$
@@ -397,7 +238,6 @@ windowrule {
workspace = special:tools
}
# Top Right: ncspot
windowrule {
name = dashboard-ncspot
match:class = ^(ncspot)$
@@ -405,7 +245,6 @@ windowrule {
workspace = special:tools
}
# Bottom Left: ncpamixer
windowrule {
name = dashboard-ncpamixer
match:class = ^(ncpamixer)$
@@ -413,7 +252,6 @@ windowrule {
workspace = special:tools
}
# Bottom Right: bluetuith
windowrule {
name = dashboard-bluetuith
match:class = ^(bluetuith)$
@@ -421,7 +259,6 @@ windowrule {
workspace = special:tools
}
# Bind to launch the suite (Run this once)
bind = $mainMod, grave, exec, kitty --class btop btop
bind = $mainMod, grave, exec, kitty --class ncspot ncspot
bind = $mainMod, grave, exec, kitty --class ncpamixer ncpamixer

8
hypr/.config/hypr/mocha.conf Normal file → Executable file
View File

@@ -76,3 +76,11 @@ $mantleAlpha = 181825
$crust = rgb(11111b)
$crustAlpha = 11111b
# Fallback colors for when pywal hasn't generated colors-hyprland.conf
# (sourced by hyprland.conf — $color1/$color2 for active border gradients,
# $background for inactive border and general bg usage)
$color1 = rgb(cba6f7)
$color2 = rgb(f5c2e7)
$color3 = rgb(89b4fa)
$background = rgb(1e1e2e)

16
scripts/scrot-ocr.sh Executable file
View File

@@ -0,0 +1,16 @@
#!/bin/bash
scrot-ocr: Select screen region → OCR → clipboard
Deps: grim, slurp, tesseract, wl-clipboard, libnotify
set -euo pipefail
LANG="${1:-eng}"
IMG="/tmp/scrot-ocr-$(date +%s).png"
grim -g "$(slurp -d)" "$IMG"
TEXT=$(tesseract "$IMG" stdout -l "$LANG" 2>/dev/null | sed '/^[[:space:]]*$/d')
echo -n "$TEXT" | wl-copy --paste-once
echo "$TEXT"
notify-send "scrot-ocr" "$(echo "$TEXT" | wc -l) lines copied to clipboard" -t 3000
rm -f "$IMG"

View File

@@ -1,129 +0,0 @@
#!/usr/bin/env bash
# wireguard-status.sh -- JSON status for Waybar
# Outputs: {"text":"...","class":"connected|disconnected","tooltip":"..."}
#
# Waybar config example (in ~/.config/waybar/config.jsonc):
# "custom/wireguard": {
# "exec": "$HOME/.config/waybar/scripts/wireguard-status.sh",
# "interval": 10,
# "return-type": "json"
# }
set -euo pipefail
# --- Config -------------------------------------------------------
ICON_LOCKED="\uf023" # nf-fa-lock (FontAwesome)
ICON_UNLOCKED="\uf09e" # nf-fa-unlock
# Override with environment variables if set:
ICON_LOCKED="${WG_ICON_LOCKED:-$ICON_LOCKED}"
ICON_UNLOCKED="${WG_ICON_UNLOCKED:-$ICON_UNLOCKED}"
# --- Helpers ------------------------------------------------------
die() { echo "$*" >&2; exit 1; }
# Find the wg binary — works on NixOS, standard Linux, etc.
find_wg() {
if command -v wg &>/dev/null; then
echo "wg"
elif [ -x /run/current-system/sw/bin/wg ]; then
echo "/run/current-system/sw/bin/wg"
elif [ -x /usr/bin/wg ]; then
echo "/usr/bin/wg"
else
return 1
fi
}
# Find the ip binary
find_ip() {
if command -v ip &>/dev/null; then
echo "ip"
elif [ -x /run/current-system/sw/bin/ip ]; then
echo "/run/current-system/sw/bin/ip"
elif [ -x /usr/sbin/ip ]; then
echo "/usr/sbin/ip"
elif [ -x /sbin/ip ]; then
echo "/sbin/ip"
else
return 1
fi
}
format_bytes() {
local bytes=$1
if [ "$bytes" -lt 1024 ]; then
echo "${bytes}B"
elif [ "$bytes" -lt $((1024 * 1024)) ]; then
echo "$(awk "BEGIN { printf \"%.1f KiB\", $bytes / 1024 }")"
elif [ "$bytes" -lt $((1024 * 1024 * 1024)) ]; then
echo "$(awk "BEGIN { printf \"%.1f MiB\", $bytes / (1024 * 1024) }")"
else
echo "$(awk "BEGIN { printf \"%.2f GiB\", $bytes / (1024 * 1024 * 1024) }")"
fi
}
# --- Main ---------------------------------------------------------
WG_BIN=$(find_wg 2>/dev/null) || {
# wg not installed — report as disconnected
printf '{"text":"%s","class":"disconnected","tooltip":"WireGuard not installed"}\n' "$ICON_UNLOCKED"
exit 0
}
IP_BIN=$(find_ip 2>/dev/null) || true
# Find all WireGuard interfaces
INTERFACES=$("$WG_BIN" show interfaces 2>/dev/null) || {
# No WireGuard interfaces exist (wg module not loaded?)
printf '{"text":"%s","class":"disconnected","tooltip":"No WireGuard interfaces"}\n' "$ICON_UNLOCKED"
exit 0
}
# Parse into array, handling possible single-line space-separated output
IFS=' ' read -ra ifaces <<< "$INTERFACES"
if [ ${#ifaces[@]} -eq 0 ]; then
printf '{"text":"%s","class":"disconnected","tooltip":"No WireGuard interfaces"}\n' "$ICON_UNLOCKED"
exit 0
fi
# Just use the first interface (most setups have one)
IFACE="${ifaces[0]}"
# Get transfer stats
TRANSFER=$("$WG_BIN" show "$IFACE" transfer 2>/dev/null) || {
printf '{"text":"%s","class":"disconnected","tooltip":"Cannot read stats for %s"}\n' "$ICON_UNLOCKED" "$IFACE"
exit 0
}
# Parse: "rx_bytes tx_bytes"
RX_BYTES=$(echo "$TRANSFER" | awk '{print $1}')
TX_BYTES=$(echo "$TRANSFER" | awk '{print $2}')
RX_HUMAN=$(format_bytes "${RX_BYTES:-0}")
TX_HUMAN=$(format_bytes "${TX_BYTES:-0}")
# Get endpoint info for tooltip
ENDPOINT=$("$WG_BIN" show "$IFACE" endpoints 2>/dev/null | head -1 | awk '{print $2}') || ENDPOINT=""
PEER=$("$WG_BIN" show "$IFACE" peers 2>/dev/null | head -1) || PEER=""
# Build status line
STATUS_TEXT="${ICON_LOCKED} \u2193${RX_HUMAN} \u2191${TX_HUMAN}"
# Build tooltip
TOOLTIP="${IFACE}"
if [ -n "$PEER" ]; then
TOOLTIP="${TOOLTIP}\nPeer: ${PEER}"
fi
if [ -n "$ENDPOINT" ]; then
TOOLTIP="${TOOLTIP}\nEndpoint: ${ENDPOINT}"
fi
# Add IP info if ip is available
if [ -n "$IP_BIN" ]; then
IFACE_IP=$("$IP_BIN" -4 addr show dev "$IFACE" 2>/dev/null | awk '/inet / {print $2}') || IFACE_IP=""
if [ -n "$IFACE_IP" ]; then
TOOLTIP="${TOOLTIP}\nIP: ${IFACE_IP}"
fi
fi
TOOLTIP="${TOOLTIP}\nRX: ${RX_HUMAN}\nTX: ${TX_HUMAN}"
printf '{"text":"%s","class":"connected","tooltip":"%s"}\n' "$STATUS_TEXT" "$TOOLTIP"

View File

@@ -28,7 +28,6 @@
"pulseaudio",
"bluetooth",
"network",
"custom/wireguard",
"battery",
"custom/exit"
]

View File

@@ -138,15 +138,6 @@
//"on-click": "~/dotfiles/.settings/networkmanager.sh"
},
// wireguard
"custom/wireguard": {
"exec": "$HOME/.config/waybar/scripts/wireguard-status.sh",
"interval": 10,
"return-type": "json",
"on-click": "kitty sudo wg-quick up work-laptop",
"on-click-right": "kitty sudo wg-quick down work-laptop"
},
// battery
"battery": {
"states": {

View File

@@ -213,21 +213,6 @@ tooltip label {
}
/* custom modules */
#custom-wireguard {
margin: 0px 0px 0px 5px;
padding: 1px 8px 0px 8px;
font-size: 16px;
color: @text;
border-radius: 5px;
background-color: @set;
}
#custom-wireguard.connected {
background-color: @color5;
}
#custom-wireguard.disconnected {
background-color: @set;
}
#custom-exit {
margin: 0px 18px 0px 5px;
padding: 0px;

View File

@@ -1,6 +1,5 @@
# A TOML linter such as https://taplo.tamasfe.dev/ can use this schema to validate your config.
# If you encounter any issues, please make an issue at https://github.com/yazi-rs/schemas.
"$schema" = "https://yazi-rs.github.io/schemas/yazi.json"
[mgr]
ratio = [ 1, 4, 3 ]

View File

@@ -20,7 +20,17 @@ alias emacs="emacsclient -c -a emacs"
alias oc="opencode"
# Hermes Agent - SSH directly to remote server
alias hermes="ssh -t lazyworkhorse 'docker exec -it hermes /opt/hermes/.venv/bin/hermes'"
hermes() {
if [[ -n "$1" ]]; then
ssh -t lazyworkhorse \
"docker exec -e HERMES_HONCHO_PEER_NAME=$1 -it hermes \
/opt/hermes/.venv/bin/hermes --profile $1"
else
ssh -t lazyworkhorse \
"docker exec -e HERMES_HONCHO_PEER_NAME=thierry -it hermes \
/opt/hermes/.venv/bin/hermes"
fi
}
hermes-cp() {
if [ $# -eq 0 ]; then