<?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: Flawsnap</title>
    <description>The latest articles on DEV Community by Flawsnap (@flawsnap).</description>
    <link>https://dev.to/flawsnap</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%2F4239280%2Ff1005c3a-c625-4a4c-af67-965e810d4f16.png</url>
      <title>DEV Community: Flawsnap</title>
      <link>https://dev.to/flawsnap</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/flawsnap"/>
    <language>en</language>
    <item>
      <title>Our Chrome extension was rejected for "remotely hosted code". Here's the build guard we added</title>
      <dc:creator>Flawsnap</dc:creator>
      <pubDate>Thu, 12 Nov 2026 03:36:31 +0000</pubDate>
      <link>https://dev.to/flawsnap/our-chrome-extension-was-rejected-for-remotely-hosted-code-heres-the-build-guard-we-added-4ca0</link>
      <guid>https://dev.to/flawsnap/our-chrome-extension-was-rejected-for-remotely-hosted-code-heres-the-build-guard-we-added-4ca0</guid>
      <description>&lt;p&gt;I'm the founder of Flawsnap, a visual bug-reporting tool. This week our Chrome extension went live, but only on the second try. Here's why it was rejected, in case you're about to submit an extension that shares code with a website.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rejection
&lt;/h2&gt;

&lt;p&gt;Version 0.2.1 was rejected for "Including remotely hosted code in a Manifest V3 item".&lt;/p&gt;

&lt;h2&gt;
  
  
  Why
&lt;/h2&gt;

&lt;p&gt;The extension shows the same report form as our website widget, so its content script bundles the widget's code. The widget, on a website, can add a &lt;code&gt;&amp;lt;script src="{api}/widget-recorder.js"&amp;gt;&lt;/code&gt; to load an rrweb session recorder.&lt;/p&gt;

