<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: MatttDamon</title>
    <description>The latest articles on DEV Community by MatttDamon (@matttdamon).</description>
    <link>https://dev.to/matttdamon</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3967559%2F0e59806b-6591-4192-afc1-5af4580f516d.png</url>
      <title>DEV Community: MatttDamon</title>
      <link>https://dev.to/matttdamon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matttdamon"/>
    <language>en</language>
    <item>
      <title>You skipped Figma and just built it. Your team still has notes.</title>
      <dc:creator>MatttDamon</dc:creator>
      <pubDate>Wed, 24 Jun 2026 23:47:34 +0000</pubDate>
      <link>https://dev.to/matttdamon/you-skipped-figma-and-just-built-it-your-team-still-has-notes-nb8</link>
      <guid>https://dev.to/matttdamon/you-skipped-figma-and-just-built-it-your-team-still-has-notes-nb8</guid>
      <description>&lt;p&gt;More teams are starting from a prompt now, not a canvas. You describe the thing, an agent builds it, you ship it. It's faster. But the place your team used to leave feedback, Figma comments, was attached to the canvas you just skipped. So the notes have nowhere to land.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's actually happening to Figma
&lt;/h2&gt;

&lt;p&gt;Figma went public in the summer of 2025. A year on, the stock sits &lt;a href="https://finance.yahoo.com/quote/FIG/" rel="noopener noreferrer"&gt;well below where it opened&lt;/a&gt; and a long way off its first-month highs (mid-2026). Revenue is still growing. This isn't a "Figma is dying" post.&lt;/p&gt;

&lt;p&gt;The slide tracks one specific worry: tools that let you generate a working UI without opening a canvas at all. Anthropic shipped Claude Design in April 2026. Cursor has design features. The bet the market is making is that fewer projects will start in a design file. That's the same shift you're living if you build straight from a prompt.&lt;/p&gt;

&lt;p&gt;Here's the part nobody priced in. The canvas was never just where the design lived. It was where the &lt;em&gt;conversation&lt;/em&gt; lived. Skip the canvas and you don't just lose a mockup step, you lose the room everyone gave feedback in.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Figma comments weren't about pixels. They were the one place your whole team could point at something and say "this is off."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Skipping the canvas skips the comments too
&lt;/h2&gt;

&lt;p&gt;Think about what a Figma comment actually did. A teammate, a client, a PM with an opinion on the copy, none of them opened an IDE. They opened a file, clicked the thing, and typed. The builder saw exactly which element, in which frame, with the thread right there.&lt;/p&gt;

&lt;p&gt;When the work moves straight to a deployed app, that whole loop has no home. The reviewer is looking at the live site. You want their input on the live site. But the tools they know are Figma (no connection to what shipped) and Slack (every note becomes a screenshot with a red circle).&lt;/p&gt;

&lt;p&gt;So they send the screenshot. You decode it. You write a prompt to your agent. The agent asks which element, which page, which viewport, because the screenshot doesn't say. You spend ten minutes rebuilding context that should've been captured the moment they clicked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the notes go now, and why each is rough
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Comment back in Figma anyway.&lt;/strong&gt; Works right up until the built app stops matching the file, which is fast. After that your reviewers are commenting on a canvas that no longer describes what's live.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshots in Slack.&lt;/strong&gt; The honest default. Zero setup, everyone gets it. The cost is all in translation, and it compounds with every reviewer and every iteration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Preview deploy toolbars.&lt;/strong&gt; Vercel and Netlify preview comments are genuinely good for pre-merge review. The catch: reviewers need an account on your host, the comments live on the preview not production, and the output is a note for a human to read, not a work item your agent can pick up.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the missing layer needs to do
&lt;/h2&gt;

&lt;p&gt;Whatever replaces the Figma comment for a built app has to do the things the canvas did well, in the new place:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What the canvas gave you&lt;/th&gt;
&lt;th&gt;What a built-app loop needs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Anyone could comment, no install&lt;/td&gt;
&lt;td&gt;Reviewers click a link or use a shared extension. Free, no dev toolchain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A comment pinned to a real element&lt;/td&gt;
&lt;td&gt;Anchored by CSS selector + page URL, survives reloads and mobile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Builder saw frame, state, intent&lt;/td&gt;
&lt;td&gt;Builder or agent sees selector, DOM snippet, screenshot, viewport, thread&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thread stayed on the thing&lt;/td&gt;
&lt;td&gt;Thread stays on the pin, not scattered across Slack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resolved when the change shipped&lt;/td&gt;
&lt;td&gt;Resolved in a real commit + PR, re-checked on the deployed site&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That last row is the one the canvas never quite did. "Was this actually fixed?" was always a follow-up conversation. On a live product you can close that loop automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Pincushion fills the gap
&lt;/h2&gt;

