I’ve been a MacOS user since 2009 when I had the chance to buy my very first MacBook Pro. Despite I’ve been a little bit disappointed with the actual status quo of Apple machines, as a Software Engineer I believe that Apple’s walled-garden still offers the best experience and tools for professional developers.

Today, I would like to share my current MacOS setup. I decided to write this post because I just did a clean OSX install on my MacBook Pro, and I needed to re-apply my setup. My setup has been built from a Mobile Developer perspective over the years, and as expected, it is a little bit opinionated as well.

1. Developer Tools

Web browsers

  • Firefox, for browsing all the working-related content
  • Chrome, for browsing everything else, preferably

Nowadays I work 100% remotely from home and given that I use my personal Mac as my working machine, I opted to use two browsers. I avoid browsing work-related content from my “personal” browser.

On Firefox I access the usual company’s stuff like email, calendar, meetings, internal documentation, Slack, Basecamp, etc. At 7PM, I just quit Firefox, and work is done (😹).

This workflow is great because it lets me to evaluate Firefox on a daily basis, and I’m enjoying it a lot after Quantum! Kudos to Mozilla!

Personally, I still prefer Chrome as my main browser because I fell it is a little bit faster, and because I’m somehow lazy and locked into Google’s Web ecosystem … I should fix that!

Nevertheless, given a really bad security retrospective over the years, I never use Safari, except to install other browsers (IE feelings someone?). You should avoid it as well.

Basic tools

After a proper clean install, my initial list of developer tools starts with :

  • Command Line Tools for Xcode. It is needed to get Homebrew later
  • Amazon Corretto8 JDK as my OpenJDK build of choice
  • iTerm2 as my terminal replacement
  • Docker for Mac

A quick note about Amazon Corretto : if you work with JVM, please stay away from OracleJDK. Oracle is messing with the Java community and Java ecosystem by promoting it’s paid distribution of the JDK in a trojan-horse mode. You can learn more about it here.

I recommend you to leverage only on OpenJDK builds at your Mac, especially if you need Java8. The two main contenders here are Amazon’s Correto8 and Azul’s Zulu. Amazon’s Correto8 probably will have security updates backported in the mid-term, so stay tunned.

Editors and IDEs

  • Sublime Text as my basic code and/or raw text editor
  • Intellij IDEA, the most awesome IDE ever built, for pure Kotlin and/or JVM programming
  • Android Studio, for Android programming
  • XCode, for some random iOS programming
  • MacDown, open-source, native Markdown editor
  • Hexfiend, open-source, native hexadecimal viewer and editor

Maybe you are asking now :

“Why Sublime when we have VSCode nowadays ?”

The answer is: I avoid Electron-based desktop apps as much I can. Not only due to security concerns but because

  1. I tend to agree with the opinion that Electron-apps are the new AdobeAir apps
  2. I fell that well-crafted native apps are the way to go, on Desktop and on Mobile

Given that in the past ten years most of the time I’ve been using some IDE as my main tool, I’m not into Vim for any particular reason, even though I was a MacVim user in the past.

I use the straight-forward editor for scripting, note-taking, blogging, and some really rare web front-end stuff; therefore I choose Sublime here. It’s great, it’s native and it does the job.

I was a TextMate user in the past as well, and for several use cases - like the aforementioned ones - it also does a great job.

HTTP Tooling

As a full-stack Mobile Engineer, HTTP is my de facto networking protocol for applications. I find these tools quite useful in this arena :

  • Postman, for work-related REST over HTTP instrumentation
  • Paw, for non-work-related REST over HTTP instrumentation
  • NSSurge for HTTP debugging, a lightweight, native alternative for Charles Proxy

I would love if everyone on my team were a Paw user because it is just an amazing tool. However, Postman is an older, stable and multiplatform contender in the same niche, and is comprehensive that it is a popular option for exercising REST APIs at most of the teams out there.

Infrastructure Tooling

Nowadays I also have been playing with backend Web devolopment using some modern JVM frameworks like Vert.x and Ktor.

These tools actually supply my current needs here :

  • Postgres.App is a handy option to bootstrap and manage PostgreSQL on Mac
  • Postico is a nice, lightweight MacOS native client for Postgres databases

Finally, I use Dash for offline documentation access. I recommend you to give it a try.

2. Chrome Extensions

Since most of my important browsing happens on Chrome, I would like to share some extensions I use. I also install most of them on Firefox as well (when available)

  • Lastpass is my password manager
  • uBlock Origin is my choice for ad-blocking (I also use a custom /etc/hosts)
  • MinerBlock is my choice for stop coin-mining scripts
  • HTTPs Everywhere is my choice to force browsing over a better and safer Web
  • The Great Suspender, because tabs are expensive and RAM is finite
  • Tab Limiter, which I use to force myself to stay with eight open tabs at maximum.
  • Pocket, which hosts content related to career, mindset, and lifestyle
  • Instapaper, which hosts content related to most of the technical content I read
  • Readable Wikipedia, self-explained
  • Make Medium Readable Again, a must have when Medium gets annoying
  • RFCRestyle, because I like to read RFCs
  • JSONView, because of public REST / GraphQL APIs

