Compare commits

...

83 Commits

Author SHA1 Message Date
a1001e521e fix(wlogout): incorrect hyprland exit command 2026-07-16 18:42:19 +01:00
aae8be4001 style(hypr): cleanup lua configs 2026-07-16 10:20:11 +01:00
5dce5eb3b7 refactor(zsh): cleanup zshrc file 2026-07-14 19:46:20 +01:00
06b5aaa2d8 fix(hypr): incorrect mouse sens 2026-07-14 19:32:39 +01:00
84c0bb23b8 refactor!(hypr): switch to Lua config 2026-07-14 19:31:21 +01:00
3ec778781d fix(binds): update playerctl keybinds
Interfered with CS2 voting systems. Must find another way for it not to
override with other programs.
2026-04-06 20:47:36 +01:00
30425fa1e4 fix(hyprland): increase hyprland window animation speed
Was too slow, got really annoying
2026-04-06 20:44:33 +01:00
b55b45f25e fix(gitconfig): auto-lf 2026-04-06 20:43:50 +01:00
6bb29b7539 feat(vscode): update font size 2026-04-06 20:42:34 +01:00
3481125919 fix(hypr): fix minimum force speed 2026-03-16 22:51:08 +00:00
798ecf40a2 fix(hypr): adjust gesture settings for smoother workspace swaps
It turns out there are options for adjust the cancelling ratio and force
speed for workspace animations. This makes it much closer to real MacOS
animations.

This was tested against Jas's Macbook Air - M1 and they seem quite
closer.
2026-03-16 22:26:54 +00:00
eabcc3de6b feat(hyprland): add hypridle and lid close binds 2026-03-16 22:26:14 +00:00
bf9d570ff3 Merge branch 'main' of ssh://gitea/dylan/birch-dots 2026-03-14 13:21:03 +00:00
2c3c58e92d feat(packages): add yt-dlp 2026-03-14 00:34:20 +00:00
bc2c508969 fix(wlogout): broken logout button 2026-03-12 22:51:22 +00:00
8b12bc3a3b fix(mouse): incorrect sens 2026-03-12 22:46:17 +00:00
e628456780 Merge branch 'main' of ssh://gitea/dylan/birch-dots 2026-03-12 22:45:02 +00:00
3c463300b5 feat(gitconfig): add LFS config 2026-03-12 22:44:31 +00:00
984027efcb fix(hyprcursor): breeze mouse pointer uses lowercase "b"
Not really sure why it worked before, but after logging in this morning
the cursor was the default hyprland cursor. Fixed by reinstalling Breeze
and changing this.
2026-03-12 09:27:17 +00:00
1c12506728 chore(gitconfig): add LFS config 2026-03-12 08:56:16 +00:00
568a81a94d fix(hypr): increase scroll factor
Scrolling on certain apps is too slow with 0.2
2026-03-12 08:55:49 +00:00
9ee3da3100 feat(waybar): add bluetooth module 2026-03-12 08:55:28 +00:00
fab1c53cb3 fix(bootstrap): entire file skip upon one package fail
If one package in a file failed, the whole file was skipped.
2026-03-09 15:45:19 +00:00
f29cf5e920 fix(packages): update incorrect docker compose package 2026-03-09 15:40:21 +00:00
3ef8420a21 feat(packages): add rsync 2026-03-09 15:36:40 +00:00
7805b3c98d docs: add common issues markdown
These mostly pertain to the QEMU VM setup, so they might not be fully
relevant outside of VMs.
2026-03-09 15:24:19 +00:00
ccb5b1ab96 fix(bootstrap): missing NetworkManager install before enabling 2026-03-09 15:23:16 +00:00
c65c286606 fix(bootstrap): remove bluetooth service enabling
Bluetooth does not for now work reliably on my machines.
2026-03-09 15:10:58 +00:00
34ce514c75 fix(packages): remove zoom
Zoom is not a base package that I use on a base system. It can be
installed after the fact.
2026-03-09 14:53:20 +00:00
6e6376eee9 fix(bootstrap): missing system setups in bootstrap 2026-03-09 14:49:45 +00:00
d3617c3866 feat(bootstrap): update bootstrap script to install packages 2026-03-09 14:30:02 +00:00
378cc51cc3 feat(packages): add git-lfs 2026-03-08 15:45:18 +00:00
1bd5bebcda fix(hyprland): anime wallpaper accidentally added in default config
Cringe.
2026-03-08 00:22:25 +00:00
d96970bc8d fix(packages): remove redundant xdg-desktop-portal-wlr module
`xdg-desktop-portal-hyprland` is a fork of wlr that includes
Hyprland-specific features.
2026-03-08 00:00:16 +00:00
4bf3764855 fix(packages): remove qdirstat
ncdu (pacman/dev.txt) does everything that it does but as a CLI.
2026-03-07 23:56:35 +00:00
af00cb8735 feat(packages): remove libdwarf dev package
Not used by anything, not sure when or why it was installed.
2026-03-07 23:55:53 +00:00
1ba46fb540 feat(wlogout): add wlogout package settings 2026-03-07 19:45:16 +00:00
6796b1a28f feat(packages): add qdirstat package 2026-03-07 19:44:51 +00:00
88575db93b fix(waybar): missing left red bar on power button
Just for consistency with the left side of the bar, which has a nice
yellow bar indicating the end of the waybar.
2026-03-06 22:37:39 +00:00
c14d09c169 docs: update package retrival docs in README
These commands and flag descriptions are more for my own usage in the
future rather than any comprehensive or full documentation.
2026-03-06 22:15:29 +00:00
939e9fbc88 fix(packages): add missing wlogout to packages
I had wlogout used in my Waybar for ages but no wlogout specification
2026-03-06 21:40:02 +00:00
93f9c77ad3 refactor(packages): remove unnecessary packages & extract fonts
Fonts are now in their own file since they're awkward little packages to
manage and I hate them.
2026-03-06 19:50:48 +00:00
337b2f1ffd fix(packages): remove sddm-sugar-candy-git from pacman package list 2026-03-06 19:40:09 +00:00
cd1126b2ea refactor(packages): split packages into offical and foreign 2026-03-06 19:39:02 +00:00
22e667051a fix(waybar): transparency too high on bright backgrounds
After I logged into the main PC, the waybar icons were barely visible
due to the borderline transparent icons.

I increased the opaqueness of the widgets themselves while keeping the
rest of the bar transparent, so I can keep the clean look while still
being able to see what the hell is going on.
2026-03-06 19:26:22 +00:00
b1f76d6ac2 fix(hypr): increase length of workspace swap animation
Far too low before, originally done for the gesture speed, but affected
actually swapping between workspaces with the keyboard far more.
2026-03-05 16:52:42 +00:00
f171fe16fb feat(waybar): new waybar styling
Trying it out for now, might revert still since I'm not fully sold on it
yet. It's sleek but a bit "gamer-y" for my taste.
2026-03-05 16:46:16 +00:00
dac5c77bed feat(vscode): add vscode settings and extensions 2026-03-05 15:38:23 +00:00
4b3fd8bfa6 fix(wallpapers): remove unnecessary wallpaper 2026-03-05 14:45:40 +00:00
0506b1fa6d fix(hypr): separate two different animations
The overshoot animation applied to all windows and looked strange on
windows.
2026-03-05 11:01:27 +00:00
d91355f602 refactor(hypr): move gestures to input file
Gestures are not decorational, they are inputs.
2026-03-05 10:50:15 +00:00
d5ce4b4b19 feat(hypr): update beizer animation for smoother workspace swaps
Workspace swaps with no overshoot felt slightly clunky. Adding a small
overshoot makes it feel more smooth and Mac-like.
2026-03-05 10:29:20 +00:00
e36719997a fix(sddm): permissions and ownership of root-level SDDM confs
SDDM configs are at the system root level and are not user owned,
therefore they must be owned by the root and have special permissions.

