<?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: Neurobin</title>
    <description>The latest articles on DEV Community by Neurobin (@neurobin_).</description>
    <link>https://dev.to/neurobin_</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%2F4000435%2Fbb974a91-866b-4fbc-a2f8-d1c41049dee0.png</url>
      <title>DEV Community: Neurobin</title>
      <link>https://dev.to/neurobin_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/neurobin_"/>
    <language>en</language>
    <item>
      <title>Claude Code Artifacts vs Independent Preview URLs: Which One Should You Use?</title>
      <dc:creator>Neurobin</dc:creator>
      <pubDate>Tue, 04 Aug 2026 03:30:29 +0000</pubDate>
      <link>https://dev.to/neurobin_/claude-code-artifacts-vs-independent-preview-urls-which-one-should-you-use-b2m</link>
      <guid>https://dev.to/neurobin_/claude-code-artifacts-vs-independent-preview-urls-which-one-should-you-use-b2m</guid>
      <description>&lt;p&gt;Claude Code can now publish native Artifacts.&lt;/p&gt;

&lt;p&gt;That changes an important part of the “AI generated HTML → shareable URL” workflow.&lt;/p&gt;

&lt;p&gt;The honest question is no longer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How can Claude output become a URL?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Should this output stay a Claude Artifact, or should it become an independent static preview?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Both are useful. They solve different jobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use a native Claude Artifact when
&lt;/h2&gt;

&lt;p&gt;A native Artifact is a strong fit when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude is generating one self-contained HTML or Markdown page&lt;/li&gt;
&lt;li&gt;the page belongs to the current Claude session&lt;/li&gt;
&lt;li&gt;you want the Artifact to update as the session continues&lt;/li&gt;
&lt;li&gt;the sharing controls available to your plan or organization fit the audience&lt;/li&gt;
&lt;li&gt;the page works within Claude’s documented Content Security Policy and size constraints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the shortest route when the thing you want to share is naturally a Claude-session artifact.&lt;/p&gt;

&lt;p&gt;You do not need to export and redeploy every page just because another hosting workflow exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use an independent preview URL when
&lt;/h2&gt;

&lt;p&gt;An independent static preview is a better fit when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the HTML file already exists on disk&lt;/li&gt;
&lt;li&gt;the page references local CSS, images, JavaScript, or fonts&lt;/li&gt;
&lt;li&gt;the output is a folder or ZIP, not one self-contained page&lt;/li&gt;
&lt;li&gt;Claude generated a React/Vue/Vite project that must be built first&lt;/li&gt;
&lt;li&gt;an MCP tool or CLI should deploy the build and return the URL&lt;/li&gt;
&lt;li&gt;the review link should be independent from the Claude session&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The unit of deployment is different.&lt;/p&gt;

&lt;p&gt;A native Artifact starts from the Claude session.&lt;/p&gt;

&lt;p&gt;An independent preview starts from a browser-ready artifact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;report.html
index.html + assets/
dist/
build/
out/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The constraints are part of the decision
&lt;/h2&gt;

&lt;p&gt;Claude’s official documentation describes native Artifacts as a single page with a strict CSP.&lt;/p&gt;

&lt;p&gt;That is a useful safety boundary.&lt;/p&gt;

&lt;p&gt;It also means you should check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether the page loads external scripts, fonts, images, or APIs&lt;/li&gt;
&lt;li&gt;whether it needs a backend&lt;/li&gt;
&lt;li&gt;whether it has multiple routes&lt;/li&gt;
&lt;li&gt;whether the rendered page exceeds the documented size limit&lt;/li&gt;
&lt;li&gt;whether connector-backed data can be shared with the intended audience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those constraints fit, native Artifacts are convenient.&lt;/p&gt;

&lt;p&gt;If the output is a normal static site or framework build, an independent static preview is usually a more natural representation.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical decision table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;Recommended path&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One self-contained page created in the session&lt;/td&gt;
&lt;td&gt;Native Claude Artifact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A local &lt;code&gt;/home/claude/repo/index.html&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Upload/deploy the file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;index.html&lt;/code&gt; plus local assets&lt;/td&gt;
&lt;td&gt;Deploy the static folder or ZIP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;React/Vue/Vite source&lt;/td&gt;
&lt;td&gt;Build first, deploy &lt;code&gt;dist&lt;/code&gt;/&lt;code&gt;build&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend application&lt;/td&gt;
&lt;td&gt;Production application platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent must deploy and return a URL&lt;/td&gt;
&lt;td&gt;MCP or CLI preview workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Prompt Claude for the complete workflow
&lt;/h2&gt;

&lt;p&gt;If you want Claude Code to own the independent preview step, avoid a vague “deploy it” prompt.&lt;/p&gt;

&lt;p&gt;Use something testable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Run the production build, identify the browser-ready output folder,
deploy that output with PreviewShip, open the returned URL to verify it,
and include the live link in your final response.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That prompt encodes four important behaviors:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;build source code&lt;/li&gt;
&lt;li&gt;select the correct artifact&lt;/li&gt;
&lt;li&gt;deploy it&lt;/li&gt;
&lt;li&gt;verify the result&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The URL alone is not proof that the page works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where PreviewShip fits
&lt;/h2&gt;

&lt;p&gt;PreviewShip is for the independent-preview side of this decision.&lt;/p&gt;

&lt;p&gt;It publishes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one HTML file&lt;/li&gt;
&lt;li&gt;pasted HTML&lt;/li&gt;
&lt;li&gt;Markdown or PDF&lt;/li&gt;
&lt;li&gt;a ZIP/static folder&lt;/li&gt;
&lt;li&gt;framework build output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also has CLI, MCP, VS Code, and Cursor paths so the deploy can happen inside a development workflow.&lt;/p&gt;

&lt;p&gt;The updated guide includes the native Artifact comparison and constraints:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://previewship.com/guides/share-claude-html-artifacts?utm_source=devto&amp;amp;utm_medium=community&amp;amp;utm_campaign=core_content_cluster_0727" rel="noopener noreferrer"&gt;https://previewship.com/guides/share-claude-html-artifacts?utm_source=devto&amp;amp;utm_medium=community&amp;amp;utm_campaign=core_content_cluster_0727&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The useful takeaway is not that one option replaces the other.&lt;/p&gt;

&lt;p&gt;It is that sharing works best when the hosting surface matches the shape of the artifact.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>webdev</category>
      <category>mcp</category>
    </item>
    <item>
      <title>How to Upload an HTML File to a Website Without Git, FTP, or a Server</title>
      <dc:creator>Neurobin</dc:creator>
      <pubDate>Tue, 28 Jul 2026 06:47:29 +0000</pubDate>
      <link>https://dev.to/neurobin_/how-to-upload-an-html-file-to-a-website-without-git-ftp-or-a-server-pmm</link>
      <guid>https://dev.to/neurobin_/how-to-upload-an-html-file-to-a-website-without-git-ftp-or-a-server-pmm</guid>
      <description>&lt;p&gt;Uploading an HTML file to “a website” sounds like one job.&lt;/p&gt;

&lt;p&gt;In practice, it can mean three different things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;publish one self-contained HTML file&lt;/li&gt;
&lt;li&gt;publish HTML with local CSS, JavaScript, images, or fonts&lt;/li&gt;
&lt;li&gt;publish the output of a React, Vue, Vite, or other framework project&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The correct workflow depends on which artifact you actually have.&lt;/p&gt;

