Skip to content

Complete reference for all slipp commands. Commands follow a consistent pattern:

  • Singular = action (slipp run, slipp deploy)
  • Plural = manage resources (slipp runs, slipp secrets)
Terminal window
slipp [OPTIONS] COMMAND [ARGS]
OptionDescription
-v, --verboseEnable verbose logging
-o, --outputOutput format: table (default), json
-V, --versionShow version and exit
--helpShow help message

Commands for monitoring and managing deployed services.

List running services across registered projects (like docker ps).

Terminal window
slipp ps [OPTIONS]
OptionDescription
-p, --projectFilter by project name
--refreshForce re-discovery (bypass cache)
--allInclude system services
Terminal window
# List all services
slipp ps
# Filter by project
slipp ps -p myproject
# Fresh discovery
slipp ps --refresh
# JSON output
slipp ps -o json

When 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).

Terminal window
slipp logs <service> [OPTIONS]
OptionDescription
-f, --followFollow log output
-n, --linesNumber of lines (default: 50)
--allInclude system services in discovery
Terminal window
# View last 50 lines
slipp logs synapse
# Follow logs
slipp logs synapse -f
# Last 100 lines
slipp logs synapse -n 100

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:

FormResolves to
serviceLook up in the global service index
service@hostFilter by host name
project:serviceFilter by project name
project:service@hostFully qualified
Terminal window
slipp logs postgres # ambiguous if two projects share a host
slipp logs myproject:postgres
slipp logs postgres@myserver

If 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.

Display detailed service status (like systemctl status).

Terminal window
slipp status <service>

Execute a command on VPS or in a container.

Terminal window
slipp exec "<command>"
slipp exec <service> "<command>"
OptionDescription
-u, --userOverride user (root, postgres, www-data)
Terminal window
# Execute on VPS
slipp exec "df -h"
# Execute in container
slipp exec synapse "cat /data/homeserver.yaml"
# Execute as root
slipp exec -u root "systemctl restart nginx"

Open interactive shell on VPS or container service.

Terminal window
slipp ssh [service]
OptionDescription
-u, --userOverride user
Terminal window
# SSH to VPS
slipp ssh
# Shell into container
slipp ssh synapse
# As specific user
slipp ssh -u postgres

Output host connection info (pipeable).

Terminal window
slipp host [project]
OptionDescription
--ipOutput IP only
--userOutput user only
--portOutput port only
Terminal window
# Get connection string
slipp host
# Output: slipp@192.168.1.100
# Get IP for scripting
slipp host --ip
# Output: 192.168.1.100
# Specific project
slipp host myproject --ip

Commands for local development workflows.

Execute a run profile for local development with remote infrastructure.

Terminal window
slipp run <name> [OPTIONS] [-- ARGS]
OptionDescription
--cmdCommand (creates/updates profile)
--envEnvironment variable KEY=VALUE (repeatable)
--vaultVault project(s) for secrets (repeatable)
--tunnel-outReverse tunnel local_port:domain@host
--tunnel-inForward tunnel service:port@host
--proxyProxy route from@host -> to (repeatable)
--tunnel-authHTTP basic auth for tunnel-out routes user:pass (bcrypt-hashed before saving)
Terminal window
# Create and run profile
slipp run dev \
--cmd "npm run dev" \
--tunnel-out 5173:app.example.com@myserver \
--vault myproject

slipp 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=staging
Terminal window
slipp runs list

Lists all saved profiles with their commands, vaults, and tunnels.

Terminal window
slipp runs remove <name>

Remove a saved run profile.

Generate complete Ansible project from codebase.

Terminal window
slipp launch [OPTIONS]
OptionDescription
-n, --nameProject name (required)
-e, --envEnvironment (default: production)
-d, --dirDirectories to scan (repeatable)
--dry-runShow what would be done
--reconfigureRe-prompt for inventory config
--proxyReverse proxy: auto (probe host, default), caddy, none, wg-manage
--publicExpose via Let’s Encrypt instead of internal CA (--proxy wg-manage only)
--python-extrauv sync --extra group (Python systemd deploys)
--exec-argsExtra ExecStart arguments (Python systemd deploys)
--health-checkHTTP path polled after restart; rolls back on failure (systemd deploys)
Terminal window
# Generate Ansible project
slipp launch --name myapp
# Multiple directories
slipp launch --name myapp -d ./frontend -d ./backend
# Different environment
slipp launch --name myapp --env staging
# Expose through wg-manage, publicly, with a rollback-guarded health check
slipp 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 specific Ansible project files.

Terminal window
slipp generate dockerfile [OPTIONS]

Generate only Dockerfiles for detected services.

Terminal window
slipp generate scaffold [OPTIONS]

Generate project scaffolding without Dockerfiles.

Alias for slipp launch — generates the complete project (Dockerfiles + scaffolding).


Manage Ansible tag presets for deployments.

Show a tag preset’s configuration.

Terminal window
slipp tag <preset>
Terminal window
slipp tag install
# Output:
# --tags: install-all
# --skip-tags: import-postgres

