At the moment, I use a touchbar 13” Macbook Pro (Intel), which for now is enough for my needs (quad-core CPU, 16GB of memory). Even though this model does not have a great keyboard (which already failed once and had to be replaced, thankfully for free, by Apple), it has a fantastic screen, amazing track pad, and is quite light and small.

MacOS is POSIX-compliant, so some GNU utils you might be used to are either missing or are severely outdated out of the box, but this doesn’t really hinder my work, and overall the macOS experience is a very pleasant and stable one, providing good enough defaults and flexibility, and great integration with the Apple ecosystem.


When I am at a desk, I only use my Happy Hacking Keyboard Professional Hybrid. It is a very minimal keyboard with no separate arrow keys or a numpad (which, as a programmer, I never have a need for), which makes it very symmetrical and reduces my hand movement. It has a Sun Type 3 arrangement, so the Ctrl key is already to the left of A, which is perfect for me as an Emacs and terminal user. The keys are slightly curved, are made of high quality PBT plastic, and have unique Topre switches, which are very pleasant to type on. I got the Hybrid model, because it offers Bluetooth connectivity with fast switching between 4 devices, and uses standard AA batteries.

Editor / IDE / whatever

I use emacs-plus of version 28 with native compilation, since it is now stable enough, and is noticeably faster than the 27 branch.

For me, Emacs is the only editor that has managed to make it possible to develop for every language that I have some familiarity with: Python, Ruby, Java, JavaScript, Clojure, Erlang, Elixir and Lisp. The flexibility and extensibility it offers, combined with the amazing Language Server Protocol and the Emacs-LSP client, makes Emacs a very compelling environment.

Of course, Emacs can do so much more than just edit code - read news, browse RFCs, fetch data from web APIs, manage Kubernetes clusters, organize notes and tasks. Having as many of these actions in one system greatly reduces context switching, and reduces the overhead of having to manage different applications, where each has a different set of UIs, menus, key bindings and conventions.

Other tools

The tools mentioned here are those that I either have not learned to use in Emacs, or don’t exist yet, don’t have the features I need, or are just more user-friendly.

Mail / Calendar / Photos / Maps

I try to avoid unnecessary duplication and redundancy, and prefer to use what is already given to me, so I tend to stick with the applications Apple provides on their operating systems. Apple Mail and the like has been working fine for me for a few years, and am not compelled to switch to anything else at the moment.


Here are a number of tools I have collected over the years in no particular order that I have found of great value:

  • iTerm2, still in my opinion the best terminal emulator available for macOS
  • Insomnia, a very nice REST client that supports HTTP and gRPC, as well as has advanced features like code generation
  • Minikube, a lightweight k8s implementation that is great for running development services locally and get rid of Docker Desktop
  • Dash, a fantastic documentation viewer for all of your language and library needs, that integrates with editors too

Programming Languages

Scripting / interpreted

Python and Ruby are good for what they were made for - scripting, as well as web frameworks and web frameworks. However, I would not say I am a big fan of them, due to their lack of decent type checking, flexibility and performance.


Clojure is a great language to use if you need to use the JVM. It is the most functional and elegant language that I know of that compiles to Java byte code, and is a great way to get introduced to lisps. The reason for this is the great tooling and very friendly and creative community. Of course, Rich Hickey himself is a feature of the language.

If you have never touched the BEAM, you have never known how elegant and powerful a virtual machine can be. Erlang and Elixir are functional, strictly typed languages that run on the BEAM VM, and make problems such as scalability, distribution, caching and multiprocessing actually solvable, using a very small set of tools. I think every programmer that has anything to do with the web must at least try out Elixir or Erlang.

Common Lisp is a very alien language, and rightfully so. The amount of flexibility and choice it gives to the programmer is mind blowing, and can be quite overwhelming. It is not just a tool - it is the bricks and the circuits to allow you to make your own hammers and drills. You want to write in a functional style? You can. You want static typing, ADTs, threading macros and also call C code? It’s all available, usually just a package away. You can get very far with just the core library and a few libraries, but most often than not people create their own DSL for their problem domain.