Routes DigitalOcean App Platform tasks to specialized sub-skills. Use when working with App Platform deployments, migrations, database configuration, networking, or troubleshooting.
This skill routes DigitalOcean App Platform tasks to specialized sub-skills. Each sub-skill is optimized for a specific workflow, keeping context focused and responses precise.
Philosophy: These skills are opinionated playbooks, not documentation replicas. They make decisions for you (VPC by default, GitHub Actions for CI/CD, etc.) and only defer to docs for edge cases.
Key Principle: Skills contain only DO-specific knowledge the LLM doesn't have from training. Generic SQL, SDK patterns, and programming concepts are NOT duplicated here.
Trust the AI: The AI assistant should reason about the full workflow, chain skills together when needed, and adapt based on context (greenfield vs brownfield vs troubleshooting). Skills provide domain knowledge, not rigid scripts to follow blindly.
| Skill | Purpose | Key Artifacts |
|---|---|---|
| devcontainers | Local development environment with prod parity | .devcontainer/, docker-compose.dev.yml |
| Skill | Purpose | Key Artifacts |
|---|---|---|
| designer | Natural language β production-ready App Spec | .do/app.yaml |
| migration | Convert existing apps (Heroku, AWS, etc.) to App Platform. Deep Heroku chapter with Procfile/app.json/heroku.yml parsing, add-on mapping, pipeline migration | .do/app.yaml, migration checklist |
| planner | Generate staged project plans from design to deployment | Plan/*.md stage files |
| Skill | Purpose | Key Artifacts |
|---|---|---|
| deployment | Ship code to production via GitHub Actions | .github/workflows/deploy.yml |
| troubleshooting | Debug running apps with pre-built debug container, analyze logs | Fixes, diagnostic reports |
| sandbox | Isolated containers for AI agent code execution, testing | Ephemeral sandboxes |
| Skill | Purpose | Key Artifacts |
|---|---|---|
| postgres | Full PostgreSQL setup: schemas, users, permissions, multi-tenant | SQL scripts (user-executed) |
| managed-db-services | MySQL, MongoDB, Valkey, Kafka, OpenSearch (bindable vars) | App spec snippets |
| spaces | S3-compatible object storage configuration | CORS config, app spec snippets |
| Skill | Purpose | Key Artifacts |
|---|---|---|
| ai-services | Gradient AI inference endpoints | App spec snippets |
CRITICAL: AI assistants cannot use doctl apps console β it opens an interactive WebSocket session that requires human input. Use the do-app-sandbox Python package instead.
# Install
uv pip install do-app-sandbox # or: pip install do-app-sandbox
| Use Case | SDK Method | Skill |
|---|---|---|
| Debug EXISTING app | Sandbox.get_from_id(app_id, component) |
troubleshooting |
| Create NEW sandbox | Sandbox.create(), SandboxManager |
sandbox |
# Debug existing app (troubleshooting skill)
app = Sandbox.get_from_id(app_id="your-app-id", component="web")
# Create new isolated sandbox (sandbox skill)
sandbox = Sandbox.create(image="python")
Full guide: See shared/console-sdk-patterns.md
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β USER REQUEST β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββ
β Setting up development? β
βββββββββββββββββββββββββββ
β
"local" / "devcontainer"
βΌ
βββββββββββββ
βdevcontainersβ
βββββββββββββ
β
βΌ
βββββββββββββββββββββββββββ
β Designing or creating? β
βββββββββββββββββββββββββββ
β β β
"new app"β β "migrate" β "plan" / "staged"
βΌ βΌ βΌ
βββββββββββββ βββββββββββββ βββββββββββββ
β designer β β migration β β planner β
βββββββββββββ βββββββββββββ βββββββββββββ
β
βΌ
βββββββββββββββββββββββββββ
β Shipping code? β
βββββββββββββββββββββββββββ
β
"deploy" / "ship" / "release"
βΌ
βββββββββββββ
βdeployment β
βββββββββββββ
β
βΌ
βββββββββββββββββββββββββββ
β Something broken? β
βββββββββββββββββββββββββββ
β
"broken" / "failing" / "debug" / "logs"
βΌ
βββββββββββββββββ
βtroubleshootingβ
βββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββ
β Need isolated execution?β
βββββββββββββββββββββββββββ
β
"sandbox" / "isolated" / "execute code" / "code interpreter"
βΌ
βββββββββββββ
β sandbox β
βββββββββββββ
β
βΌ
βββββββββββββββββββββββββββ
β Configuring data? β
βββββββββββββββββββββββββββ
β β β
"postgres" β "mysql" β β "storage" / "S3" / "spaces"
(complex) β "mongo" β β
β "valkey" β β
β "kafka" β β
β "opensearch" β
βΌ βΌ βΌ
βββββββββββββ βββββββββββββββββββββββ βββββββββββββ
β postgres β β managed-db-services β β spaces β
βββββββββββββ βββββββββββββββββββββββ βββββββββββββ
β
βΌ
βββββββββββββββββββββββββββ
β AI inference needed? β
βββββββββββββββββββββββββββ
β
"gradient" / "LLM" / "inference"
βΌ
βββββββββββββββ
β ai-services β
βββββββββββββββ
The AI assistant should reason about the full workflow, not just route to a single skill.
| Request Type | Workflow | Skills Chain |
|---|---|---|
| Full Greenfield | "Build a new app from scratch" | devcontainers β designer β planner β deployment |
| Migration | "Migrate from Heroku/AWS" | migration β (then full greenfield workflow) |
| Brownfield | "Deploy my existing app" | planner β deployment |
| Enhancement | "Add Kafka to my app" | managed-db-services β update app.yaml β deployment |
| Troubleshooting | "My app is broken" | troubleshooting (standalone) |
| AI Agent Execution | "Run code in isolation" | sandbox (standalone) |
| Specific Task | "Set up PostgreSQL" | postgres (standalone) |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β UNDERSTAND THE GOAL β
β Is this a single task or a multi-phase workflow? β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββ΄ββββββββββββββββ
β β
βΌ βΌ
βββββββββββββββ βββββββββββββββ
β Single Task β β Workflow β
β β β β
β Route to β β Chain β
β one skill β β multiple β
βββββββββββββββ βββββββββββββββ
β β
βΌ βΌ
troubleshooting migration β designer β
postgres planner β deployment
spaces
etc.
"I want to build a new event-driven app with Kafka"
.do/app.yaml with Kafka"Migrate my Heroku app to DigitalOcean"
.do/app.yaml"My deployed app keeps returning 502"
"Add PostgreSQL to my existing app"
.do/app.yaml with database bindingThe AI assistant should:
Trust the AI to reason. These skills provide domain knowledge, not rigid scripts.
| Route To | Trigger Phrases |
|---|---|
| devcontainers | "local dev", "docker compose", "run locally", "devcontainer" |
| designer | "design my app", "create app spec", "new application", "architect" |
| migration | "migrate", "convert", "move from Heroku", "move from AWS", "Heroku", "Procfile", "heroku.yml", "dynos", "Heroku add-ons", "Heroku pipeline" |
| planner | "create a plan", "plan this project", "staged approach", "plan deployment", "how should I deploy" |
| deployment | "deploy", "ship", "release", "GitHub Actions", "CI/CD" |
| troubleshooting | "broken", "failing", "debug", "logs", "502", "crash", "error" |
| sandbox | "sandbox", "isolated environment", "execute code", "code interpreter", "run untrusted code", "agent execution", "hot pool" |
| postgres | "postgres", "postgresql", "schema isolation", "multi-tenant database" |
| managed-db-services | "mysql", "mongodb", "mongo", "valkey", "redis", "kafka", "opensearch" |
| spaces | "object storage", "S3", "Spaces", "file upload", "bucket" |
| ai-services | "gradient", "inference", "LLM endpoint", "AI platform" |
For integrations not covered by dedicated skills (DataDog, Sentry, New Relic, Stripe, etc.):
envs:
- key: DATADOG_API_KEY
scope: RUN_TIME
value: ${DATADOG_API_KEY} # From GitHub Secrets
β The agent's training covers vendor-specific patterns β no skill required.
CRITICAL: These skills are designed to keep credentials out of agent hands.
1. GITHUB SECRETS (RECOMMENDED DEFAULT)
βββ Agent never sees credentials
βββ User manually adds: Repo β Settings β Secrets β Actions
βββ Workflow references: ${{ secrets.DATABASE_URL }}
βββ Agent generates workflow, user handles secrets
2. APP PLATFORM BINDABLE VARIABLES
βββ For DO Managed Databases (Postgres, MySQL, MongoDB, etc.)
βββ Credentials injected via ${db.DATABASE_URL}
βββ Agent configures app spec, never sees credentials
βββ Best for: Apps using DO managed services
3. LOCAL .ENV + EPHEMERAL APP SPEC
βββ User maintains .env file locally
βββ Agent creates temp app spec with placeholders
βββ Substitutes values β Deploys β Deletes temp file
4. EXTERNAL SERVICES
βββ Same patterns as #1 or #3
βββ User responsible for credential management
All skills produce and consume artifacts with consistent naming:
| Artifact | Filename | Producer | Consumer |
|---|---|---|---|
| App Spec | .do/app.yaml |
designer, migration | deployment, planner |
| Deploy Button | .do/deploy.template.yaml |
designer, migration | GitHub |
| Deployment Plan | Plan/0N-*.md |
planner | User, deployment |
| Dev Environment | .devcontainer/devcontainer.json |
devcontainers | VS Code, Cursor |
| Docker Compose | docker-compose.yml |
devcontainers | Docker Desktop |
| CI/CD Workflow | .github/workflows/deploy.yml |
deployment, planner | GitHub Actions |
| SQL Scripts | db-*.sql |
postgres | User (manual execution) |
| CORS Config | spaces-cors.json |
spaces | DO Console |
When a skill completes, it should:
.do/app.yaml with 3-component architecture"| Skill | Required | Optional |
|---|---|---|
| devcontainers | filesystem, docker, git | gh |
| designer | filesystem | β |
| migration | filesystem, doctl, git, python | gh, DigitalOcean MCP |
| deployment | filesystem, doctl, git, python | gh, GitHub MCP |
| troubleshooting | filesystem, python, doctl | β |
| sandbox | filesystem, python, doctl | β |
| postgres | filesystem, psql | β (scripts only) |
| managed-db-services | filesystem, doctl | β |
| spaces | filesystem | s3cmd (for bucket ops; doctl only manages keys) |
| ai-services | filesystem | β |
app-platform-skills/
βββ SKILL.md # This file (router)
βββ skills/
β βββ devcontainers/SKILL.md
β βββ designer/SKILL.md
β βββ migration/SKILL.md
β βββ deployment/SKILL.md
β βββ planner/SKILL.md # Staged project plans (design to deployment)
β β βββ templates/ # Local + Tier 1, 2, 3 stage templates
β βββ troubleshooting/SKILL.md
β βββ sandbox/SKILL.md # Isolated containers for AI agent execution
β βββ postgres/SKILL.md
β βββ managed-db-services/SKILL.md # MySQL, MongoDB, Valkey, Kafka, OpenSearch
β βββ spaces/SKILL.md
β βββ ai-services/SKILL.md # Gradient AI
βββ shared/
βββ app-spec-schema.yaml
βββ artifact-contracts.md
βββ credential-patterns.md
| Domain | Default | Override Trigger |
|---|---|---|
| Networking | VPC-only, internal routing | User explicitly requests public |
| CI/CD | GitHub + GitHub Actions | User specifies GitLab/Bitbucket |
| Secrets | GitHub Secrets | User has existing vault |
| Build | Dockerfile | User explicitly prefers buildpacks |
| Database | DO Managed + Bindable Variables | User has external DB |
| Monorepo | Supported by default (source_dir) | N/A |
| Python env | uv for package/venv management | User prefers pip/poetry |
| Node env | nvm for version management | User prefers n/volta |
If a task doesn't fit any skill or spans multiple skills ambiguously: