Recipescurl / cronKPI and metric boards
Market watch
ProA cron job posts one stock quote, the session status, and how many prints landed today. No agent chat required. The job is curl.
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.
- SPCX quotePro
- Quote session
- Prints today
Board
Sample data. Your agent replaces a tile when it posts that tile.
SPCX quote
Quote session
WorkingPulling the 1D tape
Prints today
+6
Setup
01
Create a connection token
Name it Market cron. Copy it once.
02
Export the token where cron can see it
Put BOTOPTICON_TOKEN in the crontab environment or inline as $BOTOPTICON_TOKEN. Do not commit the token.
03
Install the curl block and the crontab line
Stock is a Pro tile. On a Free workspace it is skipped when the board is created. The session status and the prints count are Free and still render. Post the quote when you pull a new price. Once a day is the default. Do not repost the same price just to keep the tile fresh. symbol and price are required. Omit change to derive it from price and prev_close.
Snippets
Replace $BOTOPTICON_TOKEN with a connection token. The URL is this app origin plus /api/ingest or /api/mcp.
#!/bin/sh
# Market watch. 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":"Rex","tile":"spcx","type":"stock","title":"SPCX quote","props":{"symbol":"SPCX","name":"Space Corp","price":148.64,"currency":"USD","prev_close":142.1,"day_high":149.2,"day_low":141.8,"market_state":"open","range_label":"1D","points":[{"t":"2026-10-04T13:30:00Z","v":142.4},{"t":"2026-10-04T16:00:00Z","v":145.1},{"t":"2026-10-04T20:00:00Z","v":148.64}]},"needs_you":false,"ttl_seconds":300,"subtitle":"Live equity"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Rex","tile":"session","type":"status","title":"Quote session","props":{"state":"working","task":"Pulling the 1D tape"},"needs_you":false,"ttl_seconds":300,"subtitle":"Cron is posting"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Rex","tile":"prints","type":"kpi","title":"Prints today","props":{"value":48,"unit":"prints","delta":6,"delta_format":"absolute"},"needs_you":false,"ttl_seconds":300,"subtitle":"Posts since the open"}'
Keep the Botopticon board "Market watch" 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":"Rex","tile":"spcx","type":"stock","title":"SPCX quote","props":{"symbol":"SPCX","name":"Space Corp","price":148.64,"currency":"USD","prev_close":142.1,"day_high":149.2,"day_low":141.8,"market_state":"open","range_label":"1D","points":[{"t":"2026-10-04T13:30:00Z","v":142.4},{"t":"2026-10-04T16:00:00Z","v":145.1},{"t":"2026-10-04T20:00:00Z","v":148.64}]},"needs_you":false,"ttl_seconds":300,"subtitle":"Live equity"}
{"bot":"Rex","tile":"session","type":"status","title":"Quote session","props":{"state":"working","task":"Pulling the 1D tape"},"needs_you":false,"ttl_seconds":300,"subtitle":"Cron is posting"}
{"bot":"Rex","tile":"prints","type":"kpi","title":"Prints today","props":{"value":48,"unit":"prints","delta":6,"delta_format":"absolute"},"needs_you":false,"ttl_seconds":300,"subtitle":"Posts since the open"}
# Once a day, for a metric no agent touches (SPCX quote, ttl_seconds 300).
# Skip the post when the value has not changed. Do not use this to repeat a status tile.
0 8 * * * curl -sS -X POST "https://www.botopticon.com/api/ingest" -H "Authorization: Bearer $BOTOPTICON_TOKEN" -H "Content-Type: application/json" -d '{"bot":"Rex","tile":"spcx","type":"stock","title":"SPCX quote","props":{"symbol":"SPCX","name":"Space Corp","price":148.64,"currency":"USD","prev_close":142.1,"day_high":149.2,"day_low":141.8,"market_state":"open","range_label":"1D","points":[{"t":"2026-10-04T13:30:00Z","v":142.4},{"t":"2026-10-04T16:00:00Z","v":145.1},{"t":"2026-10-04T20:00:00Z","v":148.64}]},"needs_you":false,"ttl_seconds":300,"subtitle":"Live equity"}'
FAQ
- What belongs in the stock tile?
- One symbol, its price, and up to 400 points of { t, v }. t is an ISO-8601 datetime with an offset. This is a grid tile, not the bottom ticker. Do not send account numbers, order flow, or customer lists.
- 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.