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!