Repository files navigation

Dotfiles

Personal dotfiles for Arch Linux, Fedora, and Debian/Ubuntu with optional Hyprland or Niri desktop support.

Features

  • Multi-distro support: Works on Arch Linux, Fedora, and Debian/Ubuntu (extensible to other distros)
  • Desktop or terminal mode: Choose a full desktop setup or a lightweight terminal-only install
  • Interactive installer: Beautiful TUI prompts using gum
  • Modular packages: Choose what to install (Hyprland, Niri, Development, Gaming, AI, etc.)
  • Chezmoi-powered: Smart dotfile management with templates and conditional installation
  • Easy to extend: Add new distros or package groups with simple YAML files

Quick Start

# Clone the repository
git clone https://github.com/yourusername/dotfiles.git ~/dotfiles
cd~/dotfiles
# Run the interactive management menu
./manage.sh
# Or run the installer directly
./manage.sh setup

The interactive installer will:

  1. Detect your distribution
  2. Choose setup type (Desktop or Terminal)
  3. Let you choose package groups to install
  4. Install all selected packages
  5. Apply dotfiles using Chezmoi
  6. Enable required services
  7. Set up SSH keys and shell

Package Groups

GroupDescription
HyprlandHyprland compositor with hypridle, hyprlock, hyprpaper, hyprshot, waybar, rofi, mako, wlogout, clipboard tooling (cliphist, wl-clipboard) and Wayland helpers
NiriNiri scrollable tiling compositor with Wayland desktop tools (waybar, rofi, mako, wlogout, sddm, clipboard, screenshots)
Developmentneovim, Cursor, Git tooling (gh, lazygit, delta), containers (docker, docker-compose, lazydocker), and build/task tools (cmake, gcc/base-devel, just)
GamingSteam + Discord with performance helpers (mangohud, gamemode)
MultimediaMedia and creation tools (mpv, obs-studio, ffmpeg, ImageMagick, GIMP, Inkscape)
ProductivityFile managers (Dolphin + Yazi), thumbnail support (ffmpegthumbnailer, kdegraphics-thumbnailers), BTRFS snapshots (snapper, snap-pac/python3-dnf-plugin-snapper, grub-btrfs), communication/browser apps (Slack, Chrome), archive tools, and themes/icons
AIAI-powered desktop tools: hyprvoice speech-to-text dictation with local Whisper models

Structure

dotfiles/
├── manage.sh # Management script (single entry point)
├── tools/
│ ├── setup.sh # Bootstrap script (installs gum + git, runs installer)
│ └── manage-cursor-extensions.sh # Export/install Cursor extensions list
├── install/
│ ├── installer.sh # Main interactive installer
│ ├── distros/
│ │ ├── arch.sh # Arch Linux package functions
│ │ ├── fedora.sh # Fedora package functions
│ │ └── debian.sh # Debian/Ubuntu package functions
│ └── lib/
│ ├── common.sh # Shared utilities
│ ├── detect.sh # Distro detection
│ ├── services.sh # Service management
│ └── tree_select.py # Interactive package selector TUI
├── packages/
│ ├── common.yaml # Cross-distro tools (zoxide, volta, etc.)
│ ├── arch/
│ │ └── base.yaml # Arch base packages
│ ├── fedora/
│ │ └── base.yaml # Fedora base packages
│ ├── debian/
│ │ └── base.yaml # Debian/Ubuntu base packages
│ └── groups/
│ ├── hyprland.yaml # Hyprland + Wayland tools
│ ├── niri.yaml # Niri compositor + Wayland tools
│ ├── development.yaml # Dev tools
│ ├── gaming.yaml # Gaming packages
│ ├── multimedia.yaml # Media tools
│ ├── productivity.yaml
│ └── ai.yaml # AI tools (dictation, Whisper)
├── home/ # Chezmoi source directory
│ ├── .chezmoiignore # Conditional dotfile rules
│ ├── dot_config/ # ~/.config files
│ ├── dot_zshrc # ~/.zshrc
│ └── ...
└── README.md

Cursor Extensions Script

This repo includes a Cursor extensions manager to keep extensions reproducible across machines.

It reads/writes the extension list at home/dot_config/Cursor/extensions.txt.

Usage

# Interactive menu
./manage.sh cursor
# Export currently installed extensions to extensions.txt
./manage.sh cursor export# Install all extensions from extensions.txt
./manage.sh cursor install

Notes

  • Requires the cursor CLI in your PATH.
  • install is idempotent: already-installed extensions are skipped/reinstalled safely.

