> For the complete documentation index, see [llms.txt](https://docs.eyepop.ai/developer-documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.eyepop.ai/developer-documentation/deploying/vms/milestone/workflows.md).

# Workflows

Control what each camera detects with a workflow

A **workflow pop** controls what a camera detects. It's a small JSON definition that defines what AI Vision Models and Abilities you would like to run. These Workflow pops can be created in your EyePop dashboard and copied into your XProtect Server as JSON.

The workflow pop chains abilities: detect objects, crop to each detection, and run another ability on the crop. You can also track people and objects and ask natural language questions about them to produce rich metadata that is then piped into XProtect. Full documentation of a [Pop](https://docs.eyepop.ai/developer-documentation/platform/pop)

### Edit a workflow

1. Open the management page's **Workflows** tab.
2. Click an existing workflow to edit it, or enter a new name to create one.
3. Edit the JSON and click **Apply workflow**. It's validated immediately — invalid JSON or an unsupported value is rejected with an inline error before anything is saved.
4. The change takes effect immediately. Any camera using that workflow restarts its processing automatically — no service or container restart needed.

The built-in `default` workflow can't be deleted; it's the fallback for every unassigned camera.

### Assign a workflow to a camera

From the **Cameras** tab, pick the workflow from the camera's dropdown and click Apply.

### The default workflow

Every camera runs by default common object detection workflow:

```json
{
  "pop": {
    "components": [
      {
        "type": "inference",
        "ability": "eyepop.common-objects:latest",
        "confidenceThreshold": 0.80,
        "forward": {
          "operator": { "type": "crop" },
          "targets": [
            {
              "type": "tracking",
              "maxAgeSeconds": 5,
              "motionModel": "constant_velocity",
              "agnostic": true,
              "classHysteresis": true
            }
          ]
        }
      }
    ]
  }
}
```
