Comments & versions
Review is the everyday loop, so Renza borrows Figma's collaboration model: comments pinned to the slide, threaded, resolvable. And because feedback has to survive the next revision, comments belong to the deck's slides rather than to a frozen snapshot.
Anchored comments
Turn on comment mode and click anywhere on a slide to drop a pin. A pin opens a thread:
- Reply to continue the thread.
- Resolve when handled; reopen if it comes back.
- Unread counts surface what's new since you last looked.
A comment records the slide it belongs to and a position on that slide (a fractional x/y, so it
lands in the right place regardless of screen size). Pins render in Renza's chrome, over the
sandboxed artifact — never inside it.
Commenting needs no account and no seat — anyone with a link or grant at
commenter or above can review.
Working the review loop
The same loop is scriptable — an agent triaging feedback uses exactly these calls. To list the open
comments on a deck (GET /v1/comments):
renza comments list --deck deck_2a9f… --resolved falsecurl "https://api.renza.io/v1/comments?deck=deck_2a9f…&resolved=false" \
-H "Authorization: Bearer $RENZA_API_KEY"import { createRenzaClient } from "renza-sdk";
const renza = createRenzaClient({ apiKey: process.env.RENZA_API_KEY! });
const page = await renza.comments.list({ deck: "deck_2a9f…", resolved: "false" });To reply in a thread — a reply is a comment whose parent is the thread root
(POST /v1/comments):
renza comments reply com_5d2a… "Fixed in the next version."curl https://api.renza.io/v1/comments \
-H "Authorization: Bearer $RENZA_API_KEY" \
-X POST \
-H "Content-Type: application/json" \
-d '{
"body": "Fixed in the next version.",
"parent": "com_5d2a…"
}'import { createRenzaClient } from "renza-sdk";
const renza = createRenzaClient({ apiKey: process.env.RENZA_API_KEY! });
const comment = await renza.comments.reply("com_5d2a…", "Fixed in the next version.");To resolve the thread when it's handled (PATCH /v1/comments/{id}):
renza comments resolve com_5d2a…curl https://api.renza.io/v1/comments/com_5d2a… \
-H "Authorization: Bearer $RENZA_API_KEY" \
-X PATCH \
-H "Content-Type: application/json" \
-d '{
"resolved": true
}'import { createRenzaClient } from "renza-sdk";
const renza = createRenzaClient({ apiKey: process.env.RENZA_API_KEY! });
const comment = await renza.comments.resolve("com_5d2a…");The full surface — create with anchors, reopen, delete — is under Comments in the reference.
Comments survive versions
When you re-import a deck, you create a new artifact — a new version. Comments stay with their slide across that revision instead of being orphaned by the change, so feedback you haven't addressed yet doesn't vanish when you push an update. (Keep slide order stable between versions — inserting or reordering slides can shift where older pins land.)
Version history as a ledger
Every import to a deck is kept. Version history reads like a record, not a black box:
- Each version is listed with when it landed and who imported it.
- The deck's current version is the one viewers and present mode show.
- On Renza Pro and above, roll back to any prior version; comments re-anchor accordingly.
Rolling back points the deck's current_artifact at one of its own prior artifacts — a
PATCH /v1/decks/{id} under the hood
(renza decks versions <id> lists the candidates):
renza decks rollback deck_2a9f8c1b art_7c1b…curl https://api.renza.io/v1/decks/deck_2a9f8c1b \
-H "Authorization: Bearer $RENZA_API_KEY" \
-X PATCH \
-H "Content-Type: application/json" \
-d '{
"current_artifact": "art_7c1b…"
}'import { createRenzaClient } from "renza-sdk";
const renza = createRenzaClient({ apiKey: process.env.RENZA_API_KEY! });
const deck = await renza.decks.rollback("deck_2a9f8c1b", "art_7c1b…");This is a trust surface as much as a convenience — "who changed what, when," visible rather than implied. On Free, history covers the last 30 days (10 versions); paid plans keep full history with rollback.