# Manifest

parity.yaml: one file that describes the application for every sandbox, staging and production.

`parity.yaml` describes your app: the built-ins it uses, the processes it runs, the jobs that set it up and the hosts it may reach. The same file runs every sandbox, staging and production; environments list only how they differ. It holds the app's shape, never secret values.

Run `parity check` after every change. It needs no account, reports every problem at once, and prints what each service will get, defaults included. Unknown keys are errors, so a typo never passes silently.

## Top-level keys [#top-level-keys]

| Key | What it is |
| --- | --- |
| `version` | Always `1`. |
| `project` | Your project's name: lowercase letters, digits and `-`, starting with a letter, at most 63 characters. |
| `managed` | [Managed services](/manifest/builtins) Parity runs for the app: Postgres, Redis, S3 storage, email, ClickHouse, sign-in, certificates. |
| `services` | The app's [long-running processes](/manifest/services). |
| `jobs` | The app's own [commands](/manifest/jobs), run on lifecycle events, on a schedule or on demand. |
| `runners` | [Images jobs run on](/manifest/jobs#runners) instead of their service's. Optional. |
| `env_groups` | [Env blocks](/manifest/env) shared by several services. |
| `externals` | Third-party hosts the app may reach: the [egress allowlist](/manifest/externals). |
| `sandbox` | [Sandbox lifetime and agent limits](/manifest/advanced#sandbox). Optional. |
| `environments` | The [environments](/manifest/environments) you declare, and how each differs from the rest of the file. Optional. |
| `release` | How each build moves across them: [promote, block, wait, run and group steps](/concepts/promote). Optional. |
| `kubernetes` | The [escape hatch](/manifest/advanced#kubernetes-the-escape-hatch). Optional. |
| `include` | [Other files](/manifest/advanced#include-splitting-the-file) that hold part of the manifest, for monorepos. Optional. |
| `x-<anything>` | Ignored, as in Compose: a place for YAML fragments you reuse with anchors (`&name`) and aliases (`*name`). |


## Names [#names]

- Every name (project, managed entry, service, job, env group, bucket) is a lowercase DNS label: letters, digits and `-`, starting with a letter, at most 63 characters. A job's name is at most 54 characters, 52 with a schedule, since each run adds a suffix.
- A managed entry can't share its name with a service or an env group.
- Names starting with `parity-` are reserved.
- Old spellings get an error that names the new one. For example, `resources:` is now `managed:`, the events `base` and `create` are now `seed` and `start`, and a job's `run:` is now `command:`.
