Deployments
Deploy apps from GitHub repos — build, run, manage env vars, and stream logs.
Savannah Cloud builds and runs apps as Docker containers with ports assigned from 9100–9999. Build artefacts are stored in Cloudflare R2.
Supported Runtimes
| Framework | Build Command | Serve |
|---|---|---|
| Vite | npm run build | dist/ |
| Next.js (static) | next build (output: 'export') | out/ |
| Next.js (SSR) | Containerised Node server | — |
| Create React App | npm run build | build/ |
| Python | Auto-detects requirements.txt | Containerised |
| Go | Auto-detects go.mod | Containerised |
List Deployments
GET /deployments
Authorization: Bearer <token>Response 200
[
{
"id": "dep_abc123",
"name": "my-app",
"repo": "https://github.com/org/my-app",
"status": "running",
"port": 9100,
"created_at": "2026-05-24T10:00:00Z"
}
]Create a Deployment
Triggers a build from a GitHub repository.
POST /deployments
Authorization: Bearer <token>
Content-Type: application/jsonRequest body
{
"name": "my-app",
"repo": "https://github.com/org/my-app",
"branch": "main",
"framework": "vite"
}Response 201
{
"id": "dep_abc123",
"name": "my-app",
"status": "building",
"port": 9100
}Get a Deployment
GET /deployments/{id}
Authorization: Bearer <token>Delete a Deployment
Stops and removes the container.
DELETE /deployments/{id}
Authorization: Bearer <token>Response 204 No Content
Redeploy
Triggers a fresh build from the latest commit.
POST /deployments/{id}/redeploy
Authorization: Bearer <token>Stream Logs
Build and runtime logs over WebSocket.
GET /deployments/{id}/logs
Authorization: Bearer <token>Environment Variables
Set Env Vars
POST /deployments/{id}/env
Authorization: Bearer <token>
Content-Type: application/json{
"VITE_API_BASE": "https://api.savannahcloud.com",
"NODE_ENV": "production"
}List Env Vars
GET /deployments/{id}/env
Authorization: Bearer <token>Values are encrypted at rest using ENCRYPTION_KEY.
Quick Reference
# List deployments
curl https://api.savannahcloud.com/deployments \
-H "Authorization: Bearer YOUR_JWT"
# Create deployment
curl -X POST https://api.savannahcloud.com/deployments \
-H "Authorization: Bearer YOUR_JWT" \
-H "Content-Type: application/json" \
-d '{"name":"my-app","repo":"https://github.com/org/my-app","branch":"main"}'
# Redeploy
curl -X POST https://api.savannahcloud.com/deployments/dep_abc123/redeploy \
-H "Authorization: Bearer YOUR_JWT"
# Set env vars
curl -X POST https://api.savannahcloud.com/deployments/dep_abc123/env \
-H "Authorization: Bearer YOUR_JWT" \
-H "Content-Type: application/json" \
-d '{"DATABASE_URL":"postgres://..."}'