&lt;p&gt;The review happens on the deployed product, and the people reviewing aren't opening an editor.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reviewers install nothing real.&lt;/strong&gt; An extension you share once, or a link. They click anything on the live site and type. Reviewers are free and unlimited.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The pin captures what a screenshot can't.&lt;/strong&gt; Selector, DOM snippet, screenshot, viewport, and the full thread, bundled as an agent-ready work packet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your agent reads pins over MCP.&lt;/strong&gt; One call in Cursor, Claude Code, Codex, or Windsurf pulls the whole context. It doesn't have to ask what was meant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The loop closes.&lt;/strong&gt; When the pin's resolved it carries the branch, commit, and PR. The deploy hook links the production URL, and the fix gets re-checked on the live site.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Same loop you had in Figma, point, discuss, fix, close, just on the thing that actually ships.&lt;/p&gt;

&lt;h2&gt;
  
  
  Figma isn't the villain here
&lt;/h2&gt;

&lt;p&gt;This isn't an anti-Figma piece. For early exploration and handing design decisions to engineers, the canvas still earns its place. The point is narrower. The day your source of truth becomes the deployed app, the feedback loop has to move there too. Right now, for most teams skipping the canvas, it just falls into Slack and gets lost.&lt;/p&gt;

&lt;p&gt;That's the layer we're trying to be. Not the canvas. The room where your team points at the live app and says "this is off," and the note turns into a fix.&lt;/p&gt;

&lt;p&gt;Pincushion is free to start: &lt;a href="https://pincushion.io/guides/design-feedback-without-figma" rel="noopener noreferrer"&gt;pincushion.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>design</category>
      <category>ux</category>
    </item>
    <item>
      <title>Collect client feedback on a website without endless revision rounds</title>
      <dc:creator>MatttDamon</dc:creator>
      <pubDate>Wed, 24 Jun 2026 23:18:14 +0000</pubDate>
      <link>https://dev.to/matttdamon/collect-client-feedback-on-a-website-without-endless-revision-rounds-jc</link>
      <guid>https://dev.to/matttdamon/collect-client-feedback-on-a-website-without-endless-revision-rounds-jc</guid>
      <description>&lt;p&gt;Most revision rounds don't spiral because the client is picky. They spiral because the feedback lost context on the way to you. Here's why that happens, what agencies try, and how to make each note clear enough to fix the first time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a round actually spirals
&lt;/h2&gt;

&lt;p&gt;A revision round is supposed to be one loop: client looks at the site, says what's off, you fix it, they look again. The trouble is that most of the feedback you get can't be acted on as-is.&lt;/p&gt;

&lt;p&gt;"The hero feels cramped on mobile." Which phone. Which section. Cramped how. You're looking at the desktop build, they're looking at their phone, and neither of you is looking at the same thing. So you guess, you change something, you redeploy, you wait. They reply "no, the other one." That's a second round, and you still don't know what they meant.&lt;/p&gt;

&lt;p&gt;Stack three or four of those and a one-day fix becomes a two-week thread. The client thinks you're slow. You think they're vague. Both of you are just paying for context that fell out of the message.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The fix isn't fewer revisions. It's making each note unambiguous the first time, so a round is one loop instead of three.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What a clear piece of feedback needs to carry
&lt;/h2&gt;

&lt;p&gt;Every note that ends a round fast has the same things attached. Every note that drags one out is missing one of them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The exact element. Not "the button near the top", the actual thing they clicked on.&lt;/li&gt;
&lt;li&gt;The page and the screen size. A note about the live URL at 390px wide is a different note than the same words at desktop.&lt;/li&gt;
&lt;li&gt;The thread in one place. So the back-and-forth stays on the spot being discussed, not forked across email, Slack, and a Friday call.&lt;/li&gt;
&lt;li&gt;Enough for you to just do it. If you build with an AI agent, that means the note should be something the agent can pick up, not a paragraph you have to translate first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that is exotic. It's just the stuff that email and screenshots quietly drop.&lt;/p&gt;