`/etc/sddm.conf.d` and `/etc/sddm` *should* have permissions of 644.
Root can read/write, everyone else can read.
2026-03-05 09:57:40 +00:00
e972fa387d feat(packages): add earlyoom package
Prevents system freezing up when RAM runs out
2026-03-03 21:02:06 +00:00
d88f49732c feat: add nvidia-container-toolkit package 2026-03-03 14:14:57 +00:00
b1341b7920 feat: add discord settings 2026-03-02 21:43:08 +00:00
9dcb1ac329 fix: remove unused deps 2026-03-02 21:41:15 +00:00
3827de7d7c feat: update media keybinds to use f-keys 2026-03-01 18:42:46 +00:00
2a0c796952 fix: hardcoded PATH configs specific to a machine
Also removed neofetch
2026-03-01 18:23:29 +00:00
458b14ad5a feat: add .gitconfig 2026-03-01 18:15:28 +00:00
258702801e refactor(hypr): remove duplicated config from hyprland.conf 2026-03-01 11:26:59 +00:00
63d5d8bf85 feat: reduce scroll factor for smoother scrolling
Refactor input settings into it's own file
2026-02-28 19:43:57 +00:00
b6304c9430 docs: remove reqs from README
Reqs exist as package names in `packages`. Must still update
bootstrap.sh
2026-02-27 17:52:26 +00:00
1feae4fda9 chore: remove modelio alias
Use wofi menu option and edit .desktop launch file instead of launching
from terminal
2026-02-27 17:50:30 +00:00
7218365434 feat(sddm): add SDDM theme and config files 2026-02-26 22:09:11 +00:00
6267c5456c refactor: split packages by logical group 2026-02-26 21:02:37 +00:00
08c2929606 fix: remove unused and redundant packages 2026-02-26 20:59:01 +00:00
a55d8ec23b docs: update README for explict package command 2026-02-26 20:55:04 +00:00
ae12cf6332 feat: add packages.txt which lists all installed packages 2026-02-26 20:53:16 +00:00
1208b2cf10 fix(hyprland): fix per-device mouse sens 2026-02-26 20:45:43 +00:00
2227c87ab0 chore: clean up PATH envs
Prepending is generally recommended
2026-02-26 20:40:07 +00:00
9eb75b6306 fix: duplicate powerlevel10k setting & always-on neofetch
Running Neofetch on every shell spawn slows it down. Add check to ensure
it's only an interactive shell
2026-02-26 20:38:19 +00:00
6fe6528f9b feat(zshrc): add modelio with start envs to ensure functionality 2026-02-26 20:32:05 +00:00
fab1b3a175 fix(waybar): incorrect window alignments wit hyprland border spacings 2026-02-21 01:14:51 +00:00
2d25b86d8e feat(wallpapers): add new wallpapers 2026-02-16 21:15:42 +00:00
47af1cc086 fix(hyprland): fix missing hyprpaper config 2026-02-13 21:42:21 +00:00
03aea8a340 docs: update README.md 2026-02-12 12:51:31 +00:00
4fc9a1d838 feat(wallpapers): add extra wallpaper and fix file types 2026-02-12 12:45:19 +00:00
4b0671287c feat(wofi): add wallpaper selection menu 2026-02-12 12:40:47 +00:00
20f6bede8e feat(kitty): add kitty conf 2026-02-09 20:49:39 +00:00
2af53f29a6 feat(zshrc): set default text editor 2026-02-09 18:02:24 +00:00
8474908d14 docs: update README 2026-02-09 17:54:50 +00:00
316d7f4c19 feat(zsh): add opencode to path 2026-02-09 17:54:26 +00:00
44 changed files with 1177 additions and 396 deletions

View File

@@ -1,6 +0,0 @@
# Floating
windowrule = float 1, match:title Play Timer
# Opacity
windowrule = opacity 0.9 0.75, match:class $terminal

View File

@@ -0,0 +1,23 @@
-- Opacity
hl.window_rule({
name = "opacity_0_75_0_6",
match = {
class = ".*" .. terminal .. ".*"
},
opacity = "0.75 0.6",
})
-- Workspaces
hl.window_rule({
workspace = "1",
match = {
class = ".*[Mm]inecraft.*"
}
})
hl.window_rule({
workspace = "1",
match = {
class = ".*[Ss]team*."
}
})

View File

@@ -1,68 +0,0 @@
general {
# Gaps & borders – light and uncluttered
gaps_in = 4
gaps_out = 6
gaps_workspaces = 32
border_size = 1
col.active_border = rgba(0DB7D4FF)
col.inactive_border = rgba(31313633)
no_focus_fallback = true
allow_tearing = true
snap {
enabled = true
window_gap = 4
monitor_gap = 6
respect_gaps = true
}
}
dwindle {
preserve_split = true
smart_split = false
smart_resizing = false
}
decoration {
rounding = 10
shadow {
enabled = yes
range = 16
render_power = 2
color = rgba(00000040)
}
blur {
enabled = yes
size = 5
passes = 2
vibrancy = 0.14
}
}
animations {
enabled = yes
# Light, fast easing — no bounce, no drag
bezier = breeze, 0.22, 0.61, 0.36, 1.0
# Windows: quick, soft, intentional
animation = windows, 1, 5, breeze, slidefade
animation = windowsOut, 1, 4, breeze, slidefade
# Workspaces: airy glide, finishes fast
animation = workspaces, 1, 5, breeze, slide
# Subtle polish
animation = fade, 1, 4, breeze
animation = windowsMove, 1, 3, breeze
animation = border, 1, 3, breeze
}
gesture = 3, horizontal, workspace
gesture = 3, down, fullscreen, 1

View File

@@ -0,0 +1,53 @@
hl.config({
general = {
-- Gaps & borders – light and uncluttered
gaps_in = 4,
gaps_out = 6,
gaps_workspaces = 32,
border_size = 1,
no_focus_fallback = true,
allow_tearing = true,
snap = {
enabled = true,
window_gap = 4,
monitor_gap = 6,
respect_gaps = true,
},
col = {
active_border = "rgba(0DB7D4FF)",
inactive_border = "rgba(31313633)",
},
},
})
hl.config({
dwindle = {
preserve_split = true,
smart_split = false,
smart_resizing = false,
},
})
hl.config({
decoration = {
rounding = 10,
shadow = {
enabled = true,
range = 16,
render_power = 2,
color = "rgba(00000040)",
},
blur = {
enabled = true,
size = 5,
passes = 2,
vibrancy = 0.14,
},
},
})
hl.config({
animations = {
enabled = true,
},
})

View File

