Kamal website screenshot

Kamal

Kamal is an open-source deployment tool from 37signals (DHH / Basecamp) for deploying containerized web applications to any infrastructure — bare metal, cloud VMs, or a mix — with zero-downtime rolling restarts. Originally built for Rails apps, Kamal works with any web application that can be packaged as a Docker container. It uses SSHKit to drive remote commands over SSH and pairs with kamal-proxy, a lightweight HTTP proxy written in Go that seamlessly switches request traffic between old and new containers during a deploy. Kamal is imperative and Capistrano-like in feel, with a single `config/deploy.yml` describing servers, image, registry, accessories, env, secrets, and proxy/SSL settings. Capabilities include auto-provisioning Docker on new servers, remote builds, asset bridging, accessory services (databases, Redis, cron sidecars), automatic TLS via Let's Encrypt, host- and path-based routing, and hooks for custom pre/post-deploy logic. Kamal is the operational backbone of 37signals' on-premises exit from major cloud providers and powers their ONCE product line. Kamal itself is a CLI tool, not a hosted service — there is no public REST API, no SDK, and no paid tier. The project is released under the MIT License and developed openly on GitHub under the `basecamp` organization.

2 APIs 0 Features
DeploymentDevOpsDockerContainersZero DowntimeRolling DeploysRailsRubyOpen Source37signalsBasecampOn PremisesInfrastructureCLISSH

APIs

Kamal CLI

