The collapse: one pipeline, parameterized
With tiers as flag config, the pipeline simplifies structurally, not cosmetically. CI builds main once, then produces per-tier artifacts by setting PRODUCT_TIER and reading the committed tiers.json — no duplicate compile-and-test of a second line.
Tests run against the superset build, plus a thin smoke suite per tier that asserts flag wiring (saas shows the pro dashboard, open-source doesn't). Releases tag one commit: 'what went out to each edition' is the tag plus that edition's config block, auditable in the diff.
On-call triage starts from one codebase. A bug is either in shared code — where the fix lands everywhere — or in a flag value, where the fix is a config change.
What the tier·dev layer adds
You can hand-maintain tiers.json — early teams do. What tier·dev adds is the bookkeeping that hand-maintenance loses at around ten flags: a matrix view of every flag across every tier, descriptions so flags stay legible, normalization so names stay consistent, and regenerated JSON/YAML/code snippets so the committed config never drifts from the source of truth.
Because the output is a plain committed file, adopting tier·dev adds zero runtime dependencies and removing it is a non-event — the last generated config keeps working forever. DevOps overhead should only ever go down.
frequently asked
- We already pay for a CI farm — is duplicate building really expensive?
- The compute is the cheap part. The expensive parts are the second review, the second failure mode, and the human sync step. Those don't show on the CI bill, but they show in cycle time.
- Does this work with Docker-based releases?
- Cleanly — build one image and bake the tier config in at build time, or mount it at deploy time. Either way the Dockerfile stops needing per-edition variants.
- What's the migration path from an existing enterprise branch?
- Merge the branch back behind flags one feature at a time: pick a divergent feature, wrap it in a flag, port it to main, delete it from the branch. Teams typically retire the branch in a few sprints without a feature freeze.
Published June 9, 2026 · Last updated June 16, 2026