@fohte's personal dotfiles for macOS and Linux environments.
- ✏️ Editor
- Neovim - My beloved editor of choice (config/nvim)
- 💻 Shell & Terminal
- Zsh - Feature-rich shell (config/zsh)
- tmux - Terminal multiplexer (config/tmux)
- Ghostty - GPU-accelerated terminal (config/ghostty)
- 🔧 Development Tools
- Git - Git configuration and ignore patterns (config/git)
- tig - Text-based Git interface (config/tig)
- EditorConfig - Editor settings standardization (config/editorconfig)
- Prettier - Code formatter (config/prettier)
- RuboCop - Ruby static code analyzer (config/rubocop)
- Claude Code - AI coding assistant configuration (config/claude)
- ⚙️ System Tools
- mise - Runtime and tool version manager (config/mise)
- ripgrep - Fast text search tool (config/rg)
- GnuPG - Encryption and signing tool (config/gnupg)
- 🖥️ Desktop Apps
- yabai - Tiling window manager for macOS (config/yabai)
- Karabiner-Elements - Keyboard remapping for macOS (config/karabiner)
- Hammerspoon - Automation tool for macOS (config/hammerspoon)
- BetterTouchTool - Advanced input customization for macOS (config/bettertouchtool)
- Raycast - Productivity launcher for macOS (config/raycast)
- AquaSKK - Japanese input method for macOS (config/aquaskk)
- Espanso - Cross-platform text expander (config/espanso)
- 📁 Custom Scripts
- bin - Utility shell scripts
Clone the repository, set the machine role, and run the dot command:
git clone https://github.com/fohte/dotfiles ~/ghq/github.com/fohte/dotfiles
cd ~/ghq/github.com/fohte/dotfiles
git submodule update --init
config/bin/dot role set private # or: dot role set work repo=<owner>/<name>
config/bin/dot deployAfter the initial deployment, dot will be available on your PATH (via the bin symlink to ~/bin).
dot deploy requires a machine role to be set so that overlay files (e.g. extra MCP
servers, role-specific zsh tweaks) are merged into the right configs. The role is stored
in the gitignored .role file at the repository root.
| Role | Overlay source |
|---|---|
private |
config/<tool>/<file>.private.<ext> (in this repo, git-tracked) |
work |
~/ghq/github.com/<owner>/<name>/config-overlays/<tool>/<file> (external repo) |
dot role set private
dot role set work repo=<owner>/<name>
dot role get # print the current role
dot role get repo # print the repo (work only)
dot role overlay config/zsh/.zshrc # print the overlay path for a given fileTools that consume the role:
config/zsh/.zshenvand.zshrcsource role overlays via symlinks at~/.config/zsh/.zshenv.overlay/~/.config/zsh/.zshrc.overlay. The symlinks are created bydot deploy, so re-run it after changing the role.config/claude/Makefilemerges role overlays intosettings.json/mcp-servers.json.
Run dot refresh to update the dotfiles and upgrade packages:
dot refreshThis command automatically updates the SKK dictionary, Neovim plugins, mise tools, and more.
The deployment system uses the symlinks bash script to define how configuration files are linked to your system. This script contains conditional blocks that:
- Check for specific tags using the
match_tagfunction - Use the
symfunction to create symbolic links from source to destination - Handle platform-specific paths with
is_macos,is_linux,is_wslfunctions
For example:
if match_tag nvim; then
sym config/nvim ~/.config/nvim
fiThe dot deploy command reads the symlinks file and supports various options to customize the deployment process:
- Deploy only specified configs:
dot deploy -t nvim,zsh
- Force deployment:
dot deploy -f
- Dry run:
dot deploy -f -t nvim -n
- Enable debug mode:
dot deploy --debug
