VibeKit VibeKit
API v1

VibeKit Documentation

Build and deploy full-stack apps with AI. One API call, live URL in minutes. Apps are hosted as Docker containers at {name}.vibekit.bot.

Base URL: https://vibekit.bot/api/v1

🔑 Free with BYOK: Connect your Claude or OpenAI key in settings and VibeKit costs you nothing. Supports Claude and OpenAI Codex — switch providers anytime via the API or dashboard.

Quickstart

Sign in with GitHub

The fastest way to get started. Sign in via the web to get your API key and access the Dashboard.

https://vibekit.bot/auth/github

Or register via API:

curl -X POST https://vibekit.bot/api/v1/auth/register \
  -H "Content-Type: application/json" \
  -d '{"email": "[email protected]"}'

Submit a Task

curl -X POST https://vibekit.bot/api/v1/task \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt": "Build a todo app with dark mode"}'

Check Status & Get URL

curl https://vibekit.bot/api/v1/task/TASK_ID \
  -H "Authorization: Bearer YOUR_API_KEY"

Your app will be live at {name}.vibekit.bot

Authentication

VibeKit supports two authentication methods. All API requests require one of these in the Authorization header.

1. API Key

Use your API key directly. Keys start with vk_.

Authorization: Bearer vk_your_api_key

2. JWT (Dashboard Sessions)

JWTs are issued via GitHub OAuth sign-in or the POST /auth/token endpoint. Used by the web dashboard.

Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

Register via API

POST /api/v1/auth/register

Create an account and receive an API key. No authentication required.

Request Body

{
  "email": "[email protected]"
}

Response

{
  "apiKey": "vk_xxx...",
  "plan": "free",
  "balance": 0.25
}

Exchange API Key for JWT

POST /api/v1/auth/token

Exchange an API key for a short-lived JWT. Useful for frontend apps that need token-based auth.

Request Body

{
  "apiKey": "vk_xxx"
}

Response

{
  "token": "eyJhbGciOiJIUzI1NiIs...",
  "expiresIn": 86400
}

GitHub OAuth

GET /auth/github

Redirects to GitHub OAuth for sign-in. On success, issues a JWT and redirects to the Dashboard.

Tasks

Submit coding tasks to VibeKit's AI. Each task uses balance (unless using BYOK mode, which is free).

Submit Task

POST /api/v1/task

Request Body

{
  "prompt": "Build a landing page",
  "skills": ["solana"],        // optional: domain skills
  "projectId": "abc123",      // optional: iterate on existing
  "repo": "owner/repo",       // optional: target repo
  "database": true,          // optional: enable Postgres database
  "template": "landing",      // optional: project template
  "callbackUrl": "https://...", // optional: webhook
  "anthropicApiKey": "sk-ant-..." // optional: BYOK (free)
}
FieldTypeDescription
promptstring · requiredWhat you want built, in plain English
projectIdstringExisting project ID to iterate on
repostringGitHub repo (owner/name). Omit to create new
branchstringBranch to work on. Default: main
deploybooleanAuto-host when done. Default: true
databasebooleanEnable Postgres database (Builder/Pro plans). Default: false
templatestringProject template (landing, dashboard, crud-api, saas, blog, form, portfolio, ecommerce)
skillsstring[]Domain skills (e.g. ["solana", "stripe"])
filesobject[]File attachments ({name, content} base64)
callbackUrlstringWebhook URL for completion notification
anthropicApiKeystringYour Anthropic key for BYOK mode (free)

Get Task Status

GET /api/v1/task/:taskId

Response

{
  "taskId": "task_abc123",
  "status": "complete",  // pending | running | complete | error
  "deployUrl": "https://myapp.vibekit.bot",
  "projectId": "abc123",
  "repo": "vibekit-apps/project-abc123"
}

List Tasks

GET /api/v1/tasks

Returns your recent tasks with status and deploy URLs.

Cancel Task

DELETE /api/v1/task/:taskId

Cancel a running or starting task. Only tasks with status running or starting can be cancelled.

Hosting

Deploy and manage apps as Docker containers at {name}.vibekit.bot. Full lifecycle management with health monitoring and auto-recovery.

Deploy App

POST /api/v1/hosting/deploy

Deploy a new app from a GitHub repository.

