Personal development environment configuration for Linux (Wayland / Sway).
dotfiles/
├── ansible/ # Ansible playbooks (install, backup, check_deps)
├── foot/ # Terminal emulator (foot)
├── git/ # Git global configuration
├── nvim/ # Neovim (0.11+) Lua configuration
├── starship/ # Starship prompt theme
├── sway/ # Sway window manager + reference guide
├── waybar/ # Status bar (waybar)
├── wofi/ # App launcher (wofi)
├── zsh/ # Zsh shell configuration
├── nvim_hints.md # Neovim plugin quickstart guide
└── LICENSE
Directory: ansible/
Ansible playbooks for managing this dotfiles repository. Requires only ansible-core and rsync — no extra collections needed.
sudo apt install ansible rsyncDeploys the dotfiles to the local user. The reverse of backup.yml: single files are copied with ansible.builtin.copy and directories are synced with rsync. Missing parent directories are created automatically.
Usage:
git clone https://github.com/pboueke/dotfiles ~/Repositories/dotfiles
ansible-playbook ~/Repositories/dotfiles/ansible/install.ymlWhat gets deployed:
| Repo | System |
|---|---|
zsh/.zshrc |
~/.zshrc |
git/.gitconfig |
~/.gitconfig |
starship/starship.toml |
~/.config/starship.toml |
nvim/ |
~/.config/nvim/ |
sway/ |
~/.config/sway/ |
waybar/ |
~/.config/waybar/ |
wofi/ |
~/.config/wofi/ |
foot/ |
~/.config/foot/ |
A report is printed at the end. Files are marked [COPIED] (updated), [OK] (already current), or [FAILED]. Directories are marked [SYNCED] (N files updated), [OK] (up to date), or [FAILED]. Any directories that had to be created are listed in a separate section.
On first Neovim launch, lazy.nvim will bootstrap itself and install all plugins automatically.
Copies the current configuration from the system into this repository. Handles single files with ansible.builtin.copy and directories with rsync (preserving permissions, deleting removed files).
Usage:
# Sync configs from system → repo (dry run friendly: inspect diff with git diff after)
ansible-playbook ansible/backup.yml
# Sync and automatically commit all changes with a timestamped message
ansible-playbook ansible/backup.yml -e auto_commit=trueWhat gets synced:
| Source (system) | Destination (repo) |
|---|---|
~/.zshrc |
zsh/.zshrc |
~/.gitconfig |
git/.gitconfig |
~/.config/starship.toml |
starship/starship.toml |
~/.config/nvim/ |
nvim/ |
~/.config/sway/ |
sway/ |
~/.config/waybar/ |
waybar/ |
~/.config/wofi/ |
wofi/ |
~/.config/foot/ |
foot/ |
The playbook can be run from any directory inside the repository — it resolves the repo root automatically via playbook_dir.
Checks whether every tool required by this repository is present and (where applicable) meets the minimum version. Produces a report at the end listing OK / MISSING / OUTDATED for each item.
Usage:
ansible-playbook ansible/check_deps.ymlWhat gets checked:
| Category | Items |
|---|---|
| Core | git, rsync |
| Shell | zsh, starship, oh-my-zsh, asdf |
| Build | make, gcc (required by telescope-fzf-native) |
| Neovim | nvim ≥ 0.11 |
| Sway ecosystem | sway, waybar, wofi, foot, mako, swaylock, swayidle, grim, slurp, wl-copy, brightnessctl, playerctl, wpctl |
| Fonts | FiraCode Nerd Font Mono |
For each missing item the report includes the apt package name or install URL.
File: zsh/.zshrc → ~/.zshrc
-
Framework: Oh My Zsh with plugins
gitandasdf -
Version manager: asdf for per-project language runtimes
-
Aliases:
Alias Command ssedp1Screenshot the eDP-1display viagrimsshdmia2Screenshot the HDMI-A-2display viagrim
Dependencies: oh-my-zsh, starship, asdf
Oh My Zsh custom plugins/themes: none — only the built-in
gitandasdfplugins are used. The custom directory contains only oh-my-zsh scaffolding examples.
File: starship/starship.toml → ~/.config/starship.toml
Starship is a fast, cross-shell prompt written in Rust.
Style: Bracketed segments preset — all modules use the \[content\] format for a clean, unambiguous look that works with any font.
Notable settings:
| Module | Setting | Effect |
|---|---|---|
cmd_duration |
min_time = 0 |
Shows execution time for every command, not just slow ones |
time |
disabled = false |
Clock is always visible in the prompt |
| All language modules | Bracket format | Language version shown as [python 3.x] when in a matching project |
The theme activates language/tool modules contextually — e.g. [py 3.13] appears only when inside a Python project, [node 20] when inside a Node project, etc.
File: git/.gitconfig → ~/.gitconfig
Useful aliases on top of the standard git CLI:
| Alias | Expands to |
|---|---|
st |
status -s |
ci |
commit |
co |
checkout |
br |
branch |
cp |
cherry-pick |
cl |
clone |
dc |
diff --cached |
diff |
diff --word-diff |
ls |
Formatted log with author, email, date, subject |
xl |
log --graph --decorate --all |
t1 |
Compact graph log with relative dates |
t2 |
Compact graph log with absolute dates |
la |
List all aliases |
Directory: sway/ → ~/.config/sway/
Sway is a Wayland compositor that is a drop-in replacement for i3.
Uses vim-style (hjkl) navigation and Super as the modifier key.
See sway/README.md for the full keybinding reference, addon guide, and i3 migration notes.
| Tool | Config | Purpose |
|---|---|---|
| waybar | waybar/ |
Status bar (workspaces, clock, battery, volume, network…) |
| wofi | wofi/ |
App launcher / run dialog |
| foot | foot/ |
Terminal emulator |
| mako | (no config in repo) | Notification daemon |
| swaylock | (inline in sway/config) | Screen locker |
| swayidle | (inline in sway/config) | Idle manager / DPMS |
| grim | (no config) | Screenshot capture |
| slurp | (no config) | Region selector for screenshots |
| wl-clipboard | (no config) | Wayland clipboard (wl-copy / wl-paste) |
| brightnessctl | (no config) | Backlight control |
| playerctl | (no config) | Media player control keys |
| wpctl | (no config) | PipeWire/WirePlumber volume control |
Install addons:
sudo apt install -y \
waybar wofi foot mako swaylock swayidle \
grim slurp wl-clipboard brightnessctl playerctl
# Allow brightness control without sudo
sudo usermod -aG video $USER$mod = Super key
| Shortcut | Action |
|---|---|
$mod+Return |
Open terminal (foot) |
$mod+d / $mod+Shift+d |
Launch app (wofi run / drun) |
$mod+Shift+q |
Kill window |
$mod+h/j/k/l |
Focus left/down/up/right |
$mod+Shift+h/j/k/l |
Move window |
$mod+1–0 |
Switch workspace |
$mod+Shift+1–0 |
Move window to workspace |
$mod+f |
Fullscreen |
$mod+Shift+Space |
Toggle floating |
$mod+b / $mod+v |
Split horizontal / vertical |
$mod+r |
Resize mode |
$mod+- / $mod+Shift+- |
Scratchpad show / send |
$mod+Shift+c |
Reload config |
$mod+Shift+e |
Exit sway |
Print |
Screenshot to file |
$mod+Print |
Screenshot region to file |
$mod+Shift+Print |
Screenshot region to clipboard |
Directory: waybar/ → ~/.config/waybar/
Monospace text-only bar with a gruvbox-inspired colour scheme.
Left: workspaces · mode indicator · scratchpad count Centre: active window title Right: idle inhibitor · volume · network · CPU · memory · temperature · brightness · battery · keyboard state · clock · tray
Waybar is started by sway via exec_always sh -c 'pkill -x waybar; waybar'
so it restarts automatically on $mod+Shift+c reload.
Directory: wofi/ → ~/.config/wofi/
Minimal GTK app launcher. Configured for drun mode (desktop entries) with 480×320px window, monospace font, case-insensitive search, and icons.
Directory: foot/ → ~/.config/foot/
Fast, Wayland-native terminal emulator.
| Setting | Value |
|---|---|
| Shell | /usr/bin/zsh (login shell) |
| Font | FiraCode Nerd Font Mono 11pt |
| Font size up | Ctrl++ / Ctrl+= |
| Font size down | Ctrl+- |
Directory: nvim/ → ~/.config/nvim/
Full Lua-based configuration using lazy.nvim as the plugin manager. Requires Neovim 0.11+.
nvim/
├── init.lua entry point: loads config, bootstraps lazy.nvim
└── lua/
├── config/
│ ├── options.lua vim options (numbers, indentation, clipboard, mouse…)
│ ├── keymaps.lua leader key (Space) + base window/search mappings
│ └── lazy.lua lazy.nvim bootstrap + plugin loader
└── plugins/
├── colorscheme.lua catppuccin (mocha)
├── telescope.lua fuzzy finder for files, grep, buffers, help
├── treesitter.lua syntax tree parsing, highlighting, indentation
├── lsp.lua Mason + mason-lspconfig + nvim-lspconfig
├── completion.lua nvim-cmp + LuaSnip + buffer/path/LSP sources
├── editor.lua Comment.nvim + nvim-surround + Grapple
├── git.lua vim-fugitive + gitsigns
├── files.lua oil.nvim file manager
└── syntax.lua vim-polyglot (syntax for 600+ languages)
| Plugin | Purpose |
|---|---|
| catppuccin/nvim | Colorscheme (mocha) |
| telescope.nvim | Fuzzy finder |
| nvim-treesitter | Syntax parsing, highlighting, indentation |
| mason.nvim | LSP / linter / formatter binary installer |
| mason-lspconfig.nvim | Bridges Mason with Neovim's built-in LSP |
| nvim-lspconfig | Server config data source (cmd, filetypes, root_dir) |
| nvim-cmp | Completion engine |
| LuaSnip | Snippet engine |
| Comment.nvim | Toggle comments (gcc, gc) |
| nvim-surround | Add/change/delete surrounding chars |
| grapple.nvim | File tagging and instant navigation |
| oil.nvim | Edit the filesystem like a buffer |
| vim-fugitive | Full Git porcelain inside Neovim |
| gitsigns.nvim | Git diff signs, per-hunk staging, inline blame |
| vim-polyglot | Syntax + indent for 600+ languages |
:MasonInstall pyright " Python
:MasonInstall ts_ls " TypeScript / JavaScript
:MasonInstall rust_analyzer " Rust
:MasonInstall gopls " Go
:MasonInstall clangd " C / C++See nvim_hints.md for the full plugin quickstart covering every plugin's keymaps, commands, and workflows.