My Stack

Software
Python
Mac
List

If you’re curious about the tools I use, here’s a list of my current setup. I’ll keep this list updated as my stack evolves.

Affiliate links

Some of the links below are affiliate links. If you purchase a product through one of these links, I may receive a small commission. This helps me keep this site running and continue to provide free content. Thank you for your support!

Hardware

MacBook Pro M3 14”

I recently upgraded my M1 MacBook Pro to the M3 14” model. It’s a great machine for coding, writing, and video editing. The battery life is impressive, and the screen is a pleasure to work with. And importantly, it’s now available in black.

iPad Pro 12.9”

I use my iPad Pro for reading, note-taking, and watching YouTube. It’s a great device for consuming content, especially when I’m on the go. Mine is getting a bit old, so I’m considering a replacement soon. I’m on the fence between switching to reMarkable 2 or getting the new iPad Pro (probably the 11” model), but I think I’ll stick with the iPad because I also use it as a second monitor for my MacBook Pro when traveling. The thing that bothers me the most about the iPad is that for some reason, my Apple Pencil keeps dying on me right after the warranty expires. I’m on my third Apple Pencil since 2020.

Keyboard

I love mechanical keyboards. I have a few, but my daily driver at home is the [Keychron Q1 QMK - Version 2 with knob](Keychron Q1 QMK Custom Mechanical Keyboard - Version 2 and at the office, I use the Das Keyboard 4 Professional for Mac with Cherry MX Blue switches (I love the clicky sound, but it is very loud.).

Mouse

I’m a lefty who actually uses the mouse with my left hand, not the right hand like most lefties do, so there are not many options for me. I use the Razer DeathAdder Left-Hand Edition and I’m very happy with it. Unfortunately, it’s not available anymore, so I’m not sure what I’ll do when it breaks.

Monitors

While I love the MacBook Pro’s screen, most of the time it is connected to external monitors. I use a dual-monitor setup with a Dell UltraSharp 32” 4K USB-C hub monitor as the main monitor and a LG UltraFine 27” 4k USB-C hub monitor as a secondary monitor in portait mode. Having a monitor in portrait mode is great for reading, writing, and for ChatGPT.

Audio

I use the AirPods Pro 2nd generation when I need noise cancellation or when I’m on the go. The sound quality is good and the noise cancellation is great for such a small device. The main downside is the battery life, which is not great.

For longer listening sessions, I use the AIAIAI TMA-2 headphones with Alcantara ear cushions. The sound quality is amazing and the comfort is unbeatable. I can wear them for hours without any discomfort. I use it plugged into a Schiit Fulla DAC/Amp for better sound quality and a big knob to control the volume.

Finally, I have a Yeti microphone for video calls and recording videos. At almost 10 years old, it is the oldest piece of tech on my desk after the AIAIAI headphones, but it still works great.

Homebrew 🍺

Ok, so I use a lot of different software on a regular basis. I list the main ones below. I use two main sources to install software on my Mac: Homebrew and the App Store. I use Homebrew to install command-line tools and most regular apps. I use the App Store to install apps that are not available as casks in Homebrew or that I purchased from the App Store. I also use the web to install some apps that are not available in the App Store or as casks in Homebrew.

Homebrew is a package manager for macOS. It’s a bit like apt-get on Linux, or a command-line version of the App Store. It’s a command-line tool, so you need to open a terminal to use it (you have one in Applications/Utilities/Terminal). It makes installing software much easier (see below for my full install script).

To install Homebrew, open a terminal and run the following command:

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

Once Homebrew is installed, you can install software by running brew install <package>. For example, to install Python, you would run brew install python. You can also use it to install multiple versions of the same software. For example, to install Python 3.12, you would run brew install python@3.12. These command-line apps that can be installed with Homebrew are called formulae.

Homebrew can also install regular apps, such as Visual Studio Code. These are called casks. I install most of the apps listed below using Homebrew, except for the ones that are not available as casks or that I purchased from the App Store.

If you want to install a cask, you need to run brew install --cask <cask>. For example, to install Visual Studio Code, you would run brew install --cask visual-studio-code.

In the following sections, I indicate the apps that I install using Homebrew with a 🍺. Apps that are installed from the App Store or the web are marked with a 🍎 or a 🌐, respectively.

Why Homebrew?

Homebrew is the easiest way to install many command-line tools on macOS. Why also use it for regular applications? Because it makes it much easier to keep track of the software you have installed and to do a fresh install of your Mac. If you keep that list as an install script on GitHub, you can easily install all your apps on a new Mac by running a single command.

My Brewfile

Brew can install all the apps you need from a file called a Brewfile. You can create a Brewfile by running brew bundle dump. This will create a file called Brewfile in your current directory with a list of all the apps you have installed with Homebrew. You can then commit this file to a GitHub repository and use it to install all your apps on a new Mac. You can also edit the file to remove apps you don’t want to install on the new Mac.

Check out the latest version of my Brewfile for an example.

Security first!

After basic settings, I always start with security, installing a password manager, 2FA app, and a VPN.

There is no excuse to not use a password manager. You should never use the same password for multiple sites, and you should never use a password that is easy to guess. Because it’s impossible to remember all the passwords you need for all your accounts, you need a password manager.

My password manager of choice is Bitwarden 🍺. It’s open-source, free, and works on all platforms, which allows me to use it on my Mac, my iPhone, my iPad, and my Linux machine. There is a paid family version that allows you to share passwords with family members. Don’t forget to use a strong passphrase instead of a password to protect your password manager. I use the App, the browser extension, and the command-line interface.

I use Authy 🍎 for two-factor authentication (2FA). It’s free and works on all platforms. The mac desktop version was recently discontinued, but the iPad version works well on Apple silicon macs.

I also use not one but two VPN services. I use Private Internet Access 🍺 for my personal use, whenever I’m using public wifi or need to access geo-restricted content. I also use Cisco VPN to access my university’s network.

Browser: Brave

Safari is a great browser, but I prefer to use a Chromium-based browser because they a fewer compatibility issues. I use Brave 🍺 because it has built-in ad-blocking and tracking protection. It supports multiple profiles, which is great for separating my personal and professional browsing. It’s also faster than Chrome, uses less memory, but still supports Chrome extensions. Here are the extensions I use:

  • Bitwarden: my password manager
  • Dark Reader: dark mode for all websites
  • EZProxy Redirect: Quickly reload pages through your library’s EZProxy to access paywalled content.
  • Grammarly: spell and grammar checker (I use the paid version)
  • Google Docs Offline: allows you to use Google Docs offline
  • Reader Mode: removes all the clutter from a webpage to make it easier to read
  • Zotero Connector: allows you to save references to Zotero
  • Save to Pocket: allows you to save pages and articles to Pocket

Fonts

Default macOS fonts are fine for most purposes, but I install a few additional fonts with brew 🍺. The first one is Computer Modern, which is the font used in LaTeX documents. It is very useful when you want to generate figures that match the font used in your LaTeX document or when you want to make a Word document look like a LaTeX document.

Then I have a few monospace fonts that I use for coding and writing. The first one is Fira Code, which is an awesome monospace font for programming with ligatures for common programming symbols. I use the Nerd Fonts version because it is enriched with additional symbols that are used by many terminal applications. I use this font in my terminal and code editor. I like to switch things up, so I also have a few other monospace fonts that I also use for coding:

  • Monaspace: Coding fonts from GitHub. Have a look at the website to see how they look.
  • Hack (Nerd Font version): Great-looking font for programming
  • JetBrains Mono (Nerd Font version): Coding font from JetBrains
  • Noto: Great-looking font family from Google for presentations and documents

I keep a separate Brewfile for fonts.

Ligatures

Ligatures are special ways to represent multiple characters. For example, the ! and = symbols together usually represent inequality. Many programming fonts, including Fira Code, replace these two characters with a single symbol that is two spaces wide. This makes the code easier to read. However, if you are showing code as part of teaching (or in blog posts), you should avoid using ligatures because they can be confusing for beginners as they hide the underlying individual characters.

Color Theme

I use the Catpuccin 🌐 theme for almost everything that supports it (terminal, code editor, etc.). From their website:

Catppuccin is a community-driven pastel theme that aims to be the middle ground between low and high-contrast themes. It consists of 4 soothing warm flavors with 26 eye-candy colors each, perfect for coding, designing, and much more!

You don’t install Catpuccin directly on your system. Instead, you install a theme for each application that supports it. I alternate between light and dark themes depending on the time of day; when I use dark mode, I use the mocha flavor, and when I use light mode, I use the latte flavor.

Terminal

Coding and research often require time in the terminal. I use the iTerm2 🍺 terminal instead of the default one. It has many more features and is more customizable. I use the Catpuccin 🌐 color theme, and set the terminal font to Fira Code Nerd Font.

Zsh and Oh my Zsh

The default shell on macOS is Zsh, which looks a bit bland out of the box. I use Oh my Zsh to customize Zsh. It’s a framework for managing your Zsh configuration. It comes with many plugins and themes. I haven’t tried any plugins yet, but I use the agnoster theme, which is a popular theme that shows a lot of information in the prompt. It requires a Powerline font, which all Nerd Fonts are. Another popular theme is Powerlevel10k.

I don’t know if I’ll stick with Zsh. I’m considering switching to Fish, which is a more modern shell with a lot of features that make it easier to use. I’ll write about it if I make the switch after tyring it out seriously.

Other terminal tools

I also install a few other tools that make my life easier in the terminal:

  • tmux 🍺: Terminal multiplexer. It allows you to split your terminal into multiple panes and to detach and reattach sessions.
  • rclone 🍺: Command-line tool to sync files to the cloud and other remote locations. I use it to sync my files to remote computing servers.
  • wget 🍺: Command-line tool to download files from the web. It’s useful for automatically downloading files from the web.

Development tools

Editor: Visual Studio Code

I use Visual Studio Code 🍺 as my code editor. It’s a great editor that supports many languages and has many extensions. I use it for Python, Markdown, LaTeX, JavaScript, and Rust. Setting up VS Code and extensions is a topic for multiple other posts.

I also sometimes use Neovim 🍺, which is a terminal-based editor. It is extremly fast and you can customize eveything, but the learning curve is quite steep. I’m still learning how to use it, but I like it quite a lot. Who knows, maybe I’ll switch to it from VS Code one day.

Programming languages

I use many programming languages and related software for my research and projects. Here are the ones I use most often:

  • python@3.12 (and python@3.11 and python@3.10) 🍺: The latest version of Python. I also install the previous two versions because some libraries are not compatible with the latest version.
  • poetry 🍺: A package manager for Python. I use it to manage my Python environments and to install Python libraries. It’s a bit like pip or Anaconda’s conda, but better. Look for a future post on why I prefer Poetry.
  • r 🍺: The R programming language. I don’t use it much, but sometimes I need it to run R code from other people.
  • node 🍺: The JavaScript runtime. I don’t do research using JavaScript, but it is useful when I work on web-related projects.
  • yarn 🍺: A package manager for JavaScript. It’s a bit like npm, but better.
  • rust 🍺: The Rust programming language. I don’t use it much, but I’m learning it because it’s a great language for writing command-line tools or Python libraries that require speed.

Version control: Git and GitHub

I use Git and GitHub for version control and collaboration. Here are the software I use to work with Git and GitHub:

  • git 🍺: The version control system. It’s a great tool for keeping track of changes to your code and collaborating with others. It comes bundled with macOS, but I prefer to install it with Homebrew to get the latest version.
  • GitHub Desktop 🍺: GUI for Git and GitHub
  • gh 🍺: The GitHub command-line tool. It allows you to do many things from the command-line, such as creating a new repository, creating a pull request, or merging a pull request

Other development tools

  • sqlite 🍺: A lightweight SQL database. It’s required by many other libraries.
  • duckdb 🍺: An in-process SQL database that can be used to query CSV files and parquet files. It’s a great tool for data exploration and analysis. This is the command-line version, but there is also a Python library.
  • Docker 🍺

Productivity

  • OmniFocus 🍺 $
  • OmniGraffle 🍺 $
  • Obsidian 🍺
  • Focused Work 🍎
  • Fantastical 🍎 (also available on 🍺)
  • Toggl Track 🍎

Collaboration

  • Discord
  • Dropbox
  • GitHub

Writing

  • MacTeX (LaTeX) 🍺
  • Quarto 🍺
  • Grammarly 🍺
  • Zotero 🍺
  • GoodNotes 🍎

Mac utilities

  • Pocket Casts 🍺
  • IINA 🍺
  • Termius 🍺
  • Transmit 🍺
  • Amphetamine 🍎
  • PCalc ($) 🍎
  • Karabiner-Elements 🍺
  • Rectangle 🍺
  • Keka 🍺

Media Production

  • Adobe Premiere Pro
  • Adobe Audition
  • Audacity 🍺
  • Adobe Photoshop
  • Keynote
  • QuickTime Player