{
  "repo": "owner/repo",
  "subdomain": "my-app",      // optional
  "runtime": "node",          // optional (default: node)
  "memoryLimit": 256,         // optional: MB
  "envVars": {"KEY": "value"} // optional
}

Response

{
  "id": "app_abc123",
  "url": "https://my-app.vibekit.bot",
  "status": "running"
}

List Apps

GET /api/v1/hosting/apps

Returns all hosted apps for the authenticated user.

Response

{
  "apps": [{
    "id": "app_abc123",
    "name": "my-app",
    "repo": "owner/repo",
    "url": "https://my-app.vibekit.bot",
    "status": "running",
    "memory": 256
  }]
}

Create App (Template or Repo)

POST /api/v1/hosting/apps

Create a new app from a template or GitHub repo. The AI agent is auto-provisioned and starts building immediately.

// From template
{
  "template": "landing",
  "subdomain": "my-app"
}

// From GitHub repo
{
  "repo": "owner/repo-name",
  "subdomain": "my-app"
}

Templates: landing dashboard saas crud-api ecommerce portfolio blog form

App Details

GET /api/v1/hosting/app/:id

Returns full app details including infrastructure topology, resource usage, and domain config.

{
  "id": "app_abc123",
  "name": "my-app",
  "url": "https://my-app.vibekit.bot",
  "status": "running",
  "stats": { "cpu": 2.1, "memory": 128, "memoryLimit": 256 },
  "infra": {
    "nodes": [{ "id", "type", "label" }],
    "edges": [{ "source", "target", "label" }]
  }
}

App Lifecycle

POST /api/v1/hosting/app/:id/:action

Control your app's lifecycle. Available actions:

start stop restart redeploy deploy-workspace
curl -X POST https://vibekit.bot/api/v1/hosting/app/APP_ID/restart \
  -H "Authorization: Bearer YOUR_API_KEY"

Delete App

DELETE /api/v1/hosting/app/:id

Permanently delete an app and its container. This action cannot be undone.

Resize Container

POST /api/v1/hosting/app/:id/resize

Change the container's memory allocation. See Container Memory Add-ons for pricing.

{
  "memoryLimit": 512
}

Set Custom Domain

POST /api/v1/hosting/app/:id/domain

Attach a custom domain to your app. Returns DNS records to configure at your registrar.

{
  "domain": "mysite.com"
}

Response

{
  "domain": "mysite.com",
  "dnsRecords": [
    { "type": "A", "name": "@", "value": "76.76.21.21" }
  ]
}

Container Logs

GET /api/v1/hosting/app/:id/logs

Retrieve container stdout/stderr logs.

ParamTypeDescription
linesnumberNumber of log lines to return (default: 100)

Deploy Progress

GET /api/v1/hosting/app/:id/deploy-progress

Check the current deployment status and build progress for an app.

Execute Command

POST /api/v1/hosting/app/:id/exec

Execute a shell command inside the app's container.

{
  "command": "ls -la /app"
}

Response

{
  "output": "total 48\ndrwxr-xr-x 6 node node ..."
}

Database

Each app can have an isolated PostgreSQL database. Databases run on shared infrastructure with per-app schema isolation — no setup required. Requires Builder or Pro plan.

Enable Database

POST /api/v1/hosting/app/:id/database

Provisions an isolated Postgres schema and user for the app. DATABASE_URL is automatically injected into the container on the next deploy or redeploy.

Response

{
  "success": true,
  "schema": "app_8b0eb119",
  "message": "Database provisioned. DATABASE_URL will be injected on next deploy."
}

Agent-native: When a database is enabled, the app's AI agent automatically receives a POSTGRES.md skill with patterns for pg, Drizzle, and Prisma. Just tell the agent "I need a database" and it handles everything.

Database Stats

GET /api/v1/hosting/app/:id/database
{
  "tables": 3,
  "sizeMB": "0.02",
  "schema": "app_8b0eb119",
  "connections": 1
}

Export Database

GET /api/v1/hosting/app/:id/database/export

Downloads a full SQL dump of the app's database. Use for backups or migration.

Remove Database

DELETE /api/v1/hosting/app/:id/database

Permanently deletes the database schema and all data. This action cannot be undone. Export first if you need a backup.

Isolation & Security

Each app gets its own Postgres schema and database user with strict isolation:

  • Separate schema per app (app_{id})
  • Dedicated user locked to own schema
  • public schema access revoked
  • 10 connection limit per app
  • 30s statement timeout

