TechSetupGuides
Intermediatelow-codeno-codeinternal-toolsnodejsnestjsreacttypescriptpostgresqldockerkubernetesaiworkflow-automation

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.

  1. 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.

  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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.78 or https://tooljet.example.com). Must start with http:// or https://.
    • 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 connection
    • NODE_ENV: Set to production for 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 notifications
    • DISABLE_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
  9. 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
  10. 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}}
  11. Step 11

    Building your first app

    Create a simple CRUD application to get familiar with ToolJet:

    1. Create app: From the dashboard, click "Create new app". The visual builder opens with an empty canvas.

    2. Add data source: Click "Data Sources" → "Add new" → Select "ToolJet Database" or connect external database. For ToolJet DB, create a table (e.g., products with columns name, price, stock).

    3. Add query: Click "Queries" → "Add new query" → Select your data source. Write query: SELECT * FROM products ORDER BY created_at DESC.

    4. Add table component: Drag "Table" from component library onto canvas. In properties panel, set "Data" to {{queries.getProducts.data}}.

    5. Add interactivity: Add a "Button" component. In button's onClick event, add action → "Run Query" → Create new query for insert/update/delete.

    6. 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}};
  12. 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
  13. 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:

    1. Pull the new LTS image
    2. Stop and remove old container
    3. 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
  14. 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_HOST to https:// 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=true and 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
  15. 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
  16. 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
  17. 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

0 people marked this as worked·Sign in to mark your own.

Sign in to join the discussion.

No comments yet.