# Manifest & OpenAPI

> The two artifacts the compiler emits and what each one drives.

Every compile produces two files. Together they are the contract that the entire stack reads from.

## schema.rastack.json — the manifest

The canonical manifest is the resolved model: resources, fields, relations, sync config, and admin config. It is what the Rust API and the admin site consume — there is no other server configuration.

```json title="schema.rastack.json"
{
  "resources": [
    {
      "app": "airports",
      "model": "airport",
      "fields": [
        { "name": "code", "type": "string", "maxLength": 3, "unique": true },
        { "name": "name", "type": "string", "maxLength": 120 }
      ],
      "relations": [],
      "search": ["code", "name"]
    }
  ]
}
```

## openapi.json — the contract

The OpenAPI document reproduces the `/api/{app}/v1/{model}/` REST contract the codegen expects, plus custom extensions the runtime reads:

| Extension | Meaning |
| --- | --- |
| `x-rastack-relation` | marks a property as a foreign key to another model |
| `x-rastack-sync` | marks a model as local-first replicated |

> **Note:** Because the OpenAPI shape is stable, the hooks codegen and the `rastack` runtime never need to change when you add or edit resources — only the emitted contract does.

---

_Source: [https://reactapistack.com/docs/manifest](https://reactapistack.com/docs/manifest) · Full docs as one file: [llms-full.txt](https://reactapistack.com/llms-full.txt)_
