<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/goevojmnj" -->

---
title: dif.sh — feature flags and A | daily.dev
description: dif.sh stores feature flags and A/B tests as Markdown files inside a repo instead of a separate SaaS dashboard. Each flag, experiment, holdout, or staged...
canonical: https://daily.dev/posts/goevojmnj
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: dif.sh — feature flags and A | daily.dev
og:description: dif.sh stores feature flags and A/B tests as Markdown files inside a repo instead of a separate SaaS dashboard. Each flag, experiment, holdout, or staged...
og:url: https://daily.dev/posts/goevojmnj
og:image: https://api.daily.dev/og/posts/GoEvoJMNJ.png
og:image:alt: Post cover image
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.

# dif.sh — feature flags and A

**[Alexey Zerkalenkov](https://daily.dev/sources/tzhsbevyajhcmr0fmoxfj)** · [@alexeyzerkalenkov](https://daily.dev/alexeyzerkalenkov) · 0 upvotes · 0 comments

## Summary

dif.sh stores feature flags and A/B tests as Markdown files inside a repo instead of a separate SaaS dashboard. Each flag, experiment, holdout, or staged rollout is one .md file with frontmatter, versioned in git and reviewed via PR. A CLI (dif init, new, check, build, conclude) generates a typed client, resolves exclusion conflicts at build time so clashing experiments fail CI rather than production, and regenerates a context.json that coding agents read on session start. Audience targeting is declared by attribute (country, plan, returning_visitor) without committing customer data. Concluded experiments are archived with a decision block and a one-line entry in a per-surface learning log, so future tests start informed. An optional hosted layer, Dif Cloud, adds a live dashboard with confidence intervals and drafts ship/hold verdicts as PRs, while git remains the source of truth.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://www.dif.sh/>

## Similar posts on daily.dev

- [Roll it out, roll it back, never redeploy](https://daily.dev/posts/roll-it-out-roll-it-back-never-redeploy-y5tgv5tlh) · Railway Blog · 1 upvotes · 0 comments
- [Announcing dh, the DoltHub CLI](https://daily.dev/posts/announcing-dh-the-dolthub-cli-pypgth2c3) · DoltHub Blog · 0 upvotes · 0 comments
- [The developer as conductor: Leading an orchestra of AI agents with the feature flag baton](https://daily.dev/posts/the-developer-as-conductor-leading-an-orchestra-of-ai-agents-with-the-feature-flag-baton-go0wtqws0) · The New Stack · 1 upvotes · 0 comments
- [Automating the Experimentation Lifecycle with Kiro, AWS DevOps Agent, and LaunchDarkly](https://daily.dev/posts/automating-the-experimentation-lifecycle-with-kiro-aws-devops-agent-and-launchdarkly-4fc0oy96v) · AWS · 0 upvotes · 0 comments

---

Tags: [#devtools](https://daily.dev/tags/devtools), [#cicd](https://daily.dev/tags/cicd), [#git](https://daily.dev/tags/git), [#ab-testing](https://daily.dev/tags/ab-testing)

[View this post on daily.dev](https://daily.dev/posts/goevojmnj)

```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":"DiscussionForumPosting","mainEntityOfPage":"https://daily.dev/posts/goevojmnj","headline":"dif.sh — feature flags and A","text":"Shared: dif.sh — feature flags and A","url":"https://daily.dev/posts/goevojmnj","datePublished":"2026-09-08T05:36:44.261Z","dateModified":"2026-09-08T05:37:49.977Z","author":{"@type":"Person","name":"Alexey Zerkalenkov","url":"https://daily.dev/alexeyzerkalenkov","image":"https://lh3.googleusercontent.com/a/ACg8ocKQBwPwaHC4XrPy0rniDybogCxlwDp7QCLkbwsqNRQSFhqDIlIf=s96-c","description":"Fullstack AI Engineer","interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"EndorseAction"},"userInteractionCount":9460}},"image":"https://media.daily.dev/image/upload/s--qPvKM23u--/f_auto/v1722860399/public/Placeholder%2009","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"sharedContent":{"@type":"WebPage","url":"https://api.daily.dev/r/bIhmeOykw"},"isPartOf":{"@type":"WebPage","url":"https://daily.dev/sources/tzhsbevyajhcmr0fmoxfj","name":"Alexey Zerkalenkov"}}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Alexey Zerkalenkov","item":"https://daily.dev/sources/tzhsbevyajhcmr0fmoxfj"},{"@type":"ListItem","position":3,"name":"dif.sh — feature flags and A"}]}
```

