Files
quincy/modules/home/scripts.nix
Brandon Lucas 58e4232f2f Initial commit: Nomarchy NixOS configuration
An opinionated NixOS configuration with Hyprland, featuring:

- Modular flake-based architecture
- Parameterized user configuration (username, timezone, locale, etc.)
- Classical/antiquity theme with Thomas Cole wallpapers
- Full Hyprland setup with waybar, rofi, swaync
- Custom utility scripts (screenshots, screen recording, WiFi QR)
- Neovim with LSP support
- Interactive installer for existing NixOS systems
- ISO builder for fresh installations

Flake outputs:
- nixosConfigurations.example - Test configuration
- nixosConfigurations.installer - ISO installer
- packages.iso - Bootable ISO image
- apps.default - Interactive installer
- lib.mkHost - Host builder function
- templates.default - Starter template

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-15 02:44:33 -05:00

332 lines
9.7 KiB
Nix

# Custom utility scripts
{
config,
lib,
pkgs,
nomarchyConfig,
...
}: let
homeDir = "/home/${nomarchyConfig.username}";
in {
# Screenshot region script
home.file.".local/bin/screenshot-region" = {
executable = true;
text = ''
#!/usr/bin/env bash
grim -g "$(slurp)" - | satty -f -
'';
};
# Screenshot active window script
home.file.".local/bin/screenshot-window" = {
executable = true;
text = ''
#!/usr/bin/env bash
GEOM=$(hyprctl activewindow -j | jq -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"')
grim -g "$GEOM" - | satty -f -
'';
};
# Screen recording toggle script
home.file.".local/bin/screen-record" = {
executable = true;
text = ''
#!/usr/bin/env bash
PIDFILE="/tmp/wf-recorder.pid"
STATUSFILE="/tmp/recording-status"
OUTDIR="$HOME/Videos/Recordings"
mkdir -p "$OUTDIR"
if [ -f "$PIDFILE" ]; then
kill -INT "$(cat $PIDFILE)" 2>/dev/null
rm -f "$PIDFILE" "$STATUSFILE"
notify-send -u normal "Recording Saved" "$(ls -t $OUTDIR/*.mp4 2>/dev/null | head -1)"
else
FILENAME="$OUTDIR/recording_$(date +%Y%m%d_%H%M%S).mp4"
CHOICE=$(echo -e "󰍹 Region\n󰹑 Fullscreen" | rofi -dmenu -p "Record")
case "$CHOICE" in
*"Region"*)
GEOM=$(slurp)
[ -z "$GEOM" ] && exit 1
wf-recorder -g "$GEOM" -f "$FILENAME" &
;;
*"Fullscreen"*)
wf-recorder -f "$FILENAME" &
;;
*)
exit 1
;;
esac
echo $! > "$PIDFILE"
echo "recording" > "$STATUSFILE"
notify-send -u critical "Recording" "Click waybar or Super+/ to stop"
fi
'';
};
# Quick Actions menu
home.file.".local/bin/quick-actions" = {
executable = true;
text = ''
#!/usr/bin/env bash
ACTION=$(cat << 'EOF' | rofi -dmenu -i -p ""
󰍹 Screenshot Region
󰹑 Screenshot Window
󰕧 Record Screen
󰆏 Clipboard History
󰖩 Share WiFi (QR Code)
󱂵 Change Wallpaper
󰈈 Color Picker
󰂜 Notifications
System Settings
󰌌 Keybindings
󰗼 Lock
󰍃 Logout
󰜉 Reboot
󰐥 Shutdown
EOF
)
case "$ACTION" in
*"Screenshot Region"*) ~/.local/bin/screenshot-region ;;
*"Screenshot Window"*) ~/.local/bin/screenshot-window ;;
*"Record Screen"*) ~/.local/bin/screen-record ;;
*"Clipboard History"*) cliphist list | rofi -dmenu -p '󰆏' | cliphist decode | wl-copy ;;
*"Share WiFi"*) ~/.local/bin/wifi-share ;;
*"Change Wallpaper"*) ~/.local/bin/wallpaper-rotate && notify-send "Wallpaper changed" ;;
*"Color Picker"*) hyprpicker -a && notify-send "Color copied to clipboard" ;;
*"Notifications"*) swaync-client -t -sw ;;
*"System Settings"*) ~/.local/bin/system-settings ;;
*"Keybindings"*) ~/.local/bin/keybindings-help ;;
*"Lock"*) hyprlock ;;
*"Logout"*) hyprctl dispatch exit ;;
*"Reboot"*) systemctl reboot ;;
*"Shutdown"*) systemctl poweroff ;;
esac
'';
};
# Keybindings help
home.file.".local/bin/keybindings-help" = {
executable = true;
text = ''
#!/usr/bin/env bash
cat << 'EOF' | rofi -dmenu -i -p "Keybindings (Super+)" -theme-str 'window {width: 400px;} listview {lines: 16;}'
Q Terminal
R App Launcher
E File Manager
B Browser
W Close Window
F Fullscreen
V Float/Tile
Arrows Move Focus
1-9 Workspace
/ Quick Actions
A Notifications
Space Switch Layout
EOF
'';
};
# Power menu
home.file.".local/bin/power-menu" = {
executable = true;
text = ''
#!/usr/bin/env bash
ACTION=$(echo -e "󰗼 Lock\n󰍃 Logout\n󰜉 Reboot\n󰐥 Shutdown" | rofi -dmenu -i -p "")
case "$ACTION" in
*"Lock"*) hyprlock ;;
*"Logout"*) hyprctl dispatch exit ;;
*"Reboot"*) systemctl reboot ;;
*"Shutdown"*) systemctl poweroff ;;
esac
'';
};
# WiFi sharing with QR code
home.file.".local/bin/wifi-share" = {
executable = true;
text = ''
#!/usr/bin/env bash
SSID=$(nmcli -t -f active,ssid dev wifi | grep '^yes' | cut -d: -f2)
if [ -z "$SSID" ]; then
notify-send "WiFi Share" "Not connected to WiFi"
exit 1
fi
PASSWORD=$(nmcli -s -g 802-11-wireless-security.psk connection show "$SSID" 2>/dev/null)
if [ -z "$PASSWORD" ]; then
notify-send "WiFi Share" "Could not retrieve password"
exit 1
fi
WIFI_STRING="WIFI:T:WPA;S:$SSID;P:$PASSWORD;;"
QR_FILE="/tmp/wifi-qr.png"
qrencode -o "$QR_FILE" -s 10 "$WIFI_STRING"
ACTION=$(echo -e "󰐲 View QR Code\n󰆏 Copy Password\n󰖩 Copy SSID" | rofi -dmenu -i -p "󰖩 $SSID")
case "$ACTION" in
*"View QR"*)
if command -v imv &> /dev/null; then
imv "$QR_FILE" &
else
xdg-open "$QR_FILE" &
fi
notify-send "WiFi QR Code" "Scan to connect to $SSID"
;;
*"Copy Password"*)
echo -n "$PASSWORD" | wl-copy
notify-send "Password Copied" "$SSID password copied to clipboard"
;;
*"Copy SSID"*)
echo -n "$SSID" | wl-copy
notify-send "SSID Copied" "$SSID copied to clipboard"
;;
esac
'';
};
# System settings menu
home.file.".local/bin/system-settings" = {
executable = true;
text = ''
#!/usr/bin/env bash
ACTION=$(cat << 'EOF' | rofi -dmenu -i -p ""
󰖩 WiFi Settings
󰂯 Bluetooth
󰕾 Sound Settings
󰃟 Display Settings
NixOS Generations
󰚰 Update System
󰃨 Garbage Collect
EOF
)
case "$ACTION" in
*"WiFi"*) nm-connection-editor ;;
*"Bluetooth"*) blueman-manager 2>/dev/null || notify-send "Bluetooth" "blueman not installed" ;;
*"Sound"*) pavucontrol 2>/dev/null || notify-send "Sound" "pavucontrol not installed" ;;
*"Display"*) wdisplays 2>/dev/null || notify-send "Display" "wdisplays not installed" ;;
*"Generations"*) ghostty -e bash -c "sudo nix-env --profile /nix/var/nix/profiles/system --list-generations | tail -20; echo; read -p 'Press Enter to close...'" ;;
*"Update"*) ghostty -e bash -c "cd ~/.config/nomarchy && nix flake update && sudo nixos-rebuild switch --flake .#; echo; read -p 'Press Enter to close...'" ;;
*"Garbage"*) ghostty -e bash -c "sudo nix-collect-garbage -d; echo; read -p 'Press Enter to close...'" ;;
esac
'';
};
# WiFi menu
home.file.".local/bin/wifi-menu" = {
executable = true;
text = ''
#!/usr/bin/env bash
CURRENT=$(nmcli -t -f active,ssid dev wifi | grep '^yes' | cut -d: -f2)
MENU="󰖩 Scan for networks\n"
if [ -n "$CURRENT" ]; then
MENU+="󰐲 Share WiFi (QR Code)\n"
MENU+="󰖪 Disconnect ($CURRENT)\n"
fi
MENU+="󰤨 Toggle WiFi\n"
MENU+="\n"
NETWORKS=$(nmcli -t -f ssid,signal,security dev wifi list | grep -v '^$' | head -10)
while IFS=: read -r ssid signal security; do
if [ -n "$ssid" ]; then
if [ "$ssid" = "$CURRENT" ]; then
MENU+="󰤨 $ssid ($signal%) \n"
elif [ -n "$security" ]; then
MENU+="󰤡 $ssid ($signal%)\n"
else
MENU+="󰤨 $ssid ($signal%)\n"
fi
fi
done <<< "$NETWORKS"
CHOICE=$(echo -e "$MENU" | rofi -dmenu -i -p "󰖩" | sed 's/^[^ ]* *//' | sed 's/ ([0-9]*%).*$//' | sed 's/ $//')
case "$CHOICE" in
"Scan for networks")
notify-send "WiFi" "Scanning..."
nmcli dev wifi rescan
sleep 2
~/.local/bin/wifi-menu
;;
"Share WiFi"*)
~/.local/bin/wifi-share
;;
"Disconnect"*)
nmcli dev disconnect wlan0
notify-send "WiFi" "Disconnected"
;;
"Toggle WiFi")
if nmcli radio wifi | grep -q "enabled"; then
nmcli radio wifi off
notify-send "WiFi" "Disabled"
else
nmcli radio wifi on
notify-send "WiFi" "Enabled"
fi
;;
""*) ;;
"") ;;
*)
if nmcli -t -f name connection show | grep -q "^$CHOICE$"; then
nmcli connection up "$CHOICE" && notify-send "WiFi" "Connected to $CHOICE"
else
PASS=$(rofi -dmenu -p "Password for $CHOICE" -password)
if [ -n "$PASS" ]; then
nmcli dev wifi connect "$CHOICE" password "$PASS" && notify-send "WiFi" "Connected to $CHOICE"
fi
fi
;;
esac
'';
};
# Bluetooth toggle
home.file.".local/bin/bluetooth-toggle" = {
executable = true;
text = ''
#!/usr/bin/env bash
if bluetoothctl show | grep -q "Powered: yes"; then
bluetoothctl power off
notify-send "Bluetooth" "Disabled"
else
bluetoothctl power on
notify-send "Bluetooth" "Enabled"
fi
'';
};
# Wallpaper rotation script
home.file.".local/bin/wallpaper-rotate" = {
executable = true;
text = ''
#!/usr/bin/env bash
WALLPAPER_DIR="${homeDir}/.config/nomarchy/wallpapers"
MONITOR="eDP-1"
if [ -z "$HYPRLAND_INSTANCE_SIGNATURE" ]; then
XDG_RUNTIME_DIR="''${XDG_RUNTIME_DIR:-/run/user/$(id -u)}"
HYPRLAND_INSTANCE_SIGNATURE="$(ls "$XDG_RUNTIME_DIR/hypr/" 2>/dev/null | head -1)"
fi
export HYPRLAND_INSTANCE_SIGNATURE
if [ -z "$HYPRLAND_INSTANCE_SIGNATURE" ]; then
echo "No Hyprland instance found"
exit 1
fi
WALLPAPER=$(find "$WALLPAPER_DIR" -type f \( -name "*.jpg" -o -name "*.png" \) | shuf -n 1)
if [ -n "$WALLPAPER" ]; then
hyprctl hyprpaper wallpaper "$MONITOR,$WALLPAPER"
fi
'';
};
}