The Kamal CLI (`kamal`) is the primary command-line interface for packaging, shipping, and operating containerized web apps across one or more SSH-reachable servers. It reads `c...

Kamal Proxy

Kamal Proxy is a minimal HTTP reverse proxy written in Go that powers the zero-downtime deploy switchover behind Kamal. It exposes a small `kamal-proxy` CLI with `run`, `deploy`...

Resources

🔗
Website
Website
🔗
Documentation
Documentation
🚀
GettingStarted
GettingStarted
🔗
Source
Source
👥
GitHubRepository
GitHubRepository
👥
GitHubOrganization
GitHubOrganization
🔗
MIT License
License
📄
ReleaseNotes
ReleaseNotes
📄
ChangeLog
ChangeLog
🔗
GitHub Discussions
Community
🔗
Discord
Community
🔗
Contributing
Contributing
💻
CodeOfConduct
CodeOfConduct
📦
kamal (RubyGem)
SDKs
🔗
kamal CLI
CLI

Sources

apis.yml Raw ↑
aid: kamal-deploy
name: Kamal
description: Kamal is an open-source deployment tool from 37signals (DHH / Basecamp) for deploying containerized web applications
  to any infrastructure — bare metal, cloud VMs, or a mix — with zero-downtime rolling restarts. Originally built for Rails
  apps, Kamal works with any web application that can be packaged as a Docker container. It uses SSHKit to drive remote commands
  over SSH and pairs with kamal-proxy, a lightweight HTTP proxy written in Go that seamlessly switches request traffic between
  old and new containers during a deploy. Kamal is imperative and Capistrano-like in feel, with a single `config/deploy.yml`
  describing servers, image, registry, accessories, env, secrets, and proxy/SSL settings. Capabilities include auto-provisioning
  Docker on new servers, remote builds, asset bridging, accessory services (databases, Redis, cron sidecars), automatic TLS
  via Let's Encrypt, host- and path-based routing, and hooks for custom pre/post-deploy logic. Kamal is the operational backbone
  of 37signals' on-premises exit from major cloud providers and powers their ONCE product line. Kamal itself is a CLI tool,
  not a hosted service — there is no public REST API, no SDK, and no paid tier. The project is released under the MIT License
  and developed openly on GitHub under the `basecamp` organization.
type: Index
position: Producer
access: 3rd-Party
image: https://kinlane-images.s3.amazonaws.com/shared/apis-json/apis-json-logo.jpg
tags:
- Deployment
- DevOps
- Docker
- Containers
- Zero Downtime
- Rolling Deploys
- Rails
- Ruby
- Open Source
- 37signals
- Basecamp
- On Premises
- Infrastructure
- CLI
- SSH
url: https://raw.githubusercontent.com/api-evangelist/kamal-deploy/refs/heads/main/apis.yml
created: '2026-05-25'
modified: '2026-05-25'
specificationVersion: '0.20'
apis:
- aid: kamal-deploy:kamal
  name: Kamal CLI
  description: 'The Kamal CLI (`kamal`) is the primary command-line interface for packaging, shipping, and operating containerized
    web apps across one or more SSH-reachable servers. It reads `config/deploy.yml` (plus environment-specific overlays and
    encrypted secrets) and orchestrates the full lifecycle: building images, pushing to a registry, provisioning Docker on
    target hosts, starting accessory services, deploying the app via kamal-proxy with health-check gated traffic switching,
    and tailing logs or rolling back to a prior version. Command groups include `app`, `accessory`, `build`, `proxy`, `registry`,
    `secrets`, `server`, and `prune`, plus top-level shortcuts like `deploy`, `redeploy`, `rollback`, `setup`, `audit`, `details`,
    `env`, `lock`, `version`, and `init`.'
  humanURL: https://kamal-deploy.org/docs/
  tags:
  - CLI
  - Deployment
  - Docker
  - Rails
  - Ruby
  - SSH
  properties:
  - type: Documentation
    url: https://kamal-deploy.org/docs/
  - type: GettingStarted
    url: https://kamal-deploy.org/docs/installation/
  - type: Source
    url: https://github.com/basecamp/kamal
  - type: GitHubRepository
    url: https://github.com/basecamp/kamal
  - type: License
    url: https://github.com/basecamp/kamal/blob/main/MIT-LICENSE
  - type: ReleaseNotes
    url: https://github.com/basecamp/kamal/releases
  - type: Configuration
    url: https://kamal-deploy.org/docs/configuration/
    title: deploy.yml Configuration Reference
  - type: Hooks
    url: https://kamal-deploy.org/docs/hooks/
  - type: Upgrade
    url: https://kamal-deploy.org/docs/upgrading/
  - type: SDKs
    url: https://rubygems.org/gems/kamal
    title: kamal (RubyGem)
- aid: kamal-deploy:kamal-proxy
  name: Kamal Proxy
  description: Kamal Proxy is a minimal HTTP reverse proxy written in Go that powers the zero-downtime deploy switchover behind
    Kamal. It exposes a small `kamal-proxy` CLI with `run`, `deploy`, and `remove` commands; the Kamal CLI talks to it over
    SSH to register new container instances (`hostname:port`), runs health checks (default `GET /up` once per second returning
    `200`), drains traffic from old instances, and atomically switches new traffic to the healthy instance. The proxy supports
    host-based routing (multiple apps on one server), path-based routing with optional prefix stripping, custom health-check
    paths/ports/timeouts, automatic TLS via Let's Encrypt, and custom TLS certificate/key files (useful for Cloudflare origin
    certs or private CAs). It can also be run standalone outside of Kamal.
  humanURL: https://github.com/basecamp/kamal-proxy
  tags:
  - Proxy
  - HTTP
  - Load Balancing
  - Zero Downtime
  - TLS
  - Go
  properties:
  - type: Documentation
    url: https://github.com/basecamp/kamal-proxy/blob/main/README.md
  - type: Source
    url: https://github.com/basecamp/kamal-proxy
  - type: GitHubRepository
    url: https://github.com/basecamp/kamal-proxy
  - type: License
    url: https://github.com/basecamp/kamal-proxy/blob/main/MIT-LICENSE
  - type: Dockerfile
    url: https://github.com/basecamp/kamal-proxy/blob/main/Dockerfile
common:
- type: Website
  url: https://kamal-deploy.org
- type: Documentation
  url: https://kamal-deploy.org/docs/
- type: GettingStarted
  url: https://kamal-deploy.org/docs/installation/
- type: Source
  url: https://github.com/basecamp/kamal
- type: GitHubRepository
  url: https://github.com/basecamp/kamal
- type: GitHubOrganization
  url: https://github.com/basecamp
- type: License
  url: https://github.com/basecamp/kamal/blob/main/MIT-LICENSE
  title: MIT License
- type: ReleaseNotes
  url: https://github.com/basecamp/kamal/releases
- type: ChangeLog
  url: https://github.com/basecamp/kamal/releases
- type: Community
  url: https://github.com/basecamp/kamal/discussions
  title: GitHub Discussions
- type: Community
  url: https://discord.gg/YgHVT7GCXS
  title: Discord
- type: Contributing
  url: https://github.com/basecamp/kamal/blob/main/CONTRIBUTING.md
- type: CodeOfConduct
  url: https://github.com/basecamp/kamal/blob/main/CODE_OF_CONDUCT.md
- type: SDKs
  url: https://rubygems.org/gems/kamal
  title: kamal (RubyGem)
- type: CLI
  url: https://kamal-deploy.org/docs/commands/
  title: kamal CLI
- type: Integrations
  url: https://github.com/basecamp/kamal-proxy
  title: kamal-proxy (Go)
- type: Integrations
  url: https://github.com/basecamp/kamal-skiff
  title: kamal-skiff — static sites on nginx + SSI via Kamal
- type: Integrations
  url: https://github.com/basecamp/kamal-site
  title: kamal-site — source for kamal-deploy.org
- type: UseCases
  url: https://once.com
  title: 37signals ONCE — single-tenant self-hosted apps deployed via Kamal
maintainers:
- FN: Kin Lane
  email: kin@apievangelist.com