<?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: Tusing1</title>
    <description>The latest articles on DEV Community by Tusing1 (@tusing1).</description>
    <link>https://dev.to/tusing1</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%2F4147374%2F40813ec9-bb1e-46d5-8a58-9867b6d77c79.png</url>
      <title>DEV Community: Tusing1</title>
      <link>https://dev.to/tusing1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tusing1"/>
    <language>en</language>
    <item>
      <title>How to Preview and Debug HTML Online Without Installing Anything</title>
      <dc:creator>Tusing1</dc:creator>
      <pubDate>Fri, 09 Oct 2026 11:37:43 +0000</pubDate>
      <link>https://dev.to/tusing1/how-to-preview-and-debug-html-online-without-installing-anything-1mm3</link>
      <guid>https://dev.to/tusing1/how-to-preview-and-debug-html-online-without-installing-anything-1mm3</guid>
      <description>&lt;p&gt;You do not always need a full local development environment to answer the first question about a webpage: &lt;strong&gt;why is this HTML not working?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A browser-based editor can be enough to reproduce a problem, reduce it to a small example and test a correction. This is especially useful on a borrowed computer, a phone or a machine where installing software is not practical.&lt;/p&gt;

&lt;p&gt;I maintain &lt;a href="https://html-onlineviewer.com/" rel="noopener noreferrer"&gt;HTML Online Viewer&lt;/a&gt;, a browser workspace for editing and previewing HTML side by side. Building and testing it helped me turn my own debugging routine into the workflow below. This article was prepared with AI assistance, then reviewed and edited against working examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with one portable HTML file
&lt;/h2&gt;

&lt;p&gt;When a problem involves HTML, CSS and a little JavaScript, put all three into one document first. That removes file paths, build tools and dependency setup from the investigation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Button test&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.75rem&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"greet"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Show greeting&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
      &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#greet&lt;/span&gt;&lt;span class="dl"&gt;'&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If this self-contained version works, the original bug may be in a missing file, an incorrect path, a build step or the order in which scripts load. If it still fails, the problem is now small enough to inspect directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use the smallest reproducible example
&lt;/h2&gt;

&lt;p&gt;Consider this deliberately broken page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Reading list&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
      &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#bbb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;navy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;main&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Reading list&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;No book selected&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"choose"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Choose a book&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
      &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#chosen&lt;/span&gt;&lt;span class="dl"&gt;'&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HTML for Everyone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It contains two separate mistakes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The paragraph ends with another opening &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; instead of &lt;code&gt;&amp;lt;/p&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;JavaScript searches for &lt;code&gt;#chosen&lt;/code&gt;, but the button's ID is &lt;code&gt;choose&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The browser may repair the paragraph automatically, so the page can look almost correct. The button still fails because &lt;code&gt;document.querySelector('#chosen')&lt;/code&gt; returns &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Do not keep adding code while debugging. Remove unrelated markup until the failure is easy to reproduce. A ten-line example that still fails is more useful than a thousand-line page that fails for several reasons.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check HTML structure before styling
&lt;/h2&gt;

&lt;p&gt;Browsers are forgiving. That is helpful for visitors, but it can hide mistakes from developers.&lt;/p&gt;

&lt;p&gt;Before changing CSS, check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;opening and closing tags;&lt;/li&gt;
&lt;li&gt;accidentally nested forms, links or buttons;&lt;/li&gt;
&lt;li&gt;duplicate IDs;&lt;/li&gt;
&lt;li&gt;whether content belongs inside &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;whether important elements are actually present;&lt;/li&gt;
&lt;li&gt;whether quoted attribute values are closed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Formatting the document can make nesting errors easier to see. Validation can point out invalid structure, but treat its messages as evidence to investigate rather than instructions to apply blindly.&lt;/p&gt;

&lt;p&gt;The paragraph above should be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;No book selected&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Test selectors one boundary at a time
&lt;/h2&gt;

&lt;p&gt;When JavaScript does nothing, verify the boundary between the HTML and the script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#choose&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&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="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If either value is &lt;code&gt;null&lt;/code&gt;, fix the selector or markup before inspecting the rest of the function. Then add the interaction:&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="nx"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HTML for Everyone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also confirm that the script runs after the required HTML exists. A script at the end of &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; works for this small example. A script in &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; should normally use &lt;code&gt;defer&lt;/code&gt; or deliberately wait for the document.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the first useful error
&lt;/h2&gt;

&lt;p&gt;One failure can produce several console messages. Start with the earliest message that points to your own code.&lt;/p&gt;

