This repository documents a repeatable, conservative setup for my Apple-silicon Macs. It is a starting point, not a command list to run blindly: install the small shared baseline first, then add software for the machine's role.
Last reviewed: 2026-08-26
- Daily driver: MacBook Pro, M4 Max, 64 GB RAM, 2 TB storage.
- Live Minecraft servers: Mac mini, M4 Pro.
- Private test/development/backup server: Mac mini, M2 Pro.
- Staff-test server: Mac mini, M1.
- macOS currently observed:
26.6.2, Apple silicon (arm64). - Java currently used for server work: Oracle JDK
26.0.2.1.
The Macs are intentionally not identical in every detail. A live server should stay lean, while the daily driver can contain editors, media tools, and development utilities.
Complete macOS updates, Apple ID/iCloud, FileVault, backups, and 1Password.
Install Xcode Command Line Tools:
xcode-select --install
Install Homebrew from brew.sh. Homebrew is installed under
/opt/homebrewon Apple silicon:/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"Follow the installer’s instructions to add Homebrew to the shell environment, then open a new terminal. On Apple silicon, the usual setup is:
echo'eval "$(/opt/homebrew/bin/brew shellenv)"'>>"$HOME/.zprofile"eval"$(/opt/homebrew/bin/brew shellenv)"
Clone this repository, then enter it:
git clone https://github.com/mrfloris/mac.git "$HOME/Projects/mac"cd"$HOME/Projects/mac"
Install a role-aware Homebrew profile. For a full daily-driver setup:
bash homebrew/bootstrap.sh --all
Install Oracle JDK manually as described in java/README.md. Do not assume that Homebrew
openjdkand Oracle JDK are the same installation.Configure iTerm2, Oh My Zsh, Powerlevel10k, SSH keys, GitHub CLI, and project-specific tools as described in terminal/README.md.
Verify the machine:
brew doctor brew list --formula brew list --cask java -version
- A formula is normally a command-line tool, library, runtime, or developer dependency. Install one with
brew install name. - A cask is normally a macOS application, font, or GUI package. Install one with
brew install --cask name. - Do not put libraries into a hand-maintained baseline just because they appear in
brew list; Homebrew installs them as dependencies. brew bundle dumpis useful for an inventory, but its output can include every dependency. Review it before using it as a new-machine manifest.- Homebrew performs cleanup after installs/upgrades by default. Keep that behavior enabled.
- The local shell configuration uses
HOMEBREW_NO_ASK=1to avoid upgrade confirmation prompts andHOMEBREW_NO_ENV_HINTS=1to hide repetitive hints. These do not disable cleanup.
The intentional shared baseline is in homebrew/Brewfile. It contains direct choices, not the entire dependency graph.
Homebrew synchronizes packages only. It does not synchronize .zshrc, .p10k.zsh, SSH configuration, iTerm2 profiles, application preferences, licenses, or project files; manage those separately and never commit secrets.
All four Macs use Oh My Zsh and Powerlevel10k. The intended shared plugin list matches the M4Max configuration:
plugins=(alias-finder brew common-aliases copypath copyfile docker encode64 git history jsontools macos web-search z autoupdate zsh-autosuggestions zsh-history-substring-search zsh-syntax-highlighting)The first group is bundled with Oh My Zsh. The additional plugins are cloned into the Oh My Zsh custom directory:
autoupdate: automatically checks for Oh My Zsh updates.zsh-autosuggestions: suggests commands from shell history.zsh-history-substring-search: searches history by the text already typed.zsh-syntax-highlighting: highlights shell syntax and must remain last in the plugin list.
Install only missing custom plugins with the idempotent commands in terminal/README.md. Do not also source a Homebrew copy of zsh-syntax-highlighting; use the Oh My Zsh custom plugin once.
The four Macs now use the same Powerlevel10k configuration and prompt behavior. The shared left prompt contains:
- a local machine label selected by the machine’s hostname;
- the macOS icon;
- the current directory and Git status;
- a second line with the prompt character.
The .p10k.zsh files are identical, and the Powerlevel10k theme was synchronized to revision f2f0149 on 2026-08-26. The M4Max loads P10k from its standalone ~/powerlevel10k checkout; the minis load it through the Oh My Zsh custom theme directory. Both layouts are valid, but a machine should use only one P10k theme-loading path.
Keep the hostname-to-label function local. Do not publish real hostnames, SSH aliases, IP addresses, or network topology in this repository. After changing P10k or .p10k.zsh, reload the shell:
exec zshFor Powerlevel10k icons, set the iTerm2 profile font to MesloLGS NF. The font files are installed on all four Macs. Font size is an iTerm2 preference and can be set to 15 if identical sizing is desired.
The four machines currently share these direct tools where appropriate:
- Build/development:
git,gh,gradle,gradle-completion,maven,node,pipx. - Shell/operations:
bpytop,jq,yq,nmap,mtr. - Media/codec work:
ffmpeg,sdl2-compat,sdl3,x264,x265. - Media download:
yt-dlp. - Official network testing:
speedtestfrom the trustedteamookla/speedtesttap.
speedtest-cli and youtube-dl are not used. The former is deprecated upstream; yt-dlp replaces the latter.
The current Homebrew-managed GUI baseline includes iTerm2, Alfred, Keka, App Cleaner, Stats, DB Browser for SQLite, Transmit, Vorssaint, Screenflick, OnyX, Sublime Text, and Sublime Merge. Existing licensed applications can be registered with Homebrew using --adopt; this does not intentionally remove their preferences, history, projects, or license files.
Screenflick adoption succeeded on all four Macs after the applications were updated to the current cask version. OnyX was then deliberately replaced with the current Homebrew cask on all four Macs:
| App | Current cask | Existing versions observed |
|---|---|---|
| Screenflick | 3.3.3 | adopted on all four Macs |
| OnyX | 5.0.2 | replaced on all four Macs |
Both applications are now in the active Brewfile and will be managed by Homebrew on future synchronizations.
Role-specific applications such as OBS, IINA, Notion, Bartender, and Disk Space can be added separately when needed.
The machines use Oracle JDK 26.0.2.1 for the current server runtime. The laptop also retains Oracle JDK 25 and Temurin 17/21 for older projects. Homebrew’s openjdk formula may still exist as a dependency of Homebrew-managed Gradle or Maven; it is not Oracle JDK.
Use these commands to inspect the selected runtime:
java -version
/usr/libexec/java_home -VFor a project that needs a specific JDK, set JAVA_HOME explicitly or use the project’s Gradle/Maven toolchain configuration. See java/README.md.
Some software is installed through its vendor or the App Store because that is the most reliable licensing or update path: Xcode, Logic Pro, DaVinci Resolve, Affinity, Blackmagic Disk Speed Test, and similar products. Homebrew is optional for these applications.
The screenshot guide contains the personal defaults settings and the interactive configuration script. Review its values before applying them on a new Mac.
The private backlog is kept in TODO.local.md and is intentionally ignored by Git. This public repository documents the stable setup; personal network details, aliases, and unfinished operational notes stay local.
For occasional manual maintenance of Oh My Zsh, its custom plugins, and Homebrew, run:
./terminal/update-all.shThis is deliberately not part of shell startup. It updates the shell tooling,
upgrades Homebrew packages, and cleans Homebrew leftovers. The preferred
interactive update-all function reloads the current shell without creating
an extra nested shell.
See CHANGELOG.md for setup changes over time. Private unfinished work is deliberately not published.