Repository files navigation

Dotfiles

My macOS dotfiles for Zsh.

Features

Note: Installation of Oh My Zsh is not optional. Everything else listed below can be opted-out of.

Installation

This install is intended for macOS and requires the Xcode Command Line Tools. It may overwrite existing dotfiles in $HOME (and potentially .vim-related files), so skim install.sh first if you have an existing setup.

curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash

Important

If you're provisioning a new machine, you can also apply my macOS defaults (see bin/macosdefaults) and install the optional GUI apps (see lib/brew):

curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash -s -- --configure-macos --install-casks

Forks

If you fork this repo and want the installer to pull from your fork:

DOTFILES_REPO=yourhandle/dotfiles curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash

Or just update the default value of DOTFILES_REPO in your fork and install from your repo.

First Time Setup

After running the installation script on a new machine, there are several manual steps to complete the setup. These are personal preferences and may differ for your setup.

  1. 1Password / SSH
    • Login to 1Password
    • Update 1Password settings & enable SSH key management (for git authentication)
    • Create development directory & test 1Password SSH agent is working
      mkdir ~/Sites
      git clone git@github.com:codfish/semantic-release-action.git ~/Sites/semantic-release-action
      
  2. Cloud sync + shell config
    • Login to Dropbox
    • Once Dropbox syncs, symlink your private zsh configuration:
      ln -s ~/Dropbox/configfiles/zshrc ~/.zshrc.before
      exec zsh
      
    • Login to Google Drive
  3. Open Alfred
    • Activate Powerpack license
    • Update settings sync to point to Dropbox
  4. Setup Code Editors
    • Sign into VS Code and enable Settings Sync
    • In Cursor, import settings & extensions from VS Code
  5. Todoist
    • Sign into Todoist
    • Update Desktop settings to change keyboard shortcuts as needed
  6. AI CLI logins
    claude login
    codex
    gemini
    

Usage

Run the dotfiles command:

dotfiles

You should run the update when:

  • You make a change to ~/.dotfiles/git/gitconfig (the only file that is copied rather than symlinked).
  • You want to pull changes from the remote repository.
  • You want to update Homebrew formulae and Node packages.

Options:

-h, --helpHelp
-l, --listList of additional applications to install
--no-packagesSkip package (brew/node/etc) updates
--no-syncSkip pulling from the remote repository
--configure-macosConfigure macOS settings programatically
--install-casksInstall mac apps via brew cask (won't install/update if it's already present)

Oh My Zsh

These dotfiles essentially wrap Oh My Zsh. When you install the dotfiles, Oh My Zsh will also get installed for you directly into the ~/.dotfiles directory.

  • $ZSH will be ~/.dotfiles/oh-my-zsh
  • $ZSH_CUSTOM will be ~/.dotfiles/oh-my-zsh-custom
  • Opinionated set of plugins are loaded
  • Everything is configurable if you want to change things

Oh My Zsh Plugins

  • aws
  • git
  • iterm2
  • history-substring-search
  • z

Homebrew formulae

Mac Applications Installed via Homebrew cask

  • Alfred 4
  • AppCleaner
  • Brave Browser
  • CloudApp
  • Docker Desktop
  • Express VPN
  • Google Chrome
  • Google Drive
  • iTerm2
  • Notion
  • Postman
  • Slack
  • Spotify
  • Visual Studio Code
  • zoom.us

Node packages

Custom macOS defaults

Custom macOS settings can be applied during the dotfiles process. You'll be prompted before this happens so you can say no.

They can also be applied independently by running the following command:

macosdefaults

Local/private

Any private and custom Bash commands and configuration should be placed in a ~/.zshrc.before or ~/.zshrc.after file. These files will not be under version control or committed to a public repository. If either or both exists, they will be sourced for inclusion in .zshrc.

  • ~/.zshrc.before: Sourced beforeoh-my-zsh.sh is loaded, therefore allowing you to effect what happens when oh-my-zsh.sh runs, without changing any tracked files. Some examples would be the ZSH_THEME or specific Oh My Zsh plugin configurations.
  • ~/.zshrc.after: Sourced afteroh-my-zsh.sh is loaded. You can override anything that was set by oh-my-zsh.sh.

Here is an example ~/.zshrc.before:

# PATH exports
PATH=$PATH:~/.gem/ruby/1.8/bin
export PATH
# Git credentials
# Not under version control to prevent people from
# accidentally committing with your details
GIT_AUTHOR_NAME="Chris O'Donnell"
GIT_AUTHOR_EMAIL="chris@example.com"
# Set the credentials (modifies ~/.gitconfig)
git config --global user.name "$GIT_AUTHOR_NAME"
git config --global user.email "$GIT_AUTHOR_EMAIL"
# Work Machine Aliases
alias web="cd ~/Sites/company/web"
ZSH_THEME="amuse"

Here is an example ~/.zshrc.after:

# override something
alias ll="ls -aGlFh"

Note: Because the dotfiles/gitconfig file is copied to ~/.gitconfig, any private git configuration specified in ~/.zshrc.before or ~/.zshrc.after will not be committed to your dotfiles repository.

Acknowledgements

Inspiration and code was taken from many sources, including:

About

My macOS dotfiles: Oh My Zsh, git, brew, node, mac settings, mac apps, and more.

Topics

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Dotfiles

My macOS dotfiles for Zsh.

Features

Note: Installation of Oh My Zsh is not optional. Everything else listed below can be opted-out of.

Installation

This install is intended for macOS and requires the Xcode Command Line Tools. It may overwrite existing dotfiles in $HOME (and potentially .vim-related files), so skim install.sh first if you have an existing setup.

curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash

Important

If you're provisioning a new machine, you can also apply my macOS defaults (see bin/macosdefaults) and install the optional GUI apps (see lib/brew):

curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash -s -- --configure-macos --install-casks

Forks

If you fork this repo and want the installer to pull from your fork:

DOTFILES_REPO=yourhandle/dotfiles curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash

Or just update the default value of DOTFILES_REPO in your fork and install from your repo.

First Time Setup

After running the installation script on a new machine, there are several manual steps to complete the setup. These are personal preferences and may differ for your setup.

  1. 1Password / SSH
    • Login to 1Password
    • Update 1Password settings & enable SSH key management (for git authentication)
    • Create development directory & test 1Password SSH agent is working
      mkdir ~/Sites
      git clone git@github.com:codfish/semantic-release-action.git ~/Sites/semantic-release-action
      
  2. Cloud sync + shell config
    • Login to Dropbox
    • Once Dropbox syncs, symlink your private zsh configuration:
      ln -s ~/Dropbox/configfiles/zshrc ~/.zshrc.before
      exec zsh
      
    • Login to Google Drive
  3. Open Alfred
    • Activate Powerpack license
    • Update settings sync to point to Dropbox
  4. Setup Code Editors
    • Sign into VS Code and enable Settings Sync
    • In Cursor, import settings & extensions from VS Code
  5. Todoist
    • Sign into Todoist
    • Update Desktop settings to change keyboard shortcuts as needed
  6. AI CLI logins
    claude login
    codex
    gemini
    

Usage

Run the dotfiles command:

dotfiles

You should run the update when:

  • You make a change to ~/.dotfiles/git/gitconfig (the only file that is copied rather than symlinked).
  • You want to pull changes from the remote repository.
  • You want to update Homebrew formulae and Node packages.

Options:

-h, --helpHelp
-l, --listList of additional applications to install
--no-packagesSkip package (brew/node/etc) updates
--no-syncSkip pulling from the remote repository
--configure-macosConfigure macOS settings programatically
--install-casksInstall mac apps via brew cask (won't install/update if it's already present)

Oh My Zsh

These dotfiles essentially wrap Oh My Zsh. When you install the dotfiles, Oh My Zsh will also get installed for you directly into the ~/.dotfiles directory.

  • $ZSH will be ~/.dotfiles/oh-my-zsh
  • $ZSH_CUSTOM will be ~/.dotfiles/oh-my-zsh-custom
  • Opinionated set of plugins are loaded
  • Everything is configurable if you want to change things

Oh My Zsh Plugins

  • aws
  • git
  • iterm2
  • history-substring-search
  • z

Homebrew formulae

Mac Applications Installed via Homebrew cask

  • Alfred 4
  • AppCleaner
  • Brave Browser
  • CloudApp
  • Docker Desktop
  • Express VPN
  • Google Chrome
  • Google Drive
  • iTerm2
  • Notion
  • Postman
  • Slack
  • Spotify
  • Visual Studio Code
  • zoom.us

Node packages

Custom macOS defaults

Custom macOS settings can be applied during the dotfiles process. You'll be prompted before this happens so you can say no.

They can also be applied independently by running the following command:

macosdefaults

Local/private

Any private and custom Bash commands and configuration should be placed in a ~/.zshrc.before or ~/.zshrc.after file. These files will not be under version control or committed to a public repository. If either or both exists, they will be sourced for inclusion in .zshrc.

  • ~/.zshrc.before: Sourced beforeoh-my-zsh.sh is loaded, therefore allowing you to effect what happens when oh-my-zsh.sh runs, without changing any tracked files. Some examples would be the ZSH_THEME or specific Oh My Zsh plugin configurations.
  • ~/.zshrc.after: Sourced afteroh-my-zsh.sh is loaded. You can override anything that was set by oh-my-zsh.sh.

Here is an example ~/.zshrc.before:

# PATH exports
PATH=$PATH:~/.gem/ruby/1.8/bin
export PATH
# Git credentials
# Not under version control to prevent people from
# accidentally committing with your details
GIT_AUTHOR_NAME="Chris O'Donnell"
GIT_AUTHOR_EMAIL="chris@example.com"
# Set the credentials (modifies ~/.gitconfig)
git config --global user.name "$GIT_AUTHOR_NAME"
git config --global user.email "$GIT_AUTHOR_EMAIL"
# Work Machine Aliases
alias web="cd ~/Sites/company/web"
ZSH_THEME="amuse"

Here is an example ~/.zshrc.after:

# override something
alias ll="ls -aGlFh"

Note: Because the dotfiles/gitconfig file is copied to ~/.gitconfig, any private git configuration specified in ~/.zshrc.before or ~/.zshrc.after will not be committed to your dotfiles repository.

Acknowledgements

Inspiration and code was taken from many sources, including:

About

My macOS dotfiles: Oh My Zsh, git, brew, node, mac settings, mac apps, and more.

Topics

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages

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

Repository files navigation

Dotfiles

My macOS dotfiles for Zsh.

Features

Note: Installation of Oh My Zsh is not optional. Everything else listed below can be opted-out of.

Installation

This install is intended for macOS and requires the Xcode Command Line Tools. It may overwrite existing dotfiles in $HOME (and potentially .vim-related files), so skim install.sh first if you have an existing setup.

curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash

Important

If you're provisioning a new machine, you can also apply my macOS defaults (see bin/macosdefaults) and install the optional GUI apps (see lib/brew):

curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash -s -- --configure-macos --install-casks

Forks

If you fork this repo and want the installer to pull from your fork:

DOTFILES_REPO=yourhandle/dotfiles curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash

Or just update the default value of DOTFILES_REPO in your fork and install from your repo.

First Time Setup

After running the installation script on a new machine, there are several manual steps to complete the setup. These are personal preferences and may differ for your setup.

  1. 1Password / SSH
    • Login to 1Password
    • Update 1Password settings & enable SSH key management (for git authentication)
    • Create development directory & test 1Password SSH agent is working
      mkdir ~/Sites
      git clone git@github.com:codfish/semantic-release-action.git ~/Sites/semantic-release-action
      
  2. Cloud sync + shell config
    • Login to Dropbox
    • Once Dropbox syncs, symlink your private zsh configuration:
      ln -s ~/Dropbox/configfiles/zshrc ~/.zshrc.before
      exec zsh
      
    • Login to Google Drive
  3. Open Alfred
    • Activate Powerpack license
    • Update settings sync to point to Dropbox
  4. Setup Code Editors
    • Sign into VS Code and enable Settings Sync
    • In Cursor, import settings & extensions from VS Code
  5. Todoist
    • Sign into Todoist
    • Update Desktop settings to change keyboard shortcuts as needed
  6. AI CLI logins
    claude login
    codex
    gemini
    

Usage

Run the dotfiles command:

dotfiles

You should run the update when:

  • You make a change to ~/.dotfiles/git/gitconfig (the only file that is copied rather than symlinked).
  • You want to pull changes from the remote repository.
  • You want to update Homebrew formulae and Node packages.

Options:

-h, --helpHelp
-l, --listList of additional applications to install
--no-packagesSkip package (brew/node/etc) updates
--no-syncSkip pulling from the remote repository
--configure-macosConfigure macOS settings programatically
--install-casksInstall mac apps via brew cask (won't install/update if it's already present)

Oh My Zsh

These dotfiles essentially wrap Oh My Zsh. When you install the dotfiles, Oh My Zsh will also get installed for you directly into the ~/.dotfiles directory.

  • $ZSH will be ~/.dotfiles/oh-my-zsh
  • $ZSH_CUSTOM will be ~/.dotfiles/oh-my-zsh-custom
  • Opinionated set of plugins are loaded
  • Everything is configurable if you want to change things

Oh My Zsh Plugins

  • aws
  • git
  • iterm2
  • history-substring-search
  • z

Homebrew formulae

Mac Applications Installed via Homebrew cask

  • Alfred 4
  • AppCleaner
  • Brave Browser
  • CloudApp
  • Docker Desktop
  • Express VPN
  • Google Chrome
  • Google Drive
  • iTerm2
  • Notion
  • Postman
  • Slack
  • Spotify
  • Visual Studio Code
  • zoom.us

Node packages

Custom macOS defaults

Custom macOS settings can be applied during the dotfiles process. You'll be prompted before this happens so you can say no.

They can also be applied independently by running the following command:

macosdefaults

Local/private

Any private and custom Bash commands and configuration should be placed in a ~/.zshrc.before or ~/.zshrc.after file. These files will not be under version control or committed to a public repository. If either or both exists, they will be sourced for inclusion in .zshrc.

  • ~/.zshrc.before: Sourced beforeoh-my-zsh.sh is loaded, therefore allowing you to effect what happens when oh-my-zsh.sh runs, without changing any tracked files. Some examples would be the ZSH_THEME or specific Oh My Zsh plugin configurations.
  • ~/.zshrc.after: Sourced afteroh-my-zsh.sh is loaded. You can override anything that was set by oh-my-zsh.sh.

Here is an example ~/.zshrc.before:

# PATH exports
PATH=$PATH:~/.gem/ruby/1.8/bin
export PATH
# Git credentials
# Not under version control to prevent people from
# accidentally committing with your details
GIT_AUTHOR_NAME="Chris O'Donnell"
GIT_AUTHOR_EMAIL="chris@example.com"
# Set the credentials (modifies ~/.gitconfig)
git config --global user.name "$GIT_AUTHOR_NAME"
git config --global user.email "$GIT_AUTHOR_EMAIL"
# Work Machine Aliases
alias web="cd ~/Sites/company/web"
ZSH_THEME="amuse"

Here is an example ~/.zshrc.after:

# override something
alias ll="ls -aGlFh"

Note: Because the dotfiles/gitconfig file is copied to ~/.gitconfig, any private git configuration specified in ~/.zshrc.before or ~/.zshrc.after will not be committed to your dotfiles repository.

Acknowledgements

Inspiration and code was taken from many sources, including:

About

My macOS dotfiles: Oh My Zsh, git, brew, node, mac settings, mac apps, and more.

Topics

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages

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

Repository files navigation

Dotfiles

My macOS dotfiles for Zsh.

Features

Note: Installation of Oh My Zsh is not optional. Everything else listed below can be opted-out of.

Installation

This install is intended for macOS and requires the Xcode Command Line Tools. It may overwrite existing dotfiles in $HOME (and potentially .vim-related files), so skim install.sh first if you have an existing setup.

curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash

Important

If you're provisioning a new machine, you can also apply my macOS defaults (see bin/macosdefaults) and install the optional GUI apps (see lib/brew):

curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash -s -- --configure-macos --install-casks

Forks

If you fork this repo and want the installer to pull from your fork:

DOTFILES_REPO=yourhandle/dotfiles curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash

Or just update the default value of DOTFILES_REPO in your fork and install from your repo.

First Time Setup

After running the installation script on a new machine, there are several manual steps to complete the setup. These are personal preferences and may differ for your setup.

  1. 1Password / SSH
    • Login to 1Password
    • Update 1Password settings & enable SSH key management (for git authentication)
    • Create development directory & test 1Password SSH agent is working
      mkdir ~/Sites
      git clone git@github.com:codfish/semantic-release-action.git ~/Sites/semantic-release-action
      
  2. Cloud sync + shell config
    • Login to Dropbox
    • Once Dropbox syncs, symlink your private zsh configuration:
      ln -s ~/Dropbox/configfiles/zshrc ~/.zshrc.before
      exec zsh
      
    • Login to Google Drive
  3. Open Alfred
    • Activate Powerpack license
    • Update settings sync to point to Dropbox
  4. Setup Code Editors
    • Sign into VS Code and enable Settings Sync
    • In Cursor, import settings & extensions from VS Code
  5. Todoist
    • Sign into Todoist
    • Update Desktop settings to change keyboard shortcuts as needed
  6. AI CLI logins
    claude login
    codex
    gemini
    

Usage

Run the dotfiles command:

dotfiles

You should run the update when:

  • You make a change to ~/.dotfiles/git/gitconfig (the only file that is copied rather than symlinked).
  • You want to pull changes from the remote repository.
  • You want to update Homebrew formulae and Node packages.

Options:

-h, --helpHelp
-l, --listList of additional applications to install
--no-packagesSkip package (brew/node/etc) updates
--no-syncSkip pulling from the remote repository
--configure-macosConfigure macOS settings programatically
--install-casksInstall mac apps via brew cask (won't install/update if it's already present)

Oh My Zsh

These dotfiles essentially wrap Oh My Zsh. When you install the dotfiles, Oh My Zsh will also get installed for you directly into the ~/.dotfiles directory.

  • $ZSH will be ~/.dotfiles/oh-my-zsh
  • $ZSH_CUSTOM will be ~/.dotfiles/oh-my-zsh-custom
  • Opinionated set of plugins are loaded
  • Everything is configurable if you want to change things

Oh My Zsh Plugins

  • aws
  • git
  • iterm2
  • history-substring-search
  • z

Homebrew formulae

Mac Applications Installed via Homebrew cask

  • Alfred 4
  • AppCleaner
  • Brave Browser
  • CloudApp
  • Docker Desktop
  • Express VPN
  • Google Chrome
  • Google Drive
  • iTerm2
  • Notion
  • Postman
  • Slack
  • Spotify
  • Visual Studio Code
  • zoom.us

Node packages

Custom macOS defaults

Custom macOS settings can be applied during the dotfiles process. You'll be prompted before this happens so you can say no.

They can also be applied independently by running the following command:

macosdefaults

Local/private

Any private and custom Bash commands and configuration should be placed in a ~/.zshrc.before or ~/.zshrc.after file. These files will not be under version control or committed to a public repository. If either or both exists, they will be sourced for inclusion in .zshrc.

  • ~/.zshrc.before: Sourced beforeoh-my-zsh.sh is loaded, therefore allowing you to effect what happens when oh-my-zsh.sh runs, without changing any tracked files. Some examples would be the ZSH_THEME or specific Oh My Zsh plugin configurations.
  • ~/.zshrc.after: Sourced afteroh-my-zsh.sh is loaded. You can override anything that was set by oh-my-zsh.sh.

Here is an example ~/.zshrc.before:

# PATH exports
PATH=$PATH:~/.gem/ruby/1.8/bin
export PATH
# Git credentials
# Not under version control to prevent people from
# accidentally committing with your details
GIT_AUTHOR_NAME="Chris O'Donnell"
GIT_AUTHOR_EMAIL="chris@example.com"
# Set the credentials (modifies ~/.gitconfig)
git config --global user.name "$GIT_AUTHOR_NAME"
git config --global user.email "$GIT_AUTHOR_EMAIL"
# Work Machine Aliases
alias web="cd ~/Sites/company/web"
ZSH_THEME="amuse"

Here is an example ~/.zshrc.after:

# override something
alias ll="ls -aGlFh"

Note: Because the dotfiles/gitconfig file is copied to ~/.gitconfig, any private git configuration specified in ~/.zshrc.before or ~/.zshrc.after will not be committed to your dotfiles repository.

Acknowledgements

Inspiration and code was taken from many sources, including:

About

My macOS dotfiles: Oh My Zsh, git, brew, node, mac settings, mac apps, and more.

Topics

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages

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

Repository files navigation

Dotfiles

My macOS dotfiles for Zsh.

Features

Note: Installation of Oh My Zsh is not optional. Everything else listed below can be opted-out of.

Installation

This install is intended for macOS and requires the Xcode Command Line Tools. It may overwrite existing dotfiles in $HOME (and potentially .vim-related files), so skim install.sh first if you have an existing setup.

curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash

Important

If you're provisioning a new machine, you can also apply my macOS defaults (see bin/macosdefaults) and install the optional GUI apps (see lib/brew):

curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash -s -- --configure-macos --install-casks

Forks

If you fork this repo and want the installer to pull from your fork:

DOTFILES_REPO=yourhandle/dotfiles curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash

Or just update the default value of DOTFILES_REPO in your fork and install from your repo.

First Time Setup

After running the installation script on a new machine, there are several manual steps to complete the setup. These are personal preferences and may differ for your setup.

  1. 1Password / SSH
    • Login to 1Password
    • Update 1Password settings & enable SSH key management (for git authentication)
    • Create development directory & test 1Password SSH agent is working
      mkdir ~/Sites
      git clone git@github.com:codfish/semantic-release-action.git ~/Sites/semantic-release-action
      
  2. Cloud sync + shell config
    • Login to Dropbox
    • Once Dropbox syncs, symlink your private zsh configuration:
      ln -s ~/Dropbox/configfiles/zshrc ~/.zshrc.before
      exec zsh
      
    • Login to Google Drive
  3. Open Alfred
    • Activate Powerpack license
    • Update settings sync to point to Dropbox
  4. Setup Code Editors
    • Sign into VS Code and enable Settings Sync
    • In Cursor, import settings & extensions from VS Code
  5. Todoist
    • Sign into Todoist
    • Update Desktop settings to change keyboard shortcuts as needed
  6. AI CLI logins
    claude login
    codex
    gemini
    

Usage

Run the dotfiles command:

dotfiles

You should run the update when:

  • You make a change to ~/.dotfiles/git/gitconfig (the only file that is copied rather than symlinked).
  • You want to pull changes from the remote repository.
  • You want to update Homebrew formulae and Node packages.

Options:

-h, --helpHelp
-l, --listList of additional applications to install
--no-packagesSkip package (brew/node/etc) updates
--no-syncSkip pulling from the remote repository
--configure-macosConfigure macOS settings programatically
--install-casksInstall mac apps via brew cask (won't install/update if it's already present)

Oh My Zsh

These dotfiles essentially wrap Oh My Zsh. When you install the dotfiles, Oh My Zsh will also get installed for you directly into the ~/.dotfiles directory.

  • $ZSH will be ~/.dotfiles/oh-my-zsh
  • $ZSH_CUSTOM will be ~/.dotfiles/oh-my-zsh-custom
  • Opinionated set of plugins are loaded
  • Everything is configurable if you want to change things

Oh My Zsh Plugins

  • aws
  • git
  • iterm2
  • history-substring-search
  • z

Homebrew formulae

Mac Applications Installed via Homebrew cask

  • Alfred 4
  • AppCleaner
  • Brave Browser
  • CloudApp
  • Docker Desktop
  • Express VPN
  • Google Chrome
  • Google Drive
  • iTerm2
  • Notion
  • Postman
  • Slack
  • Spotify
  • Visual Studio Code
  • zoom.us

Node packages

Custom macOS defaults

Custom macOS settings can be applied during the dotfiles process. You'll be prompted before this happens so you can say no.

They can also be applied independently by running the following command:

macosdefaults

Local/private

Any private and custom Bash commands and configuration should be placed in a ~/.zshrc.before or ~/.zshrc.after file. These files will not be under version control or committed to a public repository. If either or both exists, they will be sourced for inclusion in .zshrc.

  • ~/.zshrc.before: Sourced beforeoh-my-zsh.sh is loaded, therefore allowing you to effect what happens when oh-my-zsh.sh runs, without changing any tracked files. Some examples would be the ZSH_THEME or specific Oh My Zsh plugin configurations.
  • ~/.zshrc.after: Sourced afteroh-my-zsh.sh is loaded. You can override anything that was set by oh-my-zsh.sh.

Here is an example ~/.zshrc.before:

# PATH exports
PATH=$PATH:~/.gem/ruby/1.8/bin
export PATH
# Git credentials
# Not under version control to prevent people from
# accidentally committing with your details
GIT_AUTHOR_NAME="Chris O'Donnell"
GIT_AUTHOR_EMAIL="chris@example.com"
# Set the credentials (modifies ~/.gitconfig)
git config --global user.name "$GIT_AUTHOR_NAME"
git config --global user.email "$GIT_AUTHOR_EMAIL"
# Work Machine Aliases
alias web="cd ~/Sites/company/web"
ZSH_THEME="amuse"

Here is an example ~/.zshrc.after:

# override something
alias ll="ls -aGlFh"

Note: Because the dotfiles/gitconfig file is copied to ~/.gitconfig, any private git configuration specified in ~/.zshrc.before or ~/.zshrc.after will not be committed to your dotfiles repository.

Acknowledgements

Inspiration and code was taken from many sources, including:

About

My macOS dotfiles: Oh My Zsh, git, brew, node, mac settings, mac apps, and more.

Topics

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages

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

Repository files navigation

Dotfiles

My macOS dotfiles for Zsh.

Features

Note: Installation of Oh My Zsh is not optional. Everything else listed below can be opted-out of.

Installation

This install is intended for macOS and requires the Xcode Command Line Tools. It may overwrite existing dotfiles in $HOME (and potentially .vim-related files), so skim install.sh first if you have an existing setup.

curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash

Important

If you're provisioning a new machine, you can also apply my macOS defaults (see bin/macosdefaults) and install the optional GUI apps (see lib/brew):

curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash -s -- --configure-macos --install-casks

Forks

If you fork this repo and want the installer to pull from your fork:

DOTFILES_REPO=yourhandle/dotfiles curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash

Or just update the default value of DOTFILES_REPO in your fork and install from your repo.

First Time Setup

After running the installation script on a new machine, there are several manual steps to complete the setup. These are personal preferences and may differ for your setup.

  1. 1Password / SSH
    • Login to 1Password
    • Update 1Password settings & enable SSH key management (for git authentication)
    • Create development directory & test 1Password SSH agent is working
      mkdir ~/Sites
      git clone git@github.com:codfish/semantic-release-action.git ~/Sites/semantic-release-action
      
  2. Cloud sync + shell config
    • Login to Dropbox
    • Once Dropbox syncs, symlink your private zsh configuration:
      ln -s ~/Dropbox/configfiles/zshrc ~/.zshrc.before
      exec zsh
      
    • Login to Google Drive
  3. Open Alfred
    • Activate Powerpack license
    • Update settings sync to point to Dropbox
  4. Setup Code Editors
    • Sign into VS Code and enable Settings Sync
    • In Cursor, import settings & extensions from VS Code
  5. Todoist
    • Sign into Todoist
    • Update Desktop settings to change keyboard shortcuts as needed
  6. AI CLI logins
    claude login
    codex
    gemini
    

Usage

Run the dotfiles command:

dotfiles

You should run the update when:

  • You make a change to ~/.dotfiles/git/gitconfig (the only file that is copied rather than symlinked).
  • You want to pull changes from the remote repository.
  • You want to update Homebrew formulae and Node packages.

Options:

-h, --helpHelp
-l, --listList of additional applications to install
--no-packagesSkip package (brew/node/etc) updates
--no-syncSkip pulling from the remote repository
--configure-macosConfigure macOS settings programatically
--install-casksInstall mac apps via brew cask (won't install/update if it's already present)

Oh My Zsh

These dotfiles essentially wrap Oh My Zsh. When you install the dotfiles, Oh My Zsh will also get installed for you directly into the ~/.dotfiles directory.

  • $ZSH will be ~/.dotfiles/oh-my-zsh
  • $ZSH_CUSTOM will be ~/.dotfiles/oh-my-zsh-custom
  • Opinionated set of plugins are loaded
  • Everything is configurable if you want to change things

Oh My Zsh Plugins

  • aws
  • git
  • iterm2
  • history-substring-search
  • z

Homebrew formulae

Mac Applications Installed via Homebrew cask

  • Alfred 4
  • AppCleaner
  • Brave Browser
  • CloudApp
  • Docker Desktop
  • Express VPN
  • Google Chrome
  • Google Drive
  • iTerm2
  • Notion
  • Postman
  • Slack
  • Spotify
  • Visual Studio Code
  • zoom.us

Node packages

Custom macOS defaults

Custom macOS settings can be applied during the dotfiles process. You'll be prompted before this happens so you can say no.

They can also be applied independently by running the following command:

macosdefaults

Local/private

Any private and custom Bash commands and configuration should be placed in a ~/.zshrc.before or ~/.zshrc.after file. These files will not be under version control or committed to a public repository. If either or both exists, they will be sourced for inclusion in .zshrc.

  • ~/.zshrc.before: Sourced beforeoh-my-zsh.sh is loaded, therefore allowing you to effect what happens when oh-my-zsh.sh runs, without changing any tracked files. Some examples would be the ZSH_THEME or specific Oh My Zsh plugin configurations.
  • ~/.zshrc.after: Sourced afteroh-my-zsh.sh is loaded. You can override anything that was set by oh-my-zsh.sh.

Here is an example ~/.zshrc.before:

# PATH exports
PATH=$PATH:~/.gem/ruby/1.8/bin
export PATH
# Git credentials
# Not under version control to prevent people from
# accidentally committing with your details
GIT_AUTHOR_NAME="Chris O'Donnell"
GIT_AUTHOR_EMAIL="chris@example.com"
# Set the credentials (modifies ~/.gitconfig)
git config --global user.name "$GIT_AUTHOR_NAME"
git config --global user.email "$GIT_AUTHOR_EMAIL"
# Work Machine Aliases
alias web="cd ~/Sites/company/web"
ZSH_THEME="amuse"

Here is an example ~/.zshrc.after:

# override something
alias ll="ls -aGlFh"

Note: Because the dotfiles/gitconfig file is copied to ~/.gitconfig, any private git configuration specified in ~/.zshrc.before or ~/.zshrc.after will not be committed to your dotfiles repository.

Acknowledgements

Inspiration and code was taken from many sources, including:

About

My macOS dotfiles: Oh My Zsh, git, brew, node, mac settings, mac apps, and more.

Topics

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages

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

Repository files navigation

Dotfiles

My macOS dotfiles for Zsh.

Features

Note: Installation of Oh My Zsh is not optional. Everything else listed below can be opted-out of.

Installation

This install is intended for macOS and requires the Xcode Command Line Tools. It may overwrite existing dotfiles in $HOME (and potentially .vim-related files), so skim install.sh first if you have an existing setup.

curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash

Important

If you're provisioning a new machine, you can also apply my macOS defaults (see bin/macosdefaults) and install the optional GUI apps (see lib/brew):

curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash -s -- --configure-macos --install-casks

Forks

If you fork this repo and want the installer to pull from your fork:

DOTFILES_REPO=yourhandle/dotfiles curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash

Or just update the default value of DOTFILES_REPO in your fork and install from your repo.

First Time Setup

After running the installation script on a new machine, there are several manual steps to complete the setup. These are personal preferences and may differ for your setup.

  1. 1Password / SSH
    • Login to 1Password
    • Update 1Password settings & enable SSH key management (for git authentication)
    • Create development directory & test 1Password SSH agent is working
      mkdir ~/Sites
      git clone git@github.com:codfish/semantic-release-action.git ~/Sites/semantic-release-action
      
  2. Cloud sync + shell config
    • Login to Dropbox
    • Once Dropbox syncs, symlink your private zsh configuration:
      ln -s ~/Dropbox/configfiles/zshrc ~/.zshrc.before
      exec zsh
      
    • Login to Google Drive
  3. Open Alfred
    • Activate Powerpack license
    • Update settings sync to point to Dropbox
  4. Setup Code Editors
    • Sign into VS Code and enable Settings Sync
    • In Cursor, import settings & extensions from VS Code
  5. Todoist
    • Sign into Todoist
    • Update Desktop settings to change keyboard shortcuts as needed
  6. AI CLI logins
    claude login
    codex
    gemini
    

Usage

Run the dotfiles command:

dotfiles

You should run the update when:

  • You make a change to ~/.dotfiles/git/gitconfig (the only file that is copied rather than symlinked).
  • You want to pull changes from the remote repository.
  • You want to update Homebrew formulae and Node packages.

Options:

-h, --helpHelp
-l, --listList of additional applications to install
--no-packagesSkip package (brew/node/etc) updates
--no-syncSkip pulling from the remote repository
--configure-macosConfigure macOS settings programatically
--install-casksInstall mac apps via brew cask (won't install/update if it's already present)

Oh My Zsh

These dotfiles essentially wrap Oh My Zsh. When you install the dotfiles, Oh My Zsh will also get installed for you directly into the ~/.dotfiles directory.

  • $ZSH will be ~/.dotfiles/oh-my-zsh
  • $ZSH_CUSTOM will be ~/.dotfiles/oh-my-zsh-custom
  • Opinionated set of plugins are loaded
  • Everything is configurable if you want to change things

Oh My Zsh Plugins

  • aws
  • git
  • iterm2
  • history-substring-search
  • z

Homebrew formulae

Mac Applications Installed via Homebrew cask

  • Alfred 4
  • AppCleaner
  • Brave Browser
  • CloudApp
  • Docker Desktop
  • Express VPN
  • Google Chrome
  • Google Drive
  • iTerm2
  • Notion
  • Postman
  • Slack
  • Spotify
  • Visual Studio Code
  • zoom.us

Node packages

Custom macOS defaults

Custom macOS settings can be applied during the dotfiles process. You'll be prompted before this happens so you can say no.

They can also be applied independently by running the following command:

macosdefaults

Local/private

Any private and custom Bash commands and configuration should be placed in a ~/.zshrc.before or ~/.zshrc.after file. These files will not be under version control or committed to a public repository. If either or both exists, they will be sourced for inclusion in .zshrc.

  • ~/.zshrc.before: Sourced beforeoh-my-zsh.sh is loaded, therefore allowing you to effect what happens when oh-my-zsh.sh runs, without changing any tracked files. Some examples would be the ZSH_THEME or specific Oh My Zsh plugin configurations.
  • ~/.zshrc.after: Sourced afteroh-my-zsh.sh is loaded. You can override anything that was set by oh-my-zsh.sh.

Here is an example ~/.zshrc.before:

# PATH exports
PATH=$PATH:~/.gem/ruby/1.8/bin
export PATH
# Git credentials
# Not under version control to prevent people from
# accidentally committing with your details
GIT_AUTHOR_NAME="Chris O'Donnell"
GIT_AUTHOR_EMAIL="chris@example.com"
# Set the credentials (modifies ~/.gitconfig)
git config --global user.name "$GIT_AUTHOR_NAME"
git config --global user.email "$GIT_AUTHOR_EMAIL"
# Work Machine Aliases
alias web="cd ~/Sites/company/web"
ZSH_THEME="amuse"

Here is an example ~/.zshrc.after:

# override something
alias ll="ls -aGlFh"

Note: Because the dotfiles/gitconfig file is copied to ~/.gitconfig, any private git configuration specified in ~/.zshrc.before or ~/.zshrc.after will not be committed to your dotfiles repository.

Acknowledgements

Inspiration and code was taken from many sources, including:

About

My macOS dotfiles: Oh My Zsh, git, brew, node, mac settings, mac apps, and more.

Topics

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages

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

Repository files navigation

Dotfiles

My macOS dotfiles for Zsh.

