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.
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
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.
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.
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).
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.
- 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
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.
- 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.
- 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)
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/.
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.