ToolJet: Open-source low-code platform for internal tools
Build and deploy internal tools, dashboards, business applications, workflows and AI agents with a visual drag-and-drop interface, 50+ data source integrations, and self-hosted deployment options.
- Step 1
What is ToolJet?
ToolJet is an open-source low-code framework designed to build and deploy internal tools with minimal engineering effort. It serves as the foundation of ToolJet AI, an enterprise app generation platform. With ToolJet's drag-and-drop frontend builder, you can create complex, responsive internal applications, dashboards, and workflows within minutes. The platform supports 50+ data source integrations including databases (PostgreSQL, MongoDB, Elasticsearch), SaaS tools (Stripe, Slack, Google Sheets, Airtable, Notion), and cloud storage (S3, GCS, Minio). With 37,900+ GitHub stars, ToolJet is a leading open-source alternative to commercial low-code platforms.
- Step 2
Technology stack
ToolJet is built on a modern full-stack architecture using JavaScript/TypeScript throughout:
Backend:
- Node.js runtime
- NestJS 11 (progressive TypeScript framework)
- TypeORM (database ORM with PostgreSQL support)
- PostgreSQL (primary database for app definitions, credentials, user data)
- Bull/BullMQ (job queue for background tasks)
- Passport.js (authentication strategies)
- WebSockets (real-time collaboration)
- AI SDK integrations (Anthropic, OpenAI, Google, Mistral)
- JWT for secure token-based auth
Frontend:
- React 18 (component library)
- TypeScript 5
- Radix UI (accessible component primitives)
- CodeMirror 6 (in-app code editor for JS/Python)
- DND Kit (drag-and-drop interactions)
- Emoji Mart (emoji picker)
- Custom visual builder for app composition
Infrastructure:
- Docker & Docker Compose (containerization)
- Kubernetes support (AWS EKS, GCP GKE, Azure AKS)
- PostgreSQL 13+ for data persistence
- AES-256-GCM encryption for credentials
Key capabilities:
- Built-in ToolJet Database (no-code PostgreSQL wrapper)
- 45+ UI components (tables, charts, forms, lists)
- Multi-page applications
- Multiplayer editing (real-time collaboration)
- Custom JavaScript and Python execution
- Version control with structured release cycles
- SSO support (SAML, OAuth, OIDC)
- Granular role-based access control
Backend: ├── Node.js ├── NestJS 11 (TypeScript framework) ├── TypeORM (PostgreSQL ORM) ├── PostgreSQL 13+ ├── Bull/BullMQ (job queues) ├── Passport.js (auth) ├── WebSockets └── AI SDK (Anthropic, OpenAI, Google, Mistral) Frontend: ├── React 18 ├── TypeScript 5 ├── Radix UI (components) ├── CodeMirror 6 (code editor) ├── DND Kit (drag-and-drop) └── Custom visual builder Infrastructure: ├── Docker / Docker Compose ├── Kubernetes (EKS, GKE, AKS) ├── PostgreSQL 13+ └── AES-256-GCM encryption - Step 3
Prerequisites
Before installing ToolJet, ensure you have the following depending on your deployment method:
For Docker deployment (recommended):
- Docker 20.10+
- Docker Compose 1.29+
- 2GB RAM minimum (4GB+ recommended for production)
- PostgreSQL database (can use built-in or external)
For development from source:
- Node.js 18.x or 20.x LTS
- npm 9+ or yarn 1.22+
- PostgreSQL 13+
- Git
For production Kubernetes:
- Kubernetes cluster (1.21+)
- Helm 3
- kubectl configured
- Persistent storage provisioner
# Check Docker installation docker --version docker-compose --version # For source builds, check Node.js version node --version # Should be 18.x or 20.x npm --version # Verify PostgreSQL (if using external database) psql --version # PostgreSQL 13+ required - Step 4
Quick start with Docker (Try ToolJet)
The fastest way to try ToolJet locally is using the all-in-one Docker image. This includes PostgreSQL and requires just one command. The container runs on port 80 and persists data in a Docker volume.
# Run ToolJet with embedded PostgreSQL docker run \ --name tooljet \ --restart unless-stopped \ -p 80:80 \ --platform linux/amd64 \ -v tooljet_data:/var/lib/postgresql/13/main \ tooljet/try:ee-lts-latest # Access ToolJet at http://localhost # Create your admin account on first launch - Step 5
Production deployment with Docker Compose
For production use, deploy ToolJet with Docker Compose using a proper environment configuration. Two options are available: with built-in PostgreSQL (easier) or with an external managed database (more scalable). The built-in option is recommended for most self-hosted deployments.
# Option 1: With built-in PostgreSQL (recommended) curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/docker/docker-compose-db.yaml mv docker-compose-db.yaml docker-compose.yaml mkdir postgres_data # Download and generate environment variables curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/docker/.env.internal.example curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/docker/internal.sh && chmod +x internal.sh mv .env.internal.example .env && ./internal.sh # Start ToolJet docker-compose up -d # Check logs docker-compose logs -f - Step 6
Production deployment with external PostgreSQL
For cloud-managed databases (AWS RDS, Google Cloud SQL, Azure Database), use the external PostgreSQL setup. This separates the application layer from the database for better scalability and managed backups.
# Download Docker Compose file for external database curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/docker/docker-compose.yaml # Download environment template and setup script curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/docker/external.sh curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/docker/.env.external.example && chmod +x external.sh mv .env.external.example .env && ./external.sh # The script will prompt for: # - PostgreSQL host # - PostgreSQL port # - Database name # - Database username # - Database password # Start ToolJet docker-compose up -d - Step 7
Development setup from source
To contribute to ToolJet or run the latest development version, clone the repository and run both the backend (Node.js/NestJS) and frontend (React) in development mode. This requires Node.js 18.x or 20.x and PostgreSQL 13+.
# Clone the repository git clone https://github.com/ToolJet/ToolJet.git cd ToolJet # Install dependencies npm install # Set up PostgreSQL database creatdb tooljet_dev # Copy environment template cp .env.example .env # Edit .env with your database credentials: # PG_HOST=localhost # PG_PORT=5432 # PG_USER=postgres # PG_PASS=your_password # PG_DB=tooljet_dev # Run database migrations npm run db:migrate # Start backend (runs on port 3000) cd server npm install npm run start:dev # In a separate terminal, start frontend (runs on port 8082) cd frontend npm install npm start # Access at http://localhost:8082 - Step 8
Environment configuration
ToolJet is configured via environment variables. Key variables include host/port settings, database credentials, security keys, and feature flags. The setup scripts auto-generate secure values for secrets.
Essential variables:
TOOLJET_HOST: Public URL (e.g.,http://12.34.56.78orhttps://tooljet.example.com). Must start withhttp://orhttps://.LOCKBOX_MASTER_KEY: Encryption key for credentials (auto-generated, 32 bytes hex)SECRET_KEY_BASE: Session secret (auto-generated)PG_HOST,PG_PORT,PG_USER,PG_PASS,PG_DB: PostgreSQL connectionNODE_ENV: Set toproductionfor prod deployments
Optional features:
ENABLE_TOOLJET_DB: Enable built-in no-code database (default: true)SSO_*: SSO configuration (Google, GitHub, SAML, OIDC)SMTP_*: Email configuration for invites and notificationsDISABLE_SIGNUPS: Restrict new user registration (default: false)
# Example .env configuration TOOLJET_HOST=https://tooljet.example.com LOCKBOX_MASTER_KEY=<auto-generated-32-byte-hex> SECRET_KEY_BASE=<auto-generated-secret> # PostgreSQL PG_HOST=db.example.com PG_PORT=5432 PG_USER=tooljet PG_PASS=secure_password PG_DB=tooljet_production # Features ENABLE_TOOLJET_DB=true DISABLE_SIGNUPS=false NODE_ENV=production # SMTP (optional) SMTP_DOMAIN=smtp.gmail.com SMTP_PORT=587 SMTP_USERNAME=your-email@gmail.com SMTP_PASSWORD=app-password - Step 9
Kubernetes deployment
For production-grade scalability and high availability, deploy ToolJet on Kubernetes using Helm charts. Supports AWS EKS, Google GKE, Azure AKS, and self-hosted clusters. Requires a persistent volume for PostgreSQL (or use an external managed database).
# Add ToolJet Helm repository helm repo add tooljet https://tooljet.github.io/tooljet-helm helm repo update # Create namespace kubectl create namespace tooljet # Install with Helm (with built-in PostgreSQL) helm install tooljet tooljet/tooljet \ --namespace tooljet \ --set image.tag=ee-lts-latest \ --set ingress.enabled=true \ --set ingress.hosts[0].host=tooljet.example.com \ --set postgresql.enabled=true \ --set postgresql.persistence.size=10Gi # Or use external database helm install tooljet tooljet/tooljet \ --namespace tooljet \ --set postgresql.enabled=false \ --set externalDatabase.host=db.example.com \ --set externalDatabase.user=tooljet \ --set externalDatabase.password=secure_password \ --set externalDatabase.database=tooljet # Check deployment status kubectl get pods -n tooljet kubectl get svc -n tooljet - Step 10
Core features and capabilities
ToolJet provides a comprehensive platform for building internal tools:
Visual App Builder: 45+ built-in responsive components including tables (with pagination, sorting, filtering), charts (line, bar, pie), forms (with validation), lists, buttons, modals, file pickers, and progress bars. Drag components onto the canvas and configure via property panel.
ToolJet Database: Built-in no-code PostgreSQL database with GUI table editor. Create tables, define relationships, and query directly from your apps without writing SQL.
Data Sources: 50+ integrations out of the box:
- Databases: PostgreSQL, MySQL, MongoDB, Elasticsearch, Redis, Firestore, DynamoDB
- APIs: REST, GraphQL, OpenAPI/Swagger with OAuth2
- SaaS: Stripe, Slack, Google Sheets, Airtable, Notion, HubSpot, Salesforce
- Cloud Storage: AWS S3, Google Cloud Storage, Azure Blob, Minio
Query Editors: Visual no-code editors for all data sources. For databases, use GUI query builder or write SQL. For APIs, configure endpoints, headers, auth, and request bodies.
JavaScript & Python Code: Execute custom code anywhere in your app. Transform query results, validate inputs, implement business logic. Code runs server-side in a sandboxed environment.
Multiplayer Editing: Real-time collaborative app building. See other developers' cursors and changes live. Built on WebSockets.
Version Control: Create versions (releases) of your apps. Roll back to previous versions. Deploy specific versions to production while continuing development.
Access Control: Granular permissions at group and app level. Define user groups, assign permissions (view/edit), and control who can access which apps and data sources.
Multi-Page Apps: Build applications with multiple pages and navigation. Share data and queries across pages.
Workflows: Automate business processes with visual workflow builder. Trigger on events, schedule cron jobs, chain API calls, and send notifications.
// Example: Transform query results with JavaScript // Query returns user list, transform to add full name const users = queries.getUsers.data; const transformed = users.map(user => ({ ...user, fullName: `${user.firstName} ${user.lastName}`, isActive: user.status === 'active' })); return transformed; // Example: Conditional component visibility // Show delete button only for admins {{globals.currentUser.role === 'admin'}} // Example: Dynamic table query with filters SELECT * FROM orders WHERE status = {{components.statusDropdown.value}} AND created_at >= {{components.startDatePicker.value}} LIMIT {{components.limitInput.value}} - Step 11
Building your first app
Create a simple CRUD application to get familiar with ToolJet:
-
Create app: From the dashboard, click "Create new app". The visual builder opens with an empty canvas.
-
Add data source: Click "Data Sources" → "Add new" → Select "ToolJet Database" or connect external database. For ToolJet DB, create a table (e.g.,
productswith columnsname,price,stock). -
Add query: Click "Queries" → "Add new query" → Select your data source. Write query:
SELECT * FROM products ORDER BY created_at DESC. -
Add table component: Drag "Table" from component library onto canvas. In properties panel, set "Data" to
{{queries.getProducts.data}}. -
Add interactivity: Add a "Button" component. In button's onClick event, add action → "Run Query" → Create new query for insert/update/delete.
-
Preview and deploy: Click "Preview" to test. When ready, click "Release" → "Create version" → "Deploy". Your app is live.
-- Example queries for a products CRUD app -- Get all products SELECT * FROM products ORDER BY created_at DESC; -- Create product (triggered by form submit) INSERT INTO products (name, price, stock) VALUES ( {{components.nameInput.value}}, {{components.priceInput.value}}, {{components.stockInput.value}} ); -- Update product (triggered by edit button) UPDATE products SET name = {{components.nameInput.value}}, price = {{components.priceInput.value}}, stock = {{components.stockInput.value}} WHERE id = {{components.productTable.selectedRow.id}}; -- Delete product (triggered by delete button) DELETE FROM products WHERE id = {{components.productTable.selectedRow.id}}; -
- Step 12
Backup and restore (Docker)
For Docker deployments with built-in PostgreSQL, use the official backup script to create backups and restore from them. Backups include all application definitions, user data, and encrypted credentials.
# Download backup/restore script curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/backup-restore.sh && chmod +x backup-restore.sh # Run interactive backup/restore wizard ./backup-restore.sh # The script will prompt to: # 1. Create a new backup # 2. Restore from existing backup # 3. List available backups # Backups are saved as .tar.gz files with timestamps # Store backups securely off-server for disaster recovery - Step 13
Upgrading ToolJet
Always use LTS (Long Term Support) versions for production. LTS versions receive stability fixes, security patches, and performance improvements without breaking changes.
Docker upgrade:
- Pull the new LTS image
- Stop and remove old container
- Start new container with same volume mounts
Kubernetes upgrade: Update Helm chart to new version.
Important: Always backup before upgrading. Test upgrades in staging environment first.
# Docker upgrade process # 1. Backup first! ./backup-restore.sh # 2. Pull new LTS image docker pull tooljet/try:ee-lts-latest # 3. Stop current container docker-compose down # 4. Update image tag in docker-compose.yaml to ee-lts-latest # 5. Start with new image (data persists in volumes) docker-compose up -d # Kubernetes upgrade helm repo update helm upgrade tooljet tooljet/tooljet \ --namespace tooljet \ --set image.tag=ee-lts-latest \ --reuse-values - Step 14
Security best practices
Secure your ToolJet deployment:
Encryption: All data source credentials are encrypted at rest using AES-256-GCM with
LOCKBOX_MASTER_KEY. Never commit this key to version control.SSL/TLS: Always use HTTPS in production. Set
TOOLJET_HOSTtohttps://URL. Configure SSL termination at reverse proxy (nginx, Cloudflare) or load balancer.Database security: Use strong passwords, restrict PostgreSQL to private network, enable SSL connections for external databases.
Access control: Enable SSO (SAML, OIDC, OAuth) for enterprise environments. Disable password-based signups with
DISABLE_SIGNUPS=trueand manage users via SSO.Network isolation: Run ToolJet in private subnet, expose only via load balancer. Use VPC peering or VPN for database access.
Regular updates: Subscribe to security advisories and apply patches promptly.
# Generate strong LOCKBOX_MASTER_KEY (32 bytes = 64 hex chars) openssl rand -hex 32 # Generate SECRET_KEY_BASE openssl rand -hex 64 # Secure .env file permissions chmod 600 .env # Enable HTTPS-only TOOLJET_HOST=https://tooljet.example.com FORCE_SSL=true # Disable public signups (SSO only) DISABLE_SIGNUPS=true # PostgreSQL SSL connection PG_SSL_ENABLED=true PG_SSL_REJECT_UNAUTHORIZED=true - Step 15
Extending ToolJet with plugins
Create custom data source connectors using the ToolJet CLI. Plugins are Node.js modules that implement the connector interface. Use the CLI to scaffold, develop, and package custom integrations.
# Install ToolJet CLI npm install -g @tooljet/cli # Create a new plugin tooljet plugin create my-custom-api # Navigate to plugin directory cd my-custom-api # Implement connector logic in lib/index.ts # See docs: https://docs.tooljet.com/docs/contributing-guide/setup/tooljet-cli # Build plugin npm run build # The built plugin can be imported into ToolJet as a custom data source - Step 16
Deployment platforms
ToolJet supports deployment on all major cloud platforms and can be self-hosted on-premises:
Cloud marketplaces:
- AWS Marketplace: One-click deployment
- Azure Marketplace: Pre-configured VM images
Container platforms:
- Docker / Docker Compose (any Linux server)
- Kubernetes (AWS EKS, Google GKE, Azure AKS)
- OpenShift
- Google Cloud Run (serverless containers)
- AWS ECS / Fargate
VM deployments:
- AWS EC2 (with install script)
- DigitalOcean Droplets
- Google Compute Engine
- Azure Virtual Machines
Managed ToolJet Cloud: For fully managed hosting with automatic updates, backups, and support, use ToolJet Cloud at https://tooljet.com.
Deployment guides for each platform are available in the official documentation.
AWS Marketplace: https://aws.amazon.com/marketplace/pp/prodview-fxjto27jkpqfg Azure Marketplace: https://azuremarketplace.microsoft.com/marketplace/apps/tooljetsolutioninc1679496832216.tooljet Deployment docs: - Docker: https://docs.tooljet.com/docs/setup/docker - Kubernetes: https://docs.tooljet.com/docs/setup/kubernetes - AWS EC2: https://docs.tooljet.com/docs/setup/ec2 - Google Cloud Run: https://docs.tooljet.com/docs/setup/google-cloud-run - DigitalOcean: https://docs.tooljet.com/docs/setup/digitalocean - Step 17
Resources and community
Official documentation: https://docs.tooljet.com — Comprehensive guides for setup, data sources, components, and deployment.
GitHub repository: https://github.com/ToolJet/ToolJet — Source code, issues, feature requests, and contributions.
Community Slack: https://tooljet.com/slack — Get help, share use cases, and connect with other builders.
Tutorials and examples:
- Time Tracker Application: https://docs.tooljet.com/#quickstart-guide
- Build a CMS with MongoDB: https://blog.tooljet.com/build-cms-using-lowcode-and-mongodb/
- AWS S3 Browser: https://blog.tooljet.com/build-an-aws-s3-broswer-with-tooljet/
Roadmap: https://github.com/orgs/ToolJet/projects/15 — Track upcoming features and releases.
X (Twitter): https://twitter.com/ToolJet — Product updates and announcements.
License: AGPL-3.0 — Free to use and modify with source disclosure requirement.
Documentation: https://docs.tooljet.com GitHub: https://github.com/ToolJet/ToolJet Slack: https://tooljet.com/slack Twitter: https://twitter.com/ToolJet Roadmap: https://github.com/orgs/ToolJet/projects/15 Blog: https://blog.tooljet.com Cloud (managed): https://tooljet.com
Feature requests
Sign in to suggest features or vote on existing ones.
No feature requests yet.
Discussion
Sign in to join the discussion.
No comments yet.