Commit graph

18 commits

Author SHA1 Message Date
Brian Pooe
db49fc1a56 feat: harden dotfiles installer and add automated validation 2026-06-11 20:38:19 +02:00
Brian Pooe
394a9af367 fix: align setup with Pop!_OS toolchain 2026-06-11 18:37:16 +02:00
Claude
d7bb34e1ef
fix(install): install JetBrainsMono Nerd Font
The configs (wezterm.lua font, starship symbols, eza icons) assume
'JetBrainsMono Nerd Font', which was an Arch package in the old setup.
Ubuntu's fonts-jetbrains-mono is the plain family without Nerd glyphs,
so WezTerm fell back to a default font and warned on every launch.

lib/fonts.sh downloads the official nerd-fonts release tarball into
~/.local/share/fonts/JetBrainsMonoNerdFont and runs fc-cache. Skips if
fc-list already reports the family. fontconfig added to the apt base
list for fc-list/fc-cache.
2026-06-11 15:27:38 +00:00
Claude
9f3e6ba049
fix(install): use Brave Beta's own keyring (not the stable one)
Brave's Beta channel is signed with its own key (C3DE1DD4F661CDCB).
The previous attempt to share the stable keyring failed at apt update
with NO_PUBKEY because the release bucket's keyring only contains the
stable channel's key.

The correct URL is the beta bucket itself with the channel-specific
filename: brave-browser-apt-beta.s3.brave.com/brave-browser-beta-archive-keyring.gpg
2026-06-11 15:22:14 +00:00
Claude
ac38ceccbc
fix(install): correct Brave Beta keyring URL + make add_apt_repo robust
Brave consolidated their per-channel keyrings; all channels now share the
keyring at https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg
The repo URL itself stays at apt-beta.s3.brave.com for the Beta channel.

add_apt_repo now downloads the key to a temp file first, validates it's
non-empty, dearmors with a binary-key fallback, then atomically installs
both the keyring and the sources.list entry. A failed fetch no longer
leaves an empty keyring or half-written list file behind.
2026-06-11 15:19:49 +00:00
Claude
096c3c8afa
feat(install): switch to Homebrew for the CLI toolchain
Ubuntu 24.04's apt versions of fzf/fd/bat/eza/zoxide/ripgrep/tmux/nvim/
lazygit/starship are frozen at April 2024 — and the previous GitHub-
release downloads went stale the moment you stopped re-running the
installer. Homebrew on Linux fixes both: always-latest releases and a
single 'brew upgrade' to update the whole CLI stack.

Two-tier install:
  apt   - zsh + base plumbing + WezTerm (vendor repo) + Brave Beta
          (vendor repo). Vendor repos auto-update via 'apt upgrade'.
  brew  - fzf fd bat eza zoxide ripgrep tmux neovim lazygit starship
          gh zsh-syntax-highlighting zsh-autosuggestions
  nvm   - official installer (pinned NVM_VERSION)
  tpm   - tmux plugin manager clone

New files:
  install/Brewfile - bundle for 'brew bundle'
  install/lib/brew.sh - Homebrew bootstrap + brew bundle
  install/lib/extras.sh - nvm + tpm
  install/install.sh - rewired entry point with --packages-only,
    --dotfiles-only, --help
  install/README.md - new docs for the two-tier strategy

.zshrc:
  - Source brew shellenv first when present, so brew bins win on PATH
  - 'update' alias now: brew upgrade && sudo apt update && sudo apt upgrade
    (previously apt-only; before that pacman-only)

Drops install/lib/packages.sh entries that the now-Brewfile-managed tools
duplicated, and removes the GitHub-release tarball install path.
2026-06-10 16:54:47 +00:00
Claude
d1a289d6ce
feat: pivot installer from Arch+Hyprland to Pop!_OS / Debian apt
User switched from Arch to Pop!_OS 24.04 (Cosmic DE). The previous install/
directory was an Arch+Hyprland desktop scaffold (pacman, yay, Hyprland,
hyprlock, waybar, rofi, swaync, swww, hypridle, swayosd, GTK theming,
wallpapers, etc.) — none of that applies on Pop!_OS where Cosmic provides
the desktop. Wiped the whole tree.

New install/ is a small apt-based tool installer for these dotfiles:

  install.sh           entry: full / --packages-only / --dotfiles-only
  lib/common.sh        helpers (apt_install, apt_update_once, signed repo
                       adder, backup_and_link)
  lib/packages.sh      apt packages + third-party apt repos
  lib/extras.sh        GitHub-release binaries + nvm + tpm
  lib/dotfiles.sh      symlinks + chsh zsh

What it installs:
- apt: zsh + plugins, tmux, fzf, fd-find, bat, eza, zoxide, ripgrep, git,
  curl, build-essential, wl-clipboard
- Signed third-party apt repos: WezTerm (apt.fury.io/wez),
  Brave Beta (brave.com), GitHub CLI (cli.github.com)
