Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file removed .DS_Store
Binary file not shown.
111 changes: 111 additions & 0 deletions .github/workflows/install.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
name: install

# Smoke-test that a fresh Mac install still works.
# Runs the brew-only subset of the Brewfile (mas needs an Apple ID, casks
# are slow and irrelevant to CI), stows the dotfiles, then sanity-checks
# that the tooling we rely on (brew, pnpm, eod) is functional.

on:
push:
branches: [main]
pull_request:
paths:
- Brewfile
- Makefile
- bin/**
- home/**
- macos/**
- scripts/**
- .github/workflows/**
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
install:
runs-on: macos-15
timeout-minutes: 30

steps:
- uses: actions/checkout@v4

- name: Show environment
run: |
sw_vers
uname -m
brew --version
which brew

- name: Brews-only Brewfile (skip mas + cask + vscode + cargo)
run: |
grep -E '^(tap|brew) ' Brewfile > Brewfile.ci
echo "--- Brewfile.ci ---"
cat Brewfile.ci

- name: brew bundle
run: brew bundle --no-lock --file=Brewfile.ci

- name: make stow (clear conflicts first)
run: |
# The hosted runner ships some default dotfiles; remove the ones
# we manage so stow doesn't refuse to link.
rm -f ~/.zshrc ~/.gitconfig ~/.gitignore_global ~/.p10k.zsh
rm -f ~/.ssh/config
rm -rf ~/.config/nvim
make stow

- name: Verify symlinks
run: |
set -x
test -L ~/.zshrc
test -L ~/.gitconfig
test -L ~/.p10k.zsh
test -L ~/.gitignore_global
test -L ~/.ssh/config
test -L ~/.config/nvim/init.lua

- name: brew works
run: |
brew --version
brew list --formula | head -20

- name: node + pnpm work
run: |
node --version
pnpm --version
# Round-trip: pnpm can init a project and install a tiny dep.
mkdir -p /tmp/pnpm-test && cd /tmp/pnpm-test
pnpm init >/dev/null
pnpm add --silent ms >/dev/null
test -f node_modules/ms/package.json
node -e "console.log(require('ms')('2 days'))"

- name: eod smoke test
run: |
set -x
export DEVELOPER_DIR=/tmp/test-repos
mkdir -p "$DEVELOPER_DIR"/{clean,dirty,ahead}

# clean repo
git -C "$DEVELOPER_DIR/clean" init -q
git -C "$DEVELOPER_DIR/clean" -c user.email=t@t -c user.name=t commit --allow-empty -q -m initial

# dirty repo
git -C "$DEVELOPER_DIR/dirty" init -q
touch "$DEVELOPER_DIR/dirty/foo.txt"

# ahead repo (fake upstream)
git -C "$DEVELOPER_DIR/ahead" init -q
git -C "$DEVELOPER_DIR/ahead" -c user.email=t@t -c user.name=t commit --allow-empty -q -m initial
git -C "$DEVELOPER_DIR/ahead" update-ref refs/remotes/origin/main HEAD
git -C "$DEVELOPER_DIR/ahead" remote add origin /tmp/fake.git
git -C "$DEVELOPER_DIR/ahead" symbolic-ref HEAD refs/heads/main
git -C "$DEVELOPER_DIR/ahead" -c user.email=t@t -c user.name=t commit --allow-empty -q -m local
git -C "$DEVELOPER_DIR/ahead" branch --set-upstream-to=origin/main >/dev/null

./bin/eod --no-fetch "$DEVELOPER_DIR"

- name: make doctor
run: make doctor
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.DS_Store
Brewfile.lock.json
124 changes: 56 additions & 68 deletions Brewfile
Original file line number Diff line number Diff line change
@@ -1,114 +1,118 @@
tap "homebrew/bundle"
tap "homebrew/services"
tap "mongodb/brew"
# Homebrew bundle file -- the single source of truth for installed apps and CLIs.
#
# Apply with `make brew` (or `brew bundle --file=Brewfile`).
# Dump current state with `make brew-dump`.

# ---------------------------------------------------------------------------------------------------------------------
# Taps
# ---------------------------------------------------------------------------------------------------------------------
tap "oven-sh/bun"
tap "planetscale/tap"
tap "supabase/tap"

# ---------------------------------------------------------------------------------------------------------------------
# CLI tools and language runtimes (brew)
# ---------------------------------------------------------------------------------------------------------------------
# Shell + dotfile management
brew "bash"
brew "bash-completion"
brew "stow"

# System utilities used by macOS setup scripts
brew "gnu-sed"
brew "gnupg"

# Core CLI tooling
brew "btop"
brew "caddy"
brew "chezmoi"
brew "cloc"
brew "cocoapods"
brew "deno"
brew "ffmpeg"
brew "flyctl"
brew "fzf"
brew "gh"
brew "git-delta"
brew "lazygit"
brew "lftp"
brew "mactop"
brew "mas"
brew "minicom"
brew "mkcert"
brew "mysql-client"
brew "neovim"
brew "nvm"
brew "pgsync"
brew "python@3.13"
brew "pipx"
brew "pnpm"
brew "postgresql@17"
brew "pv"
brew "python@3.12"
brew "python@3.9"
brew "ripgrep"
brew "sherlock"
brew "sniffnet"
brew "sox"
brew "testdisk"
brew "tmux"
brew "vercel-cli"
brew "wakatime-cli"
brew "wget"
brew "yt-dlp"
brew "zoxide"
brew "mongodb/brew/mongodb-database-tools"
brew "mongodb/brew/mongodb-community"

# Web / cloud
brew "caddy"
brew "vercel-cli"

# Media tooling
brew "ffmpeg"

# Mobile / iOS
brew "cocoapods"

# Language runtimes
brew "node"
brew "pnpm"

# Databases
brew "mysql-client"
brew "pgsync"
brew "planetscale/tap/pscale"
brew "supabase/tap/supabase"
brew "postgresql@17"

# ---------------------------------------------------------------------------------------------------------------------
# GUI applications (cask)
# ---------------------------------------------------------------------------------------------------------------------
cask "1password"
cask "1password-cli"
cask "android-platform-tools"
cask "android-studio"
cask "anydesk"
cask "appcleaner"
cask "azure-data-studio"
cask "balenaetcher"
cask "cap"
cask "claude-code"
cask "cursor"
cask "cyberduck"
cask "discord"
cask "excalidrawz"
cask "expo-orbit"
cask "ghostty"
cask "gitbutler"
cask "google-chrome"
cask "grandperspective"
cask "handbrake-app"
cask "iina"
cask "imageoptim"
cask "keka"
cask "claude"
cask "wispr-flow"
cask "kekaexternalhelper"
cask "lm-studio"
cask "logi-options+"
cask "macs-fan-control"
cask "microsoft-auto-update"
cask "microsoft-teams"
cask "ngrok"
cask "onyx"
cask "openrocket"
cask "orbstack"
cask "postman"
cask "rectangle"
cask "rustdesk"
cask "shottr"
cask "sigmaos"
cask "sketch"
cask "superhuman"
cask "tableplus"
cask "tailscale-app"
cask "utm"
cask "visual-studio-code"
cask "wakatime"
cask "whisky"
cask "zed"
cask "zen"
cask "zulu@17"

# ---------------------------------------------------------------------------------------------------------------------
# Mac App Store (mas)
# Requires being signed into the App Store before `brew bundle` runs.
# ---------------------------------------------------------------------------------------------------------------------
mas "1Password for Safari", id: 1569813296
mas "AB Bounce", id: 6462195757
mas "Albums", id: 1469948986
mas "Amphetamine", id: 937984704
mas "Apple Configurator", id: 1037126344
mas "Broadcasts", id: 1469995354
mas "Compressor", id: 424390742
mas "Craft", id: 1487937127
mas "Crouton", id: 1461650987
mas "Developer", id: 640199958
mas "Diffusers", id: 1666309574
mas "Dona", id: 6748265175
mas "Dynamic Wallpaper Maker", id: 1453846328
mas "Final Cut Pro", id: 424389933
mas "Flighty", id: 1358823008
mas "GarageBand", id: 682658836
Expand All @@ -122,13 +126,8 @@ mas "Microsoft Excel", id: 462058435
mas "Microsoft Outlook", id: 985367838
mas "Microsoft Word", id: 462054704
mas "Motion", id: 434290957
mas "MusicHarbor", id: 1440405750
mas "Night Sky", id: 475772902
mas "Numbers", id: 409203825
mas "OneDrive", id: 823766827
mas "Pages", id: 409201541
mas "Photomator", id: 1444636541
mas "PowerWash Simulator", id: 6477445344
mas "Reeder", id: 6475002485
mas "Refined GitHub", id: 1519867270
mas "Shazam", id: 897118787
Expand All @@ -142,19 +141,8 @@ mas "Windows App", id: 1295203466
mas "Wipr", id: 1662217862
mas "WireGuard", id: 1451685025
mas "Xcode - 15", id: 497799835
vscode "biomejs.biome"
vscode "bradlc.vscode-tailwindcss"
vscode "davidanson.vscode-markdownlint"
vscode "expo.vscode-expo-tools"
vscode "github.codespaces"
vscode "github.copilot-chat"
vscode "github.vscode-github-actions"
vscode "mateocerquetella.xcode-12-theme"
vscode "ms-azuretools.vscode-containers"
vscode "ms-vscode-remote.remote-containers"
vscode "pdconsec.vscode-print"
vscode "redhat.vscode-yaml"
vscode "solomonkinard.git-blame"
vscode "wakatime.vscode-wakatime"
vscode "yoavbls.pretty-ts-errors"

# ---------------------------------------------------------------------------------------------------------------------
# Cargo crates (installed via cargo-bundle plugin)
# ---------------------------------------------------------------------------------------------------------------------
cargo "imessage-exporter"
Loading
Loading