Skip to content
pando/ docs

Skills, Lua and Extensions

Reference for the ways to teach Pando new tricks. Explanation: Extensions. Step by step: Write your first skill.

Skills

[Skills]
Enabled = true
Paths   = ['./agents/skills']   # extra folders to search

[SkillsCatalog]
Enabled      = true
BaseURL      = ''               # empty = https://skills.sh
AutoUpdate   = false
DefaultScope = 'global'         # global | project

Folders searched, besides Paths: ~/.pando/skills, <project>/.pando/skills, ~/.claude/skills, <project>/.claude/skills. Each skill is a folder with a SKILL.md.

SKILL.md header fields:

FieldMeaning
nameDefaults to the folder name
descriptionWhen to use the skill. Defaults to the first paragraph
when-to-use, when-not-to-useExtra hints for choosing it
version, author, license, compatibilityInformation only
allowed-toolsTools the skill may use
user-invocableYou can call it by name
disable-model-invocationPando never picks it on its own

Skills Pando proposes from your sessions live in .pando/skills/learned/:

pando skills list --status pending
pando skills approve <id>
pando skills reject <id>

Lua

[Lua]
Enabled         = false
ScriptPath      = ''      # path to your hooks file
Timeout         = ''      # e.g. "5s"
StrictMode      = false   # treat script errors as fatal
HotReload       = false   # reload when the file changes
LogFilteredData = false   # log what scripts filtered or blocked

Extensions

Extensions are built into the Pando program. Configuration only chooses which of the built-in ones load and passes them their settings.

[Extensions]
Disabled = ["memory.sink.corp"]     # never load these, whatever else says

[Extensions.Entries."memory.sink.corp"]
Enabled = true

[Extensions.Entries."memory.sink.corp".Config]
Endpoint = "https://remembrances.corp.internal"

Disabled is the stronger switch: it also turns off extensions that would load by default.

pando extensions list      # built-in extensions and whether they loaded
pando ext                  # run commands contributed by extensions
pando --version            # shows the build variant, e.g. v0.9.1 (enterprise)

Building a binary with extensions

make build                          # ./pando
make build-enterprise               # ./pando-enterprise
make release-enterprise             # a distributable archive
make xpando                         # the composing build tool

./xpando build v0.9.1 \
    --with github.com/yourorg/your-extension/tools \
    --output ./pando-enterprise
FlagMeaning
--with module[/pkg][@version][=/local/path]Extension package to link in. Repeatable; =path builds against a local checkout
--replace module[@version]=replacementA dependency replacement with no import. Repeatable
--tags, --ldflags, --outputPassed through to the build
--variant nameOverrides the variant shown by --version

GOOS, GOARCH and the usual Go toolchain variables are honoured. The Web UI is embedded in the core, so a composed binary ships the stock interface unless one of its extensions supplies its own.