Full desktop configuration for a Sway/Wayland setup on Ubuntu 24.04. Covers apt packages, snaps, Python tools, Iosevka Nerd Fonts, Gruvbox-Material-Dark theming, pywal dynamic colour theming, waybar, kitty, fish, and all system-level config.
git clone https://github.com/dhillon-m/ubuntu-dotfiles.git ~/ubuntu-dotfiles
cd ~/ubuntu-dotfiles
chmod +x install.sh
./install.shFlags:
| Flag | Effect |
|---|---|
--skip-repos |
Skip adding PPAs / external repos |
--skip-apt |
Skip apt package install |
--skip-snaps |
Skip snap installs |
--skip-fonts |
Skip Iosevka Nerd Font download |
--dotfiles-only |
Only link configs, skip all package installs |
After running the installer, edit these files to match your actual hardware. The installer will remind you of each step.
Find your output names:
swaymsg -t get_outputsEdit the ── CONFIGURE YOUR DISPLAYS ── section in ~/.config/sway/config. Update:
- Output names (e.g.
DP-1,HDMI-A-2) - Positions, scales, transforms
- Workspace-to-output assignments
Edit the MONITORS dict at the top of the script to match your displays. Usage after configuring:
setwallpaper ~/Pictures/wallpapers/something.jpg
# or, for a file already in ~/Pictures/wallpapers/:
setwallpaper somethingSplits a single image across all monitors and updates sway config to persist on reload.
The CSS uses output names as window selectors (window#DP-3, window#HDMI-A-1). Update these to match your output names. The installer renders this file with your $HOME path substituted.
If you have an AMD discrete GPU alongside an iGPU, set DISCRETE_PCI to the PCI address of your discrete card:
lspci | grep -i vga
# e.g.: 03:00.0 VGA compatible controller: AMD Radeon RX 6700 XT
# → DISCRETE_PCI="0000:03:00.0"If you have a single GPU or an Nvidia GPU, the script will need adjustment.
| Component | Package |
|---|---|
| Window manager | sway |
| Status bar | waybar (config in config/waybar/) |
| Launcher | fuzzel |
| Notifications | mako-notifier |
| Terminal | kitty |
| Shell | fish |
| Lock screen | gtklock |
| Screenshots | grim + slurp + wl-clipboard |
| Component | Tool |
|---|---|
| Dynamic colours | pywal — generates all colour files from a wallpaper or scheme |
| GTK theme | Gruvbox-Material-Dark (installed to ~/.local/share/themes/) |
| Icon theme | Gruvbox-Material-Dark (from Papirus PPA) |
| Qt theming | qt5ct / qt6ct + Kvantum, theme generated by wal |
| Font | Iosevka Nerd Font (all weights, installed to ~/.local/share/fonts/) |
| Terminal colours | kitty — sourced from ~/.cache/wal/colors-kitty.conf |
| Waybar colours | sourced from ~/.cache/wal/colors-waybar.css |
| Sway border colours | sourced from ~/.cache/wal/colors-sway |
wal --theme luna
│
wal/templates/* ──► ~/.cache/wal/
│
┌──────────────┼──────────────────────┐
▼ ▼ ▼
colors-kitty waybar-main.jsonc colors-sway
colors-waybar waybar-secondary.jsonc fuzzel.ini
btop.theme gtklock.css mako
kvantum.kvconfig vesktop.css micro.micro
After wal runs, it executes ~/.config/wal/postscripts/animation.sh, which:
- Clears anifetch
- Symlinks the matching
.gifto~/.config/wal/animations/current_animation.gif - Applies colours to Vesktop (if
walcordis installed)
Reload Sway after changing theme: Mod+Shift+c
Colour schemes live in config/wal/colorschemes/dark/:
- luna — Gruvbox Material Dark (default)
- auar — high-contrast yellow-on-black
| App | Source |
|---|---|
| ProtonVPN | https://protonvpn.com/support/linux-ubuntu-vpn-setup/ |
| Jackett | https://github.com/Jackett/Jackett/releases → extract to /opt/Jackett |
| qBittorrent | https://www.qbittorrent.org/download (AppImage → ~/.local/bin/qbittorrent.AppImage) |
| Vesktop | Installed via apt (in repos after adding key) |
| Binding | Action |
|---|---|
Mod+Return |
Open kitty |
Mod+d |
Open fuzzel launcher |
Mod+Shift+e |
Power menu |
Mod+Shift+q |
Kill window |
Mod+Shift+c |
Reload sway config |
Mod+Tab |
Window picker (fuzzel) |
Print |
Screenshot region → clipboard |
Mod+Print |
Screenshot region → ~/Pictures/screenshot-*.png |
Mod+h/j/k/l |
Focus left/down/up/right |
Mod+Shift+h/j/k/l |
Move window |
Mod+1–0 |
Switch workspace |
Mod+Shift+1–0 |
Move window to workspace |
Mod+f |
Fullscreen |
Mod+r |
Resize mode |
Mod+Shift+space |
Toggle floating |
Mod+b/v |
Split horizontal/vertical |
Mod+Shift+minus |
Send to scratchpad |
Mod+minus |
Show scratchpad |
Odd workspaces (1,3,5,7,9) → primary monitor. Even (2,4,6,8,10) → secondary. Workspace icons use planetary symbols: ☿♀♁☾♂♃♄♅♆♇
| Widget | Click | Right-click |
|---|---|---|
| CPU | btop preset 1 (CPU view) | — |
| GPU | btop preset 2 (GPU view) | — |
| Memory | btop preset 3 (memory view) | — |
| Network | Toggle WiFi | WiFi network picker |
| VPN | Toggle ProtonVPN | Country picker |
| Volume | Mute toggle | pavucontrol |
ubuntu-dotfiles/
├── install.sh # Main installer
├── config/
│ ├── sway/ # Sway WM config + power-menu.sh
│ ├── kitty/ # kitty.conf (fonts, padding, keymaps)
│ ├── fish/ # config.fish + fish_variables
│ ├── fuzzel/ # fuzzel.ini (wal-themed, no icons)
│ ├── mako/ # mako notification config
│ ├── waybar/
│ │ ├── main/style.css # Bar styling (imports wal colours)
│ │ ├── main/scripts/ # Custom shell modules (cpu, gpu, mem, net, vpn…)
│ │ └── secondary/style.css # Same CSS for secondary monitor bar
│ ├── gtk-3.0/settings.ini
│ ├── gtk-4.0/settings.ini
│ ├── gtklock/ # Lock screen config + style (HOME_PLACEHOLDER)
│ ├── micro/ # micro editor config
│ ├── btop/ # btop.conf (gruvbox theme, block graphs)
│ ├── qt5ct/ # Qt5 theming
│ ├── Kvantum/ # Kvantum theme pointer (wal generates the theme)
│ └── wal/
│ ├── templates/ # pywal templates → ~/.cache/wal/
│ ├── colorschemes/dark/ # luna.json (Gruvbox) + auar.json
│ └── postscripts/ # animation.sh (runs after wal applies a theme)
├── local/bin/
│ └── setwallpaper # Splits wallpaper across multi-monitor setup
└── etc/
├── keyd/default.conf # Middle-click → Shift remap
├── udev/hwdb.d/ # Mouse button remap via hwdb
├── udev/rules.d/ # ddcutil i2c access
├── modprobe.d/ # bluetooth: disable_ertm
└── systemd/system/ # jackett.service