It's 4:40 on a Friday afternoon and you're standing in a client's server room that is also, confusingly, a supply closet. The new inventory screen works. Mostly. The edge case with duplicate SKUs is held together with an if statement and optimism, and on Monday morning forty warehouse workers will meet it for the first time. You have two options: don't deploy, or deploy with the risky part turned off.
This is where feature flags earn their rent. In rapid deployment work, the fear is never writing the code; it's being responsible for the code while the client watches. Merge the ugly-but-working version, wrap the sketchy corner in a flag, ship it, go home. On Monday you flip the flag for one friendly supervisor, watch her break it twice, fix it, and open it to the floor by Wednesday. Nobody outside engineering ever knew there was a sketchy corner.
Feature flags separate deploying code from releasing features, and that separation is the engine behind feature flags rapid deployment workflows at client sites. You deploy constantly because deployment is boring, and you release deliberately because releases are business events. For an FDE shipping in front of the client with no staging environment to hide in, flags are less a technique than a license to move fast without getting fired.
What feature flags actually are
Strip away the vendor marketing and a feature flag is an if statement that reads its answer from somewhere you can change without redeploying. if (flags.newPickFlow) decides whether a user sees the old screen or the new one. That somewhere might be an environment variable, a row in Postgres, a JSON file on a shared drive, or a hosted service with a dashboard and audit logs.
That's the entire concept. Everything else, the targeting rules, the percentage rollouts, the shiny dashboards, is garnish. Useful garnish, sometimes, but garnish. Teams regularly burn three weeks evaluating flag platforms when an env var and a restart script would have covered their actual needs. Don't be that team.
Why flags are an FDE's seatbelt
Consultants get to demo from a laptop and leave. You're embedded, which means your code runs on their infrastructure, against their data, in front of their people, usually with no staging environment because the client has three servers and one of them is a mystery box nobody has logged into since 2019.
Flags change the risk math completely. Small daily merges mean small diffs, and small diffs mean when something breaks you know roughly which forty lines did it. A bad release isn't a git revert and an apology email; it's toggling a value and buying yourself an hour to fix things properly. This pairs naturally with building demos that become the product, since the demo can live behind a flag in the real system from day one instead of dying in a slide deck. It's also what makes trunk-based development survivable onsite: everyone merges to main daily, and the flags, not long-lived branches, decide what's visible. When something does go wrong, the flag doubles as a kill switch for the deployment, which beats explaining a revert to a plant manager at shift change.
It also fits the rhythm of a rapid prototyping engagement: ship the risky 20 percent dark, keep the safe 80 percent visible, and let the client's real usage tell you where to spend tomorrow.
The FDE flag stack: three tiers
You don't need a platform on day one. You need the tier that matches your blast radius.
Tier one: environment variables
One flag, one deploy script, zero dependencies. Perfect for the first two weeks of an engagement when you have exactly one thing you're nervous about. The cost is that flipping requires a restart, which on some client infra means a maintenance window and a phone call.
Tier two: a config file or database row
This is the sweet spot for most engagements. A flags table or a JSON file the app polls every thirty seconds gives you instant flips, an audit trail if you log changes, and per-user targeting with a join. A typical mid-size engagement runs five to fifteen flags at any time, and a boring config table handles all of them without breaking a sweat.
Tier three: a hosted flag service
Graduate here when you need percentage rollouts, targeting by plan or geography, or non-engineers flipping flags through a UI with an audit log. The moment your client's ops manager wants to control a rollout herself, a dashboard beats SSH access to a config file. Every single time.
Flag hygiene rules that save you
Flags fail quietly and then all at once, usually because nobody owned them. A few rules keep the system honest:
- Name for the obituary.
inventory_new_pick_flowtells you what it gates.flag_7tells you nothing at 2 a.m. - Every flag gets an expiry date. Thirty to sixty days is plenty. Put it in a comment or a tracking ticket the day you create it.
- One owner per flag. The person who flips it is the person who deletes it. Shared ownership is no ownership.
- Default dangerous things to off. Anything that writes, deletes, emails, or charges money starts dark and earns its way to on.
- Log flag state with errors. When a bug report arrives, "which flags were on" should be a lookup, not an interrogation.
A week onsite with flags
Say you're three weeks into a distribution client, rebuilding their pick-and-pack screen while the old one keeps running. Monday: deploy the new screen behind a flag, visible only to you. Tuesday: flip it on for Maria, the shift lead who gives honest feedback, and she finds two bugs in twenty minutes because of course she does. Wednesday: fix both, redeploy, flip on for her whole shift. Thursday: one more deploy, a timeout issue that only appears with their actual 40,000-row inventory table. Friday: all three shifts are on the new screen, and the old one is still sitting behind the flag like a fire extinguisher.
That's nine deploys in five days, two of which would have been rollbacks-by-revert without flags. Instead they were config flips measured in seconds, and the client's takeaway was "things kept getting better all week" rather than "engineering broke Tuesday." Tight onsite feedback loops only work when reacting to feedback is cheap, and flags are what make it cheap.
When flags bite back
Flags have a failure mode, and it's called flag debt. Every flag doubles a code path. Ten active flags mean your app is really ten slightly different apps wearing a trench coat, and your test coverage is lying to you about all of them.
A feature flag is a loan against future cleanup. Take the loan happily; just write the repayment date on it.
The fix is a quarterly purge: list every flag, delete the ones fully rolled out, and scream internally at the ones nobody remembers creating. If a flag has been on for everyone for a month, the flag is done. Delete the if statement, keep the feature, move on.
Back in that supply-closet server room, the Friday deploy goes out at 5:05 with the risky corner dark. Monday it lights up for one supervisor. Wednesday, the floor. The duplicate-SKU edge case gets fixed Tuesday over coffee, before it ever mattered. That's not heroics. That's just what shipping looks like when deploy and release stopped being the same word.