A modern, topic-based dotfile configuration for macOS. Optimized for Apple Silicon and productivity.
git clone https://github.com/ibarsi/dotfiles.git ~/dotfiles
cd ~/dotfiles
./bootstrap.shbootstrap.sh is path-safe and uses the repository root internally, so it can be re-run reliably even when invoked from different working directories.
Use mise run ... directly for project workflows:
mise run check→ full validation pipelinemise run verify→ AI doctor + bootstrap link verificationmise run ai-doctor→ AI CLI/tooling health checkmise run docs-build→ regenerate the docs site data from repo sourcesmise run docs-check→ fail if regenerating docs would changedocs/site-data.*mise run docs-serve→ serve the docs site locally with mise-managed Pythondotdocs→ start the docs site from any directory and open it in the browsermise run lint-shell/mise run fmt-shell/mise run fmt-checkmise run precommit-install/mise run precommit-runmise run secrets-scan→ run explicit repo secret scanupall→ upgrade Homebrew packages/casks, converge the Brewfile, upgrade mise-managed tools, and refreshBUMBLEBEE_CATALOG_DIRif it points into a git checkoutdsync→ safe dotfiles update preview (fetch/status + next commands)groot→ jump to git repo root quicklywtnew <branch> [base]→ create a worktree under~/worktrees/<repo>/<branch>and enter itwtsesh→ attach/create a tmux session for the current repo+branchpr→ open existing PR in browser or create one
The repository is organized into topics, making it easy to modularize your configuration:
git/: Git configuration and aliases.ssh/: SSH client configuration for GitHub and related tooling.macos/: macOS system defaults and UI/UX settings.system/: Global environment variables, paths, and generic aliases.vim/: Vim configuration.tmux/: tmux configuration (symlinked to~/.tmux.conf).ghostty/: Ghostty terminal configuration (symlinked to~/.config/ghostty/).gitmoji/: Globalgitmoji-clipreferences (symlinked to~/Library/Preferences/gitmoji-nodejs/).k9s/: Kubernetes TUI configuration (symlinked to~/Library/Application Support/k9s/config.yaml).zed/: Zed editor settings and keybindings (symlinked to~/.config/zed/).mise/: Mise global config (symlinked to~/.config/mise/).codex/: Codex CLI configuration (symlinked to~/.codex/).cmux/: cmux app configuration (symlinked to~/.config/cmux/).claude/: Claude Code settings (symlinked to~/.claude/).docs/: Lightweight static documentation app for aliases, functions, tasks, links, and features.scripts/: Repository automation scripts (doctor-ai,bootstrap-verify).zsh/: Zsh configuration, plugins, and modular initialization.AGENTS.md: Agent operating guidance for this repository.
- Topic-based organization: Modular and easy to maintain.
- Modern CLI tools: Integrated with
eza,bat,glow,fzf,zoxide, andstarship. - Lean networking toolkit: Modern DNS/HTTP/traffic inspection helpers (
doggo,mtr,iperf3,tcpdump,netcat). - FZF workflows: Fast file/dir navigation, branch switching, ripgrep jump-to-file, and process kill helpers.
- Zsh Power-ups: Catppuccin Mocha syntax highlighting/autosuggestions plus faster completion startup and improved history behavior.
- tmux workflow: Catppuccin-styled tmux with AI-friendly pane/window ergonomics and Claude quiet-window notifications.
- Auto-update: Automatically checks for updates to your dotfiles once a day.
- macOS keyboard tuning: Bootstrap applies fast key repeat, short repeat delay, disables press-and-hold accent popups, and reloads a Caps Lock to Control remap at login.
- Mise integration: Configured global settings + project tool/tasks for reproducible shell workflows.
- AI workflow diagnostics: One-command checks for toolchain health and bootstrap verification.
- Generated reference site: A searchable docs app under
docs/inventories aliases, functions, git shortcuts, mise tasks, bootstrap links, and major repo capabilities from source files. - Deterministic guardrails: Optional pre-commit hooks for shell lint/format, merge hygiene, and secret scanning.
- Advanced Git: Includes
gh-dashand powerful log visualization. - Gitmoji subject format: Global
gitmoji-clidefaults keep the message in the commit subject as✨ (feat): Titleinstead of pushing it into the body. - SSH commit signing: Git signs commits with
~/.ssh/id_ed25519.pubviagpg.format=ssh. - SSH compatibility helper:
sshxforcesTERM=xterm-256colorfor hosts that break onxterm-ghosttyduring interactive sessions. - Ghostty terminal: GPU-accelerated terminal with Catppuccin theme, Fira Code font, and custom keybindings — fully configured as dotfiles.
- k9s defaults: Bootstrap links a repo-managed k9s config that uses the Catppuccin Mocha skin, shows the last 1000 log lines, and wraps log lines by default.
- Zed editor: Primary editor with Catppuccin theme, Fira Code font, Prettier formatting, and custom keybindings — all managed as dotfiles.
- Obsidian theme notes: Obsidian stays in
Brewfile, and the Catppuccin docs include the manual CLI commands if you want Obsidian to match. - Codex CLI workflow: Safe-by-default Codex config, shell shortcuts, and completion for day-to-day AI coding.
- Claude Code workflow: Claude Code settings + shell shortcuts tuned for regular use alongside Codex.
- Completion caching via
.zcompdump(faster shell startup) - Better history ergonomics (
HIST_IGNORE_SPACE,EXTENDED_HISTORY) - History-backed zsh autosuggestions: type the start of a previous command, then press
Shift-Tabto accept the gray suggestion; useTabfor normal expansion/completion - Interactive completion menu + clearer completion descriptions
- Startup smart tips: On new terminal sessions, generate one practical AI tip from your dotfiles context (can be disabled).
The repo includes a lightweight static docs app in docs/ for browsing the current shell surface area and major dotfiles capabilities.
- Source-driven generator:
scripts/generate-docs.py - Generated data file:
docs/site-data.json - Includes: aliases, functions, git shortcuts from
git/.gitconfigplus git-focused shell helpers, mise tasks, bootstrap-managed symlinks, and curated repo feature summaries
Refresh the docs after any feature, alias, function, task, or bootstrap link change:
mise run docs-buildServe the site locally from the repo root:
mise install
mise run docs-serveThen open http://localhost:4173.
From any directory, dotdocs will start the server if needed and open the same URL automatically.
Ghostty is configured as the primary terminal. Config lives in ghostty/ and is symlinked to ~/.config/ghostty/ by bootstrap.sh.
| File | Destination | Purpose |
|---|---|---|
ghostty/config |
~/.config/ghostty/config |
Terminal settings, theme, keybindings |
Key settings:
- Theme: Catppuccin Mocha (dark) / Catppuccin Latte (light), follows system appearance — built-in to Ghostty, no extra install needed
- Font: Fira Code 13px with ligatures (
calt,liga) - Cursor: Blinking bar (ported from iTerm2)
- Shell integration: Auto-detected — enables semantic zones, prompt detection, sudo passthrough
- Privacy: Crash reporting disabled
Keybindings (ported from iTerm2):
| Shortcut | Action |
|---|---|
cmd+] / cmd+[ |
Next / previous tab |
cmd+shift+← / cmd+shift+→ |
Split pane left / right |
cmd+shift+↑ / cmd+shift+↓ |
Split pane up / down |
cmd+w |
Close pane / tab |
cmd+k cmd+z |
Toggle fullscreen (zen mode) |
cmd+= / cmd+- |
Increase / decrease font size |
cmd+0 |
Reset font size |
Note:
theme/iterm2-catppuccin.jsonis preserved in the repo for historical reference but is no longer used.
cmux is installed from the manaflow-ai/cmux Homebrew tap and configured from the repo-managed JSONC file in cmux/.
Bootstrap also runs cmux themes set --dark "Catppuccin Mocha" so the dark theme is applied consistently.
The workspace color picker is file-managed with Catppuccin Mocha colors matching the Ghostty palette used by cmux themes.
| File | Destination | Purpose |
|---|---|---|
cmux/cmux.json |
~/.config/cmux/cmux.json |
App settings and configurable defaults |
Obsidian is installed from Brewfile, but this repo does not automate its CLI setup or theme activation.
If you want Obsidian to match the Catppuccin theme used elsewhere, enable Obsidian's CLI yourself and then run:
Theme commands used:
obsidian theme:install name=Catppuccin
obsidian theme:set name=Catppuccinglow is installed from Brewfile and configured from glow/glow.yml with the Catppuccin Mocha Glamour style for paged terminal Markdown rendering.
Markdown functions (system/.functions):
md [file|url|repo]→ render Markdown with Glow; with no argument it opensREADME.mdwhen present, otherwise starts Glow's current-directory browsermdf→ fuzzy-pick a local Markdown file and preview it with Glow before renderingmdrepo <owner/repo>→ render a GitHub/GitLab README; shorthand likemdrepo charmbracelet/glowexpands togithub.com/charmbracelet/glow
This gives you a fast terminal path for local READMEs, generated docs, changelogs, and remote project docs without leaving the shell.
bumblebee can scan the current project against the maintained threat-intel exposure catalogs bundled with the installed Go module.
Supply-chain functions (system/.functions):
bbscan [bumblebee scan flags...]→ run a project-profile Bumblebee exposure scan against the current$PWD, writing timestamped findings and diagnostics NDJSON files in that directory
Set BUMBLEBEE_CATALOG_DIR to override the default catalog lookup path.
When BUMBLEBEE_CATALOG_DIR points inside a git checkout, upall refreshes that checkout with git pull --ff-only.
tmux is configured for a keyboard-first, AI-session-friendly terminal workflow.
| File | Destination | Purpose |
|---|---|---|
tmux/.tmux.conf |
~/.tmux.conf |
Session/window/pane behavior + statusline |
Key choices:
- Prefix:
Ctrl+a - Split panes in current working directory
- Pane movement with arrow keys
- Fast pane resizing (
Shift+Arrow) - Catppuccin-inspired statusline and borders
- Copy mode with vim keys
- AI helpers:
Ctrl+a Mtoggles quiet-window monitoring (monitor-silence) for the current windowCtrl+a Arenames the current window and enables a 15s quiet alert for AI sessions
Claude Teams fit:
- Includes a quiet-window notification hook (
alert-silence) for windows usingmonitor-silence. - Useful pattern per Claude window:
Ctrl+a Aand name itclaude-impl,claude-review, etc.- Or toggle it manually with
Ctrl+a M - Shell equivalent:
tmux setw monitor-silence 15
Recommended Claude layout:
- One tmux session per project (
tn <project>) - Window 1: editor/build/test loop
- Window 2:
claude-implfor implementation work - Window 3:
claude-reviewfor code review, debugging, or a second thread - Window 4: logs, watch mode, or git operations
Prefer separate windows over many panes for independent Claude threads so quiet notifications and window switching stay clean. Use panes when two terminals belong to the same task in the same directory.
tmux aliases:
tl→ list sessionsta <name>→ attach sessiontn <name>→ create new named session
Use sshx instead of ssh for remote hosts that mis-handle Ghostty's default xterm-ghostty terminal type.
sshx user@host→ run SSH withTERM=xterm-256colorsshx -p 2222 user@host→ same behavior with explicit port/flags
This is mainly useful for older appliances and NAS shells that render broken line editing or arrow-key behavior over SSH.
This repo now includes a lightweight, practical network-debug toolkit for daily use.
Added tools (Brewfile):
doggo— modern DNS client (digalternative)mtr— traceroute + ping combinediperf3— throughput testing
Use your existing aliases for basics (ip, lip, ips, flushdns), and call modern tools directly (doggo, curl, tcpdump). (flushdns runs both dscacheutil and mDNSResponder refresh.)
Network functions (system/.functions):
dnstrace <domain>— DNS trace pathhttptime <url>— DNS/connect/TLS/TTFB/total timinglisteners— compact open listener viewnclisten [port]/ncprobe <host> <port>— netcat helperspcap [iface] [file] [filter...]— capture packets to.pcap(for Wireshark/offline analysis)sniffweb [iface]— quick live console view for web ports (80/443), no file outputnetpath <host>— MTR report (20 cycles, quick path/latency snapshot)netspeed <iperf3-server> [seconds]— iperf3 client run
This keeps the setup lean: mostly thin wrappers over proven tools, with sensible defaults.
kubectl, k9s, and jq are installed from Brewfile; the shell adds a small Kubernetes shortcut set for common inspect, log, rollout, and context-switching work.
Kubernetes aliases (system/.aliases):
k->kubectlkgp/kgpa-> get pods in the current namespace / all namespaceskd-> describe resourcesklf/klp-> follow logs with a 1000-line tail / show previous container logskex-> interactive execke-> cluster eventskrs/krr-> rollout status / restartkctx/kctxs/kuc/kns-> show context, list contexts, switch context, or set the current namespace
Kubernetes functions (system/.functions):
klogj <pod|resource/name> [kubectl logs flags...]-> follow logs throughjqinless, pretty-printing JSON lines while leaving plain text untouched
Use KLOG_TAIL=200 klogj pod/my-pod -n my-namespace to override the default 1000-line tail for a single command.
Inside less, press Ctrl-C to pause live follow mode, / to search, and Shift-F to resume following.
fzf is already installed via Brewfile; this repo now includes practical shell functions in system/.functions tailored for your setup (bat, rg, zed, git-heavy workflow).
Included functions:
ff→ fuzzy-find file and open in Zed (fallback:$EDITOR)fcd→ fuzzy-find directory andcdinto itfbr→ fuzzy-switch git branches (supports remote tracking branches)frg [query]→ fuzzy-select fromrgresults and jump to file+linefkill→ fuzzy-select running process and kill itfwt→ fuzzy-pick a git worktree from the current repo andcdinto itfwtr→ fuzzy-pick a sibling git worktree and remove it withgit wtr
These are designed for daily terminal usage with your current tooling stack and should work across your repos out of the box.
The shell and git config now include a minimal worktree layer aimed at parallel agent sessions without adding much ceremony.
Git aliases:
git rh→ hard reset the current branch toorigin/<current-branch>git wt→ rawgit worktreegit wtl→ list worktreesgit wtp→ prune stale worktree metadatagit wtr <path>→ remove a worktreegit wtx→ porcelain worktree listing for scriptinggit bparent [base-ref]→ print the parent commit of the oldest commit on the current branch not found in the given basegit onto [base-ref]→ rebase the current branch ontoorigin/<base>usinggit bparentas the boundary
Shell helpers:
wtpath [name]→ print the conventional path for the current repo under~/worktrees/<repo>/<name>wtnew <branch> [base]→ create a new worktree at that path, print the exact branch/base/path used, andcdinto itfwt→ fuzzy-pick any worktree from the current repo andcdinto itwtsesh→ attach/create a tmux session named from the current repo and branchfwtr→ fuzzy-search removable worktrees from the current repo and pass the selected path togit wtr
Recommended flow:
- From any repo root, run
wtnew feature/my-task - Use
fwtany time you want to jump between existing worktrees for that repo - Start or attach your worktree tmux session with
wtsesh - Run your agent inside that session so each branch/worktree has isolated terminal context
- If
wtnewfails, it now prints whether the problem is missinggit, missing repo context, or a rejectedgit worktree add - When the repo contains
.mise.tomlormise.toml,wtnewalso runsmise trustinside the new worktree
Three-feature routing example:
wtnew feat/auth-refreshwtnew feat/billing-exportwtnew feat/mobile-nav- Run
wtseshinside each worktree and keep one Claude session per worktree - Treat each worktree as the local checkout for exactly one branch and PR
When feature work is done in a worktree:
- Review and commit from inside that worktree:
git status
git add -A
git commit -m "Implement feature"
git push -u origin "$(git rev-parse --abbrev-ref HEAD)"
pr- The branch already exists at that point; the worktree is just the local directory attached to it
propens the existing PR or creates one for the current branch
After the PR is merged:
- Leave the merged worktree and return to the main repo checkout
- Remove the worktree, then delete the local branch
git wtl
git wtr ~/worktrees/<repo>/feat/auth-refresh
git branch -d feat/auth-refresh
git wtr ~/worktrees/<repo>/feat/billing-export
git branch -d feat/billing-export
git wtr ~/worktrees/<repo>/feat/mobile-nav
git branch -d feat/mobile-nav
git wtp- If you also want to delete merged remote branches manually:
git push origin --delete feat/auth-refresh
git push origin --delete feat/billing-export
git push origin --delete feat/mobile-navUse git wtl before cleanup so you can verify the exact worktree paths and avoid removing the wrong checkout.
If you prefer an interactive cleanup flow, run fwtr from any checkout in the repo to fuzzy-pick a sibling worktree and remove it directly.
Pi is configured as the primary local-model coding agent, with defaults matched to this repo's Codex safety posture and local oMLX endpoint.
| File | Destination | Purpose |
|---|---|---|
pi/settings.json |
~/.pi/agent/settings.json |
Default provider/model, compaction, UI, model cycling |
pi/models.json |
~/.pi/agent/models.json |
Local OpenAI-compatible model providers |
Defaults configured:
- Provider: local
omlx - Endpoint:
http://127.0.0.1:1234/v1 - Model:
gemma-4-e4b-it-MLX-4bit - Thinking level:
medium - Compaction enabled with larger response reserve for coding tasks
- Startup telemetry disabled; use
PI_OFFLINE=1orpi --offlineto skip startup network checks
Local model setup:
- Run
omlxsbefore starting Pi - Pi reads
OMLX_API_KEYfor the local provider bearer token;system/.exportsdefaults it toomlxfor fresh shells - Export
OMLX_API_KEYin your local shell/private env if your oMLX server requires a different bearer token - SkillSpector defaults are exported from
system/.exportsto usehttp://127.0.0.1:1234/v1with the local oMLX Gemma model, theskillspectorshell wrapper passesOMLX_API_KEYas the OpenAI-compatible bearer token for that endpoint, andskillspector/model_registry.yamlcaps the local model context for stable scans - Re-run
./bootstrap.shto install the symlinked config
Usage:
pi→ interactive coding sessionpie "prompt"→ non-interactive print modepic "prompt"→ continue previous sessionpir→ pick a previous session to resumepiro -p "review src/"→ read-only review mode with read/search/list toolspimodels→ inspect available configured models
Extension shortlist to evaluate:
pi-subagentsfor delegated/parallel agent workpi-mcp-adapterto reuse MCP tooling where Pi is the daily driverpi-lensfor LSP/linter/type-check feedback inside Pi@juicesharp/rpiv-todofor a persistent task overlay that survives compactionpi-ask-useror@juicesharp/rpiv-ask-user-questionfor structured clarifying questionspi-btwfor side questions without polluting the main session
Install only after reviewing source:
pi install npm:pi-subagents
pi install npm:pi-mcp-adapter
pi install npm:pi-lens
pi install npm:@juicesharp/rpiv-todo
pi install npm:pi-ask-user
pi install npm:pi-btwSecurity note: Pi extensions and packages run with full local permissions. Treat them like shell plugins or editor extensions, not inert prompts.
mini-SWE-agent is installed through the global mise config as pipx:mini-swe-agent and uses the same local oMLX Gemma endpoint as Pi.
Defaults configured:
- Endpoint:
http://127.0.0.1:1234/v1 - Model:
gemma-4-e4b-it-MLX-4bit - Config overlay:
mini-swe-agent/omlx.yaml - Config discovery:
MSWEA_CONFIG_DIR=$DOTFILES/mini-swe-agent - Cost tracking ignored for the local zero-cost model
Usage:
mni→ interactive mini-SWE-agent session using upstreammini.yamlplus the oMLX overlaymnie "prompt"→ run a task non-interactively with the same local model configmniyolo→ start mini-SWE-agent in yolo mode with the same local model configaiup→ upgradespipx:mini-swe-agentthrough mise along with the other AI coding tools
Run omlxs before starting mini-SWE-agent. Fresh shells replace the old OPENAI_API_KEY=omlx placeholder with the real OMLX_API_KEY, and the mini-SWE-agent aliases also pass OMLX_API_KEY as OPENAI_API_KEY for that command so LiteLLM authenticates against the local oMLX endpoint with the same bearer token Pi uses.
Scripts under scripts/:
doctor-ai.sh→ checks binaries, config presence, and env presencebootstrap-verify.sh→ validates expected post-bootstrap symlinks/files
Optional pre-commit config is included in .pre-commit-config.yaml:
- merge conflict checks
- trailing whitespace / EOF hygiene
shellcheckshfmtgitleakssecret scanning on staged changes
Setup:
pre-commit install
pre-commit run --all-filesmise is now wired as an active part of this repo instead of just being installed.
| File | Destination | Purpose |
|---|---|---|
mise/config.toml |
~/.config/mise/config.toml |
Global mise behavior/settings |
mise.toml |
~/dotfiles/mise.toml |
Project tools + tasks for dotfiles maintenance |
Best-practice defaults applied (from official mise docs):
auto_install = truefor smoothermise run/mise execworkflowsenv_cache = trueandenv_cache_ttl = "2h"for faster repeated prompt/env resolutioncolor_theme = "catppuccin"to match terminal/editor theme choicesmin_versionsoft floor in project config to reduce config drift
Project tools managed by mise:
shellcheckshfmt
Project tasks:
mise run mise-install→ install configured toolsmise run lint-shell→ lint shell scriptsmise run fmt-shell→ format shell scriptsmise run fmt-check→ check formatting without writingmise run check→ full local validation pipelinemise run bootstrap-verify→ verify expected post-bootstrap links/filesmise run ai-doctor→ verify AI toolchain binaries/config/envmise run verify→ run both AI doctor + bootstrap verificationmise run doctor→ run mise diagnostics
Shell helpers:
ms/msi/msu/msr/msd
Note:
mise activate zshis intentionally loaded near the end of.zshrcso later PATH edits don’t override mise-managed tool versions.
- Use
.env.exampleas the reference for expected local AI environment variables. - Keep real values in untracked local files/shell env (for example
.env.localor your shell profile).
Codex CLI is configured for a secure, fast terminal-first AI coding flow.
| File | Destination | Purpose |
|---|---|---|
codex/config.toml |
~/.codex/config.toml |
Default model, approvals/sandbox, search mode, feature toggles |
Install Codex CLI:
brew install --cask codex
npm i -g @openai/codex # cross-platform alternativeKey defaults in this repo:
model = "gpt-5.5"approval_policy = "on-request"sandbox_mode = "workspace-write"web_search = "cached"(safer default than live web)/reviewusesreview_model = "gpt-5.3-codex"- Native TUI footer enabled for non-tmux use (
model-with-reasoning,git-branch,project,context-window,five-hour)
Enabled quality-of-life features:
shell_snapshot(faster repeated command runs)unified_exec(improved command execution path)undo(safer edit iteration)voice_transcription(hold Space to speak in supported Codex CLI builds)
TUI footer:
- Use
/statuslinein Codex to interactively reorder or trim footer items. - The repo default shows model/reasoning, git branch, project, context-window usage, and the 5-hour usage meter.
Zsh shortcuts:
cx→codexcxe→codex execcxr→codex resume --lastcxreview→ start Codex with/reviewcxup→ upgrade Codex CLI (uses Homebrew cask when Codex was installed with brew; otherwise npm)
Security note: This setup intentionally avoids
danger-full-access/--yolodefaults, andsandbox_mode = "workspace-write"prevents destructive commands likerm -rf ~/from writing outside the workspace.
Claude Code is configured for a reliable daily-driver workflow that can coexist with Codex.
| File | Destination | Purpose |
|---|---|---|
claude/settings.json |
~/.claude/settings.json |
Update channel and attribution preferences |
Install Claude Code CLI:
brew install --cask claude-code
# or native installer (recommended by Anthropic):
curl -fsSL https://claude.ai/install.sh | bashKey defaults in this repo:
$schemaenabled for editor validation/autocompleteautoUpdatesChannel = "stable"to reduce surprise regressionscleanupPeriodDays = 30to avoid keeping transcripts indefinitelyrespectGitignore = trueto keep ignored/private files out of file suggestionspermissions.disableBypassPermissionsMode = "disable"to block bypass modepermissions.askprompts on high-risk network/sensitive reads (git push,curl,wget,.env,./secrets/**)permissions.denyblocks obviously dangerous shell patterns (sudo *,rm -rf /,rm -rf ~/)attribution.commit/attribution.prare blanked to avoid automatic AI bylines in commits/PRs
Zsh shortcuts:
cc→claudecce→claude -pccr→claude --continueccreview→ start Claude with/reviewccyolo→claude --dangerously-skip-permissionsccdoctor→claude doctorccupdate→ upgrade Claude Code (brew cask if installed via Homebrew, otherwiseclaude update)
Workflow note: Codex and Claude configs are independent (
~/.codex/and~/.claude/), so switching between them is frictionless.
Agy is wired into the zsh shortcut set with aliases that mirror the Codex and Claude Code patterns where the CLI exposes matching flags.
Zsh shortcuts:
agye→agy -pagyr→agy --continueagyreview→ start Agy with/reviewagyyolo→agy --dangerously-skip-permissions
Zed is configured as the primary editor. Config files live in zed/ and are symlinked to ~/.config/zed/ by bootstrap.sh.
| File | Destination | Purpose |
|---|---|---|
zed/settings.json |
~/.config/zed/settings.json |
Editor settings, theme, formatting |
zed/keymap.json |
~/.config/zed/keymap.json |
Custom keybindings |
Key settings:
- Theme: Catppuccin Mocha (dark) / Catppuccin Latte (light), follows system appearance
- Font: Fira Code 13px with ligatures
- Formatting: Prettier on save for JS/TS/TSX/JSON/HTML/Markdown
- Extensions: Auto-installed on first launch (Catppuccin, Prettier, ESLint, Dockerfile, etc.)
- Telemetry: Disabled
Keybindings:
| Shortcut | Action |
|---|---|
cmd+] / cmd+[ |
Next / previous terminal pane |
cmd+d |
New terminal |
cmd+w |
Close active item |
cmd+k cmd+z |
Toggle centered layout (zen mode) |