{"id":76969,"date":"2026-06-17T01:58:31","date_gmt":"2026-06-17T01:58:31","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=76969"},"modified":"2026-06-17T01:58:34","modified_gmt":"2026-06-17T01:58:34","slug":"stop-ai-guesswork-browser-evidence-workflow-for-claude-codex-and-vibe-coding","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/stop-ai-guesswork-browser-evidence-workflow-for-claude-codex-and-vibe-coding\/","title":{"rendered":"Stop AI Guesswork: Browser Evidence Workflow for Claude, Codex, and Vibe Coding"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When I use AI coding tools like Claude, Codex, Cursor, or similar agents, one of the most frustrating problems is this:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">The AI can read the code, but it often fails to understand what is actually happening in the browser.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">This becomes painful during frontend work. The AI says \u201cfixed,\u201d but the UI is still broken. It says \u201ctested,\u201d but it never opened the page. It changes CSS blindly. It misses console errors. It ignores failed API requests. It fixes desktop layout but breaks mobile. Sometimes it just guesses.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is not only an AI problem. It is a workflow problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The correct solution is not to keep saying:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cClaude, please check the browser.\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cCodex, analyze this screenshot.\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">The better solution is:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Give the AI browser evidence.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">That means screenshots, console logs, network failures, viewport data, accessibility reports, Lighthouse reports, waterfall data, and bug recordings.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This tutorial explains the complete workflow I recommend for vibe coding, browser debugging, screenshot work, frontend verification, and AI-assisted development.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1. The Real Problem<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The main problem is simple:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Claude\/Codex can read files, but may not actually see the rendered browser.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">When working on a web application, the source code is only half the truth. The browser shows the real truth.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A frontend bug may come from:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">CSS cascade\nResponsive breakpoint\nJavaScript runtime error\nFailed API call\nMissing environment variable\nWrong route\nBroken image path\nAuthentication failure\nHydration issue\nLayout shift\nSlow-loading resource\nBlocked script\nWrong z-index\nModal overlay issue\nMobile viewport problem\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The AI may inspect the source code and assume everything is fine. But the browser may show a completely different story.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That is why AI coding agents often fail in UI work.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. Problems We Identified<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 1: AI cannot reliably access your browser<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Your browser may be open on your laptop, but Claude\/Codex may be running in:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">A cloud workspace\nA sandbox\nA container\nA remote coding environment\nA browser session without your login\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">So even if you say:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Check<\/span> <span class=\"hljs-selector-tag\">localhost<\/span><span class=\"hljs-selector-pseudo\">:3000<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">the agent may not actually be able to access it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is very common with local apps.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 2: Localhost is not always visible to the AI<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Your app may run at:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">http:<span class=\"hljs-comment\">\/\/localhost:3000<\/span>\nhttp:<span class=\"hljs-comment\">\/\/127.0.0.1:3000<\/span>\nhttp:<span class=\"hljs-comment\">\/\/localhost:5173<\/span>\nhttp:<span class=\"hljs-comment\">\/\/localhost:4321<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">But if the AI agent is not running in the same machine or container, it cannot open that URL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is why the agent may say:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">I cannot access the page.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">or worse:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">I checked it.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">when it actually did not.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 3: Screenshots alone are useful but incomplete<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A screenshot helps the AI see visual issues, but it does not show the full technical context.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A screenshot cannot show:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Console errors\nNetwork failures\nAPI response status\nDOM state\nCSS computed styles\nMissing JavaScript bundles\nCORS errors\nAuthentication redirects\nSlow-loading resources\nUser action sequence\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">So screenshots are good, but not enough.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 4: AI agents sometimes pretend verification happened<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is one of the biggest issues.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">An AI agent may say:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Done\nTested\nVerified\nLooks good\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">But it may have only inspected source files.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For frontend work, that is not enough.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A real verification should include at least:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Open the page <span class=\"hljs-keyword\">in<\/span> a browser\nCheck screenshot\nCheck <span class=\"hljs-built_in\">console<\/span> errors\nCheck failed network requests\nCheck desktop\/tablet\/mobile layout\nConfirm the issue is fixed\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Without browser evidence, \u201cdone\u201d is weak.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 5: Public pages and private pages need different workflows<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">There are two categories of pages.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Public pages<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">A website page available on the internet\nA landing page\nA blog page\nA product page\nA hospital listing page\nA marketing page\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">These can be tested using online tools like WebPageTest, PageSpeed Insights, GTmetrix, DebugBear, Lighthouse, and similar tools.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Private\/local pages<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">localhost app\nAdmin dashboard\nLogged-in user area\nKeycloak-<span class=\"hljs-keyword\">protected<\/span> page\nInternal staging app\nPatient dashboard\n<span class=\"hljs-keyword\">Private<\/span> CRM\nDeveloper preview\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">These cannot always be tested by public tools.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For private\/local pages, you need browser automation or a browser extension.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. The Core Idea: Browser Evidence, Not Browser Guessing<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The best workflow is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Do not ask AI to guess <span class=\"hljs-keyword\">from<\/span> code.\nGive AI real browser evidence.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Browser evidence includes:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Screenshot\nScreen recording\nConsole logs\nNetwork logs\nFailed requests\nViewport size\nDevice\/browser metadata\nLighthouse report\nAccessibility report\nWaterfall report\nFilmstrip report\nDOM\/CSS inspection\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Once the AI has this evidence, it can reason better.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of saying:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Fix the UI.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">you say:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Here is the screenshot.\nHere are the <span class=\"hljs-built_in\">console<\/span> errors.\nHere are failed API requests.\nHere is the mobile viewport.\nHere is the Lighthouse report.\nNow find the exact frontend issue and fix it.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This changes the quality of the result.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. Best Overall Workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The full workflow depends on the type of page.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">For local\/private development<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Python + Playwright + Chromium\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This generates browser evidence from your local app.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">For public websites<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">WebPageTest\nPageSpeed Insights\nGTmetrix\nDebugBear\nLighthouse\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">These tools create public\/shareable reports.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">For quick one-click bug reports<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Jam<\/span><span class=\"hljs-selector-class\">.dev<\/span> <span class=\"hljs-selector-tag\">Chrome<\/span> <span class=\"hljs-selector-tag\">extension<\/span>\n<span class=\"hljs-selector-tag\">BrowserStack<\/span> <span class=\"hljs-selector-tag\">Bug<\/span> <span class=\"hljs-selector-tag\">Capture<\/span>\n<span class=\"hljs-selector-tag\">Bird<\/span> <span class=\"hljs-selector-tag\">Eats<\/span> <span class=\"hljs-selector-tag\">Bug-style<\/span> <span class=\"hljs-selector-tag\">tools<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">These capture screenshot\/video plus console\/network logs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">For accessibility<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">WAVE\naxe DevTools\nLighthouse Accessibility\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">For visual regression<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Percy\nBrowserStack visual testing\nPlaywright screenshots\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. Recommended Stack for Vibe Coding<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">My recommended practical stack is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-number\">1.<\/span> Python Playwright + Chromium\n   For local\/private automated browser checks.\n\n<span class=\"hljs-number\">2.<\/span> Jam.dev extension\n   For one-click bug reports <span class=\"hljs-keyword\">with<\/span> screenshot\/video + <span class=\"hljs-built_in\">console<\/span>\/network logs.\n\n<span class=\"hljs-number\">3.<\/span> WebPageTest\n   For public page loading, waterfall, screenshot, and filmstrip reports.\n\n<span class=\"hljs-number\">4.<\/span> PageSpeed Insights \/ Lighthouse\n   For performance, SEO, accessibility, and best-practice audits.\n\n<span class=\"hljs-number\">5.<\/span> WAVE or axe DevTools\n   For accessibility testing.\n\n<span class=\"hljs-number\">6.<\/span> CLAUDE.md \/ CODEX.md browser verification rules\n   To stop the AI <span class=\"hljs-keyword\">from<\/span> pretending it tested the browser.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This gives the best balance of:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Low cost\nPractical evidence\nLocal development support\n<span class=\"hljs-keyword\">Public<\/span> website support\nClaude\/Codex compatibility\nRepeatable workflow\nLess hallucination\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6. Solution 1: Python + Playwright + Chromium<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is the best free local solution.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Playwright can control Chromium, Firefox, and WebKit. For vibe coding, I recommend Chromium first because it is fast, stable, and close to Chrome behavior.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What this solves<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">It can check:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Page loads or not\nDesktop screenshot\nTablet screenshot\nMobile screenshot\nConsole errors\nJavaScript runtime errors\nFailed API\/network requests\nResponsive layout\nBasic visual evidence\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Cost<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Playwright: Free\nChromium through Playwright: Free\nPython script: Free\nAI usage: depends on your Claude\/Codex\/Cursor plan\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Install<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">pip install playwright\nplaywright install chromium\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Create a browser check script<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create this file:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">tools\/browser_check.py\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Add this code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">from playwright.sync_api import sync_playwright\nfrom pathlib import Path\n\nURL = <span class=\"hljs-string\">\"http:\/\/127.0.0.1:3000\"<\/span>\n\nVIEWPORTS = {\n    <span class=\"hljs-string\">\"desktop\"<\/span>: {<span class=\"hljs-string\">\"width\"<\/span>: <span class=\"hljs-number\">1440<\/span>, <span class=\"hljs-string\">\"height\"<\/span>: <span class=\"hljs-number\">900<\/span>},\n    <span class=\"hljs-string\">\"tablet\"<\/span>: {<span class=\"hljs-string\">\"width\"<\/span>: <span class=\"hljs-number\">768<\/span>, <span class=\"hljs-string\">\"height\"<\/span>: <span class=\"hljs-number\">1024<\/span>},\n    <span class=\"hljs-string\">\"mobile\"<\/span>: {<span class=\"hljs-string\">\"width\"<\/span>: <span class=\"hljs-number\">390<\/span>, <span class=\"hljs-string\">\"height\"<\/span>: <span class=\"hljs-number\">844<\/span>},\n}\n\noutput_dir = Path(<span class=\"hljs-string\">\"browser-report\"<\/span>)\noutput_dir.mkdir(exist_ok=<span class=\"hljs-keyword\">True<\/span>)\n\nwith sync_playwright() <span class=\"hljs-keyword\">as<\/span> p:\n    browser = p.chromium.launch(headless=<span class=\"hljs-keyword\">True<\/span>)\n\n    <span class=\"hljs-keyword\">for<\/span> name, viewport in VIEWPORTS.items():\n        <span class=\"hljs-keyword\">print<\/span>(f<span class=\"hljs-string\">\"Checking {name} viewport...\"<\/span>)\n\n        page = browser.new_page(\n            viewport=viewport,\n            is_mobile=(name == <span class=\"hljs-string\">\"mobile\"<\/span>)\n        )\n\n        console_errors = &#91;]\n        failed_requests = &#91;]\n\n        page.on(\n            <span class=\"hljs-string\">\"console\"<\/span>,\n            lambda msg: console_errors.append(msg.text)\n            <span class=\"hljs-keyword\">if<\/span> msg.type == <span class=\"hljs-string\">\"error\"<\/span>\n            <span class=\"hljs-keyword\">else<\/span> None\n        )\n\n        page.on(\n            <span class=\"hljs-string\">\"pageerror\"<\/span>,\n            lambda error: console_errors.append(str(error))\n        )\n\n        page.on(\n            <span class=\"hljs-string\">\"requestfailed\"<\/span>,\n            lambda request: failed_requests.append(request.url)\n        )\n\n        page.<span class=\"hljs-keyword\">goto<\/span>(URL, wait_until=<span class=\"hljs-string\">\"networkidle\"<\/span>)\n\n        screenshot_path = output_dir \/ f<span class=\"hljs-string\">\"{name}.png\"<\/span>\n        page.screenshot(path=str(screenshot_path), full_page=<span class=\"hljs-keyword\">True<\/span>)\n\n        report_path = output_dir \/ f<span class=\"hljs-string\">\"{name}-report.txt\"<\/span>\n\n        with open(report_path, <span class=\"hljs-string\">\"w\"<\/span>, encoding=<span class=\"hljs-string\">\"utf-8\"<\/span>) <span class=\"hljs-keyword\">as<\/span> f:\n            f.write(f<span class=\"hljs-string\">\"URL: {URL}\\n\"<\/span>)\n            f.write(f<span class=\"hljs-string\">\"Viewport: {viewport}\\n\\n\"<\/span>)\n\n            f.write(<span class=\"hljs-string\">\"Console Errors:\\n\"<\/span>)\n            <span class=\"hljs-keyword\">if<\/span> console_errors:\n                <span class=\"hljs-keyword\">for<\/span> error in console_errors:\n                    f.write(f<span class=\"hljs-string\">\"- {error}\\n\"<\/span>)\n            <span class=\"hljs-keyword\">else<\/span>:\n                f.write(<span class=\"hljs-string\">\"No console errors found.\\n\"<\/span>)\n\n            f.write(<span class=\"hljs-string\">\"\\nFailed Requests:\\n\"<\/span>)\n            <span class=\"hljs-keyword\">if<\/span> failed_requests:\n                <span class=\"hljs-keyword\">for<\/span> request in failed_requests:\n                    f.write(f<span class=\"hljs-string\">\"- {request}\\n\"<\/span>)\n            <span class=\"hljs-keyword\">else<\/span>:\n                f.write(<span class=\"hljs-string\">\"No failed requests found.\\n\"<\/span>)\n\n        page.close()\n\n    browser.close()\n\n<span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"Done. Check the browser-report folder.\"<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Run it<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">python tools\/browser_check.py\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">It will create:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">browser-report\/\n  desktop.png\n  desktop-report.txt\n  tablet.png\n  tablet-report.txt\n  mobile.png\n  mobile-report.txt\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Now you have evidence.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. How to Give This Report to Claude\/Codex<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">After generating the report, tell Claude or Codex:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">I ran browser verification using Python Playwright + Chromium.\n\nCheck the browser-report folder:\n- desktop.png\n- tablet.png\n- mobile.png\n- desktop-report.txt\n- tablet-report.txt\n- mobile-report.txt\n\nAnalyze the screenshots, <span class=\"hljs-built_in\">console<\/span> errors, failed network requests, and responsive layout.\n\nFind the exact frontend\/component\/CSS\/API issue.\nFix the code.\nThen explain:\n<span class=\"hljs-number\">1.<\/span> What was wrong\n<span class=\"hljs-number\">2.<\/span> Which files were changed\n<span class=\"hljs-number\">3.<\/span> How the fix was verified\n<span class=\"hljs-number\">4.<\/span> Whether any browser issue still remains\n\nDo not say done unless browser verification passes.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is much better than:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Please check my browser.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Because now the AI has actual proof.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Headless vs Visible Chromium<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Playwright can run Chromium in two modes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Headless mode<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This runs silently in the background.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">browser = p.chromium.launch(headless=<span class=\"hljs-keyword\">True<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Best for:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Automated testing\nCI pipeline\nFast screenshot generation\nRoutine checks\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Visible mode<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This opens the browser window.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">browser = p.chromium.launch(headless=<span class=\"hljs-keyword\">False<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Best for:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Watching the browser\nDebugging interactions\nSeeing dropdowns\/modals\nManual verification\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You can slow down browser actions like this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">browser = p.chromium.launch(headless=<span class=\"hljs-keyword\">False<\/span>, slow_mo=<span class=\"hljs-number\">500<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is useful when you want to watch what is happening.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. Solution 2: Browser Extensions for One-Click Bug Reports<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For quick bug reporting, browser extensions may be easier than scripts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The ideal extension workflow is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Open page\nClick extension\nRecord issue or take screenshot\nCapture <span class=\"hljs-built_in\">console<\/span>\/network logs\nGenerate shareable report link\nGive report link to Claude\/Codex\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best option: Jam.dev<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Jam.dev is one of the best tools for this workflow.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It can capture:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Screenshot\nScreen recording\nConsole logs\nNetwork logs\nBrowser metadata\nDevice metadata\nUser actions\nAnnotations\nShareable report link\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Best for:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Frontend bugs\nUI issues\nJavaScript errors\nHard-to-reproduce problems\nQA notes\nClaude\/Codex debugging context\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example workflow:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-number\">1.<\/span> Open your local\/staging\/public page.\n<span class=\"hljs-number\">2.<\/span> Click Jam extension.\n<span class=\"hljs-number\">3.<\/span> Start recording or take screenshot.\n<span class=\"hljs-number\">4.<\/span> Reproduce the issue.\n<span class=\"hljs-number\">5.<\/span> Stop recording.\n<span class=\"hljs-number\">6.<\/span> Copy the Jam report link.\n<span class=\"hljs-number\">7.<\/span> Paste it into Claude\/Codex.\n<span class=\"hljs-number\">8.<\/span> Ask the AI to analyze screenshot\/video, <span class=\"hljs-built_in\">console<\/span> logs, network logs, and user actions.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Prompt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Analyze <span class=\"hljs-keyword\">this<\/span> Jam bug report.\n\nFocus on:\n<span class=\"hljs-number\">1.<\/span> Screenshot\/video issue\n<span class=\"hljs-number\">2.<\/span> Console errors\n<span class=\"hljs-number\">3.<\/span> Network failures\n<span class=\"hljs-number\">4.<\/span> User actions\n<span class=\"hljs-number\">5.<\/span> Browser\/device metadata\n<span class=\"hljs-number\">6.<\/span> Exact frontend component\/CSS\/API issue\n<span class=\"hljs-number\">7.<\/span> Specific code changes needed\n\nDo not give generic advice.\nConvert the evidence into exact implementation fixes.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Cost<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Jam has a free plan with limits. Paid plans are useful if you need more recordings, team features, or heavier usage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For personal vibe coding, start with the free plan.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. Solution 3: BrowserStack Bug Capture \/ Bird Eats Bug<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">BrowserStack Bug Capture is another strong option.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It can capture:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Screen recording\nConsole logs\nNetwork logs\nClick events\nKey events\nSystem details\nTechnical bug report\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Best for:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">QA workflows\nBug reproduction\nFrontend debugging\nTeam reporting\nSharing evidence <span class=\"hljs-keyword\">with<\/span> developers or AI coding tools\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use it when you want a more QA-style bug report.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">11. Solution 4: WebPageTest for Public Pages<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For public websites, WebPageTest is extremely useful.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It can provide:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Shareable report\nScreenshot\nFilmstrip\nWaterfall\nPerformance metrics\nRequest details\nLoading timeline\nLighthouse-style report in some workflows\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Best for:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Slow <span class=\"hljs-keyword\">public<\/span> pages\nLarge images\nRender-blocking CSS\/JS\nThird-party scripts\nBlank page during loading\nLCP problems\nNetwork waterfall analysis\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use it for:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Landing pages\nBlog pages\n<span class=\"hljs-keyword\">Public<\/span> hospital pages\n<span class=\"hljs-keyword\">Public<\/span> doctor listing pages\nMarketing websites\nSEO pages\nCountry landing pages\nProcedure pages\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Limitation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">WebPageTest usually cannot test:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">localhost\n<span class=\"hljs-keyword\">private<\/span> staging\nlogged-in dashboards\nKeycloak-<span class=\"hljs-keyword\">protected<\/span> pages\ninternal admin pages\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For those, use Playwright or a browser extension.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">12. Solution 5: PageSpeed Insights and Lighthouse<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">PageSpeed Insights and Lighthouse are best for:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Performance\nSEO\nAccessibility\nBest practices\nProgressive web app checks\nCore Web Vitals\nMobile quality\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Lighthouse can run from:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Chrome DevTools\nCommand line\nNode <span class=\"hljs-built_in\">module<\/span>\nPageSpeed Insights\nBrowser extension\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use it when you want to know:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Is the page slow?\nIs the SEO basic setup correct?\nAre images too large?\nIs JavaScript blocking rendering?\nAre accessibility basics broken?\nIs mobile performance weak?\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Limitation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Lighthouse is not enough for detailed UI debugging.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It will not fully understand:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Card spacing is ugly\nHeader design is weak\nButton should align right\nDropdown looks broken\nModal overlay is wrong\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For those, use screenshots and AI review.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">13. Solution 6: GTmetrix and DebugBear<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">GTmetrix and DebugBear are good for public website performance reports.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">They are useful for:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Performance score\nPage size\nWaterfall\nLarge assets\nCore Web Vitals\nRecommendations\nShareable report\nClient-friendly explanations\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use these when you want a cleaner report to share with:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Claude\nCodex\nClient\nDeveloper\nSEO team\nDesigner\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Limitation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Free tiers may have limits.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">They are mostly useful for public pages, not private\/local pages.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">14. Solution 7: WAVE and axe DevTools for Accessibility<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Accessibility needs separate attention.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use WAVE or axe DevTools when you want to check:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Missing alt text\nLow color contrast\nMissing labels\nARIA issues\nHeading hierarchy\nKeyboard navigation\nForm accessibility\nButton\/link accessibility\nSemantic HTML problems\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">WAVE<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Good for visual accessibility feedback directly inside the browser.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Useful for:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Public<\/span> pages\nLocal pages\nPassword-<span class=\"hljs-keyword\">protected<\/span> pages\nDynamic pages\nSensitive pages\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">axe DevTools<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Good for developers who want automated accessibility checks inside the browser.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use it before saying a frontend page is ready.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">15. Solution 8: Percy and Visual Regression Testing<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Percy is for visual regression testing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It captures screenshots and compares them against a baseline.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Best for:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Detecting visual changes\nPreventing accidental UI breakage\nReviewing frontend changes\nTeam QA workflows\nRelease checks\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use Percy later when your project becomes bigger.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For your current vibe coding workflow, it is not the first tool I would start with.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Start with:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Playwright screenshots\nJam reports\nWebPageTest reports\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then add Percy if visual regression becomes important.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. Cost Summary<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Here is the practical cost map.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Tool \/ Method<\/th><th>Cost Style<\/th><th>Best Use<\/th><\/tr><\/thead><tbody><tr><td>Python Playwright + Chromium<\/td><td>Free<\/td><td>Local\/private browser evidence<\/td><\/tr><tr><td>Jam.dev extension<\/td><td>Free plan, paid for more usage<\/td><td>One-click bug report with logs<\/td><\/tr><tr><td>BrowserStack Bug Capture<\/td><td>Free\/paid depending on plan<\/td><td>QA-style bug recording<\/td><\/tr><tr><td>WebPageTest<\/td><td>Free with limits<\/td><td>Public page loading and waterfall reports<\/td><\/tr><tr><td>PageSpeed Insights<\/td><td>Free<\/td><td>SEO\/performance\/Core Web Vitals<\/td><\/tr><tr><td>Lighthouse<\/td><td>Free<\/td><td>Browser\/page audits<\/td><\/tr><tr><td>WAVE<\/td><td>Free extension<\/td><td>Accessibility review<\/td><\/tr><tr><td>axe DevTools<\/td><td>Free extension + paid options<\/td><td>Accessibility testing<\/td><\/tr><tr><td>GTmetrix<\/td><td>Free tier + paid plans<\/td><td>Performance reports<\/td><\/tr><tr><td>DebugBear<\/td><td>Free test + paid monitoring<\/td><td>Core Web Vitals\/performance<\/td><\/tr><tr><td>Percy<\/td><td>Free tier + paid plans<\/td><td>Visual regression<\/td><\/tr><tr><td>Browserbase<\/td><td>Paid cloud browser infra<\/td><td>Advanced cloud browser agents<\/td><\/tr><tr><td>Browser-use Cloud<\/td><td>Free\/paid depending usage<\/td><td>AI browser automation<\/td><\/tr><tr><td>Claude\/Codex\/Cursor<\/td><td>Depends on subscription\/usage<\/td><td>AI code changes and reasoning<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">My advice:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Do not start <span class=\"hljs-keyword\">with<\/span> expensive tools.\nStart <span class=\"hljs-keyword\">with<\/span> free browser evidence workflows.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">17. Best Tool by Situation<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Situation<\/th><th>Best Tool<\/th><\/tr><\/thead><tbody><tr><td>Localhost page<\/td><td>Python Playwright + Chromium<\/td><\/tr><tr><td>Logged-in dashboard<\/td><td>Playwright or Jam extension<\/td><\/tr><tr><td>Public page slow loading<\/td><td>WebPageTest<\/td><\/tr><tr><td>SEO\/performance check<\/td><td>PageSpeed Insights \/ Lighthouse<\/td><\/tr><tr><td>Accessibility check<\/td><td>WAVE \/ axe<\/td><\/tr><tr><td>Quick bug report URL<\/td><td>Jam.dev<\/td><\/tr><tr><td>QA-style bug report<\/td><td>BrowserStack Bug Capture<\/td><\/tr><tr><td>Visual regression<\/td><td>Percy<\/td><\/tr><tr><td>Claude\/Codex cannot see browser<\/td><td>Generate browser-report folder<\/td><\/tr><tr><td>Need shareable public audit<\/td><td>WebPageTest \/ GTmetrix \/ DebugBear<\/td><\/tr><tr><td>Need mobile screenshot<\/td><td>Playwright \/ Jam \/ BrowserStack Bug Capture<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">18. Add Browser Verification Rules to Every Project<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is very important.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create or update one of these files in your project root:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">CLAUDE.md\nCODEX.md\nAGENTS.md\n.cursor\/rules\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Add this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Browser Verification Rule<\/span>\n\n<span class=\"hljs-keyword\">For<\/span> any UI, layout, frontend, responsive, CSS, JavaScript, <span class=\"hljs-keyword\">or<\/span> browser-related task:\n\n<span class=\"hljs-number\">1.<\/span> <span class=\"hljs-keyword\">Do<\/span> not rely only on source-code reading.\n<span class=\"hljs-number\">2.<\/span> Run browser verification using Playwright, Chromium, Jam, <span class=\"hljs-keyword\">or<\/span> available browser tools.\n<span class=\"hljs-number\">3.<\/span> Check desktop, tablet, <span class=\"hljs-keyword\">and<\/span> mobile screenshots.\n<span class=\"hljs-number\">4.<\/span> Check console errors.\n<span class=\"hljs-number\">5.<\/span> Check failed network requests.\n<span class=\"hljs-number\">6.<\/span> Inspect DOM\/CSS <span class=\"hljs-keyword\">if<\/span> layout is broken.\n<span class=\"hljs-number\">7.<\/span> <span class=\"hljs-keyword\">Do<\/span> not say <span class=\"hljs-string\">\"done\"<\/span> unless browser verification was actually performed.\n<span class=\"hljs-number\">8.<\/span> <span class=\"hljs-keyword\">If<\/span> browser access is unavailable, clearly say browser verification was not possible.\n<span class=\"hljs-number\">9.<\/span> Mention exactly what was tested.\n<span class=\"hljs-number\">10.<\/span> Mention any remaining unverified area.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This rule is gold.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Without this, the AI may pretend the browser was checked.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">19. Standard Prompt for Claude\/Codex<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use this prompt for UI tasks:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">You must verify the UI <span class=\"hljs-keyword\">in<\/span> a real browser, not only by reading code.\n\nWorkflow:\n<span class=\"hljs-number\">1.<\/span> Start the dev server <span class=\"hljs-keyword\">if<\/span> it is not running.\n<span class=\"hljs-number\">2.<\/span> Open the app <span class=\"hljs-keyword\">in<\/span> browser using Playwright, Chromium, Jam evidence, or available browser tools.\n<span class=\"hljs-number\">3.<\/span> Test these viewports:\n   - Desktop: <span class=\"hljs-number\">1440<\/span>x900\n   - Tablet: <span class=\"hljs-number\">768<\/span>x1024\n   - Mobile: <span class=\"hljs-number\">390<\/span>x844\n<span class=\"hljs-number\">4.<\/span> Capture screenshots <span class=\"hljs-keyword\">for<\/span> each viewport.\n<span class=\"hljs-number\">5.<\/span> Check browser <span class=\"hljs-built_in\">console<\/span> errors.\n<span class=\"hljs-number\">6.<\/span> Check failed network requests.\n<span class=\"hljs-number\">7.<\/span> Inspect the DOM and applied CSS <span class=\"hljs-keyword\">for<\/span> the broken UI section.\n<span class=\"hljs-number\">8.<\/span> Identify the exact file\/component\/CSS causing the issue.\n<span class=\"hljs-number\">9.<\/span> Fix the issue.\n<span class=\"hljs-number\">10.<\/span> Re-run the browser check.\n<span class=\"hljs-number\">11.<\/span> Show before\/after explanation and mention what was verified.\n\nDo not say the task is complete unless the browser was actually opened and verified.\nIf browser access is not available, clearly say so and provide the exact setup needed.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">20. Prompt for Screenshot-Based Debugging<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">When you only have a screenshot, use this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Analyze <span class=\"hljs-keyword\">this<\/span> screenshot <span class=\"hljs-keyword\">as<\/span> a frontend\/UI debugging task.\n\nPlease identify:\n<span class=\"hljs-number\">1.<\/span> Visible UI problem\n<span class=\"hljs-number\">2.<\/span> Likely frontend\/component\/CSS cause\n<span class=\"hljs-number\">3.<\/span> Responsive layout risk\n<span class=\"hljs-number\">4.<\/span> Accessibility concern <span class=\"hljs-keyword\">if<\/span> visible\n<span class=\"hljs-number\">5.<\/span> Exact code areas to inspect\n<span class=\"hljs-number\">6.<\/span> Suggested implementation fix\n<span class=\"hljs-number\">7.<\/span> What browser evidence is still missing\n\nDo not assume the issue is fixed without <span class=\"hljs-built_in\">console<\/span>\/network\/browser verification.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">21. Prompt for Jam.dev or Bug Capture Reports<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use this when you have a shareable bug report:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Analyze <span class=\"hljs-keyword\">this<\/span> browser bug report.\n\nFocus on:\n<span class=\"hljs-number\">1.<\/span> Screenshot\/video evidence\n<span class=\"hljs-number\">2.<\/span> User action sequence\n<span class=\"hljs-number\">3.<\/span> Console errors\n<span class=\"hljs-number\">4.<\/span> Network failures\n<span class=\"hljs-number\">5.<\/span> Browser\/device metadata\n<span class=\"hljs-number\">6.<\/span> Failed API requests\n<span class=\"hljs-number\">7.<\/span> Frontend route\/component involved\n<span class=\"hljs-number\">8.<\/span> Exact code changes needed\n\nConvert the evidence into a precise implementation plan.\nDo not give generic advice.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">22. Prompt for Public Website Audit Reports<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use this when you have WebPageTest, PageSpeed Insights, GTmetrix, or DebugBear reports:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Analyze these website audit reports.\n\nFocus on:\n1. Loading performance\n2. Largest images\/assets\n3. Render-blocking CSS\/JS\n4. Third-party scripts\n5. Core Web Vitals\n6. SEO warnings\n7. Accessibility warnings\n8. Mobile issues\n9. Exact frontend\/build\/content fixes required\n\nConvert the findings into prioritized coding tasks:\n- Critical\n- High\n- Medium\n- Low\n\nAvoid generic advice. Mention exact files, components, assets, or configuration areas to inspect.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">23. Recommended Folder Structure<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For every project, create:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">tools\/\n  browser_check.py\n\nbrowser-report\/\n  desktop.png\n  desktop-report.txt\n  tablet.png\n  tablet-report.txt\n  mobile.png\n  mobile-report.txt\n\ndocs\/\n  browser-verification.md\n  test-cases.md\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In <code>docs\/browser-verification.md<\/code>, document:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Local URL\nStart command\nBuild command\nTest command\nBrowser check command\nRequired viewports\nLogin\/test user details\nPages to verify\nKnown limitations\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Browser Verification Guide<\/span>\n\n<span class=\"hljs-comment\">## Local URL<\/span>\n\nhttp:<span class=\"hljs-comment\">\/\/127.0.0.1:3000<\/span>\n\n<span class=\"hljs-comment\">## Start Command<\/span>\n\nnpm run dev\n\n<span class=\"hljs-comment\">## Build Command<\/span>\n\nnpm run build\n\n<span class=\"hljs-comment\">## Browser Check Command<\/span>\n\npython tools\/browser_check.py\n\n<span class=\"hljs-comment\">## Viewports<\/span>\n\n- Desktop: <span class=\"hljs-number\">1440<\/span>x900\n- Tablet: <span class=\"hljs-number\">768<\/span>x1024\n- Mobile: <span class=\"hljs-number\">390<\/span>x844\n\n<span class=\"hljs-comment\">## Required Checks<\/span>\n\n- Screenshot\n- Console errors\n- Failed network requests\n- Mobile layout\n- Header\/menu\n- Main CTA\n- Forms\n- Footer\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">24. Security and Privacy Warning<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This workflow can capture sensitive data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Browser evidence may include:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">API URLs\nHeaders\nConsole logs\nNetwork requests\nUser details\nAuth redirects\n<span class=\"hljs-built_in\">Error<\/span> payloads\nSession-related information\nPrivate page content\nMedical\/customer data\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Be careful when recording:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Production admin pages\nPatient data\nCustomer data\nPayment pages\n<span class=\"hljs-keyword\">Private<\/span> dashboards\nKeycloak sessions\nAPI tokens\nSecrets\nInternal tools\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Best practice:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Use<\/span> <span class=\"hljs-title\">staging<\/span>\/<span class=\"hljs-title\">dev<\/span>\n<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">test<\/span> <span class=\"hljs-title\">users<\/span>\n<span class=\"hljs-title\">Blur<\/span> <span class=\"hljs-title\">sensitive<\/span> <span class=\"hljs-title\">fields<\/span>\n<span class=\"hljs-title\">Delete<\/span> <span class=\"hljs-title\">old<\/span> <span class=\"hljs-title\">reports<\/span>\n<span class=\"hljs-title\">Do<\/span> <span class=\"hljs-title\">not<\/span> <span class=\"hljs-title\">share<\/span> <span class=\"hljs-title\">bug<\/span> <span class=\"hljs-title\">report<\/span> <span class=\"hljs-title\">links<\/span> <span class=\"hljs-title\">publicly<\/span>\n<span class=\"hljs-title\">Disable<\/span> <span class=\"hljs-title\">extensions<\/span> <span class=\"hljs-title\">when<\/span> <span class=\"hljs-title\">not<\/span> <span class=\"hljs-title\">needed<\/span>\n<span class=\"hljs-title\">Avoid<\/span> <span class=\"hljs-title\">recording<\/span> <span class=\"hljs-title\">real<\/span> <span class=\"hljs-title\">customer<\/span>\/<span class=\"hljs-title\">patient<\/span> <span class=\"hljs-title\">data<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is especially important for healthcare, medical, hospital, doctor, fintech, and admin systems.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">25. Common Mistakes to Avoid<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Mistake 1: Asking AI to \u201ccheck browser\u201d without evidence<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Please check browser and fix.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Better:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Here are screenshots, <span class=\"hljs-built_in\">console<\/span> logs, failed requests, and viewport details. Analyze and fix.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Mistake 2: Trusting \u201cdone\u201d without proof<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Do not accept:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Done\nFixed\nTested\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Ask:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">What browser was tested?\nWhich viewport?\nAny <span class=\"hljs-built_in\">console<\/span> errors?\nAny failed network requests?\nWhere is the screenshot?\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Mistake 3: Testing only desktop<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Always test:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Desktop\nTablet\nMobile\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Many UI bugs appear only on mobile.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mistake 4: Using public tools for private pages<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">WebPageTest and PageSpeed Insights are good for public pages.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">They usually cannot test:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">localhost\n<span class=\"hljs-keyword\">private<\/span> staging\nlogged-in pages\nadmin dashboards\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use Playwright or browser extensions for those.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mistake 5: Ignoring console errors<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A page can look visually okay but still have broken JavaScript.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Always check console errors.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mistake 6: Ignoring failed network requests<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A page may load but silently fail APIs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Always check failed requests.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">26. Practical Daily Vibe Coding Workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Here is the workflow I recommend.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Ask AI to implement<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Build\/fix the feature.\nFollow existing project structure.\n<span class=\"hljs-keyword\">Do<\/span> not mark done until browser verification passes.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 2: Run the app<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">npm run dev\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 3: Run browser verification<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">python tools\/browser_check.py\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 4: Review generated output<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">browser-report\/desktop.png\nbrowser-report\/tablet.png\nbrowser-report\/mobile.png\nbrowser-report\/desktop-report.txt\nbrowser-report\/tablet-report.txt\nbrowser-report\/mobile-report.txt\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 5: Give evidence back to AI<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Analyze <span class=\"hljs-keyword\">this<\/span> browser-report folder and fix remaining issues.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 6: Re-run verification<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">python tools\/browser_check.py\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 7: Accept only after evidence is clean<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Accept when:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-38\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Screenshots look correct\nNo <span class=\"hljs-built_in\">console<\/span> errors\nNo failed requests\nMobile layout works\nDesktop layout works\nTablet layout works\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-38\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">27. Final Recommended Workflow by Page Type<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Public marketing website<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">WebPageTest\nPageSpeed Insights\nLighthouse\nJam screenshot if visual issue exists\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Local development page<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Python Playwright + Chromium\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Logged-in dashboard<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Jam extension\nPlaywright <span class=\"hljs-keyword\">with<\/span> login\/session setup\nBrowserStack Bug Capture <span class=\"hljs-keyword\">if<\/span> needed\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Accessibility testing<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">WAVE\naxe DevTools\nLighthouse Accessibility\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Performance optimization<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">WebPageTest\nPageSpeed Insights\nGTmetrix\nDebugBear\nLighthouse\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Visual regression<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Playwright screenshots\nPercy\nBrowserStack visual testing\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">28. Final Tool Recommendation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If I had to choose only three tools, I would choose:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">1. Python Playwright + Chromium\n2. Jam.dev Chrome extension\n3. PageSpeed Insights \/ Lighthouse\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If I had to add two more:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">4. WebPageTest\n5. WAVE or axe DevTools\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This gives almost everything needed for practical vibe coding.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">29. Final Summary<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The core problem is not that Claude or Codex are useless for frontend work.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The problem is that they often do not have enough browser evidence.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The winning approach is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Do<\/span> not ask AI to guess.\nGive AI browser evidence.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-40\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The best evidence includes:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Screenshots\nConsole logs\nNetwork logs\nFailed requests\nViewport details\nPerformance reports\nAccessibility reports\nUser action recordings\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The best free\/local foundation is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Python + Playwright + Chromium\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The best one-click extension workflow is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Jam<\/span><span class=\"hljs-selector-class\">.dev<\/span> <span class=\"hljs-selector-tag\">or<\/span> <span class=\"hljs-selector-tag\">BrowserStack<\/span> <span class=\"hljs-selector-tag\">Bug<\/span> <span class=\"hljs-selector-tag\">Capture<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-41\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The best public website audit workflow is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">WebPageTest + PageSpeed Insights + Lighthouse\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The best accessibility workflow is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">WAVE + axe DevTools\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The most important project rule is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Never mark frontend work <span class=\"hljs-keyword\">as<\/span> done unless browser verification was actually performed.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Once you follow this workflow, Claude\/Codex become much more useful. They stop guessing from code and start fixing based on real browser evidence.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That is the difference between random vibe coding and professional AI-assisted frontend development.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction When I use AI coding tools like Claude, Codex, Cursor, or similar agents, one of the most frustrating problems is this: The AI can read the&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-76969","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/76969","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=76969"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/76969\/revisions"}],"predecessor-version":[{"id":76970,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/76969\/revisions\/76970"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=76969"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=76969"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=76969"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}