Supported Runtimes

No Dockerfile needed. Pick a runtime, set a command, deploy.

PromptShip can build your app automatically from a supported runtime. Just tell it what language you're using and what command starts your app — no Docker knowledge required.

For full control (custom system packages, multi-stage builds, unsupported languages like Rust or Java), bring your own Dockerfile instead.

Need a runtime that's not listed? Let us know.

Available runtimes

Runtime Default Port Auto-detected files
python:3.12 8000 requirements.txt or pyproject.toml
python:3.11 8000 requirements.txt or pyproject.toml
node:22 3000 package.json (uses npm ci if lockfile present, npm install otherwise)
node:20 3000 package.json
go:1.22 8080 go.mod (multi-stage build, compiles to distroless)
go:1.21 8080 go.mod
bun:1 3000 package.json
static 80 Serves files via nginx. No build step.
dockerfile 8080 Your own Dockerfile. See templates.

How to use

Three steps: set the runtime, set the process command, deploy.

# 1. Set the runtime and port
configure_app(app_name: "my-api", runtime: "python:3.12", port: 8000)

# 2. Set the web process command
configure_process(
  app_name: "my-api",
  process_name: "web",
  process_type: "web",
  command: "gunicorn app:app --bind 0.0.0.0:$PORT"
)

# 3. Deploy
deploy_app(app_name: "my-api", branch: "main")

Python

Works with requirements.txt or pyproject.toml. If both exist, requirements.txt takes precedence.

# Flask
configure_app(app_name: "my-api", runtime: "python:3.12", port: 8000)
configure_process(app_name: "my-api", process_name: "web", process_type: "web",
  command: "gunicorn app:app --bind 0.0.0.0:$PORT")

# FastAPI
configure_app(app_name: "my-api", runtime: "python:3.12", port: 8000)
configure_process(app_name: "my-api", process_name: "web", process_type: "web",
  command: "uvicorn app:main --host 0.0.0.0 --port $PORT")

# Django
configure_app(app_name: "my-api", runtime: "python:3.12", port: 8000)
configure_process(app_name: "my-api", process_name: "web", process_type: "web",
  command: "gunicorn myproject.wsgi:application --bind 0.0.0.0:$PORT")

Workers & cron: Add background processes that share the same image and secrets:

configure_process(app_name: "my-api", process_name: "worker",
  process_type: "worker", command: "celery -A app worker --loglevel=info")
configure_process(app_name: "my-api", process_name: "cleanup",
  process_type: "cron", command: "python -m jobs.cleanup", cron_schedule: "0 2 * * *")

Node.js

Installs dependencies via npm ci (if package-lock.json exists) or npm install.

# Express / Fastify
configure_app(app_name: "my-app", runtime: "node:22", port: 3000)
configure_process(app_name: "my-app", process_name: "web", process_type: "web",
  command: "node server.js")

# Next.js
configure_app(app_name: "my-app", runtime: "node:22", port: 3000)
configure_process(app_name: "my-app", process_name: "web", process_type: "web",
  command: "npm start")

Make sure your app reads process.env.PORT:

const port = process.env.PORT || 3000;
app.listen(port, '0.0.0.0');

Go

Multi-stage build: compiles in a Go image, copies the binary to a minimal distroless image. Your app must read PORT from the environment.

configure_app(app_name: "my-svc", runtime: "go:1.22", port: 8080)
configure_process(app_name: "my-svc", process_name: "web", process_type: "web",
  command: "./server")
port := os.Getenv("PORT")
if port == "" {
    port = "8080"
}
http.ListenAndServe(":"+port, router)

Bun

Installs dependencies via bun install --production.

configure_app(app_name: "my-app", runtime: "bun:1", port: 3000)
configure_process(app_name: "my-app", process_name: "web", process_type: "web",
  command: "bun run server.ts")

Static Sites

Serves files with nginx. No build step needed.

configure_app(app_name: "my-site", runtime: "static")
configure_process(app_name: "my-site", process_name: "web", process_type: "web",
  command: "nginx -g 'daemon off;'")

By default, nginx serves files from the repo root. To serve a subdirectory (e.g. dist/ after a build step), set root_dir:

configure_app(app_name: "my-site", runtime: "static", root_dir: "dist")

Need a build step? If your static site requires a build (e.g. npm run builddist/), use the node:22 runtime or a custom Dockerfile.

When to use a Dockerfile instead

Supported runtimes cover the most common cases. Use a Dockerfile when you need:

Set configure_app(runtime: "dockerfile") and place a Dockerfile in your repo.

Need a runtime that's not listed? Reach out and we'll add it.