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

# Flags

> The core primitive — a named, versioned configuration controlled per environment.

A **flag** is a named toggle or value that your application reads at runtime. Every flag has:

* A **key** — the developer-facing identifier (e.g. `new-checkout-flow`). Immutable after creation.
* A **type** — `boolean`, `string`, or `number`. Determines what values the flag can return.
* A **config per environment** — flags are independently controlled in each of your environments.

## Flag types

| Type      | Default value    | Example use                        |
| --------- | ---------------- | ---------------------------------- |
| `boolean` | `true` / `false` | Feature on/off                     |
| `string`  | Any string       | A/B copy, theme name, API endpoint |
| `number`  | Any number       | Rate limit, sample rate, price     |

## `clientSafe`

By default, flags are only accessible to **server** API keys. Setting `clientSafe: true` allows the flag to be included in the public bundle fetched by browser SDKs (`client` API keys).

Only mark a flag `clientSafe` if its value carries no sensitive business logic — client-side code is readable by end users.

## Archiving

Setting `archived: true` marks the flag as inactive. Archived flags are hidden in the dashboard by default but remain in the database and are still returned by the API unless filtered out.

## Versions

Flag state is **append-only**. Every change to a flag's config in an environment creates a new `flag_version` row — previous versions are never mutated. This is what powers the audit trail and change proposals.

See [Flag Config](/docs/concepts/flag-config) for the full config schema.