&lt;h2&gt;
  
  
  What agencies reach for, and where each falls short
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Email and annotated screenshots
&lt;/h3&gt;

&lt;p&gt;The honest default. Zero setup, every client already knows how. The cost is all in translation. Each screenshot is a small decode job (which page, which state, which element), the thread forks the moment two people reply, and nothing is anchored to the live page. Fine for a one-pager you touch once. A real drag once you're iterating.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. A shared change list in Google Docs or a sheet
&lt;/h3&gt;

&lt;p&gt;Better than scattered email, and clients can fill it in on their own time. But it's disconnected from the actual page. The client is describing in a sentence the thing they could just point at, and you're reading that sentence next to a screenshot trying to line them up. Organized, still ambiguous.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Proofing tools (Markup.io, Filestage, Ziflow)
&lt;/h3&gt;

&lt;p&gt;These are genuinely good at what they're built for: structured proofing and sign-off on deliverables, with approval steps and version history. If your work is mostly static comps, PDFs, or marketing assets, they earn their place. The mismatch shows up on an interactive deployed app, where a comment on a flat capture can't follow a responsive layout or a changing state, and the output is a proof to approve, not work wired into your build.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Loom and screen recordings
&lt;/h3&gt;

&lt;p&gt;Great for a client explaining a flow or a feeling that's hard to type. The catch is you can't act on a four-minute video. You watch it, you pause it, you transcribe it into a task list yourself. The context is rich and completely unstructured, which is the opposite of what shortens a round.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Feedback widgets (BugHerd, Marker.io, Userback)
&lt;/h3&gt;

&lt;p&gt;Solid at turning a client note into a tracked ticket on a board, with the page and browser data attached. If your workflow ends at a clean ticket queue, they do that job well. The gap, if you build with a coding agent: the ticket is still written for a human to read and then re-enter as work.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Just get on a call
&lt;/h3&gt;

&lt;p&gt;Fastest way to align in the moment, and sometimes the right move. The problem is the record. Verbal notes evaporate, you're scribbling while the client talks, and next week you're guessing what "make it pop" meant again. Good for the conversation, bad as the source of truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes when feedback lives on the live site
&lt;/h2&gt;

&lt;p&gt;Put the feedback step on the deployed app instead of a screenshot, and the spiral mostly goes away. The client points at the real thing. The note carries where it was and what screen it was on. You stop guessing.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Why a round spirals&lt;/th&gt;
&lt;th&gt;What removes that cause&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"Which element did they mean?"&lt;/td&gt;
&lt;td&gt;The note is anchored to a CSS selector and page URL, not pixels on a screenshot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Was this desktop or mobile?"&lt;/td&gt;
&lt;td&gt;Viewport is captured with the note, so the context is unambiguous&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Where's the rest of that thread?"&lt;/td&gt;
&lt;td&gt;Discussion stays on the pin, not forked across email and chat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"The client won't install our tools"&lt;/td&gt;
&lt;td&gt;Reviewers click a shared link and comment. Free, no account, nothing to set up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"I still have to translate it into work"&lt;/td&gt;
&lt;td&gt;The note arrives as a work packet your coding agent reads directly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Did we actually fix it?"&lt;/td&gt;
&lt;td&gt;The pin closes against a specific commit and deploy, so the client sees what shipped&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How Pincushion fits the agency loop
&lt;/h2&gt;

&lt;p&gt;Pincushion is the feedback loop on the deployed app, built for people who ship with an AI coding agent. The part that matters for client work is that the reviewer does nothing technical and you get something you can act on.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The client installs nothing.&lt;/strong&gt; You share a link or a browser extension once. They click any element on the live site and type what's off. Reviewers are free and unlimited, so adding the client (or three of them) costs nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The pin carries the context a screenshot drops.&lt;/strong&gt; CSS selector, DOM snippet, screenshot, viewport, page URL, and the full thread, captured the moment they drop the pin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your agent reads pins directly.&lt;/strong&gt; One call to &lt;code&gt;implement_approved_pins&lt;/code&gt; in Cursor, Claude Code, Codex, or Windsurf pulls the note plus its context. The agent has the element and the thread, so it isn't asking you what was meant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The round closes itself.&lt;/strong&gt; When the fix lands, the pin attaches the branch, commit, and PR, and the deploy hook links the production URL. The client sees "fixed and live" on the spot they pinned, instead of a "can you check this again?" email.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;The client points at the live site. Your agent gets a work packet. The round is one loop, not a thread that won't die.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  When this isn't the tool you need
&lt;/h2&gt;

