Triage every Figma comment from one design review board

By General Input

Pull every open comment thread across your Figma projects into one board with frame previews, then reply, assign an owner, and file to Linear from the row.

Integrations

  • Figma
  • Linear

Type

App

Categories

  • Product
  • Operations

Build me a design review board where my team works through Figma feedback in one place instead of hunting comment pins across a dozen files.

On first open, the app asks me to paste a Figma team ID from my team URL, since the Figma API cannot discover teams on its own, and then uses Get Team Projects to list the projects in that team. I pick which projects the board covers and that selection is saved in the app so the board reloads with the same scope every time. For each selected project, Get Project Files lists the files, and I can toggle individual files off if I do not want them on the board.

The main view is an inbox-style board of comment threads. For every file in scope, call Get Comments and follow the pagination.next_page URLs until they run out, then group the flat comment list into threads by parent_id so replies sit under their root comment. Each row shows the thread text with replies collapsed, the author name and avatar, the file and page it came from, and how long the thread has been sitting there computed from created_at and shown as something like six days old rather than a raw timestamp. Sort oldest first by default. If the comment data carries a resolved timestamp from Figma, show it as read-only context and keep that row out of the open filter.

Each row also shows a rendered preview of the frame the pin sits on. A Figma comment carries its position in client_meta, which is either a node id with an offset or raw canvas coordinates. When there is a node id, use Get File Nodes to find the enclosing frame and Render Images of File Nodes to render it as a PNG thumbnail. Node ids come back from the API with colons while URLs use hyphens, so convert between the two forms in the right direction for each call. Render URLs expire after about thirty days, so cache them with a timestamp and re-render when stale instead of storing them forever. When a comment has no node id, fall back to the file thumbnail and label the row as pinned to the canvas.

The Figma API has no operation for resolving a comment, so the board keeps its own triage state instead. For each Figma comment id, persist a status (open, accepted, wont fix, needs info), an owner picked from the team, a category (copy, visual design, product behavior, accessibility, technical risk), and a free-text note. Store this in the app's own persistence shared across everyone who opens the board rather than per viewer, so the whole team sees the same state and it survives reloads. Be honest in the interface copy: changing status here updates our board, it does not resolve the pin inside Figma. Record who changed a status and when, and show that on the row.

From a row I can do three things. Reply posts my text back into the real Figma thread with Post Comment, passing the root comment id as the parent so it lands as a reply and not a new pin, then refreshes the thread in place. Delete removes a stray comment with Delete Comment, but Figma only lets the original author delete, so enable that button only when the comment author matches the connected Figma account and hide it everywhere else. Promote to Linear opens a small form pre-filled with the thread text, the triage category as a label, and the frame preview, uses List Teams so I can choose the destination team, and files it with Create Issue. The issue description must include a deep link back to the exact frame, built from the file key and the pin node id in hyphen form with the comment id as the fragment. Store the returned issue identifier and URL against the comment id so the row shows a link to the issue afterwards and warns me before filing the same thread twice.

Every file section has a Triage this file's feedback button that kicks off a background agent. The agent reads every open thread on that file, clusters exact duplicates and near-duplicates so the same piece of feedback said three ways collapses into one group with the rest marked as duplicates, categorizes each thread using the same five categories, suggests an owner based on the category and who usually handles that kind of work, and drafts a suggested reply in the voice of a designer answering the commenter. It writes all of that back into the app as pending suggestions attached to the comment ids. The board shows a running state while the agent works and surfaces the suggestions when it lands.

Nothing the agent produces takes effect on its own. Suggestions appear on the row as a pending banner showing the proposed category, owner, duplicate grouping, and draft reply. I can accept a suggestion, which writes it into the triage state, edit the draft before it goes anywhere, or dismiss it. A suggested reply is only posted to Figma when I hit send on it, and a suggested issue is only filed when I confirm the Linear form. Include an accept all per file for the category and owner suggestions since those are low risk, but keep replies and issue filing one at a time.

Give the board filters for status, owner, category, file, author, and age, plus a search box over comment text, and counts across the top for open threads, threads with pending suggestions, and threads older than a week. Figma rate limits the render and file endpoints hardest, so batch node renders per file and load previews lazily as rows scroll into view. Handle the empty states properly: no projects selected yet, no comments in scope, and everything triaged.

Related prompts

Explore more prompts
Catch feature flags that never got switched on in productionWeekly alert noise review board for incident.io on-callMorning triage board for your Kernel browser agent runsTrack every half finished LaunchDarkly rollout in one boardFind the customers stuck contacting support again and againTurn shipped Linear work into Intercom product announcementsVoice agent QA review board for your Hume EVI callsClose the loop between Front tickets and Linear bug fixesOpen a Heroku release war room the moment production looks wrongFind the themes Help Scout tags miss and file them in Linear