Lukas's dotfiles
Personal macOS dotfiles. Bash-first, plugin-light, designed for a fast
one-shot setup on a fresh machine. For machine-specific overrides see
the *.local files.
Inspired by and structurally based on @alrra/dotfiles.
- π§ Setup
- π What's inside
- π¨ Customize
- π οΈ Common commands
- βοΈ Editor configs (VS Code + Cursor)
βοΈ Update- π License
To set up the dotfiles run the appropriate snippet in the terminal:
β οΈ DO NOT run thesetupscript if you do not fully understand what it does. Seriously, DON'T!
| OS | Snippet |
|---|---|
| macOS | bash -c "$(curl -LsS https://raw.github.com/lukasjuhas/dotfiles/main/src/os/setup.sh)" |
That's it. β¨
The setup process will:
- Download the dotfiles to your computer
(suggests
~/projects/dotfilesby default). - Symlink the Git, shell, tmux, and Vim related
files into
$HOME. - Symlink the shared VS Code / Cursor
settings.json,keybindings.json, andsnippets/into both editors' user directories. - Prompt for Full Disk Access if missing (required on modern
macOS for many
defaults writecalls to take effect; seeinit.sh). - Apply the Brewfile (
brew bundle) β installs every formula, cask, and Mac App Store app in one declarative pass. Browser variants, dead taps, and unused apps have all been pruned; this list contains only what is actually used. - Set custom macOS defaults (Finder, Dock, trackpad, keyboard, screenshots, Stage Manager off, etc.).
Apple Silicon. Tahoe (macOS 26) or newer.
.
βββ Brewfile β every formula, cask, MAS app (declarative)
βββ justfile β shortcut recipes (see below)
βββ renovate.json β dependency updates
βββ scripts/ β lint + link-check (CI)
βββ src/
βββ bin/ β personal scripts (tile-dual, tile-quad, β¦)
βββ git/ β gitconfig, gitignore, gitattributes
βββ shell/ β bash_aliases, bash_exports, bash_prompt, β¦
βββ tmux/ β tmux.conf
βββ vim/ β minimal plugin-free vimrc
βββ vscode/ β shared VS Code + Cursor config
βββ os/
βββ setup.sh β entry point
βββ create_symbolic_links.sh β bash/git/tmux/vim symlinks
βββ link_vscode_configs.sh β VS Code + Cursor symlinks
βββ installs/
β βββ composer.sh β Laravel Valet wiring
β βββ npm.sh β global npm updates
β βββ nvm.sh β Node Version Manager (not on Homebrew)
β βββ macos/
β βββ bash.sh β chsh to Homebrew bash
β βββ brewfile.sh β apply the root Brewfile
β βββ homebrew.sh β install brew, wire /opt/homebrew into PATH
β βββ xcode.sh β Xcode CLT + licence accept
βββ preferences/macos/
βββ init.sh β Full Disk Access check
βββ dock.sh / finder.sh / β¦
βββ ui_and_ux.sh β Stage Manager off, .DS_Store control, β¦
The dotfiles can be extended for machine-specific needs via three local files (sourced or included automatically):
Sourced after every other Bash file, so it can override aliases,
exports, and PATH. This is the right place for secrets and
host-specific tweaks (e.g. API tokens).
#!/bin/bash
# Add personal scripts to PATH.
PATH="$HOME/projects/dotfiles/src/bin:$PATH"
export PATH
# Local secrets β never commit.
export SOME_API_TOKEN="β¦"
export OPENAI_API_KEY="β¦"π‘ For tokens with broader scope (per-project), consider
direnvwith an.envrcfile inside the project β bothdirenvand the bash hook are installed by these dotfiles.
Included after ~/.gitconfig, so it overrides or adds to the
configurations. Use it for your identity and signing key β these are
deliberately NOT tracked in this repo.
[user]
name = Your Name
email = you@example.com
signingKey = XXXXXXXX
[commit]
# https://docs.github.com/en/authentication/managing-commit-signature-verification
gpgSign = trueSourced at the end of ~/.vimrc (see src/vim/vimrc last
block). The shared vim config is intentionally minimal (~140 lines,
zero plugins) since day-to-day editing happens in Cursor/VS Code.
" Example: disable arrow keys in insert and normal mode.
inoremap <Down> <ESC>:echoe "Use j"<CR>
inoremap <Left> <ESC>:echoe "Use h"<CR>
inoremap <Right> <ESC>:echoe "Use l"<CR>
inoremap <Up> <ESC>:echoe "Use k"<CR>just (installed via the Brewfile) provides shortcut
recipes:
just # list recipes
just setup # full one-shot setup
just install # only run installers (Homebrew, casks, CLI)
just bundle # apply the Brewfile (formulae + casks + MAS)
just bundle-check # what's missing vs. the Brewfile?
just bundle-dump # rewrite the Brewfile from currently-installed packages
just prefs # only apply macOS defaults
just link # (re)create the bash/git/tmux/vim symlinks
just link-editors # (re)symlink VS Code + Cursor configs
just update # softwareupdate + brew + mas + npm + pnpm
just lint # shellcheck + markdownlint
just check # lint + broken-link checkThe Brewfile is the single source of truth for everything
installable via Homebrew (formulae, casks) and mas (Mac App Store).
To add a tool: edit the Brewfile, then just bundle. To audit drift
between this repo and your machine: just bundle-check.
src/vscode/ holds a single shared
settings.json, keybindings.json, and snippets/ directory.
src/os/link_vscode_configs.sh symlinks them into
both editors:
~/Library/Application Support/Code/User/ β
βββ src/vscode/
~/Library/Application Support/Cursor/User/ β
Cursor is a VS Code fork and reads the same format. Unknown keys
(e.g. cursor.* in VS Code, claudeCode.* in Cursor) are silently
ignored by the editor that doesn't know them, so a single shared
file just works. Pre-existing local files are backed up to
<file>.backup.<timestamp> before the symlink is created.
To pull the latest dotfiles and re-run setup:
just setupTo bring the system up to date (without re-running setup):
just updateTo re-run only one piece:
just install # apps + CLI tools only
just prefs # macOS defaults only
just link # rebuild symlinks onlyThe code is available under the MIT License.
Inspired by and based on @alrra/dotfiles. Thanks!