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 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.
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.
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.
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.
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.
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 workflowsand Python'sfrom astralyx.iris import Workflowwrite. - 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.
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"# 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"}' \
--waitIts 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.
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.
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
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
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
A title and a message to the app's inbox, a push on the phone, and Telegram when the person linked it.
Condition
If / else, or several ways: the first that holds is taken, and the boxes after it follow that way.
A run
Any container on your machines — GPUs, hours, many files — with the execution's drive, and outputs it writes as key=value lines.
An agent
An Anemoi agent's run, under its policy, budgets and approvals, with its signed receipt listed in the execution.
A sub-workflow
Another workflow of the workspace, waited for, its outputs read as the box's.
Ask a model and Classify use your deployments and assistants. A deployment scaled to zero is woken for the box.
The Agent box runs an agent of yours; Approval boxes are decided like any approval in the workspace.
Runs are queued and placed on your machines like any other; functions are the workspace's own.
An assistant asked in a box brings the knowledge bases and memory you gave it, as it does in a chat.
A notebook as a box of a workflow.
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.
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.
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
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
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.
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
Every day at the time you choose, your assistant writes a short brief from your notes and memory and sends it to your phone.
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.
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.
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.
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.
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.