&lt;p&gt;If your client work is mostly static deliverables, brand decks, or PDFs going through formal sign-off, a proofing tool will serve you better than this. And if you only do the occasional one-page site and a couple of email screenshots get you there, that's a fine workflow.. don't add a tool you don't need.&lt;/p&gt;

&lt;p&gt;The case for putting feedback on the live site is narrower than that. It's for when you're iterating on a deployed product, the client keeps reacting to the real thing, and the revision rounds are eating your margin. That's the spot where losing context on every note actually costs you.&lt;/p&gt;




&lt;p&gt;I made &lt;a href="https://pincushion.io" rel="noopener noreferrer"&gt;Pincushion&lt;/a&gt; — it lets your team drop pins on the live app, and your AI coding agent (Cursor, Claude Code, Codex) picks them up as implementation-ready work packets. Free for reviewers. &lt;a href="https://pincushion.io/#setup" rel="noopener noreferrer"&gt;Setup takes 2 minutes&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>design</category>
      <category>ux</category>
    </item>
    <item>
      <title>Figma comments don't work on your deployed app — here's what does</title>
      <dc:creator>MatttDamon</dc:creator>
      <pubDate>Tue, 09 Jun 2026 20:40:34 +0000</pubDate>
      <link>https://dev.to/matttdamon/figma-comments-dont-work-on-your-deployed-app-heres-what-does-30kf</link>
      <guid>https://dev.to/matttdamon/figma-comments-dont-work-on-your-deployed-app-heres-what-does-30kf</guid>
      <description>&lt;p&gt;Figma's comment system is built around a canvas. When your team ships the real product and iterates on the deployed thing, that canvas is gone — and so is the feedback loop you built around it. This is the gap most design-engineer teams hit silently.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Figma comments actually depend on
&lt;/h2&gt;

&lt;p&gt;Figma comments work because every comment is pinned to coordinates on a static frame. The frame doesn't change unless you change it. The comment knows where it lives because the canvas is frozen in time.&lt;/p&gt;

&lt;p&gt;Your deployed app is none of those things. It has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dynamic state — the button your reviewer pinned might not even be visible in the same state next session&lt;/li&gt;
&lt;li&gt;Responsive layouts — a comment placed at desktop coordinates is meaningless on mobile&lt;/li&gt;
&lt;li&gt;Moving DOM — element positions change as content loads, CSS shifts, or you ship a new version&lt;/li&gt;
&lt;li&gt;No frame — the live site has no "current version" a comment can attach to&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't a gap Figma will fill. It's a different problem in a different place.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Figma comments are anchored to a canvas. Your deployed app doesn't have one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The moment the gap appears
&lt;/h2&gt;

&lt;p&gt;For teams who design by building — prompting an agent, shipping something, then iterating on the deployed product — this gap shows up the first time someone who isn't the builder needs to give feedback. A client. A teammate doing crit. A PM with an opinion on the copy.&lt;/p&gt;

&lt;p&gt;They're looking at the live site. You want their input on the live site. But the only tools they know how to use are Figma (which has no connection to what's live) and Slack (which turns every note into a screenshot with a red circle).&lt;/p&gt;

&lt;p&gt;So they send the screenshot. You decode it. You write a prompt to your agent. The agent asks a clarifying question because the screenshot doesn't say which element, which page, which viewport, or which interaction state. You spend ten minutes reconstructing context that should have been captured automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams reach for, and where each falls short
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Keep commenting in Figma anyway
&lt;/h3&gt;

&lt;p&gt;If the deployed app closely mirrors the Figma file, this can work for a while. But "closely mirrors" rarely stays true. The moment the live product diverges from the mockup — and it will — Figma comments are talking about something that no longer exists. Reviewers end up commenting on a stale canvas while the real problems are on the live site.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Screenshots annotated in Figma or Loom
&lt;/h3&gt;

&lt;p&gt;Some teams screenshot the deployed app, paste it into Figma, and comment there. Better than raw screenshots in Slack, but it inherits most of the same problems: annotations are pixel-coordinates, not element anchors; context (viewport, page state, DOM) is lost; there's no thread attached to the thing you're actually shipping.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Vercel / Netlify preview comments
&lt;/h3&gt;

