---
title: Content
description: The content registry externalizes strings and sample data so a spec can be localized or repointed without touching the layout.
status: shipped
url: https://getairframe.com/framewerk/core/content
---

> Part of the Framewerk docs. Index of every page: /framewerk/llms.txt

# Content: `$c()` and `$f()`

The **content registry** externalizes strings and sample data so a spec can be localized, or repointed at different demo data, without touching the layout.

## Examples

A registry with a label and a fixture, referenced from text props:

**Labels and fixtures**

```json
{
  "formatVersion": "1.0",
  "content": {
    "defaultLocale": "en-US",
    "locales": ["en-US", "es"],
    "entries": [
      { "id": "nav.home", "type": "label", "values": { "en-US": "Home", "es": "Inicio" } },
      { "id": "menu.items", "type": "fixture", "values": { "en-US": [{ "name": "Espresso" }, { "name": "Cortado" }] } }
    ]
  },
  "screens": [
    {
      "id": "home",
      "layout": {
        "_id": "root",
        "type": "column",
        "gap": 12,
        "padding": 16,
        "children": [
          { "_id": "nav", "type": "text", "variant": "heading", "content": "$c(nav.home)" },
          {
            "_id": "menu",
            "type": "column",
            "gap": 8,
            "forEach": "$f(menu.items) as item",
            "children": [
              { "_id": "menu-row", "type": "text", "content": "$item.name" }
            ]
          }
        ]
      }
    }
  ]
}
```

A screen whose visible copy all comes from the registry:

**A fully externalized screen**

```json
{
  "formatVersion": "1.0",
  "content": {
    "defaultLocale": "en-US",
    "locales": ["en-US"],
    "entries": [
      { "id": "greeting", "type": "label", "values": { "en-US": "Welcome back" } },
      { "id": "cta", "type": "label", "values": { "en-US": "Continue" } }
    ]
  },
  "screens": [
    {
      "id": "home",
      "layout": {
        "_id": "root",
        "type": "column",
        "gap": 16,
        "padding": 24,
        "children": [
          { "_id": "h", "type": "text", "variant": "heading", "content": "$c(greeting)" },
          { "_id": "go", "type": "button", "variant": "primary", "content": "$c(cta)" }
        ]
      }
    }
  ]
}
```

## Anatomy

Reference entries from any text prop:

- **`$c(id)`** — a **label**: one localized string. `"content": "$c(nav.home)"`
- **`$f(id)`** — a **fixture**: arbitrary JSON for repeating or data-shaped content. A container repeats over it with `"forEach": "$f(menu.items) as item"`, and each child reads a field with `$item.name`.

The split is the useful part: labels are what a translator touches, fixtures are what a demo dataset swaps. `namespace` groups entries by dot-notation (`nav`, `screens.login`) for organizing large registries. `type` is `"label"` or `"fixture"`; `values` maps locale → value.

## Stability

The registry shape (`defaultLocale`, `locales`, `entries[]`) and the `$c()` / `$f()` call forms are part of the format contract. Adding an entry type is additive; changing how an existing call resolves is breaking.
