← All comparisons

dif vs Featurevisor

Checked Oct 7, 2026

Featurevisor and dif agree on the main point: flags are files in a git repository, changed by pull request, with no app to click in. They differ on delivery. Featurevisor builds static JSON datafiles in CI, you upload them to a CDN or server you run, and your app fetches the datafile and hands it to the SDK, so a merged change can reach a running app without redeploying it. dif compiles the active files into the app itself with dif build, so a change ships with the next deploy and there is no datafile to host. Featurevisor covers more languages, typed variables and environments. dif keeps the experiment record (hypothesis, owner, metrics, decision) in the file and has an optional hosted product for results.

Side by side

RowdifFeaturevisor
Where flags liveOne Markdown file per flag or experiment under dif/experiments/, in your git repo.YAML files in a git repository: features/, segments/ and attributes/, with test specs in tests/. [2]
How a change shipsEdit the file, merge the pull request, run dif build, deploy the app. There is no runtime toggle.Merge, build static JSON datafiles, upload them to a CDN or your own server. The app fetches the datafile; calling setDatafile() again updates a running app without a redeploy. [1][3]
Runtime dependencyNone. dif build compiles the active files into dif/generated/client.ts and @dif.sh/sdk hashes the user ID with SHA-256 in-process. No request to evaluate a flag.A datafile you host. Your app fetches the JSON and passes it to the SDK, which then evaluates against it. Fetching and refreshing are your code. [3][5]
SDK languagesJavaScript and TypeScript only. Adapters for React, Svelte, the Vercel Flags SDK and an OpenFeature server provider.JavaScript, Go, Python, PHP, Ruby, Java, Kotlin, Swift, Rust and Elixir, plus React, React Native, Vue and Next.js guides and OpenFeature providers. [1]
Experiment analysisNot in the open-source core. Exposures and dif.track() calls go to two handler functions you own, or to Dif Cloud, which reports lift with a 95% confidence interval.None built in. The docs say it is not an analytics platform; you send activation events to your own analytics tool. [4][5]
Pricing modelThe CLI and SDK are free. Dif Cloud is optional: $50 per month per workspace with 1,000,000 events and unlimited seats, then $0.02 per 1,000 events. Cloud has no free tier.Free. The FAQ lists no paid plan. You pay for your own CI and datafile hosting. [6][5]
LicenceMIT for the CLI, the SDK and every adapter.MIT. [1][6]
Self-hostingNothing to host. There is no flag server; the flags run from your repo and your build. Dif Cloud is a hosted product.Self-run by design. You own the repository, the CI checks, the hosting and the caching. A read-only status site can be generated from the repo. [5][6]
Agent and context supportdif init writes guidance into CLAUDE.md, AGENTS.md, .cursor/rules/dif.mdc and .github/copilot-instructions.md and installs four skills. dif build writes dif/context.json, a summary of active experiments. Dif Cloud serves experiment verdicts to agents over a read-only MCP server at cloud.dif.sh/mcp.A /featurevisor skill installs with npx skills add featurevisor/featurevisor for Claude Code, Codex, Cursor and OpenCode. The docs publish llms.txt feeds. [9][10]
Flag valuesString variant ids only. No typed values, no JSON payloads, no remote config.Variations plus typed variables: boolean, string, integer, double, array, object and JSON. [3][4]
EnvironmentsNone. The schema has no environment field.Datafiles are built per environment, for example staging and production, from rules in one feature file. [2]
Typed clientdif build writes dif/generated/client.ts on every build, from the files in the repo.npx featurevisor generate-code --language typescript writes typed isEnabled, getVariation and getVariable functions. TypeScript is the only target. [7]
Checks before mergedif validate exits 1 on errors E001 to E010, including E007 when two active experiments share a surface without a shared exclusion_group.npx featurevisor lint exits non-zero on invalid definitions. Test specs live in tests/. Groups keep a user out of overlapping experiments. [8][2][4]

The dif column is checked against the dif repository at v0.7.0. The Featurevisor column comes from the pages listed under Sources. If a row is out of date, open an issue.

Which one to choose

Choose Featurevisor if

  • You want git-based flags and you also want a merged change to reach a running app without redeploying it. Featurevisor does that by refreshing the datafile. dif cannot.
  • Your services are not all JavaScript. Featurevisor has SDKs for Go, Python, PHP, Ruby, Java, Kotlin, Swift, Rust and Elixir.
  • You need typed variables or remote config values on a flag. dif variants are string ids.
  • You need per-environment rules such as staging and production in one definition. dif has no environment field.
  • You already run an analytics tool and a CDN, and want nothing hosted by a vendor at any tier.

Choose dif if

  • You do not want to build, upload and cache datafiles. dif build writes dif/generated/client.ts into the app, so the flag and the code that reads it ship in the same deploy.
  • You want flag evaluation with no fetch at startup. @dif.sh/sdk reads the compiled client and hashes the user ID.
  • You run experiments and want the hypothesis, owner, primary metric and guardrails in the file, and dif conclude to write the decision and append a learning to the surface.
  • You want the next draft to start from past results. dif new reads the prior learnings from dif/surfaces/<name>.md.
  • You want a collision to be a build error. Two active experiments on one surface without a shared exclusion_group fail dif validate with E007.
  • You want hosted results without building them. Dif Cloud is optional and paid; Featurevisor has no equivalent.

Moving from Featurevisor to dif

dif has no Featurevisor importer. Both tools keep definitions as text in git, so a move is a file-by-file rewrite you can review in one pull request.

  1. For each file in features/, run dif new <id> --surface <name>. Copy each variation and its weight into variants. Weights must sum to 100. Set status: active.
  2. Declare the attributes you target in dif/config.yaml, with a resolver at dif/audiences/<name>.ts for each. Rewrite segments as audience.include and audience.exclude. dif matches by equality or list membership only.
  3. Move variable values into code. dif has no variables; each variant id maps to one branch in dif("<id>", { ... }).
  4. Collapse per-environment rules into one definition. If staging and production must differ, that difference has to live in your app config.
  5. Put experiments from one Featurevisor group on the same surface with the same exclusion_group. Within a group dif picks by created date, it does not split traffic.
  6. Replace getVariation() calls with dif(). Run dif validate and dif build, add "prebuild": "dif build", then remove the datafile build and upload from CI.
$ npm install -g @dif.sh/cli

Sources

Every Featurevisor claim on this page comes from one of these pages. Pricing and features change; the date is when we read each one.

  1. featurevisor/featurevisor README read Oct 7, 2026
  2. Featurevisor docs: Projects read Oct 7, 2026
  3. Featurevisor docs: JavaScript SDK read Oct 7, 2026
  4. Featurevisor docs: Experiments read Oct 7, 2026
  5. Featurevisor docs: Alternatives read Oct 7, 2026
  6. Featurevisor docs: FAQ read Oct 7, 2026
  7. Featurevisor docs: Code generation read Oct 7, 2026
  8. Featurevisor docs: Linting read Oct 7, 2026
  9. Featurevisor docs: Skills for AI agents read Oct 7, 2026
  10. Featurevisor llms.txt read Oct 7, 2026