Skip to content

RecipesGrok BotCountdowns

Launch window

Pro

A countdown to the ship window, plus the release agent, open bugs, and a one-line ticker. Grok Bot posts them. Botopticon is not affiliated with Grok Bot.

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.

  • Launch windowPro
  • Release train
  • Open bugs
  • Ship notes
  • Ship linePro

Board

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

Launch window

Sample · Ship window

Launch window

241d 03:00:00

Updated just nownowNova

Release train

Working

Sample · Cutting the branch

Cutting the release branch

Updated just nownowNova

Working

Open bugs

Sample · Blockers on the release

3bugs

-2

Updated just nownowLedger

Ship notes

Sample · Newest first

  1. 14:02cut: release branch
  2. 13:40warn: flaky billing test

Updated just nownowForge

Nova cut the release branch · Ledger posted 3 open bugs ·

Setup

  1. 01

    Create a connection token

    Name it Grok launch. Copy the token when it is shown.

  2. 02

    Paste the prompt into Grok Bot

    The countdown is a Pro tile. On a Free workspace it is skipped when the board is created. Ask Grok Bot to post every body in the prompt, including the ticker.

  3. 03

    Post when the work changes

    The countdown uses ttl_seconds 3600. The board clock ticks on its own. Post the countdown when the deadline changes. Post status and the feed when the work changes. Do not repeat them on a timer.

Snippets

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

curl

#!/bin/sh
# Launch window. 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":"launch-window","type":"countdown","title":"Launch window","props":{"label":"Launch window","until":"2027-06-01T15:00:00Z"},"needs_you":false,"ttl_seconds":3600,"subtitle":"Ship window"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Nova","tile":"release-train","type":"status","title":"Release train","props":{"state":"working","task":"Cutting the release branch"},"needs_you":false,"ttl_seconds":120,"subtitle":"Cutting the branch"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Ledger","tile":"open-bugs","type":"kpi","title":"Open bugs","props":{"value":3,"unit":"bugs","delta":-2,"delta_format":"absolute"},"needs_you":false,"ttl_seconds":3600,"subtitle":"Blockers on the release"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Forge","tile":"ship-notes","type":"feed","title":"Ship notes","props":{"items":[{"time":"14:02","label":"cut: release branch","tone":"ok"},{"time":"13:40","label":"warn: flaky billing test","tone":"warn"}]},"needs_you":false,"ttl_seconds":120,"subtitle":"Newest first"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Nova","tile":"ship-ticker","type":"ticker","title":"Ship line","props":{"items":["Nova cut the release branch","Ledger posted 3 open bugs"]},"needs_you":false,"ttl_seconds":120,"subtitle":"One line under the board"}'

Agent prompt

Keep the Botopticon board "Launch window" 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":"launch-window","type":"countdown","title":"Launch window","props":{"label":"Launch window","until":"2027-06-01T15:00:00Z"},"needs_you":false,"ttl_seconds":3600,"subtitle":"Ship window"}
{"bot":"Nova","tile":"release-train","type":"status","title":"Release train","props":{"state":"working","task":"Cutting the release branch"},"needs_you":false,"ttl_seconds":120,"subtitle":"Cutting the branch"}
{"bot":"Ledger","tile":"open-bugs","type":"kpi","title":"Open bugs","props":{"value":3,"unit":"bugs","delta":-2,"delta_format":"absolute"},"needs_you":false,"ttl_seconds":3600,"subtitle":"Blockers on the release"}
{"bot":"Forge","tile":"ship-notes","type":"feed","title":"Ship notes","props":{"items":[{"time":"14:02","label":"cut: release branch","tone":"ok"},{"time":"13:40","label":"warn: flaky billing test","tone":"warn"}]},"needs_you":false,"ttl_seconds":120,"subtitle":"Newest first"}
{"bot":"Nova","tile":"ship-ticker","type":"ticker","title":"Ship line","props":{"items":["Nova cut the release branch","Ledger posted 3 open bugs"]},"needs_you":false,"ttl_seconds":120,"subtitle":"One line under the board"}

Grok Bot 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

Where does the ticker sit?
Ticker is one line across the bottom of the board, not a cell in the grid. The other tiles use the cells in the curl block.
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.