My 2025 macOS Setup

sujiba

1 macOS Settings

[WIP]

2 Install Homebrew

Homebrew is a package manager for macOS. Every package and its dependencies are installed under /opt/homebrew. You can either install the latest Homebrew release with the .pkg installer available at GitHub or with the following command:

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

3 Get your terminal up and running

3.1 Prerequisities

3.1.1 Install Nerd Fonts

Before installing ghostty, fish and starship download the latest MesloLG Nerd Font. Unpack the downloaded Meslo.zip and install the font by double clicking the followingen files:

# LGS = small line gap, for vertical line spacing
# Mono = every letter and character uses the same horizontal space
- MesloLGSNerdFontMono-Bold.ttf
- MesloLGSNerdFontMono-BoldItalic.ttf
- MesloLGSNerdFontMono-Italic.ttf
- MesloLGSNerdFontMono-Regular.ttf

Now we have all the beautiful symbols, that we are going to use in our terminal.

3.1.2 Install eza

eza is an alternative for the well known file-listing command-line tool ls. It adds headings and colors.

brew install eza

3.2 Install Ghostty

Ghostty is a alternative terminal emulator that is easy to configure. It is written in Zig and uses platform-native UI and GPU acceleration. Ghostty is a project of Mitchell Hashimoto, known for Terraform.

brew install ghostty

3.2.1 Configure Ghostty

Start Ghostty and open the settings with cmd + ,. Create your own config or copy the following content into the editor:

font-family = "MesloLGS Nerd Font Mono"
font-size = 14
background-opacity = 0.80
background-blur-radius = 40
theme = "Catppuccin Mocha"

3.3 Install starship

Starship is a cross-shell prompt. It is easy configurable and is compatible with fish.

brew install starship

3.3.1 Configure starship

My starship config is based on Catppuccin Powerline Preset. Install the preset with starship preset catppuccin-powerline -o ~/.config/starship.toml or copy the content of my altered config from details to ~/.config/starship.toml.

"$schema" = 'https://starship.rs/config-schema.json'

format = """
[](red)\
$os\
$username\
[](bg:peach fg:red)\
$directory\
[](bg:yellow fg:peach)\
$git_branch\
$git_status\
[](fg:yellow bg:green)\
$c\
$rust\
$golang\
$nodejs\
$php\
$java\
$kotlin\
$haskell\
$python\
[](fg:green bg:sapphire)\
$conda\
[](fg:sapphire bg:lavender)\
$time\
[ ](fg:lavender)\
$cmd_duration\
$line_break\
$character"""

add_newline = false

palette = 'catppuccin_mocha'

[os]
disabled = false
style = "bg:red fg:crust"

[os.symbols]
Windows = ""
Ubuntu = "󰕈"
SUSE = ""
Raspbian = "󰐿"
Mint = "󰣭"
Macos = "󰀵"
Manjaro = ""
Linux = "󰌽"
Gentoo = "󰣨"
Fedora = "󰣛"
Alpine = ""
Amazon = ""
Android = ""
Arch = "󰣇"
Artix = "󰣇"
CentOS = ""
Debian = "󰣚"
Redhat = "󱄛"
RedHatEnterprise = "󱄛"

[username]
show_always = true
style_user = "bg:red fg:crust"
style_root = "bg:red fg:crust"
format = '[ $user]($style)'

[directory]
style = "bg:peach fg:crust"
format = "[ $path ]($style)"
truncation_length = 3
truncation_symbol = "…/"

[directory.substitutions]
"Documents" = "󰈙 "
"Downloads" = " "
"Music" = "󰝚 "
"Pictures" = " "
"Developer" = "󰲋 "

[git_branch]
symbol = ""
style = "bg:yellow"
format = '[[ $symbol $branch ](fg:crust bg:yellow)]($style)'

[git_status]
style = "bg:yellow"
format = '[[($all_status$ahead_behind )](fg:crust bg:yellow)]($style)'

[nodejs]
symbol = ""
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'

[c]
symbol = " "
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'

[rust]
symbol = ""
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'

[golang]
symbol = ""
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'

[php]
symbol = ""
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'

[java]
symbol = " "
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'

[kotlin]
symbol = ""
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'

[haskell]
symbol = ""
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'

[python]
symbol = ""
style = "bg:green"
format = '[[ $symbol( $version)(\(#$virtualenv\)) ](fg:crust bg:green)]($style)'

[docker_context]
symbol = ""
style = "bg:sapphire"
format = '[[ $symbol( $context) ](fg:crust bg:sapphire)]($style)'

[conda]
symbol = "  "
style = "fg:crust bg:sapphire"
format = '[$symbol$environment ]($style)'
ignore_base = false

[time]
disabled = false
time_format = "%R"
style = "bg:lavender"
format = '[[  $time ](fg:crust bg:lavender)]($style)'

[line_break]
disabled = false

[character]
disabled = false
success_symbol = '[❯](bold fg:green)'
error_symbol = '[❯](bold fg:red)'
vimcmd_symbol = '[❮](bold fg:green)'
vimcmd_replace_one_symbol = '[❮](bold fg:lavender)'
vimcmd_replace_symbol = '[❮](bold fg:lavender)'
vimcmd_visual_symbol = '[❮](bold fg:yellow)'

[cmd_duration]
show_milliseconds = false
format = " in $duration "
style = "bg:lavender"
disabled = false
show_notifications = true
min_time_to_notify = 45000