&lt;p&gt;That distinction matters because many failed static deployments come from uploading source code when the host expects browser-ready output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Case 1: one self-contained HTML file
&lt;/h2&gt;

&lt;p&gt;If your page is one complete &lt;code&gt;.html&lt;/code&gt; document, you do not need to create a repository or ZIP just to share it.&lt;/p&gt;

&lt;p&gt;A browser-ready file normally contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;an &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; element&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; metadata&lt;/li&gt;
&lt;li&gt;a &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;inline CSS/JavaScript, or external resources that the browser can reach&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open the file locally first.&lt;/p&gt;

&lt;p&gt;If it renders correctly, the publishing workflow can be as short as:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;upload the &lt;code&gt;.html&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;wait for the static deploy&lt;/li&gt;
&lt;li&gt;open the returned HTTPS URL&lt;/li&gt;
&lt;li&gt;share it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is useful for AI-generated landing pages, reports, dashboards, calculators, design proofs, and one-file demos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Case 2: HTML with local assets
&lt;/h2&gt;

&lt;p&gt;An HTML file is not self-contained when it references files 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;./styles.css
./assets/logo.png
./scripts/app.js
./fonts/inter.woff2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uploading only &lt;code&gt;index.html&lt;/code&gt; will leave those paths unresolved.&lt;/p&gt;

&lt;p&gt;Package the full static structure instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;site/
├── index.html
├── styles.css
├── scripts/
│   └── app.js
└── assets/
    └── logo.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Upload the folder or a ZIP that preserves the same relative paths.&lt;/p&gt;

&lt;p&gt;Two details cause a surprising number of failures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Logo.png&lt;/code&gt; and &lt;code&gt;logo.png&lt;/code&gt; are different filenames on many hosts.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;index.html&lt;/code&gt; must be at the entry point the host expects, not hidden under an extra nested directory.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Case 3: a framework source project
&lt;/h2&gt;

&lt;p&gt;A folder with &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;src&lt;/code&gt;, and &lt;code&gt;node_modules&lt;/code&gt; is usually not a website that a static host can serve directly.&lt;/p&gt;

&lt;p&gt;It is source code.&lt;/p&gt;

&lt;p&gt;Build it first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then deploy the generated static output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dist/
build/
out/
public/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact directory depends on the framework and configuration.&lt;/p&gt;

&lt;p&gt;Before deploying, confirm that the output contains &lt;code&gt;index.html&lt;/code&gt; and the assets needed by that file.&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple decision tree
&lt;/h2&gt;

&lt;p&gt;Use this rule:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One complete &lt;code&gt;.html&lt;/code&gt; file → upload the file directly.&lt;/li&gt;
&lt;li&gt;HTML plus local assets → upload a static folder or ZIP.&lt;/li&gt;
&lt;li&gt;React/Vue/Vite/Next source → build first, then upload the output.&lt;/li&gt;
&lt;li&gt;Backend, database, authentication, or server routes → use a production application platform.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Preview hosting and production hosting are different jobs.&lt;/p&gt;

&lt;p&gt;A preview URL is ideal when the immediate goal is review, QA, client approval, or sharing an AI-generated artifact.&lt;/p&gt;

&lt;p&gt;It is not a substitute for a production release process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting a blank page
&lt;/h2&gt;

&lt;p&gt;If the URL loads but the page is blank:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;open browser developer tools&lt;/li&gt;
&lt;li&gt;check the Console&lt;/li&gt;
&lt;li&gt;check Network for 404 responses&lt;/li&gt;
&lt;li&gt;confirm &lt;code&gt;index.html&lt;/code&gt; exists&lt;/li&gt;
&lt;li&gt;confirm asset paths and filename case&lt;/li&gt;
&lt;li&gt;for framework apps, check the configured base path&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you uploaded source code, go back and deploy the build output.&lt;/p&gt;

&lt;p&gt;Hosting cannot infer the build process of every framework from a random source ZIP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Publishing with PreviewShip
&lt;/h2&gt;

&lt;p&gt;I built PreviewShip for the narrow “browser-ready artifact in, review URL out” workflow.&lt;/p&gt;

&lt;p&gt;It supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;direct HTML upload&lt;/li&gt;
&lt;li&gt;pasted HTML&lt;/li&gt;
&lt;li&gt;Markdown and PDF files&lt;/li&gt;
&lt;li&gt;ZIP/static folders&lt;/li&gt;
&lt;li&gt;CLI deployment&lt;/li&gt;
&lt;li&gt;MCP deployment from AI coding agents&lt;/li&gt;
&lt;li&gt;VS Code and Cursor workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The detailed upload guide is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://previewship.com/guides/upload-html-file-to-website?utm_source=devto&amp;amp;utm_medium=community&amp;amp;utm_campaign=core_content_cluster_0727" rel="noopener noreferrer"&gt;https://previewship.com/guides/upload-html-file-to-website?utm_source=devto&amp;amp;utm_medium=community&amp;amp;utm_campaign=core_content_cluster_0727&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The useful mental model is not “How do I upload my repository?”&lt;/p&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is the smallest browser-ready artifact that preserves the page correctly?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once that artifact exists, turning it into a shareable URL should be the easy part.&lt;/p&gt;

</description>
      <category>html</category>
      <category>webdev</category>
      <category>deployment</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>AI Coding Conversations Are Becoming Build Artifacts</title>
      <dc:creator>Neurobin</dc:creator>
      <pubDate>Wed, 22 Jul 2026 03:45:04 +0000</pubDate>
      <link>https://dev.to/neurobin_/ai-coding-conversations-are-becoming-build-artifacts-488h</link>
      <guid>https://dev.to/neurobin_/ai-coding-conversations-are-becoming-build-artifacts-488h</guid>
      <description>&lt;p&gt;AI coding tools made it easier to create code.&lt;/p&gt;

&lt;p&gt;They also created a new handoff problem.&lt;/p&gt;

&lt;p&gt;The final code is often not the only useful artifact anymore. The conversation around the code can matter just as much.&lt;/p&gt;

&lt;p&gt;It contains the reasoning trail:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what the agent changed&lt;/li&gt;
&lt;li&gt;what failed&lt;/li&gt;
&lt;li&gt;which files were touched&lt;/li&gt;
&lt;li&gt;which commands were run&lt;/li&gt;
&lt;li&gt;why one implementation path was chosen over another&lt;/li&gt;
&lt;li&gt;what context the human provided&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are reviewing a pull request, debugging a production issue, or handing work to a teammate, that context can be more useful than a screenshot or a short summary.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with screenshots
&lt;/h2&gt;

&lt;p&gt;Screenshots are easy, but they are weak archives.&lt;/p&gt;

&lt;p&gt;They lose order. They lose copyable text. They hide tool activity. They make code diffs hard to inspect. They also turn a useful technical trail into a flat image.&lt;/p&gt;

&lt;p&gt;Copy-pasting the whole chat is not much better.&lt;/p&gt;

&lt;p&gt;Long transcripts are hard to read, especially when they include tool output, terminal logs, repeated status messages, and irrelevant implementation noise.&lt;/p&gt;

&lt;p&gt;What I want in this workflow is simpler:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;a readable page for the parts of the AI coding conversation that are safe and useful to share.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Codex case
&lt;/h2&gt;

