This repo contains my dotfiles. There are many others like it, but this one is mine. My dotfiles are my best friend. It is my life. I must master it as I must master my life. Without me, my dotfiles are useless. Without my dotfiles, I am useless. (quote from Full Metal Jacket for the Gen Z'ers)
Originally forked from @Holman's dotfiles, I took his general premise and edited them to fit my own needs.
I use (Typescript/JavaScript, Node, Go, git, system libraries, and so on), so the project is structured accordingly.
Fork it, remove what you don't use, and build on what you do use.
Below is the general layout of my setup. Please review this before running the install scripts.
-
bin/: Anything in
bin/will be added to your$PATHand available everywhere. -
Brewfile: Manages three types of applications:
- Brew Tap - service level tasks
- Brew formulas - command-line tools and packages
- Cask - GUI applications like Chrome, Discord, Warp, and Zoom
Note: Mac App Store apps via
masare currently disabled due to compatibility issues with macOS Sequoia (15.x). These apps are commented out in the Brewfile and should be installed manually through the App Store.You'll want to edit this file before you run the initial setup.
-
claude/: Configuration for Claude Desktop and Claude Code MCP (Model Context Protocol) servers. The
install.shscript manages:- Claude Desktop: Symlinks MCP server config to
~/Library/Application Support/Claude/ - Claude Code: Adds MCP servers via CLI (
sequential-thinking,serena) - Gracefully skips setup if Claude Desktop/Code is not installed
- Preserves existing user configurations
- Claude Desktop: Symlinks MCP server config to
-
topic/*.zsh: Any files ending in
.zshget loaded into your environment. -
topic/path.zsh: Any file named
path.zshis loaded first and is expected to set up$PATHor similar. -
topic/completion.zsh: Any file named
completion.zshis loaded last and is expected to set up autocomplete. -
topic/*.symlink: Any files ending in
*.symlinkget symlinked into your$HOME. This is so you can keep all of those versioned in your dotfiles but still keep those autoloaded files in your home directory. These get symlinked in when you rundot bootstraporscript/bootstrap.
On a fresh macOS machine, run this one-liner to install everything:
bash -c "$(curl -fsSL https://raw.githubusercontent.com/akornmeier/dotfiles/main/install.sh)"This will:
- Clone the dotfiles repository to
~/.dotfiles - Run
dot bootstrapto set up everything - Prompt you through Git configuration and installation
Note: You'll need Git installed first. On macOS, run xcode-select --install if you don't have it.
If you prefer more control, clone and run manually:
# Clone (or fork) the repo
git clone https://github.com/akornmeier/dotfiles.git ~/.dotfiles
# Navigate to the directory
cd ~/.dotfiles
# Run the bootstrap command
dot bootstrap
# or use the legacy script
# script/bootstrapBefore running the installation, you may want to review and customize:
- Brewfile: Edit to include/exclude applications you want installed
- zsh/zshrc.symlink: Update paths specific to your machine
- macos/set-defaults.sh: Review macOS system preferences to be set
The bootstrap command will:
- π§ Set up your Git configuration (name and email)
- π Create symlinks for dotfiles in your home directory
- π¦ Check if Homebrew is installed (installs if needed)
- β Prompt you to continue with the full installation
If you choose to continue, the installation (dot install) will:
- π¦ Install all packages from the Brewfile (brew, cask, and mas apps)
- π§ Set up FNM and Node.js LTS
- βοΈ Run all topic-specific installers (macos, fnm, zsh, claude)
- π Apply macOS system defaults
You may be prompted for your password a few times during installation:
- For FNM symlinks (only on first run) - Creates system-wide Node.js access
- For macOS defaults - Applies system-level preferences
On subsequent runs, if everything is already configured, you may not be prompted at all!
- Homebrew packages: Command-line tools like git, fnm, starship, uv, etc.
- Cask applications: GUI apps like Chrome, Discord, Warp, Zoom, Claude
- Node.js: Latest LTS version via FNM
- Oh My Zsh: If not already installed
- Claude MCP servers: Model Context Protocol servers for Claude Desktop and Claude Code
- sequential-thinking: Enhanced reasoning capabilities (via npx)
- serena: Advanced code analysis and understanding (via uvx)
- macOS preferences: System defaults and configurations
Note on Mac App Store Apps: Due to compatibility issues with mas on macOS Sequoia (15.x), Mac App Store apps must be installed manually. The following apps are recommended but commented out in the Brewfile:
- Be Focused (Pomodoro Timer)
- CopyClip (Clipboard Manager)
- Dato (Calendar/Time Zone App)
- Hand Mirror (Screen Mirroring)
- Keycastr (Keystroke Visualizer)
- Lungo (Prevents Sleep)
- Magnet (Window Manager)
The unified dot command provides intelligent management for your dotfiles:
dot # Smart updates (default - only updates what's needed)
dot update # Same as above
dot bootstrap # First-time setup
dot install # Full installation
dot --edit # Open dotfiles directory in your editor
dot --help # Show helpIntelligently updates only what's needed - perfect for regular maintenance:
- π Updates symlinks only if changed
- πΊ Updates Homebrew to latest version
- π¦ Upgrades outdated packages only
- π¦ Installs missing Brewfile packages only
- π§Ή Cleans up Homebrew cache
- π« Removes Homebrew's Node if detected (we use FNM)
No unnecessary operations - if everything is up-to-date, it will say so!
Full installation - useful after major changes or pulling updates:
- π Updates all symlinks
- π¦ Installs all Brewfile packages
- βοΈ Runs all topic installers (macOS, FNM, Zsh, Claude)
- π€ Configures Claude Desktop/Code MCP servers
- π Applies macOS system defaults
- π Only prompts for sudo when actually needed
First-time setup only - run this once when setting up a new machine:
- π Sets up Git configuration (name and email)
- π Creates symlinks for dotfiles
- πΊ Installs Homebrew if not present
- β Prompts to continue with full installation
Quickly open your dotfiles directory in your default editor ($EDITOR).
You can find this script in bin/dot.
This project uses Changesets to manage versions and releases.
When you make significant changes to the dotfiles, create a changeset:
pnpm changeset
# or
pnpm changeset:addThis will prompt you to:
- Select the type of change (major, minor, or patch)
- Provide a description of your changes
The changeset file will be created in .changeset/ and committed with your PR.
When changes are merged to main, the GitHub Action workflow will:
- Detect changesets and create a "Version Packages" PR
- The PR will update the version in
package.jsonand generate CHANGELOG.md - When the version PR is merged, it creates a Git tag for the release
- Major (1.x.x β 2.0.0): Breaking changes, major refactors
- Minor (x.1.x β x.2.0): New features, backward-compatible changes
- Patch (x.x.1 β x.x.2): Bug fixes, small improvements
pnpm changeset:add # Create a new changeset
pnpm changeset:status # View pending changesets
pnpm version # Consume changesets and update version
pnpm release # Create git tags for new versionsThe mas CLI tool has known compatibility issues with macOS Sequoia (15.x) and newer versions. Due to Apple's changes in the App Store authentication system:
mas accountandmas signincommands no longer work- Installation often fails with
PKInstallErrorDomain Code=201errors - Even after manually "purchasing" apps, installation may fail
Solution: Install Mac App Store apps manually through the App Store GUI. All mas entries in the Brewfile are commented out by default.
FNM (Fast Node Manager) is used instead of nvm for better performance. Node.js binaries are symlinked to /usr/local/bin for system-wide access, which is particularly useful for:
- Claude MCP servers
- GUI applications that need Node.js
- System services and LaunchAgents
Claude Desktop and Claude Code can be extended with MCP (Model Context Protocol) servers. The dotfiles automatically configure two powerful servers:
- sequential-thinking: Provides enhanced reasoning and step-by-step problem solving
- serena: Offers advanced code analysis and symbol-level understanding
Setup Requirements:
- Claude Desktop must be installed via Brewfile (
cask 'claude') - OR Claude Code must be installed (
brew install --cask claude-code) - Node.js via FNM (for
npxcommand) uvvia Homebrew (foruvxcommand)
Post-Installation:
- Claude Desktop: After running
dot install, fully quit Claude (File β Exit, not just close window) and restart - Claude Code: Run
/mcpcommand to authenticate MCP servers - Look for the hammer icon in Claude Desktop interface to verify MCP tools are loaded
Adding More MCP Servers:
- Claude Desktop: Edit
claude/claude_desktop_config.json.templateand run./claude/install.sh - Claude Code: Use
claude mcp addcommand (seeclaude mcp --help)
Preserving Custom Configurations: If you already have a Claude Desktop config file, the installer will preserve it and show a warning. To use the dotfiles config, backup your existing file and re-run the installer.