> 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/platform/pop/pop-forwarding.md).

# Forwarding

Chaining Pop components, and what each one receives

Forwarding is how a list of [components](/developer-documentation/platform/pop/pop-components.md) becomes a pipeline. A component's `forward` names what runs next and what those components receive — each detection as its own crop, or the whole frame.

### The forward object

| Field                                  | Type    | Description                                                                              |
| -------------------------------------- | ------- | ---------------------------------------------------------------------------------------- |
| `targets`                              | list    | The components to run next.                                                              |
| `operator.type`                        | string  | `crop`, `full`, or `crop_with_full_fallback`.                                            |
| `operator.includeClasses`              | list    | Restricts forwarding to these class labels.                                              |
| `operator.crop.maxItems`               | integer | Caps how many detections are cropped per frame. Defaults to 16.                          |
| `operator.crop.boxPadding`             | float   | Expands each crop box by this factor before cutting.                                     |
| `operator.crop.orientationTargetAngle` | float   | Rotates each crop to this angle in degrees — how skewed text is straightened before OCR. |

#### Operators

**`crop`** cuts each detection out of the frame and runs the targets on the cutouts. This is the workhorse: detect a vehicle, crop it, find the plate inside it.

**`full`** passes the whole frame through untouched. What it means depends on whether you also filter classes:

* `full` alone runs the targets on the frame as independent stages, unattached to the parent's detections.
* `full` **with** `includeClasses` runs the targets on the whole frame but attaches their results to the parent's matching detections. Use it when a model needs the full scene for context but its output belongs to a specific object.

**`crop_with_full_fallback`** crops when the parent detected something, and falls back to the full frame when it detected nothing — so a Pop still returns an answer for media where the first stage found no objects.

#### Filtering by class

`includeClasses` narrows what gets forwarded to the labels you list. On `eyepop.vehicle:latest`, `includeClasses: ["car", "truck"]` sends cars and trucks downstream and leaves buses and motorcycles behind.

Naming a label the parent ability cannot produce is rejected when the Pop is compiled, so a typo fails at the boundary rather than silently forwarding nothing.

### Composability

Any component can forward to any component. There is no type pairing the platform rejects, so the real constraints are about what makes sense:

| Component          | Sensible parents                    | Notes                                                           |
| ------------------ | ----------------------------------- | --------------------------------------------------------------- |
| `inference`        | anything, or top level              | A `crop` forward from a detector is the common case.            |
| `tracking`         | a detector, via `crop`              | Tracking needs objects to track and video to track them across. |
| `contour_finder`   | an inference producing segmentation | Nothing to contour without masks.                               |
| `component_finder` | an inference producing segmentation | Nothing to split without masks.                                 |
| `forward`          | anything, or top level              | Used to branch.                                                 |

A finder scopes itself to the nearest enclosing inference component, following the chain up through any intervening finders. A finder placed at the top level, with no inference above it, scopes to everything on the frame.

Two rules the platform does enforce:

* A component `id`, if you set one, must be unique in the Pop.
* Every `inference` component must name exactly one ability, by alias or uuid.

### Next steps

* [Components](/developer-documentation/platform/pop/pop-components.md) — every component type and its attributes
* [Examples](/developer-documentation/platform/pop/pop-examples.md) — worked pipelines end to end
* [Pop Object](/developer-documentation/platform/pop/pop-object.md) — the shape of a Pop and how its top-level components run
