Skip to main content
Buttons gives agents deterministic escape hatches. Instead of hoping an LLM follows a multi-step procedure correctly, agents press buttons — self-contained, composable actions with clear inputs, outputs, and status. Each button wraps a single action: a shell script, an HTTP API call, a Python/Node snippet, or an agent instruction. Create it once with typed arguments and a timeout, press it whenever you need it, get structured JSON output every time.

Get started

Install

curl, Docker, Go, or Homebrew.

Quick start

Create and press your first button in 30 seconds.

Core Concepts

Buttons

The core unit of reusable work.

Drawers

Typed workflows that compose buttons.

Registry

Install and publish shared buttons, pinned per-button by version and content hash.

History

Local audit history for creates, edits, installs, and updates.

Button guides

Code

Inline shell, Python, or Node scripts.

HTTP API

GET/POST with URL templates and typed args.

File import

Import an existing script file.

Prompt

Attach an instruction for the consuming agent.

Workflows

Drawers chain buttons into typed workflows with refs, loops, sub-drawers, waits, and run history.

Workflows

Build multi-step automations from reusable buttons.

Triggers

Triggers run buttons and drawers automatically — on a schedule (cron), on local file changes (watch), or from an inbound webhook. Button triggers fire under buttons serve; drawer webhook triggers fire under buttons webhook listen.

Trigger concept

How buttons and drawers fire automatically.

Trigger guide

Commands and management model.

Hook

Run on local events — design proposal.

Operations

REST API server

Expose local buttons over HTTP with the same press contract.

CLI reference

Every command is auto-generated from the Cobra command tree. Flags, examples, and descriptions stay in sync with the binary.

CLI reference

Full command reference: create, press, list, history, delete, version, and more.

For deployed agents

Buttons ships as a static binary and a multi-arch Docker image. Bake it into your agent container with one line:
Your agent calls buttons press <name> --json as a subprocess and gets structured output. No SDK, no library import, no runtime dependency.