&lt;p&gt;For the broken example, a browser may report an error similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cannot read properties of null (reading 'addEventListener')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Translate it into plain language:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;addEventListener&lt;/code&gt; was called;&lt;/li&gt;
&lt;li&gt;the value before it was &lt;code&gt;null&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;the selector did not find an element.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fix that cause, reload and check again. Later messages may disappear automatically.&lt;/p&gt;

&lt;p&gt;Do not paste secrets, private source code or customer data into a third-party editor or an AI debugging prompt. Reduce the bug with invented data instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check missing assets and relative paths
&lt;/h2&gt;

&lt;p&gt;An online preview has its own document location. Relative paths from a project on your computer may not exist there:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"../images/team.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Our team"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./scripts/app.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a portable test, either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;include CSS and JavaScript directly in the HTML;&lt;/li&gt;
&lt;li&gt;use a public test asset that you control;&lt;/li&gt;
&lt;li&gt;import the related files if the editor supports them; or&lt;/li&gt;
&lt;li&gt;replace the asset temporarily and test the layout's missing-image state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the portable version works, restore the real project paths only after returning to the project's actual folder structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test phone, tablet and desktop widths
&lt;/h2&gt;

&lt;p&gt;A page can be correct at one width and unusable at another. Check at least a narrow phone, a tablet and a desktop layout.&lt;/p&gt;

&lt;p&gt;Look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;horizontal scrolling;&lt;/li&gt;
&lt;li&gt;text or controls extending outside a card;&lt;/li&gt;
&lt;li&gt;fixed widths wider than the viewport;&lt;/li&gt;
&lt;li&gt;images without &lt;code&gt;max-width: 100%&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;buttons that are too small to tap;&lt;/li&gt;
&lt;li&gt;long URLs or code that refuse to wrap.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A useful baseline is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;box-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;border-box&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100%&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="m"&gt;2rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;44rem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;margin-inline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&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;Do not shrink everything until it fits. Find the element causing the overflow and correct its layout rule.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preserve the exact test case
&lt;/h2&gt;

&lt;p&gt;Once the fix works, export or save the self-contained HTML file. Give it a name that describes the behaviour, such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;button-selector-fixed.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That file becomes a regression example. If the same feature breaks later, you already have a known-good version for comparison.&lt;/p&gt;

&lt;p&gt;Import and export are also useful when a long document should not be copied through the clipboard. Confirm that an exported file opens correctly in a normal browser before calling the test complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Know when an online HTML preview is not enough
&lt;/h2&gt;

&lt;p&gt;A browser-only editor is useful for client-side HTML, CSS and JavaScript. It is not a replacement for every development environment.&lt;/p&gt;

&lt;p&gt;Move to the appropriate local or hosted environment when the example needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js or another server runtime;&lt;/li&gt;
&lt;li&gt;PHP, Python, Java or database code;&lt;/li&gt;
&lt;li&gt;private packages or environment variables;&lt;/li&gt;
&lt;li&gt;authentication callbacks;&lt;/li&gt;
&lt;li&gt;unrestricted cross-origin requests;&lt;/li&gt;
&lt;li&gt;a framework build pipeline;&lt;/li&gt;
&lt;li&gt;filesystem or operating-system access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The preview should help identify which boundary the problem crosses. It should not pretend to execute a backend that does not exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  A repeatable browser-only debugging loop
&lt;/h2&gt;

&lt;p&gt;Use this short sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Copy the failing feature into one self-contained HTML file.&lt;/li&gt;
&lt;li&gt;Remove unrelated code while keeping the failure reproducible.&lt;/li&gt;
&lt;li&gt;Format and inspect the document structure.&lt;/li&gt;
&lt;li&gt;Verify selectors and required elements.&lt;/li&gt;
&lt;li&gt;Read the first useful error from your own code.&lt;/li&gt;
&lt;li&gt;Test missing assets and narrow screens.&lt;/li&gt;
&lt;li&gt;Make one small change and preview again.&lt;/li&gt;
&lt;li&gt;Export the known-good example.&lt;/li&gt;
&lt;li&gt;Retest the fix inside the real project.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The corrected example is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Reading list&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;box-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;border-box&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100%&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="m"&gt;2rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;44rem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2rem&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#bbb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;navy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.75rem&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;main&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Reading list&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;No book selected&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"choose"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Choose a book&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#choose&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nx"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HTML for Everyone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can paste this example into any standards-based HTML preview. If you want to try the workflow in the tool I maintain, open &lt;a href="https://html-onlineviewer.com/" rel="noopener noreferrer"&gt;HTML Online Viewer&lt;/a&gt;, change one selector deliberately and observe the failure before applying the fix.&lt;/p&gt;