&lt;p&gt;For Codex, the useful artifact is often the visible conversation itself.&lt;/p&gt;

&lt;p&gt;The user asked for a change. Codex reasoned through the task, edited files, summarized changes, and returned the result.&lt;/p&gt;

&lt;p&gt;When that conversation needs to be shared, the clean handoff is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;render the visible Codex conversation as an HTML transcript&lt;/li&gt;
&lt;li&gt;keep the UI readable&lt;/li&gt;
&lt;li&gt;preserve user messages, assistant replies, file cards, and visible change summaries&lt;/li&gt;
&lt;li&gt;deploy the transcript as a shareable URL&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is what &lt;code&gt;share-codex-chat&lt;/code&gt; is designed to do.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add blockdancez/PreviewShip &lt;span class="nt"&gt;--skill&lt;/span&gt; share-codex-chat &lt;span class="nt"&gt;-a&lt;/span&gt; codex &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="nt"&gt;--yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use in Codex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$share-codex-chat 分享当前 Codex 对话
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://previewship.com/docs/share-codex-chat?utm_source=devto&amp;amp;utm_medium=community&amp;amp;utm_campaign=share_chat_skills_0708" rel="noopener noreferrer"&gt;https://previewship.com/docs/share-codex-chat?utm_source=devto&amp;amp;utm_medium=community&amp;amp;utm_campaign=share_chat_skills_0708&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Claude Code case
&lt;/h2&gt;

&lt;p&gt;Claude Code has a different storage model. Local conversations live under &lt;code&gt;~/.claude/projects&lt;/code&gt; as JSONL session records.&lt;/p&gt;

&lt;p&gt;That means a good exporter needs to do more than print the raw file.&lt;/p&gt;

&lt;p&gt;It should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;read the local session&lt;/li&gt;
&lt;li&gt;skip subagent noise when selecting the current session&lt;/li&gt;
&lt;li&gt;render visible user and assistant messages&lt;/li&gt;
&lt;li&gt;show safe tool activity summaries&lt;/li&gt;
&lt;li&gt;hide hidden thinking text&lt;/li&gt;
&lt;li&gt;hide raw tool output&lt;/li&gt;
&lt;li&gt;ignore attachment bodies and file-history snapshots&lt;/li&gt;
&lt;li&gt;redact API keys, environment variables, and secret-looking values&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is what &lt;code&gt;share-claude-code-chat&lt;/code&gt; is designed to do.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add blockdancez/PreviewShip &lt;span class="nt"&gt;--skill&lt;/span&gt; share-claude-code-chat &lt;span class="nt"&gt;-a&lt;/span&gt; codex &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="nt"&gt;--yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$share-claude-code-chat 分享 Claude Code 对话
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://previewship.com/docs/share-claude-code-chat?utm_source=devto&amp;amp;utm_medium=community&amp;amp;utm_campaign=share_chat_skills_0708" rel="noopener noreferrer"&gt;https://previewship.com/docs/share-claude-code-chat?utm_source=devto&amp;amp;utm_medium=community&amp;amp;utm_campaign=share_chat_skills_0708&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When this is useful
&lt;/h2&gt;

&lt;p&gt;I would not use this for every AI chat.&lt;/p&gt;

&lt;p&gt;Most conversations are not worth publishing.&lt;/p&gt;

&lt;p&gt;But it becomes useful when the process itself needs to be reviewable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PR handoffs&lt;/li&gt;
&lt;li&gt;debugging notes&lt;/li&gt;
&lt;li&gt;implementation records&lt;/li&gt;
&lt;li&gt;incident follow-ups&lt;/li&gt;
&lt;li&gt;async teammate context&lt;/li&gt;
&lt;li&gt;customer issue reproduction&lt;/li&gt;
&lt;li&gt;technical decisions that need a trail&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In those cases, a readable conversation page can be better than a screenshot, a Slack paste, or a hand-written summary.&lt;/p&gt;

&lt;h2&gt;
  
  
  The privacy boundary
&lt;/h2&gt;

&lt;p&gt;The boundary matters.&lt;/p&gt;

&lt;p&gt;Do not publish private code, customer data, credentials, or sensitive internal context just because a transcript can be generated.&lt;/p&gt;

&lt;p&gt;The renderer should filter hidden and unsafe material, but the human should still inspect the output before sharing it.&lt;/p&gt;

&lt;p&gt;For me, that is the right model:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;local render first&lt;/li&gt;
&lt;li&gt;verify the page&lt;/li&gt;
&lt;li&gt;deploy only when the transcript is safe to share&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The bigger shift
&lt;/h2&gt;

&lt;p&gt;AI coding changes what counts as a work artifact.&lt;/p&gt;

&lt;p&gt;The code still matters.&lt;/p&gt;

&lt;p&gt;The preview still matters.&lt;/p&gt;

&lt;p&gt;But the conversation around the code can become part of the handoff too.&lt;/p&gt;

&lt;p&gt;Not always.&lt;/p&gt;

&lt;p&gt;But often enough that it deserves a better format than screenshots.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>tooling</category>
      <category>productivity</category>
    </item>
    <item>
      <title>AI Coding Agents Should Return Preview URLs, Not Just Code</title>
      <dc:creator>Neurobin</dc:creator>
      <pubDate>Fri, 17 Jul 2026 02:28:03 +0000</pubDate>
      <link>https://dev.to/neurobin_/ai-coding-agents-should-return-preview-urls-not-just-code-29f9</link>
      <guid>https://dev.to/neurobin_/ai-coding-agents-should-return-preview-urls-not-just-code-29f9</guid>
      <description>&lt;p&gt;AI coding agents are getting better at creating frontend artifacts.&lt;/p&gt;

&lt;p&gt;They can write a React component, build a Vite app, generate a dashboard, produce a static report, or create a single HTML prototype.&lt;/p&gt;

&lt;p&gt;But many workflows still end with the same incomplete handoff:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Here is the code.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is useful, but it is not always enough.&lt;/p&gt;

&lt;p&gt;For frontend work, the thing people need to review is often not the code. It is the rendered result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code is not the review surface
&lt;/h2&gt;

&lt;p&gt;If an agent creates a small UI, report, or prototype, the reviewer usually wants to answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does it open in the browser?&lt;/li&gt;
&lt;li&gt;Does the layout work?&lt;/li&gt;
&lt;li&gt;Does it resize correctly?&lt;/li&gt;
&lt;li&gt;Do the links and buttons behave?&lt;/li&gt;
&lt;li&gt;Is this direction worth continuing?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are browser questions, not source-code questions.&lt;/p&gt;

&lt;p&gt;A better agent handoff is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I built it and deployed a preview here.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That one sentence changes the shape of the workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP makes this pattern natural
&lt;/h2&gt;

&lt;p&gt;MCP is useful because it lets an agent call a tool as part of the work.&lt;/p&gt;

&lt;p&gt;For static frontend artifacts, the tool can be very simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;take a built folder or HTML file&lt;/li&gt;
&lt;li&gt;upload it to static preview hosting&lt;/li&gt;
&lt;li&gt;return a URL&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The user does not need to leave the coding environment just to package files and open a hosting dashboard.&lt;/p&gt;