Manage tag presets.

Terminal window
slipp tags list

List all configured tag presets.

Terminal window
slipp tags add <name> [OPTIONS]
OptionDescription
-t, --tagsAnsible tags to run (comma-separated)
--skip-tagsAnsible tags to skip (comma-separated)
Terminal window
slipp tags add install --tags install-all --skip-tags import-postgres
slipp tags add setup --tags setup-all
Terminal window
slipp tags remove <name>

Remove a tag preset.


Generate and manage vault secrets.

Generate a cryptographically secure secret.

Terminal window
slipp secret [OPTIONS]
OptionDescription
-b, --bytesBytes of entropy (default: 32 = 256-bit)
--base64Output as base64 instead of hex
--ulidOutput as ULID (ignores —bytes)
--jwkOutput as RSA JWK keypair
--bitsRSA key size for —jwk (default: 2048)
Terminal window
# Generate 256-bit hex secret
slipp secret
# Output: 64 hex chars
# Base64 encoding
slipp secret --base64
# Generate JWK keypair
slipp secret --jwk
# Generate ULID
slipp secret --ulid

Manage vault secrets.

Terminal window
slipp secrets list [target] [secret_name]

List secrets in a vault, or show available vaults if no target specified.

OptionDescription
-n, --nameGet template string for secret name
Terminal window
# Show available vaults
slipp secrets list
# List secrets in project vault
slipp secrets list myproject
# Get template string for specific secret
slipp secrets list myproject db_password
# Output: {{ db_password }}
Terminal window
slipp secrets add <name> [target] [OPTIONS]
OptionDescription
-b, --bytesBytes of entropy (default: 32)
-e, --encodingOutput encoding: hex (default), base64, ulid
--jwkGenerate RSA JWK keypair
--bitsRSA key size for —jwk (default: 2048)
Terminal window
# Add random secret to current project vault
slipp secrets add vault_db_password
# Add to specific project
slipp secrets add vault_api_key myproject
# Add JWK keypair
slipp secrets add vault_signing_key --jwk
Terminal window
slipp secrets sync <path> [OPTIONS]

Scan YAML for {{ vault_* }} references and auto-generate secrets.

OptionDescription
-b, --bytesBytes of entropy (default: 32)
-e, --encodingOutput encoding: hex (default), base64, ulid
-f, --force-existingAdd missing secrets to an existing vault.yml
Terminal window
slipp secrets sync inventory/host_vars/myhost/vars.yml
# Creates vault.yml with generated secrets for all {{ vault_* }} refs
Terminal window
slipp secrets pull <source> [target] [OPTIONS]

Pull credentials from external source via browser approval flow.

ArgumentDescription
sourceSecret source (e.g., nor-auth)
targetTarget vault (project name or path)
OptionDescription
-t, --timeoutTimeout in seconds (default: 300)
Terminal window
# Pull from nor-auth to current project vault
slipp secrets pull nor-auth
# Pull to specific project
slipp secrets pull nor-auth myproject
# Custom timeout
slipp secrets pull nor-auth --timeout 600

Container image operations.

Push local container image to VPS via SSH.

Terminal window
slipp image push <image> [OPTIONS]
OptionDescription
--hostTarget host/project
-n, --nameRename image on VPS
Terminal window
# Push image
slipp image push myapp:latest
# Push to specific project host
slipp image push myapp:latest --host myproject
# Rename on push
slipp image push myapp:v1.2.3 --name myapp:latest

List container images on VPS.

Terminal window
slipp images list [OPTIONS]
OptionDescription
--hostTarget host/project
-f, --filterFilter by name pattern
Terminal window
# List all images
slipp images list
# Filter by pattern
slipp images list --filter "myapp*"

Project and configuration management.

Manage registered projects.

Terminal window
slipp projects list

List all registered projects with their paths.

Terminal window
slipp projects add <name> [OPTIONS]

Register the current directory as a project.

OptionDescription
-i, --inventoryInventory file path (auto-detected if not specified)
--playbookPlaybook file path (auto-detected if not specified)
--rolesRole search directories (auto-detected if not specified)
--galaxy-pathInstall path for external roles from requirements.yml
--vaultPath to vault.yml for secret management
--runtimeHow the app runs: systemd, docker, podman — set explicitly for projects not scanned/generated by slipp launch
Terminal window
# Auto-detect everything
slipp projects add myapp
# Explicit inventory
slipp projects add myapp -i inventory/hosts
# Full setup
slipp 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 systemd
Terminal window
slipp projects remove <name>

Unregister a project.

Show current project configuration.

Terminal window
slipp config

Displays:

  • Project name, inventory, playbook, vault paths
  • Hosts from inventory
  • Global registry status

Supports -o json for machine-readable output.


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.

