These are my personal dotfiles. They install the exact environment I use every day, and they are intentionally opinionated.
Since I use both Mac and Linux, most things here need to work on both.
See docs/ for technical and maintenance documentation.
I have tested clean installations on:
- Ubuntu 24.04 and 26.04 on ARM;
- macOS Sequoia and macOS 26 on Apple Silicon;
- Omarchy on ARM64 (disposable VM, including a repeat installation).
I also use them daily on Fedora Asahi Remix 44 (ARM64), but Fedora has not been
tested from a clean installation yet. Traditional Fedora and plain Arch are
accepted; plain Arch and x86_64 Omarchy have not had clean-install tests. Debian
is also accepted (Debian 13 ARM64 packages checked, full install not yet
tested). Alpine has a native apk path (Alpine 3.24 ARM64 components tested;
full installer and repeat full install not yet verified). Atomic or OSTree
variants and other Linux distributions are rejected by the installer.
Package selections live in config/packages.list,
shared by all supported systems and the macOS Brewfile. See
installer maintenance for adding packages and the
Debian/Arch/Omarchy/Alpine policies. Supported distro IDs and package managers
live in config/install-platforms.list; adding
a distro with an existing package manager no longer requires new dispatch
branches.
No major problems have shown up so far. That is not a promise that the installer will work on your machine.
Before running anything, open install.sh and check what it does. It installs
packages and replaces shell, editor, terminal, Git, and tmux configuration.
Personal Pi configuration is managed separately by
synchosts, not by the installer. Existing targets
are moved to a timestamped directory under ~/.dotfiles-backups/, but you
should still keep your own backup.
Install Git first. On Alpine, also install Bash and configure doas or sudo for
your normal user; enable the release's main and community repositories. See
the Alpine policy for native tools and limits.
For a new checkout (~/dotfiles must not already exist), run:
git clone https://github.com/luizomf/dotfiles.git ~/dotfiles
cd ~/dotfiles
./install.shThe repository must live at ~/dotfiles. If you already cloned it, do not
clone again: use cd ~/dotfiles && ./install.sh. Run the installer as your
normal user, not with sudo ./install.sh; it requests elevated permissions
for individual system operations. Start a new login shell when installation
finishes.
Python setup failures preserve the original error and do not stop independent configuration steps. The installer skips the remaining Python setup and its checks, then reports the failed operation and exit code at the end and exits nonzero. This is an incomplete installation, not success. Other failures still stop the installer immediately. Fix the reported cause before rerunning; nothing is rolled back automatically.
The installer also enables this checkout's pre-commit checks, unless an existing
hook setup must be preserved. A plain clone does not activate Git hooks. For an
existing installation, run ./scripts/setup_git_hooks after updating, without
rerunning the installer. Use commit --help and commit --check for the quick
workflow; see hook setup and dependencies.
If you're feeling lucky... bet on it:
OM_INSTALL_ASSUME_YES=1 enables unattended mode, not quiet mode: logs and
errors remain visible. It skips confirmation and Git identity prompts, enables
Homebrew's non-interactive installer, disables Git credential prompts, and
closes stdin for child installers. Direct sudo calls use -n: missing
authorization fails instead of waiting for a password. Alpine prefers doas and
likewise uses doas -n in unattended mode; the sudo examples below apply when
using sudo, not doas. Provision the appropriate privilege access beforehand; an
interactive sudo -v can help for a local run, but its cached authorization may
expire during a long installation. Third-party commands that require interaction
may fail rather than complete unattended. No privileges are granted by this
flag.
First installation only: clone to the explicit destination, regardless of
which directory your terminal is currently in. sudo -v asks for your password
before the installer disables prompts.
# 🚨 DANGEROUS (I mean it)
git clone https://github.com/luizomf/dotfiles.git ~/dotfiles &&
cd ~/dotfiles &&
sudo -v &&
OM_INSTALL_ASSUME_YES=1 ./install.shAlready cloned? Use this instead; do not create another nested checkout:
cd ~/dotfiles && sudo -v && OM_INSTALL_ASSUME_YES=1 ./install.shIf you see sudo: a password is required, authorization is missing or expired.
In a local terminal, authenticate again with sudo -v and rerun the command
above. If authorization keeps expiring, use normal interactive mode instead:
cd ~/dotfiles && env -u OM_INSTALL_ASSUME_YES ./install.shsudo -v is an interactive preparation step, not a solution for a job with
nobody available to enter a password. Provision the job user's required sudo
permissions beforehand. In that same execution environment, sudo -n true
checks basic non-interactive access; it does not prove permission for every
command the installer needs. Missing permission causes failure, not a prompt. Do
not run the whole installer as root to work around this.
Configure Git identity separately in ~/.gitconfig.local when needed.
50/50 chance everything is gonna be OK.
Made with hate, coffee, and a little bit of love.