&lt;p&gt;That is the reason I built &lt;code&gt;previewship-mcp&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/previewship-mcp" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/previewship-mcp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The MCP server supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;built React/Vue/Vite/Next static output&lt;/li&gt;
&lt;li&gt;single &lt;code&gt;.html&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;Markdown files&lt;/li&gt;
&lt;li&gt;AI-generated HTML artifacts&lt;/li&gt;
&lt;li&gt;fixed PreviewShip project URLs&lt;/li&gt;
&lt;li&gt;project list/delete/redeploy/rollback/access controls&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A typical prompt
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build the app, deploy the generated dist folder with PreviewShip, and return the preview URL.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Save this generated HTML as index.html, deploy it with PreviewShip, and send me the live URL.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important bit is that the agent returns the rendered artifact, not only the source.&lt;/p&gt;

&lt;h2&gt;
  
  
  The limits are important
&lt;/h2&gt;

&lt;p&gt;This pattern is for static preview artifacts.&lt;/p&gt;

&lt;p&gt;It should not be used as a shortcut around production releases, security review, backend deployment, or access control.&lt;/p&gt;

&lt;p&gt;For a real application, you still want normal infrastructure.&lt;/p&gt;

&lt;p&gt;But for a draft, a report, a static prototype, a one-file HTML page, or an AI-generated UI preview, a static URL is often the fastest useful handoff.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I care about fixed URLs
&lt;/h2&gt;

&lt;p&gt;Preview links end up in issue comments, Slack threads, docs, and client conversations.&lt;/p&gt;

&lt;p&gt;If every iteration creates a completely different URL, people lose track of which link is current.&lt;/p&gt;

&lt;p&gt;Fixed project URLs make iteration easier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one project link&lt;/li&gt;
&lt;li&gt;many deployments behind it&lt;/li&gt;
&lt;li&gt;latest preview stays easy to share&lt;/li&gt;
&lt;li&gt;rollback remains possible when retained versions exist&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That makes agent-generated frontend work feel more like a reviewable artifact and less like a disposable code blob.&lt;/p&gt;

&lt;p&gt;The broader principle is simple:&lt;/p&gt;

&lt;p&gt;When an AI agent creates something visual, make the output reviewable in the medium where it will be used.&lt;/p&gt;

&lt;p&gt;For web artifacts, that medium is the browser.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>webdev</category>
      <category>tooling</category>
    </item>
    <item>
      <title>A Small Netlify Drop Alternative for One HTML File or ZIP</title>
      <dc:creator>Neurobin</dc:creator>
      <pubDate>Mon, 13 Jul 2026 03:00:20 +0000</pubDate>
      <link>https://dev.to/neurobin_/a-small-netlify-drop-alternative-for-one-html-file-or-zip-3bmn</link>
      <guid>https://dev.to/neurobin_/a-small-netlify-drop-alternative-for-one-html-file-or-zip-3bmn</guid>
      <description>&lt;p&gt;There is a surprisingly durable workflow in web development:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I have a static thing. I need a URL.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That “static thing” might be a single HTML file, a ZIP, a generated report, a design export, a small prototype, or a built &lt;code&gt;dist&lt;/code&gt; folder.&lt;/p&gt;

&lt;p&gt;For full applications, a deployment platform is the right answer. But for a one-off static preview, a full production pipeline can feel heavier than the task.&lt;/p&gt;

&lt;p&gt;This is why drag-and-drop static hosting workflows have always been useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  The job to be done
&lt;/h2&gt;

&lt;p&gt;The job is not “deploy my company website”.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;publish one HTML file&lt;/li&gt;
&lt;li&gt;publish a ZIP that already contains &lt;code&gt;index.html&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;share a quick prototype&lt;/li&gt;
&lt;li&gt;let a client open a preview&lt;/li&gt;
&lt;li&gt;send a QA link&lt;/li&gt;
&lt;li&gt;show an AI-generated page to someone else&lt;/li&gt;
&lt;li&gt;avoid setting up a repo, CI, DNS, or production hosting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The output should be a URL.&lt;/p&gt;

&lt;p&gt;That is it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the old pattern falls short
&lt;/h2&gt;

&lt;p&gt;The older drag-and-drop pattern is still useful, but modern workflows have changed.&lt;/p&gt;

&lt;p&gt;More previews are now generated by AI tools. More developers work inside Cursor, Claude Code, Codex-style environments, or other agent workflows. More artifacts start as a single HTML file rather than a full application.&lt;/p&gt;

&lt;p&gt;That means the preview tool should support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one HTML file&lt;/li&gt;
&lt;li&gt;pasted HTML&lt;/li&gt;
&lt;li&gt;Markdown&lt;/li&gt;
&lt;li&gt;built frontend output&lt;/li&gt;
&lt;li&gt;CLI usage&lt;/li&gt;
&lt;li&gt;editor usage&lt;/li&gt;
&lt;li&gt;agent/MCP usage&lt;/li&gt;
&lt;li&gt;stable URLs for repeated review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The stable URL part matters. Review links are often shared in issues, chats, docs, and client threads. If every deploy produces an unrelated URL, the conversation gets messy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The boundary
&lt;/h2&gt;

&lt;p&gt;A static preview tool should not pretend to be a full app platform.&lt;/p&gt;

&lt;p&gt;It should not build private backend systems. It should not run server code. It should not replace a production release process.&lt;/p&gt;

&lt;p&gt;The clean boundary is:&lt;/p&gt;

&lt;p&gt;Use it when the output is browser-ready static content.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dist/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;build/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;out/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;public/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Markdown that can be rendered as a page&lt;/li&gt;
&lt;li&gt;ZIPs with static assets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not use it for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authenticated production apps&lt;/li&gt;
&lt;li&gt;backend services&lt;/li&gt;
&lt;li&gt;raw source folders that still need dependencies installed&lt;/li&gt;
&lt;li&gt;anything that needs database access&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My implementation
&lt;/h2&gt;

&lt;p&gt;I built PreviewShip as a focused static preview workflow:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://previewship.com/guides/netlify-drop-alternative-for-html-file?utm_source=devto&amp;amp;utm_medium=community&amp;amp;utm_campaign=external_links_0706" rel="noopener noreferrer"&gt;https://previewship.com/guides/netlify-drop-alternative-for-html-file?utm_source=devto&amp;amp;utm_medium=community&amp;amp;utm_campaign=external_links_0706&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It supports browser upload, pasted HTML, CLI deploys, VS Code/Cursor deploys, and MCP deploys from AI coding agents.&lt;/p&gt;

&lt;p&gt;The positioning is intentionally narrow: not “host everything”, but “turn browser-ready artifacts into reviewable URLs quickly”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this still matters
&lt;/h2&gt;

&lt;p&gt;AI is making static artifacts more common, not less.&lt;/p&gt;

&lt;p&gt;A product manager may ask for a quick HTML report. A designer may export a static mockup. A developer may ask Claude for a prototype. A coding agent may build a small Vite app and need to show the result.&lt;/p&gt;

&lt;p&gt;In all of those cases, the next question is the same:&lt;/p&gt;

&lt;p&gt;How do I share it?&lt;/p&gt;

&lt;p&gt;The answer should not always be “set up a repo and deploy a production app”.&lt;/p&gt;

&lt;p&gt;Sometimes the right answer is simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;publish the static artifact and send the URL.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>webdev</category>
      <category>html</category>
      <category>productivity</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Turn a Claude HTML Artifact Into a Shareable URL</title>
      <dc:creator>Neurobin</dc:creator>
      <pubDate>Mon, 06 Jul 2026 10:06:46 +0000</pubDate>
      <link>https://dev.to/neurobin_/turn-a-claude-html-artifact-into-a-shareable-url-7d</link>
      <guid>https://dev.to/neurobin_/turn-a-claude-html-artifact-into-a-shareable-url-7d</guid>
      <description>&lt;p&gt;Claude and other AI coding tools are very good at producing small HTML artifacts.&lt;/p&gt;

