Free Retro is a real-time retrospective board. Create an unlisted retro, share the link with your team, and delete it when you are done.
Live at freeretro.ziki.workers.dev.
Built with 🧡 by Cloudflare.
Free Retro is a lightweight tool for running team retrospectives.
Retrospectives are a simple way for people working together to reflect on a recent project, event, or collaboration. They create space to talk about what went well, what did not go so well, and what could be improved next time.
Team retrospectives are especially useful because they encourage participation from everyone involved, not just the loudest voices in the room. Everyone gets a chance to add input before the group discusses it together.
Every new retro gets a unique, unguessable URL that you can share with anyone. Free Retro is fun, multiplayer, hosted on Cloudflare, open source on GitHub, and free to use.
Free Retro is agent-friendly! 😎 🤝 🤖
It has some client-side customizations that make it easily discoverable and usable by AI agents using automated browser sessions. In a nutshell, it exposes some JavaScript functions that agents can call on the page to read and write retro content, without having to inspect the DOM structure or reverse-engineer the site to figure out how to interact with it. The tools follow WebMCP, an emerging proposal for exposing in-page tools to agents.
How an agent discovers it:
- On load the page logs to the console:
[freeretro] Agent tools available: document.modelContext (WebMCP) or window.freeretro.help(). Modes: human (default, visible cursor) / direct. - A screen-reader-only note in the board points there for agents reading the accessibility tree.
window.freeretro.help()returns the full API description and current tool list (the source of truth).
Calling tools, two equivalent ways:
// WebMCP (a shim provides document.modelContext until browsers ship it natively)
await document.modelContext.executeTool("create_card", {
columnId: "highlights",
content: "Shipping smaller PRs sped us up.",
});
// window.freeretro convenience wrapper
await window.freeretro.call("upvote_card", { cardId });Tools. Each takes a single arguments object; columnId is one of highlights, challenges, questions, or notes.
Read:
list_cards()— list every card with its column, author, content, upvote count, and commentslist_columns()— list columns with labels, positions, and card countslist_users()— list the people and agents connected to the retroget_board_state()— report blur state, sort mode, online count, and card count
Write:
create_card({ columnId, content })— add a card to a columnedit_card({ cardId, content })— replace a card's textdelete_card({ cardId })— delete a cardmove_card({ cardId, columnId, position? })— move a card to another column (defaults to the end)upvote_card({ cardId })— toggle your upvote on a cardcomment_card({ cardId, content })— add a comment to a cardrename_column({ columnId, label })— rename a columnset_blur({ blurred })— blur or reveal all cards for everyoneset_sort({ sortByUpvotes })— sort cards by upvotes or restore manual order
Identity, cursor, and mode:
set_name({ name })— set the display name others see for youset_cursor({ x, y })— move your shared cursor to viewport coordinatesset_interaction_mode({ mode })—"human"animates the cursor to each target;"direct"applies changes instantly
Mutation tools return JSON strings with the affected object IDs where possible. For example, create_card({ columnId, content }) returns { "card": { "id", "columnId", "content" } }, so agents can verify without immediately calling list_cards().
set_name({ name }) updates both your visible presence and the author used for future cards and comments. Existing cards keep their original author.
Interaction modes: in human mode (the default for automated browsers, detected via navigator.webdriver) the agent's shared cursor glides to each target so people watching can follow along; direct applies changes instantly. Switch with window.freeretro.setMode("human" | "direct") or the set_interaction_mode tool.
On WebMCP and discoverability: WebMCP is an experimental proposal in the W3C Web Machine Learning community group, not an official web standard, and no browser implements document.modelContext natively yet. Free Retro ships a small shim so the WebMCP surface works today, but none of this depends on WebMCP: the same tools are reachable through the plain window.freeretro global, and the console message plus the accessibility-tree note make them discoverable by any automated session using ordinary DOM and JavaScript. Agents can interact regardless of WebMCP's readiness or official status; native WebMCP support is a forward-looking bonus for harnesses that adopt it.
Free Retro uses the imperative WebMCP surface, not the form-based declarative API: most retro actions (querying state, dragging cards, moving a shared cursor) aren't HTML form submissions, and the imperative shim works in any automated browser today rather than only in Chrome.
To put an agent to work on a retro, you'll need:
- an agent harness like OpenCode, Claude Code, or Codex
- a Free Retro URL
- an agent configured to drive a browser in the cloud or drive a browser locally over MCP
Any automated browser works. Browser Run is a convenient hosted option: headless Chrome you drive over CDP from a Worker or an agent harness, so an agent can open a retro and act on it without managing local browser infrastructure.
Give the agent the URL, tell it what you want to add, and let it go to work!
Agents can also drive a public retro with Cloudflare Browser Run or any Chrome DevTools Protocol endpoint. Keep provider-specific credentials in your environment and pass only the retro URL into the browser session.
const browserUrl = process.env.BROWSER_RUN_URL;
const retroUrl = process.env.FREE_RETRO_URL;
// Connect your CDP client to browserUrl, open retroUrl, then prefer the in-page API:
await page.evaluate(async () => {
await window.freeretro.call("set_interaction_mode", { mode: "direct" });
await window.freeretro.call("create_card", {
columnId: "highlights",
content: "Agent-created card via Browser Run",
});
});Use your agent or browser automation tool's CDP client of choice. Do not put account IDs, API tokens, or personal Browser Run URLs in repo docs or source code.
See AGENTS.md for project-specific instructions for coding agents.