gamal is a partial Go port of Kamal 2.12,
with customizations for the way we deploy. It uses the same config/deploy.yml
format and kamal-proxy runtime contract, but is not a line-for-line port.
See History and comparison for its origins, design differences, and intentionally unsupported Kamal features.
Building requires Go 1.27+. Deploying requires Docker locally and on each target host, plus SSH access for remote targets.
git clone https://github.com/beint-no/gamal.git
cd gamal
make test
make install # installs ~/.local/bin/gamal
To start a new project, run gamal init. Existing Kamal 2.12 projects can keep
their config/deploy.yml, destination overlays, .kamal/secrets, and hooks.
Run gamal from the application root:
gamal doctor # check config and hosts
gamal plan --version="$version" # preview commands
gamal deploy --skip-hooks --version="$version" # deploy
gamal deploy -d staging --version="$version" # deploy a destination
--version selects the application image version; gamal version prints the
CLI version. Use --hosts, --roles, or --primary to limit a command, and
--config-file to use a non-default config path.
For a same-host deployment, use the Docker builder driver. gamal builds into the local Docker engine and skips the registry push/pull round trip when every target is local.
| Command | Purpose |
|---|---|
deploy, redeploy, rollback, setup, remove | Manage a rollout |
doctor, plan, config, details, audit | Inspect before or after a rollout |
app … | Manage application containers, logs, and commands |
proxy … | Manage kamal-proxy |
build …, registry … | Manage images and registry access |
lock …, prune …, server … | Manage deployment infrastructure |
Run gamal help or gamal <command> --help for flags and subcommands.
gamal preserves Kamal's production-facing names and paths:
kamal and kamal-proxy.kamal/proxy/options.kamal/apps/<service>/env/roles/<role>.env.kamal/lock-<service>[-<destination>]This lets gamal manage deployments previously created by Kamal within its supported scope.
7 commits
Go
99.8%
gamal is a partial Go port of Kamal 2.12,
with customizations for the way we deploy. It uses the same config/deploy.yml
format and kamal-proxy runtime contract, but is not a line-for-line port.
See History and comparison for its origins, design differences, and intentionally unsupported Kamal features.
Building requires Go 1.27+. Deploying requires Docker locally and on each target host, plus SSH access for remote targets.
git clone https://github.com/beint-no/gamal.git
cd gamal
make test
make install # installs ~/.local/bin/gamal
To start a new project, run gamal init. Existing Kamal 2.12 projects can keep
their config/deploy.yml, destination overlays, .kamal/secrets, and hooks.
Run gamal from the application root:
gamal doctor # check config and hosts
gamal plan --version="$version" # preview commands
gamal deploy --skip-hooks --version="$version" # deploy
gamal deploy -d staging --version="$version" # deploy a destination
--version selects the application image version; gamal version prints the
CLI version. Use --hosts, --roles, or --primary to limit a command, and
--config-file to use a non-default config path.
For a same-host deployment, use the Docker builder driver. gamal builds into the local Docker engine and skips the registry push/pull round trip when every target is local.
| Command | Purpose |
|---|---|
deploy, redeploy, rollback, setup, remove | Manage a rollout |
doctor, plan, config, details, audit | Inspect before or after a rollout |
app … | Manage application containers, logs, and commands |
proxy … | Manage kamal-proxy |
build …, registry … | Manage images and registry access |
lock …, prune …, server … | Manage deployment infrastructure |
Run gamal help or gamal <command> --help for flags and subcommands.
gamal preserves Kamal's production-facing names and paths:
kamal and kamal-proxy.kamal/proxy/options.kamal/apps/<service>/env/roles/<role>.env.kamal/lock-<service>[-<destination>]This lets gamal manage deployments previously created by Kamal within its supported scope.
7 commits
Go
99.8%