@@ -1,104 +0,0 @@
source = ~/.config/hypr/monitors.conf
# Set programs that you use
$terminal = kitty
$fileManager = thunar
$menu = wofi --show drun
$browser = brave
exec-once = /usr/lib/xdg-desktop-portal-hyprland &
exec-once = /usr/lib/xdg-desktop-portal &
exec-once = swww-daemon
exec-once = swww img ~/.wallpapers/liminal.png
exec = gsettings set org.gnome.desktop.interface color-scheme "prefer-dark" # for GTK4 apps
exec = gsettings set org.gnome.desktop.interface gtk-theme "adw-gtk3-dark" # for GTK3 apps
misc:initial_workspace_tracking=1
#############################
### ENVIRONMENT VARIABLES ###
#############################
env = XCURSOR_SIZE,24
env = HYPRCURSOR_SIZE,24
env = LIBVA_DRIVER_NAME,nvidia
env = __GLX_VENDOR_LIBRARY_NAME,nvidia
env = NVD_BACKEND,direct
env = QT_QPA_PLATFORMTHEME,qt6ct # for Qt apps# Theme
###################
### PERMISSIONS ###
###################
general {
gaps_in = 5
gaps_out = 5
border_size = 2
# https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors
col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
col.inactive_border = rgba(595959aa)
# Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = false
# Please see https://wiki.hypr.land/Configuring/Tearing/ before you turn this on
allow_tearing = false
layout = dwindle
}
dwindle {
pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
preserve_split = true # You probably want this
}
# See https://wiki.hypr.land/Configuring/Master-Layout/ for more
master {
new_status = master
}
# https://wiki.hypr.land/Configuring/Variables/#misc
misc {
force_default_wallpaper = -1 # 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. :(
}
#############
### INPUT ###
#############
# https://wiki.hypr.land/Configuring/Variables/#input
input {
kb_layout = ie
kb_variant =
kb_model =
kb_options =
kb_rules =
follow_mouse = 1
accel_profile = flat
force_no_accel=2
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
touchpad {
natural_scroll = true
}
}
device {
name = epic-mouse-v1
sensitivity = -0.5
}
exec-once = waybar
exec-once = nextcloud
exec-once = hyprctl setcursor Breeze 24
source = ~/.config/hypr/keybinds.conf
source = ~/.config/hypr/applications.conf
source = ~/.config/hypr/decoration.conf
source = ~/.config/hypr/workspaces.conf

46
.config/hypr/hyprland.lua Normal file
View File

@@ -0,0 +1,46 @@
local monitors = require("monitors")
-- Set programs that you use
terminal = "kitty"
fileManager = "thunar"
menu = "wofi --show drun"
browser = "brave"
hl.config({
misc = {
force_default_wallpaper = 0,
disable_hyprland_logo = true,
initial_workspace_tracking = 1,
},
})
-- Envs
hl.env("XCURSOR_SIZE", 24)
hl.env("HYPRCURSOR_SIZE", 24)
hl.env("LIBVA_DRIVER_NAME", "nvidia")
hl.env("__GLX_VENDOR_LIBRARY_NAME", "nvidia")
hl.env("NVD_BACKEND", "direct")
hl.env("QT_QPA_PLATFORMTHEME", "qt6ct")
local keybinds = require("keybinds")
local input = require("input")
local applications = require("applications")
local decorations = require("decoration")
local workspaces = require("workspaces")
-- Autostart
hl.on("hyprland.start", function()
hl.exec_cmd("/usr/lib/xdg-desktop-portal-hyprland &")
hl.exec_cmd("/usr/lib/xdg-desktop-portal &")
hl.exec_cmd("hyprpaper")
hl.exec_cmd("hypridle")
hl.exec_cmd("nextcloud")
hl.exec_cmd("waybar")
hl.exec_cmd("hyprctl setcursor breeze 24")
end)
-- Exec (run every reload)
hl.on("config.reloaded", function()
hl.exec_cmd("gsettings set org.gnome.desktop.interface color-scheme prefer-dark")
hl.exec_cmd("gsettings set org.gnome.desktop.interface gtk-theme adw-gtk3-dark")
end)

20
.config/hypr/input.lua Normal file
View File

@@ -0,0 +1,20 @@
hl.config({
input = {
kb_layout = "ie",
follow_mouse = 1,
accel_profile = "flat",
sensitivity = 0,
touchpad = {
natural_scroll = true,
scroll_factor = 0.45,
},
},
})
hl.config({
gestures = {
workspace_swipe_cancel_ratio = 0,
workspace_swipe_min_speed_to_force = 10,
},
})

View File

@@ -1,69 +0,0 @@
$mainMod = SUPER # Sets "Windows" key as main modifier
bind = $mainMod, RETURN, exec, $terminal
# Move focus with mainMod + arrow keys
bind = $mainMod, left, movefocus, l
bind = $mainMod, right, movefocus, r
bind = $mainMod, up, movefocus, u
bind = $mainMod, down, movefocus, d
# Switch workspaces with mainMod + [0-9]
bind = $mainMod, 1, workspace, 1
bind = $mainMod, 2, workspace, 2
bind = $mainMod, 3, workspace, 3
bind = $mainMod, 4, workspace, 4
bind = $mainMod, 5, workspace, 5
bind = $mainMod, 6, workspace, 6
bind = $mainMod, 7, workspace, 7
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
bind = $mainMod SHIFT, 4, movetoworkspace, 4
bind = $mainMod SHIFT, 5, movetoworkspace, 5
bind = $mainMod SHIFT, 6, movetoworkspace, 6
bind = $mainMod SHIFT, 7, movetoworkspace, 7
bind = $mainMod SHIFT, 8, movetoworkspace, 8
bind = $mainMod SHIFT, 9, movetoworkspace, 9
bind = $mainMod SHIFT, 0, movetoworkspace, 10
# 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 = $mainMod, P, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
bindel = $mainMod, O, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
bindel = $mainMod, N, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
bindel = $mainMod, M, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
bindel = $mainMod, L, exec, brightnessctl -e4 -n2 set 5%+
bindel = $mainMod, K, exec, brightnessctl -e4 -n2 set 5%-
# Requires playerctl
bindl = , XF86AudioNext, exec, playerctl next
bindl = , XF86AudioPause, exec, playerctl play-pause
bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPrev, exec, playerctl previous
bind = SUPER CTRL, left, swapwindow, l
bind = SUPER CTRL, right, swapwindow, r
bind = SUPER SHIFT, F, fullscreen
bind = SUPER CTRL, F, fullscreen, 1
bind = SUPER, Q, killactive
bind = ALT, TAB, cyclenext
bind = SUPER, F, exec, $fileManager
bind = SUPER, D, exec, $menu
bind = SUPER, B, exec, $browser
bind = SUPER SHIFT, S, exec, grim -g "$(slurp)" - | wl-copy

78
.config/hypr/keybinds.lua Normal file
View File

@@ -0,0 +1,78 @@
---@module 'hl'
local mainMod = "SUPER"
-- Sets "Windows" key as main modifier
hl.bind(mainMod .. " + " .. "RETURN", hl.dsp.exec_cmd(terminal))
-- Move focus with mainMod + arrow keys
hl.bind(mainMod .. " + " .. "left", hl.dsp.focus({ direction = "left" }))
hl.bind(mainMod .. " + " .. "right", hl.dsp.focus({ direction = "right" }))
hl.bind(mainMod .. " + " .. "up", hl.dsp.focus({ direction = "up" }))
hl.bind(mainMod .. " + " .. "down", hl.dsp.focus({ direction = "down" }))
-- Switch workspaces with mainMod + [0-9]
hl.bind(mainMod .. " + " .. 1, hl.dsp.focus({ workspace = 1 }))
hl.bind(mainMod .. " + " .. 2, hl.dsp.focus({ workspace = 2 }))
hl.bind(mainMod .. " + " .. 3, hl.dsp.focus({ workspace = 3 }))
hl.bind(mainMod .. " + " .. 4, hl.dsp.focus({ workspace = 4 }))
hl.bind(mainMod .. " + " .. 5, hl.dsp.focus({ workspace = 5 }))
hl.bind(mainMod .. " + " .. 6, hl.dsp.focus({ workspace = 6 }))
hl.bind(mainMod .. " + " .. 7, hl.dsp.focus({ workspace = 7 }))
hl.bind(mainMod .. " + " .. 8, hl.dsp.focus({ workspace = 8 }))
hl.bind(mainMod .. " + " .. 9, hl.dsp.focus({ workspace = 9 }))
hl.bind(mainMod .. " + " .. 0, hl.dsp.focus({ workspace = 10 }))
-- Move active window to a workspace with mainMod + SHIFT + [0-9]
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 1, hl.dsp.window.move({ workspace = 1 }))
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 2, hl.dsp.window.move({ workspace = 2 }))
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 3, hl.dsp.window.move({ workspace = 3 }))
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 4, hl.dsp.window.move({ workspace = 4 }))
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 5, hl.dsp.window.move({ workspace = 5 }))
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 6, hl.dsp.window.move({ workspace = 6 }))
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 7, hl.dsp.window.move({ workspace = 7 }))
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 8, hl.dsp.window.move({ workspace = 8 }))
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 9, hl.dsp.window.move({ workspace = 9 }))
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 0, hl.dsp.window.move({ workspace = 10 }))
-- Scroll through existing workspaces with mainMod + scroll
hl.bind(mainMod .. " + " .. "mouse_down", hl.dsp.focus({ workspace = "e+1" }))
hl.bind(mainMod .. " + " .. "mouse_up", hl.dsp.focus({ workspace = "e-1" }))
-- Move/resize windows with mainMod + LMB/RMB and dragging
hl.bind(mainMod .. " + " .. "mouse:272", hl.dsp.window.drag(), { mouse = true })
hl.bind(mainMod .. " + " .. "mouse:273", hl.dsp.window.resize(), { mouse = true })
-- Change wallpaper
hl.bind(mainMod .. " + " .. "W", hl.dsp.exec_cmd("~/.config/wofi/scripts/wallpaper.sh"))
hl.bind(mainMod .. " + " .. "L", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%+"), { locked = true })
hl.bind(mainMod .. " + " .. "K", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%-"), { locked = true })
-- Volume
hl.bind("F7", hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), { locked = true })
hl.bind("F8", hl.dsp.exec_cmd("wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+"), { locked = true })
hl.bind("F9", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), { locked = true })
hl.bind("F10", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"), { locked = true })
-- Playback (requires playerctl)
hl.bind("F4", hl.dsp.exec_cmd("playerctl previous"), { locked = true })
hl.bind("F5", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true })
hl.bind("F6", hl.dsp.exec_cmd("playerctl next"), { locked = true })
hl.bind("switch:on:Lid Switch", hl.dsp.exec_cmd("hyprctl dispatch dpms off"), { locked = true })
hl.bind("switch:off:Lid Switch", hl.dsp.exec_cmd("hyprctl dispatch dpms on"), { locked = true })
-- My binds
hl.bind("SUPER + CTRL" .. " + " .. "left", hl.dsp.window.swap({ direction = "left" }))
hl.bind("SUPER + CTRL" .. " + " .. "right", hl.dsp.window.swap({ direction = "right" }))
hl.bind("SUPER + SHIFT" .. " + " .. "F", hl.dsp.window.fullscreen())
hl.bind("SUPER + CTRL" .. " + " .. "F", hl.dsp.window.fullscreen({mode = "maximized"}))
hl.bind("SUPER" .. " + " .. "Q", hl.dsp.window.close())
hl.bind("ALT" .. " + " .. "TAB", hl.dsp.window.cycle_next())
hl.bind("SUPER" .. " + " .. "F", hl.dsp.exec_cmd(fileManager))
hl.bind("SUPER" .. " + " .. "D", hl.dsp.exec_cmd(menu))
hl.bind("SUPER" .. " + " .. "B", hl.dsp.exec_cmd(browser))
hl.bind(
"SUPER + SHIFT + S",
hl.dsp.exec_cmd('grim -g "$(slurp -d)" - | wl-copy')
)

13
.config/hypr/monitors.lua Normal file
View File

@@ -0,0 +1,13 @@
hl.monitor({
output = "DP-3",
mode = "1920x1080@270",
position = "0x0",
scale = 1,
})
hl.monitor({
output = "DP-1",
mode = "1920x1080@144",
position = "-1920x0",
scale = 1,
})

View File

@@ -1,14 +0,0 @@
# Workspaces 1–5 on DP-3
workspace = 1, monitor:DP-3, default:true
workspace = 2, monitor:DP-3
workspace = 3, monitor:DP-3
workspace = 4, monitor:DP-3
workspace = 5, monitor:DP-3
# Workspaces 6–10 on DP-1
workspace = 6, monitor:DP-1, default:true
workspace = 7, monitor:DP-1
workspace = 8, monitor:DP-1
workspace = 9, monitor:DP-1
workspace = 10, monitor:DP-1

View File

@@ -0,0 +1,51 @@
-- Workspaces 1–5 on DP-3
hl.workspace_rule({
workspace = 1,
monitor = "DP-3",
})
hl.workspace_rule({
workspace = 2,
monitor = "DP-3",
})
hl.workspace_rule({
workspace = 3,
monitor = "DP-3",
})
hl.workspace_rule({
workspace = 4,
monitor = "DP-3",
})
hl.workspace_rule({
workspace = 5,
monitor = "DP-3",
})
-- Workspaces 6–10 on DP-1
hl.workspace_rule({
workspace = 6,
monitor = "DP-1",
})
hl.workspace_rule({
workspace = 7,
monitor = "DP-1",
})
hl.workspace_rule({
workspace = 8,
monitor = "DP-1",
})
hl.workspace_rule({
workspace = 9,
monitor = "DP-1",
})
hl.workspace_rule({
workspace = 10,
monitor = "DP-1",
})

1
.config/kitty/kitty.conf Normal file
View File

@@ -0,0 +1 @@
confirm_os_window_close 0

View File

