<?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: Billal Hossain</title>
    <description>The latest articles on DEV Community by Billal Hossain (@imbillal).</description>
    <link>https://dev.to/imbillal</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%2F4092153%2F0cae6837-5f01-43d7-86cd-e0008b45cda7.jpeg</url>
      <title>DEV Community: Billal Hossain</title>
      <link>https://dev.to/imbillal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/imbillal"/>
    <language>en</language>
    <item>
      <title>I launched PinReview on Product Hunt: click any element, get a bug ticket</title>
      <dc:creator>Billal Hossain</dc:creator>
      <pubDate>Mon, 19 Oct 2026 07:19:36 +0000</pubDate>
      <link>https://dev.to/imbillal/i-launched-pinreview-on-product-hunt-click-any-element-get-a-bug-ticket-3i64</link>
      <guid>https://dev.to/imbillal/i-launched-pinreview-on-product-hunt-click-any-element-get-a-bug-ticket-3i64</guid>
      <description>&lt;p&gt;PinReview is live on Product Hunt today! 🚀&lt;/p&gt;

&lt;p&gt;If you build sites for clients, you know this email: "the button on the contact page looks weird." Which&lt;br&gt;
  button? Which browser? What does "weird" mean?&lt;/p&gt;

&lt;p&gt;I got tired of guessing, so I built PinReview. A reviewer clicks any element on a live site and leaves a&lt;br&gt;
  comment, and it becomes a task with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📸 An annotated screenshot&lt;/li&gt;
&lt;li&gt;🎯 The exact CSS selector&lt;/li&gt;
&lt;li&gt;🧰 URL, browser, viewport and console errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything lands on a Kanban board. Clients leave feedback for free, with no login and no seat.&lt;/p&gt;

&lt;p&gt;For devs: on paid plans, Claude Code and Cursor can work with the board directly over MCP, so your AI agent&lt;br&gt;
  gets the full context of a bug without any copy-pasting.&lt;/p&gt;

&lt;p&gt;Built with Next.js 16, Express + Prisma, and a Chrome/Firefox extension made from one codebase.&lt;/p&gt;

&lt;p&gt;🎁 40% off any paid plan for the launch. The code is in the popup on pinreview.one. There's also a&lt;br&gt;
  free-forever plan.&lt;/p&gt;

&lt;p&gt;👉 Support the launch on Product Hunt: &lt;a href="https://www.producthunt.com/products/pinreview" rel="noopener noreferrer"&gt;https://www.producthunt.com/products/pinreview&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love your feedback in the comments! 🙌&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>nextjs</category>
      <category>saas</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How I keep feedback pins on the right element when a website changes</title>
      <dc:creator>Billal Hossain</dc:creator>
      <pubDate>Sun, 11 Oct 2026 05:15:29 +0000</pubDate>
      <link>https://dev.to/imbillal/how-i-keep-feedback-pins-on-the-right-element-when-a-website-changes-3ae7</link>
      <guid>https://dev.to/imbillal/how-i-keep-feedback-pins-on-the-right-element-when-a-website-changes-3ae7</guid>
      <description>&lt;p&gt;When I built PinReview, a tool that lets clients click anywhere on a website and leave feedback, I thought the hard part would be screenshots. It wasn't. The hard part was making a pin&lt;br&gt;
  still point at the right element after the page changes.&lt;/p&gt;

&lt;p&gt;A client pins a comment on a button. The next day a developer adds a banner above it, or opens the page on a phone instead of a laptop. Where should the pin go now?&lt;/p&gt;

&lt;p&gt;## Coordinates don't work&lt;/p&gt;

&lt;p&gt;My first idea was to save the click position (x, y). It breaks immediately: different screen sizes, scrolling, responsive layouts and any content added above the element all move it.&lt;/p&gt;

&lt;p&gt;So instead of saving &lt;em&gt;where&lt;/em&gt; the click happened, I save &lt;em&gt;what&lt;/em&gt; was clicked.&lt;/p&gt;

