Skip to content

Repository files navigation

My Mac setup

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

Current environment

  • 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.

New-Mac order of operations

  1. Complete macOS updates, Apple ID/iCloud, FileVault, backups, and 1Password.

  2. Install Xcode Command Line Tools:

    xcode-select --install
  3. Install Homebrew from brew.sh. Homebrew is installed under /opt/homebrew on 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)"
  4. Clone this repository, then enter it:

    git clone https://github.com/mrfloris/mac.git "$HOME/Projects/mac"cd"$HOME/Projects/mac"
  5. Install a role-aware Homebrew profile. For a full daily-driver setup:

    bash homebrew/bootstrap.sh --all
  6. Install Oracle JDK manually as described in java/README.md. Do not assume that Homebrew openjdk and Oracle JDK are the same installation.

  7. Configure iTerm2, Oh My Zsh, Powerlevel10k, SSH keys, GitHub CLI, and project-specific tools as described in terminal/README.md.

  8. Verify the machine:

    brew doctor
    brew list --formula
    brew list --cask
    java -version

Homebrew terminology and policy

  • 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 dump is 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=1 to avoid upgrade confirmation prompts and HOMEBREW_NO_ENV_HINTS=1 to 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.

Oh My Zsh plugin baseline

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.

Powerlevel10k prompt baseline

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 zsh

For 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.

Current shared baseline

Formulae

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: speedtest from the trusted teamookla/speedtest tap.

speedtest-cli and youtube-dl are not used. The former is deprecated upstream; yt-dlp replaces the latter.

Casks

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:

AppCurrent caskExisting versions observed
Screenflick3.3.3adopted on all four Macs
OnyX5.0.2replaced 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.

Java

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 -V

For a project that needs a specific JDK, set JAVA_HOME explicitly or use the project’s Gradle/Maven toolchain configuration. See java/README.md.

Applications not managed by the baseline

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.

Screenshots

The screenshot guide contains the personal defaults settings and the interactive configuration script. Review its values before applying them on a new Mac.

Local maintenance notes

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.sh

This 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.

About

My Mac (dev) setup

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - mrfloris/mac: My Mac (dev) setup · GitHub
Skip to content

Repository files navigation

My Mac setup

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

Current environment

  • 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.

New-Mac order of operations

  1. Complete macOS updates, Apple ID/iCloud, FileVault, backups, and 1Password.

  2. Install Xcode Command Line Tools:

    xcode-select --install
  3. Install Homebrew from brew.sh. Homebrew is installed under /opt/homebrew on 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)"
  4. Clone this repository, then enter it:

    git clone https://github.com/mrfloris/mac.git "$HOME/Projects/mac"cd"$HOME/Projects/mac"
  5. Install a role-aware Homebrew profile. For a full daily-driver setup:

    bash homebrew/bootstrap.sh --all
  6. Install Oracle JDK manually as described in java/README.md. Do not assume that Homebrew openjdk and Oracle JDK are the same installation.

  7. Configure iTerm2, Oh My Zsh, Powerlevel10k, SSH keys, GitHub CLI, and project-specific tools as described in terminal/README.md.

  8. Verify the machine:

    brew doctor
    brew list --formula
    brew list --cask
    java -version

Homebrew terminology and policy

  • 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 dump is 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=1 to avoid upgrade confirmation prompts and HOMEBREW_NO_ENV_HINTS=1 to 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.

Oh My Zsh plugin baseline

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.

Powerlevel10k prompt baseline

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 zsh

For 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.

Current shared baseline

Formulae

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: speedtest from the trusted teamookla/speedtest tap.

speedtest-cli and youtube-dl are not used. The former is deprecated upstream; yt-dlp replaces the latter.

Casks

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:

AppCurrent caskExisting versions observed
Screenflick3.3.3adopted on all four Macs
OnyX5.0.2replaced 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.

Java

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 -V

For a project that needs a specific JDK, set JAVA_HOME explicitly or use the project’s Gradle/Maven toolchain configuration. See java/README.md.

Applications not managed by the baseline

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.

Screenshots

The screenshot guide contains the personal defaults settings and the interactive configuration script. Review its values before applying them on a new Mac.

Local maintenance notes

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.sh

This 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.

About

My Mac (dev) setup

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - mrfloris/mac: My Mac (dev) setup · GitHub
Skip to content

