Skip to main content
Your workspace settings apply to every repository. To configure a single repository, commit an otto.yml at its root. In it you can: Without an otto.yml, Otto reviews the repository with your workspace settings.

Quick start

Create otto.yml at the repository root and merge it into your default branch:
otto.yml
Pull requests opened after the merge use it. See Which version applies.

Full example

otto.yml

Reference

Any field that takes a list also accepts a single string, so ignore: '**/*.snap' works too.

Limits

List entries past a limit are ignored, and the rest of the list still applies. An instructions value over 4,000 characters is ignored entirely, not truncated. Each is reported as an error.

Where Otto looks

Otto reads otto.yml from the repository root. It also accepts otto.yaml; if both exist, otto.yml wins. The file must be a regular file, not a symlink.

Which version applies

Otto reads otto.yml from the pull request’s base commit: the merge-base of the PR branch and its target branch. It never reads the PR’s own copy, so a pull request can’t change how it is itself reviewed. A PR that sets enabled: false or lowers depth is still reviewed with the configuration it started from. After you merge an otto.yml change into the target branch, it applies to:
  • New pull requests.
  • Existing pull requests once they are rebased onto, or merge in, the updated target branch.
To try a change, merge it and open a test PR. Changing otto.yml inside an open PR has no effect on that PR.

Globs

Globs in paths, ignore, and the branch skip rules match the file’s full path from the repository root: * stays inside one path segment; ** crosses segments. For branches, globs match the branch name without refs/heads/, so release/* matches release/1.2 but not release/1.2/hotfix.

YAML notes

Otto parses otto.yml with strict, JSON-compatible YAML:
  • Booleans are only true and false. yes, no, on, and off are strings, so enabled: no is an error and the default (true) applies.
  • Quote globs that start with *, {, or [, which YAML would otherwise treat as syntax: ignore: ['**/*.snap'].
  • Use | for multi-line instructions.

Errors

A broken otto.yml never stops a review. Otto ignores each invalid or unknown part, keeps the rest, and uses your workspace settings for anything it ignored:
  • An invalid value (for example depth: maximum) is ignored, and that field falls back to its default.
  • An invalid entry in a list is dropped on its own; the rest of the list still applies.
  • A path rule without any valid match glob is ignored.
  • An unknown key is ignored.
  • If the file isn’t valid YAML, is larger than 64 KB, or can’t be read, Otto reviews with your workspace settings only.
On GitHub, the Otto Review check summary lists the problems Otto found (up to 10, with a count of the rest), so you can fix the file.