Terminal window
slipp up <name> [OPTIONS]
OptionDescription
--hostUse an existing host IP (skips provisioning)
--domainDomain to register (if available) and deploy to
--dnsDNS handling: auto (default)
-e, --envEnvironment name
--hubMake the host a wg-manage hub (via a configured wg-deploy checkout) before launch, so --proxy auto finds it
--publicExpose via Let’s Encrypt instead of internal CA (--proxy wg-manage only)
Terminal window
# Full provision -> domain -> launch -> DNS -> deploy
slipp up myapp --domain myapp.example.com
# Reuse an already-provisioned host, make it a hub, expose publicly
slipp up myapp --host 203.0.113.5 --domain myapp.example.com --hub --public

Order a VPS via Gigahost, bootstrap it, and register it as a slipp project.

Terminal window
slipp provision <name> [OPTIONS]
OptionDescription
-e, --envEnvironment 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.

Out-of-band server operations (no SSH needed — talks to the provider API directly).

Terminal window
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.

Terminal window
slipp servers list

List VPS servers across configured providers (no SSH needed).

Manage infrastructure providers: gigahost, pangolin, wg-deploy.

Terminal window
slipp providers add <name>
slipp providers list
slipp providers remove <name>
Terminal window
# Prompts for and verifies a Gigahost API key
slipp 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 list
slipp providers remove pangolin

Domain availability, registration, and listing (.no only, via Gigahost).

Terminal window
slipp domains check <domain>
slipp domains register <domain>
slipp domains list

register prompts for registrant info and only proceeds if check reports the domain available.

DNS record management (via the configured DNS provider).

Terminal window
slipp dns sync
slipp 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.

Manage exposed services: wg-manage strays (if the project’s host is a wg-manage hub) or public Pangolin resources otherwise.

Terminal window
slipp resources sync [OPTIONS]
slipp resources list
slipp resources remove <name> [--force]
OptionDescription
--sitePangolin site name/niceId/siteId (Pangolin projects only)
--dry-runShow 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.

Terminal window
slipp hosts add <name> --host <ip> [OPTIONS]
slipp hosts list
slipp hosts remove <name>
OptionDescription
--hostIP address or domain for SSH connection (required)
--userSSH username (default: slipp)
--portSSH port (default: 22)
--runtimeHow the app runs: systemd, docker, podman
Terminal window
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 --reconfigure

Adding 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.


VPS bootstrap operations for initial setup.

Create slipp service account on VPS.

Terminal window
slipp bootstrap account <host> [OPTIONS]
OptionDescription
--root-userRoot user for initial connection (default: root)
--ssh-keySSH private key path
-p, --portSSH port (default: 22)
--userService account name (default: slipp)
--dry-runShow what would be done
Terminal window
slipp bootstrap account 192.168.1.100 --port 22
# Dry run first
slipp bootstrap account myserver.com --dry-run

This command:

  1. Creates the slipp user account
  2. Copies SSH keys from root
  3. Configures passwordless sudo
  4. Verifies the setup

Setup dev proxy infrastructure for --tunnel-out.

Terminal window
slipp bootstrap proxy <host> [OPTIONS]
OptionDescription
-e, --emailEmail for Let’s Encrypt certificates (required)
-p, --fallback-portPort for existing HTTPS service (default: 9443)
Terminal window
slipp bootstrap proxy myproject --email admin@example.com

Installs Caddy dev proxy for routing production domains to local tunnels.

Setup container registry authentication on VPS.

Terminal window
slipp bootstrap registry ghcr [OPTIONS]
OptionDescription
--hostTarget host/project
-u, --userGitHub username
-t, --tokenGitHub PAT (or set GITHUB_TOKEN)
Terminal window
slipp bootstrap registry dockerhub [OPTIONS]
OptionDescription
--hostTarget host/project
-u, --userDocker Hub username
-t, --tokenDocker Hub token (or set DOCKER_TOKEN)
Terminal window
# GitHub Container Registry
slipp bootstrap registry ghcr --user myuser
# Docker Hub
slipp bootstrap registry dockerhub --user myuser

Execute Ansible playbook to deploy services.

Terminal window
slipp deploy [target] [preset] [OPTIONS]
ArgumentDescription
targetEnvironment name or tag preset (default: production)
presetTag preset when using slipp deploy <env> <preset>
OptionDescription
-n, --nameProject name (creates/updates slipp.yaml)
--dry-runShow what would be done
-i, --inventoryCustom inventory file path
--playbookCustom playbook file path
--vaultPath to vault file
-r, --requirementsPath to requirements.yml
--rolesRole search directories (repeatable)
--galaxy-pathInstall path for external roles (default: roles/galaxy)
--force-requirementsForce reinstall roles/collections
-t, --tagsAnsible tags to run
--skip-tagsAnsible tags to skip
--runtimeHow the app runs: systemd, docker, podman — set explicitly for projects not scanned/generated by slipp launch
Terminal window
# Deploy with defaults
slipp deploy
# Use tag preset
slipp deploy install
# Deploy to staging with preset
slipp deploy staging install
# First-time setup
slipp deploy --name myproject -i inventory/hosts
# Dry run
slipp deploy --dry-run

Terminal window
slipp logo [--save <file>] [--theme <name>]

Display the slipp ASCII logo, or export it to an HTML file.