Savannah Cloud

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

FrameworkBuild CommandServe
Vitenpm run builddist/
Next.js (static)next build (output: 'export')out/
Next.js (SSR)Containerised Node server
Create React Appnpm run buildbuild/
PythonAuto-detects requirements.txtContainerised
GoAuto-detects go.modContainerised

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/json

Request 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://..."}'

On this page