Install
openclaw skills install hoistDeploy and manage apps, servers, databases, domains, and environment variables on VPS providers using the Hoist CLI.
openclaw skills install hoistHoist is an AI-native CLI built specifically for AI agents. When called from an agent (non-TTY), it automatically outputs structured JSON and skips interactive prompts. Just run commands directly.
You are the user's infrastructure guide. Be thorough and transparent:
hoist.json already resolves them clearly.hoist status and report the result.Hoist auto-detects and fills in sensible defaults when called from an agent:
--service is omitted--server from the service config in hoist.json--name is omittedEven though defaults exist, always present the plan to the user and get confirmation before executing.
hoist deployhoist server createhoist deploy --template postgres --server <s>hoist domain add example.comhoist statushoist logs <service>, then hoist logs traefik, then hoist doctorhoist doctorhoist init and hoist provider add need HOIST_*_API_KEY env vars or an interactive human terminal.Is hoist installed? (`which hoist`)
+-- NO -> Run: `npm install -g hoist-cli`
+-- YES -> Is hoist configured? (`hoist provider list`)
+-- NO -> Are HOIST_*_API_KEY env vars set?
+-- YES -> Run: `hoist init`
+-- NO -> Tell user to run: `hoist init`
+-- YES -> Does hoist.json exist?
+-- NO -> Create hoist.json after asking about project name and services
+-- YES -> What does the user want?
+-- New server -> `hoist server create`
+-- Import server -> `hoist server import --ip <ip>`
+-- Deploy app -> `hoist deploy`
+-- Add database -> `hoist deploy --template postgres --server <s>`
+-- Add domain -> `hoist domain add <domain>`
+-- Set env vars -> `hoist env set <service> KEY=VAL`
+-- Check status -> `hoist status`
+-- Something broken -> `hoist logs <service>` + `hoist doctor`
| Command | Behavior |
|---|---|
hoist init | If HOIST_*_API_KEY env vars are set, auto-configures. Otherwise prompts interactively, so tell the user to run it. |
hoist provider add | Requires --type and reads the API key from a HOIST_*_API_KEY env var. If the env var is missing, tell the user to set it first. |
hoist keys rotate | Rotates SSH keys on all servers. Always confirm first. |
hoist server destroy | Destroys a server permanently. Always confirm first. |
hoist template destroy | Destroys a database and its data. Always confirm first. |
hoist domain delete | Removes a domain and SSL config. Always confirm first. |
Environment variables: HOIST_HETZNER_API_KEY, HOIST_VULTR_API_KEY, HOIST_DIGITALOCEAN_API_KEY, HOIST_HOSTINGER_API_KEY, HOIST_LINODE_API_KEY, HOIST_SCALEWAY_API_KEY
For full command reference, see COMMANDS.md.
provider add, provider list, provider test, provider update, provider set-default, provider deleteserver create, server import, server list, server status <name>, server ssh <name>, server destroy <name>, server regions, server types, server stats <name>deploy, deploy --service <name>, deploy --template <type> --server <s>, deploy --repo <url> --branch <branch>, rollback --service <name>template list, template info <name>, template services, template inspect <name>, template backup <name>, template destroy <name>, template stop/start/restart <name>, template public <name>, template private <name>domain add <domain>, domain add <domain> --service <name>, domain list, domain delete <domain>env set <service> KEY=VAL, env get <service> <key>, env list <service>, env delete <service> <key>, env import <service> <file>, env export <service>, echo KEY=VAL | env set <service> --stdinlogs <service>, logs traefik, logs <service> --follow, status, doctorskills sync, skills export [dir]keys show, keys rotate, config validate, --statusRead hoist.json in the project root for current project context.
{
"project": "my-app",
"servers": { "prod": { "provider": "hetzner-1" } },
"services": {
"api": { "server": "prod", "type": "app", "source": ".", "port": 3000 }
}
}
Walk the user through each step. Ask for confirmation before proceeding:
example.com and www.example.com to the server IP.DATABASE_URL, API keys, and other runtime config. If a database was just created, suggest the connection URL.hoist status - verify services are running and check for drifthoist logs <service> - verify the app started correctlyhoist domain add <domain> - add the custom domain and SSL if requestedhoist template inspect <name> - get credentials and the connection stringhoist env set <app> DATABASE_URL=<connection-string> - inject it into the apphoist template public <name> --server <s> - only if the user explicitly needs public accessWhen something goes wrong, use these tools to investigate:
hoist logs <service> --lines 200
Look for crash loops, startup errors, missing env vars, database failures, and wrong ports.
hoist logs traefik --lines 200
Look for 502 errors, ACME cert failures, and TLS issues.
hoist doctor
Checks SSH connectivity, Docker, Traefik, firewall state, and provider auth.
hoist status
Shows which services are running versus configured, along with drift and resource status.
| Symptom | How to investigate | Fix |
|---|---|---|
| 502 Bad Gateway | hoist logs <service> then hoist logs traefik | Fix the app crash or port mismatch, then redeploy. |
| Site not loading | hoist status | Redeploy the service with hoist deploy --service <name>. |
| SSL cert invalid | hoist logs traefik | Verify DNS points to the server IP and wait for the next ACME retry. |
| DNS not resolving | hoist domain list | User must add or fix the DNS A record. |
| Wrong response | hoist logs <service> | Fix the app and redeploy. |
| Database unreachable | hoist template inspect <name> | Start the template service or fix the connection string. |
Only rollback when a deploy introduced a regression and the previous version was working.
hoist rollback --service <name>
Always confirm first and verify with hoist status after the rollback.
| Error | Solution |
|---|---|
Run hoist init first | If env vars are set, run hoist init. Otherwise tell the user to run it interactively. |
Provider not found | Check hoist provider list for the correct label. |
Server not found | Check hoist server list. |
SSH connection failed | Run hoist doctor and verify the server IP. |
No hoist.json found | Create hoist.json in the project root. |
references unknown server | Make the service server value match the servers section. |
Re-run with --confirm | Destructive action. The error includes the exact command to re-run. |
Multiple app services found | Specify --service <name>. |
hoist logs <service>, hoist logs traefik, hoist doctor, and hoist status.hoist.json must match the names used during creation.