../my-development-setup

My development setup

Table of contents

This post isn't a setup guide. It's more like a conversation with a friend or a stranger, and I'm showing-off my office and work setup. Also, mostly it's just me having an internal dialogue.

I started off with Atom and Terminator for my main development setup in my early days (2016). I was using Linux (Ubuntu) as my daily driver back then, and I would hop over to the next cool tool whenever I'd find one. Moved to VSCode, then a couple of years using WebStorm & Goland.

But over the years, I've settled on an operating system, development tools, & some workflows that I've grown used to. I've been using this setup for at least 4 years now, and from the looks of it, I'll continue using this for the foreseeable future.

Most of this setup is curated towards macOS but as you'll see, it's built in a way that replicating this on a Linux machine will be extremely easy.

The Hardware

The meat & potatoes of my whole setup. Every one of these pieces is something I've acquired over the years (one at a time), and I ABSOLUTELY LOVE THEM. IMO, it's everything (only, more than less) anyone would ever need to do work in software engineering. Here's the list:

MacBook Pro - M3

I received a work MacBook (Intel chip) in January 2020, and I've been sold on it ever since. I've had two Macs (M1 & M3) since then, which is too many TBH. Had to send the work Mac back, of course, after I moved on from the job, which led to me buying an M1 Mac right away. And the difference was actually groundbreaking. IT WAS BLAZINGLY FAST. If I'm completely being honest, and if my M1 MBP's screen hadn't chipped1, I think I would've stayed with it even till today (in 2025). Of course I keep feeling like going back to Linux every now & then (so I'm always checking out Asahi Linux, which is AWESOME), but I'm fully content with how things are.

Even though the most I use is a browser, a Terminal & a bunch of apps that work on most platforms, the ARM chip on these MacBooks is really something else. So unless I get a sponsor from work to build a Linux Beast Desktop, this is more than I'd ever need.

Dell Ultrawide Monitor

This monitor, though not the best, is still pretty good, like really, really good. The model is, U3818DW and it's a 38" 3840 × 1600 ultra-wide monitor. The real estate is amazing for productivity. Multiple screens, right in front of you, at all times. Everything important right there. No toggling or context switching. Not to mention, it has a built-in USB hub that works quite well:

That's more than enough to connect everything. My mic & webcam are plugged into the back ports. Unifying receiver for my mouse on the side port and then a single Type-C cable to the MacBook, and it all works.

Kinesis Advantage 360

Kinesis Advantage 360 Keyboard

Oh my. My wife really tried to convince me to not get this keyboard, rightfully so, because I already was using a Moonlander, but when this keyboard was drop-shipped on drop.com, I had to get my hands on it.

I'd recently learned about concavity on keyboards & how it's a lot more ergonomic & supports better layout movement. But then, the shipment got delayed for like the 5th time & I was wondering maybe it was the wrong decision. After 9 months of anxious waiting, this keyboard finally arrived. Took some time to adjust but not too long since I was already using a split keyboard. It's been 2.5 years and this keyboard has been one of the best purchases I ever made. It's fun to type on, no wrist pain, keys are amazing (cherry browns), and somehow the battery lasts several weeks on a full charge? I have disabled backlight & battery level reporting.

On a side note, my wife uses the Moonlander now and refuses to let me use it. That is another awesome keyboard and I actually like the keys better on the Moonlander and they're hot-swappable unlike Kinesis :(

Useful accessories

Other use accessories on my desk are:

  1. Bose QuietComfort Ultra Headphones High quality headphones are really important for me. I wear them most of the time during my work hours & comfort is a priority for this. My pick for this is Bose QC Ultra. They're light, noise cancellation is amazing, battery backup is pretty good & are comfy as hell.
  2. Shure MV7 Microphone - When you're working remotely, a good mic is very important. However, most headphones & the macs have really high-quality microphones in them, so I think it's an overkill unless you're into content production (Youtube, Twitch, etc)
  3. Logitech Brio Webcam - Since my laptop stays lid-down 99% of the times when I'm working, a webcam really helps. On video calls & meetings, it changes the dynamics of the entire conversation when your camera is on.
  4. Logitech MX Master 3s - A really, really high quality mouse that has served me well for many years now. I use the buttons on the mouse for screenshots, & desktop (workspace) navigation. You can customize it's buttons to do a lot of stuff (like open apps, or run shortcuts)
  5. NOOE Desk Mat - It's a non-skid, suede desk mat. It's really neat & well crafted product. Absolutely love it. Before this one, I had a generic black rubberised mat, which served me well for a couple years but this one is much, much better.
  6. A headphone stand - Tiny, hides in the environment, helps with keeping it organised on the desk.

Development Environment

As a software engineer, one of the best things you can do is understand the ecosystem you work in. Learn new things? Yes. But also relearn & go deep into certain areas. Software engineering is not only building things. A lot of the time, it's fixing things, debugging, making old things better, and sometimes, it's just grunt work.

But there's one thing at the centre of this all, your personal development environment. The tools you use, how well you use & understand them. It can be a debugger, a terminal multiplexer, a shell, a programming language, an operating system and many other things. This really works as the basis of everything that you do. Embrace things instead of fighting them. If you can't embrace, find something that you can & learn & love to use. It should be enjoyable, fun. Like after years of using Neovim, a colleague who doesn't even use Vim told be you can search bottom-to-up using ? instead of regular /. I was like whaaaat? That's soo cool.

Anyway, here's how my development environment is set up.

Configuration files are present on my Dotfiles repo

Terminal Emulator - Ghostty

Ghostty With Gruvbox

I only ever use one terminal instance. I find having too many windows open at the same time too distracting, however as you work on larger & larger projects, you have to run many processes, open many tabs, navigate between them, and it becomes so hard to use your desktop space efficiently. Because of this, having a terminal emulator with Tabs or Window Splits is really important. I started off with iTerm and Kitty but settled on Alacritty2 and used it for almost 3 years. It doesn't support tabs or windows or splits, so the only way I could use Alacritty & keep it sane was with Tmux3.

After using Tmux for a while, I realised, it's pretty good at doing things like Tabs, Windows, Splits, Resizing, etc. But the most important thing about Tmux for me is Persistent Sessions. You can accidentally quit your terminal (and you will. Many times.) and instead of losing your state (some running program, SSH connection to a remote server, editing some program), it just keep it alive, like magic. This single feature has saved me more times than I care to admit.

For a little over 6 months, I've been using Ghostty4. I've converted some of my shortcuts from Alacritty to Ghostty and it has been working PERFECTLY since day one. Very high quality software right there.

My terminal workflow is quite simple. I use Nushell as my default login shell. Whenever I open my terminal, it starts with Nushell (If you're not using Nushell, you're sleeping on an amazing tool). I've also configured Ghostty's start-up command to start Tmux. So every time I run Ghostty, it opens with a Tmux session.

Programming Editor - Neovim

Neovim

In the last 8 years, I've picked up a few languages and I'm still learning new ones (e.g. Zig). Most of my day-to-day work involves working with Go Typescript Terraform SQL TOML YAML JSON. On some weekends, I dabble into Zig. I needed an editor that worked across domains (multiple languages), is lightweight, performant, has LSP support & a great community around it. And guess what, Neovim has it all (and more).

This is one of the biggest shifts I've made in my recent years. Since 2020, I've been using Neovim and my only complaint is Why I didn't do this sooner. Programming and file editing has completely changed for me now. To the point that not having Vim motions feels tiring. Jump to word, line, top, bottom, blocks of code, it all flows like muscle memory. No need to think, it just works. I can just never go back now.

Now, of course what really matters is getting familiar with your editor. Understand what it offers and make that part of your muscle memory. You can be just as efficient in any editor of your choice but the day you switch to this side, there's no going back. If you're into Star Wars, this is what Palpatine was crazy about.

Anyhow, my Neovim setup as changed over the years quite a lot but I really feel like it has found it's solid foundation. The entire configuration is done using Lua and my plugin manager is lazy.nvim. Most of the configuration is synced to my dotfiles repo.

Here's what really stands out for me:

  1. Entire development environment is programmable - plugins, theme, keymaps, and so much more.
  2. Neovim has built-in support for LSP (Language Server Protocol), that means autocompletion works natively.
  3. Fuzzy finder (Telescope), integrated terminal (yes I run terminal inside Neovim, it's floating and it's awesome).
  4. An amazing community around it. Engineers, students, writers, managers. All kinds of people use Neovim and Vim and that makes Neo(vim) an amazing tool.
  5. It just works, no bloat and really, really fast.

Other tools

This section is for all the other tools that sort of run in the background and make my workflow complete. My daily setup is always three windows on a screen -

| Browser | Terminal | Browser |

This helps me focus & partition things without juggling between screens. One browser for the active development window, other browser for reading, searching, work stuff. This has worked very well for me and I've sort of grown into this. There are always more "desktops" (like workspaces in linux desktop environments) which will have other apps open like Spotify, Slack, Discord, project management tools, etc.

There a couple of tools that run in background that help my navigate between applications & desktop screens, run some services in background & just overall make the experience better.

Rectangle

Window Layout

Rectangle5 is an open source, window manager for macOS. You can split windows in half, thirds, quarters, place them in corners, centre them, etc. Rectangle has shortcuts (which you can customize) like Opt + Ctrl + d, Opt + Ctrl + f, and Opt + Ctrl + g to move currently active window to left, center or right. Building a mental model around it super easy because d, f & g are co-located on QWERTY keyboard layout. It settles into your muscle memory really quickly.

Hammerspoon

Hammerspoon6 is a macOS Automation tool. I only use it for global shortcuts but can do soooo much more like window management, put things inside your menu bar, run custom scripts. The possibilities are quite literally endless. It's very easy to get started with it. Just define a small hook to perform some action (like open an app) and hammerspoon does it for you.

Here's what my Ghostty shortcut looks like inside my hammerspoon config (usually located at ~/.hammerspoon/init.lua):

hs.application.enableSpotlightForNameSearches(true)
hs.hotkey.bind({ "alt" }, "Space", function()
    local ghostty = hs.application.get("Ghostty")

    if ghostty == nil then
        hs.application.launchOrFocus("Ghostty")
        return
    end

    if ghostty ~= nil then
        if ghostty:isFrontmost() then
            ghostty:hide()
        else
            hs.application.launchOrFocus("/Applications/Ghostty.app")
        end
    end
end)

Now, if I press Opt + Space, it'll bring Ghostty into focus if it's already running or launch it otherwise. If ghostty was the active window, it'll hide it.

I have a similar shortcut for Brave: Opt + B. So when I'm working, to toggle between different apps, I just use the shortcuts. Instead of alternating between applications using Cmd + Tab, I just use Opt + B for Brave & Opt + Space for Ghostty. This works so well. As a bonus, if an app is running in a different desktop screen (workspace), it'll navigate to that workspace automatically.

Postgres.app

I work a lot with PostgreSQL. In my opinion, it's one of the best databases & most of the times, a very sane default option when building products. There are many ways to run Postgres on your laptop locally and the way I use it is with an app called Postgres.app7. It let's you run different instances of Postgres and just works. There are other tools like DBngin8 which work quite well but Postgres.app is what I use.

Orb Stack

Orb Stack9 helps with running a container environment locally. It's like Docker Desktop but 10x lighter & much more performant. Has a built-in Kubernetes cluster setup & everything works exactly the same way (1:1 mapping for everything docker). This has been another good find and a tool that is almost always running in the background.


  1. My Yubikey had a fine-knitted thread attached to it, with a knot on the other end. I suspect, one of the days when I was closing the lid of my macbook, the knotted thread was left on the keyboard and when the lid was shutdown, it broke the screen.

  2. Alacritty is a blazingly fast, cross-platform, GPU-accelerated terminal. It's written in Rust and works really, really well.

  3. Tmux is a terminal multiplexer (runs inside your terminal). It can run many isolated terminal sessions, tabs, windows and is configurable to the end of the world

  4. Ghostty is an open source, blazingly-fast, feature-rich, and cross-platform terminal emulator that uses platform-native UI and GPU acceleration. It's written is Zig & built by some of the best people in the software industry.

  5. Rectangle is an open source window manager for macOS.

  6. Hammerspoon is an open source macOS automation tool to run scripts, setup global keymaps & local workflows.

  7. Postgres.app is a PostgreSQL installation package for macOS. It comes bundled with CLI tools, & a small GUI app to control different PostgreSQL instances.

  8. DBngine is an All-in-one database version management tool (PostgreSQL, MySQL, Redis, etc)

  9. Orb Stack is a lightweight Docker Desktop alternative which can manage containers & VMs