Adding a New Distribution

  1. Create install/distros/<distro>.sh with package manager functions
  2. Create packages/<distro>/base.yaml with package names
  3. Add distro-specific packages to packages/groups/*.yaml
  4. Update install/lib/detect.sh if needed

Three distro families are already supported: Arch, Fedora, and Debian/Ubuntu (see install/distros/debian.sh for a real example).

Manual Chezmoi Usage

If you previously used GNU Stow, this is the main behavior change to keep in mind:

  • Stow mental model: repo files are symlinked into $HOME, so editing the repo is "live" immediately.
  • Chezmoi mental model: repo files are the source state and your home directory is the target state. Changes are applied when you run chezmoi apply (or related commands).

First-time setup (manual)

# Initialize chezmoi with this repo
chezmoi init --source=~/dotfiles/home
# Verify source is correct (important)
chezmoi source-path

Daily commands (most useful)

# See what would change before touching your home files
chezmoi diff
# Apply source state to your home directory
chezmoi apply
# Edit a managed file safely (writes back to source state)
chezmoi edit ~/.zshrc
# Check what changed in source state
chezmoi status
# Pull and apply latest changes from your remote dotfiles repo
chezmoi update

Typical workflow after editing this repo

cd~/dotfiles
git pull
chezmoi diff
chezmoi apply

Can Chezmoi auto-apply?

Yes, but it is not the default behavior.

  • Recommended default: keep manual chezmoi diff + chezmoi apply so changes are explicit.
  • Possible auto-apply: run a file watcher (e.g. inotifywait/entr) or a user systemd path service that triggers chezmoi apply when files in ~/dotfiles/home change.
  • Caveat: fully automatic apply can surprise you during partial edits; many users prefer explicit applies for safer config management.

Post-Installation

After running the installer:

  1. Log out and back in for shell changes to take effect
  2. Start tmux and press Ctrl+b I to install tmux plugins
  3. Add SSH key to GitHub/GitLab (displayed during setup)
  4. Hyprland users: Press Super+? to see keybindings
  5. Niri users: Log out, choose Niri in your display manager, log back in
  6. Dark/light mode: Press Mod+N to toggle between Catppuccin Mocha and Latte
  7. Plymouth: Reboot to see the boot splash (if configured during install)

Included Configurations

  • Shell: zsh with starship prompt, zoxide, television
  • Terminal: kitty
  • Editor: Neovim (AstroNvim-based), Cursor
  • Git: delta for diffs, lazygit
  • Multiplexer: tmux with TPM
  • File Manager: yazi, dolphin
  • Hyprland: hypridle, hyprlock, hyprpaper, hyprshot, waybar, rofi, mako, wlogout
  • Niri: niri with waybar, rofi, mako, wlogout (scrollable tiling Wayland compositor)
  • AI: hyprvoice dictation with local Whisper speech recognition

Credits

Hyprland configuration originally inspired by ml4w starter kit.

License

MIT License - see LICENSE for details.

About

My dotfiles handled with GNU stow

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Dotfiles

Personal dotfiles for Arch Linux, Fedora, and Debian/Ubuntu with optional Hyprland or Niri desktop support.

Features

  • Multi-distro support: Works on Arch Linux, Fedora, and Debian/Ubuntu (extensible to other distros)
  • Desktop or terminal mode: Choose a full desktop setup or a lightweight terminal-only install
  • Interactive installer: Beautiful TUI prompts using gum
  • Modular packages: Choose what to install (Hyprland, Niri, Development, Gaming, AI, etc.)
  • Chezmoi-powered: Smart dotfile management with templates and conditional installation
  • Easy to extend: Add new distros or package groups with simple YAML files

Quick Start

# Clone the repository
git clone https://github.com/yourusername/dotfiles.git ~/dotfiles
cd~/dotfiles
# Run the interactive management menu
./manage.sh
# Or run the installer directly
./manage.sh setup

The interactive installer will:

  1. Detect your distribution
  2. Choose setup type (Desktop or Terminal)
  3. Let you choose package groups to install
  4. Install all selected packages
  5. Apply dotfiles using Chezmoi
  6. Enable required services
  7. Set up SSH keys and shell

Package Groups

GroupDescription
HyprlandHyprland compositor with hypridle, hyprlock, hyprpaper, hyprshot, waybar, rofi, mako, wlogout, clipboard tooling (cliphist, wl-clipboard) and Wayland helpers
NiriNiri scrollable tiling compositor with Wayland desktop tools (waybar, rofi, mako, wlogout, sddm, clipboard, screenshots)
Developmentneovim, Cursor, Git tooling (gh, lazygit, delta), containers (docker, docker-compose, lazydocker), and build/task tools (cmake, gcc/base-devel, just)
GamingSteam + Discord with performance helpers (mangohud, gamemode)
MultimediaMedia and creation tools (mpv, obs-studio, ffmpeg, ImageMagick, GIMP, Inkscape)
ProductivityFile managers (Dolphin + Yazi), thumbnail support (ffmpegthumbnailer, kdegraphics-thumbnailers), BTRFS snapshots (snapper, snap-pac/python3-dnf-plugin-snapper, grub-btrfs), communication/browser apps (Slack, Chrome), archive tools, and themes/icons
AIAI-powered desktop tools: hyprvoice speech-to-text dictation with local Whisper models

Structure

dotfiles/
├── manage.sh # Management script (single entry point)
├── tools/
│ ├── setup.sh # Bootstrap script (installs gum + git, runs installer)
│ └── manage-cursor-extensions.sh # Export/install Cursor extensions list
├── install/
│ ├── installer.sh # Main interactive installer
│ ├── distros/
│ │ ├── arch.sh # Arch Linux package functions
│ │ ├── fedora.sh # Fedora package functions
│ │ └── debian.sh # Debian/Ubuntu package functions
│ └── lib/
│ ├── common.sh # Shared utilities
│ ├── detect.sh # Distro detection
│ ├── services.sh # Service management
│ └── tree_select.py # Interactive package selector TUI
├── packages/
│ ├── common.yaml # Cross-distro tools (zoxide, volta, etc.)
│ ├── arch/
│ │ └── base.yaml # Arch base packages
│ ├── fedora/
│ │ └── base.yaml # Fedora base packages
│ ├── debian/
│ │ └── base.yaml # Debian/Ubuntu base packages
│ └── groups/
│ ├── hyprland.yaml # Hyprland + Wayland tools
│ ├── niri.yaml # Niri compositor + Wayland tools
│ ├── development.yaml # Dev tools
│ ├── gaming.yaml # Gaming packages
│ ├── multimedia.yaml # Media tools
│ ├── productivity.yaml
│ └── ai.yaml # AI tools (dictation, Whisper)
├── home/ # Chezmoi source directory
│ ├── .chezmoiignore # Conditional dotfile rules
│ ├── dot_config/ # ~/.config files
│ ├── dot_zshrc # ~/.zshrc
│ └── ...
└── README.md

Cursor Extensions Script

This repo includes a Cursor extensions manager to keep extensions reproducible across machines.

It reads/writes the extension list at home/dot_config/Cursor/extensions.txt.

Usage

# Interactive menu
./manage.sh cursor
# Export currently installed extensions to extensions.txt
./manage.sh cursor export# Install all extensions from extensions.txt
./manage.sh cursor install

Notes

  • Requires the cursor CLI in your PATH.
  • install is idempotent: already-installed extensions are skipped/reinstalled safely.

Adding a New Distribution

  1. Create install/distros/<distro>.sh with package manager functions
  2. Create packages/<distro>/base.yaml with package names
  3. Add distro-specific packages to packages/groups/*.yaml
  4. Update install/lib/detect.sh if needed

Three distro families are already supported: Arch, Fedora, and Debian/Ubuntu (see install/distros/debian.sh for a real example).

Manual Chezmoi Usage

If you previously used GNU Stow, this is the main behavior change to keep in mind:

  • Stow mental model: repo files are symlinked into $HOME, so editing the repo is "live" immediately.
  • Chezmoi mental model: repo files are the source state and your home directory is the target state. Changes are applied when you run chezmoi apply (or related commands).

First-time setup (manual)

# Initialize chezmoi with this repo
chezmoi init --source=~/dotfiles/home
# Verify source is correct (important)
chezmoi source-path

Daily commands (most useful)

# See what would change before touching your home files
chezmoi diff
# Apply source state to your home directory
chezmoi apply
# Edit a managed file safely (writes back to source state)
chezmoi edit ~/.zshrc
# Check what changed in source state
chezmoi status
# Pull and apply latest changes from your remote dotfiles repo
chezmoi update

Typical workflow after editing this repo

cd~/dotfiles
git pull
chezmoi diff
chezmoi apply

Can Chezmoi auto-apply?

Yes, but it is not the default behavior.

  • Recommended default: keep manual chezmoi diff + chezmoi apply so changes are explicit.
  • Possible auto-apply: run a file watcher (e.g. inotifywait/entr) or a user systemd path service that triggers chezmoi apply when files in ~/dotfiles/home change.
  • Caveat: fully automatic apply can surprise you during partial edits; many users prefer explicit applies for safer config management.

Post-Installation

After running the installer:

  1. Log out and back in for shell changes to take effect
  2. Start tmux and press Ctrl+b I to install tmux plugins
  3. Add SSH key to GitHub/GitLab (displayed during setup)
  4. Hyprland users: Press Super+? to see keybindings
  5. Niri users: Log out, choose Niri in your display manager, log back in
  6. Dark/light mode: Press Mod+N to toggle between Catppuccin Mocha and Latte
  7. Plymouth: Reboot to see the boot splash (if configured during install)

Included Configurations

  • Shell: zsh with starship prompt, zoxide, television
  • Terminal: kitty
  • Editor: Neovim (AstroNvim-based), Cursor
  • Git: delta for diffs, lazygit
  • Multiplexer: tmux with TPM
  • File Manager: yazi, dolphin
  • Hyprland: hypridle, hyprlock, hyprpaper, hyprshot, waybar, rofi, mako, wlogout
  • Niri: niri with waybar, rofi, mako, wlogout (scrollable tiling Wayland compositor)
  • AI: hyprvoice dictation with local Whisper speech recognition

Credits

Hyprland configuration originally inspired by ml4w starter kit.

License

MIT License - see LICENSE for details.

About

My dotfiles handled with GNU stow

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Dotfiles

Personal dotfiles for Arch Linux, Fedora, and Debian/Ubuntu with optional Hyprland or Niri desktop support.

Features

  • Multi-distro support: Works on Arch Linux, Fedora, and Debian/Ubuntu (extensible to other distros)
  • Desktop or terminal mode: Choose a full desktop setup or a lightweight terminal-only install
  • Interactive installer: Beautiful TUI prompts using gum
  • Modular packages: Choose what to install (Hyprland, Niri, Development, Gaming, AI, etc.)
  • Chezmoi-powered: Smart dotfile management with templates and conditional installation
  • Easy to extend: Add new distros or package groups with simple YAML files

Quick Start

# Clone the repository
git clone https://github.com/yourusername/dotfiles.git ~/dotfiles
cd~/dotfiles
# Run the interactive management menu
./manage.sh
# Or run the installer directly
./manage.sh setup

The interactive installer will:

  1. Detect your distribution
  2. Choose setup type (Desktop or Terminal)
  3. Let you choose package groups to install
  4. Install all selected packages
  5. Apply dotfiles using Chezmoi
  6. Enable required services
  7. Set up SSH keys and shell

Package Groups

GroupDescription
HyprlandHyprland compositor with hypridle, hyprlock, hyprpaper, hyprshot, waybar, rofi, mako, wlogout, clipboard tooling (cliphist, wl-clipboard) and Wayland helpers
NiriNiri scrollable tiling compositor with Wayland desktop tools (waybar, rofi, mako, wlogout, sddm, clipboard, screenshots)
Developmentneovim, Cursor, Git tooling (gh, lazygit, delta), containers (docker, docker-compose, lazydocker), and build/task tools (cmake, gcc/base-devel, just)
GamingSteam + Discord with performance helpers (mangohud, gamemode)
MultimediaMedia and creation tools (mpv, obs-studio, ffmpeg, ImageMagick, GIMP, Inkscape)
ProductivityFile managers (Dolphin + Yazi), thumbnail support (ffmpegthumbnailer, kdegraphics-thumbnailers), BTRFS snapshots (snapper, snap-pac/python3-dnf-plugin-snapper, grub-btrfs), communication/browser apps (Slack, Chrome), archive tools, and themes/icons
AIAI-powered desktop tools: hyprvoice speech-to-text dictation with local Whisper models

Structure

dotfiles/
├── manage.sh # Management script (single entry point)
├── tools/
│ ├── setup.sh # Bootstrap script (installs gum + git, runs installer)
│ └── manage-cursor-extensions.sh # Export/install Cursor extensions list
├── install/
│ ├── installer.sh # Main interactive installer
│ ├── distros/
│ │ ├── arch.sh # Arch Linux package functions
│ │ ├── fedora.sh # Fedora package functions
│ │ └── debian.sh # Debian/Ubuntu package functions
│ └── lib/
│ ├── common.sh # Shared utilities
│ ├── detect.sh # Distro detection
│ ├── services.sh # Service management
│ └── tree_select.py # Interactive package selector TUI
├── packages/
│ ├── common.yaml # Cross-distro tools (zoxide, volta, etc.)
│ ├── arch/
│ │ └── base.yaml # Arch base packages
│ ├── fedora/
│ │ └── base.yaml # Fedora base packages
│ ├── debian/
│ │ └── base.yaml # Debian/Ubuntu base packages
│ └── groups/
│ ├── hyprland.yaml # Hyprland + Wayland tools
│ ├── niri.yaml # Niri compositor + Wayland tools
│ ├── development.yaml # Dev tools
│ ├── gaming.yaml # Gaming packages
│ ├── multimedia.yaml # Media tools
│ ├── productivity.yaml
│ └── ai.yaml # AI tools (dictation, Whisper)
├── home/ # Chezmoi source directory
│ ├── .chezmoiignore # Conditional dotfile rules
│ ├── dot_config/ # ~/.config files
│ ├── dot_zshrc # ~/.zshrc
│ └── ...
└── README.md

Cursor Extensions Script

This repo includes a Cursor extensions manager to keep extensions reproducible across machines.

It reads/writes the extension list at home/dot_config/Cursor/extensions.txt.

Usage

# Interactive menu
./manage.sh cursor
# Export currently installed extensions to extensions.txt
./manage.sh cursor export# Install all extensions from extensions.txt
./manage.sh cursor install

Notes

  • Requires the cursor CLI in your PATH.
  • install is idempotent: already-installed extensions are skipped/reinstalled safely.

Adding a New Distribution

  1. Create install/distros/<distro>.sh with package manager functions
  2. Create packages/<distro>/base.yaml with package names
  3. Add distro-specific packages to packages/groups/*.yaml
  4. Update install/lib/detect.sh if needed

Three distro families are already supported: Arch, Fedora, and Debian/Ubuntu (see install/distros/debian.sh for a real example).

Manual Chezmoi Usage

If you previously used GNU Stow, this is the main behavior change to keep in mind:

  • Stow mental model: repo files are symlinked into $HOME, so editing the repo is "live" immediately.
  • Chezmoi mental model: repo files are the source state and your home directory is the target state. Changes are applied when you run chezmoi apply (or related commands).

First-time setup (manual)

# Initialize chezmoi with this repo
chezmoi init --source=~/dotfiles/home
# Verify source is correct (important)
chezmoi source-path

Daily commands (most useful)

# See what would change before touching your home files
chezmoi diff
# Apply source state to your home directory
chezmoi apply
# Edit a managed file safely (writes back to source state)
chezmoi edit ~/.zshrc
# Check what changed in source state
chezmoi status
# Pull and apply latest changes from your remote dotfiles repo
chezmoi update

Typical workflow after editing this repo

cd~/dotfiles
git pull
chezmoi diff
chezmoi apply

Can Chezmoi auto-apply?

Yes, but it is not the default behavior.

  • Recommended default: keep manual chezmoi diff + chezmoi apply so changes are explicit.
  • Possible auto-apply: run a file watcher (e.g. inotifywait/entr) or a user systemd path service that triggers chezmoi apply when files in ~/dotfiles/home change.
  • Caveat: fully automatic apply can surprise you during partial edits; many users prefer explicit applies for safer config management.

Post-Installation

After running the installer:

  1. Log out and back in for shell changes to take effect
  2. Start tmux and press Ctrl+b I to install tmux plugins
  3. Add SSH key to GitHub/GitLab (displayed during setup)
  4. Hyprland users: Press Super+? to see keybindings
  5. Niri users: Log out, choose Niri in your display manager, log back in
  6. Dark/light mode: Press Mod+N to toggle between Catppuccin Mocha and Latte
  7. Plymouth: Reboot to see the boot splash (if configured during install)

Included Configurations

  • Shell: zsh with starship prompt, zoxide, television
  • Terminal: kitty
  • Editor: Neovim (AstroNvim-based), Cursor
  • Git: delta for diffs, lazygit
  • Multiplexer: tmux with TPM
  • File Manager: yazi, dolphin
  • Hyprland: hypridle, hyprlock, hyprpaper, hyprshot, waybar, rofi, mako, wlogout
  • Niri: niri with waybar, rofi, mako, wlogout (scrollable tiling Wayland compositor)
  • AI: hyprvoice dictation with local Whisper speech recognition

Credits

Hyprland configuration originally inspired by ml4w starter kit.

License

MIT License - see LICENSE for details.

About

My dotfiles handled with GNU stow

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Dotfiles

Personal dotfiles for Arch Linux, Fedora, and Debian/Ubuntu with optional Hyprland or Niri desktop support.

Features

  • Multi-distro support: Works on Arch Linux, Fedora, and Debian/Ubuntu (extensible to other distros)
  • Desktop or terminal mode: Choose a full desktop setup or a lightweight terminal-only install
  • Interactive installer: Beautiful TUI prompts using gum
  • Modular packages: Choose what to install (Hyprland, Niri, Development, Gaming, AI, etc.)
  • Chezmoi-powered: Smart dotfile management with templates and conditional installation
  • Easy to extend: Add new distros or package groups with simple YAML files

Quick Start

# Clone the repository
git clone https://github.com/yourusername/dotfiles.git ~/dotfiles
cd~/dotfiles
# Run the interactive management menu
./manage.sh
# Or run the installer directly
./manage.sh setup

The interactive installer will:

  1. Detect your distribution
  2. Choose setup type (Desktop or Terminal)
  3. Let you choose package groups to install
  4. Install all selected packages
  5. Apply dotfiles using Chezmoi
  6. Enable required services
  7. Set up SSH keys and shell

Package Groups

GroupDescription
HyprlandHyprland compositor with hypridle, hyprlock, hyprpaper, hyprshot, waybar, rofi, mako, wlogout, clipboard tooling (cliphist, wl-clipboard) and Wayland helpers
NiriNiri scrollable tiling compositor with Wayland desktop tools (waybar, rofi, mako, wlogout, sddm, clipboard, screenshots)
Developmentneovim, Cursor, Git tooling (gh, lazygit, delta), containers (docker, docker-compose, lazydocker), and build/task tools (cmake, gcc/base-devel, just)
GamingSteam + Discord with performance helpers (mangohud, gamemode)
MultimediaMedia and creation tools (mpv, obs-studio, ffmpeg, ImageMagick, GIMP, Inkscape)
ProductivityFile managers (Dolphin + Yazi), thumbnail support (ffmpegthumbnailer, kdegraphics-thumbnailers), BTRFS snapshots (snapper, snap-pac/python3-dnf-plugin-snapper, grub-btrfs), communication/browser apps (Slack, Chrome), archive tools, and themes/icons
AIAI-powered desktop tools: hyprvoice speech-to-text dictation with local Whisper models

Structure

dotfiles/
├── manage.sh # Management script (single entry point)
├── tools/
│ ├── setup.sh # Bootstrap script (installs gum + git, runs installer)
│ └── manage-cursor-extensions.sh # Export/install Cursor extensions list
├── install/
│ ├── installer.sh # Main interactive installer
│ ├── distros/
│ │ ├── arch.sh # Arch Linux package functions
│ │ ├── fedora.sh # Fedora package functions
│ │ └── debian.sh # Debian/Ubuntu package functions
│ └── lib/
│ ├── common.sh # Shared utilities
│ ├── detect.sh # Distro detection
│ ├── services.sh # Service management
│ └── tree_select.py # Interactive package selector TUI
├── packages/
│ ├── common.yaml # Cross-distro tools (zoxide, volta, etc.)
│ ├── arch/
│ │ └── base.yaml # Arch base packages
│ ├── fedora/
│ │ └── base.yaml # Fedora base packages
│ ├── debian/
│ │ └── base.yaml # Debian/Ubuntu base packages
│ └── groups/
│ ├── hyprland.yaml # Hyprland + Wayland tools
│ ├── niri.yaml # Niri compositor + Wayland tools
│ ├── development.yaml # Dev tools
│ ├── gaming.yaml # Gaming packages
│ ├── multimedia.yaml # Media tools
│ ├── productivity.yaml
│ └── ai.yaml # AI tools (dictation, Whisper)
├── home/ # Chezmoi source directory
│ ├── .chezmoiignore # Conditional dotfile rules
│ ├── dot_config/ # ~/.config files
│ ├── dot_zshrc # ~/.zshrc
│ └── ...
└── README.md

Cursor Extensions Script

This repo includes a Cursor extensions manager to keep extensions reproducible across machines.

It reads/writes the extension list at home/dot_config/Cursor/extensions.txt.

Usage

# Interactive menu
./manage.sh cursor
# Export currently installed extensions to extensions.txt
./manage.sh cursor export# Install all extensions from extensions.txt
./manage.sh cursor install

Notes

  • Requires the cursor CLI in your PATH.
  • install is idempotent: already-installed extensions are skipped/reinstalled safely.

Adding a New Distribution

  1. Create install/distros/<distro>.sh with package manager functions
  2. Create packages/<distro>/base.yaml with package names
  3. Add distro-specific packages to packages/groups/*.yaml
  4. Update install/lib/detect.sh if needed

Three distro families are already supported: Arch, Fedora, and Debian/Ubuntu (see install/distros/debian.sh for a real example).

Manual Chezmoi Usage

If you previously used GNU Stow, this is the main behavior change to keep in mind:

  • Stow mental model: repo files are symlinked into $HOME, so editing the repo is "live" immediately.
  • Chezmoi mental model: repo files are the source state and your home directory is the target state. Changes are applied when you run chezmoi apply (or related commands).

First-time setup (manual)

# Initialize chezmoi with this repo
chezmoi init --source=~/dotfiles/home
# Verify source is correct (important)
chezmoi source-path

Daily commands (most useful)

# See what would change before touching your home files
chezmoi diff
# Apply source state to your home directory
chezmoi apply
# Edit a managed file safely (writes back to source state)
chezmoi edit ~/.zshrc
# Check what changed in source state
chezmoi status
# Pull and apply latest changes from your remote dotfiles repo
chezmoi update

Typical workflow after editing this repo

cd~/dotfiles
git pull
chezmoi diff
chezmoi apply

Can Chezmoi auto-apply?

Yes, but it is not the default behavior.

  • Recommended default: keep manual chezmoi diff + chezmoi apply so changes are explicit.
  • Possible auto-apply: run a file watcher (e.g. inotifywait/entr) or a user systemd path service that triggers chezmoi apply when files in ~/dotfiles/home change.
  • Caveat: fully automatic apply can surprise you during partial edits; many users prefer explicit applies for safer config management.

Post-Installation

After running the installer:

  1. Log out and back in for shell changes to take effect
  2. Start tmux and press Ctrl+b I to install tmux plugins
  3. Add SSH key to GitHub/GitLab (displayed during setup)
  4. Hyprland users: Press Super+? to see keybindings
  5. Niri users: Log out, choose Niri in your display manager, log back in
  6. Dark/light mode: Press Mod+N to toggle between Catppuccin Mocha and Latte
  7. Plymouth: Reboot to see the boot splash (if configured during install)

Included Configurations

  • Shell: zsh with starship prompt, zoxide, television
  • Terminal: kitty
  • Editor: Neovim (AstroNvim-based), Cursor
  • Git: delta for diffs, lazygit
  • Multiplexer: tmux with TPM
  • File Manager: yazi, dolphin
  • Hyprland: hypridle, hyprlock, hyprpaper, hyprshot, waybar, rofi, mako, wlogout
  • Niri: niri with waybar, rofi, mako, wlogout (scrollable tiling Wayland compositor)
  • AI: hyprvoice dictation with local Whisper speech recognition

Credits

Hyprland configuration originally inspired by ml4w starter kit.

License

MIT License - see LICENSE for details.

About

My dotfiles handled with GNU stow

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Dotfiles

Personal dotfiles for Arch Linux, Fedora, and Debian/Ubuntu with optional Hyprland or Niri desktop support.

Features

  • Multi-distro support: Works on Arch Linux, Fedora, and Debian/Ubuntu (extensible to other distros)
  • Desktop or terminal mode: Choose a full desktop setup or a lightweight terminal-only install
  • Interactive installer: Beautiful TUI prompts using gum
  • Modular packages: Choose what to install (Hyprland, Niri, Development, Gaming, AI, etc.)
  • Chezmoi-powered: Smart dotfile management with templates and conditional installation
  • Easy to extend: Add new distros or package groups with simple YAML files

Quick Start

# Clone the repository
git clone https://github.com/yourusername/dotfiles.git ~/dotfiles
cd~/dotfiles
# Run the interactive management menu
./manage.sh
# Or run the installer directly
./manage.sh setup

The interactive installer will:

  1. Detect your distribution
  2. Choose setup type (Desktop or Terminal)
  3. Let you choose package groups to install
  4. Install all selected packages
  5. Apply dotfiles using Chezmoi
  6. Enable required services
  7. Set up SSH keys and shell

Package Groups

GroupDescription
HyprlandHyprland compositor with hypridle, hyprlock, hyprpaper, hyprshot, waybar, rofi, mako, wlogout, clipboard tooling (cliphist, wl-clipboard) and Wayland helpers
NiriNiri scrollable tiling compositor with Wayland desktop tools (waybar, rofi, mako, wlogout, sddm, clipboard, screenshots)
Developmentneovim, Cursor, Git tooling (gh, lazygit, delta), containers (docker, docker-compose, lazydocker), and build/task tools (cmake, gcc/base-devel, just)
GamingSteam + Discord with performance helpers (mangohud, gamemode)
MultimediaMedia and creation tools (mpv, obs-studio, ffmpeg, ImageMagick, GIMP, Inkscape)
ProductivityFile managers (Dolphin + Yazi), thumbnail support (ffmpegthumbnailer, kdegraphics-thumbnailers), BTRFS snapshots (snapper, snap-pac/python3-dnf-plugin-snapper, grub-btrfs), communication/browser apps (Slack, Chrome), archive tools, and themes/icons
AIAI-powered desktop tools: hyprvoice speech-to-text dictation with local Whisper models

Structure

dotfiles/
├── manage.sh # Management script (single entry point)
├── tools/
│ ├── setup.sh # Bootstrap script (installs gum + git, runs installer)
│ └── manage-cursor-extensions.sh # Export/install Cursor extensions list
├── install/
│ ├── installer.sh # Main interactive installer
│ ├── distros/
│ │ ├── arch.sh # Arch Linux package functions
│ │ ├── fedora.sh # Fedora package functions
│ │ └── debian.sh # Debian/Ubuntu package functions
│ └── lib/
│ ├── common.sh # Shared utilities
│ ├── detect.sh # Distro detection
│ ├── services.sh # Service management
│ └── tree_select.py # Interactive package selector TUI
├── packages/
│ ├── common.yaml # Cross-distro tools (zoxide, volta, etc.)
│ ├── arch/
│ │ └── base.yaml # Arch base packages
│ ├── fedora/
│ │ └── base.yaml # Fedora base packages
│ ├── debian/
│ │ └── base.yaml # Debian/Ubuntu base packages
│ └── groups/
│ ├── hyprland.yaml # Hyprland + Wayland tools
│ ├── niri.yaml # Niri compositor + Wayland tools
│ ├── development.yaml # Dev tools
│ ├── gaming.yaml # Gaming packages
│ ├── multimedia.yaml # Media tools
│ ├── productivity.yaml
│ └── ai.yaml # AI tools (dictation, Whisper)
├── home/ # Chezmoi source directory
│ ├── .chezmoiignore # Conditional dotfile rules
│ ├── dot_config/ # ~/.config files
│ ├── dot_zshrc # ~/.zshrc
│ └── ...
└── README.md

Cursor Extensions Script

This repo includes a Cursor extensions manager to keep extensions reproducible across machines.

It reads/writes the extension list at home/dot_config/Cursor/extensions.txt.

Usage

# Interactive menu
./manage.sh cursor
# Export currently installed extensions to extensions.txt
./manage.sh cursor export# Install all extensions from extensions.txt
./manage.sh cursor install

Notes

  • Requires the cursor CLI in your PATH.
  • install is idempotent: already-installed extensions are skipped/reinstalled safely.

Adding a New Distribution

  1. Create install/distros/<distro>.sh with package manager functions
  2. Create packages/<distro>/base.yaml with package names
  3. Add distro-specific packages to packages/groups/*.yaml
  4. Update install/lib/detect.sh if needed

Three distro families are already supported: Arch, Fedora, and Debian/Ubuntu (see install/distros/debian.sh for a real example).

Manual Chezmoi Usage

If you previously used GNU Stow, this is the main behavior change to keep in mind:

  • Stow mental model: repo files are symlinked into $HOME, so editing the repo is "live" immediately.
  • Chezmoi mental model: repo files are the source state and your home directory is the target state. Changes are applied when you run chezmoi apply (or related commands).

First-time setup (manual)

# Initialize chezmoi with this repo
chezmoi init --source=~/dotfiles/home
# Verify source is correct (important)
chezmoi source-path

Daily commands (most useful)

# See what would change before touching your home files
chezmoi diff
# Apply source state to your home directory
chezmoi apply
# Edit a managed file safely (writes back to source state)
chezmoi edit ~/.zshrc
# Check what changed in source state
chezmoi status
# Pull and apply latest changes from your remote dotfiles repo
chezmoi update

Typical workflow after editing this repo

cd~/dotfiles
git pull
chezmoi diff
chezmoi apply

Can Chezmoi auto-apply?

Yes, but it is not the default behavior.

  • Recommended default: keep manual chezmoi diff + chezmoi apply so changes are explicit.
  • Possible auto-apply: run a file watcher (e.g. inotifywait/entr) or a user systemd path service that triggers chezmoi apply when files in ~/dotfiles/home change.
  • Caveat: fully automatic apply can surprise you during partial edits; many users prefer explicit applies for safer config management.

Post-Installation

After running the installer:

  1. Log out and back in for shell changes to take effect
  2. Start tmux and press Ctrl+b I to install tmux plugins
  3. Add SSH key to GitHub/GitLab (displayed during setup)
  4. Hyprland users: Press Super+? to see keybindings
  5. Niri users: Log out, choose Niri in your display manager, log back in
  6. Dark/light mode: Press Mod+N to toggle between Catppuccin Mocha and Latte
  7. Plymouth: Reboot to see the boot splash (if configured during install)

Included Configurations

  • Shell: zsh with starship prompt, zoxide, television
  • Terminal: kitty
  • Editor: Neovim (AstroNvim-based), Cursor
  • Git: delta for diffs, lazygit
  • Multiplexer: tmux with TPM
  • File Manager: yazi, dolphin
  • Hyprland: hypridle, hyprlock, hyprpaper, hyprshot, waybar, rofi, mako, wlogout
  • Niri: niri with waybar, rofi, mako, wlogout (scrollable tiling Wayland compositor)
  • AI: hyprvoice dictation with local Whisper speech recognition

Credits

Hyprland configuration originally inspired by ml4w starter kit.

License

MIT License - see LICENSE for details.

About

My dotfiles handled with GNU stow

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Dotfiles

Personal dotfiles for Arch Linux, Fedora, and Debian/Ubuntu with optional Hyprland or Niri desktop support.

Features

  • Multi-distro support: Works on Arch Linux, Fedora, and Debian/Ubuntu (extensible to other distros)
  • Desktop or terminal mode: Choose a full desktop setup or a lightweight terminal-only install
  • Interactive installer: Beautiful TUI prompts using gum
  • Modular packages: Choose what to install (Hyprland, Niri, Development, Gaming, AI, etc.)
  • Chezmoi-powered: Smart dotfile management with templates and conditional installation
  • Easy to extend: Add new distros or package groups with simple YAML files

Quick Start

# Clone the repository
git clone https://github.com/yourusername/dotfiles.git ~/dotfiles
cd~/dotfiles
# Run the interactive management menu
./manage.sh
# Or run the installer directly
./manage.sh setup

The interactive installer will:

  1. Detect your distribution
  2. Choose setup type (Desktop or Terminal)
  3. Let you choose package groups to install
  4. Install all selected packages
  5. Apply dotfiles using Chezmoi
  6. Enable required services
  7. Set up SSH keys and shell

Package Groups

GroupDescription
HyprlandHyprland compositor with hypridle, hyprlock, hyprpaper, hyprshot, waybar, rofi, mako, wlogout, clipboard tooling (cliphist, wl-clipboard) and Wayland helpers
NiriNiri scrollable tiling compositor with Wayland desktop tools (waybar, rofi, mako, wlogout, sddm, clipboard, screenshots)
Developmentneovim, Cursor, Git tooling (gh, lazygit, delta), containers (docker, docker-compose, lazydocker), and build/task tools (cmake, gcc/base-devel, just)
GamingSteam + Discord with performance helpers (mangohud, gamemode)
MultimediaMedia and creation tools (mpv, obs-studio, ffmpeg, ImageMagick, GIMP, Inkscape)
ProductivityFile managers (Dolphin + Yazi), thumbnail support (ffmpegthumbnailer, kdegraphics-thumbnailers), BTRFS snapshots (snapper, snap-pac/python3-dnf-plugin-snapper, grub-btrfs), communication/browser apps (Slack, Chrome), archive tools, and themes/icons
AIAI-powered desktop tools: hyprvoice speech-to-text dictation with local Whisper models

Structure

dotfiles/
├── manage.sh # Management script (single entry point)
├── tools/
│ ├── setup.sh # Bootstrap script (installs gum + git, runs installer)
│ └── manage-cursor-extensions.sh # Export/install Cursor extensions list
├── install/
│ ├── installer.sh # Main interactive installer
│ ├── distros/
│ │ ├── arch.sh # Arch Linux package functions
│ │ ├── fedora.sh # Fedora package functions
│ │ └── debian.sh # Debian/Ubuntu package functions
│ └── lib/
│ ├── common.sh # Shared utilities
│ ├── detect.sh # Distro detection
│ ├── services.sh # Service management
│ └── tree_select.py # Interactive package selector TUI
├── packages/
│ ├── common.yaml # Cross-distro tools (zoxide, volta, etc.)
│ ├── arch/
│ │ └── base.yaml # Arch base packages
│ ├── fedora/
│ │ └── base.yaml # Fedora base packages
│ ├── debian/
│ │ └── base.yaml # Debian/Ubuntu base packages
│ └── groups/
│ ├── hyprland.yaml # Hyprland + Wayland tools
│ ├── niri.yaml # Niri compositor + Wayland tools
│ ├── development.yaml # Dev tools
│ ├── gaming.yaml # Gaming packages
│ ├── multimedia.yaml # Media tools
│ ├── productivity.yaml
│ └── ai.yaml # AI tools (dictation, Whisper)
├── home/ # Chezmoi source directory
│ ├── .chezmoiignore # Conditional dotfile rules
│ ├── dot_config/ # ~/.config files
│ ├── dot_zshrc # ~/.zshrc
│ └── ...
└── README.md

Cursor Extensions Script

This repo includes a Cursor extensions manager to keep extensions reproducible across machines.

It reads/writes the extension list at home/dot_config/Cursor/extensions.txt.

Usage

# Interactive menu
./manage.sh cursor
# Export currently installed extensions to extensions.txt
./manage.sh cursor export# Install all extensions from extensions.txt
./manage.sh cursor install

Notes

  • Requires the cursor CLI in your PATH.
  • install is idempotent: already-installed extensions are skipped/reinstalled safely.

Adding a New Distribution

  1. Create install/distros/<distro>.sh with package manager functions
  2. Create packages/<distro>/base.yaml with package names
  3. Add distro-specific packages to packages/groups/*.yaml
  4. Update install/lib/detect.sh if needed

Three distro families are already supported: Arch, Fedora, and Debian/Ubuntu (see install/distros/debian.sh for a real example).

Manual Chezmoi Usage

If you previously used GNU Stow, this is the main behavior change to keep in mind:

  • Stow mental model: repo files are symlinked into $HOME, so editing the repo is "live" immediately.
  • Chezmoi mental model: repo files are the source state and your home directory is the target state. Changes are applied when you run chezmoi apply (or related commands).

First-time setup (manual)

# Initialize chezmoi with this repo
chezmoi init --source=~/dotfiles/home
# Verify source is correct (important)
chezmoi source-path

Daily commands (most useful)

# See what would change before touching your home files
chezmoi diff
# Apply source state to your home directory
chezmoi apply
# Edit a managed file safely (writes back to source state)
chezmoi edit ~/.zshrc
# Check what changed in source state
chezmoi status
# Pull and apply latest changes from your remote dotfiles repo
chezmoi update

Typical workflow after editing this repo

cd~/dotfiles
git pull
chezmoi diff
chezmoi apply

Can Chezmoi auto-apply?

Yes, but it is not the default behavior.

  • Recommended default: keep manual chezmoi diff + chezmoi apply so changes are explicit.
  • Possible auto-apply: run a file watcher (e.g. inotifywait/entr) or a user systemd path service that triggers chezmoi apply when files in ~/dotfiles/home change.
  • Caveat: fully automatic apply can surprise you during partial edits; many users prefer explicit applies for safer config management.

Post-Installation

After running the installer:

  1. Log out and back in for shell changes to take effect
  2. Start tmux and press Ctrl+b I to install tmux plugins
  3. Add SSH key to GitHub/GitLab (displayed during setup)
  4. Hyprland users: Press Super+? to see keybindings
  5. Niri users: Log out, choose Niri in your display manager, log back in
  6. Dark/light mode: Press Mod+N to toggle between Catppuccin Mocha and Latte
  7. Plymouth: Reboot to see the boot splash (if configured during install)

Included Configurations

  • Shell: zsh with starship prompt, zoxide, television
  • Terminal: kitty
  • Editor: Neovim (AstroNvim-based), Cursor
  • Git: delta for diffs, lazygit
  • Multiplexer: tmux with TPM
  • File Manager: yazi, dolphin
  • Hyprland: hypridle, hyprlock, hyprpaper, hyprshot, waybar, rofi, mako, wlogout
  • Niri: niri with waybar, rofi, mako, wlogout (scrollable tiling Wayland compositor)
  • AI: hyprvoice dictation with local Whisper speech recognition

Credits

Hyprland configuration originally inspired by ml4w starter kit.

License

MIT License - see LICENSE for details.

About

My dotfiles handled with GNU stow

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Dotfiles

Personal dotfiles for Arch Linux, Fedora, and Debian/Ubuntu with optional Hyprland or Niri desktop support.

Features

  • Multi-distro support: Works on Arch Linux, Fedora, and Debian/Ubuntu (extensible to other distros)
  • Desktop or terminal mode: Choose a full desktop setup or a lightweight terminal-only install
  • Interactive installer: Beautiful TUI prompts using gum
  • Modular packages: Choose what to install (Hyprland, Niri, Development, Gaming, AI, etc.)
  • Chezmoi-powered: Smart dotfile management with templates and conditional installation
  • Easy to extend: Add new distros or package groups with simple YAML files

Quick Start

# Clone the repository
git clone https://github.com/yourusername/dotfiles.git ~/dotfiles
cd~/dotfiles
# Run the interactive management menu
./manage.sh
# Or run the installer directly
./manage.sh setup

The interactive installer will:

  1. Detect your distribution
  2. Choose setup type (Desktop or Terminal)
  3. Let you choose package groups to install
  4. Install all selected packages
  5. Apply dotfiles using Chezmoi
  6. Enable required services
  7. Set up SSH keys and shell

Package Groups

GroupDescription
HyprlandHyprland compositor with hypridle, hyprlock, hyprpaper, hyprshot, waybar, rofi, mako, wlogout, clipboard tooling (cliphist, wl-clipboard) and Wayland helpers
NiriNiri scrollable tiling compositor with Wayland desktop tools (waybar, rofi, mako, wlogout, sddm, clipboard, screenshots)
Developmentneovim, Cursor, Git tooling (gh, lazygit, delta), containers (docker, docker-compose, lazydocker), and build/task tools (cmake, gcc/base-devel, just)
GamingSteam + Discord with performance helpers (mangohud, gamemode)
MultimediaMedia and creation tools (mpv, obs-studio, ffmpeg, ImageMagick, GIMP, Inkscape)
ProductivityFile managers (Dolphin + Yazi), thumbnail support (ffmpegthumbnailer, kdegraphics-thumbnailers), BTRFS snapshots (snapper, snap-pac/python3-dnf-plugin-snapper, grub-btrfs), communication/browser apps (Slack, Chrome), archive tools, and themes/icons
AIAI-powered desktop tools: hyprvoice speech-to-text dictation with local Whisper models

Structure

dotfiles/
├── manage.sh # Management script (single entry point)
├── tools/
│ ├── setup.sh # Bootstrap script (installs gum + git, runs installer)
│ └── manage-cursor-extensions.sh # Export/install Cursor extensions list
├── install/
│ ├── installer.sh # Main interactive installer
│ ├── distros/
│ │ ├── arch.sh # Arch Linux package functions
│ │ ├── fedora.sh # Fedora package functions
│ │ └── debian.sh # Debian/Ubuntu package functions
│ └── lib/
│ ├── common.sh # Shared utilities
│ ├── detect.sh # Distro detection
│ ├── services.sh # Service management
│ └── tree_select.py # Interactive package selector TUI
├── packages/
│ ├── common.yaml # Cross-distro tools (zoxide, volta, etc.)
│ ├── arch/
│ │ └── base.yaml # Arch base packages
│ ├── fedora/
│ │ └── base.yaml # Fedora base packages
│ ├── debian/
│ │ └── base.yaml # Debian/Ubuntu base packages
│ └── groups/
│ ├── hyprland.yaml # Hyprland + Wayland tools
│ ├── niri.yaml # Niri compositor + Wayland tools
│ ├── development.yaml # Dev tools
│ ├── gaming.yaml # Gaming packages
│ ├── multimedia.yaml # Media tools
│ ├── productivity.yaml
│ └── ai.yaml # AI tools (dictation, Whisper)
├── home/ # Chezmoi source directory
│ ├── .chezmoiignore # Conditional dotfile rules
│ ├── dot_config/ # ~/.config files
│ ├── dot_zshrc # ~/.zshrc
│ └── ...
└── README.md

Cursor Extensions Script

This repo includes a Cursor extensions manager to keep extensions reproducible across machines.

It reads/writes the extension list at home/dot_config/Cursor/extensions.txt.

Usage

# Interactive menu
./manage.sh cursor
# Export currently installed extensions to extensions.txt
./manage.sh cursor export# Install all extensions from extensions.txt
./manage.sh cursor install

Notes

  • Requires the cursor CLI in your PATH.
  • install is idempotent: already-installed extensions are skipped/reinstalled safely.

Adding a New Distribution

  1. Create install/distros/<distro>.sh with package manager functions
  2. Create packages/<distro>/base.yaml with package names
  3. Add distro-specific packages to packages/groups/*.yaml
  4. Update install/lib/detect.sh if needed

Three distro families are already supported: Arch, Fedora, and Debian/Ubuntu (see install/distros/debian.sh for a real example).

Manual Chezmoi Usage

If you previously used GNU Stow, this is the main behavior change to keep in mind:

  • Stow mental model: repo files are symlinked into $HOME, so editing the repo is "live" immediately.
  • Chezmoi mental model: repo files are the source state and your home directory is the target state. Changes are applied when you run chezmoi apply (or related commands).

First-time setup (manual)

# Initialize chezmoi with this repo
chezmoi init --source=~/dotfiles/home
# Verify source is correct (important)
chezmoi source-path

Daily commands (most useful)

# See what would change before touching your home files
chezmoi diff
# Apply source state to your home directory
chezmoi apply
# Edit a managed file safely (writes back to source state)
chezmoi edit ~/.zshrc
# Check what changed in source state
chezmoi status
# Pull and apply latest changes from your remote dotfiles repo
chezmoi update

Typical workflow after editing this repo

cd~/dotfiles
git pull
chezmoi diff
chezmoi apply

Can Chezmoi auto-apply?

Yes, but it is not the default behavior.

  • Recommended default: keep manual chezmoi diff + chezmoi apply so changes are explicit.
  • Possible auto-apply: run a file watcher (e.g. inotifywait/entr) or a user systemd path service that triggers chezmoi apply when files in ~/dotfiles/home change.
  • Caveat: fully automatic apply can surprise you during partial edits; many users prefer explicit applies for safer config management.

Post-Installation

After running the installer:

  1. Log out and back in for shell changes to take effect
  2. Start tmux and press Ctrl+b I to install tmux plugins
  3. Add SSH key to GitHub/GitLab (displayed during setup)
  4. Hyprland users: Press Super+? to see keybindings
  5. Niri users: Log out, choose Niri in your display manager, log back in
  6. Dark/light mode: Press Mod+N to toggle between Catppuccin Mocha and Latte
  7. Plymouth: Reboot to see the boot splash (if configured during install)

Included Configurations

  • Shell: zsh with starship prompt, zoxide, television
  • Terminal: kitty
  • Editor: Neovim (AstroNvim-based), Cursor
  • Git: delta for diffs, lazygit
  • Multiplexer: tmux with TPM
  • File Manager: yazi, dolphin
  • Hyprland: hypridle, hyprlock, hyprpaper, hyprshot, waybar, rofi, mako, wlogout
  • Niri: niri with waybar, rofi, mako, wlogout (scrollable tiling Wayland compositor)
  • AI: hyprvoice dictation with local Whisper speech recognition

Credits

Hyprland configuration originally inspired by ml4w starter kit.

License

MIT License - see LICENSE for details.

About

My dotfiles handled with GNU stow

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Dotfiles

Personal dotfiles for Arch Linux, Fedora, and Debian/Ubuntu with optional Hyprland or Niri desktop support.

Features

  • Multi-distro support: Works on Arch Linux, Fedora, and Debian/Ubuntu (extensible to other distros)
  • Desktop or terminal mode: Choose a full desktop setup or a lightweight terminal-only install
  • Interactive installer: Beautiful TUI prompts using gum
  • Modular packages: Choose what to install (Hyprland, Niri, Development, Gaming, AI, etc.)
  • Chezmoi-powered: Smart dotfile management with templates and conditional installation
  • Easy to extend: Add new distros or package groups with simple YAML files

Quick Start

# Clone the repository
git clone https://github.com/yourusername/dotfiles.git ~/dotfiles
cd~/dotfiles
# Run the interactive management menu
./manage.sh
# Or run the installer directly
./manage.sh setup

The interactive installer will:

  1. Detect your distribution
  2. Choose setup type (Desktop or Terminal)
  3. Let you choose package groups to install
  4. Install all selected packages
  5. Apply dotfiles using Chezmoi
  6. Enable required services
  7. Set up SSH keys and shell

Package Groups

GroupDescription
HyprlandHyprland compositor with hypridle, hyprlock, hyprpaper, hyprshot, waybar, rofi, mako, wlogout, clipboard tooling (cliphist, wl-clipboard) and Wayland helpers
NiriNiri scrollable tiling compositor with Wayland desktop tools (waybar, rofi, mako, wlogout, sddm, clipboard, screenshots)
Developmentneovim, Cursor, Git tooling (gh, lazygit, delta), containers (docker, docker-compose, lazydocker), and build/task tools (cmake, gcc/base-devel, just)
GamingSteam + Discord with performance helpers (mangohud, gamemode)
MultimediaMedia and creation tools (mpv, obs-studio, ffmpeg, ImageMagick, GIMP, Inkscape)
ProductivityFile managers (Dolphin + Yazi), thumbnail support (ffmpegthumbnailer, kdegraphics-thumbnailers), BTRFS snapshots (snapper, snap-pac/python3-dnf-plugin-snapper, grub-btrfs), communication/browser apps (Slack, Chrome), archive tools, and themes/icons
AIAI-powered desktop tools: hyprvoice speech-to-text dictation with local Whisper models

Structure

dotfiles/
├── manage.sh # Management script (single entry point)
├── tools/
│ ├── setup.sh # Bootstrap script (installs gum + git, runs installer)
│ └── manage-cursor-extensions.sh # Export/install Cursor extensions list
├── install/
│ ├── installer.sh # Main interactive installer
│ ├── distros/
│ │ ├── arch.sh # Arch Linux package functions
│ │ ├── fedora.sh # Fedora package functions
│ │ └── debian.sh # Debian/Ubuntu package functions
│ └── lib/
│ ├── common.sh # Shared utilities
│ ├── detect.sh # Distro detection
│ ├── services.sh # Service management
│ └── tree_select.py # Interactive package selector TUI
├── packages/
│ ├── common.yaml # Cross-distro tools (zoxide, volta, etc.)
│ ├── arch/
│ │ └── base.yaml # Arch base packages
│ ├── fedora/
│ │ └── base.yaml # Fedora base packages
│ ├── debian/
│ │ └── base.yaml # Debian/Ubuntu base packages
│ └── groups/
│ ├── hyprland.yaml # Hyprland + Wayland tools
│ ├── niri.yaml # Niri compositor + Wayland tools
│ ├── development.yaml # Dev tools
│ ├── gaming.yaml # Gaming packages
│ ├── multimedia.yaml # Media tools
│ ├── productivity.yaml
│ └── ai.yaml # AI tools (dictation, Whisper)
├── home/ # Chezmoi source directory
│ ├── .chezmoiignore # Conditional dotfile rules
│ ├── dot_config/ # ~/.config files
│ ├── dot_zshrc # ~/.zshrc
│ └── ...
└── README.md

Cursor Extensions Script

This repo includes a Cursor extensions manager to keep extensions reproducible across machines.

It reads/writes the extension list at home/dot_config/Cursor/extensions.txt.

Usage

# Interactive menu
./manage.sh cursor
# Export currently installed extensions to extensions.txt
./manage.sh cursor export# Install all extensions from extensions.txt
./manage.sh cursor install

Notes

  • Requires the cursor CLI in your PATH.
  • install is idempotent: already-installed extensions are skipped/reinstalled safely.

Adding a New Distribution

  1. Create install/distros/<distro>.sh with package manager functions
  2. Create packages/<distro>/base.yaml with package names
  3. Add distro-specific packages to packages/groups/*.yaml
  4. Update install/lib/detect.sh if needed

Three distro families are already supported: Arch, Fedora, and Debian/Ubuntu (see install/distros/debian.sh for a real example).

Manual Chezmoi Usage

If you previously used GNU Stow, this is the main behavior change to keep in mind:

  • Stow mental model: repo files are symlinked into $HOME, so editing the repo is "live" immediately.
  • Chezmoi mental model: repo files are the source state and your home directory is the target state. Changes are applied when you run chezmoi apply (or related commands).

First-time setup (manual)

# Initialize chezmoi with this repo
chezmoi init --source=~/dotfiles/home
# Verify source is correct (important)
chezmoi source-path

Daily commands (most useful)

# See what would change before touching your home files
chezmoi diff
# Apply source state to your home directory
chezmoi apply
# Edit a managed file safely (writes back to source state)
chezmoi edit ~/.zshrc
# Check what changed in source state
chezmoi status
# Pull and apply latest changes from your remote dotfiles repo
chezmoi update

Typical workflow after editing this repo

cd~/dotfiles
git pull
chezmoi diff
chezmoi apply

Can Chezmoi auto-apply?

Yes, but it is not the default behavior.

  • Recommended default: keep manual chezmoi diff + chezmoi apply so changes are explicit.
  • Possible auto-apply: run a file watcher (e.g. inotifywait/entr) or a user systemd path service that triggers chezmoi apply when files in ~/dotfiles/home change.
  • Caveat: fully automatic apply can surprise you during partial edits; many users prefer explicit applies for safer config management.

Post-Installation

After running the installer:

  1. Log out and back in for shell changes to take effect
  2. Start tmux and press Ctrl+b I to install tmux plugins
  3. Add SSH key to GitHub/GitLab (displayed during setup)
  4. Hyprland users: Press Super+? to see keybindings
  5. Niri users: Log out, choose Niri in your display manager, log back in
  6. Dark/light mode: Press Mod+N to toggle between Catppuccin Mocha and Latte
  7. Plymouth: Reboot to see the boot splash (if configured during install)

Included Configurations

  • Shell: zsh with starship prompt, zoxide, television
  • Terminal: kitty
  • Editor: Neovim (AstroNvim-based), Cursor
  • Git: delta for diffs, lazygit
  • Multiplexer: tmux with TPM
  • File Manager: yazi, dolphin
  • Hyprland: hypridle, hyprlock, hyprpaper, hyprshot, waybar, rofi, mako, wlogout
  • Niri: niri with waybar, rofi, mako, wlogout (scrollable tiling Wayland compositor)
  • AI: hyprvoice dictation with local Whisper speech recognition

Credits

Hyprland configuration originally inspired by ml4w starter kit.

License

MIT License - see LICENSE for details.

About

My dotfiles handled with GNU stow

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages