Skip to content

Instantly share code, notes, and snippets.

@MattIPv4
Last active February 15, 2025 21:05
Show Gist options
  • Save MattIPv4/b00df7ef07b5fdddfac2b49c319f6359 to your computer and use it in GitHub Desktop.
Save MattIPv4/b00df7ef07b5fdddfac2b49c319f6359 to your computer and use it in GitHub Desktop.

New Laptop Setup

System Settings

  • Auth w/ iCloud
  • Accessiblity
    • Display: Reduce Transparency
  • Control Center
    • Show Always: Wifi, Bluetooth, Sound
    • Show Active: Focus, Mirroring, Display, Playing
    • Battery: Menu w/ Percentage
    • Clock: Date w/ Day, 24hr Digital, Seconds
  • Dock: ~15% size w/ magnification, automatically show/hide, no recents
  • Display: More Space
  • Spotlight -> Spotlight Privacy: Exclude ~/GitHub
  • Keyboard: Keyboard navigation
  • Wallpaper: Choose photo, fill, show on all spaces
  • Lock screen
    • Start screen saver: Never
    • Turn off on battery: Never
    • Turn off on power: Never
    • Require password: Immediately
    • Message when locked: Please return to Matt Cowley if found.\n(<phone> | me@mattcowley.co.uk) (alt+return for newline)

Gatekeeper

https://disable-gatekeeper.github.io/#disabling-gatekeeper-permanently

Run sudo spctl --master-disable, then select Anywhere for Allow Applications from in Privacy & Security in settings.

Finder

  • Settings
    • Sync desktop & downloads
    • Show all extensions
  • Applications
    • View Options: Show Library
    • Toggle hidden files w/ Shift + Cmd + .

Fonts

B612 Mono

https://fonts.google.com/specimen/B612+Mono

Shell

Terminal

Duplicate Pro as Pro Tweaks

  • Background: #000, 100% opacity
  • Font: B612 Mono Regular 12
  • Antialias text
  • Use bright colors for bold text
  • Blink cursor
  • Window size: 128x32

Xcode tools

sudo xcode-select --install

Oh My ZSH

https://github.com/ohmyzsh/ohmyzsh#basic-installation

P10k

https://github.com/romkatv/powerlevel10k#oh-my-zsh

Wizard options: powerline, unicode, lean, 1 line, compact, concise, instant_prompt=quiet

Brew

https://brew.sh/#install

GitHub CLI

https://github.com/cli/cli#installation

FNM

https://github.com/Schniz/fnm#installation

Use --skip-shell, then fnm use 22 (current LTS version) + fnm alias 22 default.

ZSH

.zshrc
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
  source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi

# If you come from bash you might have to change your $PATH.
export PATH="$HOME/bin:/usr/local/bin:/usr/local/sbin:$PATH"

# Path to your oh-my-zsh installation.
export ZSH="$HOME/.oh-my-zsh"

# Set name of the theme to load. Optionally, if you set this to "random"
# it'll load a random theme each time that oh-my-zsh is loaded.
# See https://github.com/robbyrussell/oh-my-zsh/wiki/Themes
ZSH_THEME="powerlevel10k/powerlevel10k"

# Set list of themes to load
# Setting this variable when ZSH_THEME=random
# cause zsh load theme from this variable instead of
# looking in ~/.oh-my-zsh/themes/
# An empty array have no effect
# ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" )

# Uncomment the following line to use case-sensitive completion.
# CASE_SENSITIVE="true"

# Uncomment the following line to use hyphen-insensitive completion. Case
# sensitive completion must be off. _ and - will be interchangeable.
# HYPHEN_INSENSITIVE="true"

# Uncomment the following line to disable bi-weekly auto-update checks.
# DISABLE_AUTO_UPDATE="true"

# Uncomment the following line to change how often to auto-update (in days).
# export UPDATE_ZSH_DAYS=13

# Uncomment the following line to disable colors in ls.
# DISABLE_LS_COLORS="true"

# Uncomment the following line to disable auto-setting terminal title.
# DISABLE_AUTO_TITLE="true"

# Uncomment the following line to enable command auto-correction.
# ENABLE_CORRECTION="true"

# Uncomment the following line to display red dots whilst waiting for completion.
COMPLETION_WAITING_DOTS="true"

# Uncomment the following line if you want to disable marking untracked files
# under VCS as dirty. This makes repository status check for large repositories
# much, much faster.
# DISABLE_UNTRACKED_FILES_DIRTY="true"

# Uncomment the following line if you want to change the command execution time
# stamp shown in the history command output.
# The optional three formats: "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd"
# HIST_STAMPS="mm/dd/yyyy"

# Would you like to use another custom folder than $ZSH/custom?
# ZSH_CUSTOM=/path/to/new-custom-folder
  
# Don't prompt for auto-updates, just do them
DISABLE_UPDATE_PROMPT="true"

# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(
  git
  ssh-agent
)

# Enable ssh-agent using keychain
zstyle :omz:plugins:ssh-agent quiet yes
zstyle :omz:plugins:ssh-agent lazy yes
zstyle :omz:plugins:ssh-agent ssh-add-args --apple-load-keychain

source $ZSH/oh-my-zsh.sh

# User configuration

# export MANPATH="/usr/local/man:$MANPATH"

# You may need to manually set your language environment
# export LANG=en_US.UTF-8

# Preferred editor for local and remote sessions
# if [[ -n $SSH_CONNECTION ]]; then
#   export EDITOR='vim'
# else
#   export EDITOR='mvim'
# fi

# Compilation flags
# export ARCHFLAGS="-arch x86_64"

# ssh
# export SSH_KEY_PATH="~/.ssh/rsa_id"

# Set personal aliases, overriding those provided by oh-my-zsh libs,
# plugins, and themes. Aliases can be placed here, though oh-my-zsh
# users are encouraged to define aliases within the ZSH_CUSTOM folder.
# For a full list of active aliases, run `alias`.
#
# Example aliases
# alias zshconfig="mate ~/.zshrc"
# alias ohmyzsh="mate ~/.oh-my-zsh"

# Add Brew
[[ -x "/opt/homebrew/bin/brew" ]] && \
  eval "$(/opt/homebrew/bin/brew shellenv)"

# Load rbenv automatically
[[ -x "$(command -v rbenv)" ]] && \
  eval "$(rbenv init -)"

# Load fnm (Node.js) automatically
[[ -x "$(command -v fnm)" ]] && \
  eval "$(fnm env --use-on-cd --version-file-strategy=recursive)"

# Add npm auto-completion
[[ -x "$(command -v npm)" ]] && \
  source <(npm completion)

# Expose elastic beanstalk CLI
[[ -d "$HOME/.ebcli-virtual-env/executables" ]] && \
  export PATH="$PATH:$HOME/.ebcli-virtual-env/executables"

# Expose Go binaries
[[ -x "$(command -v go)" ]] && [[ -d "$(go env GOPATH)/bin" ]] && \
  export PATH="$PATH:$(go env GOPATH)/bin"

# Expose Python binaries
[[ -x "$(command -v python3)" ]] && [[ -d "$(python3 -m site --user-base)/bin" ]] && \
  export PATH="$PATH:$(python3 -m site --user-base)/bin"

# Add Visual Studio Code (code)
[[ -d "/Applications/Visual Studio Code.app/Contents/Resources/app/bin" ]] && \
  export PATH="$PATH:/Applications/Visual Studio Code.app/Contents/Resources/app/bin"

# Expose gcloud CLI w/ auto-completion
[[ -d "$HOME/.google-cloud-sdk" ]] && \
  . "$HOME/.google-cloud-sdk/path.zsh.inc" && \
  . "$HOME/.google-cloud-sdk/completion.zsh.inc"

# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh

Husky

.huskyrc
# Load fnm (Node.js) automatically
[[ -x "$(command -v fnm)" ]] && \
  eval "$(fnm env --version-file-strategy=recursive)"

# Ensure we're using the right Node.js version
fnm use --install-if-missing --silent-if-unchanged

mkdir -p ~/.config/husky && ln -s ~/.huskyrc ~/.config/husky/init.sh

Vim

.vimrc
syntax on
set number
set mouse=a
set colorcolumn=101

SSH

ssh-keygen -t ed25519 -C "me@mattcowley.co.uk" w/ passphrase

.ssh/config
Host *
    UseKeychain yes
    AddKeysToAgent yes
    IdentityFile ~/.ssh/id_ed25519

ssh-add --apple-use-keychain ~/.ssh/id_ed25519

Git

.gitconfig
[user]
	name = MattIPv4
	email = me@mattcowley.co.uk
[push]
	autoSetupRemote = true
[http]
	postBuffer = 524288000
[merge]
	conflictStyle = zdiff3
[commit]
	verbose = true
[rerere]
	enabled = true
[url "git@github.com:"]
	insteadOf = https://github.com/

Use git config --local user.email <email> for projects that need different email

https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account

Development

Firefox DE

https://www.mozilla.org/en-GB/firefox/developer/

  • Set as default browser in system settings
  • Auth Firefox account
  • Auth 1Password
  • In about:config, enable security.enterprise_roots.enabled + browser.compactmode.show + dom.security.https_only_mode, disable media.hardwaremediakeys.enabled + browser.warnOnQuitShortcut, set network.trr.mode to 3 and network.trr.uri to https://mozilla.cloudflare-dns.com/dns-query, set browser.uidensity to 1 and browser.toolbars.bookmarks.visibility to never
  • In Extensions, pin:
    • uBlock
    • Privacy Badger
    • Dark Reader
    • 1Password
    • Referer Control
    • Disable Javascript
  • In Menu -> More Tools -> Customize toolbar:
    • Enable compact mode density
    • Before Search: Forward/Back, Reload, Home (no spacer)
    • After Search: uBlock, Privacy Badger, Dark Reader, 1Password, Referer Control, Disable Javascript, Extensions, Overflow, Menu (no spacer)

Chrome

https://www.google.com/chrome/dr/download

Docker Desktop

https://www.docker.com/products/docker-desktop/

VSCode

https://code.visualstudio.com/download

Postman

https://www.postman.com/downloads/

Figma

https://www.figma.com/downloads/

Communication

Discord

https://discord.com/download

  • Appearance
    • Compact w/ avatars
    • 15px chat, 8px spacing, 90% zoom
  • Accessibility
    • Disable send button
    • Disable TTS

Slack

https://slack.com/intl/en-gb/downloads/mac

https://github.com/Chatterino/chatterino2/releases/tag/nightly-build

Regular .dmg, not 10.15 version.

~/Library/Application\ Support/chatterino/Settings/settings.json
{
    "appearance": {
        "currentFontSize": 14,
        "currentFontFamily": "B612 Mono",
        "messages": {
            "alternateMessageBackground": true,
            "separateMessages": false,
            "showTimestamps": true,
            "timestampFormat": "h:mm",
            "showLastMessageIndicator": true,
            "showMessageLength": true
        },
        "splitheader": {
            "showTitle": true,
            "showGame": true,
            "showViewerCount": true,
            "showUptime": true
        },
        "showReplyButton": true,
        "smoothScrollingNewMessages": true,
        "uiScale2": 1,
        "tabDirection": 0,
        "theme": {
            "name": "Dark"
        }
    },
    "links": {
        "linkInfoTooltip": true
    },
    "highlighting": {
        "highlights": [
            {
                "pattern": "\\bmatt(ipv4)?\\b(?! damon)",
                "showInMentions": true,
                "alert": true,
                "sound": true,
                "regex": true,
                "case": false,
                "soundUrl": "",
                "color": "#7f7f3f49"
            }
        ],
        "highlightSoundPath": ""
    },
    "emotes": {
        "showUnlistedSevenTVEmotes": true,
        "ffz": {
            "global": true
        }
    },
    "behaviour": {
        "autoCloseThreadPopup": true,
        "usernameRightClickBehavior": 0,
        "usernameRightClickBehaviorWithModifier": 1
    },
    "hotkeys": {
	"reconnect": {
            "action": "reconnect",
            "keySequence": "F6",
            "arguments": []
        },
        "reload emotes": {
            "action": "reloadEmotes",
            "keySequence": "F5",
            "arguments": []
        }
    }
}
~/Library/Application\ Support/chatterino/Settings/window-layout.json
{
    "windows": [
        {
            "tabs": [
                {
                    "highlightsEnabled": true,
                    "selected": true,
                    "splits2": {
                        "flexh": 1,
                        "flexv": 1,
                        "items": [
                            {
                                "data": {
                                    "name": "alveussanctuary",
                                    "type": "twitch"
                                },
                                "flexh": 1,
                                "flexv": 1.5,
                                "moderationMode": false,
                                "type": "split"
                            },
                            {
                                "data": {
                                    "name": "alveusgg",
                                    "type": "twitch"
                                },
                                "flexh": 1,
                                "flexv": 0.5,
                                "moderationMode": false,
                                "type": "split"
                            }
                        ],
                        "type": "vertical"
                    },
                    "title": "Alveus"
                },
                {
                    "highlightsEnabled": true,
                    "splits2": {
                        "data": {
                            "name": "maya",
                            "type": "twitch"
                        },
                        "flexh": 1,
                        "flexv": 1,
                        "moderationMode": false,
                        "type": "split"
                    },
                    "title": "Maya"
                },
                {
                    "highlightsEnabled": true,
                    "splits2": {
                        "data": {
                            "name": "windowtowildlife",
                            "type": "twitch"
                        },
                        "flexh": 1,
                        "flexv": 1,
                        "moderationMode": false,
                        "type": "split"
                    },
                    "title": "WindowToWildlife"
                },
                {
                    "highlightsEnabled": true,
                    "splits2": {
                        "data": {
                            "name": "theconnorobrien",
                            "type": "twitch"
                        },
                        "flexh": 1,
                        "flexv": 1,
                        "moderationMode": false,
                        "type": "split"
                    },
                    "title": "Connor"
                },
                {
                    "highlightsEnabled": true,
                    "splits2": {
                        "flexh": 1,
                        "flexv": 1,
                        "items": [
                            {
                                "data": {
                                    "type": "mentions"
                                },
                                "flexh": 1,
                                "flexv": 1,
                                "moderationMode": false,
                                "type": "split"
                            },
                            {
                                "data": {
                                    "type": "whispers"
                                },
                                "flexh": 1,
                                "flexv": 1,
                                "moderationMode": false,
                                "type": "split"
                            }
                        ],
                        "type": "vertical"
                    },
                    "title": "Mentions + Whispers"
                },
                {
                    "highlightsEnabled": true,
                    "splits2": {
                        "data": {
                            "name": "mattipv4",
                            "type": "twitch"
                        },
                        "flexh": 1,
                        "flexv": 1,
                        "moderationMode": true,
                        "type": "split"
                    },
                    "title": "MattIPv4"
                }
            ],
            "type": "main"
        }
    ]
}

