This repository contains my personal dotfiles and automated setup scripts for quickly configuring a fresh Arch Linux (or EndeavourOS) system with the Hyprland compositor.
- Prerequisites
- Features
- Quick Start
- What Gets Installed
- Repository Structure
- Setup Scripts
- Asset Management
- Configuration
- Key Bindings
- Customization
- Troubleshooting
- Maintenance
- License
- Fresh Arch Linux or EndeavourOS installation ("No Desktop" option recommended)
- Internet connection for package downloads
- User account with sudo privileges (must be in
wheelgroup) - Git (will be installed automatically if missing)
- Automated installation of essential packages (official & AUR via yay)
- Modular Hyprland configuration with organized config files
- Symlinked dotfiles for all configs (
hypr,waybar,kitty,.zshrc, etc.) - Bitwarden CLI integration for secrets management (SSH keys, API tokens)
- Custom productivity scripts and shell aliases
- Modern Wayland tooling:
wofi,swaylock,grim,slurp,mako - Multi-monitor support with workspace assignments
- Asset management with automatic extraction and symlinking
- Personal host configuration and SSH key management
- Status indicators for all setup steps with clear success/failure feedback
After installing a minimal Arch Linux or EndeavourOS (use the "No Desktop" option), run the bootstrap script as root:
curl -sL https://raw.githubusercontent.com/tefloon/linux/main/bootstrap.sh | sudo bashWhat the bootstrap script does:
- Installs git if not present
- Clones this repository to your user's home directory (
~/linux) - Runs the main setup script (
setup.sh) as your user - Configures
/etc/fstabwith personal drive mounts (customize in bootstrap.sh before running) - Links personal hosts file to
/etc/hosts - Switches git remote to SSH for easier future updates
If you prefer manual installation:
# As regular user
cd ~
git clone https://github.com/tefloon/linux.git
cd linux
./setup.sh- Reboot your system to ensure all services start properly
- Log in and you should see your Hyprland desktop with:
- Multiple Waybar instances (one per monitor)
- Auto-started applications (Ferdium, Obsidian)
- Custom wallpaper and cursor theme (Bibata Modern Classic)
- Run
sudo tailscale upto join the tailnet - Run
retrieve-secrets.shto get all the SSH keys, .env, GPG etc. from Bitwarden - **Setup the SDDM theme by running
bash -c "$(curl -fsSL https://raw.githubusercontent.com/keyitdev/sddm-astronaut-theme/master/setup.sh)"
The retrive-secrets.sh script will pull secrets from Bitwarden. Those include SSH keys, PGP/GPG private keys and environment variables.
Bitwarden supports SSH keys as an asset type so the script will pull them (both private and public) and put them in ~/.ssh/.
There is no way to store PGP/GPG keys in Bitwarden natively, so the script will look for notes with "pgp" or "gpg" in the name, extract them and import them to the keyring.
The script will look for notes with "secret" in the name, extract the contents parse it as environment variables and add them to the file ~/.zsh_secrets
- Compositor & Session:
hyprland,uwsm - Wallpaper & Bar:
hyprpaper,waybar - Launcher & Terminal:
wofi,kitty - Notifications & Lock:
mako,swaylock - Clipboard & Screenshots:
wl-clipboard,cliphist,grim,slurp - Portals:
polkit-kde-agent,xdg-desktop-portal-hyprland - Qt/Wayland:
qt5-wayland,qt6-wayland,qt5ct,qt6ct
- Text Editors: Sublime Text 4, VS Code, Cursor
- File Management:
yazi(terminal file manager),fd,bat,tree - Shells:
zshwithzsh-syntax-highlighting,zsh-autosuggestions,zoxide - Tools:
jq,bitwarden-cli,keychain,tealdeer(tldr client) - Version Control: Git with comprehensive SSH configuration
- Browsers: Thorium Browser (default), Brave
- Communication: Ferdium (multi-platform messaging), KDE Connect
- Media: Kodi, Spotify,
spotifyd,spotify-player - Office: OnlyOffice, Obsidian (note-taking), Calibre (ebook management)
- Utilities:
copyq(clipboard manager with history)cliphist(Wayland clipboard history)corectrl(AMD GPU control)qbittorrentgnome-calendar
- Audio: PipeWire with WirePlumber, EasyEffects
- Themes: Bibata cursor theme, adw-gtk3-dark GTK theme
- Fonts: Development and UI font packages
- System:
ntfs-3gfor NTFS support
linux/
├── README.md # This file
├── setup.sh # Main setup orchestrator
├── bootstrap.sh # Root installation script
├── bin/ # Custom utility scripts
├── scripts/ # Modular setup scripts
├── dotfiles/ # Configuration files (symlinked to ~/ preserving their relative paths)
├── assets/ # Themes, wallpapers, archives (copied/extracted to ~/.local/share)
└── launch-scripts/ # Application launchers
The Hyprland configuration is modular and organized:
~/.config/hypr/
├── hyprland.conf # Main config (sources all others)
└── hyprland/
├── env.conf # Environment variables
├── execs.conf # Autostart applications
├── general.conf # Window manager settings
├── keybinds.conf # Key bindings
├── rules.conf # Window rules & workspace assignments
└── colors.conf # Color scheme
The setup.sh script orchestrates the entire installation by calling modular scripts in sequence:
setup.sh
├── scripts/install-packages.sh # Install all packages (pacman + AUR)
├── scripts/setup-shell.sh # Configure zsh with plugins
├── scripts/setup-scripts.sh # Link custom bin/ scripts
├── scripts/setup-dotfiles.sh # Symlink all dotfiles
├── scripts/setup-launch-scripts.sh # Setup application launchers
├── scripts/setup-assets.sh # Extract and setup themes/wallpapers
├── scripts/setup-system.sh # System configs (theme, shell, hosts)
├── scripts/post-install.sh # Post-installation tasks
│ ├── setup-services.sh # Enable services, add to groups
│ ├── setup-default-browser.sh # Browser MIME configuration
│ └── set-default-programs.sh # Default app associations
└── scripts/retrieve-secrets.sh # Fetch secrets from Bitwarden
Each script includes status indicators for every step, making it easy to see what succeeded, failed, or was skipped.
The repository includes a comprehensive SSH config (.ssh/config) with:
- GitHub SSH key configuration
- Personal server connections (Pi, server, Hostinger)
- ControlMaster for connection multiplexing
- Automatic ForwardAgent for GitHub
The setup-assets.sh script automatically handles assets in the assets/ directory:
- Archives (
.zip,.tar.gz,.tar.xz, etc.): Automatically extracted to~/.local/share/ - Images (
.png,.jpg,.svg, etc.): Symlinked to~/.local/share/ - Cursor Themes: Extracted and installed system-wide
- Wallpapers: Made available for hyprpaper
All assets maintain proper permissions and ownership.
Configured for 3 monitors with workspace assignments:
- HDMI-A-2 (Left): Workspaces 1, 4
- HDMI-A-1 (Right): Workspaces 3, 6
- Special workspace
magic: Scratchpad for Obsidian
Workspace 2: Ferdium (messaging)
Special magic: Obsidian (notes)
Additional auto-starts:
- EasyEffects (audio processing)
- Clipboard history (cliphist)
- Polkit authentication agent
- Shell: Zsh with syntax highlighting, autosuggestions, and zoxide
- Theme: adw-gtk3-dark (dark mode enabled)
- Cursor: Bibata Modern Classic (24px)
- Clipboard: cliphist for text and image history
- Audio: PipeWire + WirePlumber + EasyEffects
| Binding | Action |
|---|---|
Super + T |
Open terminal (kitty) |
Super + D |
Application launcher (wofi) |
Super + F |
Notes (Obsidian) |
Super + R |
Text editor (Sublime) |
Super + B |
Browser (Thorium) |
Super + S |
Toggle scratchpad |
Super + 1-6 |
Switch to workspace 1-6 |
Super + Shift + 1-6 |
Move window to workspace 1-6 |
Super + Q |
Close window |
Super + V |
Toggle floating |
Super + I |
Window info (class/title) |
Print |
Screenshot selection |
Super + Print |
Screenshot full screen |
Note: Full keybindings are defined in ~/.config/hypr/hyprland/keybinds.conf
Edit scripts/install-packages.sh and add your packages:
# Official repository packages
install_pkg "package-name"
# AUR packages
install_aur_pkg "aur-package-name"Then re-run: source scripts/install-packages.sh
- Place your config file in the
dotfiles/directory, maintaining the same path structure as it would be in~/ - Run
bash scripts/setup-dotfiles.shto create symlinks - Files automatically maintain the correct relative paths
Example:
dotfiles/.config/foo/config.yml → ~/.config/foo/config.yml
dotfiles/.zshrc → ~/.zshrc
- Monitor layout: Edit
~/.config/hypr/hyprland/rules.conf - Keybindings: Modify
~/.config/hypr/hyprland/keybinds.conf - Autostart apps: Update
~/.config/hypr/hyprland/execs.conf - Colors/theme: Adjust
~/.config/hypr/hyprland/colors.confand Waybar configs - Custom hosts: Edit
dotfiles/hosts(automatically linked to/etc/hosts) - Drive mounts: Edit
bootstrap.shto customize/etc/fstabentries
Installation Failed/Stopped:
# Check system logs
journalctl -xe
# Check package installation logs
cat /tmp/pacman.log
cat /tmp/yay.log
# Restart from where it stopped
cd ~/linux
./setup.shMissing Packages:
# Re-run package installation
cd ~/linux
source scripts/install-packages.shDotfiles Not Applied:
# Re-run dotfile setup
cd ~/linux
bash scripts/setup-dotfiles.shElectron Apps & Cursor Theme:
If Electron apps don't respect cursor themes:
# Create default cursor symlink
sudo ln -sf ~/.local/share/icons/Bibata-Modern-Classic ~/.local/share/icons/default
# Or system-wide
sudo ln -sf /usr/share/icons/Bibata-Modern-Classic /usr/share/icons/defaultMulti-Monitor Issues:
# Check monitor names
hyprctl monitors
# Update hyprland/rules.conf with correct names
nano ~/.config/hypr/hyprland/rules.conf
# Reload Hyprland
hyprctl reloadNetwork Issues:
# Check network manager
systemctl status NetworkManager
# WiFi problems
nmcli device wifi list
# DNS issues
cat /etc/resolv.confAudio Problems:
# Restart PipeWire
systemctl --user restart pipewire
# Check audio devices
pactl list sinks
# Volume control GUI
pavucontrolPerformance Issues:
- Use game mode toggle in Waybar (🎮) for gaming
- Check GPU drivers:
lspci -k | grep -A 2 -E "(VGA|3D)"
# Update all packages
yay
# Update dotfiles repo
cd ~/linux
git pull
# Re-run setup if needed (safe to run multiple times)
./setup.sh- Use
htoporbtopfor system monitoring - Check GPU usage:
corectrl(AMD) ornvidia-smi(NVIDIA) - Monitor disk usage:
dyskanddust
# Reload Hyprland config
hyprctl reload
# Check running windows
hyprctl clients
# Monitor information
hyprctl monitorsPersonal use. Fork and adapt as you like!
System Specs Tested On:
- Arch Linux (latest)
- EndeavourOS 2024+
- AMD/Intel/NVIDIA GPUs supported
- 8GB+ RAM recommended
This is a personal dotfiles repository, but feel free to:
- Fork and adapt for your own use
- Submit issues if you find bugs
- Suggest improvements via pull requests
Note: This setup includes personal configurations (SSH hosts, drive mounts, etc.). Remember to customize these for your own system before using!