Cross-platform dotfiles for Linux and macOS, featuring a unified Dracula (dark) / Alucard (light) theme that auto-switches with the OS, and ergonomic keyboard mappings (j k l ; instead of h j k l).
-
Install Homebrew
-
Install the
justcommand runner:brew install just
To install all tools, link all configurations, and set up the environment, simply run:
just setup- Installs Tools — Runs
brew bundleto install core CLI utilities (fish,neovim,lazygit,eza,bat,zellij,slk,jiratui,jira-cli, etc.) and Ghostty (macOS only, via cask). - Symlinks Configs — Safely links
fish,nvim,.gitconfig,.ideavimrc, and~/.config/ghosttyinto their proper places.lazygitconfig is generated per-theme into the OS-correct directory (~/Library/Application Support/lazygiton macOS,~/.config/lazygiton Linux). Zellijconfig.kdlis copied (not symlinked) so theme switching doesn't dirty the repo. - Builds bat Themes — Compiles the custom Alucard bat/delta syntax theme.
- Installs Fish Plugins — Uses
fisherto install Fish shell plugins and sets up the prompt. - Installs Fonts — Downloads and installs JetBrains Mono Nerd Font (via Homebrew on macOS, or manual download on Linux).
- OS-Specific Setup — Installs and enables the auto dark-mode switching daemon for macOS (launchd) or Linux (systemd).
Run any step independently if needed:
| Command | Description |
|---|---|
just brew-install |
Install Homebrew packages |
just link |
Create/refresh all config symlinks |
just update |
Update dotfiles-managed tools (mise, nvim, fish plugins) |
just clean |
Clean up caches (mise prune) |
just bat-themes |
Build the custom Alucard bat/delta syntax theme |
just fish-plugins |
Update Fish shell plugins via fisher |
just install-nvim-mcp |
Register Neovim MCP server with Claude |
just dark-mode-notify-install |
Compile and install dark-mode-notify from source |
just mac-setup |
Re-install the macOS auto dark-mode daemon |
just linux-setup |
Re-install the Linux auto dark-mode service |
Themes auto-switch to match the OS dark/light mode. No manual action needed after setup.
| Slot | Dark (Dracula) | Light (Alucard) |
|---|---|---|
| Terminal (Ghostty) | Dracula built-in |
alucard (custom) |
| Shell colors (fish) | Dracula palette | Alucard palette |
| Prompt (Hydro) | Dracula palette | Alucard palette |
| Fuzzy finder (fzf) | Dracula palette | Alucard palette |
| Multiplexer (Zellij) | dracula built-in |
alucard (custom) |
| Git diff (delta) | Dracula syntax theme | Alucard syntax theme |
| Git UI (lazygit) | Dracula colors | Alucard colors |
| File Manager (yazi) | Dracula colors | Alucard colors |
| Docker UI (lazydocker) | Dracula colors | Alucard colors |
| Disk monitor (btop) | Dracula theme | Alucard theme |
| Database CLI (pgcli) | Dracula syntax | Alucard syntax |
| tldr (tealdeer) | Dracula syntax | Alucard syntax |
| Jira TUI (jiratui) | dracula theme | solarized-light theme |
Switching is handled by switch_theme dark|light (a fish function). It is called automatically on shell startup by reading the OS dark mode preference.
| Role | Color |
|---|---|
| Background | #FFFBEB (warm cream) |
| Foreground | #1F1F1F (near-black) |
| Red | #CB3A2A |
| Green | #14710A |
| Yellow | #846E15 |
| Blue/Purple | #644AC9 |
| Magenta/Crimson | #A3144D |
| Cyan/Teal | #036A96 |
| Orange | #A34D14 |
| Neutral (selection bg) | #CFCFDE |
| Comment | #6C664B |
lzg: Launcheslazygitlzd: Launcheslazydockerlzs: Launcheslazysqly: Launchesyaziand automatically changes your directory (cd) when you exit.
Zellij is the default terminal multiplexer, pre-configured for ergonomic use and seamless Neovim integration.
- Theme hot-swaps live —
switch_themepatchesconfig.kdlusingstring replaceand Zellij picks it up automatically. - Built-in Dracula theme is used for dark mode; the custom
alucardtheme (zellij/themes/alucard.kdl) is used for light mode. - Keybinds otherwise follow Zellij defaults (
Ctrl+pfor pane mode,Ctrl+tfor tab mode, etc.).
Movement keys mirror Neovim: j=left, k=down, l=up, ;=right.
| Keybind | Action |
|---|---|
Alt + j/k/l/; |
Navigate panes (seamlessly across Zellij and Neovim) |
Alt + n |
New pane |
Ctrl+p then d/D |
Split pane down / right |
Ctrl+p then x |
Close pane |
Ctrl+s then d |
Detach session |
Config is symlinked to ~/.config/ghostty by just link. Theme auto-switches with the OS.
- Font: JetBrains Mono Nerd Font, 13pt
- Dark theme: Dracula (built-in)
- Light theme: Alucard (custom, from
ghostty/themes/alucard) - Pane management: handled by Zellij (see Zellij section above)
The Neovim configuration acts as a JetBrains replacement. Most tools install automatically via Homebrew, Lazy.nvim, and Mason. A few language servers require manual installation.
If missing, Neovim gracefully ignores them without errors — but you'll miss IDE features.
PHPantom and Phpactor run together: PHPantom handles diagnostics (fast), Phpactor provides refactoring actions. php-lsp only starts if PHPantom is absent. Priority for diagnostics: PHPantom > php-lsp. You can hot-swap (e.g., :LspStop phpantom then :LspStart php-lsp).
PHPantom (highest priority — extremely fast, Rust-based)
- Automatically installed via
mise(github:PHPantom-dev/phpantom_lsp).
php-lsp (fast alternative, Rust-based)
- Automatically installed via
mise(github:jorgsowa/php-lsp).
Phpactor (refactoring — runs alongside PHPantom with diagnostics disabled)
- Handled completely by
mason.nvim. - Note on Code Actions: Phpactor's code actions are separated to avoid UI bloat. Use
<leader>cafor fast, standard code actions. Use<leader>cpspecifically to access Phpactor's advanced refactoring tools.
Provides autocompletion and hover support for .twig files.
- Handled completely by
mason.nvim. No need to install globally via npm!
- Antigravity (agy): Used as the primary AI coding assistant CLI. Run the
agycommand natively in a Zellij split pane next to Neovim.agyautomatically detects the Neovim socket (/tmp/nvim-*.sock) and connects securely via MCP without requiring any third-party Neovim wrapper plugins. - claudecode.nvim: Integrates the Claude Code CLI directly into Neovim. Use
<leader>acto toggle Claude,<leader>asto send buffers/selections, and<leader>aa/<leader>adto accept/deny diffs. - nvim-mcp: A Rust-based MCP server that allows Claude to read your Neovim buffers and use its LSP securely. The binary is compiled automatically by Lazy.nvim, but you must register it with Claude Code by running
just install-nvim-mcpmanually. - Copilot: GitHub Copilot is enabled for inline code suggestions.
Once the above are installed:
- Open Neovim.
Lazy.nvimwill automatically download and install all plugins.Mason.nvimwill automatically install formatters, linters, and debug adapters (phpstan,php-cs-fixer,php-debug-adapter, etc.).- Run
:checkhealthto verify everything is wired up correctly.