Personal configuration files for:
- Neovim
- tmux
- Alacritty
- Sway
- Waybar
- Wofi
- Swaylock
- Dunst, Flameshot, and a password-authenticated tty1 login
- GTK 3/4, Qt 5/6, and optional VS Code synchronization
The desktop has switchable Gruvbox Dark, Catppuccin Macchiato, and Everforest
Dark Medium profiles. Gruvbox is selected on the first installation and uses
brown Papirus folders; Catppuccin uses its Blue accent and violet Papirus
folders; Everforest uses a green accent and green Papirus folders. A profile
changes Sway, Waybar, Wofi, Alacritty, tmux, Neovim, Pi, Dunst, Flameshot,
Swaylock, GTK/Qt, VS Code, the desktop and lock-screen wallpaper, and the
published icon theme together. Window borders and gaps are set to
three logical pixels through $border and $gaps in sway/config. The built-in eDP-1 display uses 125%
scaling and is centered below the external display, which may be connected
through either HDMI-A-1 or DP-3. Its position is calculated from the active
monitor's logical size to keep the outputs contiguous and non-overlapping after
mode changes. Waybar prefers the upper external display and automatically moves
to the laptop panel when the external display is disconnected. In laptop-only
mode, the panel is moved back to the global origin so screenshot tools receive
valid capture geometry. Use
swaymsg -t get_outputs to find the
correct output names on a different machine.
sway,swayidle,swaylock,waybar,wofi, anddunstalacritty, PipeWire/WirePlumber,pulseaudio-utils(pactl),brightnessctl,jq, andnmcliopenconnect,procps-ng, andsudofor the optional VPN applet- BlueZ (
bluetoothctl) andrfkillfor Bluetooth and device management cliphistandwl-clipboardfor clipboard historygnome-keyring,gnome-keyring-pam, andlibsecretfor secret storageflameshot,xdg-desktop-portal,xdg-desktop-portal-wlr, andxdg-desktop-portal-gtk- util-linux (
agettyandlogin) for the password-authenticated tty1 login - MesloLGS and JetBrainsMono Nerd Fonts for selectable text and icons
- Kvantum and GTK 3 platform-theme plugins for Qt 5 and Qt 6
- The Adwaita cursor theme and
xsettingsd - Optionally, VS Code, Code Insiders, or VSCodium; no Marketplace color-theme extension is required
The Catppuccin, Gruvbox, and Everforest GTK themes, the Catppuccin Kvantum
engine assets, and the Papirus-Dark icon theme are vendored in this repository.
The installer links the toolkit themes,
extracts the pinned Papirus archive into XDG_DATA_HOME/icons, and builds
small inheriting variants with brown folders for Gruvbox and green folders for
Everforest. The repository also provides complete Gruvbox and Everforest GTK
themes and builds matching Kvantum palettes from the pinned Catppuccin engine
assets. Managed KDE color schemes keep Qt/KDE application palettes
synchronized with Kvantum. Sway passes the selected theme variables to new
applications explicitly, while the theme application script publishes them to
the systemd and D-Bus user environments. A managed systemd user target
registers Sway as a graphical session so portal-based screenshots work even
when Sway is started manually.
See themes/README.md for versions, upstream sources, and
licenses.
The selected dark theme, Papirus icons, Adwaita cursor, selected Nerd Font,
DPI, and antialiasing values are published through GSettings and XSettings so
applications do not need application-specific overrides. The theme application
script also updates the color scheme, accent, widget style, icon, and font keys
in kdeglobals for KDE applications such as Gwenview and Dolphin. Detected VS
Code installations receive the selected font and the local Dotfiles color
theme for both the workbench and editor. It republishes
the toolkit environment and restarts the GTK portal backend so Electron file
pickers adopt the active theme.
- Getty on tty1 uses a fixed account name, requests its password through the
standard
loginPAM service, and starts Sway from the login shell. It clears boot messages before displaying the prompt. A failed password attempt restarts the same fixed-user prompt instead of requesting a username. Other virtual terminals remain available for maintenance. - The console PAM stack does not unlock GNOME Keyring automatically. GNOME Keyring still exposes the standard Secret Service API and may request its password when an application first accesses the login keyring.
Mod+dopens Wofi with application icons. The minimal application-grid icon at the left of Waybar provides the same launcher.- Waybar's palette button opens a compact appearance applet with separate Themes and Fonts submenus. Each submenu marks the active choice, and the theme submenu includes color previews. The lists grow automatically as new profiles are added.
- Waybar renders workspace names without a background. The focused workspace uses the same strong foreground color as the Sway application-launcher icon, while the others remain compact and dimmed. Clicking either empty area around the centered clock toggles a fully transparent bar with light text; clicking it again restores the active theme's background and foreground colors.
Mod+llocks the session manually;Mod+Rightmoves focus to the right.- Automatic locking is disabled; idle displays turn off after ten minutes.
- The active profile's vendored wallpaper is applied to every output and to
Swaylock with
fillscaling. Gruvbox usesmedia/luca-bravo-zAjdgNXsMeg.jpg; Everforest usesmedia/3114699.jpg. - New windows use an automatic Fibonacci layout with equal nested splits: two windows are side by side, then the right half is split vertically, and subsequent splits continue alternating.
- Audio and brightness keys show replaceable Dunst progress indicators. Clicking Waybar's audio indicator opens a Wofi menu for selecting output and input devices, hardware ports, and audio-card profiles such as analog, HDMI, A2DP, and HFP/HSP. Active application streams can be moved between devices or have their volume and mute state adjusted independently.
Printopens Flameshot's region editor;Shift+Printcopies all outputs. Flameshot uses automatic Qt scaling without its magnifier to avoid zoomed capture geometry on fractionally scaled Wayland outputs.Mod+nrestores the last notification,Mod+Shift+nclears notifications, andMod+Ctrl+npersistently pauses or resumes Dunst. Waybar's notification button opens a Wofi menu for browsing, restoring, deleting, or clearing notification history.- Waybar's clipboard button opens history with Wofi; right-click deletes one entry and middle-click clears the entire history.
- Right-clicking Waybar's battery indicator opens a Wofi menu for selecting the battery-save, balanced, or performance power profile.
- Waybar's power button provides lock, suspend, logout, restart, and power-off actions, plus hibernation when logind reports it as available. Restart and power-off actions require confirmation.
- Clicking Waybar's network indicator opens a Wofi and
nmclimenu that can toggle Wi-Fi, scan, connect to visible or hidden networks, request a password, and disconnect. Networks are sorted by signal strength and show active, security, and signal indicators. A separate submenu can activate, disconnect, or forget saved NetworkManager Wi-Fi profiles. - Waybar's VPN indicator reports whether OpenConnect is running. Clicking it
executes
VPN_SCRIPTto connect or runssudo pkill -x openconnectto disconnect; administrator authentication uses a masked Wofi prompt. - Waybar shows the Bluetooth state and connected-device count; clicking it opens
a Wofi and
bluetoothctlmenu that can toggle Bluetooth, scan, pair, connect, reconnect, disconnect, trust, or remove devices. Device entries show paired, trusted, connected, battery, and signal details when BlueZ provides them. An event-driven monitor refreshes connection state immediately instead of waiting for a polling interval. Bluetooth power, notification pause, idle-inhibitor, and Waybar transparency choices are stored under${XDG_STATE_HOME:-$HOME/.local/state}/dotfilesand restored after Sway, Dunst, or Waybar restarts.
On Fedora, install all system dependencies and the pinned MesloLGS and
JetBrainsMono Nerd Fonts first. The script lists missing packages and asks for
confirmation before invoking sudo dnf:
./scripts/install-fedora-dependencies.shUse ./scripts/install-fedora-dependencies.sh --check for a read-only check.
Then run the dotfile installer from any directory. In addition to creating
links, it selects the default Gruvbox profile, applies the GTK and icon themes,
selects Kvantum, and updates the systemd and D-Bus user environments without
relying on KDE or another desktop environment:
./install.shPress Mod+Shift+t or click Waybar's palette button to open the Wofi
appearance applet, then enter the Themes or Fonts submenu. The same applet
retains command-line operations for automation:
~/.config/sway/scripts/theme-switcher.sh --list
~/.config/sway/scripts/theme-switcher.sh gruvbox
~/.config/sway/scripts/theme-switcher.sh everforest
~/.config/sway/scripts/theme-switcher.sh --list-fonts
~/.config/sway/scripts/theme-switcher.sh --font meslo-lgMesloLGS (the small-line-gap MesloLG variant) is the default font. The common
meslo, meslolg, and jetbrains font aliases are also accepted.
The active profile is stored as the replaceable
${XDG_CONFIG_HOME:-~/.config}/dotfiles-theme symlink, while the font uses
${XDG_CONFIG_HOME:-~/.config}/dotfiles-font. Switching either reloads Sway,
so the wallpaper and running desktop components update immediately. Running
tmux and Pi sessions are refreshed as well, Neovim reloads its palette when it
regains focus, and VS Code applies the selected editor and terminal font plus
the repository-managed Dotfiles theme live. A VS Code window that was open
while the local extension was installed may need Developer: Reload Window
once; subsequent profile changes update the registered theme directly. Other
existing GUI applications may need to be restarted.
The installer asks before replacing an existing ~/.bash_profile. Its managed
profile retains the standard ~/.bashrc loading behavior and starts Sway only
from tty1. Configure tty1 for the current user and select it for the next boot:
./scripts/configure-tty-login.shThe setup script installs a getty@tty1 override under /etc/systemd/system,
configures a fixed account name so only its password is requested, sets the
console login retry count to one in /etc/login.defs, disables LightDM without
stopping the active session, and selects multi-user.target.
It asks for confirmation before using sudo. Use
./scripts/configure-tty-login.sh --check for read-only verification, or
--user USER to configure another local account.
It creates these managed links and runtime files:
~/.bash_profile→.bash_profile~/.tmux.conf→.tmux.conf${XDG_CONFIG_HOME:-~/.config}/alacritty/alacritty.toml→alacritty/alacritty.toml; the adjacent generatedtheme.tomlandfont.tomlremain at stable paths so Alacritty detects live updates${XDG_CONFIG_HOME:-~/.config}/nvim→nvim/${XDG_CONFIG_HOME:-~/.config}/sway→sway/${XDG_CONFIG_HOME:-~/.config}/waybar→waybar/${XDG_CONFIG_HOME:-~/.config}/wofi/config→wofi/config; the generatedtheme.csscombines the active palette with the repository stylesheet${XDG_CONFIG_HOME:-~/.config}/flameshot/flameshot.iniis generated from the active profile so D-Bus activation reads the same theme${XDG_CONFIG_HOME:-~/.config}/xdg-desktop-portal/sway-portals.conf→xdg-desktop-portal/sway-portals.conf${XDG_CONFIG_HOME:-~/.config}/systemd/user/dotfiles-sway-session.target→systemd/user/dotfiles-sway-session.target~/.gtkrc-2.0→ the generated GTK 2 configuration under${XDG_CONFIG_HOME:-~/.config}/dotfiles-runtime, synchronized with the active theme and font profiles${XDG_CONFIG_HOME:-~/.config}/gtk-{3,4}.0→gtk-{3,4}.0/${XDG_DATA_HOME:-~/.local/share}/color-schemes/receives the managedCatppuccinMacchiato,GruvboxDark, andEverforestDarkcolor schemes${XDG_CONFIG_HOME:-~/.config}/Kvantum/catppuccin-macchiato-blue→ the vendored Kvantum theme; adjacent Gruvbox and Everforest variants are generated by the installer${XDG_CONFIG_HOME:-~/.config}/environment.d/90-wayland-toolkits.conf→environment.d/90-wayland-toolkits.conf${XDG_CONFIG_HOME:-~/.config}/dotfiles-theme→ the active profile underthemes/profiles/${XDG_CONFIG_HOME:-~/.config}/dotfiles-font→ the active profile underfonts/profiles/- detected VS Code installations receive a managed
dotfiles.dotfiles-themeextension under their standard per-user extension directory; its runtime color theme is copied from the active profile'svscode.json ${XDG_DATA_HOME:-~/.local/share}/themes/catppuccin-macchiato-blue-standard+default→ the vendored GTK theme${XDG_DATA_HOME:-~/.local/share}/themes/Gruvbox-Dark→ the maintained Gruvbox GTK theme${XDG_DATA_HOME:-~/.local/share}/themes/Everforest-Green-Dark→ the maintained Everforest GTK theme${XDG_DATA_HOME:-~/.local/share}/backgrounds/dotfiles→media/
If a destination already exists, the installer asks for confirmation before
replacing it. Set DOTFILES_SKIP_THEME_APPLY=1 to create links without changing
the live GTK, Qt, systemd, or D-Bus settings.
The Waybar VPN applet uses exactly one applet-specific setting: VPN_SCRIPT,
the path of the existing connection script. The applet does not pass arguments
or credentials to it. Put the machine-specific absolute path in a local
environment file; do not add the script or its details to this repository:
# ~/.config/environment.d/95-vpn.conf
VPN_SCRIPT=/absolute/path/to/private-vpn-scriptEnvironment files do not expand ~. Log out and back in after creating the
file, or reload the user manager's environment and Sway:
systemctl --user daemon-reload
swaymsg reloadWhen OpenConnect is not running, clicking the indicator opens a Wofi
confirmation and executes VPN_SCRIPT without arguments through
sudo --askpass --preserve-env. The existing script remains responsible for VPN
credentials and connection. Variables defined in .bashrc are available to it
when they use export and Sway/Waybar was started after they were defined. Log
out and back in after changing those exports so the graphical session inherits
them.
When OpenConnect is running, the action instead disconnects it with
sudo pkill -x openconnect. This stops every process whose exact name is
openconnect. A separate masked Wofi prompt is shown whenever administrator
authentication is needed. The indicator is green while an openconnect process
is running and dimmed otherwise.
Since the configured file is deliberately executed with administrator
privileges and receives the exported user environment, VPN_SCRIPT must be an
absolute path to a trusted executable and must not point to an untrusted or
group-writable file. sudo still removes variables that its security policy
forbids even when --preserve-env is used.
Chromium-based applications choose where to read the proxy configuration from
based on the desktop they detect: GNOME-like sessions read the
org.gnome.system.proxy GSettings schema, KDE reads kioslaverc, and any other
session — Sway included — falls back to the http_proxy/https_proxy
environment variables. Under Sway those variables are therefore the supported
channel, but they are normally exported only by interactive shells, so
applications started from the launcher inherit no proxy at all.
scripts/proxy-env.sh is the single place that resolves the proxy state, and
scripts/with-proxy runs any command with the result applied:
scripts/with-proxy chromium-browserThe state is evaluated per invocation instead of being imported once into the session environment, because a VPN is connected and disconnected while the session keeps running, and Chromium does not fall back to a direct connection when a configured PAC URL becomes unreachable — it fails every request instead. Restarting the application is enough to pick up the new state.
Site-specific host names are not stored in this repository. Copy
scripts/proxy-env.conf.example to ${XDG_CONFIG_HOME:-~/.config}/proxy-env.conf
and set the values for your network; without that file no proxy is used, so the
helpers are harmless on machines outside a corporate network.
Application launchers that need the wrapper stay outside this repository when the
application is installed on a single machine. Wrap the command in the local
.desktop entry instead:
Exec=/path/to/dotfiles/scripts/with-proxy /usr/bin/some-application %U