Skip to main content

Your PaaS Now Owns Your If-Statements: Railway's Feature Flags vs Self-Hosted Unleash and Flagsmith

10 min readDora NodaDora Noda
Share
On this page

On July 10, 2026, Railway's changelog led with three shipping items: native feature flags, a Railway Agent living in Slack and Discord, and usage limits in the CLI. The flags are the one that matters most — not because feature flags are new, but because of what your application now depends on at runtime. Every if statement you gate behind a Railway flag is a code path that resolves against state living on somebody else's control plane.

This post is a build-vs-bundle decision, not a feature review. If you ship on Railway, should you adopt its bundled flags, run open-source Unleash or Flagsmith next to your own platform, or pay for flag SaaS? Here is the verdict up front, with the numbers and the lock-in test below.

OptionMarginal costYou pick it when…
Railway bundled flags$0 on top of your Railway billOne project, rollouts tied to deploys, Railway-only apps
Self-hosted Flagsmith / Unleash / FliptOne container or compose stack + Postgres you already run, plus upgrade/backup laborYou self-host, need flags outside one PaaS, or answer to compliance
Flag SaaS (LaunchDarkly, Unleash Cloud, Flagsmith Cloud)~$40–250/mo at small scale, usage meters above thatYou want approvals, audit trails, and experimentation without operating the box

What Railway actually shipped​

The week-one details come from Railway's own launch post (July 17, 2026, Victor Ramirez & Mahmoud Abdelwahab), and the design is more thought-through than a checkbox feature. Flags are typed — bool, string, number, or json — each with a default value plus optional targeting rules. They live under Settings → Feature Flags and are readable from the dashboard, the CLI, the SDK, and MCP, so an agent drives the same flags you do.

Creating a flag is one command, with no separate create step — set infers the type:

bash
railway flag set checkout-v2 false

Reads go through a local SDK. You call flags.init() once at startup, and from then on every read evaluates against an in-memory copy of the ruleset that the SDK keeps fresh in the background. Railway's own framing is that flags behave "like environment variables that update without a redeploy," and the performance claim follows from the architecture: a read costs about as much as a function call, so gating a hot path is free.

Targeting rules read like spoken conditions — plan == "pro" — and percentage rollouts use sticky bucketing: bucket(key) < 0.25 puts a stable quarter of users (by whatever key you pass, typically user ID) into the new path, so raising 10% to 25% only adds users and never flips anyone back. Rules combine with && and ||, and an evaluate variant returns the value plus a reason (SPLIT for percentage rollouts) and a per-rule trace, which answers "why does this user see this value" exactly.

The most opinionated choice is conflict resolution: there are no rule priorities. Every matching rule is evaluated, agreement wins, and any disagreement — or no match at all — falls back to the flag's default. A rollout rule missing its key serves the default rather than a random assignment, and if your app cannot reach Railway at all, the fallback you wrote in code applies. The worst case of any conflict, outage, or typo is plain old production.

What is missing relative to a full flag platform is also worth inventorying, because it defines the ceiling. This first version resolves literal values only, with no approvals workflow, no audit log of who changed what, and no experimentation or metrics attachment. If your compliance story needs "show me who flipped this flag and when," bundled flags do not have it. That gap is exactly where the self-host and SaaS options start earning their keep.

The bundling pattern, and why flags are stickier than cron​

Railway absorbing flags continues a pattern every PaaS follows once deploy-from-git stops differentiating: cron jobs, metrics and logs, managed Postgres and Redis, preview environments, and now an agent surface all graduated from third-party add-ons to platform primitives. Render, Fly.io, and Vercel have each made the same march. The vendor logic is straightforward — each absorbed primitive removes a signup, a bill, and an integration from the getting-started path.

But primitives are not equally sticky, and the axis that matters is when your app touches them. Cron, preview environments, and usage limits are deploy-time or control-plane concerns: if you migrate off, you rewire configuration. Feature flags are a runtime dependency. Your application code calls into the flag system on the request path, potentially on every request, which means the flag vendor's SDK, evaluation semantics, and availability posture are compiled into your app's behavior — not just its deployment config.

That is the same reason the lock-in conversation around flags is sharper than around, say, bundled cron. Moving cron providers means rewriting schedules. Moving flag providers means touching every gated code path, re-implementing targeting semantics that never match 1:1 (sticky bucketing algorithms differ, rule languages differ), and exporting flag state through whatever API the old vendor offers — there is no standard dump format for "all flags plus rules plus rollout state." The migration cost scales with the number of if statements you wrote, which is precisely the number that grows fastest once flags are frictionless to add.

The lock-in test: enough vs trap​

So here is the two-column test. Bundled flags are enough when all of these hold: you run one project (or a few) on Railway, your flag usage is percentage rollouts and team-only gates tied to the deploy flow, every app reading flags lives on Railway, and nobody will ever ask for an audit trail. That describes most side projects and early-stage products honestly. The marginal price is zero, the SDK is one init() call, and the local-evaluation design means reads survive a Railway control-plane wobble — the September 30, 2026 domain-routing disruption, roughly five minutes of 404s on new connections, is a reminder that the thing you lose in an outage is the ability to flip a flag mid-incident, not the reads themselves.

