When to Fork a Product Out of the Shared Foundation
When should a product leave the shared foundation? When its needs diverge so far that the foundation costs more than it saves. Here are the signals to fork out.
Fork a product out of the shared foundation when the foundation starts costing that product more than it saves. Most of the time the shared base is pure benefit: a product inherits auth, deploy, and infrastructure for free. But occasionally one product's needs diverge so far that staying on the foundation means bending both the product and the foundation into shapes that hurt them both. When that happens, cutting the product loose is not a failure. It is the foundation working as designed, because a good foundation is a road you can leave, not a cage.
When should a product leave the shared foundation?
When the friction of conforming exceeds the value of inheriting. Every product on the foundation pays a small tax: it accepts the shared way of doing things in exchange for not building those things itself. Usually that trade is wildly in the product's favor. Occasionally a product's requirements drift until the tax gets heavy, and you should notice when it does.
The signals that a product is outgrowing the foundation:
- It fights the foundation constantly. Every feature requires working around a shared assumption rather than building on it.
- It forces changes on the foundation that only it wants. The shared layer is growing flags and branches to serve one product, which taxes all the others.
- Its scale or performance needs are categorically different. One product now needs a specialized database or infrastructure the others never will.
- Its release cadence is incompatible. It needs to move on a rhythm the shared foundation cannot support.
If a product hits several of these, the foundation has stopped being leverage for it. This is the flip side of knowing what belongs in a shared foundation: sometimes a whole product no longer belongs.
Fork the product, do not fork the foundation
Here is the critical distinction. When one product diverges, the answer is to let that product leave, not to warp the shared foundation to accommodate it. The worst outcome is a foundation contorted by special cases for a single product, because that cost lands on all twenty products to benefit one.
I watch for the tell: a shared component sprouting conditionals that only one product triggers. That is the foundation absorbing a product's divergence instead of the product owning it. Adding one product's special case to the shared layer is one of the mistakes that quietly rots a foundation. The right move is to give that product its own copy of the piece it needs to bend, and keep the shared version clean for everyone else. Localize the divergence in the product, not in the base.
This is easier when the foundation was built as thin glue over standard tools rather than a framework the product is welded into. Glue is easy to peel off. A framework is a tunnel you cannot exit.
Forking has a real cost, so do not do it lightly
Leaving the foundation is not free. The forked product loses automatic inheritance. When you patch a security issue in the shared identity layer, the forked product does not get the fix for free anymore. When you improve the deploy pipeline, the fork stays behind. You have traded shared leverage for independence, and that independence has an ongoing maintenance bill.
So forking is a last resort, not a first reaction. Before you fork, exhaust the cheaper options: can the product override just the piece it needs while inheriting the rest? Can you use extension points so the product bends locally without leaving the road entirely? Most "we need to fork" situations are really "we need one product to diverge in one place," which the foundation should allow without a full exit.
Full forks are for genuine categorical divergence, where a product has become a different kind of thing than the rest of the portfolio. When that is true, keeping it shackled to the foundation helps no one.
A foundation you can leave is a stronger foundation
The counterintuitive point is that being able to fork out makes the foundation better, not weaker. If products can leave when they genuinely need to, you never have to compromise the foundation to keep a mismatched product on it. The shared base stays clean and opinionated because it is not forced to serve every edge case. The foundation stays fast precisely because it does not try to be everything to everyone.
I build my portfolio so the default is inheritance and the exit is available. My tooling scaffolds new products onto the shared base by default, and Bootspring keeps that base thin enough that a product which truly needs to leave can, without a rewrite. The foundation earns its keep by being the obvious best choice, not by locking anyone in. When a product leaves, that is the system telling you the truth, and the smart move is to listen.