&lt;p&gt;What is the first thing you check when a webpage renders correctly but its JavaScript does nothing?&lt;/p&gt;

</description>
      <category>html</category>
      <category>webdev</category>
      <category>debugging</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How I Review AI-Generated HTML Before Publishing It</title>
      <dc:creator>Tusing1</dc:creator>
      <pubDate>Tue, 29 Sep 2026 03:58:09 +0000</pubDate>
      <link>https://dev.to/tusing1/how-i-review-ai-generated-html-before-publishing-it-128k</link>
      <guid>https://dev.to/tusing1/how-i-review-ai-generated-html-before-publishing-it-128k</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F448s6o2w10biqyd7o86f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F448s6o2w10biqyd7o86f.png" alt="HTML Online Viewer — useful private browser tools" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI can produce a complete-looking webpage in seconds. That speed is useful, but a page that &lt;em&gt;looks&lt;/em&gt; finished may still contain broken structure, inaccessible images, unsafe links or code you did not intend to run.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://html-onlineviewer.com/" rel="noopener noreferrer"&gt;HTML Online Viewer&lt;/a&gt; because I wanted a quick way to inspect HTML and see its result side by side. While adding an AI Coding Lab to the project, I turned my own review routine into the checklist below. This article was written with AI assistance and then edited, verified and tested by me.&lt;/p&gt;

&lt;p&gt;The goal is not to distrust every generated line. It is to make review small enough that you will actually do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A deliberately imperfect example
&lt;/h2&gt;

&lt;p&gt;Here is a short page containing three problems that are easy to miss when scanning a larger AI response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Community Health Day&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Community Health Day&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Free health checks at the town hall.&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"health-team.jpg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"javascript:alert('Hello')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Reserve a place&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The page may still render, but it is not ready to publish:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The paragraph has another opening &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; where its closing &lt;code&gt;&amp;lt;/p&amp;gt;&lt;/code&gt; should be.&lt;/li&gt;
&lt;li&gt;The image has no &lt;code&gt;alt&lt;/code&gt; description.&lt;/li&gt;
&lt;li&gt;The link executes JavaScript instead of navigating to a clear destination.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 1: keep the first preview isolated
&lt;/h2&gt;

&lt;p&gt;Do not paste unfamiliar HTML into an important production page first. Open it in a separate preview whose frame is sandboxed. This limits what the preview can do to the surrounding application.&lt;/p&gt;

&lt;p&gt;A sandbox is a safety boundary, not a guarantee. If the code depends on third-party scripts, forms, logins or private data, read those parts before enabling them. Never paste passwords, API keys or customer information into code you did not fully review.&lt;/p&gt;

&lt;p&gt;In HTML Online Viewer, paste the document into the editor and use the live preview. The tool runs the preview in an isolated frame and keeps ordinary editing in your browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: check document structure before styling
&lt;/h2&gt;

&lt;p&gt;Start at the top and confirm the page has the essential document pieces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;A useful, specific page title&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Visible page content --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then follow opening and closing tags. Indentation helps reveal whether an element closes in the place you expect. A formatter is useful here, but do not assume that formatting has repaired the meaning of the document.&lt;/p&gt;

&lt;p&gt;For the broken example, change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Free health checks at the town hall.&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Free health checks at the town hall.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: inspect every URL and executable section
&lt;/h2&gt;

