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

# Overview

<Info>
  Release Control is available on the **Plus plan**. See [Billing &
  Plans](/admin/billing-and-plans) for details.
</Info>

Every non-trivial shopping experience eventually faces the same problem: a change that's safe in isolation breaks something upstream, and by the time you notice, the broken state is already live. **Releases** are how Frontic keeps that from happening.

A **release** is a snapshot of everything in your project at a single point in time — storage schemas, syncs, blocks, listings, pages, project settings — bundled together and shipped as one unit. Not only API versioning. The whole project config.

<Screenshot name="releases/release-control-hero" alt="Release Control on the project dashboard, showing develop state, preview slot, and available actions" view="cutout" width="480px" />

<Frame>
  <img src="https://mintcdn.com/frontic/hS7rYTW0C-o2HHTZ/images/releases/release-control-hero-light.png?fit=max&auto=format&n=hS7rYTW0C-o2HHTZ&q=85&s=dce52433edbc326bf78e16f642cedb0c" className="dark:hidden block mx-auto mt-5 mb-5" style={{ maxWidth: "480px" }} alt="Release Control on the project dashboard, showing develop state, preview slot, and available actions" width="918" height="802" data-path="images/releases/release-control-hero-light.png" />

  <img src="https://mintcdn.com/frontic/hS7rYTW0C-o2HHTZ/images/releases/release-control-hero-dark.png?fit=max&auto=format&n=hS7rYTW0C-o2HHTZ&q=85&s=ad54e1a2028d4255717ac8cf679d061c" className="hidden dark:block mx-auto mt-5 mb-5" style={{ maxWidth: "480px" }} alt="Release Control on the project dashboard, showing develop state, preview slot, and available actions" width="918" height="802" data-path="images/releases/release-control-hero-dark.png" />
</Frame>

## Version stages

Every Frontic project exposes three versions of itself at all times:

<CardGroup cols={3}>
  <Card title="develop" icon="wrench">
    The live state of your project. Every change you make in the Frontic
    app, through Buddy, in Studio, or via MCP lands here immediately.
    This is where builders work.
  </Card>

  <Card title="preview" icon="eye">
    A frozen snapshot of `develop` captured at a specific point in time.
    Use this to test the full project state end-to-end before it hits
    production.
  </Card>

  <Card title="public" icon="globe">
    What your shopping experience talks to. Your customers
    always see this version. Changes only reach `public` when you
    explicitly promote a preview.
  </Card>
</CardGroup>

The version stages aren't environments in the traditional sense — they're three **simultaneous views of the same project**, each pinned at a different version. You don't maintain parallel projects; you work in `develop`, freeze a `preview` when you're ready, and promote to `public` when you're satisfied.

## Drafts

<Note>
  Preview — drafts are in active development. Specifics may change before general availability.
</Note>

For changes that need more isolation than `develop` offers, Frontic is introducing **drafts**: short-lived sandboxes cloned from `develop` that let you prepare and review work without affecting the main project state. Each draft runs with its own version token and a sampled slice of your feed data, so you can iterate end-to-end without disturbing `develop` for the rest of the team. Multiple drafts can exist in parallel.

Changes in a draft merge back to `develop` through a review and approval workflow — a draft can't land on `develop` until a reviewer approves it, with conflict detection across schemas, sync mappings, and API surface as part of the review. Release Control runs from `develop` as usual, so an approved draft flows in first, then follows the normal preview → promote path.

The path forward: pairing drafts with [Studio jobs](/studio/frontic-studio) and with GitHub PRs, so an isolated sandbox, the frontend code that depends on it, and the release that ships it all move together through one workflow.

## How a change flows through

<Steps>
  <Step title="Make changes in develop" icon="wrench">
    You (or Buddy, or the Studio chat, or an MCP agent) change something —
    add a field to a storage, rewrite a sync mapping, adjust a listing
    filter, add a new page. The change is live in `develop` immediately,
    and Frontic revalidates any data that depends on it.

    Developers can build against `develop` right away. Customers see
    nothing.
  </Step>

  <Step title="Generate the Client SDK" icon="code">
    From your editor, run [`frontic generate`](/reference/frontic-cli) to
    generate a [Client SDK](/reference/client-sdk) targeting the current
    `develop` state. The SDK contains a version token that pins your
    frontend to exactly this snapshot of the API.
  </Step>

  <Step title="Build the frontend" icon="sparkles">
    Use the generated SDK to build whatever UI the change enables — in
    Studio, in your editor, or both. Your frontend is now pinned to the
    exact API contract it was designed for, regardless of what happens
    in `develop` afterward.
  </Step>

  <Step title="Create a preview" icon="eye">
    When you're ready to lock in the stack-side changes for testing,
    create a **preview**. The preview freezes the current `develop` state
    into a snapshot you can validate without moving targets. Any existing
    preview is overwritten.
  </Step>

  <Step title="Test against the preview" icon="flask">
    Regenerate the Client SDK against the preview, run your frontend
    against it, go through QA. The frozen snapshot means whatever you
    tested is exactly what will ship.
  </Step>

  <Step title="Promote to public" icon="rocket">
    When the preview is validated, promote it. Promotion is **instant** —
    the preview directly replaces `public`, and your customers start
    seeing the new version immediately. The Client SDK your frontend is
    pinned to keeps working through the transition because version tokens
    fall back gracefully.
  </Step>
</Steps>

See [What's in a Release](/releases/what-flows-through) for the full list of what a snapshot contains, and [Release Flow](/releases/release-flow) for the mechanics of previews, promotions, and version tokens.

## Version tokens

A Client SDK generated against a specific version carries a **version token** in the `FS-Version` header on every request. Frontic uses the token to route the request to the exact snapshot the SDK was generated for.

That means:

* Your frontend always talks to the API version it was built against
* You can deploy frontend and backend changes independently without breaking compatibility
* When a preview is promoted, the token falls back gracefully to `public` — your frontend keeps working through the transition with no code change

If no token is supplied (or the token is no longer valid because the snapshot it pointed to has been replaced), the request falls back to the current `public` version. No broken requests, no manual cleanup.

## Pairs with your codebase

Release Control is designed to map 1:1 to the codebase that consumes your project. Your repo's deploy pipeline drives the frontend; Release Control drives the stack. Promote a preview, regenerate the Client SDK, deploy — the two pipelines move in lockstep. The forthcoming GitHub integration deepens this: PR tracking, auto-release of new API versions, and release state surfaced on PRs. See [Core Concepts](/essentials/core-concepts#project) for why one project should pair with one codebase.

## Related

<CardGroup cols={2}>
  <Card title="What's in a Release" icon="list-check" href="/releases/what-flows-through">
    The complete list of what a release snapshot contains — storages,
    syncs, API surface, project settings, and more.
  </Card>

  <Card title="Release Flow" icon="layer-group" href="/releases/release-flow">
    The mechanics: creating previews, promoting to public, version tokens,
    and graceful fallback.
  </Card>
</CardGroup>