A quick note about TabLimiter : after several of years of passiveness on the too-much-tabs problem, I finally realized that I was using tabs as a parallel, gigantic and unbearable to-do list; limiting tabs and forcing myself to squash-off the unused ones was a game-changer for me. This extension is a simple one and fits my needs.

Finally, I use the famous Android SDK Search extension to browse Android documentation from Chrome’s Omnibox.

3. Command Line Setup

In the past, I was a loyal MacPorts user. Nowadays, Homebrew is my choice to manage Unix and CLI software on MacOS. So, the very first action on a fresh MacOS box is getting Homebrew up and running.

After that, I configure my CLI on iTerm2 with zsh as my default shell, boosted by the outstanding oh-my-zsh. I also install zsh-completions and zsh-autosuggestions to boost this awesomeness ever further!

There is a lot of handy tools I also install using a half-baked script, for instance

  • git, because we need it always up-to-date
  • tree for directory listing
  • httpie for REST instrumentation over CLI
  • updated versions of Python and Ruby
  • and others, like CI related tools, Heroku and so on

Android specific CLI tools

For Android development, my very first CLI setup is to add all the SDK tools - like ADB, Fastboot and etc - into my shell’s path. I link them into my $PATH directly pointing to the installation directory defined by the default Android Studio installer on my Mac

export ANDROID_HOME="~/Library/Android/sdk"
export PATH=$ANDROID_HOME/platform-tools:$PATH
export PATH=$ANDROID_HOME/tools:$PATH

I also use

  • ktlint, a Kotlin code formatter actionable from CLI
  • scrcpy, a must have tool for any professional Android developer
  • deep-clean, when the Android tooling fails miserably

Git specific tools

I don’t like any visual tools for my daily basis Git usage. I’ve tried most of them over the years, including Github for Desktop, Sourcetree, and etc.

My last attempt was Fork, just because it’s a new native option and I found the tool really eye-catching. If you enjoy GUI options for Git, I recommend you give it a try.

Therefore, I use Git 100% via CLI. I have a couple of aliases I enjoy, but usualy I also leverage on two companion tools, namely :

I have been trying several diff/merge tools over the years … and saddly, I disliked all of them someway … 😢

When I have XCode installed for some reason, I use the old school - but built-in - FileMerge, changing only the editor’s font.

In my opinion, the Intellij-based Git support is just too slow for my workflow. Nowadays I just disable the Git integration from Intellij / Android Studio as part of my IDEs setup.

I use Git 100% through the CLI and several times I just want to solve the conflict and re-check the build directly on CLI … I don’t want to bootstrap an entire project on IDE, even I find it’s diff visuals quite powerful. Sometimes IDE goes crazy due to the conflicts themselves … Not practical for me at all.

I do like an external visual tool for VCS conflicts resolution, but I prefer a simple and fast one. Filemerge delivers that. Nowadays I’m evaluating SublimeMerge as an option as well. Let’s see how it goes!

4. Communication Tools

  • Spark Email Client, usually for work-related emails
  • Telegram for Mac. The native and handy-to-use one.
  • Tweetbot as my Twitter Client
  • Slack, because I cannot avoid it … (I don’t know if any developer can nowadays)

5. Productivity and content

Some tools help with productivity more than others. And my champion here is Alfred.

I really love this piece of software. I have been using it since 2009, and I am a proud supporter of this product. I have my custom theme and my loved workflows installed, and if you only know Stoplight until now, you should check what you are missing. Nevertheless, Alfred does not have privacy issues like Apple’s Spotlight.

On my Mac, I just disable Spotlight and put CMD + Space as my Alfred shortcut.

I also would like to mention some other tools I use to productivity and content:

  • Alternote is my lightweight alternate client for my Evernote account
  • Omnigraffle is my choice for fancy and complex diagrams
  • Keynote is my choice for presentations
  • Trello is my centralized to-do list and workflow manager. I use the Desktop app, and would love to have a native one …

As a Mobile Engineer, as also leverage on the following tools to deal with images :

I frequently use GIFs to report visuals bugs to my team and also to illustrate visual changes on my pull requests. Github does not like MP4 videos, so GIFs all the way!

6. Security

Security is main concern for me. I’m not an expert on this subject, but I’m always learning and I have my proper setup and configuration in order to harder a little bit my MacOS box.

I would like to mention here two specific tools :

  • dnscrypt-proxy is a great utility for DNS privacy
  • Lulu, in order to block - or learn more about - outgoing network connections. Just an open-source alternative to LittleSnitch

If you want to learn about hardening your Mac, I recommend the following links:

7. Other

  • Rocket, because we need emojis everywhere. Really, I love this app!
  • DisplayMenu for easy displays control
  • AppCleaner, for deleting unused apps
  • The Unarchiver for zipped content
  • VLC as my media player
  • and much more!

8. Further work

Of course, my MacOS setup is an ongoing and unfinished work. I believe I have a room for improvements here.

In the future, I would like to leverage on a 100% automated setup in a fresh install. We can find some samples of that out there, heavily based on Homebrew. Probably some rsyncing may be needed on my particular case, but is still worth a try someday.

Furthermore, I would like to improve my security setup, leveraging on FIDO keys in the near future. But this is a topic for the next post.