howto

Setting up OSX machine

get everything up and running quickly

tags
osx
setup
homebrew
asdf

My machine is a development machine – I doomscroll with the best of them but mainly my machine is setup to do software development. This is how I get everything up to date.

Most everything that I care about data-wise is either in github, iCloud, or Dropbox. I think of the computer as a work place for this data, that gets pushed or synced or whatever, and I don't really worry about backups.

Many of the scripts that I use live in this repository, in /bin. I write a literate blog post, which saves the script there, and then its just part of my toolbox. It pulls the password out of 1password when needed and we are good to go.

This is my main emacs directory, basically everything lives out of here, gets synced to github and github pages.

For other development tasks, I rely on Cursor / vscode. I create tasks that run on startup so when I open up a project, it spins up whatever is needed and you can just start developing. Close the window and it all goes away.

Similiarly as much as I can I use docker to manage processes. From a supabase start to get a local supabase environment going to running pgadmin or openweb-ui having it fire up in a container makes it easy to keep up to date and not have to worry about it leaving junk around.

I've also switched over to pnmp for managing node environments and uv for managing python enviroments.

System

Here's the basics. Install xcode and homebrew.

xcode

1
2
3
xcode-select --install

sudo xcodebuild -license

homebrew

Brewfile

On your old computer you can

1
  brew bundle dump

which makes a Brewfile, which you can then load up with

1
2
3
4
5
6
7
8
9
   #!/usr/bin/env bash

   if test ! $(which brew); then
       echo "Installing homebrew..."
       ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
   fi

   brew update
   brew bundle

Mine looks like

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
  tap "d12frosted/emacs-plus"
  tap "dotenvx/brew"
  tap "homebrew/bundle"
  tap "supabase/tap"
  brew "agg"
  brew "asciinema"
  brew "gmp"
  brew "coreutils"
  brew "curl"
  brew "flyctl"
  brew "gh"
  brew "git"
  brew "hugo"
  brew "ispell"
  brew "jq"
  brew "libyaml"
  brew "plantuml"
  brew "the_silver_searcher"
  brew "wget"
  brew "d12frosted/emacs-plus/emacs-plus@29", args: ["with-imagemagick", "with-modern-sexy-v2-icon", "with-native-comp", "with-xwidgets"]
  brew "dotenvx/brew/dotenvx"
  brew "supabase/tap/supabase"
  cask "1password-cli"
  cask "arc"
  cask "cursor"
  cask "dictionaries"
  cask "discord"
  cask "docker"
  cask "idagio"
  cask "istat-menus"
  cask "mimestream"
  cask "obsidian"
  cask "orion"
  cask "pocket-casts"
  cask "slack"
  cask "spotify"
  cask "superwhisper"
  cask "telegram"
  cask "vlc"
  cask "warp"
  cask "webtorrent"
  cask "whatsapp"

By hand

1
  /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

.zprofile

1
eval "$(/opt/homebrew/bin/brew shellenv)"

And then some basics:

1
brew install coreutils curl git wget hugo jq ag

1password

Keep all of your credentials synced up into the cloud. Only enter in that one password again.

1
2
brew install 1password-cli
brew install --cask 1password

Here's how to use it in scripts.

iStat menus

I use the weather and network access all the time.

1
brew install --cask istat-menus

Browsers

arc

1
brew install --cask arc

Chrome

1
brew install --cask google-chrome

firefox

1
brew install --cask firefox

orion

Orion by Kagi – new kid on the block.

1
  brew install --cask orion

shot-scraper

