# Comments

###### Comments let reviewers leave feedback right on your Snapshot: they click a spot on the page, a numbered pin marks it, and the thread lands in your inbox in the desktop app, so a design review runs on one link instead of screenshots and chat threads.

The common case is a design review. You publish a prototype or a landing page as a [Snapshot](/docs/public-urls/snapshots), protect it with a secret link or a password, and send that one link. Reviewers open it, click where something is off, and write what they see. You read the threads in the app, fix the work, republish, and reply. Their pins carry over to the new version.

> [!NOTE/Availability]
> Comments are available on paid subscription plans, since they need [Access control](/docs/public-urls/access-control) on the Public URL. Reviewers need no plan, only a free LocalCan account. See your [dashboard](https://www.localcan.com/dashboard) for plan details.

#### Turning comments on

Click a Public URL in the desktop app, open **Snapshot**, then **Comments**. The **Status** picker has three settings:

* **Collecting**: reviewers can start threads and reply.
* **Paused**: existing threads stay readable and replies still work, but nobody can start a new thread. Use it to close a review round without losing the conversation.
* **Off**: the review tools disappear from the page. Existing comments are kept and come back when you switch to Collecting again.

Comments need a protected Public URL. If the URL is public, the row reads **Not collecting** and offers **Enable Secret Link Access**, which protects the URL with a secret link and starts collecting in one step. A password works the same way. This is what makes one link enough: whoever can open the Snapshot can comment, and nobody else can see the feedback.

Comments live on the Snapshot. While your live app is serving the URL, the row also reads **Not collecting**, and collecting picks up again as soon as the Snapshot serves, for example after you pause the URL or your machine goes to sleep.

#### Sharing the link

The **Copy** button in the header copies the link visitors use: the secret link, or the address when the URL is password-protected (its menu also offers **Copy Address and Password**). There is no separate review link.

**Open** opens the Snapshot signed in as you, so you can moderate on the page. That link is yours alone and is never offered for copying.

#### What reviewers see

Past the password page or the secret link, the Snapshot opens in a review view: the page fills the window, a small toolbar sits at the bottom, and a **Comments** panel opens on the right when they want the list.

* **Reading needs no account.** Pins and threads are visible to anyone who can open the Snapshot.
* **Commenting needs a free LocalCan account.** The first time a reviewer wants to post, **Sign in to comment** takes them to localcan.com to sign in with an email code, Google, or GitHub, asks them to confirm that their name and photo will show on this page, and returns them to the same spot. A comment typed before signing in is kept. The sign-in lasts 7 days for that Snapshot and never happens on your domain.
* **Leaving a comment**: pick the **Comment** tool (or press C), click anywhere on the page, and write. A numbered pin marks the spot. Enter sends, Shift+Enter adds a line.
* **Threads**: replies go under the pin's comment. Everyone can edit their own comment for 15 minutes and delete it at any time. Authors can drag their own pin to a better spot, and team members can move any pin.
* **The panel** lists the threads on the current page by default, with search, a switch for resolved threads, and unread marks. **Copy link** on a thread gives a permalink that opens the page at that pin.

Every comment shows the reviewer's account name and photo, never their email address.

#### Reviewing in the app

The **Comments** view in the desktop app is your inbox. Threads are listed newest first, grouped by page, with the open count, an unread bar on threads with new activity, and filters for status, author, version, and order. Right-click a thread to mark it read.

Click a thread to open it on the Snapshot as the owner. On the page you can reply, **Resolve** a thread once it is handled, reopen it, and delete comments. Resolving is reserved for members of your team, and the reviewer who started the thread gets a note by email. Resolved threads leave the open list and their pins fade.

Read state follows your account, so a thread you opened on your laptop is no longer unread on your desktop, and replying counts as having read the thread.

The endpoint list shows a comment pill on every URL with comments on, with the open count, tinted while something is unread.

#### Versions

Every publish creates a new version of the Snapshot, and every comment records the version it was left on. When you fix something and click **Update**, open threads carry over to the new version and their pins re-attach to the same elements, even when the text there changed (the pin gets a ring and the thread shows the old text). When the element itself is gone, the pin sits on the nearest surviving container or at the spot where it used to be, drawn hollow, and a team member can drag it to the right place. Reviewers with the old page open see **Site updated** with a **Reload** button, and new comments always attach to the current version.

#### Email notifications

Email is how you hear about new feedback without keeping the app open:

* **Digest**: one email per Public URL summarising new reviewer threads, sent to your email at most every 15 minutes. A burst of comments arrives as one email. Turn it on or off per URL with **Email digests of new comments** at the bottom of the URL's Comments view in the app. The unsubscribe link at the bottom of a digest turns it off for that URL too, and the switch in the app turns it back on.
* **Replies and resolutions**: everyone in a thread gets an email when someone else replies, and the reviewer who started a thread hears when it is resolved. Every email carries an unsubscribe link that only affects mail about that team's Snapshots.

Anyone in a thread, reviewers and team members alike, can also switch those off per team in the dashboard under [Settings → Notifications](https://www.localcan.com/dashboard/settings/notifications).

#### From the command line

The [`localcan` CLI](/docs/cli/reference) runs a review round without the desktop app, against a running daemon:

```bash
# Protect the URL, then turn comments on
localcan access password my-app-12.localcan.dev
localcan snapshot comments my-app-12.localcan.dev on

# Read the open threads, one in full, then answer
localcan comments ls my-app-12.localcan.dev
localcan comments show my-app-12.localcan.dev '#3'
localcan comments reply my-app-12.localcan.dev '#3' "Fixed in the new version"
localcan comments resolve my-app-12.localcan.dev '#3'
```

A thread is referenced by the number `ls` shows, or by its comment id. Replies are posted under your account name.

#### From an AI agent

A coding agent connected through LocalCan's [MCP server](/docs/ai-agents/mcp) can run the whole loop: `list_comments` to read the open threads with the exact element and viewport each pin points at, `update_snapshot` after it has made the changes, then `reply_comment` and `resolve_comment` per thread. It cannot start threads, and it never marks threads read, so your inbox stays yours. The tools that change things are off by default, so you turn them on once under Settings.

#### Requirements and limits

* The Public URL must have a Snapshot and Access control set to a secret link or a password. A public URL collects nothing.
* Reviewers comment with a LocalCan account, and their name and photo appear on the page.
* A comment can be up to 2,000 characters.
* Removing the Snapshot deletes its comments. LocalCan tells you how many before it does.