AI Agent

Each hosted app has a persistent AI agent (Claude) that can modify code, debug issues, and manage the app through conversation.

Send Message to Agent

POST /api/v1/hosting/app/:id/agent

Send a message to the app's AI agent. Supports sync and async modes.

// Sync — waits for response
{
  "message": "Add a health check endpoint at /api/health"
}

// Async — returns 202, POSTs result to callbackUrl
{
  "message": "Refactor the auth module",
  "callbackUrl": "https://your-server.com/webhook"
}

Response (sync)

{
  "response": "Added health check endpoint at /api/health...",
  "engine": "openclaw"
}

Chat History

GET /api/v1/hosting/app/:id/agent/history

Retrieve the agent's conversation history.

ParamTypeDescription
limitnumberMax messages to return (default: 50)

Response

{
  "messages": [
    { "role": "user", "content": "...", "timestamp": "..." },
    { "role": "assistant", "content": "...", "timestamp": "..." }
  ]
}

Agent Activity

GET /api/v1/hosting/app/:id/agent/activity

Check if the agent is currently working on something.

{
  "status": "idle",  // idle | working
  "lastActivity": "2026-02-12T20:30:00Z"
}

Workspace Changes

GET /api/v1/hosting/app/:id/agent/changes

View the git diff of changes the agent has made in the workspace.

{
  "files": [{ "path": "src/index.ts", "status": "M" }],
  "diff": "--- a/src/index.ts\n+++ b/src/index.ts\n...",
  "summary": "1 modified"
}

Token Usage

GET /api/v1/hosting/app/:id/agent/context

Check the agent's context window usage.

{
  "used": 45000,
  "limit": 200000,
  "percent": 23,
  "compactions": 1
}

Build Preview

GET /api/v1/hosting/app/:id/agent/preview

Serve the agent's build output. Useful for iframe embedding and previewing changes before deploying.

{
  "available": true,
  "buildDir": "build",
  "files": ["index.html", "static/js/main.js"]
}

Reset Agent Session

POST /api/v1/hosting/app/:id/agent/reset

Clear the agent's conversation history and context. Useful when the agent's context window is full or you want a fresh start.

Compact Context

POST /api/v1/hosting/app/:id/agent/compact

Clear the agent's session files and context window. Useful when the context is bloated and you want a lighter agent without a full reset.

Clear Agent Memory

POST /api/v1/hosting/app/:id/agent/clear-memory

Reset the agent's MEMORY.md file. The agent loses all long-term context about the project.

Restart Agent

POST /api/v1/hosting/app/:id/agent/restart

Restart the agent's gateway process. Useful if the agent is stuck or unresponsive.

Agent Status

GET /api/v1/hosting/app/:id/agent/status

Full agent status including context usage, model, and app info.

{
  "context": { "used": 45000, "limit": 200000, "percent": 23 },
  "model": "claude-opus-4-6",
  "app": { "name": "my-app", "status": "running" }
}

Change Agent Model

PUT /api/v1/hosting/app/:id/agent/model

Switch the AI model the agent uses.

{
  "model": "claude-sonnet-4-20250514"
}

Upload File to Agent

POST /api/v1/hosting/app/:id/agent/upload

Upload a file to the agent's workspace. Use multipart form data.

curl -X POST https://vibekit.bot/api/v1/hosting/app/APP_ID/agent/upload \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@./design.png"

Text-to-Speech

POST /api/v1/hosting/app/:id/agent/tts

Convert text to speech audio. Returns audio buffer. Requires OpenAI key.

{
  "text": "Hello world",
  "voice": "alloy"
}

Character Config

GET PUT /api/v1/hosting/app/:id/agent/character

Get or set the agent's pixel character appearance. Species: 0=Human, 1=Robot, 2=Cat, 3=Alien, 4=Skeleton, 5=Slime, 6=Mech, 7=Ghost.

{
  "species": 1,
  "palette": 0,
  "color": "#a78bfa"
}

Agent Avatar

GET PUT /api/v1/hosting/app/:id/agent/avatar

Get or set a custom agent avatar image. PUT accepts base64-encoded image data (max 500KB).

Deploy from Workspace

POST /api/v1/hosting/app/:id/deploy-workspace