@@ -16,6 +16,7 @@
"modules-right": [ "modules-right": [
"tray", "tray",
"pulseaudio", "pulseaudio",
"bluetooth",
"custom/micmute", "custom/micmute",
"battery", "battery",
"custom/power" "custom/power"
@@ -62,6 +63,16 @@
"on-click-right": "pavucontrol" "on-click-right": "pavucontrol"
}, },
"bluetooth": {
"format": "󰂯 {num_connections}",
"format-connected": "󰂱 {num_connections}",
"format-disabled": "󰂲",
"tooltip-format-connected": "{device_enumerate}",
"tooltip-format-enumerate-connected": "󰂱 {device_alias} ({device_battery_percentage}%)",
"on-click": "blueman-manager",
"on-click-right": "bluectl power toggle"
},
"battery": { "battery": {
"interval":2, "interval":2,
"states": { "states": {

View File

@@ -1,145 +1,238 @@
@define-color Buttons #262522; /* ============================================================
@define-color Buttonshover #4d4a44; WAYBAR STYLE — Dark Industrial / Refined Utility
@define-color Text #A69F92; Palette: deep charcoal base, amber accents, cool greys
============================================================ */
/* ── Root Variables ───────────────────────────────────────── */
/* --- Global Styles --- */
* { * {
font-family: "JetBrainsMono Nerd Font Propo"; font-family: "JetBrainsMono Nerd Font Propo";
font-size: 14px; font-size: 13px;
min-height: 25px;
padding-right: 0px;
padding-left: 0px;
padding-bottom: 0px;
}
/* --- Waybar Container --- */
#waybar {
background: transparent;
color: #c6d0f5;
margin: 0px;
font-weight: 500;
}
/* --- Left Modules (Individual, Fully Rounded Blocks - With Horizontal Spacing & Simple Hover) --- */
#workspaces,
#cpu,
#memory{
background-color: @Buttons;
padding: 0.3rem 0.7rem;
margin: 5px 0px; /* 5px top/bottom margin, 0px left/right (base for individual control) */
border-radius: 10px; /* These modules are always rounded */
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
min-width: 0;
border: none; border: none;
/* Transition for background-color and color only */ border-radius: 0;
transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out; }
/* ── Bar ──────────────────────────────────────────────────── */
window#waybar {
background: rgba(10, 10, 14, 0);
color: #dcdce8;
}
/* ── Tooltip ──────────────────────────────────────────────── */
tooltip {
background: #0e0e12;
border: 1px solid rgba(255, 180, 60, 0.35);
color: #dcdce8;
padding: 6px 10px;
}
tooltip label {
color: #dcdce8;
}
/* ── Shared Module Base ───────────────────────────────────── */
#clock,
#cpu,
#memory,
#pulseaudio,
#bluetooth,
#battery,
#tray,
#custom-micmute,
#custom-power {
padding: 6px 12px;
margin: 5px 0;
color: #dcdce8;
background: rgba(10, 10, 14, 0.3);
transition: color 0.2s ease, background 0.2s ease;
}
/* ── Separator dots between modules ──────────────────────── */
#cpu,
#memory,
#pulseaudio,
#bluetooth,
#custom-micmute,
#battery {
border-left: 1px solid rgba(255, 255, 255, 0);
}
/* ═══════════════════════════════════════════════════════════
LEFT — System Info: Clock · CPU · Memory
═══════════════════════════════════════════════════════════ */
#clock {
font-family: "JetBrainsMono Nerd Font Propo";
font-weight: 400;
font-size: 12.5px;
color: #f0de9c;
letter-spacing: 0.04em;
padding-left: 0.4em;
border-left: 3px solid rgba(255, 180, 60, 0.3);
margin-left: 8px;
}
#cpu {
color: #b8d8ee;
}
#cpu:hover {
color: #d8f0ff;
background: rgba(160, 196, 216, 0.14);
} }
#memory { #memory {
margin: 5px 10px; color: #b0d4be;
} }
#memory:hover {
color: #ceeede;
background: rgba(157, 191, 173, 0.14);
}
/* ═══════════════════════════════════════════════════════════
CENTER — Workspaces
═══════════════════════════════════════════════════════════ */
#workspaces { #workspaces {
padding: 0px; margin: 0;
border-radius: 10px; padding: 0;
} background: transparent;
/* Simple Hover effects for individual left modules - BRIGHTER COLOR */
#cpu:hover, #memory:hover {
background-color: @Buttonshover; /* Brighter highlight */
} }
#workspaces button { #workspaces button {
color: @Text; font-family: 'JetBrains Nerd Font Propo';
border-radius: 10px; /* Workspaces buttons are always rounded */ font-size: 12px;
padding: 0.3rem 0.6rem; padding: 2px 10px;
background: transparent; margin: 4px 2px;
transition: all 0.2s ease-in-out; color: #6e6e88;
border: none; background: rgba(255, 255, 255, 0.05);
outline: none; border: 1px solid transparent;
} border-radius: 3px;
transition: all 0.15s ease;
#workspaces button.active { min-width: 32px;
color: @Text;
background-color: rgba(153, 209, 219, 0.1);
} }
#workspaces button:hover { #workspaces button:hover {
background: @Buttonshover; /* Reference bright hover color */ color: #c0c0d8;
color: @Text; background: rgba(255, 255, 255, 0.1);
border-color: rgba(255, 255, 255, 0.15);
} }
/* --- Center Module (Individual, Fully Rounded Block - With Simple Hover) --- */ #workspaces button.active {
#clock { color: #f0c060;
background-color: @Buttons; background: rgba(255, 180, 60, 0.14);
padding: 0.3rem 0.7rem; border-color: rgba(255, 180, 60, 0.5);
margin: 5px 0px; font-weight: 600;
margin-left: 20px; }
margin-right: 10px;
border-radius: 10px; /* This module is always rounded */ #workspaces button.urgent {
min-width: 0; color: #f08080;
border: none; background: rgba(240, 80, 80, 0.15);
transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out; border-color: rgba(240, 80, 80, 0.45);
} }
/* Simple Hover effect for clock module - BRIGHTER COLOR */ /* ═══════════════════════════════════════════════════════════
#clock:hover { RIGHT — Audio · Bluetooth · Mic · Battery · Power
background-color: @Buttonshover; /* Brighter highlight */ ═══════════════════════════════════════════════════════════ */
/* ── Tray ─────────────────────────────────────────────────── */
#tray {
padding: 2px 10px;
}
#tray > .passive {
-gtk-icon-effect: dim;
}
#tray > .needs-attention {
-gtk-icon-effect: highlight;
background-color: rgba(240, 120, 60, 0.25);
}
/* ── Audio ────────────────────────────────────────────────── */
#pulseaudio {
color: #c4bce8;
}
#pulseaudio:hover {
color: #e0d8ff;
background: rgba(176, 168, 216, 0.14);
}
/* ── Bluetooth ────────────────────────────────────────────── */
#bluetooth {
color: #90c8f0;
}
#bluetooth.connected {
color: #70d8ff;
}
#bluetooth:hover {
background: rgba(128, 184, 224, 0.14);
}
/* ── Microphone Mute ──────────────────────────────────────── */
#custom-micmute {
color: #b0d4be;
}
#custom-micmute.muted {
color: #585870;
} }
/* --- Right Modules (Single, Seamless Bar ) --- */
#custom-power:hover,
#pulseaudio:hover,
#battery:hover,
#tray:hover,
#custom-micmute:hover { #custom-micmute:hover {
background-color: @Buttonshover; background: rgba(157, 191, 173, 0.14);
} }
#cpu, #memory { /* ── Battery ──────────────────────────────────────────────── */
color: @Text;
}
#clock {
color: @Text;
font-weight: 500;
}
#tray, #battery, #pulseaudio, #custom-power, #custom-micmute {
background-color: @Buttons;
color: @Text;
border-radius: 10px;
padding: 0.7rem;
margin: 0.35rem;
transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out;
}
#battery { #battery {
color: @Text; color: #b8dc98;
} }
#battery.charging {
color: @Text; #battery.charging,
#battery.plugged {
color: #d4f098;
} }
#battery.warning:not(.charging) { #battery.warning:not(.charging) {
color: @Text; color: #eecb68;
} }
#battery.critical:not(.charging) {
/* --- Tooltip Styles --- */ color: #f07060;
tooltip { animation: battery-pulse 1.5s ease-in-out infinite;
background-color: #1a1b26;
color: #dddddd;
padding: 5px 12px;
margin: 5px 0px;
border-radius: 6px;
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
font-size: 12px;
} }
@keyframes battery-pulse {
0% {
opacity: 1;
}
50% {
opacity: 0.4;
}
100% {
opacity: 1;
}
}
#battery:hover {
background: rgba(168, 204, 136, 0.14);
}
/* ── Power Button ─────────────────────────────────────────── */
#custom-power {
color: #d07070;
font-size: 14px;
padding: 2px 14px 2px 12px;
margin-right: 8px;
border-right: 3px solid rgba(255, 0, 0, 0.3);
}
#custom-power:hover {
color: #f09090;
background: rgba(200, 60, 60, 0.2);
}