&lt;p&gt;## A ranked list of selectors&lt;/p&gt;

&lt;p&gt;When someone pins an element, I build a list of CSS selectors, from most stable to least stable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;buildSelectorChain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nf"&gt;isStableId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`#&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;CSS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;attr&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data-testid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data-test&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data-cy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aria-label&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tagName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;[&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"]`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;classes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;css-|sc-|jsx-|hover|active|focus&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;classes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tagName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;classes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nthChildPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// always present, last resort&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few details turned out to matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auto-generated IDs are a trap.&lt;/strong&gt; IDs like &lt;code&gt;:r1a:&lt;/code&gt; (React), UUIDs or &lt;code&gt;ember123&lt;/code&gt; change on every build, so &lt;code&gt;isStableId&lt;/code&gt; rejects anything that looks generated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSS-in-JS class names are noise.&lt;/strong&gt; &lt;code&gt;css-1x2y3z&lt;/code&gt; or &lt;code&gt;sc-abc123&lt;/code&gt; change between deploys, so they're filtered out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test attributes are gold.&lt;/strong&gt; &lt;code&gt;data-testid&lt;/code&gt; rarely changes, which makes it the best anchor after a real ID.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To find the element later, I try each selector in order and take the first one that matches &lt;strong&gt;exactly one&lt;/strong&gt; element:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;resolveSelectorChain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sel&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;matches&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;## Position relative to the element&lt;/p&gt;

&lt;p&gt;The pin's position is stored as a &lt;strong&gt;percentage of the element's size&lt;/strong&gt;, not of the page. A pin at 30% across a button stays at 30% across that button, whether the button is 200px wide on&lt;br&gt;
  desktop or 120px on mobile.&lt;/p&gt;

&lt;p&gt;## Keep the original evidence&lt;/p&gt;

&lt;p&gt;Every comment also stores a screenshot of what the reviewer actually saw, with the pin drawn on it, plus the page URL, viewport size, browser, OS and console errors. Even if the live page&lt;br&gt;
  changes completely, the developer can always see the original context.&lt;/p&gt;

&lt;p&gt;## Where it still breaks&lt;/p&gt;

&lt;p&gt;The honest part: lists of identical items. Imagine three product cards with the same classes and no IDs. They fall back to the DOM-position selector, so if a new card is inserted above,&lt;br&gt;
  the pin moves to the wrong card, and nothing warns you.&lt;/p&gt;

&lt;p&gt;Today the fix is simple: give repeated items a unique &lt;code&gt;id&lt;/code&gt; or &lt;code&gt;data-testid&lt;/code&gt;. I'm also looking at storing a small fingerprint of the element (its text and tag) so a pin can say "this may&lt;br&gt;
  have moved" instead of confidently pointing at the wrong thing.&lt;/p&gt;

&lt;p&gt;## Try it&lt;/p&gt;

&lt;p&gt;You can try PinReview live, no sign-up needed: &lt;a href="https://pinreview.one/demo" rel="noopener noreferrer"&gt;https://pinreview.one/demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm launching on Product Hunt on October 19: &lt;a href="https://www.producthunt.com/products/pinreview-2" rel="noopener noreferrer"&gt;https://www.producthunt.com/products/pinreview-2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How would you handle the identical-cards case? I'd love to hear other approaches.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>javascript</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>From Website Feedback to Code Fixes: Using PinReview With Claude Code</title>
      <dc:creator>Billal Hossain</dc:creator>
      <pubDate>Sat, 10 Oct 2026 06:23:14 +0000</pubDate>
      <link>https://dev.to/imbillal/from-website-feedback-to-code-fixes-using-pinreview-with-claude-code-3e37</link>
      <guid>https://dev.to/imbillal/from-website-feedback-to-code-fixes-using-pinreview-with-claude-code-3e37</guid>
      <description>&lt;p&gt;Collecting website feedback is one thing. Actually fixing the reported issues is another.&lt;/p&gt;

&lt;p&gt;Imagine you're working on a client's website. They report several issues: a button is misaligned, a section has incorrect spacing, and a component doesn't look right on mobile.&lt;/p&gt;

&lt;p&gt;Traditionally, you would review the screenshots, understand each issue, locate the relevant code, and start fixing everything manually.&lt;/p&gt;

&lt;p&gt;But what if you could make that workflow more efficient with AI coding tools?&lt;/p&gt;

&lt;p&gt;My workflow idea: PinReview + Claude Code&lt;/p&gt;

&lt;p&gt;I've been building PinReview, a visual website feedback tool that helps developers collect feedback directly on websites and organize it into actionable tasks.&lt;/p&gt;

&lt;p&gt;Here's how this workflow can work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Collect visual feedback&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Clients or teammates leave comments on specific areas of a website using PinReview. Each comment can include a screenshot and useful technical context, such as the CSS selector, browser, viewport, and console errors.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Export the tasks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once the feedback is collected, developers can export tasks and use that information as context for their coding workflow.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bring the feedback into Claude Code&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instead of manually explaining every visual issue, you can provide the exported task details to Claude Code. It can help investigate the relevant components, identify potential causes, and propose code changes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Review and verify the fixes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AI-generated changes still need developer review. Run the application, check the affected page, and verify that the original issue has actually been resolved.&lt;/p&gt;

&lt;p&gt;Why this workflow interests me&lt;/p&gt;

&lt;p&gt;Tools like Claude Code can help developers work directly with their codebase, while PinReview helps capture the visual problems that need to be solved.&lt;/p&gt;

&lt;p&gt;Together, this creates a practical workflow:&lt;/p&gt;

&lt;p&gt;Visual feedback → Exported tasks → AI-assisted coding → Developer review → Verified fixes&lt;/p&gt;

&lt;p&gt;The goal isn't to replace developers. It's to reduce the time spent understanding scattered feedback and help developers focus on solving the actual problems.&lt;/p&gt;

&lt;p&gt;I'm building PinReview for developers, freelancers, designers, and agencies who want a better way to manage website feedback.&lt;/p&gt;

&lt;p&gt;🔗 Check out PinReview: &lt;a href="https://pinreview.one" rel="noopener noreferrer"&gt;https://pinreview.one&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear your thoughts&lt;/p&gt;

&lt;p&gt;If you're using Claude Code or another AI coding assistant, how do you currently pass UI bugs and visual feedback into your coding workflow?&lt;/p&gt;

&lt;p&gt;Would exporting structured feedback from a tool like PinReview be useful to you?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#webdev&lt;/strong&gt; #ai #claudecode #productivity&lt;/p&gt;

</description>
      <category>ai</category>
      <category>frontend</category>
      <category>tools</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Problem With Website Feedback (And How I'm Trying to Fix It)</title>
      <dc:creator>Billal Hossain</dc:creator>
      <pubDate>Fri, 09 Oct 2026 16:32:57 +0000</pubDate>
      <link>https://dev.to/imbillal/the-problem-with-website-feedback-and-how-im-trying-to-fix-it-82b</link>
      <guid>https://dev.to/imbillal/the-problem-with-website-feedback-and-how-im-trying-to-fix-it-82b</guid>
      <description>&lt;p&gt;As developers, we spend a lot of time building websites, fixing bugs, and improving user experiences. But one thing that can make the process unnecessarily difficult is collecting feedback from clients.&lt;/p&gt;

&lt;p&gt;You might receive messages like:&lt;/p&gt;

&lt;p&gt;“The button doesn't look right.”&lt;br&gt;
“Please fix the section below the header.”&lt;br&gt;
“The layout looks broken on mobile.”&lt;br&gt;
“Can you move this element a little to the left?”&lt;/p&gt;

&lt;p&gt;Sounds familiar? 😅&lt;/p&gt;

&lt;p&gt;The problem is that written feedback often lacks context. You end up asking follow-up questions, searching for the relevant section, and trying to reproduce the issue. This creates unnecessary back-and-forth between developers, designers, and clients.&lt;/p&gt;

&lt;p&gt;What if feedback could be visual?&lt;/p&gt;

&lt;p&gt;Imagine opening a website, clicking on the exact element that needs attention, and leaving a comment right there. The feedback would include a screenshot and relevant technical details, making it easier to understand the issue.&lt;/p&gt;

&lt;p&gt;That's the idea behind PinReview.&lt;/p&gt;

&lt;p&gt;I built PinReview to help developers, designers, freelancers, and agencies collect visual website feedback and turn it into actionable tasks.&lt;/p&gt;

&lt;p&gt;With PinReview, you can:&lt;/p&gt;

&lt;p&gt;📌 Pin comments directly onto website elements.&lt;br&gt;
📸 Capture screenshots and technical context.&lt;br&gt;
✅ Manage feedback through a Kanban board.&lt;br&gt;
🌐 Collect feedback using a browser extension or embeddable widget.&lt;br&gt;
👥 Allow guests to leave comments without creating an account.&lt;/p&gt;

&lt;p&gt;The goal is simple: reduce communication overhead and make website reviews easier for everyone involved.&lt;/p&gt;

&lt;p&gt;I'm still working on growing PinReview and learning from real users, so feedback and suggestions are always welcome.&lt;/p&gt;

&lt;p&gt;🔗 Try PinReview: &lt;a href="https://pinreview.one" rel="noopener noreferrer"&gt;https://pinreview.one&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's discuss&lt;/p&gt;

&lt;p&gt;How do you currently collect website feedback from clients?&lt;/p&gt;

&lt;p&gt;Do you use screenshots, Google Docs, project management tools, or something else? I'd love to learn how other developers handle this workflow.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>ux</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I’m Making Website Feedback Easier for Developers and Agencies</title>
      <dc:creator>Billal Hossain</dc:creator>
      <pubDate>Fri, 09 Oct 2026 16:31:08 +0000</pubDate>
      <link>https://dev.to/imbillal/how-im-making-website-feedback-easier-for-developers-and-agencies-4dig</link>
      <guid>https://dev.to/imbillal/how-im-making-website-feedback-easier-for-developers-and-agencies-4dig</guid>
      <description>&lt;p&gt;Have you ever received website feedback like “this section looks wrong” without knowing which section the client was talking about?&lt;/p&gt;

&lt;p&gt;I built PinReview to solve this problem.&lt;/p&gt;

&lt;p&gt;PinReview helps developers, designers, and agencies collect visual feedback directly on websites. Instead of going back and forth through emails and screenshots, users can pin comments to specific areas of a page and turn feedback into actionable tasks.&lt;/p&gt;

&lt;p&gt;What you can do with PinReview:&lt;/p&gt;

&lt;p&gt;📌 Leave pin-point comments directly on websites.&lt;br&gt;
📸 Capture screenshots and contextual technical details.&lt;br&gt;
✅ Organize feedback using a Kanban task board.&lt;br&gt;
🌐 Collect feedback through an embeddable widget or browser extension.&lt;br&gt;
👥 Let guests leave comments without creating an account.&lt;br&gt;
🖼️ Review uploaded PDFs and images, too.&lt;/p&gt;

&lt;p&gt;I built PinReview to make website reviews simpler and help teams spend less time clarifying feedback and more time fixing issues.&lt;/p&gt;

&lt;p&gt;If you're a freelance developer, designer, or agency working with clients, I'd love to hear your thoughts!&lt;/p&gt;

&lt;p&gt;🔗 Website: &lt;a href="https://pinreview.one" rel="noopener noreferrer"&gt;https://pinreview.one&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🎥 Promotional video: &lt;a href="https://www.youtube.com/watch?v=N_SnhYFGCpA" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=N_SnhYFGCpA&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What tools do you currently use to collect website feedback from clients?&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>startup</category>
      <category>tools</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