(You'll need to install uv first.)

shot-scraper is a super useful tool that lets you create screenshots of webpages.

1
2
  uv tool install shot-scraper
  shot-scraper install

Editors

Cursor

When I'm not in emacs I'm in cursor.

1
brew install --cask cursor

emacs

I wrote a longer post about this but here's the gist of it.

1
2
3
4
5
6
7
brew tap d12frosted/emacs-plus
brew install emacs-plus@29 --with-imagemagick --with-native-comp \
 --with-modern-sexy-v2-icon --with-xwidgets

brew install plantuml graphviz
brew tap homebrew/cask-fonts
brew install font-roboto font-roboto-slab font-roboto-mono font-hack

I keep my .emacs config in that blog post, so it will get tangled and updated as needed.

Obsidian

I use obsidian for note taking, as well as content management for thefocus.ai.

1
brew install --cask obsidian

warp

Dictionaries

1
  brew install ispell

Websters:

1
2
3
4
  brew install sdcv
  brew install --cask dictionaries
  wget https://s3.amazonaws.com/jsomers/dictionary.zip
  unzip dictionary.zip

Languages

ruby and go I use asdf for. pnmp for node stuff and uv for python stuff, mainly because they let you set the version in the lock file so it automatically installs. pnpm is much faster and better on disk space and I have no idea what's going on in the python world so I don't want to think about it more than this.

asdf

asdf: The Multiple Runtime Version Manager:

1
  git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.15.0

inside .zshrc

1
  . "$HOME/.asdf/asdf.sh"

deno

Since it auto updates its easier to use its own shell.

1
  curl -fsSL https://deno.land/install.sh | sh

go

1
2
3
4
asdf plugin add golang https://github.com/asdf-community/asdf-golang.git

asdf install golang 1.23.5
asdf global golang 1.23.5

node/pnpm

pnpm: Fast, disk space efficient package manager. One thing I really like about this is it manages different node versions.

1
2
3
  curl -fsSL https://get.pnpm.io/install.sh | env PNPM_VERSION=10.0.0 sh -

  pnpm env use --global lts

Inside of package.json you can specify what version is needed.

1
2
3
4
"engines": {
  "node": ">=22",
  "pnpm": ">=10"
}

python

uv: A single tool to replace pip, pip-tools, pipx, poetry, pyenv, twine, virtualenv, and more.

1
curl -LsSf https://astral.sh/uv/install.sh | sh

inside of .zshrc

1
source $HOME/.local/bin/env

ruby

Still the best

1
2
3
4
5
6
7
  brew install libyaml

  asdf plugin add ruby https://github.com/asdf-vm/asdf-ruby.git

  asdf install ruby 3.4.1
  asdf global ruby 3.4.1
  gem update --system

Rust

1
 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

And then add

. "$HOME/.cargo/env"

dotenvx

1
2
  # install with Homebrew and then use the dotenvx command
  brew install dotenvx/brew/dotenvx

Hosting

Docker

Plenty of docker posts to check out:

the docker desktop app

1
brew install --cask docker

or

just the cli: brew install docker

fly

I've got a bunch of posts on how to use this:

1
brew install flyctl

GitHub

1
2
brew install --cask github
brew install gh

supabase

supabase posts:

1
brew install supabase/tap/supabase

tailscale

1
brew install tailscale

vercel

vercel posts:

1
pnpm i -g vercel

AI

ollama

ollama posts:

1
  brew install ollama

claude

1
brew install --cask claude

openai

https://openai.com/chatgpt/download/

superwhisper

1
brew install --cask superwhisper

Communication

asciinema

Deeper blog post:

1
brew install asciinema agg

discord

Weirdly I only use this to communicate with my children.

1
brew install --cask discord

mimestream

This is my preferred email client

1
brew install --cask mimestream

slack

Work chat.

1
brew install --cask slack

telegram

1
brew install --cask telegram

whatsapp

1
brew install --cask whatsapp

Media

idagio

1
brew install --cask idagio

pocketcast

1
brew install --cask pocket-casts

spotify

1
brew install --cask spotify

vlc

1
brew install --cask vlc

webtorrent

1
brew install --cask webtorrent

Previously

fragments

Plagiarism

copy of a copy of a copy

tags

Next

labnotes

llm cli tool

put it in your workflow

tags
llm
dataset
simonw