ToolJet

Low-code platform for building and automating business tools

Automation & Workflows ★ 41k stars Medium setup AGPL-3.0

ToolJet is an open-source low-code framework to build and deploy internal tools and workflows. It offers a visual app builder, a workflow engine and many data source connectors.

Key features

  • Visual app and tool builder
  • Workflow automation engine
  • 50+ data source connectors
  • Granular access control

Pros & cons

Strengths

  • Rich connector library
  • Active development

Trade-offs

  • Heavy resource requirements

ToolJet replaces

Last reviewed Aug 26, 2026 · 938 words

Give ToolJet a 4 GB box, a real PostgreSQL, and a read-only database user, and you will have a working admin page (table, filter, edit form, save button) on top of a production database in under an hour, for zero licence cost. Retool charges about $10 per user per month at last check for the same result, and the catalogue's 2 GB minimum is the honest reason it is not simply better than Retool: this is a heavy stack, and it will make a 2 GB VPS miserable.

What you are actually installing

The ToolJet server is a Node application, and it needs PostgreSQL for its own state. Since the built-in "ToolJet Database" feature arrived, the standard deployment also runs PostgREST, which exposes that Postgres as a REST API the app builder can hit directly. So the compose file from the ToolJet docs is 3 services, and the first thing to do with it is replace the placeholder secrets:

openssl rand -hex 32   # LOCKBOX_MASTER_KEY, encrypts stored datasource credentials
openssl rand -hex 64   # SECRET_KEY_BASE, signs sessions

Set TOOLJET_HOST to the full public URL (https://tools.example.com), because OAuth callbacks and generated links use it, then put Caddy or Traefik in front for TLS. Lose LOCKBOX_MASTER_KEY and every saved database password in ToolJet is unrecoverable, so it goes in your password manager the day you generate it.

Use ToolJet Database for scratch tables, not truth

The built-in database is convenient: a spreadsheet-style table you create in the UI and query with no connection setup. It is fine for lookup lists, feature flags, or a small tracker that has no other home. It is the wrong place for anything another system depends on, because it lives inside ToolJet's own Postgres, is versioned with the app, and is awkward to reach from outside. For real data, connect your actual database and create a role that can do exactly what the app needs:

CREATE ROLE tooljet_ro LOGIN PASSWORD 'generate-this';
GRANT CONNECT ON DATABASE shop TO tooljet_ro;
GRANT USAGE ON SCHEMA public TO tooljet_ro;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO tooljet_ro;

Add UPDATE on the 1 or 2 tables the app edits and nothing more. A low-code tool with a superuser credential is how someone's "quick fix" button truncates a table. The 50-plus connectors (Postgres, MySQL, MongoDB, REST, GraphQL, S3, Google Sheets, Stripe, Slack, and so on) all share this pattern: the credential is the security boundary, so make it narrow. The Postgres-for-everything post has the wider argument for keeping the source of truth in one boring database.

Queries feed components, and JavaScript fills the gaps

The mental model is 3 layers. Queries fetch or write data against a connector. Components (tables, forms, charts, buttons) sit on a canvas and reference query results through {{ }} bindings, so a table's data property is {{queries.orders.data}}. Events wire them together: a button's click runs a query, a query's success shows a toast and refreshes another. When the bindings get awkward you write a JavaScript query, which is a plain function with access to every query and component on the page. Most useful internal tools are 4 queries and a transformation, and the builder makes that feel almost too easy.

Workflows are the other half of ToolJet: node-based jobs triggered on a schedule or a webhook, for the "every night, pull rows where status is stale and post to Slack" category. If that is most of your need, n8n is lighter and better at it; ToolJet's workflows shine when the job and the UI that manages it live in one place.

Know where the free tier ends

The code is AGPL-3.0 and everything above is free. At last check the enterprise licence gates the features that matter once a company grows around the tool: OpenID Connect and LDAP single sign-on, git sync of app definitions, audit logs, multiple environments with promotion, and white-labelling. Email login plus GitHub and Google sign-in are in the free build, and so are groups with per-app permissions, which is enough for a team of 10. Anyone building for a department with a compliance officer should price the licence before committing the department.

ToolJet or Appsmith

Appsmith is the closest rival at nearly the same star count (40,748 versus ToolJet's 40,766), and I would not overthink the choice. Appsmith's git integration and its JavaScript-first bindings are a little more mature; ToolJet ships the built-in database and the workflow engine, and its canvas is more forgiving for a first-time builder. Both are memory hungry for the same reason: bundled databases plus a large connector runtime. Whichever you pick, the migration story to the other is a rebuild, so spend a day prototyping the same page in each. The wider field is in the automation category.

What I'd do

ToolJet on a 4 GB VPS, its own Postgres on the same compose network, secrets generated and stored, Caddy in front. A dedicated read-mostly role in the real database, ToolJet Database only for tables nobody else needs, and a nightly pg_dump of ToolJet's Postgres because the app definitions live there and nowhere else on the free tier. If the department later needs SSO and audit logs, buy the licence or accept that the free build was the prototype; both are reasonable outcomes, and both beat a spreadsheet with 6 tabs and a macro.

Compare ToolJet

3 head-to-head comparisons.

Similar automation & workflows apps