Rebuild and redeploy the container from the agent workspace's app/ directory. Used for template-based apps where the agent writes code directly.

Update OpenClaw

POST /api/v1/hosting/app/:id/agent/update-openclaw

Update the agent runtime (OpenClaw) to the latest version. Returns the new version number.

Account & Billing

Account Info

GET /api/v1/account

Returns your plan, balance, usage limits, and Claude key status.

{
  "plan": "builder",
  "sessionsUsed": 12,
  "sessionsLimit": 50,
  "balance": 3.50,
  "hostedApps": 2,
  "maxApps": 3
}

Available Plans

GET /api/v1/plans

List all available plans and top-up options with pricing.

Start Checkout

POST /api/v1/checkout

Get a Stripe checkout URL to upgrade your plan or add balance.

{
  "product": "pro"  // builder | pro | topup_5 | topup_15 | topup_50
}

Response

{
  "url": "https://checkout.stripe.com/...",
  "sessionId": "cs_xxx"
}

Claude API Key

Manage your own Claude API key for free usage (BYOK). Pass your key and skip platform costs entirely.

GET /api/v1/account/claude-key

Check if a Claude key is connected.

{
  "connected": true,
  "hasKey": true,
  "expired": false
}
PUT /api/v1/account/claude-key

Save and verify a Claude API key. Must start with sk-ant-.

{
  "claudeKey": "sk-ant-api03-xxx"
}

Response

{ "success": true, "message": "Claude API key saved and verified." }
DELETE /api/v1/account/claude-key

Remove your stored Claude API key.

OpenAI API Key

Connect your OpenAI API key to use Codex as your AI agent. Switch between Claude and OpenAI anytime.

GET /api/v1/account/openai-key

Check OpenAI key status and active provider.

{
  "connected": false,
  "provider": "anthropic"
}
PUT /api/v1/account/openai-key

Save and verify an OpenAI API key. Must start with sk-. Automatically sets provider to OpenAI.

{
  "openaiKey": "sk-..."
}

Response

{ "success": true, "message": "OpenAI API key saved and verified." }
DELETE /api/v1/account/openai-key

Remove your stored OpenAI key. Resets provider to Anthropic.

Provider Selection

Switch your AI agent between Claude and OpenAI Codex. Requires both keys to be connected.

PUT /api/v1/account/preferred-provider

Set active AI provider. Values: anthropic or openai.

{
  "provider": "openai"
}

Response

{ "success": true, "provider": "openai" }

GitHub Connection

Link your GitHub account for repo access and automatic deployments.

GET /api/v1/account/github

Check GitHub connection status. Returns username if connected.

GET /api/v1/account/github/connect?key=vk_xxx

Starts GitHub OAuth flow. Redirects to GitHub. Pass your API key as query param.

DELETE /api/v1/account/github

Disconnect your GitHub account.

Repos

List GitHub Repos

GET /api/v1/repos

Returns the GitHub repositories accessible to your account. Requires GitHub OAuth connection.

Schedules

Automate recurring tasks. Requires Builder or Pro plan.

Create Schedule

POST /api/v1/schedule
{
  "prompt": "Update dependencies and fix any breaking changes",
  "repo": "user/my-app",
  "interval": "weekly",   // hourly | daily | weekly | cron expression
  "deploy": true          // auto-commit & push (default: true)
}
ParamTypeDescription
promptstringTask description (required)
repostringGitHub repo in owner/name format (required)
intervalstringhourly, daily, weekly, or a 5-part cron expression (required)
deploybooleanAuto-commit and push changes (default: true)

Response

{
  "scheduleId": "abc-123",
  "status": "active",
  "interval": "0 9 * * 1",
  "nextRun": "2026-02-19T09:00:00.000Z"
}

List Schedules

GET /api/v1/schedules
{
  "schedules": [{
    "scheduleId": "abc-123",
    "name": "Update dependencies and fix any br...",
    "repo": "user/my-app",
    "interval": "0 9 * * 1",
    "enabled": true,
    "lastRun": null,
    "nextRun": "2026-02-19T09:00:00.000Z",
    "runCount": 0
  }]
}

Delete Schedule

DELETE /api/v1/schedule/:scheduleId

Cancels and removes a scheduled task.

Templates

Pre-built project scaffolds to jumpstart tasks. No auth required.

List Templates

GET /api/v1/templates