&lt;p&gt;Preview deploy toolbars are genuinely useful for pre-merge review. They let reviewers comment on a build before it goes to production. The limits: reviewers need accounts on your hosting platform, the comments live on the preview (not the production site), and the output is a comment for a human to read — not a work item a coding agent can pick up and implement.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Bug-reporting tools (BugHerd, Marker.io, Userback)
&lt;/h3&gt;

&lt;p&gt;These tools were built for QA and client sign-off: capture a visual bug, turn it into a ticket, track it on a board. They're solid at that job. The mismatch: design crit isn't bug reporting. You're not filing a defect, you're running a review — and the output going into a Kanban column is the wrong destination if you build with a coding agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Just use Slack and deal with it
&lt;/h3&gt;

&lt;p&gt;The honest default. Zero setup, universally understood. The cost is entirely in translation time — every screenshot is a manual reconstruction job — and it compounds with each reviewer and each iteration cycle. A workable tax on small teams doing occasional reviews; a real drag on teams shipping fast and iterating in short loops.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the alternative actually needs to do
&lt;/h2&gt;

&lt;p&gt;Whatever replaces Figma comments for the deployed app needs to solve the things Figma comments solved well — while working in the new context:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What Figma comments did well&lt;/th&gt;
&lt;th&gt;What the deployed-app equivalent needs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Anchored to a specific element (not pixels)&lt;/td&gt;
&lt;td&gt;Anchor by CSS selector + page URL — survives reloads and responsive layouts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero setup for reviewers — anyone in the Figma file could comment&lt;/td&gt;
&lt;td&gt;Zero setup for reviewers — clients and PMs won't install your dev toolchain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Threaded, attached to the thing being discussed&lt;/td&gt;
&lt;td&gt;Thread stays on the pin, not scattered across a Slack channel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Builder sees context: what frame, what state, what viewport&lt;/td&gt;
&lt;td&gt;Builder (or agent) sees: selector, DOM snippet, screenshot, viewport, page URL, project context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comments resolved when the change ships&lt;/td&gt;
&lt;td&gt;Pin resolved in a specific commit and PR, optionally verified on the deployed site&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The fifth point is the one Figma never quite delivered — "was this actually fixed?" is a follow-up conversation. On a live product, you can close that loop automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Pincushion fills this gap
&lt;/h2&gt;

&lt;p&gt;Pincushion is built for exactly this moment — when the feedback session happens on the deployed product, not a canvas, and the people reviewing aren't opening an IDE.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A reviewer installs nothing.&lt;/strong&gt; They use a browser extension you share once, or they click a link. They click anything on your deployed site and type a note. Reviewers are free and unlimited.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The pin captures what Figma never could.&lt;/strong&gt; CSS selector, DOM snippet, screenshot, viewport dimensions, and the full thread — bundled as an agent-ready work packet from the start.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your coding agent reads pins via MCP.&lt;/strong&gt; One call to &lt;code&gt;implement_approved_pins&lt;/code&gt; in Cursor, Claude Code, Codex, or Windsurf pulls the full context. The agent doesn't need to ask what was meant — it has the element, the page state, and the thread.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The loop closes.&lt;/strong&gt; When your agent resolves the pin, it attaches the branch, commit, and PR. The deploy hook links the production URL. Pincushion AI can re-check the fix and write the verdict back to the pin — so reviewers see "Fixed in PR #47, deployed to production, verified."&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;The workflow is the same one you had in Figma — pin, discuss, fix, close — but on the thing that actually ships.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Figma is still the right tool — for Figma work
&lt;/h2&gt;

&lt;p&gt;This isn't an argument against Figma. For early exploration, component design, and sharing design decisions with engineers, Figma comments do their job well. The point is narrower: once you're iterating on the deployed product, the feedback loop needs to live there too — not in a file that's a step removed from the real thing.&lt;/p&gt;

&lt;p&gt;Some teams run both in parallel: Figma for early-stage work, Pincushion for crit sessions on the live app. That's a reasonable split. The goal is just that no feedback lives in a screenshot in Slack.&lt;/p&gt;




