Astralyx Iris · workflows, on all of Astralyx

Something happens. Your machines answer.

Iris joins boxes into workflows that run when something happens — your bank's webhook, an iPhone Shortcut, a camera system, your own product calling the workflow as an API, a time of day. A model of yours reads the event, a box decides, and you are told on your phone — or a run starts on your GPUs, or a person approves. Every execution survives a machine going away, and the models, data and functions stay on your machines.

An Iris workflow at workThe workflow card-spending, started by a call from a bank: a card purchase of 250 dollars at Corner Bakery. The call's signature is checked and it is not a repeat. A model box reads the amount and the merchant as JSON; a classify box files it under food with a confidence of 0.91; a condition finds it over the limit of 200; a notify box tells its owner in the app's inbox, with a push on the phone and on Telegram. Four light boxes, no container, in about two seconds; the model answered on the owner's machines.event from bank · HTTP · 14:02Card purchase: $250.00, Corner Bakerycard-spending · v3each box drawn as it finishesbank · HTTP trigger✓ signednew event · not a repeatread · Ask a model✓ 1.1 samount 250 · merchant Corner Bakerycategory · Classify✓ 0.6 sfood · confidence 0.91big · Condition✓over · 250 ≥ limit 200tell · Notify✓ sentinbox · phone · Telegram4 light boxes · no container · 2.4 soutputs: 3 small fieldsthe model answered on your machines
What starts it
HTTP · time
A call to its own address, or a schedule. Or you, by hand, from anywhere.
A light box
Seconds
No container: a model, a function or a notice that is already up answers.
Finished boxes run again
Never
A machine going away loses nothing; the execution goes on from where it was.
Ways to write one
One object
The editor's boxes, YAML, the API, astra and Python all write the same workflow.
01 — How it works

An event in. Boxes that read it, decide, and act.

A workflow is boxes joined into a graph. Boxes that need each other run in order; the others run side by side. Each time it runs is an execution, drawn live in the console: every box's state, attempts and outputs.

01

Something happens

A call to the workflow's own address — a bank, a camera system, a Shortcut, your product — or a schedule. What arrived is the event, and every box reads its fields.

02

A model reads it

Ask a model: an Eos deployment or assistant of yours answers in text, or in the JSON fields you name — from a photo too. A function shapes the rest.

03

A box decides

Classify picks one of your labels, with how sure it is; a condition picks the way. Unsure, it says so, and a person can decide.

04

Something is done

You are told in the app, on your phone and on Telegram; a run starts on your GPUs; an agent works; a person approves. Called as an API, the caller gets the outputs.

How an Iris workflow worksSomething happens — a bank's signed webhook, a camera system, an iPhone Shortcut, your product calling the workflow as an API, a schedule, or you running it by hand from the console, the CLI or Python — and the workflow starts with it as its event. Its boxes read the event with a model, decide with a classify box and a condition, and act: notify you in the app, on your phone and on Telegram. Called as an API, the workflow answers with its outputs in the same call. Light boxes run in seconds with no container; cluster boxes run containers, agents or another workflow on your machines; people decide in approvals, and an error path runs when a box fails. Each execution survives a machine going away. Models, functions and runs are on your machines, and only small outputs are kept.SOMETHING HAPPENSa bank's webhooksigned · HMACa camera systeman alert, a photoan iPhone Shortcutthe day's numbersyour productcalls it as an APIa schedule07:30 · Mon–Friyou, by handconsole, CLI, Pythoneventoutputs,same callA WORKFLOW · CARD-SPENDINGDURABLE1 · EVENTThe eventa call's body,or the time2 · READAsk a modelyour Eos model→ amount, shop3 · DECIDEClassifyfood · 0.91if ≥ the limit4 · ACTNotifyinbox · pushTelegramLight boxesask a model, classify, function, notify, condition · secondsCluster boxesa run, an agent, a sub-workflow · containers, GPUs, hoursPeopleapproval, wait for an event, wait, error pathmodels, functions and runs on your machines · only small outputs kept
02 — Editor

Drag boxes. Connect them. Every field stays yours.

In the console, boxes come from a palette — start, light, control, cluster — onto a graph; drag from one box to the next to connect them. Connect a box to a condition and it takes the condition's next way.

  • RecipesEach box offers ready answers — Extract fields as JSON, Spending category, If / else, Workflow as an API — which fill its fields. Nothing is hidden: every field stays editable.
  • One objectThe graph and its YAML tab are the same workflow, and so is what the API, astra iris workflows and Python's from astralyx.iris import Workflow write.
  • CheckedA workflow is checked before it is saved — a box that reads one it does not depend on, a loop, a name that is not in the workspace — and says what to fix.
  • VersionsEvery change is a new version that never changes; an execution keeps the one it started with.
card-spending.yamlYAML
metadata: { name: card-spending }
spec:
  inputs: [{ name: limit, default: "200" }]
  triggers:
    - { id: bank, kind: http, dedupe: "${{ event.id }}" }
  steps:
    - id: read
      kind: model
      assistant: money
      format: json
      prompt: "Amount and merchant, as JSON: ${{ event.text }}"
    - id: category
      kind: classify
      needs: [read]
      assistant: money
      input: "${{ steps.read.outputs.merchant }}"
      labels:
        - { name: food, description: "groceries, restaurants" }
        - { name: other, description: "anything else" }
    - id: big
      kind: switch
      needs: [read]
      cases:
        - { name: over, when: "steps.read.outputs.amount >= inputs.limit" }
    - id: tell
      kind: notify
      needs: [big, category]
      when: "steps.big.outputs.branch == 'over'"
      title: "${{ steps.read.outputs.merchant }}: over your limit"
your laptopshell
# The workflow as an API: the call waits
# and is answered with its outputs
$ curl -s "$ANSWER_ADDRESS" \
    -H "Authorization: Bearer $SECRET" \
    -d '{"question": "Capital of Australia?"}'
{"answer": "Canberra", "confidence": 0.98}

# By hand, with the event a trigger would send
$ astra iris workflows run card-spending \
    --event '{"id": "t1", "text": "$250.00 Corner Bakery"}' \
    --wait
03 — Triggers

Its own address, or a time of day.

An HTTP trigger gives the workflow an address: anything that can send a request starts it — a bank's or a shop's webhook, a camera system, an iPhone Shortcut, a script, another product. A schedule starts it on time. And anyone who may can run it by hand: the console, astra, Python or the API.

  • As an APIA call can wait for the execution — up to 90 seconds — and be answered with the workflow's outputs as JSON, in the same request. Or be answered at once, while it goes on.
  • ProofA secret in the address, a bearer token, or an HMAC signature of the body, as GitHub, Stripe and many banks sign their webhooks. The secret is shown once.
  • RepeatsSenders retry. Name the event's id, and the same event sent again within your window — up to a day — starts one execution.
  • Calls a minute60 by default, up to 600; past it, a call is refused and told why.
  • SchedulesEvery so many minutes, or at a time of day on the days you choose, in your time zone. A time missed is run once, up to an hour late, or skipped and recorded — never once per time missed.
04 — Boxes

Light where it can be. Your GPUs where it must be.

A light box is a call to what is already up — a model, a function, people's phones: seconds, no container, no machine to wait for. A cluster box is work placed on your machines, for as long as it takes.

Light · seconds, no container
model

Ask a model

An Eos deployment, or an assistant with its instructions, tools and memory. Text, or the JSON fields you ask for — each one an output the next boxes read. Photos too, for a model that sees.

classify

Classify

The model picks one of your labels, with a confidence and a reason. Below your threshold the label is uncertain, so a person can decide what a rule cannot.

function

Function

A function of the workspace, or code written right in the box — Python or Node. JSON in, JSON out, in milliseconds once it is up.

notify

Notify

A title and a message to the app's inbox, a push on the phone, and Telegram when the person linked it.

condition

Condition

If / else, or several ways: the first that holds is taken, and the boxes after it follow that way.

Cluster · containers on your machines
run

A run

Any container on your machines — GPUs, hours, many files — with the execution's drive, and outputs it writes as key=value lines.

agent

An agent

An Anemoi agent's run, under its policy, budgets and approvals, with its signed receipt listed in the execution.

workflow

A sub-workflow

Another workflow of the workspace, waited for, its outputs read as the box's.

05 — People

People in the loop, where it matters.

Waiting for a person costs nothing: the workflow waits, and no machine is held meanwhile.

  • NotifyThe app's inbox, always; a push on the phone, unless it is the person's quiet hours; their Telegram when they linked it. Tapping the notice opens the execution.
  • ApprovalA person decides before the workflow goes on: approvers by role or by name, a day to decide by default, up to a week. Denied or not decided, the box fails.
  • Wait for an eventThe execution waits for an event sent to it — from its page, astra or the API — and reads its data as outputs. Or simply waits, a second to a week.
  • Error pathA box that runs only when one before it fails: tell someone why, clean up. The execution still says it failed — an error path reports a failure, it never hides one.
  • UncertainWhen Classify is not sure enough, its label is uncertain: a way of its own, to a notice or an approval, instead of a wrong guess acted on.
06 — Durable

It finishes what it started. Within the limits you set.

  • A machine goes awayA run whose machine is lost is placed on another. Boxes already finished never run again; the execution goes on from where it was.
  • A box failsIt is tried again — twice by default, up to ten times, with a pause you choose — and each box has its own time limit. Retry a failed box by hand, and the execution resumes from it.
  • At onceSet how many executions run together. The others wait their turn, oldest first, or are refused — a caller is told the workflow is busy.
  • Who it runs asA person: whoever ran it, whoever made the trigger's address, or the workflow's owner for a schedule — with that person's access. When they lose it, their address stops working until someone who may makes it again.
  • Within its workspaceEverything a workflow names — models, assistants, functions, agents, drives, other workflows — is of its own workspace; anything else is refused when it is written.
  • From your assistantIn the app or on Telegram, your assistant runs a workflow you ask for and follows it; its result comes back to that chat. One that uses the machines waits for your confirmation. Over MCP, Claude, ChatGPT and Cursor do the same.
07 — Recipes

Start from one that works.

Whole workflows, ready to use: pick one, choose the model or assistant it asks, and change any box. Each says what it needs from the workspace.

card-spending

Card spending

Your bank's purchase notice arrives; a model reads the amount and the merchant, a box files it in a category, and a purchase over your limit is told to you on your phone and Telegram.

health-report

Health report

Your phone's automation — an iPhone Shortcut — sends the day's numbers; your assistant reads them with what it remembers of you and answers on Telegram.

answer-api

Workflow as an API

A POST with a question waits for its answer: a condition checks the input, a model answers, and the call gets the outputs as JSON — in one request.

morning-brief

Morning brief

Every day at the time you choose, your assistant writes a short brief from your notes and memory and sends it to your phone.

with-error-path

A job with an error path

A container does the heavy part on your machines; if it fails, the box after it tells you why — and the workflow still says it failed.

08 — Privacy

What stays on your machines.

The same rule as everything Astralyx builds: what is yours — models, data, files, functions — stays on the machines that are yours.

  • Models, functions, runsOn your machines. A light box's question reaches your model through Astralyx, in memory only, over the connection your machine opened; the prompt and the answer are written nowhere but the box's outputs.
  • What an execution keepsIts event (at most 128 KiB), each box's state and its outputs — small by design: 16 KiB for a light box, 4 KiB for a run. Big things belong on a drive, with their path in the event.
  • FilesOn the execution's drive, on your machines — a folder of a drive of yours, if you name one.
  • A trigger's addressIts secret is shown once. Its last calls are kept for 30 days — when, the answer's status, the execution started — never what a call carried.
  • What leaves on purposeA notify box's title and message go to your inbox, your phone and, if you linked it, Telegram: write in them what you would put in a notification.
09 — Next

What we are building next.

None of this is available yet.

  • For each itemA box that runs once per item of a list — each transaction of a statement, each machine of a pool.
  • A table per workspaceHistory a workflow writes and reads back — transactions, health numbers — kept in your workspace.
  • More triggersHome Assistant and MQTT, e-mail arriving, files arriving on a drive, and events of the cluster itself. Until then, most of these can call a webhook.
  • Camera recipesRecipes for Frigate: an alert and its snapshot, described by a model that sees, and you told when it matters.
  • More cluster boxesMulti-machine jobs, notebooks, evaluations and benchmarks — with an agent doing the work and a supervisor checking it, in a loop.
10 — FAQ

Questions we are asked.

Is it like the automation tools I know?

In shape, yes: something happens, boxes run, people are told. The difference is where the work is done: the models, functions, runs and agents are yours, on your machines, and a box can be hours of GPU work as easily as a one-second call. If what you need is mostly to connect many hosted apps to each other, with no models or machines of your own, a hosted automation tool is the better choice.

Does a workflow need a GPU?

No. Light boxes call what is already up: a small model served with Eos on CPUs answers Ask a model and Classify, and a function runs on any machine. GPUs are for the boxes that need them.

Can my product call a workflow and get an answer?

Yes: an HTTP trigger in sync mode is the workflow as an API. The call waits — 60 seconds by default, up to 90 — and is answered with the workflow's outputs as JSON. Past the wait, it is answered with the execution to look up later.

What happens if a machine goes down mid-workflow?

Nothing is lost. A run on that machine is placed on another, boxes already finished do not run again, and the execution goes on. Each box's attempts are on the execution's page.

Can my AI assistant start a workflow?

Yes: over MCP, Claude, ChatGPT, Cursor and other assistants list your workflows and start one as you, once you confirm it in the console (how to connect). In the app and on Telegram, your own assistant does it from the chat — give it the Workflows area of its Astralyx tools — and tells you the result there when it ends.

Can I write a workflow as code?

Yes. The editor's YAML tab is the workflow itself; astra iris workflows apply -f applies a file, and Python builds one with from astralyx.iris import Workflow. All of them write the same object.

How is it priced?

Iris is in early access, as the other products are. Its runs and agents count like any other work on your machines; tell us what you want to automate and we will work out terms with you.

Early access

Let your machines answer when something happens.

Start from a recipe, give it an address or a time, and watch every box of every execution.