Skip to content
Visual workflow automation

AUTOMATE WHAT HAPPENS NEXT.

KLYZ turns events, data, logic, APIs and AI into workflows you can actually watch. Every step shows its input, its output, its cost and exactly how long it took — no black boxes, no guessing which branch ran.

run_8F2AQueued—
  1. Webhookissue.opened · klyz/platformQueued
  2. Conditionpriority equals highQueued
  3. Extract fieldsai.extract · structuredQueued
  4. Notify #supportslack.postMessageQueued
Output{{notify_#support}}
"channel":"#support"
"ts":"1727248462.004100"
"status":"200"
Steps0/4
Run replay · every step inspectablerun_8F2A
  • 26

    node types in the registry

  • 06

    node categories

  • SSE

    live run events to the canvas

  • 100%

    of steps logged with I/O

01 — Manifesto

Most automation hides. KLYZ shows its work.

Point-and-click builders give you a flowchart and a prayer. KLYZ gives you an execution record: every input, every branch taken, every millisecond, every token. When something breaks you know what broke, where and why — and you fix it by editing the step, not by re-running blind.

  • 01Every node is data, not markup.
  • 02Every run is a record, not a log line.
  • 03Every failure carries its own remediation.

The run

One run, start to finish.

  1. 01EVENT

    Something happened.

    A webhook lands, a cron fires, an issue opens. Triggers are ordinary nodes — same config surface, same visibility — and filters run before a single step executes.

    • → POST /api/webhooks/gh_9f2 · 202
    • → HMAC signature verified · 14ms
    Webhookissue.opened · klyz/platform
    Complete14ms
  2. 02PROCESS

    The data is shaped.

    Transform maps fields and expressions pull upstream values into exactly the shape the next step expects. Nothing is lost between steps.

    • → {{steps.0.payload}} → map
    • → 4 fields rewritten · 3ms
    Transformlogic.transform · map
    Complete3ms
  3. 03LOGIC

    A decision is made.

    Conditions branch, switches route, filters drop what doesn't match. Only one path continues — and the run records exactly which one.

    • → priority = "high" → true
    • → 3 rules evaluated · branch A
    Conditionpriority equals high
    Complete3ms
  4. 04ACTION

    The world changes.

    HTTP calls, SQL writes, Slack messages — each with scoped credentials, a real response captured as output and a retry policy behind it.

    • → slack.postMessage → #support
    • → 200 OK · 112ms
    Notify #supportaction.slack_message
    Complete112ms
  5. 05RESULT

    Nothing is hidden.

    Input, output, cost and duration for every step. Replay the run, open any step, or re-run from the failure instead of from scratch.

    • → EXECUTION / 0148 · COMPLETED
    • → 4/4 steps · 1.42s · 184 tokens
    Result4 of 4 steps succeeded
    Complete1.42s

The node system

Every node is data, not markup.

One registry declares each node's fields, credentials, outputs and cost. The palette, the config panel, validation, the data picker and the execution plan all read from it — so adding a connector means adding a single entry, and the whole app learns about it.

37Entries in the registry

Trigger

06
  • 01Schedule
  • 02Manual run
  • 03GitHub event
  • 04New email received
  • 05Slack message received
  • 06Webhook

Action

15
  • 07GitHub issue
  • 08GitHub comment
  • 09Send email
  • 10Reply to email
  • 11Gmail label
  • 12Get email
  • 13Append row
  • 14Read rows
  • 15Update row
  • 16Notion page
  • 17Search Notion
  • 18Slack message
  • 19Slack channel
  • 20HTTP request
  • 21PostgreSQL

Logic

06
  • 22Condition
  • 23Switch
  • 24Delay
  • 25Filter
  • 26Loop
  • 27Transform

AI

04
  • 28Extract
  • 29Summarize
  • 30Classify
  • 31Generate

Data

05
  • 32Variables
  • 33JSON
  • 34Transform
  • 35PostgreSQL read
  • 36Data transform

Utility

01
  • 37Log

Execution — visible end to end

Input and output for every single step.

Select a step and see exactly what it received and exactly what it returned — nested objects included, secrets redacted. Reference any upstream value with {{ref.path}}, the same syntax the data picker, the config panel and validation use.

Run
EXECUTION / 0148
Workflow
Partner Event Relay
Trigger
Webhook · POST /hooks/relay
Duration
1.42s (queued 1.29s)
Steps
4 of 4 completed
Tokens
184 · $0.0011
EXECUTION / 0148COMPLETED1.42s
  1. TRIGGERwebhook.receive14msPhase 1 of 5
  2. PROCESStransform.map3msPhase 2 of 5
  3. LOGICcondition.eval3msPhase 3 of 5
  4. ACTIONslack.postMessage112msPhase 4 of 5
  5. RESULTlog.write4msPhase 5 of 5

Input

{
  "body": { "title": "…" },
  "priority": "high",
  "thread": {{steps.1.thread}}
}

Output

{
  "team": "billing",
  "owner": "mira",
  "tokens": 184
}
step · ai.extractExpression picker inserts{{ref.path}}

Triggers

Start from whatever already happened.

An inbound webhook, a cron expression, an issue opened, an invoice paid. Triggers are ordinary nodes with the same config surface as everything else — nothing special to learn.

  • Endpoint paths with HMAC or shared-secret auth
  • Cron and interval schedules with timezone control
  • Event filters before a single step runs
  • WebhookTrigger
  • ScheduleTrigger
  • GitHubTrigger
  • StripeTrigger

Failures

An error that tells you what to do next.

Failures carry a code, the response detail and a concrete remediation — not a stack trace you have to decode. Stop at the failed step, fix it, and re-run from there.

Step failedSTRIPE_402
Step
stripe.createCustomer
Error
Your card was declined.
Detail
The attached payment method requires authentication before it can be charged.
Fix
Reconnect the Stripe account with a 3-D Secure enabled card, then re-run from this step.

Open the editor and drop a node.

The demo runs entirely in your browser — no account, no deploy, no config files. Draft workflows and execution history are stored locally until the backend connects.