AwaitIO
vs

AwaitIO vs Windmill

Windmill runs scripts and workflows. AwaitIO is one function that awaits a person.

Windmill is an open-source developer platform for internal code. Scripts in TypeScript, Python, Go, SQL, Bash and more become APIs, background jobs, workflows and UIs. The UIs come from a separate builder: low-code, or full-code with React or Svelte frontends that call Windmill scripts.

ScriptsTSrefund_orderPYsync_invoicesSQLmonthly_report
refund_ordernotify_slack
order_idRun
Windmill. Write scripts on its platform, then build a UI on top of them.
refundOrderAction.ts
const email = await io.input.email('Customer email');
const orders = await db.order.findMany(…);
await io.select.table('Orders', { data: orders });
Customer email[email protected]Continue
AwaitIO. Write the steps as a function. Every await becomes a form.

Why developers pick AwaitIO

await io.input.email('Email')
Email

One function that awaits a person. In Windmill a person’s input is a flow step or an app built on top. In AwaitIO it is one await io.input line in the function.

Your server
Your Node app
/api/tools

No platform next to your app. Windmill is a platform of its own, on its cloud or your servers. AwaitIO runs inside the Node app you already have.

import { db } from '../db'
import { refunds } from '../services'
await refunds.issue(order.id);

Your code, called directly. Windmill scripts run on its workers, apart from your app. An AwaitIO action imports your Prisma client and services and calls them.

src/actions/refundOrderAction.tsresendReceiptAction.tsdb.tsservices/

Plain files in your repo. Windmill keeps scripts in its workspace and syncs them to git. An AwaitIO action is a TypeScript file next to the rest of your code.

Pick refund reason from a listApproved
const email = await io.input.email('Email');
- const reason = await io.input.text('Reason');
+ const reason = await io.select.single('Reason', {
+ options: refundReasons,
+ });

Form and logic in one diff. In Windmill the UI is built in a separate app builder. In AwaitIO the form, the logic and any custom component change in one pull request.

const email: stringconst email = await io.input.email()

Typed from the form to the database. What a person enters comes back typed. Rename a field and the compiler shows every tool that uses it.

per seat
one price

One price for the whole team. AwaitIO is free for small teams. Above that it is one flat monthly price per organization, not per seat.

Your toolsOn, in your own app

Nothing else to keep running. Windmill brings its own server, workers and database. AwaitIO is a package in your app, so the tools run wherever the app runs.

At a glance

AwaitIOWindmill
Each tool is a file in your own repoYesIn part
Runs inside your own app, no separate platformYesNo
Calls your own services and database client directlyYesIn part
A form in the middle of a function, with one awaitYesIn part
100 % in code, you never leave your editorYesIn part
Your own UI components, one React file eachYesIn part
Your own theme for the whole UIYesIn part
Your own layout componentsYesIn part
Run the tools from a phone, in the browserYesYes
Scripts in many languages: Python, Go, SQL, BashNoYes
Workflows and scheduled background jobsNoYes

A half-filled circle means only on some plans or with extra setup.

Which one fits

Pick

Windmill if

  1. 01You need many languages: TypeScript, Python, Go, SQL, Bash.
  2. 02Most of the work is background jobs and multi-step workflows.
  3. 03You want an open-source platform for all of your internal scripts.
Pick

AwaitIO if

  1. 01Your tool is a task a person runs: look something up, check it, confirm, done.
  2. 02You want one action to be one function, with the UI coming from the same code.
  3. 03You want it inside your existing Node app, calling your own services directly.

Write your first tool today.

An async function, a few await calls, and the form is in the browser.

AwaitIO vs Windmill: the full comparison

Last updated October 25, 2026

What is Windmill?

Windmill is an open-source developer platform for internal code.

You write scripts in TypeScript, Python, Go, SQL, Bash and other languages. Windmill turns each script into an API endpoint, a background job and a form to run it by hand.

Scripts chain into flows: workflows with branches, loops, retries and steps that wait for an approval.

Jobs run on schedules or from webhooks. Workers execute them, apart from your own app.

For UIs there is an app builder. You build the screen in a low-code editor, or write a full-code frontend in React or Svelte that calls Windmill scripts.

Windmill runs on Windmill Cloud or on your own servers. It calls itself an open-source alternative to Airplane, Superblocks and Retool, and many Airplane users moved to it.

What is AwaitIO?

AwaitIO is a framework for internal tools written as code. An action is an async TypeScript function in your own repo.

Every await io.input call asks a person for something and waits for the answer. The browser shows the form, the person fills it in, and your function goes on with the value.

The same Node process that runs your app serves the UI. There is no platform to run next to it, no workers and no database of its own.

AwaitIO ships more than 20 components: inputs, selects, displays, a confirm and a layout. Anything missing is one React file you register next to them.

Key differences

Both tools are for developers who would rather write code than drag components. Windmill is a broad platform for all of your internal scripts. AwaitIO does one thing: a function that asks a person and waits.

A platform or a package

Windmill is a platform you run or rent. It has its own server, workers, database and web editor.

AwaitIO is a package you add to the Node app you already have. app.listen() starts your actions and the UI together.

There is nothing extra to deploy, upgrade or monitor. The tools run wherever your app runs.

Asking a person

In Windmill a script takes its inputs up front, as a generated form. Asking in the middle means a flow with an approval step, or an app built around the scripts.

In AwaitIO asking is a line of code. await io.input.text() shows a form. await io.select.table() lets a person pick rows. await io.confirm() asks before something irreversible.

The action reads top to bottom like a script. Branches, loops and error handling are plain TypeScript, with no flow editor in between.

Progress on long tasks

An action that loops over hundreds of records shows its progress with ctx.loading.

ctx.loading.start() sets a label and the number of items. ctx.loading.completeOne() moves the bar after each one.

The person sees how far it got. There is no frontend code behind it.

Built-in components

AwaitIO ships eight inputs: text, email, URL, textarea, number, boolean, date, and date and time.

It ships three selects: single, multiple and a table to pick rows from.

It ships eight displays: heading, HTML, image, link, Markdown, metadata, object and table. A confirm and a layout complete the set.

Each one is its own package. You install only the ones you use.

Where the code lives

Windmill stores scripts in its workspace. You can edit them locally and sync them with git through its CLI.

An AwaitIO action is a plain file in your repo. It goes through code review, it is checked by the TypeScript compiler, and its history is in git.

Your data and your services

A Windmill script runs on a Windmill worker. It reaches your database through resources set up in Windmill, or through code you package for it.

An AwaitIO handler runs in your own process. It imports your Prisma client, your services and your utilities and calls them directly. Environment variables work as they are.

Extending the UI

In Windmill the UI is a separate app. You build it in the low-code builder, or write a whole React or Svelte frontend that calls the scripts.

In AwaitIO the whole UI stays in code, next to the logic. A component of your own is one React file with its props and the value it returns. You register it next to the built-in ones and await it like any io method.

The look comes from a theme package you can restyle. The page around the components comes from a layout component you can replace with your own. You never leave your editor.

Price model

Windmill is open source, with paid cloud and enterprise plans on top.

AwaitIO is free for small teams, commercial use included. Above that it is one flat monthly price per organization, not per seat. The details are on the pricing page.

Where Windmill is stronger

Windmill runs scripts in many languages. AwaitIO is TypeScript only.

Windmill has workflows, schedules, webhooks and background jobs. AwaitIO has none of these. An action runs when a person starts it.

Windmill is open source. AwaitIO’s source is public, and its terms are on the pricing page.

Windmill can be the one place for every internal script a company has. AwaitIO is only for tools a person runs.

An example: refunding an order

Support needs to refund an order. Someone types the order ID, checks the order, enters an amount and confirms.

In Windmill this is a script with the order ID and the amount as inputs. Showing the order first and confirming means a flow with an approval step, or an app built around the scripts.

In AwaitIO it is one action. await io.input.text() asks for the order ID. The action loads the order with your own database client and shows it with io.display.metadata().

Then await io.input.number() asks for the amount and await io.confirm() asks before the money moves. The action calls your payment service and returns a message for the person.

The whole tool is one function of about twenty lines, in one file, in your repo.

Who should choose which

Choose Windmill if most of the work is background jobs and workflows, or if your scripts are in many languages.

Choose Windmill as well if you want one open-source platform for all of your internal code.

Choose AwaitIO if your tool is a task a person runs: look something up, check it, confirm, done. You write it as one function in your existing Node app, and it calls your own services directly.

Some teams use both. Windmill runs the scheduled jobs, and AwaitIO runs the tools that support opens in the browser.

Moving from Windmill to AwaitIO

Start with a TypeScript script that a person runs by hand.

Its inputs become await io.input calls at the top of the action. io.group puts several of them on one screen.

Its body goes into the handler. Replace the Windmill resources with your own database client and services, imported from your app.

If the script was part of a flow with an approval step, the approval becomes await io.confirm() in the same function.

If an app showed the result, use io.display.table() or io.display.metadata() at the end of the action.

Keep scheduled jobs and workflows where they are. AwaitIO has no scheduler.

Register the action, open the AwaitIO UI from your own server and send the link to the team.

Side by side

How you build
AwaitIO

Write an async TypeScript function. Every await io.input call asks a person and waits for the answer.

Windmill

Write scripts, chain them into workflows, then build a UI on top.

Where it runs
AwaitIO

Inside your own Node app, on your own servers.

Windmill

Windmill Cloud, or your own servers.

Where the code lives
AwaitIO

In your repo, with code review, types and git history.

Windmill

Scripts stored in Windmill.

How the UI is made
AwaitIO

Comes from the code. Your own Node process serves it.

Windmill

A separate builder: low-code, or React and Svelte frontends calling Windmill scripts.

Open source
AwaitIO

No. The source code is public. The terms are on the pricing page.

Windmill

Yes.

FAQ

Is AwaitIO a Windmill alternative?

For tools a person runs, yes. Each tool is an async TypeScript function in your own repo that awaits the answers. For background jobs and workflows, no.

Does AwaitIO run scheduled jobs or workflows?

No. An action runs when a person starts it. Keep scheduled jobs in a job runner or a workflow platform.

Does AwaitIO support Python, Go or Bash?

No. AwaitIO actions are TypeScript on Node only.

Can I self-host AwaitIO?

AwaitIO always runs inside your own Node app, on your own servers. There is no separate platform to host.

Is AwaitIO open source like Windmill?

The source of AwaitIO is public. It is free for small teams, and the terms are on the pricing page.

Can I use AwaitIO and Windmill together?

Yes. They do not depend on each other. Some teams keep Windmill for jobs and workflows and write the tools people run in AwaitIO.

Does AwaitIO charge per seat?

No. It is free for small teams and one flat monthly price per organization above that. The pricing page has the details.

AwaitIO is free for small teams, made possible by companies and people who sponsor it.

Become a sponsorSee pricing