It becomes a trap along three axes. First, multi-platform reads: the moment a second app outside Railway — a mobile backend on Fly.io, a worker on your own metal — needs the same flag, the bundled system stops being the obvious home. Second, governance: approvals, audit logs, and per-environment RBAC are enterprise-flag-platform features, and bolting them onto a bundled primitive means process discipline instead of tooling. Third, exit cost compounding: every flag you add is another code path coupled to one vendor's SDK and rule language, and the export story is "whatever the API gives you," reconstructed by hand.

A useful gut check: count your flag reads, not your flags. Ten flags each read in one place is a weekend migration. Ten flags read across forty call sites in five services is a project — and you will only discover which one you have when you try to leave.

The self-host math: Unleash vs Flagsmith (and Flipt)​

The open-source answer is to run the flag plane beside your apps, on hardware you already pay for. The three serious options differ mostly in deploy shape and edition caps.

Unleash (Apache 2.0, ~13,800 GitHub stars as of late August 2026) is one Node.js container plus a PostgreSQL database it requires for state — a docker compose up if you already run Postgres, which any self-hosted PaaS does. The catch is the edition split: the free self-hosted edition is capped at 1 project and 2 environments, with SSO, RBAC, and change requests reserved for paid tiers, and Unleash Cloud lists at $75 per seat per month. That cap fits a single team neatly and punishes a multi-tenant platform exactly where it hurts.

Flagsmith (BSD-3-Clause, ~6,500 stars, past $1M ARR back in July 2024, v2.4.0 shipped September 15, 2026) is a Docker Compose stack — API, frontend, Postgres — with remote-config key-values as its standout beyond booleans. Its SaaS ladder is flatter than Unleash's: Start-Up around $40–45/month covering a small team, Scale-Up around $250–300/month adding RBAC and audit for higher request volume. The self-hosted edition carries no project cap, which makes it the more natural fit for a platform serving many tenants' flags from one control plane.

Flipt deserves the honorable mention as the simplest thing that works: a single Go binary with evaluation built in, no mandatory Postgres, aimed at teams that want flags without adopting a second database-backed service. If your needs top out at booleans and gradual rollouts, Flipt's ops surface is roughly "keep one binary updated."

Now the labor lines, because containers are not free even when the license is. Budget for: Postgres backups and upgrades you already do (near-zero marginal if flags share the cluster, nonzero if they force your first HA Postgres); flag-server upgrades on vendor cadence, including SDK compatibility checks in each app; SSO/RBAC gaps in the free editions, which you pay for either in process or in the paid tier; and stale-flag hygiene — flag systems accumulate dead flags the way closets accumulate cables, and neither Unleash OSS nor Flagsmith will delete them for you. Against that, the SaaS alternative at small scale is roughly one dinner out per month for Flagsmith Start-Up or a rounding error in a LaunchDarkly Foundation bill — which is exactly why the honest self-host pitch is control and data residency, not savings.

What flag SaaS actually costs now​

One correction to conventional wisdom first: LaunchDarkly no longer does per-seat pricing at all — its pricing page says so explicitly. Current Foundation pricing is usage-based: about $10 per service connection per month plus $8.33 per 1,000 client-side monthly active users per month on annual billing, with a free Developer tier (1 project, 3 environments, a handful of service connections, 1,000 client-side MAU) and custom Enterprise above. Server-side evaluation is the cheap path; client-side MAU is the meter that bites if you evaluate flags in browsers at scale.

That reframes the SaaS comparison. A small server-rendered team fits LaunchDarkly's free tier or a tens-of-dollars Foundation bill; Unleash Cloud's $75/seat/month is the expensive seat-licensed outlier, aimed at enterprises buying governance rather than startups buying flags; Flagsmith's $40–250/month ladder is the budget SaaS pick with a self-host escape hatch on the same codebase. The general rule: SaaS wins when your team's time costs more than the meter, which at small scale is almost always — until compliance, data residency, or multi-tenant scale says otherwise.

Who picks what​

Three personas, three answers. The solo builder or small team shipping one Railway project takes the bundled flags and never looks back — zero marginal cost, agent-operable from day one, and the exit cost stays small while the codebase does. The self-hosting team or PaaS operator runs Flagsmith (multi-tenant, no project cap) or Unleash (single team, richer governance story) on its own metal, accepting upgrade-and-backup labor in exchange for flags that survive a vendor migration and data that never leaves the fleet. The regulated or experimenting org pays for SaaS — LaunchDarkly or Flagsmith Scale-Up — because approvals, audit trails, and experimentation are cheaper bought than built.

Whichever you pick, adopt the one hygiene rule that is vendor-independent: every flag gets an owner, a creation date, and a removal ticket filed the day it ships. Bundled, self-hosted, or SaaS — the failure mode is identical, a codebase full of if statements nobody dares to delete. The platforms differ in where the state lives; none of them will clean up after you.

Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own. Run your flag plane next to your apps instead of inside someone else's control plane: star the repo on GitHub or deploy your first app today.

Related articles

Run this on infrastructure you own

bex is the open-source, AI-native Render alternative — push a git repo and get a running HTTPS service on your own machines.

Get started with bex