RecipesMakeCountdowns
Release clock
ProMake posts the release countdown, a timeline of the cut, and a short feed. Botopticon is not affiliated with Make.
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.
- Release clockPro
- Ship bot
- Cut line
- Cut timelinePro
- Release feed
Board
Sample data. Your agent replaces a tile when it posts that tile.
Release clock
Code freeze
241d 03:00:00
Ship bot
WorkingChecking the freeze list
Cut line
-1
Cut timeline
main
Release feed
- 11:40note: hold the blog post
- 09:10ok: freeze list opened
Setup
01
Create a connection token
Name it Make release. Copy it once.
02
Post the countdown when the window is set
Countdown and timeline are Pro tiles. On Free they are skipped when the board is created. until must be an ISO-8601 time with an offset, such as 2027-06-01T15:00:00Z.
03
Post when the release changes
ttl_seconds is 3600 for the countdown. The board clock ticks between posts. Post status and the feed when something changes. Do not run a scenario every minute.
Snippets
Replace $BOTOPTICON_TOKEN with a connection token. The URL is this app origin plus /api/ingest or /api/mcp.
#!/bin/sh
# Release clock. 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":"release-clock","type":"countdown","title":"Release clock","props":{"label":"Code freeze","until":"2027-06-01T15:00:00Z"},"needs_you":false,"ttl_seconds":3600,"subtitle":"Code freeze"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Nova","tile":"ship-bot","type":"status","title":"Ship bot","props":{"state":"working","task":"Checking the freeze list"},"needs_you":false,"ttl_seconds":120,"subtitle":"On the freeze list"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Ledger","tile":"cut-line","type":"kpi","title":"Cut line","props":{"value":5,"unit":"items","delta":-1,"delta_format":"absolute"},"needs_you":false,"ttl_seconds":3600,"subtitle":"Items still open"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Nova","tile":"cut-line-time","type":"timeline","title":"Cut timeline","props":{"lanes":[{"name":"main","events":[{"time":"09:10","label":"kickoff","tone":"ok"},{"time":"11:40","label":"review notes","tone":"warn"}]}]},"needs_you":false,"ttl_seconds":3600,"subtitle":"Main branch today"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Forge","tile":"release-feed","type":"feed","title":"Release feed","props":{"items":[{"time":"11:40","label":"note: hold the blog post","tone":"warn"},{"time":"09:10","label":"ok: freeze list opened","tone":"ok"}]},"needs_you":false,"ttl_seconds":120,"subtitle":"Newest first"}'
Keep the Botopticon board "Release clock" 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":"release-clock","type":"countdown","title":"Release clock","props":{"label":"Code freeze","until":"2027-06-01T15:00:00Z"},"needs_you":false,"ttl_seconds":3600,"subtitle":"Code freeze"}
{"bot":"Nova","tile":"ship-bot","type":"status","title":"Ship bot","props":{"state":"working","task":"Checking the freeze list"},"needs_you":false,"ttl_seconds":120,"subtitle":"On the freeze list"}
{"bot":"Ledger","tile":"cut-line","type":"kpi","title":"Cut line","props":{"value":5,"unit":"items","delta":-1,"delta_format":"absolute"},"needs_you":false,"ttl_seconds":3600,"subtitle":"Items still open"}
{"bot":"Nova","tile":"cut-line-time","type":"timeline","title":"Cut timeline","props":{"lanes":[{"name":"main","events":[{"time":"09:10","label":"kickoff","tone":"ok"},{"time":"11:40","label":"review notes","tone":"warn"}]}]},"needs_you":false,"ttl_seconds":3600,"subtitle":"Main branch today"}
{"bot":"Forge","tile":"release-feed","type":"feed","title":"Release feed","props":{"items":[{"time":"11:40","label":"note: hold the blog post","tone":"warn"},{"time":"09:10","label":"ok: freeze list opened","tone":"ok"}]},"needs_you":false,"ttl_seconds":120,"subtitle":"Newest first"}
Make HTTP module.
Method: POST
URL: https://www.botopticon.com/api/ingest
Header: Authorization: Bearer $BOTOPTICON_TOKEN
Header: Content-Type: application/json
Send one request per tile. First body:
{"bot":"Nova","tile":"release-clock","type":"countdown","title":"Release clock","props":{"label":"Code freeze","until":"2027-06-01T15:00:00Z"},"needs_you":false,"ttl_seconds":3600,"subtitle":"Code freeze"}
Then:
{"bot":"Nova","tile":"ship-bot","type":"status","title":"Ship bot","props":{"state":"working","task":"Checking the freeze list"},"needs_you":false,"ttl_seconds":120,"subtitle":"On the freeze list"}
{"bot":"Ledger","tile":"cut-line","type":"kpi","title":"Cut line","props":{"value":5,"unit":"items","delta":-1,"delta_format":"absolute"},"needs_you":false,"ttl_seconds":3600,"subtitle":"Items still open"}
{"bot":"Nova","tile":"cut-line-time","type":"timeline","title":"Cut timeline","props":{"lanes":[{"name":"main","events":[{"time":"09:10","label":"kickoff","tone":"ok"},{"time":"11:40","label":"review notes","tone":"warn"}]}]},"needs_you":false,"ttl_seconds":3600,"subtitle":"Main branch today"}
{"bot":"Forge","tile":"release-feed","type":"feed","title":"Release feed","props":{"items":[{"time":"11:40","label":"note: hold the blog post","tone":"warn"},{"time":"09:10","label":"ok: freeze list opened","tone":"ok"}]},"needs_you":false,"ttl_seconds":120,"subtitle":"Newest first"}
Post when the number changes. Use a timer only for data no agent touches, and then at most once a day. Never post the same body again just to keep a tile fresh.
FAQ
- Does the countdown need a post every second?
- No. The board clock ticks on its own. Post when the deadline or the feed changes. Set ttl_seconds to how often that really happens. A quiet tile should show as stale.
- 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.