cappy.

Configuration

cappy.config.json lives in the project directory. Pass another file with --config <path> (-c), relative to the project. Every field is validated before the game launches.

Top level

Field Required Meaning
schemaVersion yes Always 1.
project yes { "id", "name" }. The ID ties sessions and captures to this project.
game yes { "command", "args", "cwd" }. How to launch the game. Prefer absolute paths.
adapter no { "host", "port", "requiredCapabilities" }. The host must be loopback; port: 0 picks a free port.
obs for capture { "url", "passwordEnv", "scene", "switchScene" }.
tools no { "ffmpeg", "ffprobe" } paths when they are not on PATH.
workspace no { "root" } to move the managed .cappy/ folder.
presets no Named capture presets (below).
defaultPreset no Preset used when --preset is not given. Without one, a capture keeps only the master.
builds no Named alternative launch commands (below).
timeouts no connectMs, readyMs, obsMs, processMs. Raise connectMs for a slow first import.

OBS

Presets

A preset names the OBS scene to expect and the derivatives FFmpeg makes from each verified master.

"presets": {
  "trailer": {
    "scene": "Capture",
    "derivatives": [
      { "kind": "mp4", "role": "delivery" },
      { "kind": "clip", "role": "moment", "options": {
        "start": { "event": "SPELL_CAST", "offset": -2 },
        "end": { "event": "IMPACT", "offset": 1 } } },
      { "kind": "thumbnail", "role": "thumb", "required": false, "options": { "at": 2 } }
    ]
  },
  "slowmo": { "presentation": { "timeScale": 0.5, "camera": "close" } }
}
Kind Output Options
mp4 <role>.mp4 crf (0-51), preset (x264), audio
clip <role>.mp4 start (required), and exactly one of duration or end, plus the mp4 options
thumbnail <role>.jpg at, width
still <role>.png at

Builds

"builds": {
  "b": { "game": { "args": ["--path", "/absolute/path/to/game", "--", "--variant=b"] } }
}

Each field a build gives replaces the base game field. Select one with --build <name> (-b) on run, replay, record, and scenarios; base means the plain game. compare-builds takes two build names directly.

Workspace

Everything Cappy makes goes under .cappy/ in the project: sessions/, captures/, comparisons/, and logs/, plus an ownership registry. Add .cappy/ to .gitignore. Cappy deletes only files it registered and whose hash still matches, and only through cappy clean.

Setup prompt

Read the guide