AwaitIO
vs

AwaitIO vs ToolJet

ToolJet is open-source drag-and-drop. AwaitIO is just code.

ToolJet is an open-source low-code builder for internal tools. You drag components onto a canvas and connect them to your data. It calls itself the open-source alternative to Retool. It now also builds apps and agents from natural language.

TableButtonText inputSelectChart
query1
Refund
ToolJet. Drag components onto a canvas, then wire each one to a query.
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

Write a function, not a canvas. No components to drag in ToolJet’s editor. Every await io.input call shows a form and waits for the answer.

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

The tool lives in your repo. A ToolJet app lives in ToolJet, in its own format. An AwaitIO action is a TypeScript file next to the rest of your code.

Your server
Your Node app
/api/tools

Runs inside your own app. Self-hosted ToolJet is one more service to run next to your app. AwaitIO runs in your own Node process.

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

Your code, called directly. No data sources to set up in another editor. An action imports your Prisma client and services and calls them.

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,
+ });

Reviewed like any other code. A change to a tool is a pull request with a diff, types and git history, like the rest of the app.

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. ToolJet’s paid plans grow with your users. AwaitIO is free for small teams and one flat monthly price per organization above that.

Your toolsOn, in your own app

Nobody can switch it off. The tools run in your own app, so no platform change, price change or shutdown can take them away.

At a glance

AwaitIOToolJet
Each tool is plain TypeScript in your own repoYesNo
Runs inside your own app, on your own serversYesIn part
Calls your own services and database client directlyYesNo
100 % in code, you never leave your editorYesNo
Your own UI components, one React file eachYesIn part
Your own theme for the whole UIYesIn part
Your own layout componentsYesNo
Build tools without writing codeNoYes
Generate an app from a plain-text descriptionNoYes
Run the tools from a phone, in the browserYesYes

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

Which one fits

Pick

ToolJet if

  1. 01People who do not write code build the tools.
  2. 02You want a free, self-hosted visual builder.
  3. 03You want 50+ integrations ready to use.
Pick

AwaitIO if

  1. 01Your developers would rather write a function than drag components.
  2. 02You want every tool reviewed, typed and versioned in your repo.
  3. 03You want to call your own services directly, not through connectors in another editor.

Write your first tool today.

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

AwaitIO vs ToolJet: the full comparison

Last updated October 25, 2026

What is ToolJet?

ToolJet is an open-source low-code platform for internal tools. Its first big launch, in 2021, called it the open-source alternative to Retool.

You build an app in ToolJet’s visual editor. You drag tables, forms and buttons onto a canvas. Then you connect them to your data through queries on data sources you set up in ToolJet.

ToolJet ships more than 50 integrations: databases, APIs and SaaS tools you can query from the editor.

You can host ToolJet yourself for free, or pay for ToolJet’s cloud.

Today ToolJet also builds apps and agents from natural language. You describe what you need and AI builds 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 separate service to host and no editor to log in to.

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

Key differences

Both tools give your team buttons and forms on top of your data. Both can run on your own servers. They differ in how you build the tool and where it lives.

Drag-and-drop or a function

In ToolJet you build the screen first. You place components on a canvas, then wire each one to a query and to the others.

In AwaitIO you write the steps of the task in order. await io.input.email() asks for an email. await io.select.table() lets a person pick rows. The screens follow from the code.

A tool in AwaitIO reads top to bottom like a script. Branches, loops and error handling are plain TypeScript.

Getting started

With ToolJet you start a ToolJet server or sign up for its cloud. Then you add data sources and start building in the editor.

With AwaitIO you install the awaitio package from npm into the app you already have. You pass it a folder of actions.

Every file in that folder becomes an action, and its path becomes the URL. Folders become the navigation.

One tool, step by step

Say support needs to refund an order. Your team opens Refund order in the browser and sees a form with one field: Order ID.

In AwaitIO that form is one line, await io.input.text(). The function then loads the order with your own database client.

It shows the order with a display component and asks for a confirmation. Then it calls the refund service your app already has.

In ToolJet the same tool is a screen with a text field, a query, a table, a button and the wiring between them, built in its editor.

Both work. The AwaitIO version is one short function that any developer on the team can read and review.

Where the tool lives

A ToolJet app lives in ToolJet, in ToolJet’s own format. Even when you host ToolJet yourself, the app sits in ToolJet’s database, outside your codebase.

An AwaitIO action is a file in your repo. It goes through code review. The TypeScript compiler checks it. Its history is in git.

When you rename a field in your database, the compiler points at every tool that uses it. Nothing breaks quietly in another editor.

Your data and your services

ToolJet reaches your data through data sources: database connections and API endpoints you set up in ToolJet. Logic that already exists in your app is often written again in queries.

An AwaitIO handler runs in your own process. It imports your Prisma client, your services and your utilities and calls them directly.

Environment variables and secrets work as they already do for your app. There is no second place to keep credentials.

Extending the UI

In ToolJet the UI is built from ToolJet’s components in ToolJet’s editor. Custom components and themes take extra setup next to the editor.

In AwaitIO the whole UI stays in code. 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, @awaitio/theme-default, which you can restyle. The page around the components comes from a layout component, @awaitio/layout-basic, which you can replace with your own.

You never leave your editor.

Hosting

ToolJet can run on your own servers. It is a separate application with its own database, so it is one more service to deploy, update and back up.

AwaitIO runs inside your own Node app. It has no database of its own. Deploying your app deploys the tools.

Nothing can be switched off from outside.

Open source and public source

ToolJet’s source code is open. You can read it, fork it and host your own copy.

AwaitIO’s source code is public too. You can read every line of the code that runs in your process.

AwaitIO is not open source. Small teams use it for free, commercial use included. The terms are on the pricing page.

Price model

ToolJet is free to host yourself. Its cloud and its paid plans are priced by the number of users.

AwaitIO is free for small teams, commercial use included. Above that it is one flat monthly price per organization, not per seat.

Free or paid, it is the same software. The details are on the pricing page.

Where ToolJet is stronger

People who do not write code can build tools in ToolJet. AwaitIO is for developers only.

ToolJet ships more than 50 integrations ready to use. In AwaitIO you call your data with the code you already have.

ToolJet can generate apps and agents from natural language. In AwaitIO a developer writes the code.

ToolJet’s source is open. Anyone can read it, change it and host it.

Who should choose which

Choose ToolJet if people without a developer build the tools, or if you want a free, self-hosted visual builder with many integrations.

Choose AwaitIO if a developer writes the tool. You get it in your repo, reviewed and typed like the rest of the app, running in your own process.

Many teams that pick AwaitIO used to write a CLI script or a SQL query and run it for support themselves. AwaitIO turns that script into a tool anyone on the team can run in the browser.

Moving from ToolJet to AwaitIO

Start with one app that a developer already maintains. Write its steps as one action: the inputs it asks for, the queries it runs and what it shows at the end.

Use your existing database client instead of the ToolJet queries. The action runs next to your API, so it can reuse the code your app already has.

Move the JavaScript you wrote inside ToolJet into the handler. It becomes plain TypeScript with types, tests and review.

Use ctx.loading to show progress when the action goes through a long list.

Register the action, open the AwaitIO UI from your own server and send the link to the team. Move the next app when the first one works.

Once the last app is moved, you can shut the ToolJet server down. There is one service less to run.

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.

ToolJet

Drag components onto a canvas, or describe the app in natural language.

Where it runs
AwaitIO

Inside your own Node app, on your own servers.

ToolJet

Self-hosted, or ToolJet’s cloud.

Where the code lives
AwaitIO

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

ToolJet

On the ToolJet platform, in its own format.

How the UI is made
AwaitIO

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

ToolJet

Built from its components in a visual editor.

Open source
AwaitIO

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

ToolJet

Yes.

FAQ

Is AwaitIO a ToolJet alternative?

Yes, for teams where developers build the internal tools. AwaitIO replaces the drag-and-drop editor with TypeScript functions in your own repo.

Is AwaitIO open source like ToolJet?

The source code of AwaitIO is public, so you can read every line. The terms of use are on the pricing page.

Can I self-host AwaitIO?

AwaitIO always runs inside your own Node app, on your own servers. There is no separate server to set up next to it.

Can people who do not code build tools in AwaitIO?

No. Every AwaitIO tool is written in code by a developer. Once it exists, anyone on the team can run it in the browser.

Does AwaitIO have a drag-and-drop editor?

No. AwaitIO is just code. The screens come from the await calls in your function.

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.

Can I use AwaitIO and ToolJet together?

Yes. They do not depend on each other. Some teams keep ToolJet for tools built without code and write developer-owned tools in AwaitIO.

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

Become a sponsorSee pricing