This is my collection of dotfiles. Feel free to browse and borrow anything you like ("borrowing" is how most of this config ended up here anyway 😁).
It's useful for me to have my dotfiles under source control, so that they are: backed up, versioned and shareable between multiple computers.
I want my tools (especially my daily tools, like my editor and the command line) to bring me joy. So:
- Don't add a line without understanding what it does and why I need it
- Add a descriptive comment to every line in every dotfile
nvim/— LazyVim configzshrc— Zsh + Oh My Zsh configstarship.toml— Shell prompt (Starship)lazygit.yml— Lazygit TUI configgitconfig— Git aliases and settingsBrewfile— All packages and appstmux.conf— tmux config (mouse, true colour, vi copy mode)gruvbox-dark.itermcolors— iTerm2 colour preset
- Move (don't copy) the file/folder into
~/dotfiles - Remove the preceding
.from its name - Add the name to the
linkblock ininstall.conf.yaml - Run
./install
For a fully automated install, run ./setup.sh after cloning. The steps below explain what it does.
xcode-select --install
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"Generate SSH keys and add to GitHub.
git clone git@github.com:jnsya/dotfiles.git ~/dotfiles
cd ~/dotfiles && ./installbrew bundlesh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# If oh-my-zsh overwrote ~/.zshrc, restore the symlink:
rm ~/.zshrc && cd ~/dotfiles && ./install
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
git clone https://github.com/Aloxaf/fzf-tab \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/fzf-tab
$(brew --prefix)/opt/fzf/install
source ~/.zshrc- Font: Preferences → Profiles → Text → set font to
FiraCode Nerd Font Mono - Colours: Preferences → Profiles → Colors → Color Presets → Import → select
~/dotfiles/gruvbox-dark.itermcolors, then choosegruvbox-dark
Open nvim — LazyVim auto-installs all plugins on first launch.
Use mise for all language versions (Ruby, Node, Python, etc). See mise section below.
mise use --global ruby@latest
mise use --global node@ltsQuick cheatsheet for tools I always forget:
zoxide: zi fuzzy-pick from history
lazygit: lg open TUI
space=stage enter=hunk-stage c=commit r=rebase ?=help
tmux: dev open dev layout (nvim left | claude right, terminal bottom)
dev myapp same but with a named session (re-running re-attaches)
Ctrl+b [ enter scroll/copy mode (vi keys to move, q to exit)
Ctrl+b z zoom current pane to fullscreen (again to unzoom)
Ctrl+b →←↑↓ move between panes
Ctrl+b d detach session (keep it running in background)
tmux ls list running sessions
tmux a re-attach to last session
Keyboard: Ctrl+b [ enters copy mode. Use Ctrl+u/Ctrl+d to scroll half-page, or arrow keys. q to exit.
Mouse: scroll wheel works, but TUI apps (like Claude Code) capture mouse events. Hold Shift while scrolling to bypass the app and let tmux scroll instead.
mise is the one tool that manages versions of Ruby, Node, Python, and anything else. Don't use rbenv, nvm, pyenv, or asdf — mise replaces all of them.
mise reads a config file in each project directory and automatically activates the right version when you cd in. No manual switching needed.
It understands the old version files too, so existing projects just work:
.ruby-version(rbenv format) ✓.tool-versions(asdf format) ✓.mise.toml(native format) ✓
cd my-project
mise install # if the project already has a .ruby-version or .tool-versions file
# this installs whatever version it specifies
mise use ruby@3.4 # if there's no file yet — installs 3.4 and writes a .mise.tomlmise current # what versions are active right now?
mise ls # all installed versions
mise use --global ruby@3.4 # change your global default
mise use --global node@ltsmise use --global python@3.12 # installs and sets as global defaultThat's it. Same pattern for every language.
This repo is managed with Dotbot.