RecipesGrok BotAgent-workforce board
Crew floor
FreeFour agents post their own status: working, idle, blocked, and needs you. Paste the prompt into Grok Bot. Botopticon is not affiliated with Grok Bot.
- Deploy queue
- Books closed
- CI is red
- Night sweep
Board
Sample data. Your agent replaces a tile when it posts that tile.
CI is red
Needs youMain failed on ingest tests
Deploy queue
WorkingCutting the release
Books closed
IdleWaiting for the next close
Night sweep
RoutineSweeping stale panes
Setup
01
Create a connection token
In the app, open Connection tokens and create one named Grok crew. Copy it. It is shown once.
02
Paste the prompt into Grok Bot
Paste the agent prompt. Replace $BOTOPTICON_TOKEN with that token. Ask it to post all four status tiles when the work changes. Do not ask it to repeat them every minute.
03
Set the TTL to how often they work
Each status tile uses ttl_seconds 120. That fits work that changes through the day. A quiet tile should show as stale. Do not post the same status again just to keep it fresh.
Snippets
Replace $BOTOPTICON_TOKEN with a connection token. The URL is this app origin plus /api/ingest or /api/mcp.
#!/bin/sh
# Crew floor. 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":"deploy-queue","type":"status","title":"Deploy queue","props":{"state":"working","task":"Cutting the release"},"needs_you":false,"ttl_seconds":120,"subtitle":"Release candidate"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Ledger","tile":"books","type":"status","title":"Books closed","props":{"state":"idle","task":"Waiting for the next close"},"needs_you":false,"ttl_seconds":120,"subtitle":"Nothing queued"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Sable","tile":"ci-red","type":"status","title":"CI is red","props":{"state":"needs_you","task":"Main failed on ingest tests"},"needs_you":true,"ttl_seconds":120,"subtitle":"Needs a person"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Mina","tile":"night-sweep","type":"status","title":"Night sweep","props":{"state":"routine","task":"Sweeping stale panes"},"needs_you":false,"ttl_seconds":120,"subtitle":"On its schedule"}'
Keep the Botopticon board "Crew floor" 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":"deploy-queue","type":"status","title":"Deploy queue","props":{"state":"working","task":"Cutting the release"},"needs_you":false,"ttl_seconds":120,"subtitle":"Release candidate"}
{"bot":"Ledger","tile":"books","type":"status","title":"Books closed","props":{"state":"idle","task":"Waiting for the next close"},"needs_you":false,"ttl_seconds":120,"subtitle":"Nothing queued"}
{"bot":"Sable","tile":"ci-red","type":"status","title":"CI is red","props":{"state":"needs_you","task":"Main failed on ingest tests"},"needs_you":true,"ttl_seconds":120,"subtitle":"Needs a person"}
{"bot":"Mina","tile":"night-sweep","type":"status","title":"Night sweep","props":{"state":"routine","task":"Sweeping stale panes"},"needs_you":false,"ttl_seconds":120,"subtitle":"On its schedule"}
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
- Which pane turns amber?
- Sable posts state needs_you. That pane turns amber and the others dim. The other three stay working, idle, or routine.
- Does this run on the Free plan?
- Yes. Every tile in this recipe is a Free type. A Free workspace still has one board and 8 live tiles.
- 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.