Frappe Ops Bench logo

Frappe Ops Bench

Organization
Impertio-Studio
frappe-ops-bench

Use when running bench commands, managing sites, configuring multi-tenancy, or setting up domains. Prevents misconfigured bench environments, broken site routing, and DNS mismatches. Covers bench CLI commands, site creation, bench init, multi-tenancy setup, DNS-based routing, common-site-config. Keywords: bench, site, multi-tenancy, domains, bench init, bench new-site, bench setup, common_site_config, bench command not working, site setup, multi-tenant, domain routing, new site..

Overview

PublisherImpertio-Studio
RepositoryFrappe_Claude_Skill_Package
Skill namefrappe-ops-bench
Stars
180
Forks
53
Bundled files
4
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 4 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by Impertio-Studio on GitHub. Read the source before you install it.

Installation

Install the Frappe Ops Bench AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/Impertio-Studio/Frappe_Claude_Skill_Package.git /tmp/Frappe_Claude_Skill_Package
mkdir -p .claude/skills
cp -r /tmp/Frappe_Claude_Skill_Package/skills/source/ops/frappe-ops-bench .claude/skills/frappe-ops-bench
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Frappe Ops Bench in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Frappe Ops Bench on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Frappe Ops Bench is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Bench CLI Complete Reference

Complete bench CLI reference for site management, app lifecycle, configuration, and multi-tenancy.

Version: v14/v15/v16


Quick Reference: Essential Commands

TaskCommand
Create benchbench init myproject --frappe-branch version-15
Create sitebench new-site mysite.localhost --admin-password admin
Set default sitebench use mysite.localhost
Get appbench get-app erpnext --branch version-15
Install appbench --site mysite install-app erpnext
Start dev serverbench start
Run migrationsbench --site mysite migrate
Build assetsbench build --app myapp
Backup sitebench --site mysite backup
Restore backupbench --site mysite restore /path/to/backup.sql.gz
Open consolebench --site mysite console
Open DB shellbench --site mysite mariadb
Check schedulerbench doctor
View pending jobsbench show-pending-jobs
Update everythingbench update
Drop sitebench drop-site mysite --force

Workflow 1: Creating a New Bench

bash
# Initialize bench with specific Frappe version
bench init myproject --frappe-branch version-15

# With Python version
bench init myproject --frappe-branch version-15 --python python3.11

# Enter bench directory (REQUIRED for all subsequent commands)
cd myproject

What bench init creates:

myproject/
├── apps/           # Installed Frappe apps (frappe is default)
├── sites/          # All sites and shared config
│   └── common_site_config.json
├── config/         # Redis, Procfile, supervisor configs
├── env/            # Python virtual environment
├── logs/           # Log files
└── Procfile        # Process definitions for bench start

Critical Rules

  • ALWAYS specify --frappe-branch to pin Frappe version
  • ALWAYS run commands from inside the bench directory
  • NEVER run bench commands as root — use a dedicated frappe user

Workflow 2: Site Management

Creating Sites

bash
# Basic site creation
bench new-site mysite.localhost --admin-password admin

# With specific database
bench new-site mysite.localhost --db-name mysite_db --admin-password admin

# With MariaDB root password
bench new-site mysite.localhost --mariadb-root-password rootpass --admin-password admin

# Install apps during creation
bench new-site mysite.localhost --admin-password admin --install-app erpnext

Setting Default Site

bash
bench use mysite.localhost
# OR set environment variable for current session:
export FRAPPE_SITE=mysite.localhost

Dropping a Site

bash
bench drop-site mysite.localhost --force
# Deletes database and archives site directory

Site Directory Structure

sites/mysite.localhost/
├── site_config.json     # Site-specific config (db credentials)
├── private/             # Auth-required files, backups
├── public/              # Publicly accessible files
├── locks/               # Scheduler lock files
└── task-logs/           # Scheduler task logs

Workflow 3: App Management

bash
# Download app from GitHub
bench get-app erpnext --branch version-15
bench get-app https://github.com/org/custom-app.git --branch main

# Install app on a site
bench --site mysite install-app erpnext

# List installed apps
bench --site mysite list-apps

# Remove app from site (creates backup first)
bench --site mysite uninstall-app custom_app

# Remove app from bench entirely
bench remove-app custom_app

# Switch app branch
bench switch-to-branch version-15 erpnext frappe

# Exclude app from updates
bench exclude-app custom_app

# Re-include app in updates
bench include-app custom_app

