Form
Triggerlist.bullet.rectangle
trigger.form
Manual trigger that presents a multi-field form when you run the flow. Press Run — from the canvas or the menu bar — and a floating glass panel appears; Submit seeds the run with every field as a typed payload value, Cancel means the run never starts.
The panel is an always-on-top window: it follows you to the active Space, works over full-screen apps, and is resizable in height. It sizes itself to its content and grows when the content grows — image thumbnails, for example. Esc, the Cancel button, and the red close button all cancel it.
Like the Input trigger, a form flow has no watcher to arm, so it is always active — its status dot reflects the health of its recent runs rather than an on/off state, and the Enabled switch is shown turned on but inert.
Summon it from anywhere: pair a Keyboard Shortcut trigger with a Mid-Flow Form action and the form pops up on a global hotkey, no canvas visit required.
Fields
Fields are defined in the inspector's Fields editor: reorderable rows (drag handle) with per-type extras — placeholder, default value, help text, options, validation. The Preview Form… button presents the real panel in dry-run mode (Submit discards). Field names are auto-slugged from their labels, editable, and must be unique; the reserved names form, formTitle, timestamp, and filePath are rejected inline. The AI Flow Builder can author fields conversationally (“add title, description, and a priority dropdown”).
Validation runs live in the panel: required fields gate the Submit button until valid, numbers must parse, email and phone formats are checked, a Select value must be one of its options, and optional min/max, regex, and max-length rules apply per field.
| Field type | Emits | Example value |
|---|---|---|
| Text / Text Area | String | "Crash when exporting a PDF" |
| Number | Number (a real number, not a string) | 42 |
| Email / Phone | String (format-validated) | "greg@example.com" |
| Date | String (ISO 8601) | "2026-07-11T09:30:00Z" |
| Select | String (one of the configured options) | "High" |
| Toggle | Boolean | true |
| File / Image | String (bare POSIX path, no file://) |
"/Users/greg/Desktop/crash.png" |
| Directory | String (bare POSIX path to the chosen folder — pick or drop one) | "/Users/greg/Documents/Reports" |
| Multiple Images | Array of paths (a real array — drop, pick, or paste several at once) | ["/…/before.png", "/…/after.png"] |
| Destination (Linear) | Object — see Routing with a Destination field below | {"provider": "linear", "teamLabel": "Watchflows", …} |
| Any unfilled optional field | null — the key is still present | null |
A Destination (Linear) field is a dropdown whose choices are live entities from a connected integration — Linear Teams or Linear Projects — grouped under workspace/team headers and served instantly from cache. It requires a connected Linear account (see Integrations).
Ports
| Direction | Name | Data Type | Description |
|---|---|---|---|
| Outlet | Output | Any | The submitted form as the run's seed payload |
Configuration
| Field | Type | Default | Description |
|---|---|---|---|
| Fields | Field Editor |
— | The form's field list: reorderable rows with per-type extras and validation rules |
| Form Title | Text |
Form | Title shown at the top of the panel; also emitted as formTitle |
| Description | Text Area |
— | Optional text shown under the title in the panel |
| Submit Button Label | Text |
Submit | Label on the confirm button (“File It”, “Send”, …) |
| Preview Form… | Button |
— | Presents the real panel in dry-run mode — Submit discards, nothing runs |
| Custom Arguments | Key-Value |
— | Extra key/value pairs merged under the form's keys (a field with the same name wins) |
The Submission Payload
Submitting emits every field twice: once inside the nested form object ({{form.severity}}) and once as a flat key under the field's own name ({{severity}}). Both carry the identical typed value from the table above.
| Variable | Type | Description |
|---|---|---|
form |
JSON | All fields as a real nested object — {{form.fieldName}} |
<fieldName> |
Typed | One flat key per field, by field name — number as a real number, toggle as true/false, unfilled optional as null (key present) |
formTitle |
String | The form's title |
timestamp |
String | ISO 8601 instant of the submission |
filePath |
String | Bridge convenience: the first file/image/directory field's path (first element for Multiple Images) so file-hungry nodes work unconfigured; absent when no file field exists |
One expectation to set: a form's per-field {{…}} entries appear in downstream nodes' variable pickers after the first run — the picker learns keys from real payloads. Until then, type {{fieldName}} by hand and it resolves fine.
Routing with a Destination field
A Destination field emits a structured object under its field name:
"destination": {
"provider": "linear",
"account": "acme-workspace",
"teamId": "team_01H…",
"teamLabel": "Watchflows",
"projectId": "proj_01H…",
"projectLabel": "Bug Bash"
}
(projectId/projectLabel appear only when the field's source is Linear Projects.) Downstream Linear nodes can route with {{destination.teamId}} and friends — or, easier, pick “Use the form's pick” in the Linear: Create Issue node's Destination dropdown, which writes those templates for you.
Headless & Agent Runs
The form's schema is the tool's API
Agents and MCP clients can't see a panel — so the form describes itself instead. Every field is advertised to the caller as a named, typed parameter: required fields are flagged, help text and Select options are included, and a Destination field documents its JSON-object shape.
When an agent or MCP client runs the flow, each field resolves in order: the caller-supplied value, else the configured default — and if a required field has neither, the run is refused with a message naming that field. The panel never appears for agent runs, and values flow through the same payload builder, so headless payloads are identical in shape to interactive ones.
Example
A bug-report intake: the form collects a title, a description, a Destination pick, and screenshots; an AI Agent triages the report; Linear: Create Issue files it where the form pointed.
| Where | Template | Resolves to |
|---|---|---|
| Issue title | {{title}} |
The form's title field, as typed |
| Issue description | {{result}} |
The agent's triage write-up |
| Issue images | {{images}} |
The Multiple Images field — a real array of screenshot paths |
| Issue destination | {{destination.teamId}} |
Routed from the form's Destination pick (or use “Use the form's pick”) |