- Shell 69%
- Lua 31%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| aerospace/.config/aerospace | ||
| bash | ||
| bat/.config/bat | ||
| btop/.config/btop | ||
| colima/.config/colima | ||
| conda | ||
| direnv/.config/direnv | ||
| gh/.config/gh | ||
| git | ||
| hyprland/.config/hypr | ||
| launchd/Library/LaunchAgents | ||
| lazygit/.config/lazygit | ||
| mlx-server/.config/mlx-server | ||
| mpv/.config/mpv | ||
| nvim/.config | ||
| opencode/.config/opencode | ||
| openlogi/.config/openlogi | ||
| parallel/.parallel | ||
| rclone | ||
| shell-shared/.config/shell | ||
| starship/.config | ||
| systemd/.config/systemd/user | ||
| vim | ||
| wezterm | ||
| yt-dlp/.config/yt-dlp | ||
| zsh | ||
| .gitignore | ||
| .gitmodules | ||
| .luarc.json | ||
| .stowrc | ||
| default-apps | ||
| README.md | ||
| setup | ||
Dotfiles
Personal dotfiles managed with GNU Stow. macOS runs zsh, Linux runs bash, and
both shells behave the same: they source one shared layer in
shell-shared/.config/shell/.
Quick Start
git clone --recurse-submodules https://git.jfraeys.com/jfraeys/.dotfiles.git ~/.dotfiles
cd ~/.dotfiles
./setup
Shell layout
File (~/.config/shell/) |
Loaded by | Purpose |
|---|---|---|
env.sh |
.zshenv, .zprofile, .bash_profile, .bashrc |
Environment + PATH (idempotent, fork-free) |
aliases.sh, functions.sh |
.zshrc, .bashrc |
Shared aliases/functions (incl. open: code files → nvim) |
tools.sh |
.zshrc, .bashrc |
direnv, starship, zoxide, lazy pyenv/conda/mamba, OSC 7, ssh-agent |
fzf.sh, man-colours.sh |
.zshrc, .bashrc |
fzf bindings + theme-following colours, man page colours |
Only shell-specific parts stay per shell: zsh/.config/zsh/ (completion
system, zinit plugins) and bash/.bashrc (readline, bash-completion).
Packages
| Directory | Purpose |
|---|---|
vim/ |
Vim editor (fallback) |
nvim/ |
Neovim (submodule) |
git/ |
Git configuration + global ignore |
wezterm/ |
Terminal emulator (sessionizer is a submodule) |
btop/ |
System monitor |
bat/ |
cat replacement config |
mpv/ |
Media player |
shell-shared/ |
Shared shell layer (see above) |
openlogi/ |
Logitech device config (Logi Options+ alternative) |
zsh/ |
Zsh (macOS) |
aerospace/ |
macOS tiling window manager |
launchd/ |
macOS login agent: theme-watch (applies light/dark changes instantly) |
mlx-server/ |
Local MLX model serving (Apple Silicon) |
bash/ |
Bash (Linux) |
hyprland/ |
Linux tiling compositor |
systemd/ |
Linux user service: theme-watch |
rclone/ |
Cloud storage sync (Linux systemd unit) |
conda/ |
Conda package manager |
colima/ |
Docker runtime |
direnv/ |
Directory-specific env vars + stdlib extensions |
gh/ |
GitHub CLI |
lazygit/ |
Git TUI (nvim + delta) |
parallel/ |
GNU Parallel |
opencode/ |
OpenCode settings |
starship/ |
Cross-shell prompt |
yt-dlp/ |
Video downloader |
jupyter/, shpotify/ and firefox/ are machine-local (gitignored) but
still stowed by setup when present.
How It Works
The setup script detects your OS and stows appropriate configurations:
- Base (all platforms, including root): vim, nvim, git, wezterm, btop, bat, mpv, shell-shared, openlogi
- macOS only: zsh, aerospace, mlx-server, launchd
- Linux only: bash, hyprland, rclone, systemd
- Any user, any platform: conda, colima, direnv, gh, jupyter, parallel, shpotify, firefox, opencode, starship, yt-dlp, lazygit
~/.config/openlogi is linked as a whole directory, because the app saves by
write-and-rename (which replaces a file symlink); its runtime files there are
gitignored.
Light/dark theme
The OS appearance is the single source of truth. Most tools follow it with no
help because they use the terminal's ANSI palette (WezTerm switches scheme
itself; starship, fzf, bat, delta, btop's TTY theme, man pages and opencode's
system theme inherit it). update-app-theme (in ~/.local/bin/scripts)
pushes the mode to the rest: AeroSpace borders and running nvim instances.
theme-watch, started by the launchd/systemd package, runs it the
moment the OS appearance changes. update-app-theme toggle|dark|light sets
the OS appearance and applies it; failures notify and log to
~/.local/state/theme/update.log.
Default apps (./default-apps)
Code/config/text files open in nvim (a new WezTerm tab) from Finder and from
the shell's open, driven by one list:
shell-shared/.config/shell/code-filetypes. On macOS it builds
~/Applications/Neovim.app and sets handlers with duti; on Linux it writes
nvim-open.desktop and uses xdg-mime. Viewer-type files (html, csv, logs,
svg, ...) keep their proper apps. Original handlers are saved to
~/.local/state/default-apps/; ./default-apps --restore puts them back.
macOS asks to confirm handler changes, so the script only changes what
actually differs from the list.
Prerequisites
- Git
- GNU Stow
- Zsh (macOS) or Bash (Linux)