Visual canvas, JSON, or the Python SDK - three renderings of one workflow definition. Audit-by-construction, optional HITL gates at any step and durability through any pause are properties of the engine, not features you switch on.
$ lyhnis deploy invoice_processing.py ✓ parsed 1 workflow, 7 activities ✓ schema check passed ✓ schedule registered · 0 9 * * MON ✓ deployed v14 · canvas + JSON in sync $ lyhnis run invoice_processing --watch run_01JX9 RUNNING microsoft.read_emails run_01JX9 RUNNING parallel · 3 branches run_01JX9 PAUSED human.approval · #finance
Drag activities onto the canvas. Edit the JSON directly. Or write it in Python with the SDK. Switch view at any time - the definition is one object, and it versions with your code.
@workflow("invoice_processing") @schedule("0 9 * * MON") def invoice_processing(): emails = microsoft.read_emails(folder="invoices", since="7d") @parallel for email in emails: invoice = ocr.invoice(email.attachment) data.validate(invoice, schema=InvoiceSchema) if invoice.amount > 10_000: decision = human.approval( approvers=["cfo", "finance"], timeout="48h") if not decision.approved: continue with retry(times=3): stripe.create_payment_intent(invoice) hubspot.create_deal(invoice) notify.slack(channel="#finance", text=f"Invoice {invoice.id} done")
Eleven categories of typed, retried, audited activities. Compose them, wrap them, or author your own - new activities and whole new categories are added on request.
AI-native execution loops with explicit budgets, sub-workflows-as-tools and HITL gates.
Pause for human approval. Branch, retry and gate with engine-enforced semantics.
Structured data out of invoices, receipts, IDs, business cards and arbitrary documents.
Classify, extract, summarize, translate and decide with any LLM provider.
Typed requests, signed webhooks, retries and backoff you do not have to write.
Slack, Teams, email and Telegram - every send captured in Communications.
Convert, split, merge, zip and hand off artifacts with lineage attached.
Transform, validate against a schema, reshape and join between steps.
Query and write to Postgres, MSSQL and MySQL with scoped credentials.
Object storage and blob operations across AWS, Azure and GCP.
28 connectors - Stripe, HubSpot, Salesforce, Google Workspace, Microsoft 365.
Per-turn dispatch means pause, resume and crash-recovery share one primitive: the run's state lives in the engine's store, and a worker only ever holds one turn at a time. So a 48-hour wait for a CFO is not a degraded mode - it is the same code path as a 40-millisecond retry, and it costs nothing while it waits.
A worker claims one turn, commits, and lets go. Nothing is held open across a wait.
A killed worker and a two-week pause are the same state transition to the engine.
Paused runs consume no worker, no thread and no concurrency slot.
Ship mid-run. Definitions are versioned, so in-flight runs finish on the version they started.
Six surfaces, each one click from the workflow that produced the thing you are looking at. No separate observability vendor to wire up.
Drag, wire and configure. Every node is the same activity your Python calls, with the same schema and the same validation.
Per-span timing, inputs, outputs, retries and the exact payload that failed. One click from any job in the list.
Browse all 70+ activities with their schemas, examples and per-tenant execution counts.
Insert-only, signed, actor-typed. Filter by actor, workflow, resolution source or date and export the range.
Every artifact with role inference and a lineage graph back to the uploader and the producing activity.
Volume, success rate, P95, queue depth, worker health. Prometheus-backed and alertable anywhere.
Author in Python, test locally, deploy to the same engine the canvas uses.
Drag activities, place your approval gates, hit run. No local setup, same execution layer.
See pricing →