274 lines
9.4 KiB
Markdown
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.
|