DEV Community

Cover image for The most expensive thing we could sell you is a fork
Dominique Siacci for GoodBarber

Posted on

The most expensive thing we could sell you is a fork

The request arrives regularly, and it's always reasonable: we love the platform — we just need a version of it that's ours. One extra screen. One different behavior. One exception to a rule that makes sense for everyone else but not for them. From the customer's side, it's the most natural ask in software: they pay, the need is real, and the code already exists. How hard can a copy be?

Our answer is no. It has been no for as long as the platform has existed, and it will survive any deal size. Not because the need doesn't count — because refusing the fork is an architecture policy, maybe the oldest one we have.

A fork is the product minus its future

A fork costs nothing on the day you create it. Version control makes it a keystroke. Every cost comes after, and it compounds.

A forked engine leaves the inheritance flow. Everything that makes a platform worth paying for — the changes every app absorbs at its next build: the OS deprecations quietly handled, the new capabilities that just appear — stops reaching it. Someone would have to re-apply each of those changes to the fork, by hand, forever, on a codebase that drifts a little further from the source every month. That someone has better things to do, and eventually doesn't do it.

So "a version just for us" is not what we'd actually be selling. We'd be selling a version nobody keeps alive — the product, minus its future. The evolution is the product. A fork is a way of buying the part that was already done and cancelling the part they were paying for.

Where the need gets to live

The need behind the request is real, though, and refusing the fork doesn't make it go away. What's negotiable isn't whether the need gets served — it's where it lives.

The old principle says it in six words: open for extension, closed for modification. The engine is closed; the surface around it is the offer. Custom-code sections, custom widgets, custom navigation — places designed for behavior we never anticipated. And more recently, a bespoke section can be described and generated without a line of the engine changing underneath it.

Extension doesn't even have to mean living outside the engine. Sometimes the specific need becomes capability embedded in every build and expressed only where it's enabled — injected at compile time, dormant everywhere else. That may sound like a fork wearing makeup, but it differs in the one way that matters: the engine stays one. Every build still comes from the same source, still inherits everything, still moves forward with the fleet. Nothing has left the flow.

What the refusal costs us

Here's the part that took longer to understand: a no-fork policy is a discipline for us before it's a constraint for anyone else. You can only keep refusing forks if the extension points are good enough that the refusal isn't a dead end — and extension points are only good if the engine behind them is built for it.

Which is where the unglamorous principles earn their keep. Components with one responsibility, that evolve only for that responsibility. Modules that depend on each other as little as possible and talk through interfaces. Functionality grouped with the functionality it belongs with. Written down like that, it reads like a textbook page — until you see these rules as the thing that makes the "no" possible. Every one of them exists so that the engine can stay shared while the needs it serves diverge.

And the requests themselves feed the discipline. A fork request that no extension point can absorb isn't a customer to talk out of it — it's a spec for the next extension point. I won't claim we convert every refusal that way; we don't. But the ones we did convert are the reason the next request usually finds a place to live.

The only "just for us" that lasts

What a customer really asks with "a version just for us" is: does my need count? The answer that holds up over years isn't another platform. It's another word in the platform — a capability added to the shared engine, that every app inherits, including theirs.

Their edge case today, everyone's feature tomorrow. It's a slower yes than a fork, and a less flattering one. It's also the only version of "just for you" that will still be alive in three years.

Top comments (0)