Symlink .ssh/config into ~/.ssh with proper directory permissions.
Guard .gitignore so only the client config is trackable — keys and
anything else under .ssh/ can never be committed. Also drop a
redundant tmux ignore rule.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
All user-tunable knobs now live in one block at the top of .zshrc:
KANAGAWA_THEME, WEZTERM_FONT_SIZE, WEZTERM_WINDOW_OPACITY,
WEZTERM_TEXT_OPACITY.
GUI-launched WezTerm never inherits shell exports (which is why
WEZTERM_THEME silently did nothing on desktop launches). Reuse the
existing tmux current-theme.conf pattern: .zshrc writes the values to
~/.config/wezterm/env.lua (only when they change), and wezterm.lua
dofile()s it and registers it in the config reload watch list — so
editing .zshrc and opening a new shell restyles the running window.
Precedence in wezterm.lua: env.lua > process env > defaults.
env.lua is gitignored (machine-local, generated).
vim-tmux-navigator captures plain Ctrl+l for right-pane navigation, which
shadows the shell's clear-screen, and prefix + l is already bound to
resize-pane. Add the navigator's documented passthrough so
Ctrl+Space, Ctrl+l clears the terminal.
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.
We strip chromium from the package list, but Omarchy's install/config/theme.sh
unconditionally:
- mkdir -p /etc/chromium/policies/managed (harmless, pointless without it)
- tee /usr/lib/chromium/initial_preferences (fails: directory missing)
Both are sed-out during the package-patch step so the install log no longer
shows the scary 'No such file or directory' from tee. The original failure
was already non-fatal (theme.sh doesn't use set -e and the tee was the last
command) but the noise is misleading.
Mirrors what upstream boot.sh does before sourcing install.sh: writes
/etc/pacman.d/mirrorlist to the Omarchy mirror and exports
OMARCHY_ONLINE_INSTALL=true + OMARCHY_MIRROR. Without this,
install/preflight/pacman.sh is a no-op, the omarchy pacman repo is never
configured, and packages from it (yay, ufw-docker, xdg-terminal-exec,
yaru-icon-theme, omarchy-walker, etc.) fail with 'target not found'.
Also adds preflight checks for root/x86_64 (matching Omarchy's guard.sh)
and documents the real hard requirements: vanilla Arch, btrfs root,
Limine bootloader, Secure Boot disabled, non-root user, no GNOME/KDE.
Adds omarchy/ - a layered installer that patches Omarchy's package list,
runs its installer, then applies an upgrade-safe customization layer:
- Remove packages: try (tobi-try), lazydocker, cliamp, obsidian, pinta,
signal-desktop, obs-studio, kdenlive, 1password, spotify, typora,
libreoffice-fresh, chromium
- Clear all default web app (PWA) wrappers; drop Lazydocker TUI entry
- Install Brave Origin Beta as default browser (replaces Chromium)
- Install WezTerm as default terminal, following the active Omarchy theme
via colors.toml with a Kanagawa Wave fallback + theme-set reload hook
- Menu overrides: trim Setup (System Sleep/DNS/Security) and Install
(Web App/TUI/Service/Development/Editor/Terminal/Browser/AI/Gaming/Windows)
- Symlink dotfiles + install deps (zsh, plugins, tpm, nvm)
wezterm.lua now reads the Omarchy theme palette instead of a hardcoded one.
All scripts are shellcheck-clean; Lua validated with luac.