Skip to content

My Developer Workflow Setup in 2026

Stephan Birkeland 14 min read Updated Feb 21, 2026
My Developer Workflow Setup in 2026

I’ve mass-refactored my dev setup enough times that my dotfiles repo has more commits than some of my actual projects. At some point you have to stop tweaking and start shipping. I think I’m finally there. Probably.

Here’s the current state of affairs.

The Hardware

  • MacBook Pro M3 Max - 36GB RAM, 1TB SSD
  • LG 27” 4K Monitor - Single monitor, intentionally
  • Keychron K2 - Mechanical keyboard, brown switches
  • Logitech MX Master 3 - The scroll wheel alone is worth it

I know the single monitor thing is controversial. People look at me like I just said I prefer writing SQL by hand. But switching between virtual desktops keeps me focused on one thing at a time, and having a second screen just meant I had Slack permanently visible, which is the productivity equivalent of leaving the TV on while studying.

Terminal Setup

Zsh + Oh My Zsh

Oh My Zsh is a framework for managing your Zsh configuration with plugins and themes, and it turns a blank shell into something actually pleasant to use.

# Install Oh My Zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

My plugins:

plugins=(
  git
  zsh-autosuggestions
  zsh-syntax-highlighting
  docker
  kubectl
)

zsh-autosuggestions is the one that actually changes your life. It grays out the command it thinks you’re typing, you hit right arrow, done. Everything else is window dressing. I cover more terminal tricks (fzf, zoxide, modern CLI replacements) in my terminal productivity post.

OK so when you first open a terminal, it’s like getting a brand new coloring book with zero crayons. Technically you have the book, but good luck doing anything fun with it. Oh My Zsh is the big box of crayons. It adds colors, shortcuts, and little helpers that make the terminal feel like somewhere a human would actually want to hang out.

The best crayon in the box is zsh-autosuggestions. You start typing and it goes “oh, you probably want THIS command you used yesterday” and shows it in gray. Press the right arrow and boom, done. My terminal now finishes my sentences better than my friends do. More terminal tricks in my terminal productivity post.

Starship Prompt

I went through three custom prompt configs before realizing I was spending more time configuring my prompt than writing code. Starship (a minimal, fast, cross-shell prompt) does the job and gets out of the way. That’s the entire pitch.

brew install starship
echo 'eval "$(starship init zsh)"' >> ~/.zshrc

My ~/.config/starship.toml:

[character]
success_symbol = "[➜](bold green)"
error_symbol = "[➜](bold red)"

[directory]
truncation_length = 3
truncate_to_repo = true

[git_branch]
symbol = " "

[nodejs]
disabled = true

[package]
disabled = true

I disable the Node and package version indicators because I don’t need my prompt reminding me which version of the JavaScript ecosystem is disappointing me today.

The prompt is the little text that shows up before you type in the terminal. Think of it like the name tag on your LEGO bin. You can make it show what folder you’re in, what git branch you’re on, all sorts of stuff. I went through three custom setups before realizing I was spending more time decorating the name tag than actually playing with the LEGOs. Starship looks nice, installs in two seconds, and doesn’t require a PhD in configuration. I finally stopped messing with it, which might be the biggest productivity gain of all.

Ghostty

Ghostty is a native, GPU-accelerated terminal emulator that focuses on being a terminal and nothing else.

brew install --cask ghostty

Fast startup, no Electron, doesn’t try to be a browser. That’s three for three.

The terminal emulator is the actual window where you type commands. Think of it like the table you build LEGOs on. Ghostty is one that’s always ready and doesn’t take up half the room. Some terminals try to be everything at once, like a table that’s also a fridge and also a TV. Ghostty just wants to be a really good table. I respect that focus, mostly because I lack it myself.

Editor Setup

Cursor (Primary)

Cursor is an AI-powered code editor built on VS Code. I covered it in my AI tools comparison, but the short version: it’s VS Code with a brain transplant.

{
  "editor.fontSize": 14,
  "editor.lineHeight": 1.6,
  "editor.fontFamily": "JetBrains Mono, monospace",
  "editor.fontLigatures": true,
  "editor.minimap.enabled": false,
  "workbench.colorTheme": "GitHub Dark"
}

Minimap disabled because I’ve never once looked at that tiny smeared rendering of my code and thought “ah yes, now I know where I am.”

A code editor is where you write your code. Imagine a coloring book, but instead of coloring in pictures, you’re writing instructions for the computer. Cursor is like having a friend sitting next to you who can see your coloring book and goes “hey, I think you meant to use the blue crayon here, not the red one.” Sometimes the friend is wrong, but most of the time it saves me a ton of work. More on Cursor in my AI tools comparison.

Neovim (Secondary)

For quick edits and remote servers where installing a full IDE would be like putting a spoiler on a Honda Civic:

brew install neovim

I use LazyVim (a pre-configured Neovim setup with sensible defaults) so I get a solid editor without spending a weekend writing Lua like it’s my day job.

