Recipescurl / cronAgent-workforce board
Cursor agents
FreeEvery Cursor cloud agent on your account as one row: repo, task, running or done, how long it took, its latest line, and PR stage. No percentages. A scheduled script reads your own Cursor key. Botopticon is not affiliated with Cursor.
- Cursor agents
Board
Sample data. Your agent replaces a tile when it posts that tile.
Cursor agents
- running 14mRunning · web-app — Add saved searches — PR opened · checks running — Checks are running on the new search page.
- running 3mRunning · api — Speed up the dealer page — No PR yet — Profiling the dealer page before trimming images.
- took ~40mFailed · docs — Fix the flaky link test — Stopped before a PR
- took ~22mFinished · web-app — Footer links — Merged — +10 −2 in 1 file
- took under 1hFinished · api — Rate limit headers — Checks green — +348 −0 in 3 files
Setup
01
Make a Cursor key just for this board
In Cursor, open Dashboard, then API Keys, and create a new key named Botopticon board. Use it only here so you can revoke it any time without breaking anything else. The script only reads: it lists agents and reads the latest line of running ones. It never starts, stops, or changes an agent.
02
Create a Botopticon token
Name it Cursor agents. Copy it once. Keep both keys in environment variables on the machine that runs the script, never in a repo.
03
Optional: connect GitHub for PR stages
Add a read-only GitHub token with pull request and checks read access on the repos you care about. With it, rows move from PR opened to checks running, checks green, and merged. Without it, private repos stop at PR opened.
04
Schedule the script every 15 minutes
Run it from cron, a CI schedule, or any routine. Each run makes one Cursor call, plus one per running agent, and posts only when a row changes, with a heartbeat every 30 minutes so the tile stays fresh.
05
Rename repos if you like
Rows use the full repo name by default. Set an alias per repo if you want a friendlier name on the board.
Snippets
Replace $BOTOPTICON_TOKEN with a connection token. The URL is this app origin plus /api/ingest or /api/mcp.
#!/bin/sh
# Cursor agents. 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":"Chief","tile":"cursor-agents","type":"feed","title":"Cursor agents","props":{"items":[{"time":"running 14m","label":"Running · web-app — Add saved searches — PR opened · checks running — Checks are running on the new search page.","tone":"ok"},{"time":"running 3m","label":"Running · api — Speed up the dealer page — No PR yet — Profiling the dealer page before trimming images.","tone":"ok"},{"time":"took ~40m","label":"Failed · docs — Fix the flaky link test — Stopped before a PR","tone":"warn"},{"time":"took ~22m","label":"Finished · web-app — Footer links — Merged — +10 −2 in 1 file","tone":"ok"},{"time":"took under 1h","label":"Finished · api — Rate limit headers — Checks green — +348 −0 in 3 files","tone":"ok"}]},"needs_you":false,"ttl_seconds":3600,"subtitle":"2 running · 1 failed · 2 finished"}'
Keep the Botopticon board "Cursor agents" 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":"Chief","tile":"cursor-agents","type":"feed","title":"Cursor agents","props":{"items":[{"time":"running 14m","label":"Running · web-app — Add saved searches — PR opened · checks running — Checks are running on the new search page.","tone":"ok"},{"time":"running 3m","label":"Running · api — Speed up the dealer page — No PR yet — Profiling the dealer page before trimming images.","tone":"ok"},{"time":"took ~40m","label":"Failed · docs — Fix the flaky link test — Stopped before a PR","tone":"warn"},{"time":"took ~22m","label":"Finished · web-app — Footer links — Merged — +10 −2 in 1 file","tone":"ok"},{"time":"took under 1h","label":"Finished · api — Rate limit headers — Checks green — +348 −0 in 3 files","tone":"ok"}]},"needs_you":false,"ttl_seconds":3600,"subtitle":"2 running · 1 failed · 2 finished"}
# Once a day, for a metric no agent touches (Cursor agents, ttl_seconds 3600).
# 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":"Chief","tile":"cursor-agents","type":"feed","title":"Cursor agents","props":{"items":[{"time":"running 14m","label":"Running · web-app — Add saved searches — PR opened · checks running — Checks are running on the new search page.","tone":"ok"},{"time":"running 3m","label":"Running · api — Speed up the dealer page — No PR yet — Profiling the dealer page before trimming images.","tone":"ok"},{"time":"took ~40m","label":"Failed · docs — Fix the flaky link test — Stopped before a PR","tone":"warn"},{"time":"took ~22m","label":"Finished · web-app — Footer links — Merged — +10 −2 in 1 file","tone":"ok"},{"time":"took under 1h","label":"Finished · api — Rate limit headers — Checks green — +348 −0 in 3 files","tone":"ok"}]},"needs_you":false,"ttl_seconds":3600,"subtitle":"2 running · 1 failed · 2 finished"}'
FAQ
- Why are there no progress bars?
- Cursor does not report how far an agent is through its work, so the board does not guess. Each row shows real signals instead: running or done, the elapsed time, the agent's latest line, and how far its pull request has got. Cursor's API also has no cost per agent, so the board does not show one.
- 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.