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

# Manifest reference

> Every field of a service's TOML file

A service is described by one TOML file at
`.claude/skills/tesser/<service>.toml`. The filename is the service name,
which may contain lowercase letters, digits, `-`, and `_`. Service names are
shared across the org.

A manifest holds facts about the service: where its code lives, what ports it
listens on, how to set it up and start it, how to tell that it is healthy, and
what it depends on. Decisions such as when to restart, when to run tests, or
what else to install are made at the command line, not in the manifest.

## Minimal

```toml theme={"theme":"css-variables"}
ports = [3000]

[run]
setup = "pnpm install"
dev   = "pnpm dev"
```

## All fields

```toml theme={"theme":"css-variables"}
# .claude/skills/tesser/api.toml

root  = "apps/api"           # working directory for the recipes, relative to the repo root
ports = [8080, 9229]         # ports the service listens on; the first is the primary port

[run]
setup = "pnpm install"       # prepares the box; must be safe to run repeatedly
dev   = "pnpm dev"           # starts the server

[health]
path    = "/healthz"         # probed on the primary port; omit for a plain port check
timeout = "90s"              # how long to wait for the service to become healthy

[deps]
5001 = "worker"              # localhost:5001 on this box reaches worker's primary port
5432 = "db"                  # any TCP service
9091 = "search:9090"         # a specific port of a dependency

[env]
files    = [".env.local"]    # gitignored files that sync should include anyway
required = ["DATABASE_URL"]  # names only; values are set with `tesser env set`
```

## Field by field

| Field            | Default    | Meaning                                                                                                                                                                                                                                                                                                           |
| ---------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `root`           | `"."`      | The working directory for `setup` and `dev`, relative to the repository root. In a monorepo, point it at the service's package.                                                                                                                                                                                   |
| `ports`          | required   | The loopback ports the service binds. The first one is the primary port: it is what a bare dependency binding reaches and what the health check probes. Services bind loopback only; Tesser exposes the declared ports to the org's other boxes.                                                                  |
| `run.setup`      | required   | Runs before `dev` on every start, and on a pinned instance's first boot, so it must be idempotent. `pnpm install` is the usual value.                                                                                                                                                                             |
| `run.dev`        | required   | The command that starts the server. Dev boxes run it against the synced worktree; pinned instances run it against the checked-out commit.                                                                                                                                                                         |
| `health.path`    | port check | An HTTP path that must return a 2xx status on the primary port before the instance counts as healthy. Without it, a process listening on the primary port is enough.                                                                                                                                              |
| `health.timeout` | `"90s"`    | How long `dev` and a pinned rollover wait for the service to become healthy. Accepts values such as `"500ms"`, `"90s"`, or `"2m"`.                                                                                                                                                                                |
| `[deps]`         | none       | Entries of the form `localPort = "service"` or `"service:port"`. Each key becomes a loopback port on this box (and on the laptop while this box is selected) that reaches the named service. Dependencies are wired between a worktree's boxes automatically and are started or woken before this service starts. |
| `env.files`      | none       | Gitignored files, relative to `root`, that sync includes when copying to dev boxes.                                                                                                                                                                                                                               |
| `env.required`   | none       | Names of env variables a pinned instance needs. Values are set with `tesser env set <service> KEY=VALUE`. Starting a pinned instance with any of these unset fails with a message naming the missing variable.                                                                                                    |

## Rules

* The service's own `ports` and its `[deps]` keys share the box's loopback
  port space, so a port cannot appear in both.
* When a repository has several manifests, `dev` and `make` require the
  service name. When it has one, that service is the default.
* Unknown keys are rejected, and the error message lists the keys that exist.
* Secret values do not belong in a manifest. The `[env]` table holds names and
  file lists only, because the manifest is committed to the repository.
* Dependencies are names, never addresses. Which box a name reaches is decided
  for each box at run time, as described in
  [Wiring services together](/docs/wiring).