&lt;p&gt;Search for these strings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script
javascript:
onclick=
onerror=
iframe
form
fetch(
localStorage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;None is automatically malicious. Each one simply deserves an explanation.&lt;/p&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which domain does this script, image, form or frame contact?&lt;/li&gt;
&lt;li&gt;Does a click run code that the visible label does not explain?&lt;/li&gt;
&lt;li&gt;Does the page read or store information?&lt;/li&gt;
&lt;li&gt;Would the feature still work with the third-party code removed?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Replace the example’s JavaScript link with a real route:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/reserve"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Reserve a place&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If there is no reservation page yet, use an ordinary button only when JavaScript will provide a clearly defined action. Do not leave a link that pretends to navigate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: perform a keyboard and meaning check
&lt;/h2&gt;

&lt;p&gt;AI-generated pages often favour visual appearance over semantics. Before judging colours or spacing, check the reading structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There should normally be one clear &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; for the page.&lt;/li&gt;
&lt;li&gt;Heading levels should describe sections, not merely create large text.&lt;/li&gt;
&lt;li&gt;Interactive actions should use links or buttons, not clickable &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; elements.&lt;/li&gt;
&lt;li&gt;Form controls need visible labels.&lt;/li&gt;
&lt;li&gt;Images need useful &lt;code&gt;alt&lt;/code&gt; text when they communicate meaning.&lt;/li&gt;
&lt;li&gt;Decorative images should use &lt;code&gt;alt=""&lt;/code&gt; so a screen reader can skip them.&lt;/li&gt;
&lt;li&gt;Focus should remain visible when you move with the Tab key.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the example, add an alternative description that conveys the image’s purpose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"health-team.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Nurses welcoming visitors at a community health event"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then use only the keyboard to move through every control. Confirm that focus order matches the visual order and that every action can be reached and understood.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: test narrow screens, missing assets and long content
&lt;/h2&gt;

&lt;p&gt;A polished desktop preview is not enough. Check at least:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a narrow phone width;&lt;/li&gt;
&lt;li&gt;a tablet width;&lt;/li&gt;
&lt;li&gt;a wide desktop width;&lt;/li&gt;
&lt;li&gt;200% browser zoom;&lt;/li&gt;
&lt;li&gt;a deliberately long heading;&lt;/li&gt;
&lt;li&gt;an unavailable image;&lt;/li&gt;
&lt;li&gt;a slow or blocked external resource.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Look for horizontal scrolling, clipped buttons, overlapping text and controls that become too small to tap. The browser console may also reveal a missing image or script that the visible design hides.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: validate behaviour, not just appearance
&lt;/h2&gt;

&lt;p&gt;Open every link. Submit every form with valid and invalid input. Trigger empty states. Reload the page. If a feature stores data, explain where that data goes and test what happens when storage is unavailable.&lt;/p&gt;

&lt;p&gt;For generated JavaScript, read the code path that runs &lt;em&gt;before&lt;/em&gt; you press the button. A pleasant label such as “Generate report” does not tell you whether the code downloads a file, sends data to a service or both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: make one controlled fix at a time
&lt;/h2&gt;

&lt;p&gt;Large AI rewrites can solve one problem while introducing another. Prefer a short loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Describe one observable problem.&lt;/li&gt;
&lt;li&gt;Change the smallest relevant section.&lt;/li&gt;
&lt;li&gt;Preview again.&lt;/li&gt;
&lt;li&gt;Repeat the same keyboard, mobile and error checks.&lt;/li&gt;
&lt;li&gt;Save a working version before the next change.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The corrected example becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Community Health Day&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Community Health Day&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Free health checks at the town hall.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt;
        &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"health-team.jpg"&lt;/span&gt;
        &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Nurses welcoming visitors at a community health event"&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/reserve"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Reserve a place&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  My pre-publish checklist
&lt;/h2&gt;

&lt;p&gt;I use this short list before an AI-assisted page leaves a preview:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] I understand every external URL and script.&lt;/li&gt;
&lt;li&gt;[ ] The document has a doctype, language, charset, viewport and useful title.&lt;/li&gt;
&lt;li&gt;[ ] Opening and closing tags match.&lt;/li&gt;
&lt;li&gt;[ ] The heading order communicates the page structure.&lt;/li&gt;
&lt;li&gt;[ ] Images have appropriate alternative text.&lt;/li&gt;
&lt;li&gt;[ ] Links and buttons describe what they do.&lt;/li&gt;
&lt;li&gt;[ ] Keyboard focus reaches every interactive control.&lt;/li&gt;
&lt;li&gt;[ ] Phone, tablet, desktop and zoom layouts do not overflow.&lt;/li&gt;
&lt;li&gt;[ ] Empty, invalid and missing-asset states make sense.&lt;/li&gt;
&lt;li&gt;[ ] No secrets or private data are embedded in the source.&lt;/li&gt;
&lt;li&gt;[ ] I tested the final version after the last change.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this workflow cannot prove
&lt;/h2&gt;

&lt;p&gt;A browser preview and syntax check cannot guarantee that a page is secure, accessible or correct. Server code, dependencies, authentication, payment flows, data handling and organisation-specific policies need their own review. Automated accessibility tools also miss problems that only a person completing the real task will notice.&lt;/p&gt;

&lt;p&gt;Use the checklist as a strong first review—not as a substitute for appropriate security, accessibility or domain expertise.&lt;/p&gt;

&lt;p&gt;If you want a browser workspace for the steps above, use the &lt;a href="https://html-onlineviewer.com/" rel="noopener noreferrer"&gt;HTML editor and live preview&lt;/a&gt; or follow the longer canonical guide, &lt;a href="https://html-onlineviewer.com/guides/ai-coding/preview-ai-generated-html-safely" rel="noopener noreferrer"&gt;Preview AI-generated HTML safely&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What is the most surprising mistake you have found in generated frontend code?&lt;/p&gt;

</description>
      <category>html</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