Optional query: ?category=web to filter by category.

{
  "templates": [{
    "id": "landing",
    "name": "Landing Page",
    "description": "Modern landing page with hero, features, CTA",
    "category": "web",
    "suggestedFeatures": ["Hero section", "Feature grid"],
    "estimatedTime": "2-3 min"
  }],
  "usage": "Include \"template\": \"<id>\" in POST /api/v1/task to use a template"
}

Get Template

GET /api/v1/templates/:id

Returns full template details including file structure and config.

Skills

Skills inject domain-specific knowledge into code generation. Community-contributed via skills-registry.

GET /api/v1/skills
solana Wallet connection, dApp development, Anchor programs ✓ verified
auth NextAuth.js v5 — OAuth, credentials, sessions, protected routes ✓ verified
stripe Stripe payments — checkout, subscriptions, webhooks, billing ✓ verified

Want to add a skill? Submit a PR to the registry.

Webhooks

Webhook Triggers

Connect external services to trigger your app's AI agent automatically. When GitHub opens an issue, Stripe processes a payment, or your uptime monitor detects downtime — your agent reacts.

Endpoints

GET/hosting/app/:id/webhooksList webhooks
POST/hosting/app/:id/webhooksCreate webhook
PATCH/hosting/app/:id/webhooks/:whIdUpdate webhook
DEL/hosting/app/:id/webhooks/:whIdDelete webhook
GET/hosting/app/:id/webhooks/:whId/triggersRecent triggers (last 20)
POST/hosting/app/:id/webhooks/:whId/rotate-secretRegenerate HMAC secret

Create Webhook

POST /api/v1/hosting/app/:id/webhooks
{
  "slug": "github-issues",
  "prompt_template": "A GitHub issue was opened:\n\n<webhook_payload>\n{{payload}}\n</webhook_payload>\n\nAnalyze and fix if possible.",
  "cooldown_seconds": 60,
  "filters": { "action": "opened" }
}

Response

{
  "id": "wh-abc123",
  "url": "https://vibekit.bot/hook/randomtoken123",
  "secret": "hmac-secret-for-verification",
  "enabled": true
}
ParameterTypeDescription
slugstringURL-safe identifier (lowercase, hyphens ok). Must be unique per app.
prompt_templatestringAgent prompt. Use {{payload}} for the incoming data, {{slug}} for the webhook name.
cooldown_secondsnumberMinimum seconds between triggers (default: 30)
filtersobjectOptional payload matching. Key paths checked with dot notation.

Trigger a Webhook

POST /hook/:hookToken

External services POST here. No authentication required — the URL token is the credential. Returns 202 immediately; agent processes asynchronously.

# GitHub sends this automatically when an issue is opened
curl -X POST https://vibekit.bot/hook/randomtoken123 \
  -H "Content-Type: application/json" \
  -H "X-Hub-Signature-256: sha256=..." \
  -d '{"action":"opened","issue":{"title":"Bug in login"}}'

Security

HMAC VerificationAutomatic for GitHub (X-Hub-Signature-256), Stripe (Stripe-Signature), and generic (X-Webhook-Signature)
Rate Limit10 triggers per minute per app
CooldownConfigurable per webhook (default 30s). Returns 429 if triggered too fast.
Loop PreventionOnly one webhook-triggered agent run per app at a time
Payload Cap4KB max in agent prompt (larger payloads are truncated)

Templates

Pre-built templates available in the dashboard Webhooks tab:

TemplateSlugUse Case
GitHub Issuesgithub-issuesAgent analyzes and fixes bugs from new issues
GitHub Pushgithub-pushAgent reviews and tests new commits
Stripe Paymentstripe-paymentAgent processes payment events and updates records
Health Checkhealth-checkAgent investigates downtime alerts from uptime monitors

Outbound Callbacks

Get notified when tasks or agent messages complete. Include callbackUrl in your request.

{
  "event": "task.complete",
  "taskId": "task_abc123",
  "status": "complete",
  "result": {
    "summary": "Built landing page with hero and email form",
    "deployUrl": "https://project.vibekit.bot"
  }
}

Headers

X-VibeKit-SignatureHMAC-SHA256 signature (using your API key)
X-VibeKit-EventEvent type (e.g. task.complete)
X-VibeKit-DeliveryUnique delivery ID

Push Notifications

