Personal dotfiles for macOS and Linux with a unified installer, overlays, and container support.
- (macOS only, optional) install available system updates.
sudo softwareupdate -i -r- Clone this repository.
git clone git@github.com:iagodahlem/dotfiles.git ~/.dotfiles
cd ~/.dotfiles- Run the unified installer.
./scripts/install.shOptional installer flags:
DOTFILES_SKIP_PACKAGES=1skip package installation.DOTFILES_SKIP_DOTFILES=1skip symlink creation.DOTFILES_SKIP_SHELL=1skip Oh My Zsh and plugin install.DOTFILES_SKIP_NODE_GLOBALS=1skip global Node package install.DOTFILES_SKIP_OS_DEFAULTS=1skip OS-specific defaults/tweaks.
Global Node packages come from config/npm/globals and are installed with pnpm (or bootstrapped with corepack when available).
docker build -f containers/Dockerfile -t dotfiles-devbox .
docker run --rm -it dotfiles-devboxdocker build -f containers/Dockerfile.arch -t dotfiles-devbox-arch .
docker run --rm -it dotfiles-devbox-archdevbox: Ubuntu dev shell with bind-mounted workspace (DOTFILES_WORKSPACE, default.).devbox-arch: Arch dev shell (--profile arch).devbox-isolated: Ubuntu dev shell with isolated named volume workspace (--profile isolated).
Examples:
docker compose run --rm devboxDOTFILES_WORKSPACE=.. docker compose run --rm devboxdocker compose --profile arch run --rm devbox-archdocker compose --profile isolated run --rm devbox-isolatedUse DOTFILES_CONTAINER_MINIMAL=1 to skip Oh My Zsh/plugins during image build.
.
├── packages/ # Source of truth for dependencies
│ ├── Brewfile # Homebrew formulae
│ ├── Caskfile # Homebrew casks
│ ├── Fontfile # Homebrew font casks
│ ├── apt.txt
│ ├── pacman.txt
│ └── aur.txt
├── scripts/
│ ├── install.sh # main entrypoint
│ ├── install-packages.sh
│ ├── install-dotfiles.sh
│ ├── install-shell.sh
│ ├── install-node-globals.sh
│ ├── devbox-smoke.sh
│ ├── lint-shell.sh
│ └── utils/os.sh
├── os/
│ ├── macos.sh
│ ├── ubuntu.sh
│ └── arch.sh
├── config/
│ ├── asdf/
│ ├── atuin/
│ ├── brew/
│ ├── cargo/
│ ├── git/
│ ├── npm/
│ ├── nvm/
│ ├── tmux/
│ └── zsh/
├── containers/
│ ├── Dockerfile
│ ├── Dockerfile.arch
│ └── entrypoint.sh
├── overlays/
│ ├── os/
│ └── host/
├── docker-compose.yml
├── .dockerignore
├── README.md
├── AGENTS.md
└── PLAN.md
scripts/install.shorchestrates install sub-steps.scripts/utils/os.shresolvesos_id(macos,ubuntu,debian,arch, orunknown).scripts/install-packages.shinstalls frompackages/per OS.scripts/install-dotfiles.shcreates symlinks in$HOMEand backs up existing files as*.bak.<timestamp>.scripts/install-shell.shinstalls Oh My Zsh, Powerlevel10k, and Zsh plugins.scripts/install-node-globals.shinstalls globals fromconfig/npm/globalswithpnpm.os/*.shapplies OS-specific tweaks/defaults.
Overlays provide optional OS- and host-specific shell customizations without separate repositories.
- OS overlay:
overlays/os/<os>/where<os>matchesos_id. - Host overlay:
overlays/host/<name>/withDOTFILES_HOST=<name>. - Supported overlay files today:
zsh/.exports,zsh/.aliases,zsh/.functions,zsh/.bootstrap.
Example:
overlays/os/ubuntu/zsh/.aliases
overlays/host/work-laptop/zsh/.exports
scripts/lint-shell.shruns shellcheck on installer/container shell scripts.scripts/devbox-smoke.shbuilds a target Dockerfile and verifies non-root login and core symlinks.- CI runs shellcheck in a dedicated container image and smoke tests for Ubuntu + Arch Dockerfiles.
os/ubuntu.shandos/arch.share currently placeholders.- Install scripts are intentionally stateful and can modify system settings/packages.
We can learn a lot about productivity just exploring the way people work every day. Personally, I got highly inspired by Holman, Mathias Bynens, Deny Dias and by this setup and readme.
I can't agree more with Holman's thoughts on dotfiles: dotfiles are meant to be forked.
MIT License © Iago Dahlem