Neovim is a tiny editor that lives inside your terminal. No big app, no loading screen. I use it for quick fixes and on faraway computers where installing a full editor would be like bringing a bouncy castle to a picnic. LazyVim is a pre-made setup so Neovim comes with useful stuff already working. Without it, setting up Neovim is less “tool” and more “lifestyle.”

Development Tools

Mise for Package Management

Mise is a tool version manager that replaces nvm, pyenv, rbenv, and the rest with one tool. Before mise I had all of those squatting in my shell profile like they were paying rent.

brew install mise

# In project directory
mise use node@20
mise use python@3.12

OK so imagine you have a bunch of different coloring books. One needs the 8-pack of crayons, another needs the 64-pack, and a third one needs colored pencils. Normally you’d get a separate crayon organizer for each book, and before you know it your desk looks like an art supply store exploded. Mise is one organizer that handles all of them. One box. I used to have four different version managers fighting in my shell profile. Now I have one. My computer is much less mad at me.

OrbStack for Containers

OrbStack is a lightweight Docker Desktop replacement for macOS that doesn’t consume half your RAM sitting idle:

brew install --cask orbstack

Seriously, the difference in resource usage is embarrassing for Docker Desktop. OrbStack does the same job while your laptop fan stays quiet.

Docker puts your apps in little boxes (containers) so they can’t mess with each other or your computer. Like giving each toy its own toy box so the LEGOs don’t end up mixed with the Play-Doh. Docker Desktop is the standard app for this on Mac, but it sits in the background eating your computer’s memory like a kid who found the snack cabinet unsupervised. OrbStack does the same job while barely nibbling. My laptop fan stopped sounding like a jet engine. That alone was worth the switch.

TablePlus for Databases

TablePlus is a native database GUI client that connects to pretty much everything.

brew install --cask tableplus

Clean interface, no bloat. I’ve tried pgAdmin, DBeaver, and DataGrip. TablePlus is the only one that doesn’t make me feel like I’m filing taxes.

A database is where your app keeps all its stuff. Imagine a giant toy chest where every toy has a label on it. Looking inside normally means typing special commands, which is like trying to find your favorite toy by shouting into the chest and hoping it answers. TablePlus lets you see everything in a nice table, like lining up all your toys on the floor so you can actually see them. I’ve tried the other tools and they all felt like homework. TablePlus is the only one that doesn’t make me want to close my laptop.

Productivity Tools

Raycast for Window Management

Raycast is a launcher and productivity tool that replaced Spotlight, Alfred, and Rectangle in one shot for me:

brew install --cask raycast

Extensions I use daily:

  • Clipboard history
  • Window management
  • GitHub search
  • Snippet expansion

The clipboard history alone saves me from “I definitely copied that five minutes ago” panic multiple times a day.

On Mac, Cmd+Space opens a search bar called Spotlight. It’s like a toy finder that can only find one toy at a time. Raycast is what happens when that toy finder gets superpowers. It finds apps, organizes your windows, remembers everything you’ve ever copied, and searches GitHub. It’s like having one crayon that somehow draws in every color. The clipboard history alone saves me multiple times a day. “I KNOW I copied that five minutes ago” panic is now a thing of the past. One tool replaced three separate apps, and I am not going back.

Obsidian for Notes

Obsidian is a markdown-based note-taking app with local storage, plain markdown files, full control:

brew install --cask obsidian

My vault structure:

/Notes
  /Daily        # Daily notes (YYYY-MM-DD.md)
  /Projects     # Project-specific notes
  /Learning     # Tech notes and cheat sheets
  /Templates    # Note templates

I tried Notion. I tried Craft. I tried Apple Notes. I always came back to “give me a folder of markdown files and leave me alone.” Obsidian respects that impulse. I go much deeper on how I organize notes, code snippets, and debugging journals in my second brain post.

Obsidian stores your notes as plain text files on your own computer. Not in someone else’s cloud, not in some weird format you can’t open later. It’s like writing in a regular notebook instead of one of those fancy locked diaries where you lose the key and all your notes are gone forever. If Obsidian vanished overnight, your notes would still be right there. I tried Notion, Craft, Apple Notes, and a half dozen others. I kept crawling back to “just give me a folder of files and leave me alone.” More on how I organize everything in my second brain post.

Linear for Task Management

Linear is a project management tool, think Jira but fast and keyboard-driven. Jira refugees will weep with relief.

Linear is a to-do list for software projects. You know how some kids’ board games have 47 pages of rules and take an hour to set up? That’s Jira (the task tool big companies love). Linear is the version where you just roll the dice and play. Fast, clean, and you can control everything with your keyboard. Jira refugees will understand why I nearly cried the first time I used it.

Arc Browser

Arc is a Chromium browser with built-in workspace and tab organization. Spaces for context switching (Work, Personal, Side Projects). My browser tabs used to look like the aftermath of a research binge. Arc fixed that.

Arc is a web browser that organizes your tabs into groups, like sorting your crayons into little cups by color. I have a “work” cup, a “personal” cup, and a “side projects” cup. Before Arc, my browser tabs looked like a crayon box that got dumped on the floor. Now they look like a crayon box that got dumped on the floor but at least I put labels on the piles. Progress is progress.

