createos
CreateOS Platform Skills
Ship anything to production — AI agents, APIs, backends, bots, MCP servers, frontends, webhooks, workers, and more.
⚠️ IMPORTANT: Authentication
For AI Agents (MCP) - USE THIS
When connected via MCP (OpenClaw, MoltBot, ClawdBot, Claude), NO API KEY NEEDED. The MCP server handles authentication automatically.
MCP Endpoint: https://api-createos.nodeops.network/mcp
Just call the tools directly:
CreateProject(...)
UploadDeploymentFiles(...)
ListProjects(...)
For REST API (Scripts/External)
When calling REST endpoints directly (curl, Python requests, etc.):
X-Api-Key: <your-api-key>
Base URL: https://api-createos.nodeops.network
Get API key via MCP: CreateAPIKey({name: "my-key", expiryAt: "2025-12-31T23:59:59Z"})
🚀 Quick Start for MCP Agents
Deploy Files Directly (Fastest)
// 1. Create upload project
CreateProject({
"uniqueName": "my-app",
"displayName": "My App",
"type": "upload",
"source": {},
"settings": {
"runtime": "node:20",
"port": 3000
}
})
// 2. Upload files and deploy
UploadDeploymentFiles(project_id, {
"files": [
{"path": "package.json", "content": "{\"name\":\"app\",\"scripts\":{\"start\":\"node index.js\"}}"},
{"path": "index.js", "content": "require('http').createServer((req,res)=>{res.end('Hello!')}).listen(3000)"}
]
})
// Result: https://my-app.createos.io is live!
Deploy from GitHub (Auto-deploy on push)
// 1. Get GitHub installation ID
ListConnectedGithubAccounts()
// Returns: [{installationId: "12345", ...}]
// 2. Find repo ID
ListGithubRepositories("12345")
// Returns: [{id: "98765", fullName: "myorg/myrepo", ...}]
// 3. Create VCS project
CreateProject({
"uniqueName": "my-app",
"displayName": "My App",
"type": "vcs",
"source": {
"vcsName": "github",
"vcsInstallationId": "12345",
"vcsRepoId": "98765"
},
"settings": {
"runtime": "node:20",
"port": 3000,
"installCommand": "npm install",
"buildCommand": "npm run build",
"runCommand": "npm start"
}
})
// Auto-deploys on every git push!
Deploy Docker Image
// 1. Create image project
CreateProject({
"uniqueName": "my-service",
"displayName": "My Service",
"type": "image",
"source": {},
"settings": {
"port": 8080
}
})
// 2. Deploy image
CreateDeployment(project_id, {
"image": "nginx:latest"
})
Table of Contents
- Introduction
- Core Skills Overview
- Project Management Skills
- Deployment Skills
- Environment Management Skills
- Domain & Routing Skills
- GitHub Integration Skills
- Analytics & Monitoring Skills
- Security Skills
- Organization Skills (Apps)
- API Key Management Skills
- Common Deployment Patterns
- Best Practices
- Troubleshooting & Edge Cases
- API Quick Reference
Introduction
What is CreateOS?
CreateOS is a cloud deployment platform designed for rapid shipping of any workload — from simple static sites to complex multi-agent AI systems. It provides:
- Three deployment methods: GitHub auto-deploy, Docker images, direct file upload
- Multi-environment support: Production, staging, development with isolated configs
- Built-in CI/CD: Automatic builds and deployments on git push
- Custom domains: SSL/TLS included, DNS verification
- Real-time analytics: Request metrics, error tracking, performance monitoring
- Security scanning: Vulnerability detection for deployments
Target Users
| User Type | Primary Use Cases |
|---|---|
| AI/ML Engineers | Deploy agents, MCP servers, RAG pipelines, LLM services |
| Backend Developers | Ship APIs, microservices, webhooks, workers |
| Frontend Developers | Deploy SPAs, SSR apps, static sites |
| DevOps Engineers | Manage environments, domains, scaling, monitoring |
| Bot Developers | Host Discord, Slack, Telegram bots |
Supported Technologies
Runtimes: node:18, node:20, node:22, python:3.11, python:3.12, golang:1.22, golang:1.25, rust:1.75, bun:1.1, bun:1.3, static
Frameworks: nextjs, reactjs-spa, reactjs-ssr, vuejs-spa, vuejs-ssr, nuxtjs, astro, remix, express, fastapi, flask, django, gin, fiber, actix
Core Skills Overview
🔌 MCP Tools Available (Direct Call - No Auth Needed)
When using CreateOS via MCP (OpenClaw, Claude, etc.), these tools are available directly:
Projects:
CreateProject- Create new project (vcs, image, or upload type)ListProjects- List all projectsGetProject- Get project detailsUpdateProject- Update project metadataUpdateProjectSettings- Update build/runtime settingsDeleteProject- Delete project
Deployments:
CreateDeployment- Deploy Docker image (image projects)TriggerLatestDeployment- Trigger build from GitHub (vcs projects)UploadDeploymentFiles- Upload files to deploy (upload projects)UploadDeploymentBase64Files- Upload binary files as base64UploadDeploymentZip- Upload zip archiveListDeployments- List all deploymentsGetDeployment- Get deployment statusGetBuildLogs- View build logsGetDeploymentLogs- View runtime logsRetriggerDeployment- Retry failed deploymentCancelDeployment- Cancel queued/building deploymentWakeupDeployment- Wake sleeping deployment
Environments:
CreateProjectEnvironment- Create environment (production, staging, etc.)ListProjectEnvironments- List environmentsUpdateProjectEnvironment- Update environment configUpdateProjectEnvironmentEnvironmentVariables- Set env varsUpdateProjectEnvironmentResources- Scale CPU/memory/replicasAssignDeploymentToProjectEnvironment- Assign deployment to envDeleteProjectEnvironment- Delete environment
Domains:
CreateDomain- Add custom domainListDomains- List domainsRefreshDomain- Verify DNSUpdateDomainEnvironment- Assign domain to environmentDeleteDomain- Remove domain
GitHub:
ListConnectedGithubAccounts- Get connected GitHub accountsListGithubRepositories- List accessible reposListGithubRepositoryBranches- List branches
Apps:
CreateApp- Create app to group projectsListApps- List appsAddProjectsToApp- Add projects to app
User:
GetCurrentUser- Get user infoGetQuotas- Check usage limitsGetSupportedProjectTypes- List runtimes/frameworks
Functional Skills
| Skill Category | Capabilities |
|---|---|
| Project Management | Create, configure, update, delete, transfer projects |
| Deployment | Build, deploy, rollback, wake, cancel deployments |
| Environment Management | Multi-env configs, env vars, resource scaling |
| Domain Management | Custom domains, SSL, DNS verification |
| GitHub Integration | Auto-deploy, branch management, repo access |
| Analytics | Request metrics, error rates, performance data |
| Security | Vulnerability scanning, API key management |
| Organization | Group projects into apps, manage services |
Technical Skills
| Skill | Description |
|---|---|
| Authentication | API key-based auth with expiry management |
| Build AI | Automatic build configuration detection |
| Dockerfile Support | Custom container builds |
| Environment Isolation | Separate configs per environment |
| Resource Management | CPU, memory, replica scaling |
Project Management Skills
Skill: Create Projects
Create new projects with full configuration for build and runtime settings.
Project Types
| Type | Description | Best For |
|---|---|---|
vcs |
GitHub-connected repository | Production apps with CI/CD |
image |
Docker container deployment | Pre-built images, complex deps |
upload |
Direct file upload | Quick prototypes, static sites |
VCS Project Creation
What it does: Links a GitHub repository for automatic deployments on push.
Why it's useful: Enables GitOps workflow — push to deploy with zero manual intervention.
How to implement:
CreateProject({
"uniqueName": "my-nextjs-app",
"displayName": "My Next.js Application",
"type": "vcs",
"source": {
"vcsName": "github",
"vcsInstallationId": "12345678",
"vcsRepoId": "98765432"
},
"settings": {
"framework": "nextjs",
"runtime": "node:20",
"port": 3000,
"directoryPath": ".",
"installCommand": "npm install",
"buildCommand": "npm run build",
"runCommand": "npm start",
"buildVars": {
"NODE_ENV": "production",
"NEXT_PUBLIC_API_URL": "https://api.example.com"
},
"runEnvs": {
"DATABASE_URL": "postgresql://...",
"SECRET_KEY": "..."
},
"ignoreBranches": ["develop", "feature/*"],
"hasDockerfile": false,
"useBuildAI": false
},
"appId": "optional-app-uuid",
"enabledSecurityScan": true
})
Prerequisites:
- GitHub account connected via
InstallGithubApp - Repository access granted to CreateOS GitHub App
Potential pitfalls:
- Incorrect
vcsRepoIdcauses deployment failures - Missing
portsetting results in health check failures buildVarsvsrunEnvsconfusion (build-time vs runtime)
Image Project Creation
What it does: Deploys pre-built Docker images without build step.
Why it's useful: Faster deployments, complex dependencies, existing CI pipelines.
CreateProject({
"uniqueName": "my-api-service",
"displayName": "My API Service",
"type": "image",
"source": {},
"settings": {
"port": 8080,
"runEnvs": {
"API_KEY": "secret",
"LOG_LEVEL": "info"
}
}
})
Implications:
- No build logs (image already built)
- Must manage image registry separately
- Version control via image tags
Upload Project Creation
What it does: Deploy by uploading files directly — no Git required.
Why it's useful: Quick prototypes, migrations, CI-generated artifacts.
CreateProject({
"uniqueName": "quick-prototype",
"displayName": "Quick Prototype",
"type": "upload",
"source": {},
"settings": {
"framework": "express",
"runtime": "node:20",
"port": 3000,
"installCommand": "npm install",
"buildCommand": "npm run build",
"buildDir": "dist",
"useBuildAI": true
}
})
Skill: Update Project Settings
Modify build and runtime configuration without recreating projects.
UpdateProjectSettings(project_id, {
"framework": "nextjs",
"runtime": "node:22",
"port": 3000,
"installCommand": "npm ci",
"buildCommand": "npm run build",
"runCommand": "npm start",
"buildDir": ".next",
"buildVars": {"NODE_ENV": "production"},
"runEnvs": {"NEW_VAR": "value"},
"ignoreBranches": ["wip/*"],
"hasDockerfile": false,
"useBuildAI": false
})
Edge cases:
- Changing
runtimetriggers rebuild on next deployment - Changing
portrequires redeployment to take effect ignoreBranchesonly affects future pushes
Skill: Project Lifecycle Management
| Operation | Tool | Use Case |
|---|---|---|
| List projects | ListProjects(limit?, offset?, name?, type?, status?, app?) |
Dashboard, search |
| Get details | GetProject(project_id) |
View full config |
| Update metadata | UpdateProject(project_id, {displayName, description?, enabledSecurityScan?}) |
Rename, toggle features |
| Delete | DeleteProject(project_id) |
Cleanup (async deletion) |
| Check name | CheckProjectUniqueName({uniqueName}) |
Validation before create |
Skill: Project Transfer
Transfer project ownership between users.
1. Owner: GetProjectTransferUri(project_id) → returns {uri, token} (valid 6 hours)
2. Owner: Share URI with recipient
3. Recipient: TransferProject(project_id, token)
4. Audit: ListProjectTransferHistory(project_id)
Security implications:
- Token expires after 6 hours
- Transfer is irreversible
- All environments and deployments transfer
Deployment Skills
Skill: Trigger Deployments
For VCS Projects
Automatic (recommended): Push to GitHub triggers deployment automatically.
Manual trigger:
TriggerLatestDeployment(project_id, branch?)
// branch defaults to repo's default branch
For Image Projects
CreateDeployment(project_id, {
"image": "nginx:latest"
})
// Supports any valid Docker image reference:
// - nginx:latest
// - myregistry.com/myapp:v1.2.3
// - ghcr.io/org/repo:sha-abc123
For Upload Projects
Direct files:
UploadDeploymentFiles(project_id, {
"files": [
{"path": "package.json", "content": "{\"name\":\"app\",...}"},
{"path": "index.js", "content": "const express = require('express')..."},
{"path": "public/style.css", "content": "body { margin: 0; }"}
]
})
Base64 files (for binary content):
UploadDeploymentBase64Files(project_id, {
"files": [
{"path": "assets/logo.png", "content": "iVBORw0KGgo..."}
]
})
ZIP upload:
UploadDeploymentZip(project_id, {file: zipBinaryData})
Limitations:
- Max 100 files per upload
- Use ZIP for larger projects
Skill: Deployment Lifecycle
┌─────────┐ ┌──────────┐ ┌───────────┐ ┌──────────┐
│ queued │ → │ building │ → │ deploying │ → │ deployed │
└─────────┘ └──────────┘ └───────────┘ └──────────┘
│ │
↓ ↓
┌────────┐ ┌──────────┐
│ failed │ │ sleeping │
└────────┘ └──────────┘
| State | Description | Actions Available |
|---|---|---|
queued |
Waiting for build slot | Cancel |
building |
Build in progress | Cancel, View logs |
deploying |
Pushing to infrastructure | Wait |
deployed |
Live and serving traffic | Assign to env |
failed |
Build or deploy error | Retry, View logs |
sleeping |
Idle timeout (cost saving) | Wake up |
Skill: Deployment Operations
| Operation | Tool | Notes |
|---|---|---|
| List | ListDeployments(project_id, limit?, offset?) |
Max 20/page, paginate for more |
| Get details | GetDeployment(project_id, deployment_id) |
Full status, timestamps, URLs |
| Retry | RetriggerDeployment(project_id, deployment_id, settings?) |
settings: "project" or "deployment" |
| Cancel | CancelDeployment(project_id, deployment_id) |
Only queued/building states |
| Delete | DeleteDeployment(project_id, deployment_id) |
Marks for async deletion |
| Wake | WakeupDeployment(project_id, deployment_id) |
Restarts sleeping deployment |
| Download | DownloadDeployment(project_id, deployment_id) |
Upload projects only |
Skill: Debug with Logs
Build logs — Debug compilation/build failures:
GetBuildLogs(project_id, deployment_id, skip?)
// skip: number of lines to skip (for pagination)
Runtime logs — Debug application errors:
GetDeploymentLogs(project_id, deployment_id, since-seconds?)
// since-seconds: look back window (default: 60)
Environment logs — Aggregate logs for an environment:
GetProjectEnvironmentLogs(project_id, environment_id, since-seconds?)
Environment Management Skills
Skill: Create Environments
Environments provide isolated configurations for the same codebase.
Typical setup:
production— Live traffic, max resourcesstaging— Pre-production testingdevelopment— Feature development
VCS Project Environment (branch required)
CreateProjectEnvironment(project_id, {
"displayName": "Production",
"uniqueName": "production",
"description": "Live production environment",
"branch": "main",
"isAutoPromoteEnabled": true,
"resources": {
"cpu": 500,
"memory": 1024,
"replicas": 2
},
"settings": {
"runEnvs": {
"NODE_ENV": "production",
"DATABASE_URL": "postgresql://prod-db:5432/app",
"REDIS_URL": "redis://prod-cache:6379"
}
}
})
Image Project Environment (no branch)
CreateProjectEnvironment(project_id, {
"displayName": "Production",
"uniqueName": "production",
"description": "Live production environment",
"resources": {
"cpu": 500,
"memory": 1024,
"replicas": 2
},
"settings": {
"runEnvs": {
"NODE_ENV": "production"
}
}
})
Skill: Resource Management
| Resource | Min | Max | Unit | Implications |
|---|---|---|---|---|
| CPU | 200 | 500 | millicores | Higher = faster processing |
| Memory | 500 | 1024 | MB | Higher = more data in memory |
| Replicas | 1 | 3 | instances | Higher = more availability |
UpdateProjectEnvironmentResources(project_id, environment_id, {
"cpu": 500,
"memory": 1024,
"replicas": 3
})
Scaling considerations:
- Replicas > 1 requires stateless application design
- Memory limits cause OOM kills if exceeded
- CPU throttling occurs at limit (not killed)
Skill: Environment Variables
UpdateProjectEnvironmentEnvironmentVariables(project_id, environment_id, {
"runEnvs": {
"DATABASE_URL": "postgresql://...",
"API_KEY": "new-secret-key",
"LOG_LEVEL": "debug",
"FEATURE_FLAG_X": "enabled"
},
"port": 8080 // Image projects only
})
Best practices:
- Never commit secrets to code — use
runEnvs - Use different values per environment
- Redeploy after changing vars for effect
Skill: Deployment Assignment
Manually control which deployment serves an environment:
AssignDeploymentToProjectEnvironment(project_id, environment_id, {
"deploymentId": "deployment-uuid"
})
Use cases:
- Rollback to previous deployment
- Blue-green deployment switching
- Canary releases (with multiple envs)
Domain & Routing Skills
Skill: Add Custom Domains
CreateDomain(project_id, {
"name": "api.mycompany.com",
"environmentId": "optional-env-uuid" // Assign immediately
})
Response includes DNS instructions:
Add CNAME record:
api.mycompany.com → <createos-provided-target>
Skill: Domain Verification Flow
1. CreateDomain → Status: pending
2. Configure DNS at your registrar
3. Wait for DNS propagation (up to 48 hours)
4. RefreshDomain → Status: active (if verified)
RefreshDomain(project_id, domain_id)
// Only available when status is "pending"
Skill: Domain-Environment Assignment
Route domain traffic to specific environment:
UpdateDomainEnvironment(project_id, domain_id, {
"environmentId": "production-env-uuid"
})
// Set to null to unassign
Multi-domain setup example:
app.example.com→ production environmentstaging.example.com→ staging environmentdev.example.com→ development environment
Skill: Domain Operations
| Operation | Tool |
|---|---|
| List | ListDomains(project_id) |
| Verify | RefreshDomain(project_id, domain_id) |
| Assign | UpdateDomainEnvironment(project_id, domain_id, {environmentId}) |
| Delete | DeleteDomain(project_id, domain_id) |
GitHub Integration Skills
Skill: Connect GitHub Account
InstallGithubApp({
"installationId": 12345678,
"code": "oauth-code-from-github-redirect"
})
Flow:
- User clicks "Connect GitHub" in CreateOS
- Redirected to GitHub for authorization
- GitHub redirects back with
codeandinstallationId - Call
InstallGithubAppto complete connection
Skill: Repository Discovery
// 1. Get connected accounts
ListConnectedGithubAccounts()
// Returns: [{installationId, accountName, accountType}, ...]
// 2. List accessible repositories
ListGithubRepositories(installation_id)
// Returns: [{id, name, fullName, private, defaultBranch}, ...]
// 3. List branches for a repo
ListGithubRepositoryBranches(installation_id, "owner/repo", page?, per-page?, protected?)
// Returns: [{name, protected}, ...]
// 4. Get file tree (for monorepo path selection)
GetGithubRepositoryContent(installation_id, {
"repository": "owner/repo",
"branch": "main",
"treeSha": "optional-tree-sha"
})
Skill: Auto-Deploy Configuration
Branch filtering — Ignore branches from auto-deploy:
UpdateProjectSettings(project_id, {
"ignoreBranches": ["develop", "feature/*", "wip/*"]
})
Auto-promote — Automatically assign deployments to environment:
CreateProjectEnvironment(project_id, {
"branch": "main",
"isAutoPromoteEnabled": true,
// ... other settings
})
When isAutoPromoteEnabled: true, successful deployments from the branch automatically become active in that environment.
Analytics & Monitoring Skills
Skill: Comprehensive Analytics
GetProjectEnvironmentAnalytics(project_id, environment_id, {
"start": 1704067200, // Unix timestamp (default: 1 hour ago)
"end": 1704070800 // Unix timestamp (default: now)
})
Returns:
- Overall request counts
- Status code distribution
- RPM (requests per minute)
- Success percentage
- Top hit paths
- Top error paths
Skill: Individual Metrics
| Metric | Tool | Returns |
|---|---|---|
| Overall requests | GetProjectEnvironmentAnalyticsOverallRequests |
Total, 2xx, 4xx, 5xx counts |
| RPM | GetProjectEnvironmentAnalyticsRPM |
Peak and average RPM |
| Success % | GetProjectEnvironmentAnalyticsSuccessPercentage |
(2xx + 3xx) / total |
| Time series | GetProjectEnvironmentAnalyticsRequestsOverTime |
Requests by status over time |
| Top paths | GetProjectEnvironmentAnalyticsTopHitPaths |
Top 10 most accessed |
| Error paths | GetProjectEnvironmentAnalyticsTopErrorPaths |
Top 10 error-prone |
| Distribution | GetEnvAnalyticsReqDistribution |
Breakdown by status code |
Skill: Performance Monitoring
Identify issues:
- Check
SuccessPercentage— drop indicates problems - Review
TopErrorPaths— find problematic endpoints - Analyze
RequestsOverTime— spot traffic patterns - Monitor
RPM— detect traffic spikes
Security Skills
Skill: Vulnerability Scanning
Enable scanning:
UpdateProject(project_id, {
"enabledSecurityScan": true
})
Trigger scan:
TriggerSecurityScan(project_id, deployment_id)
View results:
GetSecurityScan(project_id, deployment_id)
// Returns: {status, vulnerabilities, summary}
Download full report:
GetSecurityScanDownloadUri(project_id, deployment_id)
// Only when status is "successful"
// Returns signed URL for report download
Retry failed scan:
RetriggerSecurityScan(project_id, deployment_id)
// Only when status is "failed"
Organization Skills (Apps)
Skill: Group Projects
Apps provide logical grouping for related projects and services.
CreateApp({
"name": "E-Commerce Platform",
"description": "All services for the e-commerce system",
"color": "#3B82F6"
})
Skill: Manage App Contents
// Add projects to app
AddProjectsToApp(app_id, {
"projectIds": ["project-1-uuid", "project-2-uuid"]
})
// Remove projects
RemoveProjectsFromApp(app_id, {
"projectIds": ["project-1-uuid"]
})
// List projects in app
ListProjectsByApp(app_id, limit?, offset?)
// Same for services
AddServicesToApp(app_id, {"serviceIds": [...]})
RemoveServicesFromApp(app_id, {"serviceIds": [...]})
ListServicesByApp(app_id, limit?, offset?)
Skill: App Lifecycle
| Operation | Tool |
|---|---|
| List | ListApps() |
| Update | UpdateApp(app_id, {name, description?, color?}) |
| Delete | DeleteApp(app_id) |
Note: Deleting an app sets appId: null on associated projects/services (doesn't delete them).
API Key Management Skills
Skill: Create API Keys
CreateAPIKey({
"name": "production-key",
"description": "API key for production CI/CD",
"expiryAt": "2025-12-31T23:59:59Z"
})
// Returns: {id, name, key, expiryAt}
// IMPORTANT: key is only shown once at creation
Skill: API Key Operations
| Operation | Tool |
|---|---|
| List | ListAPIKeys() |
| Update | UpdateAPIKey(api_key_id, {name, description?}) |
| Revoke | RevokeAPIKey(api_key_id) |
| Check name | CheckAPIKeyUniqueName({uniqueName}) |
Skill: User & Quota Management
GetCurrentUser()
// Returns: user profile information
GetQuotas()
// Returns: {projects: {used, limit}, apiKeys: {used, limit}, ...}
GetSupportedProjectTypes()
// Returns: current list of supported runtimes and frameworks
Common Deployment Patterns
Pattern: AI Agent Deployment
CreateProject({
"uniqueName": "intelligent-agent",
"displayName": "Intelligent Agent",
"type": "vcs",
"source": {"vcsName": "github", "vcsInstallationId": "...", "vcsRepoId": "..."},
"settings": {
"runtime": "python:3.12",
"port": 8000,
"installCommand": "pip install -r requirements.txt",
"runCommand": "python -m uvicorn agent:app --host 0.0.0.0 --port 8000",
"runEnvs": {
"OPENAI_API_KEY": "sk-...",
"ANTHROPIC_API_KEY": "sk-ant-...",
"LANGCHAIN_TRACING": "true",
"AGENT_MEMORY_BACKEND": "redis"
}
}
})
Pattern: MCP Server Deployment
CreateProject({
"uniqueName": "my-mcp-server",
"displayName": "Custom MCP Server",
"type": "vcs",
"source": {"vcsName": "github", "vcsInstallationId": "...", "vcsRepoId": "..."},
"settings": {
"runtime": "node:20",
"port": 3000,
"installCommand": "npm install",
"runCommand": "node server.js",
"runEnvs": {
"MCP_TRANSPORT": "sse",
"MCP_PATH": "/mcp"
}
}
})
MCP Endpoint: https://{uniqueName}.createos.io/mcp
Pattern: RAG Pipeline
CreateProject({
"uniqueName": "rag-pipeline",
"displayName": "RAG Pipeline Service",
"type": "vcs",
"settings": {
"runtime": "python:3.12",
"port": 8000,
"runCommand": "uvicorn main:app --host 0.0.0.0 --port 8000",
"runEnvs": {
"PINECONE_API_KEY": "...",
"PINECONE_ENVIRONMENT": "us-west1-gcp",
"OPENAI_API_KEY": "...",
"EMBEDDING_MODEL": "text-embedding-3-small",
"CHUNK_SIZE": "512",
"CHUNK_OVERLAP": "50"
}
}
})
Pattern: Discord/Slack Bot
CreateProject({
"uniqueName": "discord-bot",
"displayName": "Discord Bot",
"type": "image",
"source": {},
"settings": {
"port": 8080,
"runEnvs": {
"DISCORD_TOKEN": "...",
"DISCORD_CLIENT_ID": "...",
"BOT_PREFIX": "!",
"LOG_CHANNEL_ID": "..."
}
}
})
// Deploy with:
CreateDeployment(project_id, {"image": "my-discord-bot:v1.0.0"})
Pattern: Multi-Agent System
┌─────────────────────────────────────────────────┐
│ App: Agent Swarm │
├─────────────────┬─────────────────┬─────────────┤
│ Orchestrator │ Worker Agent │ Worker Agent│
│ (coordinator) │ (researcher) │ (executor) │
└────────┬────────┴────────┬────────┴──────┬──────┘
│ │ │
└────── HTTP/gRPC communication ──┘
// 1. Create app
CreateApp({"name": "Agent Swarm"})
// 2. Create orchestrator
CreateProject({
"uniqueName": "orchestrator",
"type": "vcs",
"appId": app_id,
"settings": {
"runEnvs": {
"WORKER_RESEARCHER_URL": "https://researcher.createos.io",
"WORKER_EXECUTOR_URL": "https://executor.createos.io"
}
}
})
// 3. Create workers
CreateProject({"uniqueName": "researcher", "appId": app_id, ...})
CreateProject({"uniqueName": "executor", "appId": app_id, ...})
Pattern: Blue-Green Deployment
1. CreateProjectEnvironment "blue" with branch "main"
2. CreateProjectEnvironment "green" with branch "main"
3. CreateDomain "app.example.com" → assign to "blue"
4. Deploy new version to "green"
5. Test via green's environment URL
6. UpdateDomainEnvironment → switch to "green"
7. "blue" becomes the standby
Pattern: Rollback
// 1. Find previous good deployment
ListDeployments(project_id, {limit: 10})
// Identify deployment_id of last known good
// 2. Assign to environment
AssignDeploymentToProjectEnvironment(project_id, environment_id, {
"deploymentId": "previous-good-deployment-id"
})
Best Practices
Security
- Never hardcode secrets — Use
runEnvsfor all sensitive data - Enable security scanning — Catch vulnerabilities early
- Rotate API keys — Set reasonable expiry dates
- Use environment isolation — Different secrets per environment
Performance
- Right-size resources — Start small, scale based on metrics
- Use replicas for availability — Min 2 for production
- Monitor analytics — Set up alerts for error rate spikes
- Optimize builds — Use
npm ciovernpm install
Reliability
- Enable auto-promote carefully — Test in staging first
- Keep previous deployments — Enable quick rollbacks
- Use health checks — Ensure
portmatches app's listen port - Handle sleeping deployments — Wake or configure keep-alive
Organization
- Use Apps — Group related projects logically
- Naming conventions —
{app}-{service}-{env}pattern - Document environments — Clear descriptions for each
- Clean up unused — Delete old projects and deployments
Troubleshooting & Edge Cases
Common Errors
| Error | Diagnosis | Solution |
|---|---|---|
| Build failed | GetBuildLogs |
Fix code errors, check dependencies |
| Runtime crash | GetDeploymentLogs |
Check startup errors, missing env vars |
| Health check fail | App not responding on port | Verify port setting matches app |
| 502 Bad Gateway | App crashed after deploy | Check logs, increase memory if OOM |
| Domain pending | DNS not propagated | Wait 24-48h, verify CNAME record |
| Quota exceeded | GetQuotas |
Upgrade plan or delete unused |
| Deployment sleeping | Idle timeout | WakeupDeployment or add keep-alive |
Edge Cases
High-load scenarios:
- Max 3 replicas per environment
- Consider external load balancer for higher scale
- Monitor RPM and adjust resources
Monorepo projects:
- Set
directoryPathto subdirectory - Use
GetGithubRepositoryContentto explore structure
Private npm/pip packages:
- Add auth tokens to
buildVars - Use
.npmrcorpip.confin repo
Long-running builds:
- Build timeout is 15 minutes
- Use
hasDockerfile: truefor complex builds - Pre-build images for image projects
API Quick Reference
Project Lifecycle
CreateProject → ListProjects → GetProject → UpdateProject → UpdateProjectSettings → DeleteProject
CheckProjectUniqueName | GetProjectTransferUri → TransferProject | ListProjectTransferHistory
Deployment Lifecycle
CreateDeployment | TriggerLatestDeployment | UploadDeploymentFiles | UploadDeploymentBase64Files | UploadDeploymentZip
ListDeployments → GetDeployment → AssignDeploymentToProjectEnvironment
RetriggerDeployment | CancelDeployment | DeleteDeployment | WakeupDeployment | DownloadDeployment
GetBuildLogs | GetDeploymentLogs
Environment Lifecycle
CreateProjectEnvironment → ListProjectEnvironments → UpdateProjectEnvironment → DeleteProjectEnvironment
CheckProjectEnvironmentUniqueName | AssignDeploymentToProjectEnvironment
UpdateProjectEnvironmentEnvironmentVariables | UpdateProjectEnvironmentResources
GetProjectEnvironmentLogs
Domain Lifecycle
CreateDomain → ListDomains → RefreshDomain → UpdateDomainEnvironment → DeleteDomain
GitHub Integration
InstallGithubApp → ListConnectedGithubAccounts
ListGithubRepositories → ListGithubRepositoryBranches → GetGithubRepositoryContent
Analytics
GetProjectEnvironmentAnalytics (comprehensive)
GetProjectEnvironmentAnalyticsOverallRequests | GetProjectEnvironmentAnalyticsRPM
GetProjectEnvironmentAnalyticsSuccessPercentage | GetProjectEnvironmentAnalyticsRequestsOverTime
GetProjectEnvironmentAnalyticsTopHitPaths | GetProjectEnvironmentAnalyticsTopErrorPaths
GetEnvAnalyticsReqDistribution
Security
TriggerSecurityScan → GetSecurityScan → GetSecurityScanDownloadUri
RetriggerSecurityScan
Apps
CreateApp → ListApps → UpdateApp → DeleteApp
AddProjectsToApp | RemoveProjectsFromApp | ListProjectsByApp
AddServicesToApp | RemoveServicesFromApp | ListServicesByApp
API Keys & User
CreateAPIKey → ListAPIKeys → UpdateAPIKey → RevokeAPIKey
CheckAPIKeyUniqueName | GetCurrentUser | GetQuotas | GetSupportedProjectTypes
Naming Constraints
| Field | Min | Max | Pattern |
|---|---|---|---|
| Project uniqueName | 4 | 32 | ^[a-zA-Z0-9-]+$ |
| Project displayName | 4 | 48 | ^[a-zA-Z0-9 _-]+$ |
| Description | 4 | 2048 | Any text |
| Environment uniqueName | 4 | 32 | ^[a-zA-Z0-9-]+$ |
| Environment displayName | 4 | 48 | ^[a-zA-Z0-9 _-]+$ |
| API key name | 4 | 48 | ^[a-zA-Z0-9-]+$ |
| Domain name | 3 | 255 | Valid domain |
Last updated: January 2025