Personal Linux setup — Hyprland, Niri, Waybar, Ghostty, tmux, Neovim, Bash, and Claude Code config. Bootstraps a new machine with one command.
git clone https://github.com/soophoo/dotfiles.git ~/dotfiles
cd ~/dotfiles && ./dev-envThe dev-env script installs packages, symlinks every config into the right place, wires up a pre-commit secret-scanner, and seeds a per-machine secrets file. Idempotent — safe to re-run after pulling updates.
| Path | Purpose |
|---|---|
.bashrc |
Bash setup: fzf, zoxide, eza/bat aliases, rgf fuzzy grep, secrets-env sourcing |
.tmux.conf |
tmux config |
.config/ghostty/ |
Ghostty terminal |
.config/hypr/ |
Hyprland WM (hyprlock, hypridle, lock script, monitor hotplug watcher) |
.config/niri/ |
Niri WM |
.config/waybar/ |
Waybar bar with custom scripts (network, runcat, spotify) and icons |
.config/nvim/ |
Neovim (Lua, lazy.nvim, telescope, completion plugins) |
.claude/agents/ |
Custom Claude Code agents |
.claude/skills/ |
User-authored Claude Code skills (plugin-managed skills NOT tracked) |
.claude/settings.json |
Claude Code settings (uses ${CONTEXT7_API_KEY} env var) |
dev-env |
Bootstrap script |
hooks/pre-commit |
Gitleaks secret-scan hook (symlinked into .git/hooks/) |
Never commit secrets. This repo went through a GitHub PAT leak once — the lessons are baked in:
- Real secrets live in
~/.config/secrets.env(mode600, outside the repo).~/.bashrcsources it. settings.jsonreferences env vars (e.g.${CONTEXT7_API_KEY}) — never literal keys.- Pre-commit hook runs
gitleakson every staged diff. Tested, will block commits on detection.
After running dev-env, edit ~/.config/secrets.env and fill in real tokens:
export GITHUB_PAT='github_pat_...'
export CONTEXT7_API_KEY='ctx7sk-...'After bootstrap, your shell gets:
| Trigger | What it does |
|---|---|
Ctrl+T |
Fuzzy file picker → inserts paths |
Alt+C |
Fuzzy directory picker → cd into selection |
Ctrl+R |
Fuzzy bash history search |
cd partial |
Frecency-based jump (zoxide) |
cdi |
fzf picker over visited dirs |
rgf <pattern> |
Live ripgrep + preview, opens match in $EDITOR |
ls / ll / la / lt |
eza with icons + git status |
cat file |
bat with syntax highlighting (use \cat for raw) |
Some Claude skills are managed outside this repo and need to be reinstalled per machine:
- Plugin-managed skills (the ones that live as symlinks into
~/.agents/skills/) — install through Claude's marketplace. dr-jskill— clone manually:git clone https://github.com/jdubois/dr-jskill ~/.claude/skills/dr-jskill.
Colors are generated from the current wallpaper by matugen and written to per-app palette files that the main configs source/@import:
| File | Consumed by |
|---|---|
.config/hypr/colors.conf |
hyprland.conf (source = ./colors.conf) — border colors |
.config/ghostty/colors |
ghostty/config (config-file = colors) — palette + cursor |
.config/waybar/colors.css |
waybar/style.css (@import "colors.css";) |
These files are marked Generated by matugen — do not edit. To re-theme: run matugen image <wallpaper> and reload Hyprland / Waybar / Ghostty.
.config/hypr/scripts/monitors-watch.sh (Python, despite the .sh name) listens on Hyprland's IPC socket and re-runs monitors.sh whenever a display is plugged or unplugged. Started once from hyprland.conf via exec-once, so external monitors auto-arrange on connect.
cd ~/dotfiles && git pull && ./dev-envmv ~/.config/foo ~/dotfiles/.config/foo
ln -s ~/dotfiles/.config/foo ~/.config/foo
git add .config/foo && git commit -m "track foo config"Or just re-run dev-env — it picks up any new directory under ~/dotfiles/.config/ automatically.