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 new activity during the current viewing session.
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.
- Roll back to any prior version on Free or Renza Pro; comment pins remain attached to their recorded slide index.
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 makes the current version reversible: the history shows who published each version and when, and restoring an earlier artifact does not delete the versions that came after it. Version history and rollback are currently available on both Free and Renza Pro.