Using Pando

Console#

http://localhost:8080. Two views, depending on your permissions: a page of app tiles for people who only need to open apps, and an admin interface for people who deploy and configure them.

The admin interface covers apps and their configuration, sharing and access, environment variables and secrets, host policy, user accounts, groups and roles, backups, the audit log, and a terminal into any running container.

CLI#

Installed separately, or used from inside the container with docker compose exec pando pando ….

pando login https://pando.example.com    # stores an API token for this machine

pando app add https://github.com/you/notes
pando app list
pando app show notes
pando deploy notes                       # or: pando deploy ./local-directory
pando logs notes --follow
pando exec notes -- sh

pando slot set notes database --provision   # let Pando create the database
pando secret set notes STRIPE_KEY
pando grant add notes --user usr_01HQ8…     # give someone access
pando rollback notes                        # to the previous configuration
pando export notes                          # the app's full spec, as JSON

Also pando backup, pando policy and pando token. Run pando <command> --help for details, and --server to talk to an installation other than the one you logged into. Every command, with its flags: docs/cli.md.

For CI, a container or anything else with no home directory to store a login in, set a token in the environment instead:

export PANDO_SERVER=https://pando.example.com
export PANDO_TOKEN=tok_…      # from the console, under API and tools

MCP server#

Pando exposes its API to coding agents over MCP, so an agent can deploy and inspect apps directly. It runs on your machine over stdio and uses the token from pando login.

pando login https://pando.example.com

Claude Code:

claude mcp add pando -- pando mcp

Any other MCP client, in its config file:

{
  "mcpServers": {
    "pando": {
      "command": "pando",
      "args": ["mcp"]
    }
  }
}

The tools, with their arguments: docs/mcp.md. An MCP client that runs pando mcp without a login of its own takes PANDO_SERVER and PANDO_TOKEN from its env block.

An agent's token carries the same permissions you do and no more, and everything it does appears in the audit log under your name. Running commands inside apps, reading secret values and changing who has access are not available as MCP tools, and are denied to tokens by host policy by default.

HTTP API#

Everything above is a client of /api/v1, which you can use directly with a session cookie or a bearer token from pando token. Errors return a machine-readable code, a description, and a suggested fix:

{
  "code": "PLAN_SLOT_UNFILLED",
  "message": "This app needs a PostgreSQL database, and one hasn't been chosen yet.",
  "remedy": "Choose how to fill the database slot: provision one inside this app, connect to an existing one, or paste a connection string.",
  "details": { "slots": [{ "key": "database", "type": "postgres" }] },
  "request_id": "req_01HQ8…"
}

Every endpoint, the verb it asks for and every error code: docs/api.md — generated from the running code, so it cannot describe a version of Pando that no longer exists. The same document is in the console under API and tools, which is also where you mint a token, and at GET /api/v1/reference for anything that would rather read it as JSON.