Git Configuration

My ~/.gitconfig:

[user]
  name = Your Name
  email = you@example.com

[alias]
  co = checkout
  br = branch
  ci = commit
  st = status
  wip = !git add -A && git commit -m "WIP"
  undo = reset --soft HEAD~1
  lg = log --oneline --graph --decorate -20

[core]
  editor = cursor --wait
  excludesfile = ~/.gitignore_global

[pull]
  rebase = true

[init]
  defaultBranch = main

[diff]
  tool = cursor

[merge]
  tool = cursor

My ~/.gitconfig:

[user]
  name = Your Name         # Who you are. Git puts this on every save.
  email = you@example.com  # Same, but email.

[alias]
  co = checkout            # "co" instead of "checkout". Life's too short.
  br = branch              # See your branches without typing the whole word.
  ci = commit              # Save your work with less typing.
  st = status              # "What did I change?" in two letters.
  wip = !git add -A && git commit -m "WIP"  # Grab EVERYTHING and save it as "work in progress". Panic button.
  undo = reset --soft HEAD~1  # Oops. Undo that last save but keep the changes. I use this daily.
  lg = log --oneline --graph --decorate -20  # Show recent history as a pretty little tree.

[core]
  editor = cursor --wait          # Open Cursor when git needs me to type a message.
  excludesfile = ~/.gitignore_global  # Files to ignore everywhere. Stuff like .DS_Store.

[pull]
  rebase = true    # When I pull new stuff, put my changes on top instead of making a mess.

[init]
  defaultBranch = main  # New projects start with "main" not "master".

[diff]
  tool = cursor    # Use Cursor to show me what changed.

[merge]
  tool = cursor    # Use Cursor when two branches need to be smooshed together.

The wip alias is for when I need to switch branches but my current work is in that awkward half-finished state. The undo alias is for when I commit something and immediately realize I’m an idiot. Both get daily use. If you want the full story on git aliases, branching, and commit hygiene for solo projects, I wrote a dedicated git workflow guide.

The Dotfiles

All configurations are version-controlled:

~/.dotfiles/
  ├── zsh/
  │   └── .zshrc
  ├── git/
  │   ├── .gitconfig
  │   └── .gitignore_global
  ├── starship/
  │   └── starship.toml
  └── install.sh
~/.dotfiles/
  ├── zsh/
  │   └── .zshrc              # Terminal settings and shortcuts
  ├── git/
  │   ├── .gitconfig          # All the git shortcuts from above
  │   └── .gitignore_global   # Files git should pretend don't exist
  ├── starship/
  │   └── starship.toml       # The prompt config (the name tag on the LEGO bin)
  └── install.sh              # One script to set everything up on a new computer

Version-controlling dotfiles is one of those things that feels pointless until you set up a new machine and have everything working in ten minutes instead of three days of “wait, how did I configure that?”

Daily Workflow

Morning:

  1. Check Linear for priorities
  2. Review PRs from overnight
  3. Deep work block (2-3 hours, no Slack)

Afternoon:

  1. Meetings (batched)
  2. Code review
  3. Smaller tasks and admin

Tools always open:

  • Cursor (code)
  • Ghostty (terminal)
  • Arc (docs, PRs)
  • Slack (minimized)

The “Slack minimized” part is non-negotiable. Notifications stay off during deep work. If something’s actually on fire, someone will call.

What I Don’t Use

  • IDE-specific terminals - Ghostty is faster
  • Multiple monitors - Virtual desktops work better for focus
  • Electron note apps - Obsidian with markdown files
  • Complex task systems - Linear + a daily note

Every tool I’ve dropped was something that promised to organize my life and mostly just organized itself into my RAM.

The Philosophy

The best setup is one you forget about. I spent way too long chasing the “perfect” dev environment before realizing the goal isn’t a beautiful terminal, it’s shipping code without friction. I optimize for:

  1. Speed - Instant startup, no lag
  2. Consistency - Same setup everywhere (dotfiles)
  3. Focus - Minimal distractions, single-tasking
  4. Keyboard-first - Mouse only when necessary

Spend a weekend getting things right, then close the dotfiles repo and go build something.

The best toys are the ones you grab without thinking. You don’t sit there admiring the LEGO brick, you just build with it. I wasted an embarrassing amount of time making my terminal look cool before realizing the goal isn’t a pretty terminal, it’s building stuff without wanting to throw my laptop. Pick tools that are fast, boring, and stay out of your way. Then STOP DECORATING and go build something. I’m telling you this, and also reminding myself.


What does your setup look like? I’m always curious whether I’m overcomplicating things or not complicating them enough.

Share:
Stephan Birkeland

Stephan Birkeland

Consultant and developer based in Norway. Runs on coffee, curiosity, and a questionable number of side projects.

Keep reading

Up nextproductivity

VS Code Extensions Every Developer Needs in 2026