---
title: "Comments, MailKaro Docs"
description: "Comments in MailKaro: leave threaded feedback on a design, anchored to a block. For React, Vue, Angular and plain JavaScript."
---

# Comments

Collaboration & history

# Comments

Leave threaded feedback on a design, anchored to a block.

Reviewers add comments tied to a specific block, reply in threads, and resolve them. Open the block's settings and use the Comments section. Type `@` and the start of a name to mention a teammate; in the dashboard they get an email. Comments are part of [collaboration](https://mailkaro.com/docs/collaboration). Whether a design is ready to send is a separate step, see [review and approval](https://mailkaro.com/docs/review-approval).

## In the dashboard

Comments on an email are saved with it, so everyone on the team sees the same threads. A view-only member can read them but not write. The person who wrote a comment can delete it, and so can an owner or an admin. Resolved threads fold away under "Show resolved". A design keeps at most 500 comment threads and 200 replies per thread, and each comment is up to 2,000 characters. Deleting a design deletes its comments, and every comment, resolve and delete is written to the audit log.

## In your own app

Without a server the editor keeps comments in the browser. To keep them on your own server, give it a `comments` adapter in the config. The adapter holds the signed-in person and five functions; the editor shows a comment at once and takes it back, with your error message, when a call fails.

tsx

```
<EmailEditor
 config={{
 comments: {
 key: design.id, // load again when another design opens
 user: { id: me.id, name: me.name },
 members: team, // [{ name, email }], for @ suggestions
 canWrite: me.role !== "viewer",
 canModerate: me.role === "owner" || me.role === "admin",
 load: () => api.listComments(design.id),
 create: ({ block_id, text }) => api.addComment(design.id, { block_id, text }),
 reply: (commentId, text) => api.reply(design.id, commentId, text),
 resolve: (commentId, resolved) => api.resolve(design.id, commentId, resolved),
 remove: (commentId) => api.remove(design.id, commentId)
 }
 }}
/>
```

Each function returns the saved record in snake_case: `{ id, block_id, author_id, author_name, text, mentions, resolved, resolved_by, replies, created_at }`. The dashboard API serves exactly this under `/{org}/designs/:id/comments` (it signs in with a user session and is not part of the `/v3` server-key API). Emails for mentions are sent by that dashboard API only; with your own adapter, sending any notice is up to your server.

Source: https://docs.mailkaro.com/comments
