CLI Reference
Complete reference for all slipp commands. Commands follow a consistent pattern:
- Singular = action (
slipp run,slipp deploy) - Plural = manage resources (
slipp runs,slipp secrets)
slipp [OPTIONS] COMMAND [ARGS]Global Options
Section titled “Global Options”| Option | Description |
|---|---|
-v, --verbose | Enable verbose logging |
-o, --output | Output format: table (default), json |
-V, --version | Show version and exit |
--help | Show help message |
Operations
Section titled “Operations”Commands for monitoring and managing deployed services.
List running services across registered projects (like docker ps).
slipp ps [OPTIONS]| Option | Description |
|---|---|
-p, --project | Filter by project name |
--refresh | Force re-discovery (bypass cache) |
--all | Include system services |
# List all servicesslipp ps
# Filter by projectslipp ps -p myproject
# Fresh discoveryslipp ps --refresh
# JSON outputslipp ps -o jsonWhen a host is shared by more than one registered project (see
Multiple hosts), the host
column lists every owning project’s own label for it, e.g.
myserver (alpha), myserver (beta), instead of silently attributing the
row to just one of them.
View service logs (journalctl or container logs).
slipp logs <service> [OPTIONS]| Option | Description |
|---|---|
-f, --follow | Follow log output |
-n, --lines | Number of lines (default: 50) |
--all | Include system services in discovery |
# View last 50 linesslipp logs synapse
# Follow logsslipp logs synapse -f
# Last 100 linesslipp logs synapse -n 100Service lookup grammar
Section titled “Service lookup grammar”logs, exec, ssh, and status all resolve a bare service name against
every registered project’s inventory — there’s no --project flag, and no
current-directory scoping. Use the qualified forms to disambiguate:
| Form | Resolves to |
|---|---|
service | Look up in the global service index |
service@host | Filter by host name |
project:service | Filter by project name |
project:service@host | Fully qualified |
slipp logs postgres # ambiguous if two projects share a hostslipp logs myproject:postgresslipp logs postgres@myserverIf a host is shared by more than one project (see Multiple hosts), an unqualified service name on that host raises an error listing the matches to disambiguate between — this is deliberate, not a bug: there’s no safe way to guess which project’s service you meant.
status
Section titled “status”Display detailed service status (like systemctl status).
slipp status <service>Execute a command on VPS or in a container.
slipp exec "<command>"slipp exec <service> "<command>"| Option | Description |
|---|---|
-u, --user | Override user (root, postgres, www-data) |
# Execute on VPSslipp exec "df -h"
# Execute in containerslipp exec synapse "cat /data/homeserver.yaml"
# Execute as rootslipp exec -u root "systemctl restart nginx"Open interactive shell on VPS or container service.
slipp ssh [service]| Option | Description |
|---|---|
-u, --user | Override user |
# SSH to VPSslipp ssh
# Shell into containerslipp ssh synapse
# As specific userslipp ssh -u postgresOutput host connection info (pipeable).
slipp host [project]| Option | Description |
|---|---|
--ip | Output IP only |
--user | Output user only |
--port | Output port only |
# Get connection stringslipp host# Output: slipp@192.168.1.100
# Get IP for scriptingslipp host --ip# Output: 192.168.1.100
# Specific projectslipp host myproject --ipDevelopment
Section titled “Development”Commands for local development workflows.
Execute a run profile for local development with remote infrastructure.
slipp run <name> [OPTIONS] [-- ARGS]| Option | Description |
|---|---|
--cmd | Command (creates/updates profile) |
--env | Environment variable KEY=VALUE (repeatable) |
--vault | Vault project(s) for secrets (repeatable) |
--tunnel-out | Reverse tunnel local_port:domain@host |
--tunnel-in | Forward tunnel service:port@host |
--proxy | Proxy route from@host -> to (repeatable) |
--tunnel-auth | HTTP basic auth for tunnel-out routes user:pass (bcrypt-hashed before saving) |
# Create and run profileslipp run dev \ --cmd "npm run dev" \ --tunnel-out 5173:app.example.com@myserver \ --vault myproject# Run saved profileslipp run dev
# Pass additional argsslipp run dev -- --port 3000
# Override at runtimeslipp run dev --env DEBUG=trueslipp run exits with the wrapped command’s exit code (130 on Ctrl+C), so it’s safe to use in scripts and CI pipelines.
Manage saved run profiles.
Profiles are stored in slipp.yaml under runs: (git-tracked). A profile can
inherit from another with extends, and personal overrides can live in the
untracked .slipp/runs.local.yaml (same name shadows the tracked profile
entirely — not merged field-by-field):
runs: dev: cmd: npm run dev tunnels: out: [5173:app.example.com@myserver] dev-staging: extends: dev # inherits cmd/tunnels, overrides below env: - VITE_ENV=stagingruns list
Section titled “runs list”slipp runs listLists all saved profiles with their commands, vaults, and tunnels.
runs remove
Section titled “runs remove”slipp runs remove <name>Remove a saved run profile.
launch
Section titled “launch”Generate complete Ansible project from codebase.
slipp launch [OPTIONS]| Option | Description |
|---|---|
-n, --name | Project name (required) |
-e, --env | Environment (default: production) |
-d, --dir | Directories to scan (repeatable) |
--dry-run | Show what would be done |
--reconfigure | Re-prompt for inventory config |
--proxy | Reverse proxy: auto (probe host, default), caddy, none, wg-manage |
--public | Expose via Let’s Encrypt instead of internal CA (--proxy wg-manage only) |
--python-extra | uv sync --extra group (Python systemd deploys) |
--exec-args | Extra ExecStart arguments (Python systemd deploys) |
--health-check | HTTP path polled after restart; rolls back on failure (systemd deploys) |
# Generate Ansible projectslipp launch --name myapp
# Multiple directoriesslipp launch --name myapp -d ./frontend -d ./backend
# Different environmentslipp launch --name myapp --env staging
# Expose through wg-manage, publicly, with a rollback-guarded health checkslipp launch --name myapp --proxy wg-manage --public --health-check /healthz--proxy auto probes the target host: if it’s already a wg-manage hub,
services expose through wg-manage; otherwise slipp falls back to a Caddy
route. See expose: for how routing
is seeded and edited.
generate
Section titled “generate”Generate specific Ansible project files.
generate dockerfile
Section titled “generate dockerfile”slipp generate dockerfile [OPTIONS]Generate only Dockerfiles for detected services.
generate scaffold
Section titled “generate scaffold”slipp generate scaffold [OPTIONS]Generate project scaffolding without Dockerfiles.
generate full
Section titled “generate full”Alias for slipp launch — generates the complete project (Dockerfiles + scaffolding).
Manage Ansible tag presets for deployments.
Show a tag preset’s configuration.
slipp tag <preset>slipp tag install# Output:# --tags: install-all# --skip-tags: import-postgresManage tag presets.
tags list
Section titled “tags list”slipp tags listList all configured tag presets.
tags add
Section titled “tags add”slipp tags add <name> [OPTIONS]| Option | Description |
|---|---|
-t, --tags | Ansible tags to run (comma-separated) |
--skip-tags | Ansible tags to skip (comma-separated) |
slipp tags add install --tags install-all --skip-tags import-postgresslipp tags add setup --tags setup-alltags remove
Section titled “tags remove”slipp tags remove <name>Remove a tag preset.
Secrets
Section titled “Secrets”Generate and manage vault secrets.
secret
Section titled “secret”Generate a cryptographically secure secret.
slipp secret [OPTIONS]| Option | Description |
|---|---|
-b, --bytes | Bytes of entropy (default: 32 = 256-bit) |
--base64 | Output as base64 instead of hex |
--ulid | Output as ULID (ignores —bytes) |
--jwk | Output as RSA JWK keypair |
--bits | RSA key size for —jwk (default: 2048) |
# Generate 256-bit hex secretslipp secret# Output: 64 hex chars
# Base64 encodingslipp secret --base64
# Generate JWK keypairslipp secret --jwk
# Generate ULIDslipp secret --ulidsecrets
Section titled “secrets”Manage vault secrets.
secrets list
Section titled “secrets list”slipp secrets list [target] [secret_name]List secrets in a vault, or show available vaults if no target specified.
| Option | Description |
|---|---|
-n, --name | Get template string for secret name |
# Show available vaultsslipp secrets list
# List secrets in project vaultslipp secrets list myproject
# Get template string for specific secretslipp secrets list myproject db_password# Output: {{ db_password }}secrets add
Section titled “secrets add”slipp secrets add <name> [target] [OPTIONS]| Option | Description |
|---|---|
-b, --bytes | Bytes of entropy (default: 32) |
-e, --encoding | Output encoding: hex (default), base64, ulid |
--jwk | Generate RSA JWK keypair |
--bits | RSA key size for —jwk (default: 2048) |
# Add random secret to current project vaultslipp secrets add vault_db_password
# Add to specific projectslipp secrets add vault_api_key myproject
# Add JWK keypairslipp secrets add vault_signing_key --jwksecrets sync
Section titled “secrets sync”slipp secrets sync <path> [OPTIONS]Scan YAML for {{ vault_* }} references and auto-generate secrets.
| Option | Description |
|---|---|
-b, --bytes | Bytes of entropy (default: 32) |
-e, --encoding | Output encoding: hex (default), base64, ulid |
-f, --force-existing | Add missing secrets to an existing vault.yml |
slipp secrets sync inventory/host_vars/myhost/vars.yml# Creates vault.yml with generated secrets for all {{ vault_* }} refssecrets pull
Section titled “secrets pull”slipp secrets pull <source> [target] [OPTIONS]Pull credentials from external source via browser approval flow.
| Argument | Description |
|---|---|
source | Secret source (e.g., nor-auth) |
target | Target vault (project name or path) |
| Option | Description |
|---|---|
-t, --timeout | Timeout in seconds (default: 300) |
# Pull from nor-auth to current project vaultslipp secrets pull nor-auth
# Pull to specific projectslipp secrets pull nor-auth myproject
# Custom timeoutslipp secrets pull nor-auth --timeout 600Images
Section titled “Images”Container image operations.
image push
Section titled “image push”Push local container image to VPS via SSH.
slipp image push <image> [OPTIONS]| Option | Description |
|---|---|
--host | Target host/project |
-n, --name | Rename image on VPS |
# Push imageslipp image push myapp:latest
# Push to specific project hostslipp image push myapp:latest --host myproject
# Rename on pushslipp image push myapp:v1.2.3 --name myapp:latestimages list
Section titled “images list”List container images on VPS.
slipp images list [OPTIONS]| Option | Description |
|---|---|
--host | Target host/project |
-f, --filter | Filter by name pattern |
# List all imagesslipp images list
# Filter by patternslipp images list --filter "myapp*"Management
Section titled “Management”Project and configuration management.
projects
Section titled “projects”Manage registered projects.
projects list
Section titled “projects list”slipp projects listList all registered projects with their paths.
projects add
Section titled “projects add”slipp projects add <name> [OPTIONS]Register the current directory as a project.
| Option | Description |
|---|---|
-i, --inventory | Inventory file path (auto-detected if not specified) |
--playbook | Playbook file path (auto-detected if not specified) |
--roles | Role search directories (auto-detected if not specified) |
--galaxy-path | Install path for external roles from requirements.yml |
--vault | Path to vault.yml for secret management |
--runtime | How the app runs: systemd, docker, podman — set explicitly for projects not scanned/generated by slipp launch |
# Auto-detect everythingslipp projects add myapp
# Explicit inventoryslipp projects add myapp -i inventory/hosts
# Full setupslipp projects add myapp -i inventory/hosts --vault inventory/host_vars/myhost/vault.yml
# External project slipp didn't generate (runtime can't be auto-detected)slipp projects add myapp --runtime systemdprojects remove
Section titled “projects remove”slipp projects remove <name>Unregister a project.
config
Section titled “config”Show current project configuration.
slipp configDisplays:
- Project name, inventory, playbook, vault paths
- Hosts from inventory
- Global registry status
Supports -o json for machine-readable output.
Infrastructure
Section titled “Infrastructure”Provisioning, DNS, domains, and multi-host management. Most of these
require a configured provider (slipp providers add) — see
Gigahost provisioning.
Provision (or reuse an existing host), register a domain, launch, sync DNS, and deploy — one command end-to-end.
slipp up <name> [OPTIONS]| Option | Description |
|---|---|
--host | Use an existing host IP (skips provisioning) |
--domain | Domain to register (if available) and deploy to |
--dns | DNS handling: auto (default) |
-e, --env | Environment name |
--hub | Make the host a wg-manage hub (via a configured wg-deploy checkout) before launch, so --proxy auto finds it |
--public | Expose via Let’s Encrypt instead of internal CA (--proxy wg-manage only) |
# Full provision -> domain -> launch -> DNS -> deployslipp up myapp --domain myapp.example.com
# Reuse an already-provisioned host, make it a hub, expose publiclyslipp up myapp --host 203.0.113.5 --domain myapp.example.com --hub --publicprovision
Section titled “provision”Order a VPS via Gigahost, bootstrap it, and register it as a slipp project.
slipp provision <name> [OPTIONS]| Option | Description |
|---|---|
-e, --env | Environment name |
Writes a minimal inventory pointing at the new server’s IP and registers
the project — slipp launch or slipp deploy picks up from there.
server
Section titled “server”Out-of-band server operations (no SSH needed — talks to the provider API directly).
slipp server status <name_or_ip>slipp server reboot <name_or_ip> [--force]slipp server install <name_or_ip> [--force]install wipes and reinstalls the server’s OS, then re-bootstraps it. If
a previous install/bootstrap was interrupted, re-running the same command
resumes from saved state instead of prompting to wipe again.
servers
Section titled “servers”slipp servers listList VPS servers across configured providers (no SSH needed).
providers
Section titled “providers”Manage infrastructure providers: gigahost, pangolin, wg-deploy.
slipp providers add <name>slipp providers listslipp providers remove <name># Prompts for and verifies a Gigahost API keyslipp providers add gigahost
# Prompts for a Pangolin session cookie (stopgap until the Integration API)slipp providers add pangolin
# Verifies a local wg-deploy checkout (see providers add wg-deploy --help)slipp providers add wg-deploy
slipp providers listslipp providers remove pangolindomains
Section titled “domains”Domain availability, registration, and listing (.no only, via Gigahost).
slipp domains check <domain>slipp domains register <domain>slipp domains listregister prompts for registrant info and only proceeds if check reports the domain available.
DNS record management (via the configured DNS provider).
slipp dns syncslipp dns list <domain>sync converges the DNS zone + A record for the current project’s
primary host domain to its ansible_host IP — creates the zone if it
doesn’t exist yet.
resources
Section titled “resources”Manage exposed services: wg-manage strays (if the project’s host is a wg-manage hub) or public Pangolin resources otherwise.
slipp resources sync [OPTIONS]slipp resources listslipp resources remove <name> [--force]| Option | Description |
|---|---|
--site | Pangolin site name/niceId/siteId (Pangolin projects only) |
--dry-run | Show what would change |
For wg-manage, sync only prunes stray entries left behind by a
rename/removal — adds/updates happen at deploy time via the
wg-manage-exposure role. list/remove are scoped to entries labeled
slipp:<project_name>; a foreign-labeled entry is never touched. For
Pangolin, sync converges a public Resource+Target from the project’s
inventory (app_domain/ansible_host/app_port) and requires --site.
Manage secondary deploy hosts for multi-host projects.
The interactive slipp launch prompt only ever creates the primary host — additional hosts are added here.
slipp hosts add <name> --host <ip> [OPTIONS]slipp hosts listslipp hosts remove <name>| Option | Description |
|---|---|
--host | IP address or domain for SSH connection (required) |
--user | SSH username (default: slipp) |
--port | SSH port (default: 22) |
--runtime | How the app runs: systemd, docker, podman |
slipp hosts add worker --host 203.0.113.9 --runtime docker# Then assign a service to it: expose: <service>: host: worker in# slipp.yaml, and run: slipp launch --reconfigureAdding a host with an IP already used within this project’s own inventory hard-fails (identity collision). An IP already used by a different project is allowed with an informational notice — see Multiple hosts.
Bootstrap
Section titled “Bootstrap”VPS bootstrap operations for initial setup.
bootstrap account
Section titled “bootstrap account”Create slipp service account on VPS.
slipp bootstrap account <host> [OPTIONS]| Option | Description |
|---|---|
--root-user | Root user for initial connection (default: root) |
--ssh-key | SSH private key path |
-p, --port | SSH port (default: 22) |
--user | Service account name (default: slipp) |
--dry-run | Show what would be done |
slipp bootstrap account 192.168.1.100 --port 22
# Dry run firstslipp bootstrap account myserver.com --dry-runThis command:
- Creates the
slippuser account - Copies SSH keys from root
- Configures passwordless sudo
- Verifies the setup
bootstrap proxy
Section titled “bootstrap proxy”Setup dev proxy infrastructure for --tunnel-out.
slipp bootstrap proxy <host> [OPTIONS]| Option | Description |
|---|---|
-e, --email | Email for Let’s Encrypt certificates (required) |
-p, --fallback-port | Port for existing HTTPS service (default: 9443) |
slipp bootstrap proxy myproject --email admin@example.comInstalls Caddy dev proxy for routing production domains to local tunnels.
bootstrap registry
Section titled “bootstrap registry”Setup container registry authentication on VPS.
bootstrap registry ghcr
Section titled “bootstrap registry ghcr”slipp bootstrap registry ghcr [OPTIONS]| Option | Description |
|---|---|
--host | Target host/project |
-u, --user | GitHub username |
-t, --token | GitHub PAT (or set GITHUB_TOKEN) |
bootstrap registry dockerhub
Section titled “bootstrap registry dockerhub”slipp bootstrap registry dockerhub [OPTIONS]| Option | Description |
|---|---|
--host | Target host/project |
-u, --user | Docker Hub username |
-t, --token | Docker Hub token (or set DOCKER_TOKEN) |
# GitHub Container Registryslipp bootstrap registry ghcr --user myuser
# Docker Hubslipp bootstrap registry dockerhub --user myuserDeploy
Section titled “Deploy”Execute Ansible playbook to deploy services.
slipp deploy [target] [preset] [OPTIONS]| Argument | Description |
|---|---|
target | Environment name or tag preset (default: production) |
preset | Tag preset when using slipp deploy <env> <preset> |
| Option | Description |
|---|---|
-n, --name | Project name (creates/updates slipp.yaml) |
--dry-run | Show what would be done |
-i, --inventory | Custom inventory file path |
--playbook | Custom playbook file path |
--vault | Path to vault file |
-r, --requirements | Path to requirements.yml |
--roles | Role search directories (repeatable) |
--galaxy-path | Install path for external roles (default: roles/galaxy) |
--force-requirements | Force reinstall roles/collections |
-t, --tags | Ansible tags to run |
--skip-tags | Ansible tags to skip |
--runtime | How the app runs: systemd, docker, podman — set explicitly for projects not scanned/generated by slipp launch |
# Deploy with defaultsslipp deploy
# Use tag presetslipp deploy install
# Deploy to staging with presetslipp deploy staging install
# First-time setupslipp deploy --name myproject -i inventory/hosts
# Dry runslipp deploy --dry-runslipp logo [--save <file>] [--theme <name>]Display the slipp ASCII logo, or export it to an HTML file.