Compare commits

...

44 Commits

Author SHA1 Message Date
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
28 changed files with 650 additions and 151 deletions

View File

@@ -0,0 +1,13 @@
github.copilot-chat
ms-azuretools.vscode-containers
ms-python.debugpy
ms-python.python
ms-python.vscode-pylance
ms-python.vscode-python-envs
ms-vscode-remote.remote-containers
ms-vscode.cmake-tools
ms-vscode.cpp-devtools
ms-vscode.cpptools
ms-vscode.cpptools-extension-pack
ms-vscode.cpptools-themes
tomoki1207.pdf

View File

@@ -0,0 +1,8 @@
{
"explorer.confirmDragAndDrop": false,
"python.defaultInterpreterPath": "/sbin/python3.14",
"git.autofetch": true,
"explorer.confirmDelete": false,
"git.confirmSync": false,
"editor.fontSize": 12
}

View File

@@ -54,11 +54,11 @@ animations {
animation = windowsOut, 1, 4, breeze, slidefade animation = windowsOut, 1, 4, breeze, slidefade
# Workspaces: airy glide, finishes fast # Workspaces: airy glide, finishes fast
animation = workspaces, 1, 1, overshoot, slidefade animation = workspaces, 1, 4, overshoot, slidefade
# Subtle polish # Subtle polish
animation = fade, 1, 4, breeze animation = fade, 1, 4, breeze
animation = windowsMove, 1, 3, breeze animation = windowsMove, 1, 1, breeze
animation = border, 1, 3, breeze animation = border, 1, 3, breeze
} }

View File

@@ -0,0 +1,5 @@
general {
lock_cmd = pidof hyprlock || hyprlock
before_sleep_cmd = loginctl lock-session
}

View File

@@ -9,10 +9,15 @@ $browser = brave
exec-once = /usr/lib/xdg-desktop-portal-hyprland & exec-once = /usr/lib/xdg-desktop-portal-hyprland &
exec-once = /usr/lib/xdg-desktop-portal & exec-once = /usr/lib/xdg-desktop-portal &
exec-once = hyprpaper exec-once = hyprpaper
exec-once = hypridle
exec = gsettings set org.gnome.desktop.interface color-scheme "prefer-dark" # for GTK4 apps 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 exec = gsettings set org.gnome.desktop.interface gtk-theme "adw-gtk3-dark" # for GTK3 apps
misc:initial_workspace_tracking=1 misc {
force_default_wallpaper = 0
disable_hyprland_logo = true
initial_workspace_tracking = 1
}
############################# #############################
### ENVIRONMENT VARIABLES ### ### ENVIRONMENT VARIABLES ###
@@ -25,9 +30,9 @@ env = __GLX_VENDOR_LIBRARY_NAME,nvidia
env = NVD_BACKEND,direct env = NVD_BACKEND,direct
env = QT_QPA_PLATFORMTHEME,qt6ct # for Qt apps# Theme env = QT_QPA_PLATFORMTHEME,qt6ct # for Qt apps# Theme
exec-once = waybar
exec-once = nextcloud exec-once = nextcloud
exec-once = hyprctl setcursor Breeze 24 exec-once = waybar
exec-once = hyprctl setcursor breeze 24
source = ~/.config/hypr/input.conf source = ~/.config/hypr/input.conf
source = ~/.config/hypr/keybinds.conf source = ~/.config/hypr/keybinds.conf

View File

@@ -1 +1,3 @@
splash = false splash = false
preload = ~/.wallpapers/liminal.png
wallpaper = ,~/.wallpapers/liminal.png

View File

@@ -7,20 +7,25 @@ input {
follow_mouse = 1 follow_mouse = 1
accel_profile = flat accel_profile = flat
force_no_accel=2
sensitivity = 1 sensitivity = 0.75
touchpad { touchpad {
natural_scroll = true natural_scroll = true
scroll_factor = 0.2 scroll_factor = 0.45
} }
} }
device { device {
name = logitech-usb-receiver name = logitech-pro-x-1
sensitivity = 0 sensitivity = 0
} }
gesture = 3, horizontal, workspace gestures {
workspace_swipe_cancel_ratio = 0
workspace_swipe_min_speed_to_force = 10
}
gesture = 3, horizontal, scale: 0.1, workspace
gesture = 3, down, fullscreen gesture = 3, down, fullscreen

View File

