summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile17
-rwxr-xr-xarchsetup41
-rw-r--r--assets/easyeffects-eq-presets.org47
-rwxr-xr-xassets/easyeffects-eq-presets.sh63
-rw-r--r--dotfiles/common/.bashrc.d/aliases.sh1
-rw-r--r--dotfiles/common/.config/btop/btop.conf272
-rw-r--r--dotfiles/common/.config/gtk-3.0/gtk.css2
-rw-r--r--dotfiles/common/.config/systemd/user/xdg-desktop-portal-gtk.service.d/environment.conf3
-rw-r--r--dotfiles/common/.config/wavemon/wavemonrc13
-rw-r--r--dotfiles/common/.zshrc.d/aliases.sh1
-rw-r--r--dotfiles/dwm/.Xresources (renamed from dotfiles/common/.Xresources)4
-rw-r--r--dotfiles/dwm/.config/conky/conky.conf (renamed from dotfiles/common/.config/conky/conky.conf)0
-rw-r--r--dotfiles/dwm/.config/flameshot/flameshot.ini (renamed from dotfiles/common/.config/flameshot/flameshot.ini)0
-rw-r--r--dotfiles/dwm/.config/picom.conf (renamed from dotfiles/common/.config/picom.conf)0
-rw-r--r--dotfiles/dwm/.config/redshift.conf (renamed from dotfiles/common/.config/redshift.conf)0
-rw-r--r--dotfiles/dwm/.config/touchpad-indicator/touchpad-indicator.conf (renamed from dotfiles/common/.config/touchpad-indicator/touchpad-indicator.conf)0
-rwxr-xr-xdotfiles/dwm/.xinitrc (renamed from dotfiles/common/.xinitrc)0
-rw-r--r--dotfiles/hyprland/.config/easyeffectsrc2
-rw-r--r--dotfiles/hyprland/.config/hypr/hyprland.conf48
-rw-r--r--dotfiles/hyprland/.config/waybar/config2
-rw-r--r--dotfiles/hyprland/.config/waypaper/config.ini27
-rw-r--r--dotfiles/hyprland/.config/xdg-desktop-portal/portals.conf3
-rwxr-xr-xdotfiles/hyprland/.local/bin/monitor-dashboard37
-rwxr-xr-xdotfiles/hyprland/.local/bin/start-hyprland11
-rwxr-xr-xdotfiles/hyprland/.local/bin/toggle-scratchpad11
-rwxr-xr-xdotfiles/hyprland/.local/bin/waybar-layout16
-rw-r--r--dotfiles/hyprland/.local/share/easyeffects/output/dt770-pro-250-harman-eq.json199
-rw-r--r--dotfiles/hyprland/.local/share/easyeffects/output/pixel-buds-pro-2-harman-eq.json219
-rw-r--r--dotfiles/hyprland/.local/share/easyeffects/output/pxc-550-ii-harman-eq.json219
-rw-r--r--dotfiles/hyprland/.profile.d/99-hyprland-autostart.sh26
30 files changed, 1242 insertions, 42 deletions
diff --git a/Makefile b/Makefile
index bbd5d28..6d29788 100644
--- a/Makefile
+++ b/Makefile
@@ -10,7 +10,7 @@ DE := $(filter dwm hyprland,$(MAKECMDGOALS))
# Extract DEST from command line for import (e.g., 'make import common' -> DEST=common)
DEST := $(filter common dwm hyprland,$(MAKECMDGOALS))
-.PHONY: help stow restow reset unstow import test common dwm hyprland
+.PHONY: help deps stow restow reset unstow import test common dwm hyprland
# Default target - show help
help:
@@ -24,6 +24,7 @@ help:
@echo " hyprland Wayland/Hyprland specific"
@echo ""
@echo "Targets:"
+ @echo " deps Install dependencies for this project"
@echo " stow Create symlinks (fresh install) - requires DE"
@echo " restow Refresh symlinks (unlink + relink) - requires DE"
@echo " reset Resolve conflicts, keep repo version - requires DE"
@@ -41,6 +42,20 @@ help:
@echo " make test # Run full VM integration test"
@echo ""
+# Install project dependencies
+deps:
+ @echo "Installing project dependencies..."
+ @echo ""
+ @echo "=== Makefile targets (stow, import) ==="
+ sudo pacman -S --needed stow fzf
+ @echo ""
+ @echo "=== VM testing (make test) ==="
+ sudo pacman -S --needed qemu-full virt-manager virt-viewer libguestfs \
+ bridge-utils dnsmasq archiso sshpass socat
+ @echo ""
+ @echo "Done. For VM testing, also ensure libvirtd is running:"
+ @echo " sudo systemctl enable --now libvirtd"
+
# Prevent 'common', 'dwm' and 'hyprland' from being treated as file targets
common dwm hyprland:
@:
diff --git a/archsetup b/archsetup
index 0779d2b..2eae786 100755
--- a/archsetup
+++ b/archsetup
@@ -688,7 +688,7 @@ prerequisites() {
for software in linux-firmware wireless-regdb base-devel ca-certificates \
chrony coreutils curl git go openssh python \
- stow tar vi zsh; do
+ stow tar vim zsh; do
pacman_install "$software"
done
@@ -833,6 +833,17 @@ user_customizations() {
action="linking hyprland dotfiles" && display "task" "$action"
(cd "$dotfiles_dir" && stow --target="/home/$username" --no-folding --adopt hyprland \
>> "$logfile" 2>&1 ) || error_warn "$action" "$?"
+
+ # Remove battery module from waybar config on desktops (no battery)
+ if ! ls /sys/class/power_supply/BAT* &>/dev/null; then
+ action="removing waybar battery module (no battery detected)" && display "task" "$action"
+ waybar_config="/home/$username/.config/waybar/config"
+ # Remove "battery" from sysmonitor modules array and fix trailing comma
+ sed -i '/"battery"$/d' "$waybar_config"
+ sed -i 's/"custom\/disk",/"custom\/disk"/' "$waybar_config"
+ # Remove the battery config block
+ sed -i '/"battery": {/,/^ },$/d' "$waybar_config"
+ fi
fi
# Refresh font cache for any fonts in dotfiles
@@ -870,6 +881,7 @@ user_customizations() {
mkdir -p -m 751 "/home/$username/pictures/screenshots"
mkdir -p -m 751 "/home/$username/videos"
mkdir -p -m 751 "/home/$username/vms"
+ mkdir -p -m 751 "/home/$username/.local/var/log"
chown -R "$username": "/home/$username"
mkdir -p -m 751 /media/backup
@@ -1077,6 +1089,10 @@ EOF
systemctl enable avahi-daemon.service >> "$logfile" 2>&1 || error_warn "$action" "$?"
fi
+ pacman_install wsdd
+ action="enabling wsdd for Windows network discovery" && display "task" "$action"
+ systemctl enable wsdd.service >> "$logfile" 2>&1 || error_warn "$action" "$?"
+
pacman_install geoclue # geolocation service for location-aware apps
action="enabling geoclue geolocation service" && display "task" "$action"
systemctl enable geoclue.service >> "$logfile" 2>&1 || error_warn "$action" "$?"
@@ -1251,6 +1267,7 @@ EOF
# Btrfs: Install snapper for snapshot management
display "task" "btrfs detected - installing snapper and grub-btrfs"
pacman_install snapper
+ pacman_install snap-pac # auto-snapshot on pacman transactions
pacman_install grub-btrfs
# inotify-tools is an optional dep of grub-btrfs but required for grub-btrfsd daemon
pacman_install inotify-tools
@@ -1378,7 +1395,9 @@ hyprland() {
pacman_install cpio # hyprpm (plugin manager) dependency
pacman_install waybar # status bar
pacman_install fuzzel # app launcher (native Wayland, pinentry support)
- pacman_install swww # wallpaper
+ pacman_install swww # wallpaper daemon
+ aur_install waypaper # wallpaper GUI (swww frontend)
+ aur_install wlogout-git # logout menu
pacman_install grim # screenshot
pacman_install slurp # region select
pacman_install satty # screenshot annotation
@@ -1387,6 +1406,9 @@ hyprland() {
pacman_install brightnessctl # brightness control
pacman_install pamixer # audio control
pacman_install foot # native Wayland terminal
+ pacman_install nautilus # file manager
+ pacman_install sushi # nautilus spacebar file preview
+ aur_install nautilus-open-any-terminal # right-click "open in terminal" with configurable terminal
}
### Display Server (conditional)
@@ -1522,7 +1544,7 @@ desktop_environment() {
action="Audio System" && display "subtitle" "$action"
for software in alsa-utils pipewire wireplumber pipewire-pulse \
- pipewire-docs pamixer pulsemixer ffmpeg rtkit; do
+ pipewire-docs pamixer pulsemixer easyeffects ffmpeg rtkit; do
pacman_install "$software"
done
# disable the pc speaker beep
@@ -1557,12 +1579,12 @@ desktop_environment() {
# Command Line Utilities
action="Command Line Utilities" && display "subtitle" "$action"
- for software in htop mc ncdu tmux fzf zip unzip atool wget detox \
- lsof usbutils moreutils; do
+ for software in htop btop mc ncdu tmux fzf zip unzip atool wget detox \
+ lsof usbutils moreutils nvtop s-tui wavemon bandwhich; do
pacman_install "$software"
done
- for software in task-spooler-cpu speedtest-go-bin gotop-bin rar; do
+ for software in task-spooler-cpu speedtest-go-bin rar; do
aur_install "$software"
done
@@ -1608,7 +1630,7 @@ desktop_environment() {
action="UI Theme" && display "subtitle" "$action"
- for software in picom lxappearance gnome-themes-extra; do
+ for software in picom lxappearance gnome-themes-extra adwaita-qt5 adwaita-qt6; do
pacman_install "$software"
done
@@ -1868,8 +1890,9 @@ supplemental_software() {
aur_install insync # Google Drive sync client
aur_install nsxiv # image viewer
aur_install snore-git # sleep with feedback
- pacman_install thunar # file manager
- pacman_install gvfs-smb # SMB network share browsing in Thunar
+ pacman_install gvfs-smb # SMB network share browsing in Nautilus
+ pacman_install wsdd # WS-Discovery daemon (Windows network discovery)
+ pacman_install gvfs-wsdd # WS-Discovery backend for gvfs (browse Windows shares)
aur_install topgrade # upgrade everything utility
aur_install ueberzug # allows for displaying images in terminals
aur_install warpinator # secure file transfers
diff --git a/assets/easyeffects-eq-presets.org b/assets/easyeffects-eq-presets.org
new file mode 100644
index 0000000..37f6478
--- /dev/null
+++ b/assets/easyeffects-eq-presets.org
@@ -0,0 +1,47 @@
+#+TITLE: EasyEffects EQ Presets - Installation Guide
+#+DATE: 2026-01-28
+
+* Overview
+
+Three parametric EQ presets targeting the Harman frequency response curve, formatted for EasyEffects (PipeWire).
+
+| Preset File | Headphone | Source | Bands | Preamp |
+|-----------------------------------+------------------------------+----------------------------+-------+---------|
+| dt770-pro-250-harman-eq.json | Beyerdynamic DT 770 Pro 250 | oratory1990 (hand-tuned) | 9 | -4.7 dB |
+| pxc-550-ii-harman-eq.json | Sennheiser PXC 550-II | AutoEQ / oratory1990 meas. | 10 | -3.0 dB |
+| pixel-buds-pro-2-harman-eq.json | Google Pixel Buds Pro 2 | AutoEQ / DHRME meas. | 10 | -2.8 dB |
+
+* Prerequisites
+
+- PipeWire (replaces PulseAudio)
+- pipewire-pulse
+- EasyEffects (~sudo pacman -S easyeffects~)
+
+* Programmatic Install
+
+#+begin_src sh
+./easyeffects-eq-presets.sh install
+#+end_src
+
+Or manually:
+
+#+begin_src sh
+mkdir -p ~/.config/easyeffects/output
+cp *.json ~/.config/easyeffects/output/
+#+end_src
+
+* Manual Usage
+
+1. Open EasyEffects (search in app launcher or run ~easyeffects~)
+2. Go to the *Output* tab (speaker icon, top left)
+3. Click the *Presets* dropdown (top bar)
+4. Select the preset matching your current headphone
+5. Switch presets when you switch headphones
+
+* Notes
+
+- EasyEffects applies EQ system-wide to whatever PipeWire output is active, including Bluetooth
+- Switch presets when switching between headphones — using the wrong preset will sound worse than no EQ
+- The DT 770 preset is for the 250 Ohm version specifically (other impedance variants have different frequency responses)
+- The PXC 550-II and Pixel Buds Pro 2 presets are AutoEQ-generated (algorithmically computed from measurements), not hand-tuned by oratory1990
+- To start EasyEffects minimized at login: ~easyeffects --gapplication-service~
diff --git a/assets/easyeffects-eq-presets.sh b/assets/easyeffects-eq-presets.sh
new file mode 100755
index 0000000..40e9cd9
--- /dev/null
+++ b/assets/easyeffects-eq-presets.sh
@@ -0,0 +1,63 @@
+#!/usr/bin/env bash
+# Install EasyEffects parametric EQ presets (Harman target)
+#
+# Presets:
+# dt770-pro-250-harman-eq.json - Beyerdynamic DT 770 Pro 250 Ohm (oratory1990)
+# pxc-550-ii-harman-eq.json - Sennheiser PXC 550-II (AutoEQ/oratory1990)
+# pixel-buds-pro-2-harman-eq.json - Google Pixel Buds Pro 2 (AutoEQ/DHRME)
+#
+# Prerequisites: easyeffects, pipewire, pipewire-pulse
+#
+# Usage: ./easyeffects-eq-presets.sh [install|uninstall]
+
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+PRESET_DIR="${HOME}/.config/easyeffects/output"
+
+PRESETS=(
+ "dt770-pro-250-harman-eq.json"
+ "pxc-550-ii-harman-eq.json"
+ "pixel-buds-pro-2-harman-eq.json"
+)
+
+install_presets() {
+ # Ensure easyeffects is installed
+ if ! command -v easyeffects &>/dev/null; then
+ echo "easyeffects not found. Installing..."
+ sudo pacman -S --needed --noconfirm easyeffects
+ fi
+
+ mkdir -p "$PRESET_DIR"
+
+ for preset in "${PRESETS[@]}"; do
+ if [[ -f "${SCRIPT_DIR}/${preset}" ]]; then
+ cp "${SCRIPT_DIR}/${preset}" "${PRESET_DIR}/${preset}"
+ echo "Installed: ${preset}"
+ else
+ echo "Warning: ${preset} not found in ${SCRIPT_DIR}" >&2
+ fi
+ done
+
+ echo ""
+ echo "Presets installed to ${PRESET_DIR}"
+ echo "Open EasyEffects and select a preset from the dropdown."
+}
+
+uninstall_presets() {
+ for preset in "${PRESETS[@]}"; do
+ if [[ -f "${PRESET_DIR}/${preset}" ]]; then
+ rm "${PRESET_DIR}/${preset}"
+ echo "Removed: ${preset}"
+ fi
+ done
+}
+
+case "${1:-install}" in
+ install) install_presets ;;
+ uninstall) uninstall_presets ;;
+ *)
+ echo "Usage: $0 [install|uninstall]" >&2
+ exit 1
+ ;;
+esac
diff --git a/dotfiles/common/.bashrc.d/aliases.sh b/dotfiles/common/.bashrc.d/aliases.sh
index 28c0f3f..9be16da 100644
--- a/dotfiles/common/.bashrc.d/aliases.sh
+++ b/dotfiles/common/.bashrc.d/aliases.sh
@@ -51,7 +51,6 @@ alias speedtest="speedtest-go"
# =============================================================================
# Applications
# =============================================================================
-alias vim="nvim"
alias et="emacs -nw"
alias weather="wego"
alias crm="tickrs -s CRM"
diff --git a/dotfiles/common/.config/btop/btop.conf b/dotfiles/common/.config/btop/btop.conf
new file mode 100644
index 0000000..3c1318f
--- /dev/null
+++ b/dotfiles/common/.config/btop/btop.conf
@@ -0,0 +1,272 @@
+#? Config file for btop v.1.4.6
+
+#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes.
+#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes"
+color_theme = "Default"
+
+#* If the theme set background should be shown, set to False if you want terminal background transparency.
+theme_background = true
+
+#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false.
+truecolor = true
+
+#* Set to true to force tty mode regardless if a real tty has been detected or not.
+#* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols.
+force_tty = false
+
+#* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets.
+#* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box.
+#* Use whitespace " " as separator between different presets.
+#* Example: "cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty"
+presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty"
+
+#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists.
+#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift.
+vim_keys = false
+
+#* Rounded corners on boxes, is ignored if TTY mode is ON.
+rounded_corners = true
+
+#* Use terminal synchronized output sequences to reduce flickering on supported terminals.
+terminal_sync = true
+
+#* Default symbols to use for graph creation, "braille", "block" or "tty".
+#* "braille" offers the highest resolution but might not be included in all fonts.
+#* "block" has half the resolution of braille but uses more common characters.
+#* "tty" uses only 3 different symbols but will work with most fonts and should work in a real TTY.
+#* Note that "tty" only has half the horizontal resolution of the other two, so will show a shorter historical view.
+graph_symbol = "braille"
+
+# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
+graph_symbol_cpu = "default"
+
+# Graph symbol to use for graphs in gpu box, "default", "braille", "block" or "tty".
+graph_symbol_gpu = "default"
+
+# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
+graph_symbol_mem = "default"
+
+# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
+graph_symbol_net = "default"
+
+# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
+graph_symbol_proc = "default"
+
+#* Manually set which boxes to show. Available values are "cpu mem net proc" and "gpu0" through "gpu5", separate values with whitespace.
+shown_boxes = "cpu mem net proc"
+
+#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs.
+update_ms = 2000
+
+#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct",
+#* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly.
+proc_sorting = "cpu lazy"
+
+#* Reverse sorting order, True or False.
+proc_reversed = false
+
+#* Show processes as a tree.
+proc_tree = false
+
+#* Use the cpu graph colors in the process list.
+proc_colors = true
+
+#* Use a darkening gradient in the process list.
+proc_gradient = true
+
+#* If process cpu usage should be of the core it's running on or usage of the total available cpu power.
+proc_per_core = false
+
+#* Show process memory as bytes instead of percent.
+proc_mem_bytes = true
+
+#* Show cpu graph for each process.
+proc_cpu_graphs = true
+
+#* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate)
+proc_info_smaps = false
+
+#* Show proc box on left side of screen instead of right.
+proc_left = false
+
+#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop).
+proc_filter_kernel = false
+
+#* In tree-view, always accumulate child process resources in the parent process.
+proc_aggregate = false
+
+#* Should cpu and memory usage display be preserved for dead processes when paused.
+keep_dead_proc_usage = false
+
+#* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available.
+#* Select from a list of detected attributes from the options menu.
+cpu_graph_upper = "Auto"
+
+#* Sets the CPU stat shown in lower half of the CPU graph, "total" is always available.
+#* Select from a list of detected attributes from the options menu.
+cpu_graph_lower = "Auto"
+
+#* If gpu info should be shown in the cpu box. Available values = "Auto", "On" and "Off".
+show_gpu_info = "Auto"
+
+#* Toggles if the lower CPU graph should be inverted.
+cpu_invert_lower = true
+
+#* Set to True to completely disable the lower CPU graph.
+cpu_single_graph = false
+
+#* Show cpu box at bottom of screen instead of top.
+cpu_bottom = false
+
+#* Shows the system uptime in the CPU box.
+show_uptime = true
+
+#* Shows the CPU package current power consumption in watts. Requires running `make setcap` or `make setuid` or running with sudo.
+show_cpu_watts = true
+
+#* Show cpu temperature.
+check_temp = true
+
+#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors.
+cpu_sensor = "Auto"
+
+#* Show temperatures for cpu cores also if check_temp is True and sensors has been found.
+show_coretemp = true
+
+#* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core.
+#* Use lm-sensors or similar to see which cores are reporting temperatures on your machine.
+#* Format "x:y" x=core with wrong temp, y=core with correct temp, use space as separator between multiple entries.
+#* Example: "4:0 5:1 6:3"
+cpu_core_map = ""
+
+#* Which temperature scale to use, available values: "celsius", "fahrenheit", "kelvin" and "rankine".
+temp_scale = "celsius"
+
+#* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024.
+base_10_sizes = false
+
+#* Show CPU frequency.
+show_cpu_freq = true
+
+#* How to calculate CPU frequency, available values: "first", "range", "lowest", "highest" and "average".
+freq_mode = "first"
+
+#* Draw a clock at top of screen, formatting according to strftime, empty string to disable.
+#* Special formatting: /host = hostname | /user = username | /uptime = system uptime
+clock_format = "%X"
+
+#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort.
+background_update = true
+
+#* Custom cpu model name, empty string to disable.
+custom_cpu_name = ""
+
+#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace " ".
+#* Only disks matching the filter will be shown. Prepend exclude= to only show disks not matching the filter. Examples: disk_filter="/boot /home/user", disks_filter="exclude=/boot /home/user"
+disks_filter = ""
+
+#* Show graphs instead of meters for memory values.
+mem_graphs = true
+
+#* Show mem box below net box instead of above.
+mem_below_net = false
+
+#* Count ZFS ARC in cached and available memory.
+zfs_arc_cached = true
+
+#* If swap memory should be shown in memory box.
+show_swap = true
+
+#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk.
+swap_disk = true
+
+#* If mem box should be split to also show disks info.
+show_disks = true
+
+#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar.
+only_physical = true
+
+#* Read disks list from /etc/fstab. This also disables only_physical.
+use_fstab = true
+
+#* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool)
+zfs_hide_datasets = false
+
+#* Set to true to show available disk space for privileged users.
+disk_free_priv = false
+
+#* Toggles if io activity % (disk busy time) should be shown in regular disk usage view.
+show_io_stat = true
+
+#* Toggles io mode for disks, showing big graphs for disk read/write speeds.
+io_mode = false
+
+#* Set to True to show combined read/write io graphs in io mode.
+io_graph_combined = false
+
+#* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ".
+#* Example: "/mnt/media:100 /:20 /boot:1".
+io_graph_speeds = ""
+
+#* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False.
+net_download = 100
+
+net_upload = 100
+
+#* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest.
+net_auto = true
+
+#* Sync the auto scaling for download and upload to whichever currently has the highest scale.
+net_sync = true
+
+#* Starts with the Network Interface specified here.
+net_iface = ""
+
+#* "True" shows bitrates in base 10 (Kbps, Mbps). "False" shows bitrates in binary sizes (Kibps, Mibps, etc.). "Auto" uses base_10_sizes.
+base_10_bitrate = "Auto"
+
+#* Show battery stats in top right if battery is present.
+show_battery = true
+
+#* Which battery to use if multiple are present. "Auto" for auto detection.
+selected_battery = "Auto"
+
+#* Show power stats of battery next to charge indicator.
+show_battery_watts = true
+
+#* Set loglevel for "~/.local/state/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG".
+#* The level set includes all lower levels, i.e. "DEBUG" will show all logging info.
+log_level = "WARNING"
+
+#* Automatically save current settings to config file on exit.
+save_config_on_exit = true
+
+#* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards.
+nvml_measure_pcie_speeds = true
+
+#* Measure PCIe throughput on AMD cards, may impact performance on certain cards.
+rsmi_measure_pcie_speeds = true
+
+#* Horizontally mirror the GPU graph.
+gpu_mirror_graph = true
+
+#* Set which GPU vendors to show. Available values are "nvidia amd intel"
+shown_gpus = "nvidia amd intel"
+
+#* Custom gpu0 model name, empty string to disable.
+custom_gpu_name0 = ""
+
+#* Custom gpu1 model name, empty string to disable.
+custom_gpu_name1 = ""
+
+#* Custom gpu2 model name, empty string to disable.
+custom_gpu_name2 = ""
+
+#* Custom gpu3 model name, empty string to disable.
+custom_gpu_name3 = ""
+
+#* Custom gpu4 model name, empty string to disable.
+custom_gpu_name4 = ""
+
+#* Custom gpu5 model name, empty string to disable.
+custom_gpu_name5 = ""
diff --git a/dotfiles/common/.config/gtk-3.0/gtk.css b/dotfiles/common/.config/gtk-3.0/gtk.css
index a1d4c13..cffaf78 100644
--- a/dotfiles/common/.config/gtk-3.0/gtk.css
+++ b/dotfiles/common/.config/gtk-3.0/gtk.css
@@ -1,6 +1,6 @@
.window-frame, .window-frame:backdrop {
box-shadow: 0 0 0 black; /* removes shadow completely */
border-style: none;
- margin: 1; /* this retains the ability to resize with the mouse, if 1px is too narrow, set some higher values */
+ margin: 1px; /* this retains the ability to resize with the mouse, if 1px is too narrow, set some higher values */
border-radius: 0;
}
diff --git a/dotfiles/common/.config/systemd/user/xdg-desktop-portal-gtk.service.d/environment.conf b/dotfiles/common/.config/systemd/user/xdg-desktop-portal-gtk.service.d/environment.conf
deleted file mode 100644
index e8c5e8f..0000000
--- a/dotfiles/common/.config/systemd/user/xdg-desktop-portal-gtk.service.d/environment.conf
+++ /dev/null
@@ -1,3 +0,0 @@
-[Service]
-Environment="DISPLAY=:0"
-Environment="XAUTHORITY=/home/cjennings/.Xauthority" \ No newline at end of file
diff --git a/dotfiles/common/.config/wavemon/wavemonrc b/dotfiles/common/.config/wavemon/wavemonrc
new file mode 100644
index 0000000..e39c80b
--- /dev/null
+++ b/dotfiles/common/.config/wavemon/wavemonrc
@@ -0,0 +1,13 @@
+interface = wlp192s0
+cisco_mac = off
+sort_order = chan/sig
+sort_ascending = off
+scan_filter_band = both
+scan_hidden_essids = on
+stat_updates = 100
+lhist_slot_size = 4
+meter_smoothness = 0
+info_updates = 10
+override_auto_scale = off
+transparent_bg = on
+startup_screen = info screen
diff --git a/dotfiles/common/.zshrc.d/aliases.sh b/dotfiles/common/.zshrc.d/aliases.sh
index 28c0f3f..9be16da 100644
--- a/dotfiles/common/.zshrc.d/aliases.sh
+++ b/dotfiles/common/.zshrc.d/aliases.sh
@@ -51,7 +51,6 @@ alias speedtest="speedtest-go"
# =============================================================================
# Applications
# =============================================================================
-alias vim="nvim"
alias et="emacs -nw"
alias weather="wego"
alias crm="tickrs -s CRM"
diff --git a/dotfiles/common/.Xresources b/dotfiles/dwm/.Xresources
index 96e4803..4b35809 100644
--- a/dotfiles/common/.Xresources
+++ b/dotfiles/dwm/.Xresources
@@ -10,8 +10,8 @@ Xft.hintstyle: hintfull
Xft.hinting: 1
Xft.antialias: 1
Xft.rgba: rgb
-Xcursor.size: 32
-Xcursor.theme: Vimix-white-cursors
+Xcursor.size: 24
+Xcursor.theme: Bibata-Modern-Ice
!! Emacs
Emacs*toolBar: 0
diff --git a/dotfiles/common/.config/conky/conky.conf b/dotfiles/dwm/.config/conky/conky.conf
index 09ee8ea..09ee8ea 100644
--- a/dotfiles/common/.config/conky/conky.conf
+++ b/dotfiles/dwm/.config/conky/conky.conf
diff --git a/dotfiles/common/.config/flameshot/flameshot.ini b/dotfiles/dwm/.config/flameshot/flameshot.ini
index 8874b3b..8874b3b 100644
--- a/dotfiles/common/.config/flameshot/flameshot.ini
+++ b/dotfiles/dwm/.config/flameshot/flameshot.ini
diff --git a/dotfiles/common/.config/picom.conf b/dotfiles/dwm/.config/picom.conf
index 0b65df7..0b65df7 100644
--- a/dotfiles/common/.config/picom.conf
+++ b/dotfiles/dwm/.config/picom.conf
diff --git a/dotfiles/common/.config/redshift.conf b/dotfiles/dwm/.config/redshift.conf
index 92b61bf..92b61bf 100644
--- a/dotfiles/common/.config/redshift.conf
+++ b/dotfiles/dwm/.config/redshift.conf
diff --git a/dotfiles/common/.config/touchpad-indicator/touchpad-indicator.conf b/dotfiles/dwm/.config/touchpad-indicator/touchpad-indicator.conf
index 51a9907..51a9907 100644
--- a/dotfiles/common/.config/touchpad-indicator/touchpad-indicator.conf
+++ b/dotfiles/dwm/.config/touchpad-indicator/touchpad-indicator.conf
diff --git a/dotfiles/common/.xinitrc b/dotfiles/dwm/.xinitrc
index 991f507..991f507 100755
--- a/dotfiles/common/.xinitrc
+++ b/dotfiles/dwm/.xinitrc
diff --git a/dotfiles/hyprland/.config/easyeffectsrc b/dotfiles/hyprland/.config/easyeffectsrc
new file mode 100644
index 0000000..a4cbf66
--- /dev/null
+++ b/dotfiles/hyprland/.config/easyeffectsrc
@@ -0,0 +1,2 @@
+[UiSettings]
+ColorScheme=BreezeDark
diff --git a/dotfiles/hyprland/.config/hypr/hyprland.conf b/dotfiles/hyprland/.config/hypr/hyprland.conf
index 34e44b6..3eae5b6 100644
--- a/dotfiles/hyprland/.config/hypr/hyprland.conf
+++ b/dotfiles/hyprland/.config/hypr/hyprland.conf
@@ -10,21 +10,32 @@ monitor=,preferred,auto,auto
# ============================================================================
# Startup Applications
# ============================================================================
+# Portal and D-Bus setup FIRST (other apps depend on these)
+exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
+exec-once = systemctl --user start xdg-desktop-portal-hyprland xdg-desktop-portal
+
+# Core services
exec-once = hyprpm reload && sleep 1 && hyprctl dismissnotify -1
-exec-once = waybar
+exec-once = /usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh
+exec-once = dunst > ~/.local/var/log/dunst-$(date +%Y-%m-%d-%H%M%S).log 2>&1
+
+# Desktop appearance (after portal is ready)
exec-once = swww-daemon && sleep 1 && swww img ~/pictures/wallpaper/trondheim-norway.jpg
-exec-once = dunst
-exec-once = hypridle
+exec-once = waybar > ~/.local/var/log/waybar-$(date +%Y-%m-%d-%H%M%S).log 2>&1
+exec-once = set-theme "$(cat ~/.config/current-theme 2>/dev/null || echo hudson)"
+
+# Background services
+exec-once = hypridle > ~/.local/var/log/hypridle-$(date +%Y-%m-%d-%H%M%S).log 2>&1
exec-once = /usr/lib/geoclue-2.0/demos/agent
-exec-once = gammastep
+exec-once = gammastep > ~/.local/var/log/gammastep-$(date +%Y-%m-%d-%H%M%S).log 2>&1
exec-once = blueman-applet
-exec-once = /usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh
-exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
+exec-once = easyeffects --gapplication-service
exec-once = mpd
+
+# Apps that can start later
exec-once = signal-desktop --start-in-tray --ozone-platform=wayland
exec-once = protonmail-bridge --no-window
exec-once = insync start
-exec-once = set-theme "$(cat ~/.config/current-theme 2>/dev/null || echo hudson)"
# ============================================================================
# Environment Variables
@@ -106,6 +117,13 @@ misc {
}
# ============================================================================
+# Debug (temporary - disable when stable)
+# ============================================================================
+debug {
+ disable_logs = false
+}
+
+# ============================================================================
# XWayland
# ============================================================================
xwayland {
@@ -251,17 +269,17 @@ bind = $mod SHIFT, PERIOD, movewindow, mon:+1
# Workspace rules (auto-launch apps when workspace first accessed)
workspace = special:term, on-created-empty:foot --app-id foot-term tmux
workspace = special:audio, on-created-empty:foot --app-id foot-audio pulsemixer
-workspace = special:monitor, on-created-empty:foot --app-id foot-monitor gotop
+workspace = special:monitor, on-created-empty:foot --app-id foot-monitor monitor-dashboard
workspace = special:music, on-created-empty:foot --app-id foot-music ncmpcpp
-workspace = special:htop, on-created-empty:foot --app-id foot-htop htop
workspace = special:network, on-created-empty:foot --app-id foot-network nmtui
+workspace = special:effects, on-created-empty:easyeffects
# Keybindings (single bind per scratchpad - just toggle visibility)
bind = $mod SHIFT, RETURN, togglespecialworkspace, term
bind = $mod, A, togglespecialworkspace, audio
bind = $mod, M, togglespecialworkspace, monitor
bind = $mod, SLASH, togglespecialworkspace, music
-bind = $mod SHIFT, H, togglespecialworkspace, htop
+bind = $mod SHIFT, A, togglespecialworkspace, effects
# Window rules (using app-id/class matching, Hyprland 0.53+ syntax)
# Terminal scratchpad
@@ -284,16 +302,16 @@ windowrule = match:class ^(foot-music)$, float on
windowrule = match:class ^(foot-music)$, size (monitor_w*0.6) (monitor_h*0.6)
windowrule = match:class ^(foot-music)$, center on
-# Htop
-windowrule = match:class ^(foot-htop)$, float on
-windowrule = match:class ^(foot-htop)$, size (monitor_w*0.6) (monitor_h*0.6)
-windowrule = match:class ^(foot-htop)$, center on
-
# Network manager
windowrule = match:class ^(foot-network)$, float on
windowrule = match:class ^(foot-network)$, size (monitor_w*0.6) (monitor_h*0.6)
windowrule = match:class ^(foot-network)$, center on
+# EasyEffects
+windowrule = match:class ^(Easy Effects)$, float on
+windowrule = match:class ^(Easy Effects)$, size (monitor_w*0.6) (monitor_h*0.6)
+windowrule = match:class ^(Easy Effects)$, center on
+
# Calculator (not a scratchpad, just launches app)
bind = $mod, X, exec, qalculate-gtk
bind = $mod, C, exec, hyprpicker -a
diff --git a/dotfiles/hyprland/.config/waybar/config b/dotfiles/hyprland/.config/waybar/config
index fdff160..66e318b 100644
--- a/dotfiles/hyprland/.config/waybar/config
+++ b/dotfiles/hyprland/.config/waybar/config
@@ -1,7 +1,6 @@
{
"layer": "top",
"position": "top",
- "height": 30,
"spacing": 4,
"margin-top": 6,
"margin-left": 10,
@@ -24,6 +23,7 @@
"group/sysmonitor": {
"orientation": "horizontal",
+ "swap-icon-label": false,
"modules": [
"cpu",
"temperature",
diff --git a/dotfiles/hyprland/.config/waypaper/config.ini b/dotfiles/hyprland/.config/waypaper/config.ini
new file mode 100644
index 0000000..66652ed
--- /dev/null
+++ b/dotfiles/hyprland/.config/waypaper/config.ini
@@ -0,0 +1,27 @@
+[Settings]
+language = en
+folder = ~/pictures/wallpaper
+monitors = All
+wallpaper = ~/pictures/wallpaper/trondheim-norway.jpg
+show_path_in_tooltip = True
+backend = swww
+fill = fill
+sort = name
+color = #ffffff
+subfolders = False
+all_subfolders = False
+show_hidden = False
+show_gifs_only = False
+zen_mode = False
+post_command =
+number_of_columns = 3
+swww_transition_type = simple
+swww_transition_step = 63
+swww_transition_angle = 0
+swww_transition_duration = 2
+swww_transition_fps = 60
+mpvpaper_sound = False
+mpvpaper_options =
+use_xdg_state = False
+stylesheet = /home/cjennings/.config/waypaper/style.css
+
diff --git a/dotfiles/hyprland/.config/xdg-desktop-portal/portals.conf b/dotfiles/hyprland/.config/xdg-desktop-portal/portals.conf
new file mode 100644
index 0000000..9cc87a2
--- /dev/null
+++ b/dotfiles/hyprland/.config/xdg-desktop-portal/portals.conf
@@ -0,0 +1,3 @@
+[preferred]
+default=hyprland;gtk
+org.freedesktop.impl.portal.Settings=none
diff --git a/dotfiles/hyprland/.local/bin/monitor-dashboard b/dotfiles/hyprland/.local/bin/monitor-dashboard
new file mode 100755
index 0000000..9236d20
--- /dev/null
+++ b/dotfiles/hyprland/.local/bin/monitor-dashboard
@@ -0,0 +1,37 @@
+#!/bin/sh
+# monitor-dashboard - tmux session with system monitoring tools
+# Each tool gets its own window for full screen real estate
+
+SESSION="monitor"
+
+# Check if system has a battery
+has_battery() {
+ [ -d /sys/class/power_supply/BAT0 ] || [ -d /sys/class/power_supply/BAT1 ]
+}
+
+# Attach to existing session or create new one
+if tmux has-session -t "$SESSION" 2>/dev/null; then
+ exec tmux attach-session -t "$SESSION"
+fi
+
+# Create new session with btop in first window
+tmux new-session -d -s "$SESSION" -n btop btop
+
+# Add windows for other monitoring tools (grouped logically)
+# CPU/GPU
+tmux new-window -t "$SESSION" -n s-tui s-tui
+tmux new-window -t "$SESSION" -n nvtop nvtop
+# Disk
+tmux new-window -t "$SESSION" -n duf "watch --color -n 60 duf"
+# Network
+tmux new-window -t "$SESSION" -n bandwhich "sudo bandwhich"
+tmux new-window -t "$SESSION" -n wavemon wavemon
+# Power (laptop only)
+if has_battery; then
+ tmux new-window -t "$SESSION" -n powertop "sudo powertop"
+fi
+
+# Start on btop window
+tmux select-window -t "$SESSION:btop"
+
+exec tmux attach-session -t "$SESSION"
diff --git a/dotfiles/hyprland/.local/bin/start-hyprland b/dotfiles/hyprland/.local/bin/start-hyprland
new file mode 100755
index 0000000..a5d191d
--- /dev/null
+++ b/dotfiles/hyprland/.local/bin/start-hyprland
@@ -0,0 +1,11 @@
+#!/bin/sh
+# Wrapper to launch Hyprland with persistent logging
+# Shadows /usr/bin/start-hyprland when ~/.local/bin is in PATH
+
+LOG_DIR="$HOME/.local/var/log"
+TIMESTAMP=$(date +%Y-%m-%d-%H%M%S)
+LOG_FILE="$LOG_DIR/hyprland-$TIMESTAMP.log"
+
+mkdir -p "$LOG_DIR"
+
+exec /usr/bin/start-hyprland "$@" > "$LOG_FILE" 2>&1
diff --git a/dotfiles/hyprland/.local/bin/toggle-scratchpad b/dotfiles/hyprland/.local/bin/toggle-scratchpad
index bb10ef7..b3da6b4 100755
--- a/dotfiles/hyprland/.local/bin/toggle-scratchpad
+++ b/dotfiles/hyprland/.local/bin/toggle-scratchpad
@@ -9,6 +9,17 @@ if [ -z "$NAME" ]; then
exit 1
fi
+# Auto-detect current Hyprland socket if env var is stale
+if ! hyprctl version >/dev/null 2>&1; then
+ # Find the most recent Hyprland instance with a socket
+ for dir in /run/user/"$(id -u)"/hypr/*/; do
+ if [ -S "${dir}.socket.sock" ]; then
+ export HYPRLAND_INSTANCE_SIGNATURE="$(basename "$dir")"
+ break
+ fi
+ done
+fi
+
STATEFILE="/tmp/scratchpad-$NAME-open"
NOW=$(date +%s)
diff --git a/dotfiles/hyprland/.local/bin/waybar-layout b/dotfiles/hyprland/.local/bin/waybar-layout
index 6c45877..62470aa 100755
--- a/dotfiles/hyprland/.local/bin/waybar-layout
+++ b/dotfiles/hyprland/.local/bin/waybar-layout
@@ -3,17 +3,17 @@
# Shows current layout with nerd font icons
# Layouts: master -> tab group (monocle) -> scrolling -> floating
-# Get current layout
-LAYOUT=$(hyprctl getoption general:layout -j | jq -r '.str')
-
-# Check if workspace has allfloat enabled
-ALLFLOAT=$(hyprctl activeworkspace -j | jq -r '.hasfullscreenwindow')
+# Check if hyprctl is reachable
+if ! hyprctl version >/dev/null 2>&1; then
+ echo '{"text": "<span size='"'"'large'"'"'>󰕰</span>", "tooltip": "Hyprland not connected"}'
+ exit 0
+fi
-# Check if active window is floating
-FLOATING=$(hyprctl activewindow -j 2>/dev/null | jq -r '.floating // false')
+# Get current layout (redirect stderr to suppress connection errors)
+LAYOUT=$(hyprctl getoption general:layout -j 2>/dev/null | jq -r '.str // "unknown"')
# Check workspace rules for allfloat
-WSRULES=$(hyprctl activeworkspace -j | jq -r '.rules // []')
+WSRULES=$(hyprctl activeworkspace -j 2>/dev/null | jq -r '.rules // []')
# Determine icon and tooltip
if [ "$LAYOUT" = "master" ] && echo "$WSRULES" | grep -q "allfloat"; then
diff --git a/dotfiles/hyprland/.local/share/easyeffects/output/dt770-pro-250-harman-eq.json b/dotfiles/hyprland/.local/share/easyeffects/output/dt770-pro-250-harman-eq.json
new file mode 100644
index 0000000..8774a0f
--- /dev/null
+++ b/dotfiles/hyprland/.local/share/easyeffects/output/dt770-pro-250-harman-eq.json
@@ -0,0 +1,199 @@
+{
+ "output": {
+ "blocklist": [],
+ "equalizer": {
+ "input-gain": -4.7,
+ "output-gain": 0.0,
+ "mode": "IIR",
+ "num-bands": 9,
+ "split-channels": false,
+ "left": {
+ "band0": {
+ "frequency": 45.0,
+ "gain": -4.7,
+ "q": 0.4,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band1": {
+ "frequency": 102.0,
+ "gain": 7.0,
+ "q": 5.0,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band2": {
+ "frequency": 134.0,
+ "gain": -3.8,
+ "q": 3.0,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band3": {
+ "frequency": 217.0,
+ "gain": 5.5,
+ "q": 2.3,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band4": {
+ "frequency": 2400.0,
+ "gain": -1.4,
+ "q": 4.0,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band5": {
+ "frequency": 3350.0,
+ "gain": 5.0,
+ "q": 3.0,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band6": {
+ "frequency": 5200.0,
+ "gain": 0.7,
+ "q": 3.0,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band7": {
+ "frequency": 6200.0,
+ "gain": -5.6,
+ "q": 4.0,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band8": {
+ "frequency": 10000.0,
+ "gain": -6.0,
+ "q": 0.7,
+ "type": "Hi-shelf",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ }
+ },
+ "right": {
+ "band0": {
+ "frequency": 45.0,
+ "gain": -4.7,
+ "q": 0.4,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band1": {
+ "frequency": 102.0,
+ "gain": 7.0,
+ "q": 5.0,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band2": {
+ "frequency": 134.0,
+ "gain": -3.8,
+ "q": 3.0,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band3": {
+ "frequency": 217.0,
+ "gain": 5.5,
+ "q": 2.3,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band4": {
+ "frequency": 2400.0,
+ "gain": -1.4,
+ "q": 4.0,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band5": {
+ "frequency": 3350.0,
+ "gain": 5.0,
+ "q": 3.0,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band6": {
+ "frequency": 5200.0,
+ "gain": 0.7,
+ "q": 3.0,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band7": {
+ "frequency": 6200.0,
+ "gain": -5.6,
+ "q": 4.0,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band8": {
+ "frequency": 10000.0,
+ "gain": -6.0,
+ "q": 0.7,
+ "type": "Hi-shelf",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ }
+ }
+ },
+ "plugins_order": [
+ "equalizer"
+ ]
+ }
+}
diff --git a/dotfiles/hyprland/.local/share/easyeffects/output/pixel-buds-pro-2-harman-eq.json b/dotfiles/hyprland/.local/share/easyeffects/output/pixel-buds-pro-2-harman-eq.json
new file mode 100644
index 0000000..056e216
--- /dev/null
+++ b/dotfiles/hyprland/.local/share/easyeffects/output/pixel-buds-pro-2-harman-eq.json
@@ -0,0 +1,219 @@
+{
+ "output": {
+ "blocklist": [],
+ "equalizer": {
+ "input-gain": -2.8,
+ "output-gain": 0.0,
+ "mode": "IIR",
+ "num-bands": 10,
+ "split-channels": false,
+ "left": {
+ "band0": {
+ "frequency": 105.0,
+ "gain": 2.1,
+ "q": 0.7,
+ "type": "Lo-shelf",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band1": {
+ "frequency": 1384.0,
+ "gain": -4.3,
+ "q": 2.82,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band2": {
+ "frequency": 670.0,
+ "gain": 1.5,
+ "q": 1.78,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band3": {
+ "frequency": 41.0,
+ "gain": 0.8,
+ "q": 1.26,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band4": {
+ "frequency": 4720.0,
+ "gain": -3.1,
+ "q": 6.0,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band5": {
+ "frequency": 10000.0,
+ "gain": -0.6,
+ "q": 0.7,
+ "type": "Hi-shelf",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band6": {
+ "frequency": 3725.0,
+ "gain": 2.9,
+ "q": 6.0,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band7": {
+ "frequency": 2565.0,
+ "gain": 1.7,
+ "q": 4.21,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band8": {
+ "frequency": 153.0,
+ "gain": 0.7,
+ "q": 2.47,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band9": {
+ "frequency": 6024.0,
+ "gain": 0.7,
+ "q": 4.95,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ }
+ },
+ "right": {
+ "band0": {
+ "frequency": 105.0,
+ "gain": 2.1,
+ "q": 0.7,
+ "type": "Lo-shelf",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band1": {
+ "frequency": 1384.0,
+ "gain": -4.3,
+ "q": 2.82,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band2": {
+ "frequency": 670.0,
+ "gain": 1.5,
+ "q": 1.78,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band3": {
+ "frequency": 41.0,
+ "gain": 0.8,
+ "q": 1.26,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band4": {
+ "frequency": 4720.0,
+ "gain": -3.1,
+ "q": 6.0,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band5": {
+ "frequency": 10000.0,
+ "gain": -0.6,
+ "q": 0.7,
+ "type": "Hi-shelf",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band6": {
+ "frequency": 3725.0,
+ "gain": 2.9,
+ "q": 6.0,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band7": {
+ "frequency": 2565.0,
+ "gain": 1.7,
+ "q": 4.21,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band8": {
+ "frequency": 153.0,
+ "gain": 0.7,
+ "q": 2.47,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band9": {
+ "frequency": 6024.0,
+ "gain": 0.7,
+ "q": 4.95,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ }
+ }
+ },
+ "plugins_order": [
+ "equalizer"
+ ]
+ }
+}
diff --git a/dotfiles/hyprland/.local/share/easyeffects/output/pxc-550-ii-harman-eq.json b/dotfiles/hyprland/.local/share/easyeffects/output/pxc-550-ii-harman-eq.json
new file mode 100644
index 0000000..c400419
--- /dev/null
+++ b/dotfiles/hyprland/.local/share/easyeffects/output/pxc-550-ii-harman-eq.json
@@ -0,0 +1,219 @@
+{
+ "output": {
+ "blocklist": [],
+ "equalizer": {
+ "input-gain": -3.0,
+ "output-gain": 0.0,
+ "mode": "IIR",
+ "num-bands": 10,
+ "split-channels": false,
+ "left": {
+ "band0": {
+ "frequency": 105.0,
+ "gain": 2.5,
+ "q": 0.7,
+ "type": "Lo-shelf",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band1": {
+ "frequency": 185.0,
+ "gain": -3.5,
+ "q": 1.35,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band2": {
+ "frequency": 2997.0,
+ "gain": 3.1,
+ "q": 1.24,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band3": {
+ "frequency": 4429.0,
+ "gain": 3.2,
+ "q": 5.98,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band4": {
+ "frequency": 5270.0,
+ "gain": -5.7,
+ "q": 4.03,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band5": {
+ "frequency": 10000.0,
+ "gain": -2.6,
+ "q": 0.7,
+ "type": "Hi-shelf",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band6": {
+ "frequency": 49.0,
+ "gain": -0.8,
+ "q": 1.84,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band7": {
+ "frequency": 359.0,
+ "gain": 0.8,
+ "q": 2.24,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band8": {
+ "frequency": 248.0,
+ "gain": -0.9,
+ "q": 4.62,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band9": {
+ "frequency": 735.0,
+ "gain": 0.4,
+ "q": 2.9,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ }
+ },
+ "right": {
+ "band0": {
+ "frequency": 105.0,
+ "gain": 2.5,
+ "q": 0.7,
+ "type": "Lo-shelf",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band1": {
+ "frequency": 185.0,
+ "gain": -3.5,
+ "q": 1.35,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band2": {
+ "frequency": 2997.0,
+ "gain": 3.1,
+ "q": 1.24,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band3": {
+ "frequency": 4429.0,
+ "gain": 3.2,
+ "q": 5.98,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band4": {
+ "frequency": 5270.0,
+ "gain": -5.7,
+ "q": 4.03,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band5": {
+ "frequency": 10000.0,
+ "gain": -2.6,
+ "q": 0.7,
+ "type": "Hi-shelf",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band6": {
+ "frequency": 49.0,
+ "gain": -0.8,
+ "q": 1.84,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band7": {
+ "frequency": 359.0,
+ "gain": 0.8,
+ "q": 2.24,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band8": {
+ "frequency": 248.0,
+ "gain": -0.9,
+ "q": 4.62,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ },
+ "band9": {
+ "frequency": 735.0,
+ "gain": 0.4,
+ "q": 2.9,
+ "type": "Bell",
+ "mode": "RLC (BT)",
+ "slope": "x1",
+ "mute": false,
+ "solo": false
+ }
+ }
+ },
+ "plugins_order": [
+ "equalizer"
+ ]
+ }
+}
diff --git a/dotfiles/hyprland/.profile.d/99-hyprland-autostart.sh b/dotfiles/hyprland/.profile.d/99-hyprland-autostart.sh
new file mode 100644
index 0000000..9d80353
--- /dev/null
+++ b/dotfiles/hyprland/.profile.d/99-hyprland-autostart.sh
@@ -0,0 +1,26 @@
+# 99-hyprland-autostart.sh
+# Auto-start Hyprland on TTY1 console login
+
+# Guard: only on TTY1, not SSH, no existing display
+[ "$XDG_VTNR" = "1" ] || return 0
+[ -z "$SSH_TTY" ] || return 0
+[ -z "$WAYLAND_DISPLAY" ] || return 0
+[ -z "$DISPLAY" ] || return 0
+command -v Hyprland >/dev/null 2>&1 || return 0
+
+# Skip if flag file exists (touch ~/.skip-hyprland to disable)
+[ -f "$HOME/.skip-hyprland" ] && return 0
+
+# Setup logging (same pattern as start-hyprland wrapper)
+_hypr_log_dir="$HOME/.local/var/log"
+mkdir -p "$_hypr_log_dir"
+_hypr_log="$_hypr_log_dir/hyprland-$(date +%Y-%m-%d-%H%M%S).log"
+
+# Clear screen and start Hyprland (no exec = return to shell on exit)
+clear
+Hyprland >"$_hypr_log" 2>&1
+
+# Hyprland exited - inform user
+echo "Hyprland session ended. Type 'start-hyprland' to restart."
+
+unset _hypr_log_dir _hypr_log