Agent identity, over-the-air updates, and drawer packages
Workspaces get a signed device identity and a stable public URL, installed buttons update themselves over the air, and drawers become first-class registry packages.New features
-
buttons agent— device identity + public URL — give a workspace a durable, signature-proven identity.buttons agent setup <slug>generates an on-device Ed25519 keypair (private seed never leaves the machine, stored0600inagent.json), consumes a one-timeENROLL_TOKENto enroll with$BUTTONS_REGISTRY_URL, registers a slug, and prints the webhook/tunnel URLs. When no tunnel is configured the broker provisions one.buttons agent statusshows the device id and slug, never a secret. See Agent identity. - Drawer registry packages — drawers publish and install like buttons. Installing a drawer package also installs every button its steps reference, resolved into the lockfile. See the registry concept.
-
Over-the-air button updates — installed buttons update themselves.
buttons updaterefreshes floating package dependencies alongside the CLI binary, and a passive check runs on every command so a workspace stays current without a manual step. Local edits are compared against the lockfile hash and never overwritten. -
Simple content versions — published buttons and drawers use plain incrementing version numbers starting at
1; registry versions are immutable, and publish auto-bumps to the next number if one already exists.
Updates
-
Ranked, capped
AGENTS.mdbutton list — the auto-maintained project button list now refreshes oncreate,delete,add, andimport(not just create), orders buttons most-pressed-first, and caps the detailed list at 20 with the rest collapsed to a names line.agent.jsonis now gitignored by default so the device private key is never committed. See Agent instructions. - Shell completions via Homebrew — installing Buttons through the Homebrew tap installs shell completions automatically.
-
Opt-in package-manager CLI updates —
buttons updatecan defer to the package manager that installed the binary (e.g. Homebrew) instead of self-replacing.