&lt;p&gt;You can ask for a dashboard, a pricing table, a report, a visual prototype, a tiny internal tool, or a landing page draft. In a few seconds you often have something that is good enough to inspect.&lt;/p&gt;

&lt;p&gt;But the moment you want another person to review it, the workflow gets strangely clunky.&lt;/p&gt;

&lt;p&gt;You can send a screenshot, but a screenshot removes the most important part of the artifact: the fact that it is interactive HTML.&lt;/p&gt;

&lt;p&gt;You can paste the code into Slack or a GitHub issue, but then the reviewer has to copy it, save it, open it, and hope every asset still works.&lt;/p&gt;

&lt;p&gt;You can create a repository and deploy it through a normal hosting platform, but that can be too much ceremony for a one-off artifact.&lt;/p&gt;

&lt;p&gt;The simpler pattern is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;save the generated HTML as &lt;code&gt;index.html&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;publish it as a static preview&lt;/li&gt;
&lt;li&gt;send the browser URL&lt;/li&gt;
&lt;li&gt;iterate on the actual artifact instead of a screenshot&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the workflow I use for Claude HTML artifacts now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a URL is better than a screenshot
&lt;/h2&gt;

&lt;p&gt;The difference sounds small, but it changes the review conversation.&lt;/p&gt;

&lt;p&gt;With a screenshot, people comment on layout from a distance. They cannot click, resize, inspect, or test the real behavior.&lt;/p&gt;

&lt;p&gt;With a live URL, people can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;open the artifact on their own machine&lt;/li&gt;
&lt;li&gt;resize the browser&lt;/li&gt;
&lt;li&gt;test buttons and links&lt;/li&gt;
&lt;li&gt;compare states&lt;/li&gt;
&lt;li&gt;share the same artifact with another reviewer&lt;/li&gt;
&lt;li&gt;give feedback on the thing itself&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters even for “throwaway” AI outputs.&lt;/p&gt;

&lt;p&gt;AI makes the first draft cheap, so the bottleneck moves from creation to review. If review is slow, the speed of generation does not help as much as it should.&lt;/p&gt;

&lt;h2&gt;
  
  
  When this pattern is useful
&lt;/h2&gt;

&lt;p&gt;I use it for artifacts like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude-generated dashboards&lt;/li&gt;
&lt;li&gt;HTML reports&lt;/li&gt;
&lt;li&gt;pricing page drafts&lt;/li&gt;
&lt;li&gt;static prototypes&lt;/li&gt;
&lt;li&gt;design review pages&lt;/li&gt;
&lt;li&gt;AI-generated landing pages&lt;/li&gt;
&lt;li&gt;one-file demos&lt;/li&gt;
&lt;li&gt;docs or README previews&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I do not use it for production apps, private authenticated systems, or anything that needs backend logic. Those should go through a normal app deployment process.&lt;/p&gt;

&lt;p&gt;The boundary is simple:&lt;/p&gt;

&lt;p&gt;If the artifact is browser-ready static HTML and the main job is review or sharing, a preview URL is enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  A minimal workflow
&lt;/h2&gt;

&lt;p&gt;If Claude gives you a full HTML document, save it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;claude-preview
&lt;span class="nb"&gt;cd &lt;/span&gt;claude-preview
&lt;span class="nb"&gt;touch &lt;/span&gt;index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste the generated HTML into &lt;code&gt;index.html&lt;/code&gt;, then publish that file with whatever static preview workflow you prefer.&lt;/p&gt;

&lt;p&gt;I built PreviewShip around this exact use case:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://previewship.com/guides/share-claude-html-artifacts?utm_source=devto&amp;amp;utm_medium=community&amp;amp;utm_campaign=external_links_0706" rel="noopener noreferrer"&gt;https://previewship.com/guides/share-claude-html-artifacts?utm_source=devto&amp;amp;utm_medium=community&amp;amp;utm_campaign=external_links_0706&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It can publish pasted HTML, a single HTML file, Markdown, a static ZIP, or a built frontend folder. There is also a CLI, a VS Code/Cursor extension, and an MCP server for agent workflows.&lt;/p&gt;

&lt;p&gt;The important idea is not the specific tool. The important idea is to turn AI HTML into something reviewers can actually open.&lt;/p&gt;

&lt;h2&gt;
  
  
  The agent version
&lt;/h2&gt;

&lt;p&gt;The same pattern gets more useful when an AI coding agent can do the deploy step itself.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Here is the HTML”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;the agent can say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I built the artifact and deployed it here.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That small change makes AI output feel less like a blob of text and more like a working deliverable.&lt;/p&gt;

&lt;p&gt;For me, that is the real value of static preview URLs in AI workflows. They close the gap between generation and review.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>html</category>
      <category>tooling</category>
    </item>
    <item>
      <title>A Better Preview Workflow for AI-Generated HTML Reports</title>
      <dc:creator>Neurobin</dc:creator>
      <pubDate>Mon, 29 Jun 2026 06:25:45 +0000</pubDate>
      <link>https://dev.to/neurobin_/a-better-preview-workflow-for-ai-generated-html-reports-1jl0</link>
      <guid>https://dev.to/neurobin_/a-better-preview-workflow-for-ai-generated-html-reports-1jl0</guid>
      <description>&lt;p&gt;AI tools are making HTML reports more common.&lt;/p&gt;

&lt;p&gt;A language model can generate a static dashboard from CSV data, a visual project brief, a product audit, a market research summary, a UI prototype, or a one-page client report.&lt;/p&gt;

&lt;p&gt;The output is often good enough to review in a browser.&lt;/p&gt;

&lt;p&gt;But the sharing workflow is often clumsy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send a screenshot&lt;/li&gt;
&lt;li&gt;Attach an HTML file&lt;/li&gt;
&lt;li&gt;Paste a giant code block into Slack&lt;/li&gt;
&lt;li&gt;Ask someone to run a local server&lt;/li&gt;
&lt;li&gt;Export a PDF and lose interactivity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is a better pattern:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Treat the AI-generated report as a static web artifact and publish it as a temporary live preview.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This keeps the report interactive, clickable, and easy to review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why screenshots are not enough
&lt;/h2&gt;

&lt;p&gt;Screenshots are useful for quick context, but they hide important details.&lt;/p&gt;

&lt;p&gt;They do not show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hover states&lt;/li&gt;
&lt;li&gt;Responsive behavior&lt;/li&gt;
&lt;li&gt;Scroll depth&lt;/li&gt;
&lt;li&gt;Dynamic charts&lt;/li&gt;
&lt;li&gt;Clickable links&lt;/li&gt;
&lt;li&gt;Text selection&lt;/li&gt;
&lt;li&gt;Embedded tables&lt;/li&gt;
&lt;li&gt;Real spacing at different viewport sizes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the artifact is HTML, the browser is the native review surface.&lt;/p&gt;

&lt;p&gt;The goal is not just to show what the report looks like. The goal is to let someone experience it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes AI-generated HTML reports different
&lt;/h2&gt;

