Files
2026-09-14 15:31:20 -05:00

274 lines
9.4 KiB
Markdown

# arch-i3
A one-shot bootstrap for a complete i3 desktop on a **fresh Arch Linux install**
starting from a system with no X server at all.
Everything is themed with **Catppuccin Macchiato** and typeset in **Inconsolata Nerd Font**.
```
i3-wm · polybar · rofi · dunst · polkit-gnome · thunar · kitty
i3lock-color + betterlockscreen · feh · picom
```
---
## Quick start
From a TTY on a fresh install, as your **normal user** (not root — the scripts
call `sudo` where they need to):
```sh
sudo pacman -S --needed git
git clone <this-repo> ~/arch-i3
cd ~/arch-i3
./install.sh
```
Then log out, log back in (so the new group memberships apply) and:
```sh
startx
```
### Look before you leap
```sh
./install.sh --dry-run # print every action, change nothing
./install.sh --list # show the stages
```
---
## What the installer does
| Stage | Name | What happens |
|-------|------|--------------|
| `00` | preflight | Verifies Arch + network, enables pacman colour and parallel downloads, refreshes mirrors with `reflector`, runs a full `pacman -Syu` |
| `10` | packages | Installs everything in `packages/pacman.txt`; detects your GPU and adds the matching Vulkan/VA-API driver |
| `20` | aur | Builds `yay-bin`, swaps `i3lock``i3lock-color`, installs `packages/aur.txt` |
| `30` | dotfiles | Copies configs into `~`, helper scripts into `~/.local/bin`, generates wallpapers |
| `40` | services | Enables NetworkManager/bluetooth/pipewire, adds you to `video input audio storage`, rebuilds the font cache, primes the betterlockscreen cache |
| `50` | theme | Applies the GTK/Qt/cursor/icon theme and reloads a running session |
Run a subset with `--only` / `--skip`, by number or by name:
```sh
./install.sh --only dotfiles,theme
./install.sh --skip 00,10 # configs only, no package churn
./install.sh -y # never prompt
./install.sh --multilib # also enable the [multilib] repo
```
**Re-running is safe.** Package installs use `--needed`, and any config file the
installer would overwrite is first *moved* — never deleted — into
`~/.config-backup-<timestamp>/`.
```sh
scripts/restore-backup.sh --list # see what's been backed up
scripts/restore-backup.sh # put the most recent backup back
```
---
## Keybindings
`$mod` is the **Super** (Windows) key.
### Launching
| Keys | Action |
|------|--------|
| `$mod + Return` | kitty |
| `$mod + Shift + Return` | kitty, floating and centred |
| `$mod + e` | Thunar |
| `$mod + d` | rofi — application launcher |
| `$mod + Shift + d` | rofi — run a binary |
| `$mod + Tab` | rofi — window switcher |
| `$mod + Shift + e` | power menu (lock / logout / suspend / reboot / shutdown) |
| `$mod + q` | close window |
| `$mod + Shift + q` | `xkill` — click a window to kill it |
### Session
| Keys | Action |
|------|--------|
| `$mod + Shift + x` | lock the screen |
| `$mod + Shift + c` | reload the i3 config |
| `$mod + Shift + r` | restart i3 in place |
### Focus and movement
| Keys | Action |
|------|--------|
| `$mod + h/j/k/l` or arrows | move focus |
| `$mod + Shift + h/j/k/l` | move the window |
| `$mod + 1…0` | switch workspace |
| `$mod + Shift + 1…0` | send window to workspace |
| `Alt + Tab` | last workspace |
| `$mod + Ctrl + ←/→` | previous / next workspace |
| `$mod + Ctrl + Shift + ←/→` | move the workspace to another monitor |
### Layout
| Keys | Action |
|------|--------|
| `$mod + b` / `$mod + v` | split horizontally / vertically |
| `$mod + f` | fullscreen |
| `$mod + s` / `$mod + w` / `$mod + g` | stacking / tabbed / toggle split |
| `$mod + Shift + space` | float this window |
| `$mod + space` | focus tiling ↔ floating |
| `$mod + r` | resize mode (`h/j/k/l`, `Escape` to leave) |
| `$mod + minus` / `$mod + Shift + minus` | show / send to scratchpad |
| `$mod + plus` / `$mod + Shift + plus` | grow / shrink gaps |
### Hardware and utilities
| Keys | Action |
|------|--------|
| Volume / brightness / media keys | handled, with a dunst OSD |
| `Print` | full-screen screenshot |
| `Shift + Print` | select a region |
| `$mod + Print` | active window |
| `$mod + p` | display mode: `a`uto / `d`uplicate / `e`xtend / `l`aptop-only |
| `$mod + n` | pop the last notification back up |
| `$mod + Shift + n` | dismiss all notifications |
| `$mod + Ctrl + n` | pause/resume notifications |
| `$mod + Shift + w` | random wallpaper |
---
## Layout of this repo
```
install.sh orchestrator — stage runner, flags, summary
packages/
pacman.txt official repo packages
aur.txt AUR packages
scripts/
lib.sh logging, dry-run, backup-aware file installer
00-preflight.sh … 50-theme.sh
make-wallpaper.sh synthesises the Catppuccin wallpapers
restore-backup.sh undo
dotfiles/
xinitrc, xprofile, Xresources, gtkrc-2.0
config/ → ~/.config/…
i3/config window manager
polybar/config.ini bar; launch.sh detects your hardware
rofi/ config.rasi + Macchiato themes + powermenu.sh
dunst/dunstrc notifications
kitty/ kitty.conf + Macchiato colours
picom/picom.conf compositor
betterlockscreen/ lock screen colours
gtk-3.0/, gtk-4.0/, qt5ct/, xfce4/ toolkit theming
local/bin/ → ~/.local/bin/…
set-wallpaper volume brightness screenshot display restart-daemon
wallpapers/ drop your own images here; they win over generated ones
```
---
## Things worth knowing
### `i3lock` becomes `i3lock-color`
`betterlockscreen` depends on **i3lock-color**, an AUR fork that adds the
`--*-color` flags the Macchiato lock screen needs. It *conflicts with* and
*provides* the repo `i3lock`, so stage 20 removes the repo package first. You
still get an `i3lock` binary at the usual path — it just understands more flags.
### The lock screen needs a cached image
`betterlockscreen` pre-renders blurred wallpapers instead of blurring at lock
time (that's why it's instant). Stage 40 builds that cache. After changing your
wallpaper, refresh it:
```sh
betterlockscreen -u ~/.local/share/wallpapers/your-image.png --blur 0.5
```
`set-wallpaper <path>` does this for you automatically.
Locking is wired up three ways: `$mod+Shift+x`, `xss-lock` (10-minute idle timer
and lid close, started from the i3 config), and a `betterlockscreen@.service`
sleep hook for suspends that happen outside the X session.
### polybar adapts to the machine
`~/.config/polybar/launch.sh` detects your battery, AC adapter, backlight device
and network interfaces at launch and passes them in as environment variables, so
`config.ini` has nothing machine-specific in it. Modules with no matching
hardware (battery and backlight on a desktop) are dropped from the bar rather
than left to log errors. One bar spawns per monitor; the system tray goes on the
primary one. Logs land in `~/.cache/polybar.log`.
### NVIDIA
Stage 10 installs Mesa and, for Intel/AMD, the matching Vulkan driver. NVIDIA is
left to you deliberately — the right package depends on your card's generation
and kernel:
```sh
sudo pacman -S nvidia nvidia-utils # current cards, linux kernel
sudo pacman -S nvidia-lts nvidia-utils # linux-lts kernel
```
If you get tearing, uncomment nothing — `picom.conf` already sets
`backend = "glx"` and `vsync = true`. On a weak GPU, delete the `blur` block.
### No display manager
The setup logs in from a TTY with `startx`, which keeps the boot lean. If you'd
rather have a greeter:
```sh
sudo pacman -S ly && sudo systemctl enable ly.service # minimal, TUI
# or
sudo pacman -S lightdm lightdm-gtk-greeter && sudo systemctl enable lightdm
```
Both read `~/.xprofile`, so the environment stays identical either way.
### Making it yours
Put personal i3 tweaks in `~/.config/i3/config.d/*.conf`. They're included at the
end of the main config, so they override anything above them, and the installer
never touches that directory.
For everything else, edit the files in `dotfiles/` and re-run:
```sh
./install.sh --only dotfiles
```
### Changing the accent colour
The Catppuccin accent is **mauve** (`#c6a0f6`) throughout. To switch to, say,
teal, change it in five places:
```
dotfiles/config/i3/config client.focused
dotfiles/config/polybar/config.ini primary = / label-focused-*
dotfiles/config/rofi/themes/… selected:
dotfiles/config/dunst/dunstrc frame_color / [urgency_normal]
dotfiles/config/*/settings.ini catppuccin-macchiato-<accent>-standard+default
```
---
## Troubleshooting
**The bar is missing.** `cat ~/.cache/polybar.log`. The most common cause is a
font that didn't install — check with `fc-list | grep -i inconsolata`.
**Boxes instead of icons.** The Nerd Font glyphs aren't being found. Run
`fc-cache -fv`, then confirm `ttf-inconsolata-nerd` and `ttf-nerd-fonts-symbols-mono`
are installed.
**GTK apps look light/wrong.** The AUR theme package may name its accent
directory differently. `ls /usr/share/themes | grep -i catppuccin`, then put the
exact name into `~/.config/gtk-3.0/settings.ini`. Stage 50 tries to detect and
patch this automatically.
**No sound.** `systemctl --user status pipewire wireplumber`. A reboot after the
first install is usually what's missing.
**Lock screen shows a plain grey box.** The betterlockscreen cache isn't built —
run `betterlockscreen -u <image>`.
**i3 won't start.** `i3 -C` validates the config and prints the offending line.