<?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: jaxxchen</title>
    <description>The latest articles on DEV Community by jaxxchen (@jaxxchen003).</description>
    <link>https://dev.to/jaxxchen003</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3956860%2F0af80edc-56b9-4d9f-9d7e-8db5630412bc.png</url>
      <title>DEV Community: jaxxchen</title>
      <link>https://dev.to/jaxxchen003</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jaxxchen003"/>
    <language>en</language>
    <item>
      <title>AI can generate HTML. Publishing it is still weirdly annoying.</title>
      <dc:creator>jaxxchen</dc:creator>
      <pubDate>Thu, 28 May 2026 16:17:05 +0000</pubDate>
      <link>https://dev.to/jaxxchen003/ai-can-generate-html-publishing-it-is-still-weirdly-annoying-5hbl</link>
      <guid>https://dev.to/jaxxchen003/ai-can-generate-html-publishing-it-is-still-weirdly-annoying-5hbl</guid>
      <description>&lt;p&gt;AI tools are now pretty good at making complete HTML artifacts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a small portfolio page&lt;/li&gt;
&lt;li&gt;a product one-pager&lt;/li&gt;
&lt;li&gt;a pitch deck in HTML&lt;/li&gt;
&lt;li&gt;a resume&lt;/li&gt;
&lt;li&gt;a visual prototype&lt;/li&gt;
&lt;li&gt;a client preview&lt;/li&gt;
&lt;/ul&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2F8e0b0xp3807bwluv43q2.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.amazonaws.com%2Fuploads%2Farticles%2F8e0b0xp3807bwluv43q2.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
But after the model gives you the HTML, there is still an awkward last step:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do I turn this into a real URL I can send to someone?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For developers, the normal answer is GitHub Pages, Netlify, Vercel, Cloudflare Pages, or an object-store flow. Those are good tools. But they are also a lot of ceremony when the artifact is just one finished HTML file.&lt;/p&gt;

&lt;p&gt;For non-developers, the gap is even worse. They can ask ChatGPT to create a nice HTML page, but the result often stays trapped in a chat window or a local file.&lt;/p&gt;

&lt;h2&gt;
  
  
  The narrow problem
&lt;/h2&gt;

&lt;p&gt;The use case I wanted to solve was not "deploy a website."&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Publish one complete AI-generated HTML document as a shareable link.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no repo required&lt;/li&gt;
&lt;li&gt;no build step&lt;/li&gt;
&lt;li&gt;no ZIP project&lt;/li&gt;
&lt;li&gt;no framework deployment&lt;/li&gt;
&lt;li&gt;no DNS setup&lt;/li&gt;
&lt;li&gt;optional access-key sharing for private previews&lt;/li&gt;
&lt;/ul&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fniwdwk05aw8a7uc9ashj.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.amazonaws.com%2Fuploads%2Farticles%2Fniwdwk05aw8a7uc9ashj.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://foliodrop.app/" rel="noopener noreferrer"&gt;FolioDrop&lt;/a&gt; around that narrow contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  What FolioDrop does
&lt;/h2&gt;

&lt;p&gt;FolioDrop accepts one complete single-file HTML document and returns a real URL.&lt;/p&gt;

&lt;p&gt;It is intentionally smaller than a static host:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paste or upload one HTML work manually.&lt;/li&gt;
&lt;li&gt;Publish from an AI tool through MCP or OpenAPI.&lt;/li&gt;
&lt;li&gt;Save public works into a lightweight personal folio.&lt;/li&gt;
&lt;li&gt;Keep access-key protected works unlisted.&lt;/li&gt;
&lt;li&gt;Keep individual shared work routes out of search indexing.&lt;/li&gt;
&lt;/ul&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fzdm43g6pgd3ue4hmphrz.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.amazonaws.com%2Fuploads%2Farticles%2Fzdm43g6pgd3ue4hmphrz.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
The important boundary: FolioDrop is not a replacement for Vercel, Netlify, GitHub Pages, or Cloudflare Pages. If your project needs multiple files, a framework, a custom domain, or long-term production hosting, those tools are a better fit.&lt;/p&gt;

&lt;p&gt;The comparison is here: &lt;a href="https://foliodrop.app/compare/foliodrop-vs-static-hosting" rel="noopener noreferrer"&gt;FolioDrop vs static hosting&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why MCP/OpenAPI matters here
&lt;/h2&gt;

&lt;p&gt;The manual flow is useful, but the more interesting flow is agent-native publishing.&lt;/p&gt;

&lt;p&gt;If an AI host can call a publish tool, the user can ask for:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make this into a single-file HTML page and publish it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent can then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;generate the HTML&lt;/li&gt;
&lt;li&gt;validate that it is a complete document&lt;/li&gt;
&lt;li&gt;call the publishing endpoint&lt;/li&gt;
&lt;li&gt;return a URL&lt;/li&gt;
&lt;/ol&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fmanx7xn4vmtb1rebye0n.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.amazonaws.com%2Fuploads%2Farticles%2Fmanx7xn4vmtb1rebye0n.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
FolioDrop exposes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MCP endpoint: &lt;code&gt;https://foliodrop.app/mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;public MCP config: &lt;code&gt;https://foliodrop.app/api/ai/mcp-config.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;OpenAPI description: &lt;code&gt;https://foliodrop.app/api/ai/openapi.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also packaged the publishing workflow as an open GitHub skill:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/jaxxchen003/foliodrop-publisher-skill" rel="noopener noreferrer"&gt;github.com/jaxxchen003/foliodrop-publisher-skill&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That repo includes a single-file HTML validator and templates for decks, resumes, product one-pagers, emails, and portfolio case studies.&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Flp35gp6evax1uv0301i8.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.amazonaws.com%2Fuploads%2Farticles%2Flp35gp6evax1uv0301i8.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The publishing contract
&lt;/h2&gt;

&lt;p&gt;The current contract is deliberately strict:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;include &lt;code&gt;&amp;lt;!doctype html&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;include &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;inline CSS in &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;inline JavaScript only when needed&lt;/li&gt;
&lt;li&gt;use public HTTPS URLs for external images or fonts&lt;/li&gt;
&lt;li&gt;do not include tokens, secrets, passwords, or local file paths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This constraint keeps the product predictable. It also makes the output easier for AI agents to reason about.&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fx26swxd5m3bpyks283bg.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.amazonaws.com%2Fuploads%2Farticles%2Fx26swxd5m3bpyks283bg.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;The hard part was not generating HTML. The hard part was making the last mile boring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;return a stable URL&lt;/li&gt;
&lt;li&gt;avoid leaking access keys&lt;/li&gt;
&lt;li&gt;avoid indexing private previews&lt;/li&gt;
&lt;li&gt;make deletion and expiry clear&lt;/li&gt;
&lt;li&gt;keep the product boundary honest&lt;/li&gt;
&lt;li&gt;give agents a structured way to publish without putting secrets into prompts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wrote up two answer pages for the common questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://foliodrop.app/answers/what-is-foliodrop" rel="noopener noreferrer"&gt;What is FolioDrop?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foliodrop.app/answers/how-to-share-ai-generated-html" rel="noopener noreferrer"&gt;How do you share AI-generated HTML online?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The product is small on purpose. If the work is a real website, use a real static host. If the work is one complete AI-made HTML artifact and you just need a link, that is the gap FolioDrop is trying to close.&lt;/p&gt;

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