[palettes.catppuccin_mocha]
rosewater = "#f5e0dc"
flamingo = "#f2cdcd"
pink = "#f5c2e7"
mauve = "#cba6f7"
red = "#f38ba8"
maroon = "#eba0ac"
peach = "#fab387"
yellow = "#f9e2af"
green = "#a6e3a1"
teal = "#94e2d5"
sky = "#89dceb"
sapphire = "#74c7ec"
blue = "#89b4fa"
lavender = "#b4befe"
text = "#cdd6f4"
subtext1 = "#bac2de"
subtext0 = "#a6adc8"
overlay2 = "#9399b2"
overlay1 = "#7f849c"
overlay0 = "#6c7086"
surface2 = "#585b70"
surface1 = "#45475a"
surface0 = "#313244"
base = "#1e1e2e"
mantle = "#181825"
crust = "#11111b"

[palettes.catppuccin_frappe]
rosewater = "#f2d5cf"
flamingo = "#eebebe"
pink = "#f4b8e4"
mauve = "#ca9ee6"
red = "#e78284"
maroon = "#ea999c"
peach = "#ef9f76"
yellow = "#e5c890"
green = "#a6d189"
teal = "#81c8be"
sky = "#99d1db"
sapphire = "#85c1dc"
blue = "#8caaee"
lavender = "#babbf1"
text = "#c6d0f5"
subtext1 = "#b5bfe2"
subtext0 = "#a5adce"
overlay2 = "#949cbb"
overlay1 = "#838ba7"
overlay0 = "#737994"
surface2 = "#626880"
surface1 = "#51576d"
surface0 = "#414559"
base = "#303446"
mantle = "#292c3c"
crust = "#232634"

[palettes.catppuccin_latte]
rosewater = "#dc8a78"
flamingo = "#dd7878"
pink = "#ea76cb"
mauve = "#8839ef"
red = "#d20f39"
maroon = "#e64553"
peach = "#fe640b"
yellow = "#df8e1d"
green = "#40a02b"
teal = "#179299"
sky = "#04a5e5"
sapphire = "#209fb5"
blue = "#1e66f5"
lavender = "#7287fd"
text = "#4c4f69"
subtext1 = "#5c5f77"
subtext0 = "#6c6f85"
overlay2 = "#7c7f93"
overlay1 = "#8c8fa1"
overlay0 = "#9ca0b0"
surface2 = "#acb0be"
surface1 = "#bcc0cc"
surface0 = "#ccd0da"
base = "#eff1f5"
mantle = "#e6e9ef"
crust = "#dce0e8"

[palettes.catppuccin_macchiato]
rosewater = "#f4dbd6"
flamingo = "#f0c6c6"
pink = "#f5bde6"
mauve = "#c6a0f6"
red = "#ed8796"
maroon = "#ee99a0"
peach = "#f5a97f"
yellow = "#eed49f"
green = "#a6da95"
teal = "#8bd5ca"
sky = "#91d7e3"
sapphire = "#7dc4e4"
blue = "#8aadf4"
lavender = "#b7bdf8"
text = "#cad3f5"
subtext1 = "#b8c0e0"
subtext0 = "#a5adcb"
overlay2 = "#939ab7"
overlay1 = "#8087a2"
overlay0 = "#6e738d"
surface2 = "#5b6078"
surface1 = "#494d64"
surface0 = "#363a4f"
base = "#24273a"
mantle = "#1e2030"
crust = "#181926

3.4 Install fish

fish is an alternative shell and includes features like syntax highlighting, autosuggest-as-you-type, and tab completions with no extra configuration required.

brew install fish
tip
tip

If you're coming from bash take a look at fish for bash users.

3.4.1 Configure fish

You can change your fish config under ~/.config/fish/config.fish.

if status is-interactive
    # Commands to run in interactive sessions can go here
end

# make use of eza
alias l='eza --group --header --group-directories-first --long --all'
alias ll='eza --group --header --group-directories-first --long'

# start starship
starship init fish | source
enable_transience

# start ssh-agent
eval (ssh-agent -c)
# if you want to automatically load your ssh-key into the current session
# ssh-add ~/.ssh/id_ed25519

3.5 Set default shell

Last but not least change the default shell to fish:

chsh -s /opt/homebrew/bin/fish

3.6 Final result

Open a new Ghostty Terminal and take a look at the final result. A screenshot of the final result.

4 Additional packages

brew install age \
             ansible \
             ansible-lint \
             argocd \
             bitwarden \
             cilium-cli \
             eza \
             ffmpeg \
             fish \
             flux \
             ghostty \
             gnupg \
             helm \
             helmfile \
             hubble \
             jq \
             k9s \
             kuberenetes-cli \
             neovim \
             nmap \
             opentofu \
             packer \
             siege \
             sops \
             starship \
             talhelper \
             talosctl \
             vscodium \
             wget \
             yt-dlp \
             zola

5 VSCodium addons

Here is a list VSCodium addons that i use.

- @signageos/vscode-sops
- Ansible
- Better Jinja
- Catppuccin for VSCode -> Catppuccin Mocha
- Catppuccin Icons for VSCode -> Catppuccin Mocha
- Docker
- EditorConfig for VS Code
- Even Better TOML
- GitHub Actions
- Kubernetes
- Markdown All in One 
- OpenTofu (official)
- Yaml