Repository files navigation

My Mac setup

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

Current environment

  • 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.

New-Mac order of operations

  1. Complete macOS updates, Apple ID/iCloud, FileVault, backups, and 1Password.

  2. Install Xcode Command Line Tools:

    xcode-select --install
  3. Install Homebrew from brew.sh. Homebrew is installed under /opt/homebrew on 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)"
  4. Clone this repository, then enter it:

    git clone https://github.com/mrfloris/mac.git "$HOME/Projects/mac"cd"$HOME/Projects/mac"
  5. Install a role-aware Homebrew profile. For a full daily-driver setup:

    bash homebrew/bootstrap.sh --all
  6. Install Oracle JDK manually as described in java/README.md. Do not assume that Homebrew openjdk and Oracle JDK are the same installation.

  7. Configure iTerm2, Oh My Zsh, Powerlevel10k, SSH keys, GitHub CLI, and project-specific tools as described in terminal/README.md.

  8. Verify the machine:

    brew doctor
    brew list --formula
    brew list --cask
    java -version

Homebrew terminology and policy

  • 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 dump is 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=1 to avoid upgrade confirmation prompts and HOMEBREW_NO_ENV_HINTS=1 to 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.

Oh My Zsh plugin baseline

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.

Powerlevel10k prompt baseline

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 zsh

For 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.

Current shared baseline

Formulae

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: speedtest from the trusted teamookla/speedtest tap.

speedtest-cli and youtube-dl are not used. The former is deprecated upstream; yt-dlp replaces the latter.

Casks

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:

AppCurrent caskExisting versions observed
Screenflick3.3.3adopted on all four Macs
OnyX5.0.2replaced 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.

Java

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 -V

For a project that needs a specific JDK, set JAVA_HOME explicitly or use the project’s Gradle/Maven toolchain configuration. See java/README.md.

Applications not managed by the baseline

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.

Screenshots

The screenshot guide contains the personal defaults settings and the interactive configuration script. Review its values before applying them on a new Mac.

Local maintenance notes

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.sh

This 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.

About

My Mac (dev) setup

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - mrfloris/mac: My Mac (dev) setup · GitHub
Skip to content

Repository files navigation

My Mac setup

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

Current environment

  • 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.

New-Mac order of operations

  1. Complete macOS updates, Apple ID/iCloud, FileVault, backups, and 1Password.

  2. Install Xcode Command Line Tools:

    xcode-select --install
  3. Install Homebrew from brew.sh. Homebrew is installed under /opt/homebrew on 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)"
  4. Clone this repository, then enter it:

    git clone https://github.com/mrfloris/mac.git "$HOME/Projects/mac"cd"$HOME/Projects/mac"
  5. Install a role-aware Homebrew profile. For a full daily-driver setup:

    bash homebrew/bootstrap.sh --all
  6. Install Oracle JDK manually as described in java/README.md. Do not assume that Homebrew openjdk and Oracle JDK are the same installation.

  7. Configure iTerm2, Oh My Zsh, Powerlevel10k, SSH keys, GitHub CLI, and project-specific tools as described in terminal/README.md.

  8. Verify the machine:

    brew doctor
    brew list --formula
    brew list --cask
    java -version

Homebrew terminology and policy

  • 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 dump is 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=1 to avoid upgrade confirmation prompts and HOMEBREW_NO_ENV_HINTS=1 to 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.

Oh My Zsh plugin baseline

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.

Powerlevel10k prompt baseline

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 zsh

For 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.

Current shared baseline

Formulae

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: speedtest from the trusted teamookla/speedtest tap.

speedtest-cli and youtube-dl are not used. The former is deprecated upstream; yt-dlp replaces the latter.

Casks

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:

AppCurrent caskExisting versions observed
Screenflick3.3.3adopted on all four Macs
OnyX5.0.2replaced 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.

Java

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 -V

For a project that needs a specific JDK, set JAVA_HOME explicitly or use the project’s Gradle/Maven toolchain configuration. See java/README.md.

Applications not managed by the baseline

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.

Screenshots

The screenshot guide contains the personal defaults settings and the interactive configuration script. Review its values before applying them on a new Mac.

Local maintenance notes

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.sh

This 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.

About

My Mac (dev) setup

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - mrfloris/mac: My Mac (dev) setup · GitHub
Skip to content