Spark

https://apps.apple.com/app/spark-email-app-by-readdle/id1176895641

Misc

Spotify

https://www.spotify.com/us/download/mac/

Scroll Reverser

https://pilotmoon.com/scrollreverser/

  • Launch at login
  • Reverse mouse vertical only
  • Enable accessbility access

Macs Fan Control

https://crystalidea.com/macs-fan-control

  • Launch at login
  • Show fan + CPU average in menu bar

Amphetamine

https://apps.apple.com/us/app/amphetamine/id937984704

  • Launch at login
  • Start session when launched
  • Hide in dock
  • Indefinite default duration
  • End session when forced to sleep

Hammerspoon

https://github.com/Hammerspoon/hammerspoon#how-do-i-install-it

  • Launch at login
  • Enable accessibility access
.hammerspoon/init.lua
local log = hs.logger.new("", "info")

local function ok2str(ok)
  if ok then return "ok" else return "fail" end
end
  
-- Reload config when file edited
hs.pathwatcher.new(os.getenv("HOME") .. "/.hammerspoon/", function(files)
  for _,file in pairs(files) do
    if file:sub(-4) == ".lua" then
      hs.reload()
      log.f("reloaded config: %s changed", file)
      return
    end
  end
end):start()

-- Trigger Amphetamine on unlock
hs.caffeinate.watcher.new(function(event)
  local eventName = hs.caffeinate.watcher[event]
  if event == hs.caffeinate.watcher.screensDidUnlock then
    local ok, result = hs.applescript('tell application "Amphetamine" to start new session')
    log.f("started new Amphetamine session: %s, %s (%s)", ok2str(ok), result, eventName)
  end
end):start()

-- Toggle WiFi when connected to dock
hs.usb.watcher.new(function(event)
  if event["productName"] == "Dell Universal Dock D6000" then
    if event["eventType"] == "added" then
      log.f("disabling wifi: %s (%s) connected", event["productName"], event["vendorName"]);
      hs.wifi.setPower(false)
    end
  
    if event["eventType"] == "removed" then
      log.f("enabling wifi: %s (%s) disconnected", event["productName"], event["vendorName"]);
      hs.wifi.setPower(true)
    end
  end
end):start()

Finicky

https://github.com/johnste/finicky#installation

.finicky.js
module.exports = {
  defaultBrowser: "Firefox Developer Edition",
  handlers: [
    {
      match: finicky.matchDomains("meet.google.com"),
      browser: "Google Chrome",
    },
  ],
};

DisplayLink

https://www.synaptics.com/products/displaylink-graphics/downloads/macos

  • Launch at login
  • Install login extension

Dock

  • Finder
  • Launchpad
  • Firefox
  • Discord
  • Chatterino
  • Spark
  • Slack
  • Spotify
  • VSCode
  • Figma
  • Terminal
  • (divider)
  • Applications (right click in Finder, add to dock)
  • Downloads
  • Bin
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment