Overview
Detailed rules
source
Pulls data from an external system through a connected integration.
- Must be a root—no parents.
- Requires a provider (the integration to call).
- Children can be any type except
sourceordata_read.
data_read
Reads from one of your project’s own databases.
- Must be a root.
- No provider needed—it uses the internal DuckDB engine.
- Useful for branching off a previously-stored table.
process
The workhorse: transforms, joins, filters, enriches, or acts on data.
- Must have at least one parent.
- Can chain other
processsteps, or pipe into adata_sink. - Provider is optional—required only when the operator calls an external API.
data_sink
Persists rows into a project database.
- Must have at least one parent.
- Its only child is a
databasenode. - Each row must include the platform’s row-identity columns; the operator config handles this.
database (virtual)
Represents a project-level data table. Created at deploy time from the data_sink above it.
- Carries the pipeline’s triggers:
schedule(cron) or manual. - Firing a trigger refreshes everything in this database’s ancestor closure.
dashboard (virtual)
Auto-generated visualization built from a database.
- Must be terminal—no children.
- Code is generated at deploy time; you describe what to visualize.
DAG rules
- At least one root step per project.
- Only
databasesteps carry triggers. - No cycles—the graph must be a valid DAG.
- Step slugs are unique within a project.
sourceanddata_readstay as roots; they cannot appear as children of other steps.dashboardsteps are always terminal.