&lt;p&gt;AI-generated HTML often has a different lifecycle from normal product code.&lt;/p&gt;

&lt;p&gt;It may be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Useful for only a few days&lt;/li&gt;
&lt;li&gt;Generated from private or internal data&lt;/li&gt;
&lt;li&gt;Created as part of an experiment&lt;/li&gt;
&lt;li&gt;Iterated many times in one session&lt;/li&gt;
&lt;li&gt;Shared with non-technical reviewers&lt;/li&gt;
&lt;li&gt;Not worth turning into a full repository&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means the deployment workflow should be lightweight.&lt;/p&gt;

&lt;p&gt;For example, if an AI tool creates this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;weekly-growth-report.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You probably do not need a full app deployment. You need a URL.&lt;/p&gt;

&lt;p&gt;That is the "HTML to page" step: take the browser-ready file and turn it into a live page someone else can open.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://previewship.com/guides/html-to-page" rel="noopener noreferrer"&gt;Turn the HTML report into a live page&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple workflow
&lt;/h2&gt;

&lt;p&gt;Here is the workflow I use for generated HTML reports:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate the report&lt;/li&gt;
&lt;li&gt;Save it as a browser-ready HTML file&lt;/li&gt;
&lt;li&gt;Open it locally once&lt;/li&gt;
&lt;li&gt;Check for broken assets or private data&lt;/li&gt;
&lt;li&gt;Publish it to a temporary preview URL&lt;/li&gt;
&lt;li&gt;Share the URL with reviewers&lt;/li&gt;
&lt;li&gt;Replace the preview when the report changes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This gives you a fast loop without turning every report into a software project.&lt;/p&gt;

&lt;p&gt;If the report was generated by ChatGPT, Claude, or another AI tool, this guide covers the publishing side:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://previewship.com/guides/publish-ai-generated-html" rel="noopener noreferrer"&gt;Publish AI-generated HTML online&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the report browser-ready
&lt;/h2&gt;

&lt;p&gt;A browser-ready report should not depend on your local environment.&lt;/p&gt;

&lt;p&gt;This is good:&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;Weekly Growth Report&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;Weekly Growth Report&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;Generated from anonymized analytics data.&lt;span class="nt"&gt;&amp;lt;/p&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;This is risky:&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;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"http://localhost:3000/chart.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&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;"/Users/alex/Desktop/private-chart.png"&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;The first example can travel. The second example depends on your machine.&lt;/p&gt;

&lt;p&gt;Before publishing, search for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;localhost
127.0.0.1
file://
/Users/
C:\
.env
api_key
secret
token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not just a technical check. It is a privacy check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use a static host, not an app server
&lt;/h2&gt;

&lt;p&gt;Most generated reports do not need a backend.&lt;/p&gt;

&lt;p&gt;They need static hosting for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;Images&lt;/li&gt;
&lt;li&gt;Fonts&lt;/li&gt;
&lt;li&gt;JSON files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is different from deploying an application server.&lt;/p&gt;

&lt;p&gt;If your report is just one HTML file, publish the file.&lt;/p&gt;

&lt;p&gt;If your report includes assets, publish the whole folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;report/
  index.html
  assets/
    chart-data.json
    report.css
    logo.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This kind of static artifact is a good fit for lightweight HTML hosting:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://previewship.com/guides/html-file-hosting" rel="noopener noreferrer"&gt;HTML file hosting&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Automate the boring part
&lt;/h2&gt;

&lt;p&gt;If you create generated reports often, add a command.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx previewship deploy ./weekly-growth-report.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or for a folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx previewship deploy ./report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your report is produced by a script, you can make publishing the last step:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node scripts/build-report.js
npx previewship deploy ./output/report.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you need to capture the deployment URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx previewship deploy ./output/report.html &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI docs are here if you want the details:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://previewship.com/docs/cli" rel="noopener noreferrer"&gt;PreviewShip CLI docs&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Add enough metadata for humans
&lt;/h2&gt;

&lt;p&gt;Generated reports often get shared in chat, email, or project tools.&lt;/p&gt;

&lt;p&gt;Add a useful title:&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;title&amp;gt;&lt;/span&gt;Weekly Growth Report - June 24, 2026&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add a short visible summary near the top:&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;
  This report summarizes acquisition, activation, and subscription changes for
  the last 7 days.
&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;Add the generation date:&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;Generated on 2026-06-24.&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;Small details like this make the preview easier to understand when someone opens it later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the report self-contained when possible
&lt;/h2&gt;

&lt;p&gt;For one-off reports, self-contained HTML is convenient.&lt;/p&gt;

&lt;p&gt;That can mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inline critical CSS&lt;/li&gt;
&lt;li&gt;Embed small data as JSON inside the page&lt;/li&gt;
&lt;li&gt;Avoid depending on local files&lt;/li&gt;
&lt;li&gt;Use external CDNs only when acceptable&lt;/li&gt;
&lt;li&gt;Keep image paths relative if using a folder&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For larger reports, a folder is cleaner.&lt;/p&gt;

&lt;p&gt;There is no universal rule. The goal is simply that the artifact can be opened by someone else in a browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  A reviewer-friendly checklist
&lt;/h2&gt;

&lt;p&gt;Before sending the link, check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The preview opens without authentication if public review is intended&lt;/li&gt;
&lt;li&gt;The report does not include secrets or personal data&lt;/li&gt;
&lt;li&gt;Tables are readable on smaller screens&lt;/li&gt;
&lt;li&gt;Charts have labels and units&lt;/li&gt;
&lt;li&gt;Links work&lt;/li&gt;
&lt;li&gt;The page title is descriptive&lt;/li&gt;
&lt;li&gt;The URL opens in a private browser window&lt;/li&gt;
&lt;li&gt;The version you shared is the version you meant to share&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point sounds obvious, but generated reports often move quickly. Naming files clearly helps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;growth-report-2026-06-24.html
customer-research-summary-v2.html
pricing-analysis-final.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;AI makes it cheap to generate HTML. The next bottleneck is review.&lt;/p&gt;

&lt;p&gt;When you turn generated HTML into a live preview URL, the feedback loop becomes much cleaner. People can open the actual artifact, interact with it, and respond to the thing itself.&lt;/p&gt;

&lt;p&gt;That is a small workflow change, but it makes generated reports much more useful in real teams.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>html</category>
    </item>
    <item>
      <title>Publish an HTML File Online Without GitHub Pages, FTP, or a Server</title>
      <dc:creator>Neurobin</dc:creator>
      <pubDate>Fri, 26 Jun 2026 02:27:06 +0000</pubDate>
      <link>https://dev.to/neurobin_/publish-an-html-file-online-without-github-pages-ftp-or-a-server-3l7p</link>
      <guid>https://dev.to/neurobin_/publish-an-html-file-online-without-github-pages-ftp-or-a-server-3l7p</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%2F1ww6tt2rx0us9k39w3b9.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%2F1ww6tt2rx0us9k39w3b9.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;br&gt;
Sometimes you do not have a "website project."&lt;/p&gt;

&lt;p&gt;You just have an HTML file.&lt;/p&gt;

&lt;p&gt;Maybe it is a prototype from an AI tool. Maybe it is a report exported from a script. Maybe it is a quick documentation page, a product mockup, a pricing table, a portfolio draft, or a static demo for a teammate.&lt;/p&gt;