&lt;p&gt;The extension never runs that path. It creates the form with replay turned off and records the tab as video itself, with &lt;code&gt;chrome.tabCapture&lt;/code&gt; and an offscreen document. But the code that &lt;em&gt;could&lt;/em&gt; inject the script was in the package, and that's what review looks at.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix (0.2.2)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Strip it at build time.&lt;/strong&gt; An esbuild plugin replaces the widget's &lt;code&gt;loadRecorder()&lt;/code&gt; with a version that loads nothing and drops the recorder URL. The build stops if the widget's code changes shape, so the swap can't silently stop matching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scan the output.&lt;/strong&gt; After building, a script walks &lt;code&gt;dist/&lt;/code&gt; and fails the build on a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; element, &lt;code&gt;import()&lt;/code&gt;, &lt;code&gt;eval&lt;/code&gt;, &lt;code&gt;new Function&lt;/code&gt;, &lt;code&gt;importScripts&lt;/code&gt;, a remote &lt;code&gt;.js&lt;/code&gt; URL, or the recorder file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tests for both guards.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A note to the reviewer&lt;/strong&gt; explaining what changed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The scan is just a list of patterns, checked against every built &lt;code&gt;.js&lt;/code&gt; and &lt;code&gt;.html&lt;/code&gt; file:&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="cm"&gt;/** Patterns that load or run code from outside the package. */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="no"&gt;REMOTE_CODE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;what&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'creates a &amp;lt;script&amp;gt; element'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;createElement&lt;/span&gt;\&lt;span class="p"&gt;(&lt;/span&gt;\&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"'`]script["&lt;/span&gt;&lt;span class="s1"&gt;'`]\s*\)/ },
  { what: '&lt;/span&gt;&lt;span class="nf"&gt;importScripts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s1"&gt;', re: /\bimportScripts\s*\(/ },
  { what: '&lt;/span&gt;&lt;span class="n"&gt;dynamic&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s1"&gt;', re: /(?&amp;lt;![\w$.])import\s*\(/ },
  { what: '&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s1"&gt;', re: /\bnew\s+Function\s*\(/ },
  { what: '&lt;/span&gt;&lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s1"&gt;', re: /(?&amp;lt;![\w$.])eval\s*\(/ },
  { what: '&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt; &lt;span class="no"&gt;URL&lt;/span&gt;&lt;span class="s1"&gt;', re: /https?:\/\/[^\s"'&lt;/span&gt;&lt;span class="sb"&gt;`&amp;lt;&amp;gt;]+\.m?js\b/ },
  { what: 'the widget recorder file', re: /widget-recorder\.js/ },
  { what: 'a remote &amp;lt;script src&amp;gt;', re: /&amp;lt;script[^&amp;gt;]+src\s*=\s*["']?(https?:)?\/\//i },
]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Review checks what your package &lt;em&gt;could&lt;/em&gt; do, not just what it does.&lt;/li&gt;
&lt;li&gt;If you share UI code between a site and an extension, look for dynamic script loading, lazy &lt;code&gt;import()&lt;/code&gt; and CDN URLs in the bundle.&lt;/li&gt;
&lt;li&gt;A build-time check is cheaper than another review round.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The extension
&lt;/h2&gt;

&lt;p&gt;Report bugs on any site, no code: mark up a screenshot or record the tab, and it lands on your Flawsnap board with the page, the browser and, on sites you allow, console errors and failed requests. Chrome, Edge and Brave. It needs a Flawsnap account (7-day trial).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/flawsnap/koabljbhhjkpihmcbhflkgmaemmfcaho?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=ext_launch" rel="noopener noreferrer"&gt;Chrome Web Store&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Has the Web Store rejected one of yours? What for?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Drafted with AI assistance and edited by me.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>chrome</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The 7 console errors behind most "the button does nothing" bug reports</title>
      <dc:creator>Flawsnap</dc:creator>
      <pubDate>Thu, 12 Nov 2026 03:36:04 +0000</pubDate>
      <link>https://dev.to/flawsnap/the-7-console-errors-behind-most-the-button-does-nothing-bug-reports-md4</link>
      <guid>https://dev.to/flawsnap/the-7-console-errors-behind-most-the-button-does-nothing-bug-reports-md4</guid>
      <description>&lt;p&gt;"I clicked Pay and nothing happened."&lt;/p&gt;

&lt;p&gt;Nine times out of ten, the explanation for that sentence is already sitting in the browser console, in red. The person reporting the bug just never opened it.&lt;/p&gt;

&lt;p&gt;This post is a field guide to the console for bug reports: what writes to it, which errors matter, what the common ones actually mean, and a routine for capturing the right lines. It's useful whether you're the developer reading reports or the person writing them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the console is (and who writes to it)
&lt;/h2&gt;

&lt;p&gt;The console is one panel in the browser's developer tools. Two things write to it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The page's own code&lt;/strong&gt;, through calls like:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="nb"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cart loaded"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nb"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"coupon endpoint is deprecated"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nb"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"checkout failed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&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;ol&gt;
&lt;li&gt;
&lt;strong&gt;The browser itself&lt;/strong&gt;, which reports uncaught errors, failed resource loads, security blocks and deprecation warnings, whether or not the developers logged anything.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You don't need to understand the code to use it in a bug report. The job is to notice the red lines that showed up &lt;em&gt;when the problem happened&lt;/em&gt; and copy them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Log levels, quickly
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;How it looks&lt;/th&gt;
&lt;th&gt;What it usually means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Error&lt;/td&gt;
&lt;td&gt;Red, often with a stack trace&lt;/td&gt;
&lt;td&gt;Something failed. Most relevant to a bug report.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warning&lt;/td&gt;
&lt;td&gt;Yellow&lt;/td&gt;
&lt;td&gt;Something may be wrong or is deprecated. Sometimes relevant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Info / log&lt;/td&gt;
&lt;td&gt;Plain text&lt;/td&gt;
&lt;td&gt;Messages developers added. Context, rarely the cause.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debug / verbose&lt;/td&gt;
&lt;td&gt;Hidden by default&lt;/td&gt;
&lt;td&gt;Detailed tracing for developers.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The 7 errors you'll see most, decoded
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;TypeError: Cannot read properties of undefined (reading 'x')&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The code expected some data that wasn't there, often because an API returned something unexpected.&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="c1"&gt;// API returned { error: "expired" } instead of { data: { amount: 42 } }&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// TypeError: Cannot read properties of undefined (reading 'amount')&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Next step:&lt;/strong&gt; check the Network panel at that same moment. The request that fed this code probably failed or returned an odd shape.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;code&gt;Uncaught (in promise)&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;An async operation (usually a request) failed and nothing handled the failure.&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="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"click"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/api/checkout"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"POST"&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="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&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="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// no try/catch: if this rejects, the UI just... does nothing&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The visible symptom is very often &lt;strong&gt;a button that does nothing&lt;/strong&gt;. That's the classic report.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;code&gt;Failed to load resource: the server responded with a status of 404&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A file or API address doesn't exist. If you see &lt;strong&gt;500&lt;/strong&gt; instead, the server failed.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;code&gt;Access to fetch ... has been blocked by CORS policy&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The browser refused a request to another domain because that server didn't allow it. This is a &lt;strong&gt;server configuration issue&lt;/strong&gt;, not something the user did. Don't let it get triaged as "user error".&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;code&gt;ReferenceError: x is not defined&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The code used something that doesn't exist, often because a script failed to load or loaded in the wrong order.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. &lt;code&gt;Refused to load the script ... Content Security Policy&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The site's security policy blocked a script. This is common right after someone adds a new third-party tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. &lt;code&gt;ResizeObserver loop&lt;/code&gt; (and similar warnings)
&lt;/h3&gt;

&lt;p&gt;Usually harmless noise. Mention it only if nothing else appears.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to open the console
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chrome, Edge, Brave:&lt;/strong&gt; &lt;code&gt;F12&lt;/code&gt;, or &lt;code&gt;Ctrl+Shift+J&lt;/code&gt; (Windows/Linux) / &lt;code&gt;Cmd+Option+J&lt;/code&gt; (Mac)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firefox:&lt;/strong&gt; &lt;code&gt;F12&lt;/code&gt;, or &lt;code&gt;Ctrl+Shift+K&lt;/code&gt; / &lt;code&gt;Cmd+Option+K&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safari:&lt;/strong&gt; first turn on the developer features in Safari's Advanced settings, then &lt;code&gt;Cmd+Option+C&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On a phone:&lt;/strong&gt; only by connecting the phone to a computer. That's exactly why mobile bug reports so rarely include console output.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A 6-step routine for capturing the right lines
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open the console &lt;em&gt;before&lt;/em&gt; reproducing.&lt;/strong&gt; Some messages only appear once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear old messages&lt;/strong&gt; so only your attempt remains.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the log across page loads.&lt;/strong&gt; For redirects or form submissions, tick "Preserve log" (Chrome) or "Persist Logs" (Firefox).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproduce the bug&lt;/strong&gt; and note which messages appear &lt;em&gt;at the moment&lt;/em&gt; it goes wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy as text.&lt;/strong&gt; Right-click and save or copy. Text is searchable; a screenshot of the console isn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the Network panel too.&lt;/strong&gt; Failed requests show in red with their status code. The console tells you &lt;em&gt;what&lt;/em&gt; broke; the network panel often tells you &lt;em&gt;why&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Before you paste logs anywhere
&lt;/h2&gt;

&lt;p&gt;Console messages can contain email addresses, tokens or other personal data if someone logged them. Read the lines before sharing them outside your team, and remove anything that looks like a key or a password.&lt;/p&gt;

&lt;p&gt;Also: opening and reading the console is safe, but &lt;strong&gt;don't paste code into it that someone else sent you&lt;/strong&gt;. Code run in the console acts as you on that site.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Why is the console full of errors on a site that works fine?"
&lt;/h2&gt;

&lt;p&gt;Many sites log harmless warnings, blocked trackers and errors from third-party scripts. What matters is which messages appear &lt;em&gt;when the problem happens&lt;/em&gt;, which is why step 2 (clear first) matters so much.&lt;/p&gt;

&lt;h2&gt;
  
  
  The catch: most reporters will never open DevTools
&lt;/h2&gt;

&lt;p&gt;Clients, customers and most non-developer teammates won't do any of the above, and on mobile they can't. The practical fix is to have a script in the page collect the same information in the background and attach it to the report.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I'm building one of these, Flawsnap.&lt;/em&gt; Its website widget attaches the last 100 console messages and uncaught errors, plus the last 100 fetch/XHR requests (method, URL, status, duration), to each report. It never captures request or response bodies. If you want the logs from the very start of the page, load the script in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;. There's a &lt;a href="https://flawsnap.com/demo?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=console-logs-explained" rel="noopener noreferrer"&gt;no-sign-up demo with a deliberately broken checkout&lt;/a&gt; if you want to see what a captured report looks like. Whatever tool you use (or none), the routine above is the part that matters.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Your turn:&lt;/strong&gt; what's the console error that cost you the most time to track down? Drop it in the comments. I'm collecting the weird ones.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post was drafted with AI assistance and edited by me. It was originally published on &lt;a href="https://flawsnap.com/learn/console-logs-explained" rel="noopener noreferrer"&gt;flawsnap.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>debugging</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
