Compare commits
31 Commits
1ba46fb540
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 3ec778781d | |||
| 30425fa1e4 | |||
| b55b45f25e | |||
| 6bb29b7539 | |||
| 3481125919 | |||
| 798ecf40a2 | |||
| eabcc3de6b | |||
| bf9d570ff3 | |||
| 2c3c58e92d | |||
| bc2c508969 | |||
| 8b12bc3a3b | |||
| e628456780 | |||
| 3c463300b5 | |||
| 984027efcb | |||
| 1c12506728 | |||
| 568a81a94d | |||
| 9ee3da3100 | |||
| fab1c53cb3 | |||
| f29cf5e920 | |||
| 3ef8420a21 | |||
| 7805b3c98d | |||
| ccb5b1ab96 | |||
| c65c286606 | |||
| 34ce514c75 | |||
| 6e6376eee9 | |||
| d3617c3866 | |||
| 378cc51cc3 | |||
| 1bd5bebcda | |||
| d96970bc8d | |||
| 4bf3764855 | |||
| af00cb8735 |
@@ -3,5 +3,6 @@
|
||||
"python.defaultInterpreterPath": "/sbin/python3.14",
|
||||
"git.autofetch": true,
|
||||
"explorer.confirmDelete": false,
|
||||
"git.confirmSync": false
|
||||
"git.confirmSync": false,
|
||||
"editor.fontSize": 12
|
||||
}
|
||||
@@ -54,11 +54,11 @@ animations {
|
||||
animation = windowsOut, 1, 4, breeze, slidefade
|
||||
|
||||
# Workspaces: airy glide, finishes fast
|
||||
animation = workspaces, 1, 5, overshoot, slidefade
|
||||
animation = workspaces, 1, 4, overshoot, slidefade
|
||||
|
||||
# Subtle polish
|
||||
animation = fade, 1, 4, breeze
|
||||
animation = windowsMove, 1, 3, breeze
|
||||
animation = windowsMove, 1, 1, breeze
|
||||
animation = border, 1, 3, breeze
|
||||
}
|
||||
|
||||
|
||||
5
.config/hypr/hypridle.conf
Normal file
5
.config/hypr/hypridle.conf
Normal file
@@ -0,0 +1,5 @@
|
||||
general {
|
||||
lock_cmd = pidof hyprlock || hyprlock
|
||||
before_sleep_cmd = loginctl lock-session
|
||||
}
|
||||
|
||||
@@ -9,10 +9,15 @@ $browser = brave
|
||||
exec-once = /usr/lib/xdg-desktop-portal-hyprland &
|
||||
exec-once = /usr/lib/xdg-desktop-portal &
|
||||
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 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 ###
|
||||
@@ -25,9 +30,9 @@ env = __GLX_VENDOR_LIBRARY_NAME,nvidia
|
||||
env = NVD_BACKEND,direct
|
||||
env = QT_QPA_PLATFORMTHEME,qt6ct # for Qt apps# Theme
|
||||
|
||||
exec-once = waybar
|
||||
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/keybinds.conf
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
splash = false
|
||||
preload = ~/.wallpapers/liminal.png
|
||||
wallpaper = ,~/.wallpapers/liminal.png
|
||||
|
||||
@@ -7,20 +7,25 @@ input {
|
||||
|
||||
follow_mouse = 1
|
||||
accel_profile = flat
|
||||
force_no_accel=2
|
||||
|
||||
sensitivity = 1
|
||||
sensitivity = 0.75
|
||||
|
||||
touchpad {
|
||||
natural_scroll = true
|
||||
scroll_factor = 0.2
|
||||
scroll_factor = 0.45
|
||||
}
|
||||
}
|
||||
|
||||
device {
|
||||
name = logitech-usb-receiver
|
||||
name = logitech-pro-x-1
|
||||
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
|
||||
|
||||
@@ -47,16 +47,18 @@ bindel = $mainMod, L, exec, brightnessctl -e4 -n2 set 5%+
|
||||
bindel = $mainMod, K, exec, brightnessctl -e4 -n2 set 5%-
|
||||
|
||||
# Volume
|
||||
bindl = , F4, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
|
||||
bindl = , F5, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
|
||||
bindl = , F6, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
|
||||
bindl = , F7, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
|
||||
bindl = , F6, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
|
||||
bindl = , F7, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
|
||||
bindl = , F8, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
|
||||
bindl = , F9, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
|
||||
|
||||
# Playback (requires playerctl)
|
||||
bindl = , F2, exec, playerctl previous
|
||||
bindl = , F1, exec, playerctl play-pause
|
||||
bindl = , F3, exec, playerctl next
|
||||
bindl = , F3, exec, playerctl previous
|
||||
bindl = , F4, exec, playerctl play-pause
|
||||
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, right, swapwindow, r
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
"modules-right": [
|
||||
"tray",
|
||||
"pulseaudio",
|
||||
"bluetooth",
|
||||
"custom/micmute",
|
||||
"battery",
|
||||
"custom/power"
|
||||
@@ -62,6 +63,16 @@
|
||||
"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": {
|
||||
"interval":2,
|
||||
"states": {
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
}
|
||||
{
|
||||
"label" : "logout",
|
||||
"action" : "loginctl terminate-user $USER",
|
||||
"action" : "hyprctl dispatch exit",
|
||||
"text" : "Logout",
|
||||
"keybind" : "e"
|
||||
}
|
||||
|
||||
@@ -1,3 +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
|
||||
|
||||
235
bootstrap.sh
Executable file → Normal file
235
bootstrap.sh
Executable file → Normal file
@@ -1,8 +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.
|
||||
# =============================================================================
|
||||
|
||||
## 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 cp -a system/sddm.conf.d /etc/
|
||||
sudo cp -a system/sddm /etc/
|
||||
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 -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
21
common-issues.md
Normal 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
|
||||
```
|
||||
@@ -1,5 +1,3 @@
|
||||
brave-bin
|
||||
play-timer
|
||||
spotify
|
||||
zoom
|
||||
qdirstat
|
||||
|
||||
@@ -18,7 +18,6 @@ pipewire-jack
|
||||
pipewire-pulse
|
||||
wireplumber
|
||||
xdg-desktop-portal-hyprland
|
||||
xdg-desktop-portal-wlr
|
||||
qt5ct
|
||||
qt6ct
|
||||
qt6-wayland
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
git
|
||||
git-lfs
|
||||
neovim
|
||||
tmux
|
||||
fzf
|
||||
@@ -18,12 +19,12 @@ jdk21-openjdk
|
||||
maven
|
||||
openmpi
|
||||
docker
|
||||
docker-compose-plugin
|
||||
docker-compose
|
||||
postgresql
|
||||
postgresql-libs
|
||||
libdwarf
|
||||
nmap
|
||||
ncdu
|
||||
ufw
|
||||
sshfs
|
||||
nvidia-container-toolkit
|
||||
rsync
|
||||
|
||||
@@ -5,3 +5,4 @@ obs-studio
|
||||
gpu-screen-recorder
|
||||
gpu-screen-recorder-ui
|
||||
wf-recorder
|
||||
yt-dlp
|
||||
|
||||
Reference in New Issue
Block a user