Two decisions, not one โ first how you structure repos & releases, then how you handle long-running features within that.
Decision 1 โ Release strategy. Do your services live in one repo and ship together (Monorepo / Batch Release), or in separate repos that ship independently (Polyrepo / Independent Release)? These are alternatives โ you pick one. Your service coupling and team structure decide it, not preference.
Decision 2 โ Long-running features. Whichever strategy you picked, a feature that takes 3+ sprints still can't sit half-done in the pipeline. Feature Flags and Feature Branch + STAGE are the two techniques that solve this โ and they work with either release strategy. They're complementary, not competing.
Batch Release (monorepo) and Independent Release (polyrepo) are mutually exclusive structural choices.
A feature that spans 3+ sprints needs one of these techniques. Both layer on top of whichever release strategy you picked above.
| Aspect | Monorepo โ Batch Release | Polyrepo โ Independent Release |
|---|---|---|
| Unit of release | Coordinated batch โ all services together | Per service โ each ships on its own |
| Cross-service change | Atomic โ lands everywhere in one move | Needs versioned, backward-compatible contracts |
| Drift / version skew | Prevented by batch promotion | Version skew is normal โ a running matrix |
| Failure blast radius | A failed feature can hold the batch | Isolated to the one service |
| Coordination cost | High โ whole team, synced window | Low โ per-team autonomy |
| Best for | Small platform team, coupled services | Decoupled services, separate teams |
| Aspect | Feature Flags | Feature Branch + STAGE |
|---|---|---|
| Isolation | Runtime flag โ code merged, hidden | Separate branch + dedicated STAGE env |
| Integration testing | Continuous (early) | Late (at merge time) |
| Main risk | Flag misconfiguration | Merge conflicts / divergence |
| Multiple long features | Easy โ separate flags | Hard โ separate branches |
| Extra infrastructure | Flag service | STAGE environment |
| Best for | UI features, gradual rollouts | Architectural / breaking changes |
Monorepo โ Batch Release when a small platform team operates tightly-coupled services and you want atomic, drift-free changes. The coordination of a synced release window is the price of that atomicity.
Polyrepo โ Independent Release when services are decoupled and owned by separate teams, and per-service flow matters more than one atomic change. The backward-compatibility / version-matrix burden is the price of that autonomy.
Default to Feature Flags โ continuous integration, no branch divergence, gradual rollout. This is the right tool for most long features.
Use Feature Branch + STAGE only for architectural or breaking changes that can't be hidden behind a flag (database schema, API contracts). Limit to one feature branch at a time.