Feature flags as a service. Code checks a flag, and the dashboard decides who sees the feature: a percentage of users, a named segment, one customer. It also carries experiments, gradual rollouts and an audit trail of who changed what.
Build me feature flags that replace LaunchDarkly — and know what makes this ALMOST. Flags in a file are trivial. What is not is **staying correct and fast when your own flag service is unreachable**, and **a kill switch that takes effect in seconds rather than at the next poll**. Those two properties are what let a team put a flag in a hot path and trust it. Get them right and this is genuinely yours; get them wrong and you have added a single point of failure to every request. STACK - Node 20+ with Fastify for the control plane - SQLite through better-sqlite3, WAL mode - A small SDK per language you use, evaluating locally - Caddy in front THE DATA MODEL - flags: id, key, kind, description, default_value, variations_json, is_active, is_permanent, created_at, archived_at - environments: id, name, key — development, staging, production, each with its own rules - rules: id, flag_id, environment_id, position, condition_json, variation, rollout_json — evaluated in order, first match wins - segments: id, key, condition_json — a named audience reused across flags - targets: flag_id, environment_id, unit_id, variation — individual overrides, which is how you turn something on for one customer - audit: id, actor_id, flag_id, environment_id, before_json, after_json, at — append-only. A flag change is a production change and deserves the same record as a deploy - evaluations: sampled counts per flag per variation, not one row per evaluation FAILING SAFE, WHICH IS THE FIRST HARD PART - The SDK holds the whole rule set in memory and evaluates locally. No network call in the request path, ever - On start it loads from a local cache file first, then updates from the service. If the service is down at boot, the application still starts with the last known rules - If the service is unreachable, evaluation continues with what it has, indefinitely, and reports staleness rather than falling back to defaults. Falling back to defaults during an outage is how a flag service takes your application down with it - A hard-coded default in the calling code as the last resort, for the case where a flag is genuinely unknown - The rule set contains no personal data — it is conditions over attributes, and the attributes stay on your side FAST UPDATES, THE SECOND - Server-sent events push the updated rule set to every connected SDK. One connection, no protocol to write, and it reconnects itself - A poll on a slow interval as a fallback, so a proxy that eats event streams degrades to seconds-to-minutes rather than to nothing - The payload is the whole rule set, small and versioned, with an ETag. Sending diffs is a premature optimisation that makes recovery harder - Measure the time from clicking off to the last server evaluating off. That number is what a kill switch is worth, and it should be single-digit seconds EVALUATION - Deterministic bucketing: hash the unit key with the flag key and a salt. The same user always gets the same variation, on the server, in the browser, everywhere, with no coordination - Percentage rollouts that are stable when the percentage changes — a user in the first ten per cent stays in when it becomes twenty - Conditions over attributes you pass in: plan, country, version, anything. Evaluated by the SDK from the rules, never by asking the service - Prerequisites, so a flag can depend on another, with cycle detection at save time DISCIPLINE, WHICH DECIDES WHETHER THIS HELPS - Every flag has an owner and an intended lifetime. Temporary flags are the point; a codebase with four hundred permanent ones is a codebase nobody can reason about - A report of stale flags — unchanged for months, or fully rolled out — and a nudge to remove them - A code search integration listing where each flag is referenced, so removal is a small task rather than an archaeology exercise OPERATIONS - .env: DATABASE_PATH, BASE_URL, SESSION_SECRET, SDK_KEY_SALT - Migrations on boot, each once; nightly backup off the machine - The control plane should be independent of the applications it serves — if they share a database, they share an outage - Health endpoint reporting connected SDKs and the newest rule version WHAT MATTERS MOST Local evaluation with a cached rule set, and the kill switch latency. Turn the flag service off entirely and confirm every application keeps serving correctly; that test is the whole point.
What you lose
- Flag evaluation that stays correct and fast when your own flag service is unreachable
- Streaming updates, so a kill switch takes effect in seconds rather than at the next poll
- Percentage rollouts with sticky bucketing that survives a user changing device
- Audit trails and approval workflows that a regulated team actually needs
- Maintained SDKs across every language and platform you ship on
If you would rather not build
- GrowthBook — flags plus experimentation
The escape hatch
open source · no votes, no paid placement
Unleash
$0Feature flag server with gradual rollouts, segments and SDKs for most languages.
Unleash/unleashfree · open source
Flagsmith
$0Feature flags and remote config with per-environment values.
Flagsmith/flagsmithfree · open source
Why this verdict
our own opinion · changed only by a person
46/100
Verdict kinda at 46: a flag table with percentage rollouts is a day of work, and for one team on one stack that is often enough. What you are really buying from LaunchDarkly is the guarantee that flag evaluation never becomes your outage, plus SDKs everywhere.
History
tracked since 6 Aug 2026 · nothing is ever overwritten
Questions about LaunchDarkly
answered from the record above
Is LaunchDarkly free?
No headline monthly price: Foundation is pay-as-you-go at $10 per service connection per month plus $8.33 per 1,000 client-side monthly active users.
Can you replace LaunchDarkly by building your own?
ALMOST. A weekend of work, and real gaps remain. Replacement score 46 out of 100, build time a weekend. Read what you lose before you decide.
How much does LaunchDarkly cost?
LaunchDarkly has no public headline price. The tier we track is Foundation.
What do you lose by replacing LaunchDarkly?
Flag evaluation that stays correct and fast when your own flag service is unreachable; Streaming updates, so a kill switch takes effect in seconds rather than at the next poll; Percentage rollouts with sticky bucketing that survives a user changing device; Audit trails and approval workflows that a regulated team actually needs; Maintained SDKs across every language and platform you ship on. If any of those carry weight for you, keep paying.
Is there an open-source alternative to LaunchDarkly?
Yes: Unleash, Flagsmith. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

