Why did I switch from Node.js to Golang after 5 years?
On this page
Originally published October 2024. Updated February 2026 with new projects and lessons learned.
Hi there!
For a long time, I was a Node.js developer. I loved it. It was easy to learn, and I built some cool stuff with it.
The struggles with Node.js
I was slightly anoyed by all these things like commonjs vs esm, typescript vs javascript, but I could deal with it. I have been using it for a long time, and I was good at it.
I knew the history behind these choices, and I understood the reasons why things were the way they were.
But over time the small annoyances added up. Every new project started with the same ritual: pick a framework, configure TypeScript, set up the build pipeline, choose between 15 testing libraries. Before writing any actual code I was already 2 hours into tooling decisions.
And then node_modules. I don't need to explain this one.
Discovering Go
I tasted Rust, Java, Clojure, and some others, but then I discovered Go. Back in university, my friends kept telling me how Golang was good, but I was busy with the JavaScript ecosystem. Big mistake.
When I finally tried it, I was amazed by how easy it was to learn, and how much I could accomplish with it.
A few things that clicked for me:
Standard library is enough. I can build HTTP servers, handle JSON, do crypto, manage files - all without importing anything external. In Node.js I needed express, body-parser, dotenv, and 10 other packages just to start a basic API.
Goroutines. I took Parallel Programming 1 and 2 in university, it was all in C. I remember it was tough. My teacher Dr. F. Sukru Torun was an amazing person, I wish I took more lessons from him. In Go you get mutex, channels, buffered channels, select statements - and they all just make sense. In Node.js I was juggling promises and callback patterns. In Go I just write go doSomething() and it works.
Single binary. go build gives me one file. I copy it to a server and it runs. No runtime, no dependencies, no Docker required (though I still use it). Try deploying a Node.js app without shipping the entire node_modules tree.
It compiles fast. Like really fast. I don't miss waiting for tsc to finish.
What I built with Go
After the switch, I started building everything in Go:
- TaskWing - CLI tool for AI-assisted development. 66K+ lines of Go. Single binary, distributed via Homebrew. Could not have built this in Node.js without it becoming a mess.
- Osprey - Transaction monitoring engine. Evaluates 12 FATF rules in milliseconds. Go's performance made this possible without any optimization tricks.
- gok-proxy - Thin proxy with encryption and rate limiting built on fasthttp. The kind of thing Go was literally designed for.
I know other languages also have similar or same features, but Go makes it so easy to use them for me. So I can focus on building stuff instead of configuring stuff.
The tradeoffs
I'm not going to pretend Go is perfect.
Error handling is verbose. Writing if err != nil hundreds of times gets old. But at least errors are explicit - no surprise exceptions flying from 3 layers deep.
No generics for a long time was painful. They added them in 1.18 and it got much better.
The dependency ecosystem is smaller than npm. But honestly that's a feature. Fewer packages means fewer choices means less time deciding.
When I still use Node.js
I still reach for TypeScript when building frontends. React, Next.js - that ecosystem is hard to beat for UI work. My personal site is built with React and TypeScript.
But for backends, CLIs, and anything that needs to be fast and deployable - Go every time.