DEV Community

Cover image for Not Everything Needs to Be a Framework: Why Spawning Processes Still Wins
Gen.Y.Sakai
Gen.Y.Sakai

Posted on

Not Everything Needs to Be a Framework: Why Spawning Processes Still Wins

Some people say:

“This is just spawning a subprocess. That’s not architecture.”

They’re absolutely right.

And that’s exactly why it works.

I’ve been shipping production systems long enough to have lived through CORBA, SOAP, WSDL, and every other attempt to make inter-process communication “pure.”

I’ve also shipped systems under real deadlines, in regulated industries, where “rewriting everything” is not an option.

This article is about why the sidecar pattern — yes, literally just wrapping a binary — keeps winning in the real world.

Not in theory.

Not in blog posts.

In production.

The Pattern Everyone Pretends Not to Use

Here’s the pattern:

  • A TypeScript / Node / Electron app
  • Spawns a compiled binary (.NET, Rust, Go, C++)
  • Talks over stdin/stdout, pipes, or a local socket
  • Lets the OS do process isolation

That’s it.

No service mesh.

No gRPC schema wars.

No “distributed systems” cosplay.

Just a parent process orchestrating a sidecar that does the heavy lifting.

If this sounds “too simple,” good.

That’s the point.

“But That’s Just a Wrapper”

Yes.

  • VS Code wraps git
  • VS Code wraps OmniSharp (.NET)
  • Prisma wraps a Rust query engine
  • Docker Desktop wraps the Docker daemon
  • Electron apps wrap platform-native tools every single day

If “just a wrapper” was a design flaw, half of modern developer tooling wouldn’t exist.

The uncomfortable truth is this:

Most successful tools are orchestration layers. Not reinventions.

Why This Pattern Keeps Shipping

Let’s be brutally honest about the real options.

Option 1: Rewrite Everything in TypeScript

  • Months of work
  • New bugs in mature code
  • Worse performance
  • Now you maintain two versions forever

Great for blog posts.

Terrible for shipping.

Option 2: Native Addons (N-API, node-gyp)

  • Fast, yes
  • Also fragile
  • Node upgrades break you
  • One segfault kills your entire process
  • Cross-compilation is pain incarnate

Ask anyone who has maintained native addons long-term.

Option 3: Spawn a Sidecar

  • Uses existing, battle-tested code
  • Crashes are isolated
  • Debugging is obvious (it’s a process)
  • Cross-platform is manageable
  • Ships this week, not “someday”

This isn’t laziness.

It’s risk management.

“Architecture Purity” vs Reality

In regulated domains — healthcare, finance, government systems — you don’t get to say:

“Let’s just rewrite the crypto layer.”

You integrate with what already exists:

  • Vendor SDKs
  • Legacy libraries
  • OS-specific APIs
  • Hardware-backed security modules

The sidecar pattern gives you:

  • A clean boundary
  • A failure domain you can reason about
  • A way to keep modern UX without breaking compliance

That’s not a hack.

That’s professional engineering.

This Is Not a New Idea — It’s the Mature One

We spent decades trying to make IPC “beautiful”:

  • CORBA
  • SOAP
  • Enterprise Service Buses
  • Endless XML schemas

And what did we learn?

That simple, observable processes beat “perfect abstractions” when systems get large and real humans have to operate them.

Today, spawning a process and talking over stdio feels almost embarrassing — until you realize it’s exactly what we wanted 20 years ago.

When You Should Not Do This

Let’s be clear — this is not a hammer for every nail.

Don’t use this pattern if:

  • A simple REST call solves your problem
  • The logic is trivial and low-cost
  • Latency is measured in microseconds
  • Your team can’t maintain the sidecar language

Pragmatism cuts both ways.

The Real Lesson

The sidecar pattern isn’t about processes.

It’s about respecting reality:

  • Existing code matters
  • Deadlines matter
  • Failure isolation matters
  • Shipping matters

If your architecture diagram looks clean but your product never ships, you chose wrong.

I’ll take a “wrapper” that ships over a “pure” system that doesn’t — every time.

Final Thought

If this pattern is good enough for:

  • Microsoft (VS Code)
  • Docker
  • Prisma
  • The entire Electron ecosystem

It’s probably good enough for your project too.

And if someone says

“That’s just spawning a process,”

Smile.

They just described half of modern software — the half that actually works.


Want to try this pattern yourself?

I put together a minimal proof-of-concept in TypeScript + .NET that shows the full lifecycle management and stdio communication in action. It runs in minutes.

Check out the repo on GitHub → open-rx


Have you ever used the sidecar pattern in production? What worked? What broke?

Drop your war stories in the comments — I read every one.


Transparency note:

The title of this article was generated with NanobananaPro.

The opinions, war stories, and architectural scars are entirely my own.

Top comments (1)

Collapse
 
gys profile image
Gen.Y.Sakai

In my experience, the most valuable lessons don’t come from theory — they come from struggling through the hard parts and making things actually work.

I’d love to hear from folks who have been there:

what was the ugly truth you hit in production, and how did you push through it?

Tell us your real-world war stories — the things you got right, the things that punched you in the face, and how you ended up shipping something that works!