mcpField
A
app-platform-designer

app-platform-designer

github.com/digitalocean-labsCloud & DevOps3890 installsUpdated 3d ago
Repository

About app-platform-designer

A skill that turns natural-language requirements or an existing repository into DigitalOcean App Platform configuration, for developers designing and deploying applications. It produces app specs, deploy templates, and environment-variable examples, with guidance for architecture choices and validation.

Key features

  1. 01Generate app specs from requirements
  2. 02Analyze repositories and create configuration
  3. 03Create Deploy to DO templates
  4. 04Plan multi-environment applications
  5. 05Select service and database components
  6. 06Validate specs with doctl

Use cases

  1. 01Plan an App Platform architecture from an app description
  2. 02Create an app spec for an existing repository
  3. 03Add a deploy button to a public GitHub repository
  4. 04Design multi-environment application configuration

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/digitalocean-labs/do-app-platform-skills --skill app-platform-designer

After installing, type/app-platform-designerin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

README.md
reference/
architecture-patterns.md
component-types.md
database-configuration.md
deploy-to-do-button.md
environment-variables.md

Details

From the project README

App Platform Designer Skill

Transform natural language descriptions into production-ready App Platform specifications.

Primary question: "I want to build [description]. What should my App Platform architecture look like?"

Produces:

  • .do/app.yaml — App Platform specification
  • .do/deploy.template.yaml — Deploy to DO button (public repos)
  • .env.example — Environment variable template

Quick Decision

What do you need?
├── Design new app from description → Workflow 1
├── Analyze repo and create spec → Workflow 2
├── Add Deploy to DO button → Workflow 3
└── Multi-environment setup → Workflow 4

Workflow 1: Natural Language → App Spec

Trigger: "I need a web app with [description]"

  1. Gather requirements:

    • What does the app do?
    • Language/framework?
    • Database needs?
    • Background processing?
  2. Decompose into components:

    • HTTP-facing → services
    • Background processors → workers
    • One-time/scheduled → jobs
    • Static frontends → static_sites
    • Data stores → databases
  3. Generate spec with health checks, env vars, routing

  4. Validate: doctl apps spec validate .do/app.yaml

Full guide: See architecture-patterns.md


Workflow 2: Analyze Repository → App Spec

Trigger: "Here's my repo, create an app spec"

Check for:
├── Dockerfile → Use dockerfile build
├── package.json → Node.js app
├── requirements.txt / pyproject.toml → Python app
├── go.mod → Go app
├── Multiple directories with above → Monorepo

Full guide: See component-types.md


Workflow 3: Deploy to DO Button

Trigger: "Add Deploy to DigitalOcean button"

Requirements: Public GitHub repository

  1. Create .do/deploy.template.yaml (wraps spec in spec: key, uses git: block)
  2. Add button to README
[![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/OWNER/REPO/tree/BRANCH)

Full guide: See deploy-to-do-button.md


Opinionated Defaults

DecisionDefaultRationale
Instance sizeapps-s-1vcpu-1gbGood starting point
Instance count1Start minimal
DatabaseDev databaseCost-effective
CacheValkey (not Redis)Redis is EOL
BuildDockerfile if presentMore control
Health check/health or /healthzIndustry standard
Deploy on pushtrueGitOps workflow
RegionnycGood default
Source formatgit: blockRequired for deploy.template.yaml

Component Summary

TypeUse CaseExample
servicesHTTP workloadsAPIs, web apps
workersBackground processingQueue consumers, internal APIs
jobsOne-time/scheduledMigrations, reports
static_sitesFrontend/docsReact, Vue, marketing
databasesData storagePostgreSQL, Valkey

Full guide: See component-types.md


Pattern Selection

What are you building?
├── Simple app (1 service)? → Pattern 1
├── Frontend + API? → Pattern 2
├── Need background processing? → Pattern 3
├── Monorepo? → Pattern 4
└── Complex SaaS? → Pattern 5

Full patterns: See architecture-patterns.md


Quick Start: Single Service + DB

name: my-app
region: nyc

services:
  - name: web
    git:
      repo_clone_url: https://github.com/owner/repo.git
      branch: main
    http_port: 8080
    instance_size_slug: apps-s-1vcpu-1gb
    health_check:
      http_path: /health
    envs:
      - key: DATABASE_URL
        scope: RUN_TIME
        value: ${db.DATABASE_URL}

databases:
  - name: db
    engine: PG
    production: false

Quick Start: API + Frontend

name: fullstack-app
region: nyc

services:
  - name: api
    git:
      repo_clone_url: https://github.com/owner/repo.git
      branch: main
    source_dir: /api
    http_port: 8080
    health_check:
      http_path: /health
    envs:
      - key: DATABASE_URL
        scope: RUN_TIME
        value: ${db.DATABASE_URL}

static_sites:
  - name: frontend
    git:
      repo_clone_url: https://github.com/owner/repo.git
      branch: main
    source_dir: /frontend
    build_command: npm run build
    output_dir: dist
    envs:
      - key: VITE_API_URL
        scope: BUILD_TIME
        value: /api

databases:
  - name: db
    engine: PG
    production: false

ingress:
  rules:
    - match:
        path:
          prefix: /api
      component:
        name: api
    - match:
        path:
          prefix: /
      component:
        name: frontend

Environment-Portable Design

All code must work in: local dev, Docker Compose, AND App Platform.

PrincipleImplementation
Bind to $PORTprocess.env.PORT || 3000
Public servicesListed in ingress.rules
Internal servicesNot in ingress, use ${name.PRIVATE_URL}
Never hardcodeUse env vars with defaults
// Portable port binding
const port = process.env.PORT || 3000
server.listen({ port, host: '0.0.0.0' })

Database Quick Reference

EngineSlugDev DB?Notes
PostgreSQLPGYesRecommended
ValkeyVALKEYYesUse instead of Redis
MySQLMYSQLNoManaged only
MongoDBMONGODBNoManaged only

Full guide: See database-configuration.md


Environment Variables Quick Reference

ScopeUse Case
RUN_TIMESecrets, DB URLs
BUILD_TIMEPublic API URLs, feature flags
RUN_AND_BUILD_TIMENPM tokens, shared config
PlaceholderResolves To
${db.DATABASE_URL}Database connection string
${service.PRIVATE_URL}Internal service URL
${service.PUBLIC_URL}Public service URL

Full guide: See environment-variables.md


Ingress (Routing)

ingress:
  rules:
    - match:
        path:
          prefix: /api
      component:
        name: api
    - match:
        path:
          prefix: /
      component:
        name: frontend

For advanced routing: See networking skill


Validation

doctl apps spec validate .do/app.yaml
doctl apps spec validate .do/deploy.template.yaml
ErrorFix
invalid component nameUse lowercase, hyphens only
unknown instance sizeCheck instance-sizes.yaml
invalid database referenceVerify database name matches
routes is deprecatedUse ingress.rules

Instance Sizes

SlugCPURAMPriceUse Case
apps-s-1vcpu-0.5gb1 shared512 MiB$5/moWorkers, jobs
apps-s-1vcpu-1gb1 shared1 GiB$12/moDefault
apps-d-1vcpu-2gb1 dedicated2 GiB$39/moProduction

Full list: See shared/instance-sizes.yaml


Reference Files


Shared References


Integration with Other Skills

  • → deployment: Deploy the generated app spec via GitHub Actions
  • → devcontainers: Create local dev environment with prod parity
  • → postgres: Advanced database configuration
  • → networking: Custom domains, CORS, VPC
  • → migration: Convert from other platforms

Comments

Markdown supported