Critical Rules

  • ALWAYS get-app before install-app — get downloads, install activates
  • ALWAYS backup before uninstall-app — it deletes app-related data
  • NEVER manually delete app folders — use bench remove-app

Workflow 4: bench update: What It Does

bash
# Full update (pull + migrate + build + restart)
bench update

# Update specific app only
bench update --pull --app erpnext

# Skip build step
bench update --no-build

# Skip backup
bench update --no-backup

# Reset to upstream (DESTROYS local changes)
bench update --reset

bench update executes these steps in order:

  1. Backup all sites
  2. Pull latest code for all apps (git pull)
  3. Install Python/Node requirements
  4. Build static assets (bench build)
  5. Run migrations on all sites (bench migrate)
  6. Restart bench processes

Critical Rules

  • ALWAYS run bench update in a screen/tmux session — it takes time
  • NEVER use --reset in production without understanding it does git reset --hard
  • ALWAYS test updates on staging first

Workflow 5: bench migrate

bash
# Migrate specific site
bench --site mysite migrate

# Migrate all sites
bench --site all migrate

# Check if safe to migrate (no pending jobs)
bench --site mysite ready-for-migration

What bench migrate does:

  1. Runs schema sync (DocType changes → database)
  2. Runs patches (data migrations)
  3. Rebuilds search index
  4. Syncs translations
  5. Rebuilds Dashboard cache

When to Migrate

  • After bench update (done automatically)
  • After changing hooks.py
  • After adding/modifying DocTypes
  • After pulling code changes
  • NEVER skip migrate after code changes — leads to schema mismatches

Workflow 6: bench build

bash
# Build all apps
bench build

# Build specific app
bench build --app myapp

# Build with bundle analyzer
bench build --app myapp --production

# Watch mode (auto-rebuild on file changes)
bench watch

When to Build

  • After changing JS/CSS files
  • After bench get-app (done automatically)
  • After modifying package.json
  • ALWAYS build after modifying client-side assets

Workflow 7: Console and Database Access

bash
# IPython console (with Frappe loaded)
bench --site mysite console
# In console:
# >>> frappe.get_doc("Sales Invoice", "INV-001")
# >>> frappe.db.sql("SELECT name FROM `tabUser` LIMIT 5")

# Auto-reload on code changes
bench --site mysite console --autoreload

# MariaDB shell
bench --site mysite mariadb
# >>> SELECT name, email FROM tabUser LIMIT 5;

# PostgreSQL shell
bench --site mysite postgres

# Execute a method directly
bench --site mysite execute myapp.tasks.daily_cleanup
bench --site mysite execute myapp.api.process --kwargs '{"name": "INV-001"}'

# Make authenticated request as Administrator
bench --site mysite request GET /api/resource/User

Workflow 8: Backup and Restore

bash
# Backup (database + files)
bench --site mysite backup
# Creates: sites/mysite/private/backups/
#   YYYY-MM-DD_HHMMSS-mysite-database.sql.gz
#   YYYY-MM-DD_HHMMSS-mysite-files.tar
#   YYYY-MM-DD_HHMMSS-mysite-private-files.tar

# Backup all sites
bench backup-all-sites

# Backup with encryption
bench --site mysite backup --backup-encryption-key mykey

# Restore from backup
bench --site mysite restore /path/to/database.sql.gz

# Restore with files
bench --site mysite restore /path/to/database.sql.gz \
  --with-public-files /path/to/files.tar \
  --with-private-files /path/to/private-files.tar

# Partial restore
bench --site mysite partial-restore /path/to/database.sql.gz

Critical Rules

  • ALWAYS backup before bench update, uninstall-app, or drop-site
  • Backups older than 24 hours auto-deleted by default — configure keep_backups_for_hours
  • ALWAYS test restore on a staging site before relying on a backup

Workflow 9: Scheduler and Background Jobs

bash
# Enable/disable scheduler
bench --site mysite scheduler enable
bench --site mysite scheduler disable
bench --site mysite scheduler pause
bench --site mysite scheduler resume

# Check scheduler health
bench doctor

# View queued jobs
bench show-pending-jobs

# Purge pending jobs
bench --site mysite purge-jobs

# Manually trigger scheduler event
bench --site mysite trigger-scheduler-event hourly

# Start worker manually (for debugging)
bench worker --queue short

Workflow 10: Multi-Tenancy

DNS-Based Routing (Recommended)

bash
# Enable DNS multi-tenancy
bench config dns_multitenant on

# Create sites with proper hostnames
bench new-site site1.example.com --admin-password admin
bench new-site site2.example.com --admin-password admin

# Regenerate nginx config
bench setup nginx

# Reload nginx
sudo service nginx reload

Requests are routed by matching the Host header to site names.

Port-Based Routing (Alternative)

bash
bench config dns_multitenant off
bench new-site site2.localhost --admin-password admin
bench set-nginx-port site2.localhost 8082
bench setup nginx
sudo service nginx reload

Custom Domain Mapping

bash
# Add domain to site
bench setup add-domain site1.example.com --site mysite
bench setup nginx
sudo service nginx reload

Configuration: common_site_config.json

Located at sites/common_site_config.json — applies to ALL sites.

Essential Keys

KeyDefaultPurpose
background_workers1Number of background job workers
developer_modefalseAuto-sync DocType changes to files
dns_multitenantfalseEnable DNS-based multi-tenancy
gunicorn_workers2Web server worker count (min: 2)
maintenance_mode0Take all sites offline
pause_scheduler0Pause job scheduler
serve_default_siteDefault site when host not matched
server_script_enabledfalseEnable Server Scripts
scheduler_tick_interval60Seconds between scheduler checks
webserver_port8000Development server port
socketio_port9000Socket.IO port
live_reloadfalseAuto-reload on asset rebuild

Redis Configuration

KeyDefault
redis_cacheredis://localhost:13000
redis_queueredis://localhost:11000
redis_socketioredis://localhost:13000

Setting Config Values

bash
# Set common config (all sites)
bench config set-common-config -c background_workers 4
bench config set-common-config -c developer_mode 1

# Set site-specific config
bench --site mysite set-config developer_mode 1
bench --site mysite set-config maintenance_mode 1

# View current config
bench --site mysite show-config

Configuration: site_config.json

Per-site config at sites/<sitename>/site_config.json.

Mandatory Keys

KeyPurpose
db_typemariadb or postgres
db_nameDatabase name
db_passwordDatabase password

Important Optional Keys

KeyPurpose
admin_passwordAdministrator initial password
host_nameFull site URL (with protocol)
install_appsApps to install on restore/reinstall
allow_corsCORS origins ("*", URL, or array)
max_file_sizeUpload limit (default: 10MB)
mute_emailsDisable all outgoing email
loggingDebug level (0-2, level 2 shows SQL queries)

Environment Variable Overrides

Environment variables override config files. Key mappings: FRAPPE_REDIS_QUEUE, FRAPPE_REDIS_CACHE, FRAPPE_DB_HOST, FRAPPE_DB_PORT, FRAPPE_DB_NAME, FRAPPE_DB_PASSWORD.

Priority: Environment Variable > site_config.json > common_site_config.json > Default


Production Setup

bash
sudo bench setup production frappe-user   # nginx + supervisor + fail2ban
bench setup lets-encrypt mysite.example.com  # SSL
sudo bench restart                          # Restart services
bench disable-production                    # Back to development

Version Differences

FeatureV14V15V16
bench initYesYesYes
Scheduler tick interval~240s~240s60s
db_user config (separate)NoNoYes
console --autoreloadNoYesYes
trim-tables commandNoYesYes
trim-database commandNoYesYes
request commandNoYesYes
Gettext translationsNoNoYes

Reference Files

FileContents
commands.mdFull command reference with all options
examples.mdCommon workflow examples
custom-commands.mdCreating custom bench CLI commands with Click
anti-patterns.mdCommon bench mistakes and fixes

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Frappe Ops Bench AI skill do?

Use when running bench commands, managing sites, configuring multi-tenancy, or setting up domains. Prevents misconfigured bench environments, broken site routing, and DNS mismatches. Covers bench CLI commands, site creation, bench init, multi-tenancy setup, DNS-based routing, common-site-config. Keywords: bench, site, multi-tenancy, domains, bench init, bench new-site, bench setup, common_site_config, bench command not working, site setup, multi-tenant, domain routing, new site..

Why use Frappe Ops Bench on TypingMind?

Because you install it once and use it with any model. Frappe Ops Bench is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Frappe Ops Bench in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/Impertio-Studio/Frappe_Claude_Skill_Package/tree/main/skills/source/ops/frappe-ops-bench. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Frappe Ops Bench?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Frappe Ops Bench?

As many as you like. As long as a model supports skills, you can use Frappe Ops Bench with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Frappe Ops Bench AI skill free?

Yes. It is published on GitHub by Impertio-Studio under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