# The manifest: machine.yaml

Part of [Build a custom machine](https://www.ownbox.io/sdk/guide).

```yaml
machine: 2                         # the manifest format
slug: quote-follow-up              # the folder's own name
name: Quote Follow Up
version: 0.1.0
requires: {box: "1.2", sdk: 1}     # the Ownbox version it was built on, and the SDK
needs: []
permissions:                       # nothing is allowed unless it is named here
  think: {calls_per_month: 100}
  fetch: [api.example.com]
  keys: [{name: example, host: api.example.com, label: Example key}]
  data: [people:read, conversations:read]
  send: [{channel: email, per_day: 20}]
  packages: [{name: python-dateutil, version: 2.9.0.post0}]
on_forget: true                    # required when data names people
```

| Field | Type | Required | Rule |
|---|---|---|---|
| `machine` | integer | Required | `2`. |
| `slug` | string | Required | Lowercase letters, digits and `-`, starting with a letter, 2 to 41 characters. Equal to the folder's name and to `sdk.machine("<slug>")`. Not one already on the Ownbox. |
| `name` | string | Required | What the owner reads. At most 60 characters. |
| `version` | string | Required | `MAJOR.MINOR.PATCH`, like `0.1.0`. |
| `requires.box` | string | Optional | The Ownbox version it was built on, quoted, like `"1.2"`. An older Ownbox refuses it. |
| `requires.sdk` | integer | Required | `1`. An Ownbox on an older SDK refuses it. |
| `needs` | list | Optional | Plan features it needs, like `[coworkers]`. Default `[]`. Anything here needs `requires.box` `"1.2"` or later. |
| `permissions` | mapping | Required | What it may touch ([Permissions](https://www.ownbox.io/sdk/guide/permissions)). `{}` asks for nothing. |
| `on_forget` | boolean | Conditional | Required, and `true`, when `permissions.data` names `people:read` or `people:write`. Default `false`. |
| `author` | mapping | Optional | `{name, contact}`: a name of at most 60 characters, and an email or an `https://` address. |
| `resources.class` | string | Optional | `small`, `standard` or `large`. Default `small`. The memory, CPU and processes it gets ([Limits](https://www.ownbox.io/sdk/guide/limits)). An Ownbox refuses a class its memory cannot hold. |

The reader refuses a field it does not know, and suggests the one you meant. A field from an older format names its
new place: `sdk:` is now `requires.sdk`. The reader's other fields (`config`, `screens`, `coworkers`, `suites`,
`in_process`, `pack`) belong to the machines that ship with the Ownbox; a custom machine declares its pages in code,
with `m.screen`.