@@ -47,16 +47,18 @@ bindel = $mainMod, L, exec, brightnessctl -e4 -n2 set 5%+
bindel = $mainMod, K, exec, brightnessctl -e4 -n2 set 5%- bindel = $mainMod, K, exec, brightnessctl -e4 -n2 set 5%-
# Volume # Volume
bindl = , F4, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- bindl = , F6, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
bindl = , F5, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+ bindl = , F7, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
bindl = , F6, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle bindl = , F8, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
bindl = , F7, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle bindl = , F9, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
# Playback (requires playerctl) # Playback (requires playerctl)
bindl = , F2, exec, playerctl previous bindl = , F3, exec, playerctl previous
bindl = , F1, exec, playerctl play-pause bindl = , F4, exec, playerctl play-pause
bindl = , F3, exec, playerctl next bindl = , F5, exec, playerctl next
bindl = , switch:on:Lid Switch, exec, hyprctl dispatch dpms off
bindl = , switch:off:Lid Switch, exec, hyprctl dispatch dpms on
bind = SUPER CTRL, left, swapwindow, l bind = SUPER CTRL, left, swapwindow, l
bind = SUPER CTRL, right, swapwindow, r bind = SUPER CTRL, right, swapwindow, r

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,148 +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: 7px; }
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 {
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;
}
#custom-power {
margin-right: 11px;
} }
/* ── Battery ──────────────────────────────────────────────── */
#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 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

@@ -1,3 +1,10 @@
[user] [user]
email = dylanseandefaoite@gmail.com email = dylanseandefaoite@gmail.com
name = Dylan De Faoite 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

View File

@@ -3,4 +3,11 @@
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 # Packages
- Used `pacman -Qqen > packages.txt` to get all explicit 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 Executable file → Normal file
View File

@@ -1,8 +1,235 @@
#!/usr/bin/env bash #!/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.
# =============================================================================
## SDDM Confs 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 mkdir -p /etc/sddm.conf.d
sudo cp -a system/sddm.conf.d /etc/ sudo cp -a "$REPO_ROOT/system/sddm.conf.d/." /etc/sddm.conf.d/
sudo cp -a system/sddm /etc/ sudo cp -a "$REPO_ROOT/system/sddm/." /etc/sddm/
sudo chown -R root:root /etc/sddm.conf.d /etc/sddm sudo chown -R root:root /etc/sddm.conf.d /etc/sddm
sudo chmod -R 644 /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

View File

@@ -1,11 +1,7 @@
chromium
discord discord
obsidian obsidian
anki anki
libreoffice-fresh libreoffice-fresh
foliate
file-roller file-roller
kate kate
nextcloud-client nextcloud-client
cmatrix
quickshell

View File

@@ -1,8 +1,5 @@
hyprland hyprland
hyprpaper hyprpaper
hyprcursor
hyprlang
hyprutils
waybar waybar
wofi wofi
mako mako
@@ -19,26 +16,21 @@ pavucontrol
pipewire-alsa pipewire-alsa
pipewire-jack pipewire-jack
pipewire-pulse pipewire-pulse
wireplumber
xdg-desktop-portal-hyprland xdg-desktop-portal-hyprland
xdg-desktop-portal-wlr
qt5ct qt5ct
qt6ct qt6ct
qt6-wayland qt6-wayland
adw-gtk-theme adw-gtk-theme
breeze breeze
inter-font
ttf-0xproto-nerd
ttf-jetbrains-mono-nerd
ttf-noto-nerd
woff2-font-awesome
lxappearance lxappearance
kvantum-qt5 kvantum-qt5
sddm sddm
sddm-sugar-candy-git
libva-nvidia-driver libva-nvidia-driver
nvidia-open nvidia-open
nvidia-settings nvidia-settings
nvidia-utils nvidia-utils
lib32-nvidia-utils
sof-firmware sof-firmware
alsa-utils alsa-utils
blueman blueman

View File

@@ -1,6 +1,6 @@
git git
git-lfs
neovim neovim
vim
tmux tmux
fzf fzf
btop btop
@@ -13,6 +13,7 @@ python
python-pip python-pip
python-pipx python-pipx
python-pydbus python-pydbus
python-virtualenv
npm npm
jdk21-openjdk jdk21-openjdk
maven maven
@@ -21,9 +22,9 @@ docker
docker-compose docker-compose
postgresql postgresql
postgresql-libs postgresql-libs
libdwarf
nmap nmap
ncdu ncdu
ufw ufw
sshfs sshfs
nvidia-container-toolkit 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

@@ -5,3 +5,4 @@ obs-studio
gpu-screen-recorder gpu-screen-recorder
gpu-screen-recorder-ui gpu-screen-recorder-ui
wf-recorder wf-recorder
yt-dlp