&lt;p&gt;In those cases, setting up GitHub Pages, a full hosting provider, CI, DNS, and a repository can feel heavier than the actual page.&lt;/p&gt;

&lt;p&gt;The better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is the smallest reliable way to turn this HTML file into a public URL?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here is a practical way to think about it.&lt;/p&gt;
&lt;h2&gt;
  
  
  First, identify what you actually have
&lt;/h2&gt;

&lt;p&gt;Before choosing a publishing method, decide which type of artifact you are dealing with.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. One self-contained HTML file
&lt;/h2&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pricing-demo.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the easiest case. If the CSS and JavaScript are inside the file, you can usually publish it directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. An HTML file with assets
&lt;/h2&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;demo/
  index.html
  styles.css
  app.js
  logo.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should be published as a folder or zip so the relative paths still work.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. A source project
&lt;/h2&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;demo-app/
  package.json
  src/
  public/
  vite.config.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This usually needs to be built first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you publish the output folder, such as &lt;code&gt;dist/&lt;/code&gt;, not the source folder.&lt;/p&gt;

&lt;h2&gt;
  
  
  The direct upload approach
&lt;/h2&gt;

&lt;p&gt;For a single HTML file, the simplest workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the publishing tool&lt;/li&gt;
&lt;li&gt;Paste or upload the HTML&lt;/li&gt;
&lt;li&gt;Get a public HTTPS URL&lt;/li&gt;
&lt;li&gt;Share the URL&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is useful for quick review because the recipient does not need to download anything or run a local server.&lt;/p&gt;

&lt;p&gt;I keep a short walkthrough of this exact use case here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://previewship.com/guides/publish-html-online" rel="noopener noreferrer"&gt;Publish HTML online&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This style of workflow is especially handy for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML reports&lt;/li&gt;
&lt;li&gt;AI-generated pages&lt;/li&gt;
&lt;li&gt;Static prototypes&lt;/li&gt;
&lt;li&gt;One-page documentation&lt;/li&gt;
&lt;li&gt;Simple demos&lt;/li&gt;
&lt;li&gt;Temporary review links&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The folder upload approach
&lt;/h2&gt;

&lt;p&gt;If your HTML references local files, do not upload only the HTML file.&lt;/p&gt;

&lt;p&gt;For example:&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;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"./styles.css"&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;"./app.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&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;"./preview.png"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Preview"&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;This page depends on nearby files.&lt;/p&gt;

&lt;p&gt;If you upload only &lt;code&gt;index.html&lt;/code&gt;, the browser will request &lt;code&gt;styles.css&lt;/code&gt;, &lt;code&gt;app.js&lt;/code&gt;, and &lt;code&gt;preview.png&lt;/code&gt;, but those files will not exist at the published URL.&lt;/p&gt;

&lt;p&gt;The correct artifact is the whole folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;demo/
  index.html
  styles.css
  app.js
  preview.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or a zip of that folder.&lt;/p&gt;

&lt;p&gt;This is the difference between "uploading an HTML file" and "uploading a static website."&lt;/p&gt;

&lt;p&gt;If you want a checklist for that distinction, this guide covers it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://previewship.com/guides/upload-html-file-to-website" rel="noopener noreferrer"&gt;Upload an HTML file to a website&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The command-line approach
&lt;/h2&gt;

&lt;p&gt;If you generate HTML locally, a CLI can be faster than opening a browser UI every time.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx previewship deploy ./index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx previewship deploy ./demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a built frontend project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
npx previewship deploy ./dist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works well if your workflow creates many one-off previews:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx previewship deploy ./reports/june-growth.html
npx previewship deploy ./mockups/onboarding.html
npx previewship deploy ./experiments/hero-section-v2.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The mental model is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Deploy the browser-ready artifact.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Do not deploy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node_modules/
src/
.env
package-lock.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do deploy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;index.html
assets/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  When GitHub Pages is still a good option
&lt;/h2&gt;

&lt;p&gt;GitHub Pages is great when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The content should live in a repository&lt;/li&gt;
&lt;li&gt;You want version history&lt;/li&gt;
&lt;li&gt;You want public source code&lt;/li&gt;
&lt;li&gt;The site is long-lived&lt;/li&gt;
&lt;li&gt;The project has docs that should evolve with the code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it can be too much for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One-off previews&lt;/li&gt;
&lt;li&gt;Private review links&lt;/li&gt;
&lt;li&gt;Temporary demos&lt;/li&gt;
&lt;li&gt;Generated reports&lt;/li&gt;
&lt;li&gt;AI-generated HTML artifacts&lt;/li&gt;
&lt;li&gt;Client drafts that may be replaced tomorrow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For those cases, a direct HTML hosting workflow is often faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Vercel or Netlify is still a good option
&lt;/h2&gt;

&lt;p&gt;Vercel and Netlify are excellent for real frontend projects.&lt;/p&gt;

&lt;p&gt;They are especially good when you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Framework builds&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;Preview deployments from pull requests&lt;/li&gt;
&lt;li&gt;Serverless functions&lt;/li&gt;
&lt;li&gt;Team workflows&lt;/li&gt;
&lt;li&gt;Custom domains&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But if the artifact is just &lt;code&gt;report.html&lt;/code&gt;, a full project deployment may be unnecessary.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical decision tree
&lt;/h2&gt;

&lt;p&gt;Use this quick rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Single HTML file?
  Publish the file directly.

HTML plus assets?
  Publish the folder or zip.

Frontend source project?
  Build it first, then publish the output folder.

Production app?
  Use your normal hosting pipeline.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That rule avoids most broken preview links.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final checklist
&lt;/h2&gt;

&lt;p&gt;Before sharing the URL, check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The page opens in a private browser window&lt;/li&gt;
&lt;li&gt;CSS is loading&lt;/li&gt;
&lt;li&gt;JavaScript is loading&lt;/li&gt;
&lt;li&gt;Images are loading&lt;/li&gt;
&lt;li&gt;No links point to &lt;code&gt;localhost&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;No private data is embedded in the file&lt;/li&gt;
&lt;li&gt;The page title is readable&lt;/li&gt;
&lt;li&gt;The preview is the final built output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those pass, you probably have a shareable HTML preview.&lt;/p&gt;

&lt;p&gt;For a broader overview of lightweight HTML hosting, this page may help:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://previewship.com/guides/host-html-file-online" rel="noopener noreferrer"&gt;Host an HTML file online&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sometimes the best publishing system is not the most powerful one. It is the one that fits the artifact you actually have.&lt;/p&gt;

</description>
      <category>html</category>
      <category>webdev</category>
      <category>staticwebapps</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to Share Claude HTML Artifacts as a Live Preview URL</title>
      <dc:creator>Neurobin</dc:creator>
      <pubDate>Thu, 25 Jun 2026 03:33:26 +0000</pubDate>
      <link>https://dev.to/neurobin_/how-to-share-claude-html-artifacts-as-a-live-preview-url-2hak</link>
      <guid>https://dev.to/neurobin_/how-to-share-claude-html-artifacts-as-a-live-preview-url-2hak</guid>
      <description>&lt;p&gt;Claude is surprisingly good at producing useful HTML artifacts: quick dashboards, landing page mockups, product one-pagers, data reports, UI prototypes, and internal tools.&lt;/p&gt;

&lt;p&gt;The awkward part usually comes after the HTML is generated.&lt;/p&gt;

