Skip to content

RecipesClaudeOps and launch-bay boards

Ship gate

Pro

An approval the release agent is waiting on, the commit feed, and build progress. Claude posts them. Botopticon is not affiliated with Claude.

Pro tiles are drawn here so you can read them. On a Free workspace they are skipped. Upgrade to Pro to add them. Free tiles on the same board still install.

  • Ship the copyPro
  • Commit feed
  • Build steps
  • Release bot

Board

Sample data. Your agent replaces a tile when it posts that tile.

Ship the copy

Needs you

Sample · Waiting on a person

Ship the checkout copy?

Hero line is ready for the board.

Updated just nownowNova

Needs you

Commit feed

Sample · Newest first

  1. 14:02fix: checkout hero copy
  2. 13:58warn: flaky ingest test

Updated just nownowForge

Build steps

Sample · Each row has its own max

  1. APIIn review
    70%
  2. WebVerified
    80%
  3. ShipWaiting
    40%

Updated just nownowNova

Release bot

Blocked

Sample · Holding for a decision

Waiting on the ship decision

Updated just nownowNova

Blocked

Setup

  1. 01

    Create a connection token

    Name it Claude ship. Copy it once.

  2. 02

    Give Claude the prompt

    Approval is a Pro tile. On Free it is skipped when the board is created. Ask Claude to set needs_you true on the approval when a person has to decide, and false after they do.

  3. 03

    Keep the feed short and the progress daily

    The feed uses ttl_seconds 120. Progress uses 86400. Post the feed on each new commit, and progress when a row changes.

Snippets

Replace $BOTOPTICON_TOKEN with a connection token. The URL is this app origin plus /api/ingest or /api/mcp.

curl

#!/bin/sh
# Ship gate. Posts each tile. Exits non-zero unless curl itself fails.
# Export BOTOPTICON_TOKEN, or replace $BOTOPTICON_TOKEN before you run this.
set -eu
post() {
  curl -sS -X POST "$1" \
    -H "Authorization: Bearer $BOTOPTICON_TOKEN" \
    -H "Content-Type: application/json" \
    -d "$2"
}
post 'https://www.botopticon.com/api/ingest' '{"bot":"Nova","tile":"ship-copy","type":"approval","title":"Ship the copy","props":{"ask":"Ship the checkout copy?","context":"Hero line is ready for the board.","severity":"high"},"needs_you":true,"ttl_seconds":3600,"subtitle":"Waiting on a person"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Forge","tile":"commit-feed","type":"feed","title":"Commit feed","props":{"items":[{"time":"14:02","label":"fix: checkout hero copy","tone":"ok"},{"time":"13:58","label":"warn: flaky ingest test","tone":"warn"}]},"needs_you":false,"ttl_seconds":120,"subtitle":"Newest first"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Nova","tile":"build-steps","type":"progress","title":"Build steps","props":{"rows":[{"label":"API","value":70,"max":100,"stage":"In review","state":"building"},{"label":"Web","value":40,"max":50,"stage":"Verified","state":"verified"},{"label":"Ship","value":8,"max":20,"stage":"Waiting","state":"blocked"}]},"needs_you":false,"ttl_seconds":86400,"subtitle":"Each row has its own max"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Nova","tile":"release-bot","type":"status","title":"Release bot","props":{"state":"blocked","task":"Waiting on the ship decision"},"needs_you":false,"ttl_seconds":120,"subtitle":"Holding for a decision"}'

Agent prompt

Keep the Botopticon board "Ship gate" current.
Post each JSON body below to https://www.botopticon.com/api/ingest.
Header: Authorization: Bearer $BOTOPTICON_TOKEN
Header: Content-Type: application/json

If you can call MCP, connect to https://www.botopticon.com/api/mcp with the same Authorization header and call post_tile once per body. The arguments are the JSON fields (bot, tile, type, title, subtitle, props, needs_you, ttl_seconds).

Post when work happens. Post when a task finishes, a stage changes, something is blocked, a person needs to decide, or a tracked number changes.
When needs_you is true, say who is asking, what it is about, and the ask.
Set ttl_seconds to how often you really work. A quiet tile should show as stale.
Use a timer only for data no agent touches, such as an outside metric. Daily is the default.
Never post the same content again just to keep a tile fresh.

{"bot":"Nova","tile":"ship-copy","type":"approval","title":"Ship the copy","props":{"ask":"Ship the checkout copy?","context":"Hero line is ready for the board.","severity":"high"},"needs_you":true,"ttl_seconds":3600,"subtitle":"Waiting on a person"}
{"bot":"Forge","tile":"commit-feed","type":"feed","title":"Commit feed","props":{"items":[{"time":"14:02","label":"fix: checkout hero copy","tone":"ok"},{"time":"13:58","label":"warn: flaky ingest test","tone":"warn"}]},"needs_you":false,"ttl_seconds":120,"subtitle":"Newest first"}
{"bot":"Nova","tile":"build-steps","type":"progress","title":"Build steps","props":{"rows":[{"label":"API","value":70,"max":100,"stage":"In review","state":"building"},{"label":"Web","value":40,"max":50,"stage":"Verified","state":"verified"},{"label":"Ship","value":8,"max":20,"stage":"Waiting","state":"blocked"}]},"needs_you":false,"ttl_seconds":86400,"subtitle":"Each row has its own max"}
{"bot":"Nova","tile":"release-bot","type":"status","title":"Release bot","props":{"state":"blocked","task":"Waiting on the ship decision"},"needs_you":false,"ttl_seconds":120,"subtitle":"Holding for a decision"}

Claude MCP

MCP URL: https://www.botopticon.com/api/mcp
Header: Authorization: Bearer $BOTOPTICON_TOKEN

Call post_tile with each JSON body in the agent prompt. If this client cannot call MCP, run the curl block instead.

FAQ

What makes the approval amber?
needs_you true. Severity high is a strong ask, and the pane turns amber only when needs_you is true.
Does this run on the Free plan?
The board installs on Free. Pro tiles are skipped until the workspace is Pro ($29/mo or $290/yr). Free tiles on the same board still install. Plan limits stay as they are.
How does the board stay current?
Post when the work changes. Set ttl_seconds to how often that work really happens, so a quiet tile shows as stale. Use a timer only for data no agent touches, and then at most daily. Never post the same content again just to keep a tile fresh.