<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/roll-it-out-roll-it-back-never-redeploy-y5tgv5tlh" -->

---
title: Roll it out, roll it back, never redeploy | daily.dev
description: Railway has launched built-in feature flags for every project, eliminating the need for third-party services like LaunchDarkly. Flags support boolean, string,...
canonical: https://daily.dev/posts/roll-it-out-roll-it-back-never-redeploy-y5tgv5tlh
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Roll it out, roll it back, never redeploy | daily.dev
og:description: Railway has launched built-in feature flags for every project, eliminating the need for third-party services like LaunchDarkly. Flags support boolean, string,...
og:url: https://daily.dev/posts/roll-it-out-roll-it-back-never-redeploy-y5tgv5tlh
og:image: https://api.daily.dev/og/posts/y5tgv5Tlh.png
og:image:alt: Roll it out, roll it back, never redeploy
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Roll it out, roll it back, never redeploy

**[Railway Blog](https://daily.dev/sources/railway-blog)** · 8 min read · 1 upvotes · 0 comments

## Summary

Railway has launched built-in feature flags for every project, eliminating the need for third-party services like LaunchDarkly. Flags support boolean, string, number, and JSON types with targeting rules based on user attributes and percentage rollouts. The SDK evaluates flags in-memory after a single init call, making reads as cheap as function calls. A unique conflict resolution model returns the flag's default value whenever rules disagree, ensuring production always wins. Flags are accessible via the dashboard, CLI, TypeScript SDK, and MCP server, allowing AI agents to drive rollouts end-to-end from natural language prompts.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://blog.railway.com/p/feature-flags>

## Questions this post answers

### How does Railway resolve conflicting feature flag rules when multiple rules match the same user?

Railway evaluates every matching rule at read time rather than using priorities. When matching rules agree, that value is served; when they disagree or nothing matches, the flag's configured default value is served instead. This avoids the debugging problems of priority-based systems where whichever rule was written last silently wins.

_daily.dev surfaces engineering writeups like this for developers weighing feature-flag strategies before shipping a rollout._

### How do I do a percentage-based feature flag rollout with Railway's CLI?

Use the railway flag set command with a rule based on the bucket() function, for example railway flag set checkout-v2 true --rule-id rollout-25 --when 'bucket(key) < 0.25', which spreads users evenly across a 0 to 1 range keyed on a user identifier passed in context. Raising the threshold later keeps existing users in the rollout while adding new ones, so nobody flips back and forth.

_developers rolling out risky changes gradually can find practical guides like this via daily.dev._

### Does reading a Railway feature flag value make a network call at runtime?

No, reads never make a network call. The SDK's init() function fetches the project's rulesets once at startup, and every subsequent read evaluates against an in-memory copy kept fresh in the background, making a flag read cost about as much as a plain function call.

_daily.dev helps developers track performance details like this when adopting feature-flag tooling._

## Similar posts on daily.dev

- [Automate progressive rollouts with Vercel Flags](https://daily.dev/posts/automate-progressive-rollouts-with-vercel-flags-bcllj0obj) · Vercel · 15 upvotes · 1 comments
- [How to Implement Feature Flags for Safe and Gradual Rollouts](https://daily.dev/posts/how-to-implement-feature-flags-for-safe-and-gradual-rollouts-6vw4b4ldf) · freeCodeCamp · 0 upvotes · 0 comments
- [How to Deploy 10 Times a Day Safely with Feature Flags](https://daily.dev/posts/how-to-deploy-10-times-a-day-safely-with-feature-flags-kxushzxjh) · CodeCraft Diary · 2 upvotes · 0 comments
- [Feature Flag Orchestration with AWS DevOps Agent and LaunchDarkly](https://daily.dev/posts/feature-flag-orchestration-with-aws-devops-agent-and-launchdarkly-noyegmfha) · AWS · 0 upvotes · 0 comments
- [Introducing Flagship: feature flags built for the age of AI](https://daily.dev/posts/introducing-flagship-feature-flags-built-for-the-age-of-ai-ihzhvesel) · Cloudflare · 18 upvotes · 1 comments

---

Tags: [#typescript](https://daily.dev/tags/typescript), [#cicd](https://daily.dev/tags/cicd), [#mcp](https://daily.dev/tags/mcp)

[View this post on daily.dev](https://daily.dev/posts/roll-it-out-roll-it-back-never-redeploy-y5tgv5tlh)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Roll it out, roll it back, never redeploy","url":"https://daily.dev/posts/roll-it-out-roll-it-back-never-redeploy-y5tgv5tlh","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/roll-it-out-roll-it-back-never-redeploy-y5tgv5tlh"},"datePublished":"2026-07-16T18:17:36.640Z","dateModified":"2026-09-13T18:39:44.601Z","description":"Railway has launched built-in feature flags for every project, eliminating the need for third-party services like LaunchDarkly. Flags support boolean, string,...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/201a5bce882b30bc28eac2a4acbcd9ba?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/201a5bce882b30bc28eac2a4acbcd9ba?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Railway Blog","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Railway Blog","logo":"https://media.daily.dev/image/upload/logos/placeholder.jpg","url":"https://daily.dev/sources/railway-blog"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/roll-it-out-roll-it-back-never-redeploy-y5tgv5tlh","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"typescript,cicd,mcp","timeRequired":"PT8M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Railway Blog","item":"https://daily.dev/sources/railway-blog"},{"@type":"ListItem","position":3,"name":"Roll it out, roll it back, never redeploy"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/roll-it-out-roll-it-back-never-redeploy-y5tgv5tlh#faq","mainEntity":[{"@type":"Question","name":"How does Railway resolve conflicting feature flag rules when multiple rules match the same user?","acceptedAnswer":{"@type":"Answer","text":"Railway evaluates every matching rule at read time rather than using priorities. When matching rules agree, that value is served; when they disagree or nothing matches, the flag's configured default value is served instead. This avoids the debugging problems of priority-based systems where whichever rule was written last silently wins. daily.dev surfaces engineering writeups like this for developers weighing feature-flag strategies before shipping a rollout."}},{"@type":"Question","name":"How do I do a percentage-based feature flag rollout with Railway's CLI?","acceptedAnswer":{"@type":"Answer","text":"Use the railway flag set command with a rule based on the bucket() function, for example railway flag set checkout-v2 true --rule-id rollout-25 --when 'bucket(key) < 0.25', which spreads users evenly across a 0 to 1 range keyed on a user identifier passed in context. Raising the threshold later keeps existing users in the rollout while adding new ones, so nobody flips back and forth. developers rolling out risky changes gradually can find practical guides like this via daily.dev."}},{"@type":"Question","name":"Does reading a Railway feature flag value make a network call at runtime?","acceptedAnswer":{"@type":"Answer","text":"No, reads never make a network call. The SDK's init() function fetches the project's rulesets once at startup, and every subsequent read evaluates against an in-memory copy kept fresh in the background, making a flag read cost about as much as a plain function call. daily.dev helps developers track performance details like this when adopting feature-flag tooling."}}]}
```