&lt;p&gt;You want to send it to someone, but the artifact lives in a chat, a local file, or a temporary preview. Screenshots lose interactivity. Copying code into a message is hard to review. Asking someone to download a file and open it locally adds friction.&lt;/p&gt;

&lt;p&gt;For many small HTML outputs, the missing step is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Turn the generated HTML into a real browser URL.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This article walks through a practical workflow for sharing Claude HTML artifacts as live previews.&lt;/p&gt;

&lt;p&gt;If you want a focused version of this workflow, I also wrote a short guide here: &lt;a href="https://previewship.com/guides/share-claude-html-artifacts" rel="noopener noreferrer"&gt;Share Claude HTML artifacts as a live URL&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with local HTML artifacts
&lt;/h2&gt;

&lt;p&gt;When Claude generates HTML, you usually get one of three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A single self-contained HTML file&lt;/li&gt;
&lt;li&gt;A small static folder with CSS, JavaScript, and image assets&lt;/li&gt;
&lt;li&gt;A source project that needs to be built first, such as Vite, Next.js, Astro, or another frontend setup&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are not the same deployment target.&lt;/p&gt;

&lt;p&gt;A single HTML file can often be published directly. A static folder can be hosted as-is if it already contains the final assets. A source project usually needs a build command first.&lt;/p&gt;

&lt;p&gt;The most common mistake is trying to share the source project instead of the built artifact.&lt;/p&gt;

&lt;p&gt;For example, this is usually not what you want to publish:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-demo/
  package.json
  src/
  node_modules/
  vite.config.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is much closer to what you want:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dist/
  index.html
  assets/
    app.css
    app.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That distinction matters because a browser can load &lt;code&gt;index.html&lt;/code&gt;, CSS, JavaScript, images, and static assets. It cannot run your local build system for the viewer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a good preview workflow should do
&lt;/h2&gt;

&lt;p&gt;A good preview workflow for AI-generated HTML should be boring in the best possible way:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Take the exact artifact Claude generated or built&lt;/li&gt;
&lt;li&gt;Publish it to a public HTTPS URL&lt;/li&gt;
&lt;li&gt;Preserve linked CSS, JavaScript, images, and fonts&lt;/li&gt;
&lt;li&gt;Let reviewers open it without installing anything&lt;/li&gt;
&lt;li&gt;Make it easy to replace the preview when the artifact changes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That workflow works especially well for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI-generated reports&lt;/li&gt;
&lt;li&gt;HTML prototypes&lt;/li&gt;
&lt;li&gt;Landing page drafts&lt;/li&gt;
&lt;li&gt;Client demos&lt;/li&gt;
&lt;li&gt;Small internal tools&lt;/li&gt;
&lt;li&gt;Static examples for docs&lt;/li&gt;
&lt;li&gt;UI states that are easier to review in a browser than in a screenshot&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Option 1: Paste or upload the HTML
&lt;/h2&gt;

&lt;p&gt;If Claude generated one self-contained HTML file, the fastest path is to paste or upload the file and get a live URL.&lt;/p&gt;

&lt;p&gt;This works best when the file includes everything it needs:&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;Revenue Dashboard Preview&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;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;system-ui&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&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="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;h1&amp;gt;&lt;/span&gt;Revenue Dashboard&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;This is a generated static preview.&lt;span class="nt"&gt;&amp;lt;/p&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;This is ideal for quick review loops because there is no repository, no DNS, no build pipeline, and no app server.&lt;/p&gt;

&lt;p&gt;If you are using PreviewShip, the upload flow is built for this kind of artifact:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://previewship.com/guides/publish-ai-generated-html" rel="noopener noreferrer"&gt;Publish AI-generated HTML online&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 2: Publish from the command line
&lt;/h2&gt;

&lt;p&gt;If Claude Code or another local coding agent generated a file in your workspace, the command line can be faster than using a browser UI.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx previewship deploy ./report.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, if you want a machine-readable result for scripting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx previewship deploy ./report.html &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A CLI-based workflow is useful when you repeatedly generate variations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx previewship deploy ./experiments/pricing-page-v3.html
npx previewship deploy ./reports/weekly-growth.html
npx previewship deploy ./demos/onboarding-flow.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important thing is that the deployed file or folder should already be browser-ready.&lt;/p&gt;

&lt;p&gt;For a built frontend project, that usually means:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
npx previewship deploy ./dist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact output folder depends on your framework:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vite      -&amp;gt; dist/
Astro     -&amp;gt; dist/
Next.js   -&amp;gt; out/ if using static export
SvelteKit -&amp;gt; build/ depending on adapter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Option 3: Let Claude Code publish the preview
&lt;/h2&gt;

&lt;p&gt;If you are working inside Claude Code, Cursor, or another agentic coding tool, you can also make publishing part of the agent workflow.&lt;/p&gt;

&lt;p&gt;A typical prompt can be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build the static preview, deploy the browser-ready output, and give me the public URL.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works best when the tool has a clear deployment command or MCP integration available.&lt;/p&gt;

&lt;p&gt;For PreviewShip, the MCP docs are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://previewship.com/docs/mcp" rel="noopener noreferrer"&gt;PreviewShip MCP docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That kind of setup is useful because the agent can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate the HTML&lt;/li&gt;
&lt;li&gt;Build the static output if needed&lt;/li&gt;
&lt;li&gt;Deploy the result&lt;/li&gt;
&lt;li&gt;Return a URL for review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You still need to be explicit about what should be deployed. If the agent built a Vite app, ask it to deploy &lt;code&gt;dist/&lt;/code&gt;, not the raw source directory.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small checklist before sharing the URL
&lt;/h2&gt;

&lt;p&gt;Before sending the preview to someone else, check these details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The page has a real &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The layout works on desktop and mobile&lt;/li&gt;
&lt;li&gt;External images and fonts load correctly&lt;/li&gt;
&lt;li&gt;Buttons and links do not point to localhost&lt;/li&gt;
&lt;li&gt;The page does not expose private API keys or internal data&lt;/li&gt;
&lt;li&gt;The artifact is the built output, not the source project&lt;/li&gt;
&lt;li&gt;The preview URL opens in a private browser window&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last check is underrated. If it works in a private window, it is much more likely to work for the person receiving the link.&lt;/p&gt;

&lt;h2&gt;
  
  
  When this workflow is better than a full deployment
&lt;/h2&gt;

&lt;p&gt;This live-preview workflow is not a replacement for production hosting.&lt;/p&gt;

&lt;p&gt;It is best for artifacts that need fast review:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Can you check this report?"&lt;/li&gt;
&lt;li&gt;"Does this landing page copy make sense?"&lt;/li&gt;
&lt;li&gt;"Is this generated UI close to what we want?"&lt;/li&gt;
&lt;li&gt;"Can the client open this without installing anything?"&lt;/li&gt;
&lt;li&gt;"Can I share this prototype in a Slack thread?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For long-lived production apps, use your normal deployment pipeline.&lt;/p&gt;

&lt;p&gt;For throwaway or review-focused HTML, a lightweight preview URL is usually enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;Claude can generate the first version of an HTML artifact quickly. The real productivity gain comes when the review loop is just as fast.&lt;/p&gt;

&lt;p&gt;If the output can be opened as a URL, people can comment on the actual experience instead of debugging file sharing.&lt;/p&gt;

&lt;p&gt;That small shift makes AI-generated HTML much easier to use in real work.&lt;/p&gt;

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