Skip to content

Personal Machine

A complete example of a personal machine profile. Based on the dotkit-run/example repo.

  • Directorydotkit/
    • dotkit.env
    • Directoryprofiles/
      • Directorykit/
        • profile.env (optional)
        • Directoryconfigs/
          • dock.sh
        • Directorytools/
          • community.txt
        • Directorypackages/
          • brew.md
          • mas.txt
        • Directorygit/
          • config.txt
          • repos.txt
        • Directorydotfiles/
          • link.env
          • .zshrc
          • .gitignore_global
        • Directorymanual/
          • todo.env
          • setup.md

Variables available to every script in every profile:

Terminal window
DOTKIT_DEV_DIR="~/dev"

dotkit apply profiles/kit runs folders in this order:

  1. configs/ - system preferences
  2. tools/ - package managers
  3. packages/ - apps
  4. git/ - config and repo clones
  5. dotfiles/ - symlink farm (has link.env)
  6. manual/ - checklist (has todo.env)

Shell scripts run first, before any tools are installed. No package manager required.

configs/dock.sh
defaults write com.apple.dock autohide -bool true
defaults write com.apple.dock tilesize -int 48
killall Dock

Install package managers and toolchains. Uses community modules:

tools/community.txt
map dotkit run :tools/{{item}}
brew
node-fnm
rust
uv

With tools in place, install everything else.

brew.md - Homebrew taps, formulae, and casks:

# Homebrew
## map
- brew tap **1**
- hashicorp/tap
## map
- brew install **1**
- gh
- ripgrep
- dockutil
## map
- brew install --cask **1**
- firefox
- visual-studio-code
- ghostty

mas.txt - Mac App Store apps (macOS only):

try command -v mas
brew install mas
echo 'Sign in to the App Store manually first'
---
map mas install {{key}}
# Development
497799835 = Xcode
# Communication
310633997 = WhatsApp

Git global config and repo clones. run.env provides a folder-scoped variable:

git/run.env
MY_DEV_DIR=$DOTKIT_DEV_DIR

config.txt - set global git options:

git config --global core.excludesfile ~/.gitignore_global
---
map git config --global {{key}} {{value}}
#user.name = Your Name
#user.email = [email protected]
#init.defaultBranch = main

repos.txt - clone your repos:

map git clone [email protected]:{{1}}/{{2}}.git $MY_DEV_DIR/{{3}}
#yourname = dotkit = dotkit
#yourname = dotfiles = dotfiles

Symlinked to ~/. Every file here appears at its corresponding path in your home directory.

dotfiles/link.env
DEST=~
dotfiles/.zshrc → ~/.zshrc
dotfiles/.gitignore_global → ~/.gitignore_global

Generates a TODO.md checklist of steps that can’t be automated.

manual/todo.env
DEST=..
TITLE=Setup Checklist
manual/setup.md
- [ ] Sign in to the App Store
- [ ] Configure VPN
- [ ] Set up Password Manager

Re-apply symlinks after adding a dotfile:

Terminal window
dotkit link dotfiles

Install a new package and track it:

Terminal window
dotkit add packages/brew neovim

This adds neovim to the map block in brew.md and installs it immediately.