36
.config/wlogout/layout Normal file
View File

@@ -0,0 +1,36 @@
{
"label" : "lock",
"action" : "loginctl lock-session",
"text" : "Lock",
"keybind" : "l"
}
{
"label" : "hibernate",
"action" : "systemctl hibernate",
"text" : "Hibernate",
"keybind" : "h"
}
{
"label" : "logout",
"action" : "hyprctl dispatch 'hl.dsp.exit()'",
"text" : "Logout",
"keybind" : "e"
}
{
"label" : "shutdown",
"action" : "systemctl poweroff",
"text" : "Shutdown",
"keybind" : "s"
}
{
"label" : "suspend",
"action" : "systemctl suspend",
"text" : "Suspend",
"keybind" : "u"
}
{
"label" : "reboot",
"action" : "systemctl reboot",
"text" : "Reboot",
"keybind" : "r"
}

50
.config/wlogout/style.css Normal file
View File

@@ -0,0 +1,50 @@
* {
background-image: none;
box-shadow: none;
}
window {
background-color: rgba(12, 12, 12, 0.9);
}
button {
border-radius: 0;
border-color: black;
text-decoration-color: #FFFFFF;
color: #FFFFFF;
background-color: #1E1E1E;
border-style: solid;
border-width: 1px;
background-repeat: no-repeat;
background-position: center;
background-size: 25%;
}
button:focus, button:active, button:hover {
background-color: #3700B3;
outline-style: none;
}
#lock {
background-image: image(url("/usr/share/wlogout/icons/lock.png"), url("/usr/local/share/wlogout/icons/lock.png"));
}
#logout {
background-image: image(url("/usr/share/wlogout/icons/logout.png"), url("/usr/local/share/wlogout/icons/logout.png"));
}
#suspend {
background-image: image(url("/usr/share/wlogout/icons/suspend.png"), url("/usr/local/share/wlogout/icons/suspend.png"));
}
#hibernate {
background-image: image(url("/usr/share/wlogout/icons/hibernate.png"), url("/usr/local/share/wlogout/icons/hibernate.png"));
}
#shutdown {
background-image: image(url("/usr/share/wlogout/icons/shutdown.png"), url("/usr/local/share/wlogout/icons/shutdown.png"));
}
#reboot {
background-image: image(url("/usr/share/wlogout/icons/reboot.png"), url("/usr/local/share/wlogout/icons/reboot.png"));
}

View File

