A complete macOS development environment configuration using GNU Stow for symlink management.
- macOS (tested on Darwin 25.x)
- Internet connection (for Homebrew packages)
- Admin access (for changing default shell and installing packages)
bash <(curl -fsSL https://kvnwolf.com/setup-workspace)The setup script is interactiveβeach step can be skipped by pressing ESC.
This repository has no application or development server. Install its pinned tooling and run the quality gate with:
bun install
bunx dobby check@kvnwolf/dobby provides the repository gate and workflow contract; dobby.config.json records which documentation must stay synchronized with configuration changes.
The setup configures these system preferences:
| Setting | Value | Description |
|---|---|---|
| Dock auto-hide | Enabled | Dock hides automatically |
| Recent apps in Dock | Disabled | Removes recent apps section from Dock |
| File extensions | Visible | Shows all file extensions in Finder |
| Finder view | Column | Sets column view as default |
| Initial key repeat | 15 | Faster initial key repeat |
| Key repeat rate | 2 | Faster key repeat speed |
Command-line tools installed via Homebrew. Some are modern replacements for traditional Unix commands.
| Tool | Replaces | Description |
|---|---|---|
| bat | cat |
Syntax highlighting, line numbers, Git integration |
| btop | top |
Beautiful TUI, mouse support, resource graphs |
| bun | JavaScript runtime and toolkit | |
| claude-code-proxy | Run Claude Code with a ChatGPT subscription | |
| curlie | curl |
Colored output, httpie-like formatting |
| difftastic | Structural diff tool | |
| eza | ls |
Icons, colors, Git status integration |
| fd | find |
Simpler syntax, respects .gitignore, faster |
| fish | User-friendly shell | |
| fisher | Fish plugin manager | |
| freeze | Code screenshot generator | |
| fzf | Fuzzy finder | |
| gh | GitHub CLI | |
| git-delta | Syntax-highlighting pager for git | |
| jq | JSON processor | |
| lazygit | Git TUI | |
| mole | macOS system cleanup and optimization tool | |
| neovim | Hyperextensible Vim-based text editor | |
| node | JavaScript runtime, npm and npx | |
| procs | ps |
Colored output, tree view, searchable |
| ripgrep | grep |
Much faster, respects .gitignore, better defaults |
| sd | Intuitive find & replace | |
| starship | Cross-shell prompt | |
| stow | Symlink farm manager | |
| tldr | man |
Practical examples instead of verbose manuals |
| tmux | Terminal multiplexer | |
| tokei | Code statistics | |
| yazi | Blazing fast terminal file manager | |
| zoxide | Smarter directory jumping |
| Application | Description |
|---|---|
| 1Password | Password manager |
| Caffeine | Prevent Mac from going to sleep |
| Claude | AI assistant app |
| CleanShot | Screenshot and recording tool |
| cmux | AI-powered terminal multiplexer |
| Discord | Communication platform |
| Ghostty | GPU-accelerated terminal |
| Google Chrome | Web browser |
| LocalXpose | Reverse proxy for localhost |
| Monologue | Voice dictation |
| OrbStack | Docker & Linux on macOS |
| Raycast | Productivity launcher |
| Slack | Team communication |
| Vanilla | Menu bar organizer |
| Messaging app |
Installed via bun install -g during setup, separate from Homebrew.
| Package | Description |
|---|---|
| Claude Code | AI coding assistant CLI |
Fish shell becomes the default shell. Below are all shortcuts and configurations organized by tool.
| Abbr | Command |
|---|---|
b |
bun |
ba |
bun add |
bad |
bun add --dev |
bag |
bun add --global |
bi |
bun init |
bin |
bun install |
br |
bun run |
brd |
bun run dev |
brl |
bun run lint |
brm |
bun remove |
brs |
bun run setup |
bru |
bun run update |
brun |
bun run unused |
brv |
bun run validate |
bx |
bunx |
sk |
bunx skills@latest |
vc |
bunx vercel@latest |
Abbreviations:
All Claude commands follow the pattern cl[c|r][s][d] where:
c= continue most recent conversationr= resume by session IDs= skip permissionsd= enable debug mode
| Abbr | Command |
|---|---|
cl |
claude |
clc |
claude --continue |
clr |
claude --resume |
cls |
claude --dangerously-skip-permissions |
cld |
claude --debug |
clcs |
claude --continue --dangerously-skip-permissions |
clrs |
claude --resume --dangerously-skip-permissions |
clsd |
claude --dangerously-skip-permissions --debug |
clcd |
claude --continue --debug |
clrd |
claude --resume --debug |
clcsd |
claude --continue --dangerously-skip-permissions --debug |
clrsd |
claude --resume --dangerously-skip-permissions --debug |
Configuration:
- Default model: Opus with a 1M-token context window
- Permission mode: Auto
- Worktrees start from a fresh remote base
- Fullscreen TUI with automatic notifications and teammate mode
- Status line: Custom script showing directory, git branch, model, and context usage
- Enabled integrations: Dobby, Linear, Neon, Vercel, security guidance, Ponytail, and rust-analyzer LSP
- Co-authored-by: Disabled
OpenAI via claude-code-proxy:
After installing the Brewfile on a new computer, authenticate once with a ChatGPT Plus or Pro account:
claude-code-proxy codex auth loginIf the browser does not open automatically, open the URL printed by the login command and leave that terminal running until the callback completes.
Run Claude Code through OpenAI with:
cloThe clo function starts the proxy on demand and tracks every Claude session opened through it. When the last session exits, it prints a notice and stops the proxy automatically. Concurrent clo sessions share the same proxy. If 127.0.0.1:18765 is already responding without a valid proxy PID managed by clo, clo rejects the listener and aborts.
Claude Code uses the gpt-5.6-sol[1m] local context policy and auto-compacts at 272,000 tokens, the documented safe threshold for Codex GPT-5.6 subscription models. The [1m] suffix only controls Claude Code's local policy; it does not enlarge the provider's context window.
The proxy is intentionally not configured as a background service. Its OAuth credential is stored locally and is never committed to this repository. The regular claude command continues to connect directly to Anthropic.
| Function | Description |
|---|---|
clo [args] |
Run Claude Code with OpenAI Codex using the ChatGPT login |
Abbreviations (using eza):
All listing commands follow the pattern l[t][a][f][N] where:
t= tree viewa= include hidden files (all)f= full details (permissions, size, etc.)N= tree depth (only witht, default: 1)
| Abbr | Description |
|---|---|
l |
Compact list with icons |
la |
Compact list including hidden files |
lf |
Full details |
laf |
Full details including hidden files |
lt |
Tree view (depth 1) |
lt3 |
Tree view (depth 3) |
lta |
Tree view including hidden files |
ltf |
Tree view with full details |
ltaf |
Tree view with hidden files and full details |
ltaf2 |
Same as above with depth 2 |
Navigation:
| Command | Description |
|---|---|
.. |
cd ../ |
... |
cd ../../ |
.... |
cd ../../../ |
z <query> |
Jump to frequently visited directory (zoxide) |
mdcd <dir> |
Create directory and cd into it |
cpwd |
Copy current directory path to clipboard |
Abbreviations:
| Abbr | Command | Abbr | Command |
|---|---|---|---|
g |
git |
gp |
git push |
ga |
git add |
gpb |
git checkout - |
gaa |
git add --all |
gpf |
git push --force-with-lease |
gau |
git add --update |
gpr |
git pull --rebase |
gb |
git branch |
grb |
git rebase |
gba |
git branch --all |
grba |
git rebase --abort |
gbd |
git branch --delete |
grbc |
git rebase --continue |
gbD |
git branch --delete --force |
grbi |
git rebase --interactive |
gc |
git commit --verbose |
grh |
git reset |
gca |
git commit --verbose --all |
grhh |
git reset --hard |
gcam |
git commit --all --message |
gss |
git status --short |
gcb |
git checkout -b |
gst |
git status |
gcmsg |
git commit --message |
gsta |
git stash push |
gco |
git checkout |
gstl |
git stash list |
gd |
git diff |
gstp |
git stash pop |
gds |
git diff --staged |
gsw |
git switch |
gdt |
git difftool --tool=difftastic |
gswc |
git switch --create |
gf |
git fetch |
gl |
git pull |
gfa |
git fetch --all --tags --prune |
glog |
git log --oneline --decorate --graph |
lg |
lazygit |
gloga |
git log --oneline --decorate --graph --all |
Configuration:
- Default branch:
main - Pull strategy: Rebase
- Auto-setup remote: Enabled (push without
-u) - Merge conflict style: diff3
- Pager: delta with line numbers and hyperlinks
- Credential helper: GitHub CLI
| Function | Description |
|---|---|
fork <owner/repo> |
Fork a repo, clone to ~/Developer/github.com/<owner>/<repo>, set up remotes (origin = fork, upstream = original), and configure gh default repo |
Also accepts full GitHub URLs: fork https://github.com/owner/repo
Abbreviations:
| Abbr | Command |
|---|---|
n |
nvim |
nv |
nvim |
v |
nvim |
vim |
nvim |
vi |
nvim |
EDITOR is set to nvim.
Run Claude in the workspace directory from anywhere. Useful for configuring your workspace remotely.
| Function | Description |
|---|---|
ws <prompt> |
Non-interactive mode with streaming output |
wsi [args] |
Interactive mode |
Examples:
# Install a package and add to Brewfile
ws "install ripgrep via brew and add it to the Brewfile"
# Add a new fish abbreviation
ws "add abbreviation 'gc' for 'git commit'"
# Adopt a local config file into the repo
ws "adopt ~/.config/tool/config into shared dotfiles"
# Start interactive session in workspace
wsi| Abbr | Command |
|---|---|
y |
yazi |
| Abbr | Command |
|---|---|
md |
mkdir -p |
pbc |
pbcopy |
pbp |
pbpaste |
reload |
Reload fish configuration |
Custom prompt showing:
- Directory (with
~/Developer/github.com/shortened toο) - Git branch with status indicator
- Right side: package version, runtime versions (Node/Bun), command duration, time
- Theme: Catppuccin Mocha
- Font: GeistMono Nerd Font Mono (14pt)
- Shell integration: Fish
- Auto-quit: When last window closes
- Option key: Right Option as Alt
- Window padding: 16px
- Background opacity: 90% with blur (radius 50)
- Unfocused split opacity: 75%
- Window title: Shows
owner/repofor GitHub dirs,~/pathelsewhere; defers to programs that set their own title - Scroll sensitivity: Reduced (0.5x)
Split keybindings (prefix: Ctrl+;):
| Shortcut | Action |
|---|---|
prefix + \ |
Split right |
prefix + - |
Split down |
prefix + h/j/k/l |
Navigate splits |
prefix + H/J/K/L |
Resize splits |
prefix + z |
Toggle split zoom |
prefix + = |
Equalize splits |
prefix + x |
Close split |
Split keybindings (prefix: Ctrl+;):
| Shortcut | Action |
|---|---|
prefix + \ |
Split vertical |
prefix + - |
Split horizontal |
prefix + h/j/k/l |
Navigate panes |
prefix + H/J/K/L |
Resize panes (repeatable) |
prefix + z |
Toggle pane zoom |
prefix + x |
Close pane |
Configuration:
- Vi mode for copy
- Mouse support enabled
- Windows numbered from 1
- Status bar at the top
Files in shared/home/ and macos/home/ mirror your home directory structure. Running stow creates symlinks:
shared/home/.config/fish/config.fish β ~/.config/fish/config.fish
macos/home/.config/fish/conf.d/brew.fish β ~/.config/fish/conf.d/brew.fish
This means:
- Edits to dotfiles in the repo automatically apply (no re-stowing needed)
- Changes are version-controlled and shareable
- Easy to see what's customized vs default
- macOS-only configs: Add to
macos/home/ - Cross-platform configs: Add to
shared/home/ - New Homebrew packages: Add to
macos/Brewfile