Repository files navigation

My Mac setup

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

Current environment

  • 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.

New-Mac order of operations

  1. Complete macOS updates, Apple ID/iCloud, FileVault, backups, and 1Password.

  2. Install Xcode Command Line Tools:

    xcode-select --install
  3. Install Homebrew from brew.sh. Homebrew is installed under /opt/homebrew on 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)"
  4. Clone this repository, then enter it:

    git clone https://github.com/mrfloris/mac.git "$HOME/Projects/mac"cd"$HOME/Projects/mac"
  5. Install a role-aware Homebrew profile. For a full daily-driver setup:

    bash homebrew/bootstrap.sh --all
  6. Install Oracle JDK manually as described in java/README.md. Do not assume that Homebrew openjdk and Oracle JDK are the same installation.

  7. Configure iTerm2, Oh My Zsh, Powerlevel10k, SSH keys, GitHub CLI, and project-specific tools as described in terminal/README.md.

  8. Verify the machine:

    brew doctor
    brew list --formula
    brew list --cask
    java -version

Homebrew terminology and policy

  • 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 dump is 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=1 to avoid upgrade confirmation prompts and HOMEBREW_NO_ENV_HINTS=1 to 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.

Oh My Zsh plugin baseline

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.

Powerlevel10k prompt baseline

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 zsh

For 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.

Current shared baseline

Formulae

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: speedtest from the trusted teamookla/speedtest tap.

speedtest-cli and youtube-dl are not used. The former is deprecated upstream; yt-dlp replaces the latter.

Casks

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:

AppCurrent caskExisting versions observed
Screenflick3.3.3adopted on all four Macs
OnyX5.0.2replaced 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.

Java

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 -V

For a project that needs a specific JDK, set JAVA_HOME explicitly or use the project’s Gradle/Maven toolchain configuration. See java/README.md.

Applications not managed by the baseline

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.

Screenshots

The screenshot guide contains the personal defaults settings and the interactive configuration script. Review its values before applying them on a new Mac.

Local maintenance notes

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.sh

This 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.

About

My Mac (dev) setup

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - mrfloris/mac: My Mac (dev) setup · GitHub
Skip to content

Repository files navigation

My Mac setup

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

Current environment

  • 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.

New-Mac order of operations

  1. Complete macOS updates, Apple ID/iCloud, FileVault, backups, and 1Password.

  2. Install Xcode Command Line Tools:

    xcode-select --install
  3. Install Homebrew from brew.sh. Homebrew is installed under /opt/homebrew on 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)"
  4. Clone this repository, then enter it:

    git clone https://github.com/mrfloris/mac.git "$HOME/Projects/mac"cd"$HOME/Projects/mac"
  5. Install a role-aware Homebrew profile. For a full daily-driver setup:

    bash homebrew/bootstrap.sh --all
  6. Install Oracle JDK manually as described in java/README.md. Do not assume that Homebrew openjdk and Oracle JDK are the same installation.

  7. Configure iTerm2, Oh My Zsh, Powerlevel10k, SSH keys, GitHub CLI, and project-specific tools as described in terminal/README.md.

  8. Verify the machine:

    brew doctor
    brew list --formula
    brew list --cask
    java -version

Homebrew terminology and policy

  • 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 dump is 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=1 to avoid upgrade confirmation prompts and HOMEBREW_NO_ENV_HINTS=1 to 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.

Oh My Zsh plugin baseline

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.

Powerlevel10k prompt baseline

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 zsh

For 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.

Current shared baseline

Formulae

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: speedtest from the trusted teamookla/speedtest tap.

speedtest-cli and youtube-dl are not used. The former is deprecated upstream; yt-dlp replaces the latter.

Casks

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:

AppCurrent caskExisting versions observed
Screenflick3.3.3adopted on all four Macs
OnyX5.0.2replaced 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.

Java

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 -V

For a project that needs a specific JDK, set JAVA_HOME explicitly or use the project’s Gradle/Maven toolchain configuration. See java/README.md.

Applications not managed by the baseline

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.

Screenshots

The screenshot guide contains the personal defaults settings and the interactive configuration script. Review its values before applying them on a new Mac.

Local maintenance notes

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.sh

This 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.

About

