tenant_settings.flowIrEnabled defaults to true. The flag
remains as an explicit kill-switch under /settings if you ever need
to disable the pipeline feature wholesale.
1. Create a pipeline (UI)
Open Data → Pipelines and click + New Pipeline. The dialog asks for three things:- Name — anything human-readable, e.g.
orders-ingest. - Connector — pick from your existing connectors. Create one under Data → Connectors first if needed.
- Schema — pick the destination data schema. Create one under Data → Schemas first if needed.
/data/flow-pipelines/<id>/edit. You never paste
JSON.
Or: create a pipeline (API)
For automation or CI, the same starter IR can be POSTed:2. Tour the editor
After Create & Open Editor, you land on/data/flow-pipelines/<id>/edit.
The shell has two resizable panes plus a top bar and a bottom strip:
Run history is not a tab here — it lives on the standalone Pipeline
Runs page (
/data/flow-runs). The AI panel is docked at the top-right
of the page, not inside the right pane.
Click the src node on the Visual canvas — the right pane shows the
full source-node IR (path, pattern, ordering, format, atomicity,
waitPolicy). Click × in the top-right of the right pane to
deselect.
3. Add transforms + validation
Two ways to add nodes:a. Visual canvas Add-Node toolbar (one click)
Above the canvas there’s a row of buttons: **+ Transform / + Validate /- Enrich / + Branch / + Target**. Click a non-target button — kaireon
inserts a default node between the last upstream and your target,
repoints the target to consume the new node, and bumps the IR version.
The new node is auto-selected so you can immediately edit its config in
the right pane or the JSON IR tab. Defaults are intentionally
placeholder (e.g. a transform with a single
rename: from_field → to_fieldop) so you know exactly what to fix. (Adding an Enrich node is fine for authoring, but note the enrich executor throws at runtime — remove it before you run the pipeline. Source and Join are not in the toolbar; add those via the JSON IR tab or the AI panel.)
b. JSON IR tab (full control)
Add a cast / rename / hash transform. Insert a transform node between source and target, then pointtgt.input at the transform:
cast, rename, drop, filter, add_field, hash,
mask_pii, map_values, split, merge, deduplicate, aggregate,
lookup_join, rule-mode sentiment_score, and language_detect run at
runtime; expression is limited to LOWER/UPPER/TRIM/LENGTH of a
single column. summarize, vector_embed, geo_resolve, and
sentiment_score in llm mode are passthrough (rows returned
unchanged until a provider is wired). See
Transforms for the full reference.
Add row-level + dataset-level validation. Row-level rules use a
type (notNull / regex / range / fieldType / maxLength), a
field, and onFail (abort / warn / skip). Failing rows are
written to the DLQ table when quarantine.enabled is set:
tgt.input to "v", click Save in the JSON IR tab.
parsePipelineIR runs server-side; if the IR is invalid, the structured
errors render verbatim on the page. On success the IR version pill bumps
(v1 → v2).
Or skip the JSON entirely and use the docked AI panel: “Add a
sha256 hash on ssn and quarantine rows where amount ≤ 0” produces the
same change as a proposal you can accept with one click.
4. Run the pipeline
Hit Run now in the top bar. The status badge staysdraft until
the first run succeeds — then it flips to active.
5. Inspect
- Pipeline Runs page (
/data/flow-runs, Sidebar → Data → Pipeline Runs) → your run appears as a row with Status, Started, Completed, Rows In, Rows Out, Processed, and an Error column - Lineage tab → pick
public.ds_orders→ see your loaded rows with their_kaireon_lineageenvelopes; click a row to walk back through the IR - SQL Preview tab → see the exact
INSERT … SELECTthe runtime built from your column schema - Validation failures → a failing dataset-level check surfaces in the
run’s Error column; rows rejected by a row-level rule are written to the
DLQ table you named in
quarantine.tablewhenquarantine.enabledis set
6. Schedule it
Switch to the Schedule tab. Pick cron, click “Daily at 09:00”, choose your timezone, watch the “Next 5 fires” preview, hit Save schedule. The IR gets aschedule field; the in-process scheduler
(running every 60 seconds since server startup) picks it up
automatically — no external cron, no extra service to deploy. See
Flow Scheduler for tuning knobs and how to
disable in-process scheduling if you bring your own orchestrator.
Click Tick scheduler now in the same tab to fire any due pipelines
immediately, useful right after saving a new schedule.
Where to go next
- Master spec for the IR shape: Pipeline IR
- AI authoring of IR changes: AI Pipeline Mode
- External agent surface: MCP Flow Server
- File ingestion details: File Ingestion