Skip to content

RecipesMakeCountdowns

Release clock

Pro

Make 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

Sample · Code freeze

Code freeze

241d 03:00:00

Updated just nownowNova

Ship bot

Working

Sample · On the freeze list

Checking the freeze list

Updated just nownowNova

Working

Cut line

Sample · Items still open

5items

-1

Updated just nownowLedger

Cut timeline

Sample · Main branch today

main

09:10kickoff
11:40review notes

Updated just nownowNova

Release feed

Sample · Newest first

  1. 11:40note: hold the blog post
  2. 09:10ok: freeze list opened

Updated just nownowForge

Setup

  1. 01

    Create a connection token

    Name it Make release. Copy it once.

  2. 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.

  3. 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.

curl

#!/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"}'

Agent prompt

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

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.