My Mac (dev) setup

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - mrfloris/mac: My Mac (dev) setup · GitHub
Skip to content

Repository files navigation

My Mac setup

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

Current environment

  • 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.

New-Mac order of operations

  1. Complete macOS updates, Apple ID/iCloud, FileVault, backups, and 1Password.

  2. Install Xcode Command Line Tools:

    xcode-select --install
  3. Install Homebrew from brew.sh. Homebrew is installed under /opt/homebrew on 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)"
  4. Clone this repository, then enter it:

    git clone https://github.com/mrfloris/mac.git "$HOME/Projects/mac"cd"$HOME/Projects/mac"
  5. Install a role-aware Homebrew profile. For a full daily-driver setup:

    bash homebrew/bootstrap.sh --all
  6. Install Oracle JDK manually as described in java/README.md. Do not assume that Homebrew openjdk and Oracle JDK are the same installation.

  7. Configure iTerm2, Oh My Zsh, Powerlevel10k, SSH keys, GitHub CLI, and project-specific tools as described in terminal/README.md.

  8. Verify the machine:

    brew doctor
    brew list --formula
    brew list --cask
    java -version

Homebrew terminology and policy

  • 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 dump is 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=1 to avoid upgrade confirmation prompts and HOMEBREW_NO_ENV_HINTS=1 to 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.

Oh My Zsh plugin baseline

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.

Powerlevel10k prompt baseline

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 zsh

For 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.

Current shared baseline

Formulae

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: speedtest from the trusted teamookla/speedtest tap.

speedtest-cli and youtube-dl are not used. The former is deprecated upstream; yt-dlp replaces the latter.

Casks

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:

AppCurrent caskExisting versions observed
Screenflick3.3.3adopted on all four Macs
OnyX5.0.2replaced 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.

Java

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 -V

For a project that needs a specific JDK, set JAVA_HOME explicitly or use the project’s Gradle/Maven toolchain configuration. See java/README.md.

Applications not managed by the baseline

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.

Screenshots

The screenshot guide contains the personal defaults settings and the interactive configuration script. Review its values before applying them on a new Mac.

Local maintenance notes

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.sh

This 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.

About

My Mac (dev) setup

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - mrfloris/mac: My Mac (dev) setup · GitHub
Skip to content

Repository files navigation

My Mac setup

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

Current environment

  • 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.

New-Mac order of operations

  1. Complete macOS updates, Apple ID/iCloud, FileVault, backups, and 1Password.

  2. Install Xcode Command Line Tools:

    xcode-select --install
  3. Install Homebrew from brew.sh. Homebrew is installed under /opt/homebrew on 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)"
  4. Clone this repository, then enter it:

    git clone https://github.com/mrfloris/mac.git "$HOME/Projects/mac"cd"$HOME/Projects/mac"
  5. Install a role-aware Homebrew profile. For a full daily-driver setup:

    bash homebrew/bootstrap.sh --all
  6. Install Oracle JDK manually as described in java/README.md. Do not assume that Homebrew openjdk and Oracle JDK are the same installation.

  7. Configure iTerm2, Oh My Zsh, Powerlevel10k, SSH keys, GitHub CLI, and project-specific tools as described in terminal/README.md.

  8. Verify the machine:

    brew doctor
    brew list --formula
    brew list --cask
    java -version

Homebrew terminology and policy

  • 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 dump is 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=1 to avoid upgrade confirmation prompts and HOMEBREW_NO_ENV_HINTS=1 to 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.

Oh My Zsh plugin baseline

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.

Powerlevel10k prompt baseline

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 zsh

For 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.

Current shared baseline

Formulae

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: speedtest from the trusted teamookla/speedtest tap.

speedtest-cli and youtube-dl are not used. The former is deprecated upstream; yt-dlp replaces the latter.

Casks

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:

AppCurrent caskExisting versions observed
Screenflick3.3.3adopted on all four Macs
OnyX5.0.2replaced 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.

Java

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 -V

For a project that needs a specific JDK, set JAVA_HOME explicitly or use the project’s Gradle/Maven toolchain configuration. See java/README.md.

Applications not managed by the baseline

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.

Screenshots

The screenshot guide contains the personal defaults settings and the interactive configuration script. Review its values before applying them on a new Mac.

Local maintenance notes

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.sh

This 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.

About

My Mac (dev) setup

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages