Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Expert guidance for CapRover, the open-source PaaS that turns any Linux server into a Heroku-like platform with automatic HTTPS, one-click app deployment, and Docker-based containerization. Helps developers deploy applications, configure custom domains, and manage the CapRover cluster.
.claude/skills/terminalskills-caprover/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | 144% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 99% | 0% |
| case-20 | ✓→✓ | = Same ✓ | 29% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 107% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 73% | 0% |
CapRover, the open-source PaaS that turns any Linux server into a Heroku-like platform with automatic HTTPS, one-click app deployment, and Docker-based containerization. Helps developers deploy applications, configure custom domains, and manage the CapRover cluster.
bash# Prerequisites: Ubuntu 20.04+, Docker installed, ports 80/443/3000 open # Install CapRover docker run -p 80:80 -p 443:443 -p 3000:3000 \ -e ACCEPTED_TERMS=true \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /captain:/captain \ caprover/caprover # Install CLI npm install -g caprover # Set up server (interactive) caprover serversetup # → Enter: IP address, root domain (*.apps.myserver.com), email for SSL, password # Login caprover login # → URL: https://captain.apps.myserver.com
Deploy via CLI, Git, or Dockerfile:
bash# Method 1: CLI deploy from current directory caprover deploy -a my-api # Method 2: Deploy with a captain-definition file cat > captain-definition << 'EOF' { "schemaVersion": 2, "dockerfilePath": "./Dockerfile" } EOF caprover deploy -a my-api
json// captain-definition — Deployment configuration // Option A: Dockerfile-based { "schemaVersion": 2, "dockerfilePath": "./Dockerfile" } // Option B: Image-based (pre-built) { "schemaVersion": 2, "imageName": "ghcr.io/myorg/my-api:v1.2.3" } // Option C: Docker Compose (multi-container) { "schemaVersion": 2, "dockerComposeFileLocation": "./docker-compose.yml" }
Deploy popular software instantly through the web UI:
markdown## Available One-Click Apps (examples) - **Databases**: PostgreSQL, MySQL, MongoDB, Redis, MariaDB - **CMS**: WordPress, Ghost, Strapi, Directus - **DevOps**: GitLab, Drone CI, Jenkins, Portainer - **Monitoring**: Grafana, Prometheus, Uptime Kuma, Plausible - **Communication**: Mattermost, Rocket.Chat, n8n - **Storage**: MinIO, Nextcloud, Filebrowser - **Analytics**: Matomo, PostHog, Umami
typescript// scripts/caprover-api.ts — CapRover API client const CAPROVER_URL = "https://captain.apps.myserver.com"; async function caproverApi(path: string, data?: any) { const token = process.env.CAPROVER_TOKEN!; const response = await fetch(`${CAPROVER_URL}/api/v2${path}`, { method: data ? "POST" : "GET", headers: { "Content-Type": "application/json", "x-captain-auth": token, }, body: data ? JSON.stringify(data) : undefined, }); const result = await response.json(); if (result.status !== 100) throw new Error(result.description); return result.data; } // Create a new app async function createApp(appName: string) { return caproverApi("/user/apps/appDefinitions/register", { appName, hasPersistentData: false, }); } // Update environment variables async function setEnvVars(appName: string, envVars: { key: string; value: string }[]) { return caproverApi("/user/apps/appDefinitions/update", { appName, envVars, }); } // Enable SSL for app async function enableSsl(appName: string) { return caproverApi("/user/apps/appDefinitions/enablecustomdomainssl", { appName, customDomain: `${appName}.apps.myserver.com`, }); } // Scale app async function scaleApp(appName: string, instanceCount: number) { return caproverApi("/user/apps/appDefinitions/update", { appName, instanceCount, }); } // Add custom domain async function addCustomDomain(appName: string, domain: string) { return caproverApi("/user/apps/appDefinitions/customdomain", { appName, customDomain: domain, }); }
Configure volumes for stateful applications:
bash# Via CLI or captain-definition, define persistent directories # In CapRover dashboard: App → App Configs → Persistent Directories # Example persistent paths: # /app/uploads → Store user-uploaded files # /app/data → Application data directory # /var/log/app → Log files
Scale beyond a single server:
bash# On the main server: get join token # Dashboard → Cluster → Add Worker Node # On the worker server: docker swarm join --token SWMTKN-xxx manager-ip:2377 # CapRover automatically distributes containers across nodes # Use placement constraints for specific workloads: # Dashboard → App → App Configs → Node Placement
User request:
I have a Node.js API and a React frontend running in Docker. Set up Caprover for monitoring/deployment.The agent creates the necessary configuration files based on patterns like # Prerequisites: Ubuntu 20.04+, Docker installed, ports 80/4, sets up the integration with the existing Docker setup, configures appropriate defaults for a Node.js + React stack, and provides verification commands to confirm everything is working.
User request:
Caprover is showing errors in our deploy applications. Here are the logs: [error output]The agent analyzes the error output, identifies the root cause by cross-referencing with common Caprover issues, applies the fix (updating configuration, adjusting resource limits, or correcting syntax), and verifies the resolution with appropriate health checks.
*.apps.yourdomain.com to your server IP before installation; SSL won't work without it| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-20 | pass→pass | 13,091 | 9,263 | -29% | 1 | 1 | 0% | 2,885 | 3,724 | +29% | 0 | 0 | — |
case-01 | pass→pass | 5,975 | 3,713 | -38% | 1 | 1 | 0% | 1,210 | 2,502 | +107% | 0 | 0 | — |
case-02 | pass→pass | 8,227 | 4,583 | -44% | 1 | 1 | 0% | 1,532 | 2,647 | +73% | 0 | 0 | — |
case-03 | pass→pass | 13,420 | 6,095 | -55% | 1 | 1 | 0% | 2,236 | 2,887 | +29% | 0 | 0 | — |
case-04 | pass→pass | 4,230 | 2,771 | -34% | 1 | 1 | 0% | 829 | 2,188 | +164% | 0 | 0 | — |
case-05 | pass→pass | 3,177 | 1,755 | -45% | 1 | 1 | 0% | 612 | 2,082 | +240% | 0 | 0 | — |
case-06 | fail→pass | 4,259 | 1,939 | -54% | 1 | 1 | 0% | 862 | 2,100 | +144% | 0 | 0 | — |
case-07 | pass→pass | 6,917 | 4,957 | -28% | 1 | 1 | 0% | 1,319 | 2,619 | +99% | 0 | 0 | — |
case-08 | pass→pass | 10,938 | 7,676 | -30% | 1 | 1 | 0% | 1,951 | 3,341 | +71% | 0 | 0 | — |
case-09 | pass→pass | 13,912 | 11,362 | -18% | 1 | 1 | 0% | 2,742 | 3,900 | +42% | 0 | 0 | — |
case-10 | pass→pass | 9,042 | 4,854 | -46% | 1 | 1 | 0% | 1,642 | 2,521 | +54% | 0 | 0 | — |
case-11 | pass→pass | 2,861 | 2,131 | -26% | 1 | 1 | 0% | 460 | 2,110 | +359% | 0 | 0 | — |
case-12 | fail→pass | 5,876 | 2,694 | -54% | 1 | 1 | 0% | 1,096 | 2,184 | +99% | 0 | 0 | — |
case-13 | pass→pass | 3,580 | 2,375 | -34% | 1 | 1 | 0% | 804 | 2,176 | +171% | 0 | 0 | — |
case-14 | pass→pass | 7,193 | 4,599 | -36% | 1 | 1 | 0% | 1,499 | 2,715 | +81% | 0 | 0 | — |
case-15 | pass→pass | 43,419 | 2,239 | -95% | 1 | 1 | 0% | 1,134 | 2,193 | +93% | 0 | 0 | — |
case-16 | pass→pass | 4,344 | 1,737 | -60% | 1 | 1 | 0% | 803 | 2,004 | +150% | 0 | 0 | — |
case-17 | pass→pass | 8,751 | 3,711 | -58% | 1 | 1 | 0% | 1,813 | 2,504 | +38% | 0 | 0 | — |
case-18 | pass→pass | 9,029 | 7,426 | -18% | 1 | 1 | 0% | 1,709 | 3,064 | +79% | 0 | 0 | — |
case-19 | pass→pass | 7,614 | 3,291 | -57% | 1 | 1 | 0% | 1,504 | 2,355 | +57% | 0 | 0 | — |
case-21 | pass→pass | 8,222 | 5,953 | -28% | 1 | 1 | 0% | 1,515 | 2,772 | +83% | 0 | 0 | — |
case-22 | pass→pass | 9,358 | 5,872 | -37% | 1 | 1 | 0% | 1,873 | 2,833 | +51% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.