PWA push notifications for agent responses, deploy completions, and app events. Requires the dashboard PWA (app.vibekit.bot).

Get VAPID Key

GET /api/v1/push/vapid-key

Returns the server's VAPID public key for Web Push subscription.

Subscribe

POST /api/v1/push/subscribe

Register a push subscription. Body: Web Push subscription object from PushManager.subscribe().

{
  "subscription": {
    "endpoint": "https://fcm.googleapis.com/...",
    "keys": { "p256dh": "...", "auth": "..." }
  }
}

Unsubscribe

POST /api/v1/push/unsubscribe

Remove a push subscription. Body: {"endpoint": "..."}

Preferences

GET PUT /api/v1/push/preferences

Get or update notification channel preferences.

// PUT body
{
  "channels": ["agent", "deploy", "crash"]
}

Test Notification

POST /api/v1/push/test

Send a test push notification to all your subscribed devices.

Activity Feed

GET /api/v1/hosting/events

Returns a chronological feed of hosting events — deployments, restarts, domain changes, agent activity, and more.

{
  "events": [
    {
      "type": "deploy",
      "appId": "app_abc123",
      "message": "Deployed my-app from owner/repo",
      "timestamp": "2026-02-12T20:30:00Z"
    }
  ]
}

Feedback

POST /api/v1/feedback

Submit feedback, bug reports, or feature requests.

{
  "message": "Great product! Would love to see Python support.",
  "type": "feature-request"  // feedback | bug | feature-request
}

Error Codes

Code Meaning
200Success
201Task created
202Accepted (async processing)
400Bad request — missing or invalid parameters
401Invalid or missing API key
402Insufficient balance or plan limit reached
403Feature requires paid plan (e.g. database)
404Resource not found
429Rate limited
502Agent gateway error (retry)
500Internal server error

Error Response Format

{
  "error": "Human readable message",
  "code": "INSUFFICIENT_BALANCE"
}

Rate limit responses include these headers:

X-RateLimit-LimitMax requests per window
X-RateLimit-RemainingRequests left in window
X-RateLimit-ResetUnix timestamp when window resets
Retry-AfterSeconds to wait (only on 429)

Rate Limits

Plan Requests/min Sessions/mo
Free6010
Builder12050
Pro240200

Pricing

Free

$0

  • 10 sessions/mo
  • 1 hosted app
  • 256MB memory
  • Database $3/mo addon
  • 0 custom domains

Builder

$19/mo

  • 50 sessions/mo
  • 3 hosted apps
  • 256MB memory
  • Postgres database
  • 1 custom domain
  • $0.35/extra from balance

Pro

$49/mo

  • 200 sessions/mo
  • 10 hosted apps
  • 512MB memory
  • Postgres database
  • Unlimited domains
  • $0.25/extra from balance

Top Up Balance

Add balance anytime — it never expires. $1 = $1.

$5

topup_5

$15

topup_15

$50

topup_50

Container Memory Add-ons

Upgrade your app's memory allocation per-container.

512MB +$3/mo per app
1GB +$8/mo per app
💡

BYOK = Free: Connect your API key (Claude or OpenAI) in settings or pass anthropicApiKey in task requests. VibeKit costs you nothing — you pay your AI provider directly.

CLI

# Install
npm install -g vibekit-cli

# Login
vibekit login

# Build something
vibekit build "Create a blog with markdown"

# Check status
vibekit status task_abc123

MCP Server

Use VibeKit as an MCP tool with Claude Desktop.

npm install -g vibekit-mcp

Add to Claude Desktop config:

{
  "mcpServers": {
    "vibekit": {
      "command": "vibekit-mcp",
      "env": {"VIBEKIT_API_KEY": "vk_..."}
    }
  }
}

Advanced Workflows

For complex features, combine VibeKit with Antfarm multi-agent workflows.

Antfarm provides plan → implement → verify → test → review cycles with specialized AI agents. VibeKit handles deployment.

# Antfarm develops the feature
antfarm workflow run feature-dev "Add Stripe checkout"

# VibeKit deploys when ready
curl -X POST https://vibekit.bot/api/v1/task \
  -H "Authorization: Bearer $KEY" \
  -d '{"prompt": "Deploy latest", "repo": "user/app"}'

Use VibeKit for quick iterations, Antfarm for features needing verification gates.