@@ -0,0 +1,91 @@
#!/usr/bin/env bash
# Configuration
WALLPAPER_DIR="$HOME/.wallpapers" # Change this to your wallpaper directory
CACHE_DIR="$HOME/.cache/wallpaper-selector"
THUMBNAIL_WIDTH="250" # Size of thumbnails in pixels (16:9)
THUMBNAIL_HEIGHT="141"
# Create cache directory if it doesn't exist
mkdir -p "$CACHE_DIR"
# Function to generate thumbnail
generate_thumbnail() {
local input="$1"
local output="$2"
magick "$input" -thumbnail "${THUMBNAIL_WIDTH}x${THUMBNAIL_HEIGHT}^" -gravity center -extent "${THUMBNAIL_WIDTH}x${THUMBNAIL_HEIGHT}" "$output"
}
# Create shuffle icon thumbnail on the fly
SHUFFLE_ICON="$CACHE_DIR/shuffle_thumbnail.png"
# Create a properly sized shuffle icon thumbnail
# magick -size "${THUMBNAIL_WIDTH}x${THUMBNAIL_HEIGHT}" xc:#1e1e2e \
# "$HOME/Repos/wallpaper-selector/assets/shuffle.png" -resize "120x120" -gravity center -composite \
# "$SHUFFLE_ICON"
magick -size "${THUMBNAIL_WIDTH}x${THUMBNAIL_HEIGHT}" xc:#1e1e2e \
\( "$HOME/Repos/wallpaper-selector/assets/shuffle.png" -resize "80x80" \) \
-gravity center -composite "$SHUFFLE_ICON"
# Generate thumbnails and create menu items
generate_menu() {
# Add random/shuffle option with a name that sorts first (using ! prefix)
echo -en "img:$SHUFFLE_ICON\x00info:!Random Wallpaper\x1fRANDOM\n"
# Then add all wallpapers
for img in "$WALLPAPER_DIR"/*.{jpg,jpeg,png}; do
# Skip if no matches found
[[ -f "$img" ]] || continue
# Generate thumbnail filename
thumbnail="$CACHE_DIR/$(basename "${img%.*}").png"
# Generate thumbnail if it doesn't exist or is older than source
if [[ ! -f "$thumbnail" ]] || [[ "$img" -nt "$thumbnail" ]]; then
generate_thumbnail "$img" "$thumbnail"
fi
# Output menu item (filename and path)
echo -en "img:$thumbnail\x00info:$(basename "$img")\x1f$img\n"
done
}
# Use wofi to display grid of wallpapers - IMPORTANT: added --sort-order=default
selected=$(generate_menu | wofi --show dmenu \
--cache-file /dev/null \
--define "image-size=${THUMBNAIL_WIDTH}x${THUMBNAIL_HEIGHT}" \
--columns 3 \
--allow-images \
--insensitive \
--sort-order=default \
--prompt "Select Wallpaper" \
--conf ~/.config/wofi/wallpaper.conf \
)
# Set wallpaper if one was selected
if [ -n "$selected" ]; then
# Remove the img: prefix to get the cached thumbnail path
thumbnail_path="${selected#img:}"
# Check if random wallpaper was selected
if [[ "$thumbnail_path" == "$SHUFFLE_ICON" ]]; then
# Select a random wallpaper from the directory
original_path=$(find "$WALLPAPER_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) | shuf -n 1)
else
# Get the original filename from the thumbnail path
original_filename=$(basename "${thumbnail_path%.*}")
# Find the corresponding original file in the wallpaper directory
original_path=$(find "$WALLPAPER_DIR" -type f -name "${original_filename}.*" | head -n1)
fi
# Ensure a valid wallpaper was found before proceeding
if [ -n "$original_path" ]; then
hyprctl hyprpaper wallpaper ",$original_path"
# Save the selection for persistence
echo "$original_path" > "$HOME/.cache/current_wallpaper"
# Optional: Notify user
notify-send "Wallpaper" "Wallpaper has been updated" -i "$original_path"
else
notify-send "Wallpaper Error" "Could not find the original wallpaper file."
fi
fi

View File

@@ -0,0 +1,18 @@
# Window settings
width=800
height=600
location=center
show=dmenu
prompt=Select Wallpaper
layer=overlay
# Layout
columns=3
image_size=250x141 # 16:9
allow_images=true
insensitive=true
hide_scroll=true
sort_order=alphabetical
# Style
style_path=~/.config/wofi/wallpaper.css

View File

@@ -0,0 +1,47 @@
window {
background-color: #1e1e2e;
border-radius: 8px;
border: 2px solid #313244;
}
#input {
margin: 2px;
padding: 4px;
border-radius: 4px;
border: none;
background-color: #313244;
color: #cdd6f4;
}
#inner-box {
margin: 0px;
}
#outer-box {
margin: 0px;
}
#scroll {
margin: 0px;
}
#text {
margin: 2px;
color: #cdd6f4;
}
#entry {
padding: 2px;
margin: 0px;
border-radius: 4px;
}
#entry:selected {
background-color: #313244;
}
#img {
margin: 2px;
padding-left: 4px;
border-radius: 4px;
}

10
.gitconfig Normal file
View File

@@ -0,0 +1,10 @@
[user]
email = dylanseandefaoite@gmail.com
name = Dylan De Faoite
[filter "lfs"]
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
process = git-lfs filter-process
required = true
[core]
autocrlf = input

BIN
.wallpapers/city.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 MiB

BIN
.wallpapers/cpu.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 KiB

BIN
.wallpapers/liminal.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

BIN
.wallpapers/monochrome.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

BIN
.wallpapers/sanFran.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 787 KiB

31
.zshrc
View File

@@ -1,25 +1,26 @@
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc. # INSTANT PROMPT
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
neofetch
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi fi
# Environment for apps # PATH
export QT_QPA_PLATFORMTHEME=qt5ct # for Qt5 export PATH="$HOME/.local/bin:$HOME/.opencode/bin:$PATH"
export QT_QPA_PLATFORMTHEME=qt6ct # for Qt6
# ENVIRONMENT
export EDITOR=nvim
export VISUAL=nvim
export QT_QPA_PLATFORMTHEME=qt6ct # Qt6 apps
# ALIASES
alias dotfiles="git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME" alias dotfiles="git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME"
# COMPLETION (before plugins that hook into it)
autoload -Uz compinit && compinit
# PLUGINS
source ~/powerlevel10k/powerlevel10k.zsh-theme source ~/powerlevel10k/powerlevel10k.zsh-theme
source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh # keep LAST
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh. # THEME CONFIG (after theme is loaded)
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh [[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
# Created by `pipx` on 2026-01-15 16:32:17
export PATH="$PATH:/home/dylan/.local/bin"

View File

@@ -1,12 +1,13 @@
# Requirements
- hyprland (Desktop Env)
- kitty (Terminal)
- thunar (File Manager)
- wofi (Application Select Menu)
- adw-gtk-theme
- zsh-syntax-highlighting
- mako (Notifications)
# Setup # Setup
1) Ensure each requirement is installed 1) Run `bootstrap.sh` to configure system files and install packages
2) Add `monitors.conf` in `~/.config/hypr/` for your specific monitor setup 2) Add `monitors.conf` in `~/.config/hypr/` for your specific monitor setup
# Packages
- Used `sudo pacman -Qqen` to get all explicit offical packages
- Used `sudo pacman -Qqem` to get all explicit unofficial AUR packages
## Meaning
- `-Q`: Query local package database
- `-q`: Quiet flag, print only package name
- `-e`: Only show **explicitly** installed packages
- `-n`: Native packages only
- `-m`: Foreign packages only

235
bootstrap.sh Normal file
View File

@@ -0,0 +1,235 @@
#!/usr/bin/env bash
# =============================================================================
# birch-dots bootstrap.sh
# Goes from a bare Arch install to a fully configured Hyprland desktop.
# Run as your normal user (with sudo access), NOT as root.
# =============================================================================
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PKG_DIR="$REPO_ROOT/packages"
# Colours
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
log() { echo -e "${GREEN}==>${NC} $*"; }
warn() { echo -e "${YELLOW}[!]${NC} $*"; }
die() { echo -e "${RED}[✗]${NC} $*"; exit 1; }
# Guard: must not run as root
[[ "$EUID" -ne 0 ]] || die "Run as your normal user, not root."
# =============================================================================
# 1. SYSTEM SETUP
# =============================================================================
log "Setting locale (en_IE.UTF-8)"
sudo sed -i 's/^#en_IE.UTF-8 UTF-8/en_IE.UTF-8 UTF-8/' /etc/locale.gen
sudo locale-gen
echo "LANG=en_IE.UTF-8" | sudo tee /etc/locale.conf > /dev/null
log "Setting keymap (uk)"
echo "KEYMAP=uk" | sudo tee /etc/vconsole.conf > /dev/null
log "Setting timezone (Europe/Dublin)"
sudo ln -sf /usr/share/zoneinfo/Europe/Dublin /etc/localtime
sudo hwclock --systohc
log "Setting hostname"
read -rp " Enter hostname [dylanvm]: " HOSTNAME
HOSTNAME="${HOSTNAME:-dylanvm}"
echo "$HOSTNAME" | sudo tee /etc/hostname > /dev/null
sudo tee /etc/hosts > /dev/null <<EOF
127.0.0.1 localhost
::1 localhost
127.0.1.1 $HOSTNAME.localdomain $HOSTNAME
EOF
# =============================================================================
# 2. NETWORKING
# =============================================================================
log "Enabling NetworkManager"
sudo systemctl enable --now NetworkManager
# =============================================================================
# 3. PACMAN SETUP
# =============================================================================
log "Configuring pacman (colour + parallel downloads)"
sudo sed -i 's/^#Color/Color/' /etc/pacman.conf
sudo sed -i 's/^#ParallelDownloads.*/ParallelDownloads = 5/' /etc/pacman.conf
log "Enabling multilib repo"
sudo sed -i '/\[multilib\]/,/Include/s/^#//' /etc/pacman.conf
log "Updating mirrors and syncing package database"
sudo pacman -Sy --noconfirm reflector 2>/dev/null || true
sudo reflector --country Ireland,Germany --age 12 --protocol https \
--sort rate --save /etc/pacman.d/mirrorlist 2>/dev/null \
|| warn "reflector failed, using existing mirrorlist"
sudo pacman -Syyu --noconfirm
# =============================================================================
# 4. PACMAN PACKAGES
# =============================================================================
log "Installing pacman packages"
for file in "$PKG_DIR"/pacman/*.txt; do
log " → $(basename "$file")"
while IFS= read -r pkg; do
[[ -z "$pkg" || "$pkg" == \#* ]] && continue
sudo pacman -S --needed --noconfirm "$pkg" \
|| warn " Skipping pacman package not found: $pkg"
done < "$file"
done
# =============================================================================
# 5. ZSH AS DEFAULT SHELL
# =============================================================================
log "Setting zsh as default shell"
chsh -s /bin/zsh
# =============================================================================
# 6. YAY (AUR HELPER)
# =============================================================================
log "Installing yay"
if ! command -v yay &>/dev/null; then
tmpdir=$(mktemp -d)
git clone https://aur.archlinux.org/yay.git "$tmpdir/yay"
pushd "$tmpdir/yay" > /dev/null
makepkg -si --noconfirm
popd > /dev/null
rm -rf "$tmpdir"
else
log " yay already installed, skipping"
fi
# =============================================================================
# 7. AUR PACKAGES
# =============================================================================
log "Installing AUR packages"
for file in "$PKG_DIR"/aur/*.txt; do
log " → $(basename "$file")"
while IFS= read -r pkg; do
[[ -z "$pkg" || "$pkg" == \#* ]] && continue
yay -S --needed --noconfirm "$pkg" \
|| warn " Skipping AUR package not found: $pkg"
done < "$file"
done
# =============================================================================
# 8. POWERLEVEL10K
# =============================================================================
log "Installing Powerlevel10k"
if [[ ! -d "$HOME/powerlevel10k" ]]; then
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git \
"$HOME/powerlevel10k"
else
log " powerlevel10k already present, skipping"
fi
# =============================================================================
# 9. DOTFILES
# =============================================================================
log "Deploying dotfiles from repo into HOME"
# Copy everything except git internals, system/, packages/, bootstrap.sh
rsync -av --exclude='.git' \
--exclude='system/' \
--exclude='packages/' \
--exclude='bootstrap.sh' \
--exclude='README.md' \
--exclude='dotfiles_log.txt' \
"$REPO_ROOT/" "$HOME/"
# Make scripts executable
find "$HOME/.config" -name "*.sh" -exec chmod +x {} \;
# =============================================================================
# 10. SYSTEM CONFIG FILES (SDDM etc.)
# =============================================================================
log "Applying SDDM configuration"
sudo mkdir -p /etc/sddm.conf.d
sudo cp -a "$REPO_ROOT/system/sddm.conf.d/." /etc/sddm.conf.d/
sudo cp -a "$REPO_ROOT/system/sddm/." /etc/sddm/
sudo chown -R root:root /etc/sddm.conf.d /etc/sddm
sudo chmod 644 /etc/sddm.conf.d/*.conf
sudo chmod +x /etc/sddm/scripts/Xsetup 2>/dev/null || true
log "Enabling SDDM"
sudo systemctl enable sddm
# =============================================================================
# 11. SERVICES
# =============================================================================
log "Enabling system services"
sudo systemctl enable bluetooth
sudo systemctl enable docker
sudo usermod -aG docker "$USER"
sudo systemctl enable earlyoom 2>/dev/null || true
# =============================================================================
# 12. MONITOR CONFIG (machine-specific)
# =============================================================================
MONITORS_CONF="$HOME/.config/hypr/monitors.conf"
if [[ ! -f "$MONITORS_CONF" ]]; then
warn "No monitors.conf found — creating a safe default (single monitor)"
cat > "$MONITORS_CONF" <<'EOF'
# Auto-generated default — replace with your actual monitor config.
# See: https://wiki.hyprland.org/Configuring/Monitors/
monitor = , preferred, auto, 1
EOF
warn "Edit ~/.config/hypr/monitors.conf before starting Hyprland."
else
log "monitors.conf already exists, skipping"
fi
# =============================================================================
# 13. VSCODE EXTENSIONS
# =============================================================================
EXTENSIONS_FILE="$HOME/.config/Code/User/extensions.txt"
if command -v code &>/dev/null && [[ -f "$EXTENSIONS_FILE" ]]; then
log "Installing VS Code extensions"
while IFS= read -r ext; do
code --install-extension "$ext" --force 2>/dev/null || true
done < "$EXTENSIONS_FILE"
else
warn "VS Code not found or extensions.txt missing — skipping"
fi
# =============================================================================
# 14. WALLPAPER DIRECTORY
# =============================================================================
log "Creating wallpaper directory"
mkdir -p "$HOME/.wallpapers"
warn "Add wallpapers to ~/.wallpapers/ for hyprpaper + wofi selector to work."
# =============================================================================
# DONE
# =============================================================================
echo ""
echo -e "${GREEN}============================================${NC}"
echo -e "${GREEN} Bootstrap complete!${NC}"
echo -e "${GREEN}============================================${NC}"
echo ""
echo " Next steps:"
echo " 1. Edit ~/.config/hypr/monitors.conf for your display layout"
echo " 2. Add wallpapers to ~/.wallpapers/"
echo " 3. Run p10k configure after first zsh launch"
echo " 4. Reboot"
echo ""

21
common-issues.md Normal file
View File

@@ -0,0 +1,21 @@
# Creating a new user
1) Login to root account
2) Type `useradd -m -G wheel -s /bin/bash <NAME>`
3) Install `sudo` and `nvim`
4) Type `EDITOR=nvim visudo`
5) Uncomment the line `# %wheel ALL=(ALL:ALL) ALL`
- Towards the end of the file
# Broken Internet Access on VM
- This works for a VM with `enp1s0` link.
```
ip addr add 192.168.122.100/24 dev enp1s0
ip route add default via 192.168.122.1
echo "nameserver 8.8.8.8" > /etc/resolv.conf
ping 8.8.8.8
```
- Then install dhcpcd
```
pacman -S dhcpcd
systemctl enable --now dhcpcd@enp1s0
```

3
packages/aur/apps.txt Normal file
View File

@@ -0,0 +1,3 @@
brave-bin
play-timer
spotify

2
packages/aur/desktop.txt Normal file
View File

@@ -0,0 +1,2 @@
sddm-sugar-candy-git
wlogout

4
packages/aur/dev.txt Normal file
View File

@@ -0,0 +1,4 @@
visual-studio-code-bin
intellij-idea-ultimate-edition
bruno
jre-openjdk

1
packages/aur/fonts.txt Normal file
View File

@@ -0,0 +1 @@
apple-fonts

7
packages/pacman/apps.txt Normal file
View File

@@ -0,0 +1,7 @@
discord
obsidian
anki
libreoffice-fresh
file-roller
kate
nextcloud-client

22
packages/pacman/base.txt Normal file
View File

@@ -0,0 +1,22 @@
base
base-devel
linux
linux-firmware
amd-ucode
grub
efibootmgr
os-prober
sudo
networkmanager
openssh
fuse3
man-db
bash-completion
pacman-contrib
curl
wget
less
unzip
zip
zsh
zsh-syntax-highlighting

View File

@@ -0,0 +1,43 @@
hyprland
hyprpaper
waybar
wofi
mako
kitty
thunar
thunar-archive-plugin
tumbler
wl-clipboard
slurp
grim
swappy
brightnessctl
pavucontrol
pipewire-alsa
pipewire-jack
pipewire-pulse
wireplumber
xdg-desktop-portal-hyprland
qt5ct
qt6ct
qt6-wayland
adw-gtk-theme
breeze
lxappearance
kvantum-qt5
sddm
libva-nvidia-driver
nvidia-open
nvidia-settings
nvidia-utils
lib32-nvidia-utils
sof-firmware
alsa-utils
blueman
bluez
bluez-utils
geoclue
imagemagick
webkit2gtk
xorg-xrandr
earlyoom

30
packages/pacman/dev.txt Normal file
View File

@@ -0,0 +1,30 @@
git
git-lfs
neovim
tmux
fzf
btop
ranger
gdb
lldb
ccache
rust
python
python-pip
python-pipx
python-pydbus
python-virtualenv
npm
jdk21-openjdk
maven
openmpi
docker
docker-compose
postgresql
postgresql-libs
nmap
ncdu
ufw
sshfs
nvidia-container-toolkit
rsync

10
packages/pacman/fonts.txt Normal file
View File

@@ -0,0 +1,10 @@
inter-font
ttf-0xproto-nerd
ttf-jetbrains-mono-nerd
ttf-noto-nerd
woff2-font-awesome
noto-fonts
noto-fonts-emoji
noto-fonts-cjk
ttf-dejavu
ttf-liberation

View File

@@ -0,0 +1,2 @@
steam
prismlauncher

View File

@@ -0,0 +1,8 @@
vlc
vlc-plugin-ffmpeg
vlc-plugin-x264
obs-studio
gpu-screen-recorder
gpu-screen-recorder-ui
wf-recorder
yt-dlp

View File

@@ -0,0 +1,4 @@
[XDisplay]
# Xsetup script path
# A script to execute when starting the display server
DisplayCommand=/etc/sddm/scripts/Xsetup

2
system/sddm.conf.d/theme.conf Executable file
View File

@@ -0,0 +1,2 @@
[Theme]
Current=sugar-candy

5
system/sddm/scripts/Xsetup Executable file
View File

@@ -0,0 +1,5 @@
#!/bin/sh
xrandr \
--output DP-0 --mode 1920x1080 --pos 0x0 --rate 144 \
--output DP-4 --mode 1920x1080 --pos 1920x0 --rate 270 --primary