I loved PM2. Then I switched to Bun.
Let me tell you a quick story. Six months ago, I migrated a handful of microservices from Node to Bun. The speed improvements were everything the benchmarks promised. Cold starts dropped dramatically. Memory usage shrank. I was thrilled.
Then I noticed something. My process manager, PM2, the tool I'd relied on for years, was now the slowest part of my stack. It was the thing consuming the most memory in some cases. The irony of running a Node-based supervisor over hyper-optimized Bun processes started to eat at me.
So I did what any reasonable developer does. I spent my weekends building a replacement.
The Breaking Point
The final straw wasn't one big thing. It was a cascade of small frustrations. PM2 would occasionally misreport memory usage for Bun processes. The TypeScript integration required extra flags and workarounds.
I had to maintain a separate ecosystem.json that felt increasingly disconnected from the rest of my Bun-native tooling. Every time I ran pm2 start, there was a visible delay as the Node-based daemon spun up, only to then launch a Bun process.
I started keeping a list of these friction points. After a few weeks, the list was long enough to justify a project.
What I Built
BM2 is a process manager that does one thing: manage long-running Bun processes without any Node dependency.
No daemon running on a separate runtime. No compatibility layers. Just Bun managing Bun.
The CLI is deliberately familiar:
npm i -g bm2
bm2 start server.ts --name api
bm2 restart api
bm2 logs api --lines 100
bm2 list
Under the hood, everything uses Bun's native APIs. Subprocess spawning uses Bun.spawn. File operations use Bun.write and Bun.file.
The internal state management uses Bun's built-in SQLite. No fs polyfills. No child_process from Node. Pure Bun.
The Results
After migrating my services from PM2 to BM2, here's what I noticed.
The process manager itself starts almost instantly.
There's no daemon boot delay. The memory overhead of the manager dropped significantly because it's not running a full Node runtime alongside Bun.
TypeScript files just work β no flags, no config, no transpilation. And the whole thing feels coherent in a way that's hard to describe. My entire stack is one runtime now, top to bottom.
Should You Switch?
If you're running Node services, PM2 is still excellent. Seriously. It's mature, battle-tested, and feature-rich.
But if you've committed to Bun, consider whether your toolchain has actually caught up with that decision. Your runtime is Bun. Your package manager is Bun. Your test runner is Bun. Why is your process manager still Node?
That's the question that led me to build BM2. Maybe it's the question you've been ignoring too.
Links
Repository: https://github.com/bun-bm2/bm2
Package: https://www.npmjs.com/package/bm2
Top comments (0)