- GitHub releases (apt versions too old / absent): Neovim, Lazygit, Starship
- Per-user: nvm, tpm
- Compat shims: /usr/local/bin/fd -> fdfind, /usr/local/bin/bat -> batcat
  so the dotfiles' env vars (FZF_DEFAULT_COMMAND='fd ...') resolve

.zshrc updated for Debian:
- zsh-syntax-highlighting and zsh-autosuggestions now try the
  /usr/share/<name>/<name>.zsh Debian path first, fall back to the Arch
  /usr/share/zsh/plugins/<name>/<name>.zsh path
- fzf bindings/completion fall back: /usr/share/doc/fzf/examples/* first
  (apt), then /usr/share/fzf/* (Arch)
- 'update' alias: pacman -Syu -> sudo apt update && sudo apt upgrade -y

README updated to reflect the Pop!_OS target.
2026-06-10 16:33:47 +00:00
Claude
b6d422c774
feat(install): auto-detect VirtualBox and apply guest fixes
Adds lib/vbox.sh that runs systemd-detect-virt and, on VirtualBox guests:
  - installs virtualbox-guest-utils + enables vboxservice
  - links files/hypr/vbox.conf into ~/.config/hypr/ which sets
    WLR_NO_HARDWARE_CURSORS=1, WLR_RENDERER_ALLOW_SOFTWARE=1,
    LIBGL_ALWAYS_SOFTWARE=1 and overrides the monitor rule to
    preferred mode (3440x1440@120 doesn't exist in VBox)

On bare metal an empty stub is linked instead, so the source= line in
hyprland.conf always resolves.

README adds a 'Testing in VirtualBox first' section listing the host-side
VBox settings (3D Acceleration on, 128MB video mem, VMSVGA, 8GB RAM, 40GB
disk) and the known-broken pieces (bluetooth, gpu-screen-recorder).
2026-06-09 16:03:06 +00:00
Claude
3ca8c72a27
fix(hypr): drop swayosd capslock binding (caps is swapped to esc)
input.conf already sets kb_options = caps:swapescape, so the physical
Caps key sends Escape and Caps Lock state is effectively gone. The
swayosd capslock OSD never fires under this swap; removing the dead
binding to keep keybinds.conf truthful.
2026-06-09 15:56:27 +00:00
Claude
115c606e3b
feat(install): add 12 standard Hyprland community tools
Packages added:
  pacman: swww swaync cliphist satty gpu-screen-recorder xdg-user-dirs
          udiskie gnome-keyring libsecret nwg-look qt6ct kvantum-qt{5,6}
          gnome-themes-extra adwaita-icon-theme adwaita-cursors
  AUR:    swayosd-git bibata-cursor-theme-bin

Configs added:
  hypr/hypridle.conf - 2m dim, 5m lock, 10m screen-off, 30m suspend
  hypr/env.conf - cursor + GTK theme env (Bibata, Adwaita-dark)
  swaync/config.json + style.css - Kanagawa notification center
  gtk-3.0/settings.ini + gtk-4.0/settings.ini - Adwaita-dark + Bibata

Swaps:
  mako -> swaync (notifications + center panel)
  hyprpaper -> swww (animated transitions, same bundled image)

New keybinds:
  Super+Shift+V        cliphist clipboard history via rofi
  Super+N              toggle swaync notification center
  Super+Shift+N        clear all notifications
  Super+Ctrl+R         start screen recording (focused monitor -> ~/Videos)
  Super+Ctrl+Shift+R   stop recording
  Print / Shift+Print  region/full screenshot -> satty -> ~/Pictures/screenshots
  Ctrl+Print           region screenshot -> clipboard only
  Volume/brightness keys now route through swayosd for on-screen feedback
  Caps Lock OSD via swayosd

Autostart additions: swww-daemon + initial swww img, swaync, swayosd-server,
cliphist text+image watchers, hypridle (with real config), udiskie --tray,
gnome-keyring-daemon.

Init:
  apply_desktop_settings() now sets gsettings (gtk-theme, color-scheme,
    cursor-theme, monospace font) and runs xdg-user-dirs-update
  services.sh enables swayosd-libinput-backend + user gnome-keyring-daemon
2026-06-09 15:50:58 +00:00
Claude
d9b2b709fe
feat(waybar): GNOME-style layout (workspaces | clock | stats+power)
- modules-left: workspaces only (drop window title; GNOME doesn't show it)
- modules-center: prominent clock pill with calendar tooltip styled in
  Kanagawa colors
- modules-right: stats grouped as a single chip ending in a power button,
  rounded only at the outer edges so they read as one unit
- per-module colors removed; right side uses neutral fg_dim, with accent
  reserved for the clock pill and warnings (battery low / network offline)
- workspaces: persistent 1-5, dot indicators, hover lifts to brighter bg
- clock: scroll = shift calendar month/year; right-click = mode toggle
- audio: right-click = mute; backlight: scroll = adjust
- power: clock-style accent, hover red, opens power-menu
2026-06-09 15:39:06 +00:00
Claude
0499624bc3
refactor(install): bundle wallpaper in repo, drop install-time download
The previous wallpaper.sh probed wallhaven URLs at install time and
generated hyprpaper.conf dynamically — fragile in low-connectivity
environments and adds a step that has nothing to do with config.

Simpler model:
- install/files/wallpapers/default.jpg — bundled wallpaper (binary in repo)
- install/files/hypr/hyprpaper.conf — static, points to ~/.config/hypr/wallpapers/default.jpg
- install/files/bin/fetch-wallpaper — one-shot helper to populate the bundled
  image from a URL (default: wallhaven.cc/w/2133ly). Run once, git add+commit,
  every subsequent install gets the wallpaper offline.
- lib/hyprland.sh: symlinks both files; warns if the bundled image is missing
- lib/wallpaper.sh: removed

Note: this sandbox cannot reach wallhaven (host_not_allowed), so I cannot
include the actual JPG in this commit. Run fetch-wallpaper on your Arch box
then commit install/files/wallpapers/default.jpg.
2026-06-09 15:36:16 +00:00
Claude
bffb3e11e4
fix(install): split local declaration in wallpaper.sh (SC2155) 2026-06-09 15:33:03 +00:00
Claude
0e803e7366
feat(install): set wallhaven 2133ly as default wallpaper
- lib/wallpaper.sh: downloads the default wallpaper at install time
  (tries .jpg then .png against the wallhaven CDN path) into
  ~/.config/hypr/wallpapers/default.<ext> and writes hyprpaper.conf
  pointing at it
- Override the source with WALLPAPER_URL=<direct-image-url> or just the
  URL stem with WALLPAPER_URL_BASE
- Existing hyprpaper.conf is backed up to .pre-install.<timestamp>
  unless it's already ours (marker comment)
- files/hypr/autostart.conf: exec-once = hyprpaper
- install.sh: wire setup_wallpaper into do_dotfiles_and_config

Tried to fetch from this sandbox to verify the extension but wallhaven
blocks datacenter IPs (403); the installer probes .jpg first then .png
when it actually runs on a residential network.
2026-06-09 15:32:47 +00:00
Claude
6577def1b5
feat(install): add hyprlock, mako, and a rofi power menu
- files/hypr/hyprlock.conf: blurred-screenshot lock with Kanagawa clock,
  date, user label, and rounded password input (green/red on success/fail)
- files/mako/config: Kanagawa Wave notifications, JetBrainsMono Nerd Font,
  per-urgency border colors, critical stays until dismissed
- files/bin/power-menu: rofi-driven Lock/Suspend/Logout/Reboot/Shutdown,
  bound to Super+Shift+E and the Waybar power button
- lib/hyprland.sh: link the three new pieces (hyprlock.conf, mako/config,
  ~/.local/bin/power-menu)
2026-06-09 15:24:32 +00:00
Claude
15e70e539d
feat(install): swap wofi for rofi-wayland with Kanagawa theme
- packages: wofi -> rofi-wayland
- install/files/rofi/config.rasi: modes drun/run/window/ssh, fzf sort,
  fuzzy match, icons enabled, wezterm as terminal
- install/files/rofi/kanagawa.rasi: Kanagawa Wave palette,
  JetBrainsMono Nerd Font, rounded chips, blue accent
- hypr/keybinds.conf: $menu -> rofi -show drun;
  add Super+Tab -> rofi -show window
- waybar power button now opens rofi
- README: docs updated for the swap
2026-06-09 11:12:55 +00:00
Claude
c2445ce7b3
feat(install): add Kanagawa-themed Waybar config
Drops a real waybar config + style instead of letting it fall back to the
package default. Modules: workspaces (hyprland), window title, clock, tray,
network, pulseaudio, backlight, battery, power button. Style uses the
Kanagawa Wave palette and JetBrainsMono Nerd Font to match the rest of the
stack. Symlinked from install/files/waybar/ to ~/.config/waybar/.
2026-06-09 11:10:20 +00:00
Claude
ec6be909c5
feat: replace Omarchy layer with plain Arch + Hyprland installer
Drops the omarchy/ directory and adds install/ - a direct Arch + Hyprland
installer oriented around these dotfiles, no framework on top:

- install/install.sh: entry point with --packages-only / --dotfiles-only
- install/lib/{common,packages,dotfiles,hyprland,services}.sh: modules
- install/files/hypr/: starter Hyprland config (monitors, env, input,
  keybinds, autostart, top-level) - symlinked to ~/.config/hypr/
- Pacman packages: full Hyprland desktop + dotfile dependencies
- AUR: bootstraps yay, installs brave-beta-bin
- Symlinks all dotfiles, installs tpm + nvm, switches login shell to zsh
- Enables sddm, NetworkManager, bluetooth, pipewire user stack

No btrfs / Limine / Secure Boot constraints (unlike Omarchy). 3440x1440@120
monitor + JetBrainsMono Nerd Font preserved. Hyprland border colors use the
Kanagawa Wave palette to match the rest of the stack.

wezterm.lua restored to standalone Kanagawa wave/dragon switching via
$WEZTERM_THEME, since there's no Omarchy theme source anymore.

All shell scripts shellcheck-clean; wezterm.lua passes luac.
2026-06-09 11:06:43 +00:00