Node Catalog
Zebflow includes 67+ built-in nodes across 9 categories. For detailed flags on any node, use help(topic="pipeline/nodes/n.{kind}") via MCP.
Triggers
| Node | Purpose | Key flags |
trigger.webhook | HTTP endpoint | --path --method [--auth-type jwt|hmac|api_key] [--auth-credential] [--auth-required-role] |
trigger.cron | Scheduled execution | --schedule "cron-expr" [--timezone] |
trigger.manual | Run on demand | (none) |
trigger.ws | WebSocket room event | --event name --room id |
trigger.ws.client | Outbound WebSocket | --url wss://... --event message |
trigger.kv.subscribe | React to KV changes | --prefix key: [--durable] |
trigger.mcp | MCP tool invocation | --tool-name name --tool-description desc |
Web
| Node | Purpose | Key flags |
web.response | Serve HTTP response (JSON, TSX page, redirect, cookie) | --template --status --location --body --set-cookie --header |
web.docs.generate | Generate static docs site from markdown | --docs-root --output-dir --template-folder [--site-title] [--deploy-base-url] |
web.static.generate | Render TSX to static HTML file | --template --output-path [--route] [--on-conflict] |
web.response decision matrix
| Intent | DSL |
| JSON (full payload) | | web.response |
| JSON (specific field) | | web.response --body $.rows |
| Render TSX page | | web.response --template pages/home.tsx |
| Redirect | | web.response --location /somewhere |
| Error with message | | web.response --status 403 --message "Access denied" |
| Error page | | web.response --template pages/404.tsx --status 404 |
| Set session cookie | | web.response --set-cookie name=session,value=$.token,http-only,max-age=86400 |
Database
| Node | Credential? | Example |
pg.query | Yes | --credential main-db -- "SELECT * FROM users" |
pg.mutate | Yes | --credential main-db -- "INSERT INTO ..." |
mysql.query | Yes | --credential my-mysql -- "SELECT ..." |
mysql.mutate | Yes | --credential my-mysql -- "INSERT ..." |
sekejap.query | No (built-in) | -- "SELECT * FROM posts" |
sekejap.mutate | No (built-in) | -- "INSERT INTO posts ..." |
Parameterized queries: --params-expr "{{ [$trigger.params.id] }}" with $1, $2 placeholders.
Auth
| Node | Purpose |
auth.token.create | Create JWT — --credential key [--expires-in] [--claim k=$.field] |
auth.token.verify | Verify JWT — --credential key |
Webhook-level auth: trigger.webhook --auth-type jwt --auth-credential key --auth-required-role admin,editor
File System (ZebFS)
| Node | Purpose | Key flags |
fs.save | Save uploaded file | --field name --folder path |
fs.thumbnail | Generate image thumbnail | --width N --height N --format jpg|png --folder path |
fs.get | Read file content | --path file/path |
fs.put | Write file content | --path file/path |
fs.list | List directory | --path dir/ |
fs.head | File metadata | --path file/path |
fs.delete | Delete file | --path file/path |
fs.copy | Copy file | --from path --to path |
fs.move | Move/rename | --from path --to path |
fs.mkdir | Create directory | --path dir/path |
Files served at GET /fs/{owner}/{project}/{path}.
Key-Value Store
| Node | Purpose | Key flags |
kv.set | Write value | --key K [--durable] [--ttl secs] |
kv.get | Read value | --key K |
kv.delete | Delete key | --key K |
kv.list | List by prefix | --prefix P [--durable] |
kv.exists | Check existence | --key K |
kv.incr | Atomic counter | --key K [--amount N] |
kv.publish | Pub/sub send | --channel name |
--durable persists to disk. Without it, entries are in-memory only.
Table Processing
| Node | Purpose |
table.convert | Convert between CSV, JSON, Parquet formats |
table.query | SQL query over tabular data (DataFusion engine) |
Logic (graph mode only)
| Node | Output pins | Key flags |
logic.if | :true :false | --expr "js expression" |
logic.match | :case1 :case2 :default | --expr "js" --cases a,b --default x |
logic.collect | :out | Waits for all parallel branches |
logic.foreach | :item | --items-path /array [--dispatch seq] |
logic.reduce | :out | --init-expr "{}" --step-expr "{}" |
logic.retry | :retry :failed | --max-attempts N [--delay-ms] |
MapServer (geospatial)
| Node | Purpose |
ms.publish | Publish GeoJSON as vector tile layer |
ms.unpublish | Remove a published layer |
ms.get | Get layer details |
ms.list | List published layers |
Layers served at GET /ms/{owner}/{project}/{path}. Use with zeb/deckgl for rendering.
WebSocket
| Node | Purpose | Key flags |
ws.emit | Push event to room | --event name --to all|session|others |
ws.sync_state | Patch room state | --op set|merge|delete --path /ptr --value-path /ptr |
ws.client.send | Send via outbound WS | --message-path / |
AI & Agents
| Node | Purpose |
ai.prompt | LLM text generation — --credential key --model name |
ai.embedding | Generate embeddings — --credential key |
ai.agent | Agentic loop with tool pipelines — --credential key --tools fn1,fn2 |
ai.tts | Text-to-speech — --provider piper |
Other
| Node | Purpose |
script | Inline JS — -- "return { ok: true };" |
http.request | External HTTP — --url URL --method GET|POST [--header k=v] |
transform.set | Set fields — --field name --value val |
n.c.* | Composite node packages |
n.wasm.* | WASM node packages |