&lt;p&gt;I made &lt;a href="https://pincushion.io" rel="noopener noreferrer"&gt;Pincushion&lt;/a&gt; — it lets your team drop pins on the live app, and your AI coding agent (Cursor, Claude Code, Codex) picks them up as implementation-ready work packets. Free for reviewers. &lt;a href="https://pincushion.io/#setup" rel="noopener noreferrer"&gt;Setup takes 2 minutes&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>design</category>
      <category>ux</category>
    </item>
    <item>
      <title>How I built an MCP server that turns visual feedback into code fixes</title>
      <dc:creator>MatttDamon</dc:creator>
      <pubDate>Thu, 04 Jun 2026 05:56:38 +0000</pubDate>
      <link>https://dev.to/matttdamon/how-i-built-an-mcp-server-that-turns-visual-feedback-into-code-fixes-31nf</link>
      <guid>https://dev.to/matttdamon/how-i-built-an-mcp-server-that-turns-visual-feedback-into-code-fixes-31nf</guid>
      <description>&lt;p&gt;Every web project has the same weird gap.&lt;/p&gt;

&lt;p&gt;A stakeholder sees something on a page and knows exactly what feels wrong:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"This headline is too vague."&lt;/li&gt;
&lt;li&gt;"Move this CTA closer to the pricing table."&lt;/li&gt;
&lt;li&gt;"This form label reads like an internal field name."&lt;/li&gt;
&lt;li&gt;"This is the wrong button."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But by the time that feedback reaches the developer, it has usually been turned into a screenshot, a Slack thread, a Loom, a Jira ticket, or a sentence like "can we tweak this?"&lt;/p&gt;

&lt;p&gt;That handoff loses the most important part: the exact element on the exact page in the exact state where the feedback happened.&lt;/p&gt;

&lt;p&gt;I built Pincushion to test a different shape:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A reviewer drops a visual pin on a live or staging page.&lt;/li&gt;
&lt;li&gt;The pin captures implementation context: URL, selector, XPath, viewport, browser, screenshot, and the comment thread.&lt;/li&gt;
&lt;li&gt;An AI coding agent reads that pin through MCP.&lt;/li&gt;
&lt;li&gt;The agent implements the fix in the repo.&lt;/li&gt;
&lt;li&gt;The commit and pin resolution close the loop.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The interesting part is not "visual feedback tool." Those already exist. The interesting part is treating a pin as an agent work packet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why screenshots are a bad substrate for agents
&lt;/h2&gt;

&lt;p&gt;Screenshots are useful for humans. They are lossy for coding agents.&lt;/p&gt;

&lt;p&gt;If I send an agent a screenshot and say "change this," the model has to infer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which route or page this is.&lt;/li&gt;
&lt;li&gt;Which DOM element is being referenced.&lt;/li&gt;
&lt;li&gt;Which source file owns that element.&lt;/li&gt;
&lt;li&gt;Whether the issue is copy, layout, state, accessibility, or data.&lt;/li&gt;
&lt;li&gt;What the stakeholder meant by the words around the screenshot.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes it gets there. Sometimes it works on the wrong component.&lt;/p&gt;

&lt;p&gt;The fix was not to make the model better at reading screenshots. The fix was to stop using screenshots as the handoff format.&lt;/p&gt;

&lt;p&gt;When a pin is dropped, Pincushion captures structured context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pageUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/pricing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"selector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main section.pricing button.primary"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"xpath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/html/body/main/section[3]/button"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"viewport"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"width"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1440&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;900&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"browser"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Chrome"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"thread"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sarah"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"This CTA should explain the trial. Try 'Start free project'."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a much better input for an agent than a rectangle of pixels.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why MCP was the right layer
&lt;/h2&gt;

&lt;p&gt;The first version of this idea could have been a dashboard, webhook, or browser automation flow. I avoided that.&lt;/p&gt;

&lt;p&gt;AI coding agents already have the tools that matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;read files&lt;/li&gt;
&lt;li&gt;edit files&lt;/li&gt;
&lt;li&gt;run tests&lt;/li&gt;
&lt;li&gt;inspect git state&lt;/li&gt;
&lt;li&gt;make commits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The missing tool is not "drive a browser." The missing tool is "read the user's implementation intent."&lt;/p&gt;

&lt;p&gt;MCP is a clean place to expose that intent. The Pincushion MCP server gives an agent tools like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;get_actionable_pins
implement_approved_pins
claim_pin
add_agent_reply
fix_and_resolve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent does not need to scrape a dashboard. It calls a tool, receives the work packet, and operates in the repo where it already has context.&lt;/p&gt;

&lt;p&gt;The command I use most is effectively:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/implement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Behind that, the MCP server returns approved pins grouped by page, with selectors, thread context, and traceability data. The agent claims the pin, writes the change, and resolves it when the fix is done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design decision: thread context matters
&lt;/h2&gt;