Features

Note: Installation of Oh My Zsh is not optional. Everything else listed below can be opted-out of.

Installation

This install is intended for macOS and requires the Xcode Command Line Tools. It may overwrite existing dotfiles in $HOME (and potentially .vim-related files), so skim install.sh first if you have an existing setup.

curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash

Important

If you're provisioning a new machine, you can also apply my macOS defaults (see bin/macosdefaults) and install the optional GUI apps (see lib/brew):

curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash -s -- --configure-macos --install-casks

Forks

If you fork this repo and want the installer to pull from your fork:

DOTFILES_REPO=yourhandle/dotfiles curl https://raw.githubusercontent.com/codfish/dotfiles/main/install.sh | bash

Or just update the default value of DOTFILES_REPO in your fork and install from your repo.

First Time Setup

After running the installation script on a new machine, there are several manual steps to complete the setup. These are personal preferences and may differ for your setup.

  1. 1Password / SSH
    • Login to 1Password
    • Update 1Password settings & enable SSH key management (for git authentication)
    • Create development directory & test 1Password SSH agent is working
      mkdir ~/Sites
      git clone git@github.com:codfish/semantic-release-action.git ~/Sites/semantic-release-action
      
  2. Cloud sync + shell config
    • Login to Dropbox
    • Once Dropbox syncs, symlink your private zsh configuration:
      ln -s ~/Dropbox/configfiles/zshrc ~/.zshrc.before
      exec zsh
      
    • Login to Google Drive
  3. Open Alfred
    • Activate Powerpack license
    • Update settings sync to point to Dropbox
  4. Setup Code Editors
    • Sign into VS Code and enable Settings Sync
    • In Cursor, import settings & extensions from VS Code
  5. Todoist
    • Sign into Todoist
    • Update Desktop settings to change keyboard shortcuts as needed
  6. AI CLI logins
    claude login
    codex
    gemini
    

Usage

Run the dotfiles command:

dotfiles

You should run the update when:

  • You make a change to ~/.dotfiles/git/gitconfig (the only file that is copied rather than symlinked).
  • You want to pull changes from the remote repository.
  • You want to update Homebrew formulae and Node packages.

Options:

-h, --helpHelp
-l, --listList of additional applications to install
--no-packagesSkip package (brew/node/etc) updates
--no-syncSkip pulling from the remote repository
--configure-macosConfigure macOS settings programatically
--install-casksInstall mac apps via brew cask (won't install/update if it's already present)

Oh My Zsh

These dotfiles essentially wrap Oh My Zsh. When you install the dotfiles, Oh My Zsh will also get installed for you directly into the ~/.dotfiles directory.

  • $ZSH will be ~/.dotfiles/oh-my-zsh
  • $ZSH_CUSTOM will be ~/.dotfiles/oh-my-zsh-custom
  • Opinionated set of plugins are loaded
  • Everything is configurable if you want to change things

Oh My Zsh Plugins

  • aws
  • git
  • iterm2
  • history-substring-search
  • z

Homebrew formulae

Mac Applications Installed via Homebrew cask

  • Alfred 4
  • AppCleaner
  • Brave Browser
  • CloudApp
  • Docker Desktop
  • Express VPN
  • Google Chrome
  • Google Drive
  • iTerm2
  • Notion
  • Postman
  • Slack
  • Spotify
  • Visual Studio Code
  • zoom.us

Node packages

Custom macOS defaults

Custom macOS settings can be applied during the dotfiles process. You'll be prompted before this happens so you can say no.

They can also be applied independently by running the following command:

macosdefaults

Local/private

Any private and custom Bash commands and configuration should be placed in a ~/.zshrc.before or ~/.zshrc.after file. These files will not be under version control or committed to a public repository. If either or both exists, they will be sourced for inclusion in .zshrc.

  • ~/.zshrc.before: Sourced beforeoh-my-zsh.sh is loaded, therefore allowing you to effect what happens when oh-my-zsh.sh runs, without changing any tracked files. Some examples would be the ZSH_THEME or specific Oh My Zsh plugin configurations.
  • ~/.zshrc.after: Sourced afteroh-my-zsh.sh is loaded. You can override anything that was set by oh-my-zsh.sh.

Here is an example ~/.zshrc.before:

# PATH exports
PATH=$PATH:~/.gem/ruby/1.8/bin
export PATH
# Git credentials
# Not under version control to prevent people from
# accidentally committing with your details
GIT_AUTHOR_NAME="Chris O'Donnell"
GIT_AUTHOR_EMAIL="chris@example.com"
# Set the credentials (modifies ~/.gitconfig)
git config --global user.name "$GIT_AUTHOR_NAME"
git config --global user.email "$GIT_AUTHOR_EMAIL"
# Work Machine Aliases
alias web="cd ~/Sites/company/web"
ZSH_THEME="amuse"

Here is an example ~/.zshrc.after:

# override something
alias ll="ls -aGlFh"

Note: Because the dotfiles/gitconfig file is copied to ~/.gitconfig, any private git configuration specified in ~/.zshrc.before or ~/.zshrc.after will not be committed to your dotfiles repository.

Acknowledgements

Inspiration and code was taken from many sources, including:

About

My macOS dotfiles: Oh My Zsh, git, brew, node, mac settings, mac apps, and more.

Topics

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages