AI

OSSローコード・ビルダー比較:Budibase vs Appsmith vs ToolJet でRetoolを脱却する

オープンソースラボ編集部2026年6月14日

OSSローコード・ビルダー比較:Budibase vs Appsmith vs ToolJet でRetoolを脱却する

Retool(月$10/ユーザー〜)・OutSystems(月数十万円〜)・Bubble(月$29〜)に対して、Budibase(UI優先・低コード)・Appsmith(JS統合・React Native mobile)・ToolJet(軽量・Docker最小構成)はローコード内部ツールをOSSでセルフホストできます。

OSSローコードを選ぶ理由

  • コスト: Retool(月$10×20名 = $2,400/年)→ Budibase CE + VPSで$0
  • 管理画面・内部ツール: CRUD UIを数時間でゼロコード構築(PostgreSQL・REST API・Google Sheets接続)
  • データ主権: 顧客データ・社内データが外部SaaS(Retool Cloud)を通過しない
  • カスタムコンポーネント: ReactコンポーネントをUIライブラリに追加して独自ウィジェットを使用

主要ツールの概要

Budibase

2019年公開、Svelte/Node.js製のOSSです。GitHubスター23k+。UIビルダー・データソース接続・自動化(Automation)・ユーザー管理が1プラットフォームで完結する内部ツールビルダーです。PostgreSQL・MySQL・REST API・Google Sheets・S3・MongoDB・Airtable等を接続してCRUDアプリを数時間で構築できます。

# docker-compose.yml - Budibase CE
version: "3.8"
services:
  app-service:
    image: budibase/apps:latest
    restart: unless-stopped
    environment:
      SELF_HOSTED: "1"
      COUCH_DB_URL: http://budibase:${COUCH_DB_PASSWORD}@couchdb-service:5984
      WORKER_URL: http://worker-service:4002
      MINIO_URL: http://minio-service:9000
      MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY}
      MINIO_SECRET_KEY: ${MINIO_SECRET_KEY}
      INTERNAL_API_KEY: ${INTERNAL_API_KEY}
      JWT_SECRET: ${JWT_SECRET}
      LOG_LEVEL: info
    depends_on:
      - couchdb-service
      - minio-service

  worker-service:
    image: budibase/worker:latest
    restart: unless-stopped
    environment:
      SELF_HOSTED: "1"
      COUCH_DB_URL: http://budibase:${COUCH_DB_PASSWORD}@couchdb-service:5984
      MINIO_URL: http://minio-service:9000
      MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY}
      MINIO_SECRET_KEY: ${MINIO_SECRET_KEY}
      INTERNAL_API_KEY: ${INTERNAL_API_KEY}
      JWT_SECRET: ${JWT_SECRET}
      SMTP_HOST: smtp.sendgrid.net
      SMTP_PORT: "587"
      SMTP_USER: apikey
      SMTP_PASS: ${SENDGRID_KEY}
      SMTP_FROM_ADDRESS: noreply@yourcompany.com

  proxy-service:
    image: budibase/proxy:latest
    restart: unless-stopped
    ports:
      - "10000:10000"
    depends_on:
      - app-service
      - worker-service

  couchdb-service:
    image: budibase/couchdb:latest
    restart: unless-stopped
    environment:
      COUCHDB_PASSWORD: ${COUCH_DB_PASSWORD}
      COUCHDB_USER: budibase
    volumes:
      - couchdb_data:/opt/couchdb/data

  minio-service:
    image: minio/minio:latest
    restart: unless-stopped
    environment:
      MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY}
      MINIO_SECRET_KEY: ${MINIO_SECRET_KEY}
    volumes:
      - minio_data:/data
    command: server /data --console-address ":9001"

volumes:
  couchdb_data:
  minio_data:
# Budibase REST API でアプリ・テーブルを自動管理(Python)
import requests
import os

BB_URL = os.environ.get('BUDIBASE_URL', 'http://localhost:10000')
API_KEY = os.environ['BUDIBASE_API_KEY']  # 管理画面のSettings > API Keys で取得

headers = {
    'x-budibase-api-key': API_KEY,
    'Content-Type': 'application/json',
}

def list_apps() -> list:
    resp = requests.get(f'{BB_URL}/api/applications', headers=headers)
    resp.raise_for_status()
    return resp.json()['data']

def search_rows(app_id: str, table_id: str, query: dict = None) -> list:
    body = {'query': query or {}, 'paginate': False}
    resp = requests.post(
        f'{BB_URL}/api/{app_id}/tables/{table_id}/rows/search',
        headers=headers,
        json=body,
    )
    resp.raise_for_status()
    return resp.json()['data']

def create_row(app_id: str, table_id: str, row_data: dict) -> dict:
    resp = requests.post(
        f'{BB_URL}/api/{app_id}/tables/{table_id}/rows',
        headers=headers,
        json=row_data,
    )
    resp.raise_for_status()
    return resp.json()

# 使用例: 顧客テーブルに新規レコードを追加
apps = list_apps()
if apps:
    app_id = apps[0]['appId']
    # テーブル検索
    customers = search_rows(app_id, 'your-table-id', {
        'equal': {'status': 'active'}
    })
    print(f'アクティブ顧客: {len(customers)}件')

    # 新規レコード追加
    new_customer = create_row(app_id, 'your-table-id', {
        'name': '株式会社テスト',
        'email': 'info@test.co.jp',
        'status': 'active',
        'plan': 'pro',
    })
    print(f'追加完了: {new_customer["_id"]}')

Appsmith

2019年公開、TypeScript/Java製のOSSです。GitHubスター34k+。React Nativeでモバイルアプリも作成でき、カスタムJSのサポートが充実している内部ツールビルダーです。Widget(グリッド・チャート・フォーム・テーブル)をドラッグ&ドロップで配置し、REST API・GraphQL・PostgreSQL等をデータソースとして接続します。

# docker-compose.yml - Appsmith Community
version: "3.8"
services:
  appsmith:
    image: index.docker.io/appsmith/appsmith-ce:latest
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./stacks:/appsmith-stacks
    environment:
      APPSMITH_ENCRYPT_PASSWORD: ${ENCRYPT_PASSWORD}
      APPSMITH_ENCRYPT_SALT: ${ENCRYPT_SALT}
      APPSMITH_OAUTH2_GITHUB_CLIENT_ID: ${GITHUB_CLIENT_ID}
      APPSMITH_OAUTH2_GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET}
      APPSMITH_OAUTH2_GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID}
      APPSMITH_OAUTH2_GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET}
      # メール設定
      APPSMITH_MAIL_ENABLED: "true"
      APPSMITH_MAIL_HOST: smtp.sendgrid.net
      APPSMITH_MAIL_PORT: "587"
      APPSMITH_MAIL_SMTP_TLS_ENABLED: "true"
      APPSMITH_MAIL_USERNAME: apikey
      APPSMITH_MAIL_PASSWORD: ${SENDGRID_KEY}
      APPSMITH_MAIL_FROM: noreply@yourcompany.com
// Appsmith カスタムJS例: テーブルデータの集計とフィルタリング
// Appsmith の JS Object として実装

export default {
  // アクティブユーザーをフィルタリング
  getActiveUsers() {
    const users = getUsers.data || [];
    return users.filter(u => u.status === 'active' && u.plan !== 'free');
  },

  // 月次売上を集計
  getMonthlySummary() {
    const orders = getOrders.data || [];
    const summary = {};
    orders.forEach(order => {
      const month = order.created_at.substring(0, 7); // YYYY-MM
      summary[month] = (summary[month] || 0) + order.amount;
    });
    return Object.entries(summary)
      .sort(([a], [b]) => b.localeCompare(a))
      .map(([month, total]) => ({ month, total }));
  },

  // CSVエクスポート
  exportToCSV() {
    const data = Table1.selectedRows;
    if (!data.length) {
      showAlert('エクスポートするデータを選択してください', 'warning');
      return;
    }
    const headers = Object.keys(data[0]).join(',');
    const rows = data.map(row => Object.values(row).join(','));
    const csv = [headers, ...rows].join('
');
    download(csv, 'export.csv', 'text/csv');
  },
};

ToolJet

2021年公開、TypeScript製のOSSです。GitHubスター34k+。最小限のリソースでDockerデプロイできる軽量な内部ツールビルダーです。データソース接続(50+)・カスタムJS・REST API・Python(Pandas)コンポーネントを搭載しています。

# ToolJet の最小Dockerセットアップ(1コンテナ)
docker run -d   --name tooljet   -p 3000:3000   -e TOOLJET_HOST=https://tooljet.yourcompany.com   -e SECRET_KEY_BASE=$(openssl rand -hex 64)   -e PG_HOST=your-postgres-host   -e PG_DB=tooljet_production   -e PG_USER=tooljet   -e PG_PASS=your-password   -e PG_PORT=5432   -e SMTP_ADDRESS=smtp.sendgrid.net   -e SMTP_PORT=587   -e SMTP_USERNAME=apikey   -e SMTP_PASSWORD=${SENDGRID_KEY}   tooljet/tooljet:latest

機能比較表

比較項目BudibaseAppsmithToolJet
モバイルUI✅(React Native)
カスタムJS✅(充実)
セットアップ容易さ★★☆★★☆★★★
UI品質★★★★★☆★★☆
自動化(Automation)
GitHub Stars23k+34k+34k+

OSSローコードはDevOpsカテゴリ/categories/devopsのPostgreSQL・データウェアハウス(Redshift/BigQuery)に直接接続してBIダッシュボード代替の管理画面を構築します。LLM Toolsカテゴリ/categories/llm-toolsのOllamaやClaude APIをカスタムAPIデータソースとして接続することで、AIアシスト機能付きの内部ツールを低コードで構築できます。

FAQ

Q. RetoolからBuildbarse/Appsmithへの移行は可能ですか?

A. UIの完全自動移行は不可ですが、データソース接続設定とビジネスロジックは手動で移行できます。移行手順: ①Retoolで使っているデータソース(PostgreSQL・REST API・GraphQL)のエンドポイントとクエリをメモ②Budibase/Appsmithで同じデータソースを接続③UIコンポーネント(テーブル・フォーム・チャート)をドラッグ&ドロップで再構築④カスタムJS(Retoolのtransformers・event handlersの相当機能)をAppsmithのJS Objectに移植。移行コスト目安: シンプルなCRUD管理画面(5画面以下)は2〜3日、複雑なダッシュボード(チャート・フィルター・複数データソース結合)は1〜2週間。

Q. BudibaseとAppsmithの主な違いは何ですか?

A. 非エンジニアでも使いやすいUI重視ならBudibase開発者がカスタムJSで柔軟に実装したい・モバイルアプリも作りたいならAppsmithが向いています。Budibaseの優位点: ①UIが洗練されていて非エンジニアでも直感的②Automation(cronトリガー・Webhookトリガー・承認フロー)が標準搭載③内蔵ユーザー管理・RBAC(ロールベースアクセス制御)④Budibase DBで追加インフラなしにアプリを作成可能。Appsmithの優位点: ①JS Objectでより複雑なデータ変換・ロジックを実装②React Nativeでモバイルビューを同時開発③カスタムコンポーネント(Reactウィジェット)をnpmパッケージとして追加④Git統合でコードレビュー・バージョン管理が可能。

Q. ToolJetはどんな場面に適していますか?

A. リソースが限られた環境・素早くシンプルな内部ツールを作りたい場合にToolJetが最適です。ToolJetのユースケース: ①シングルDockerコンテナで起動(最小512MB RAM)でVPSコストを最小化②Pythonコンポーネント(Pandasでデータ分析処理)③OpenAI/Claude APIをデータソースとして接続したAIアシスト内部ツール④CSVインポート→テーブル表示→フォーム編集の基本CRUD(30分で構築)。注意: ToolJetのAutomation(バックグラウンドジョブ)はBusinessプランで提供。無料版でも手動実行のワークフローは構築可能です。

Q. 複数のデータベースを1つのUIに統合して使えますか?

A. 3ツール全て複数データソースを1つのアプリ内で使用可能です。例: PostgreSQL(顧客データ)+ Stripe API(請求データ)+ Slack API(通知送信)を1つのダッシュボードに組み合わせ。実装例(Appsmith): ①「顧客一覧テーブル」はPostgreSQLクエリを接続②行を選択すると「Stripe請求履歴」はStripe REST APIを呼び出し③「Slack通知」ボタンはSlack Webhookを呼び出し。Budibaseでは「Data Source」にPostgreSQL・REST API・Airtableを別々に追加してバインディングでUI部品にデータを流し込みます。JOIN操作(複数DBのデータを結合)はJSで変換するかBudibaseのFormulaフィールドで実装します。

まとめ

ユースケース推奨ツール
非エンジニア・UI品質・Automation重視Budibase
開発者・カスタムJS・モバイル対応Appsmith
軽量・シンプルCRUD・最小リソースToolJet

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。