&lt;p&gt;At first I thought the pin body would be enough.&lt;/p&gt;

&lt;p&gt;It was not.&lt;/p&gt;

&lt;p&gt;The difference between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Make this less vague.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Make this less vague.

Sarah: The user already chose a plan by this point.
Josh: Good point. The CTA should confirm the next step, not resell the plan.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is huge.&lt;/p&gt;

&lt;p&gt;Agents write better diffs when they have the "why," not just the "what." That is why &lt;code&gt;implement_approved_pins&lt;/code&gt; returns the surrounding thread, not only the latest comment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design decision: fewer tools are better
&lt;/h2&gt;

&lt;p&gt;Early MCP surfaces tend to expose every backend verb:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;get annotations&lt;/li&gt;
&lt;li&gt;list annotations&lt;/li&gt;
&lt;li&gt;update annotation&lt;/li&gt;
&lt;li&gt;approve annotation&lt;/li&gt;
&lt;li&gt;claim annotation&lt;/li&gt;
&lt;li&gt;resolve annotation&lt;/li&gt;
&lt;li&gt;search annotations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That makes sense to a human API designer. It is not always best for an agent.&lt;/p&gt;

&lt;p&gt;For implementation work, the agent usually needs a smaller set of intent-shaped tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What should I work on?"&lt;/li&gt;
&lt;li&gt;"Give me the implementation packet."&lt;/li&gt;
&lt;li&gt;"Mark that I am working on this."&lt;/li&gt;
&lt;li&gt;"Resolve it with a trace."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more generic the tool surface, the more likely the agent is to choose the wrong tool or do extra work.&lt;/p&gt;

&lt;p&gt;The lesson: design MCP tools around agent decisions, not database tables.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design decision: no stakeholder diff approval
&lt;/h2&gt;

&lt;p&gt;I originally had a preview/approval flow.&lt;/p&gt;

&lt;p&gt;The idea was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent proposes a diff.&lt;/li&gt;
&lt;li&gt;Stakeholder approves the diff.&lt;/li&gt;
&lt;li&gt;Agent lands the change.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It sounded responsible. It was wrong.&lt;/p&gt;

&lt;p&gt;Most stakeholders do not read diffs. The preview step created a fake sense of safety and added another wait state.&lt;/p&gt;

&lt;p&gt;The human reviewer who matters is the developer who merges the commit or PR. For Pincushion, the right loop is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stakeholder expresses intent visually.&lt;/li&gt;
&lt;li&gt;Agent turns intent into a code change.&lt;/li&gt;
&lt;li&gt;Developer reviews the code.&lt;/li&gt;
&lt;li&gt;Pin resolution records what shipped.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No fake approval ceremony in the middle.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I am testing now
&lt;/h2&gt;

&lt;p&gt;Pincushion is soft launched. The Chrome extension is live, the MCP server is on npm, and I am looking for early testers.&lt;/p&gt;

&lt;p&gt;The test I care about is not "does the landing page convert?"&lt;/p&gt;

&lt;p&gt;The test is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Can a developer install it without help?&lt;/li&gt;
&lt;li&gt;Can a stakeholder drop a useful pin?&lt;/li&gt;
&lt;li&gt;Can Cursor, Claude Code, Codex, VS Code Copilot, or Windsurf read the pin?&lt;/li&gt;
&lt;li&gt;Can the agent implement a real change with less clarification than a screenshot or Slack thread?&lt;/li&gt;
&lt;li&gt;Does the resolved pin give the team enough traceability?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you build web apps with non-technical feedback loops and want to try it, the ask is simple: use it on one real page, drop 1-3 pins, and tell me where the loop breaks.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://pincushion.io" rel="noopener noreferrer"&gt;https://pincushion.io&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The broader bet
&lt;/h2&gt;

&lt;p&gt;Most feedback tools are built around dashboards.&lt;/p&gt;

&lt;p&gt;That made sense when humans were the only implementation path. But if the person doing the first pass is an AI coding agent, the dashboard should not be the center of gravity.&lt;/p&gt;

&lt;p&gt;The center of gravity should be the IDE and the repo.&lt;/p&gt;

&lt;p&gt;That is the bet behind Pincushion: visual feedback is not a ticket. It is an agent-ready work packet.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>agents</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
