FeatureSignals

Migration IaC Export

Last updated: April 2026

Instead of importing flags directly into FeatureSignals, you can export them as Infrastructure as Code (IaC) — Terraform, Pulumi, or Crossplane configurations. This gives you GitOps-managed feature flags from day one, with version control, code review, and audit trail for every flag change.

Why IaC Export?

IaC export gives you GitOps-native flag management: every flag is a version-controlled resource. Changes go through PR review. Flag state is declarative and reproducible. If you're migrating from a platform where flags were managed via UI clicks, this is the upgrade you've been waiting for.

Supported IaC Formats

The FeatureSignals migration CLI can export flags to three IaC formats:

FormatBest ForProvider
Terraform (HCL)Teams already using Terraform for infrastructurefeaturesignals/featuresignals
Pulumi (TypeScript)Teams using Pulumi or preferring general-purpose languages@featuresignals/pulumi
Crossplane (YAML)Teams using Kubernetes-native GitOps (ArgoCD, Flux)provider-featuresignals

Terraform Export

Export your existing flags as Terraform HCL resources:

fs-migrate export iac \ --source unleash \ --source-config ./unleash-config.json \ --format terraform \ --output ./terraform/feature-flags/

This generates Terraform resources like:

resource "featuresignals_flag" "enable_dark_mode" { key = "enable-dark-mode" name = "Enable Dark Mode" type = "boolean" description = "Toggles the dark mode feature" project_id = featuresignals_project.main.id environment { key = "production" enabled = true rule { type = "percentage" rollout = { percentage = 50 stickiness = "user_id" } } } }

Pulumi Export

For Pulumi users, export flags as TypeScript resources:

fs-migrate export iac \ --source unleash \ --source-config ./unleash-config.json \ --format pulumi \ --output ./pulumi/flags/
import * as fs from "@featuresignals/pulumi"; const darkMode = new fs.Flag("enable-dark-mode", { key: "enable-dark-mode", name: "Enable Dark Mode", type: "boolean", projectId: project.id, environments: [{ key: "production", enabled: true, rules: [{ type: "percentage", rollout: { percentage: 50, stickiness: "user_id", }, }], }], });

Crossplane Export

For Kubernetes-native teams, export flags as Crossplane managed resources:

fs-migrate export iac \ --source unleash \ --source-config ./unleash-config.json \ --format crossplane \ --output ./crossplane/flags/
apiVersion: featuresignals.com/v1 kind: Flag metadata: name: enable-dark-mode namespace: production spec: key: enable-dark-mode name: "Enable Dark Mode" type: boolean projectId: main environments: - key: production enabled: true rules: - type: percentage rollout: percentage: 50 stickiness: user_id

IaC-Powered Flag Management Workflow

Once your flags are in IaC, here's the new workflow:

  1. Edit: Modify the Terraform/Pulumi/Crossplane configuration in your editor
  2. Review: Open a PR — your team reviews the flag change before it goes live
  3. Plan: CI runs terraform plan / pulumi preview to show what will change
  4. Apply: Merge the PR — CI applies the change automatically
  5. Verify: The Flag Engine dashboard reflects the change within seconds

Best Practice: Use IaC from Day One

Even if you start with UI-based flag management, consider IaC export as your target state. IaC-managed flags are auditable, reproducible, and eliminate configuration drift between environments.

IaC State Management

FeatureSignals supports two modes of IaC state management:

ModeDescriptionImport Behavior
IaC-onlyFlags are managed exclusively through IaC. UI changes are read-only.Flags are created with IaC as the source of truth
HybridFlags can be managed through IaC or UI. IaC imports existing flags.terraform import links existing flags to IaC resources
UI-firstFlags are managed through UI. IaC is used only for initial seeding.One-time import; subsequent changes via UI

Next Steps