<?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: raressen</title>
    <description>The latest articles on DEV Community by raressen (@rare_64).</description>
    <link>https://dev.to/rare_64</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%2F4057133%2F49b5734e-e153-4b8a-83db-c79223bcc45d.png</url>
      <title>DEV Community: raressen</title>
      <link>https://dev.to/rare_64</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rare_64"/>
    <language>en</language>
    <item>
      <title>How I publish an AI-generated HTML presentation without building a hosting pipeline</title>
      <dc:creator>raressen</dc:creator>
      <pubDate>Fri, 31 Jul 2026 19:53:47 +0000</pubDate>
      <link>https://dev.to/rare_64/how-i-publish-an-ai-generated-html-presentation-without-building-a-hosting-pipeline-2nn9</link>
      <guid>https://dev.to/rare_64/how-i-publish-an-ai-generated-html-presentation-without-building-a-hosting-pipeline-2nn9</guid>
      <description>&lt;p&gt;Coding agents are surprisingly good at producing a polished HTML presentation. The awkward part&lt;br&gt;
starts one minute later: how do you turn that local artifact into a URL without asking the agent to&lt;br&gt;
invent a deployment pipeline, leak a credential, or silently publish the wrong file?&lt;/p&gt;

&lt;p&gt;I’m building Slidesfly, so this is not a neutral survey of every hosting option. It is the workflow&lt;br&gt;
I now use when Codex, Claude Code, Cursor, or another coding agent has already produced a&lt;br&gt;
browser-ready deck. The important part is not the product command. It is the handoff contract and&lt;br&gt;
the verification around it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Treat publishing as a separate stage
&lt;/h2&gt;

&lt;p&gt;The agent that creates a deck usually works in a repository containing source files, generated&lt;br&gt;
assets, build output, screenshots, and temporary experiments. “Publish my slides” is therefore an&lt;br&gt;
ambiguous instruction. An agent can easily choose &lt;code&gt;src/index.html&lt;/code&gt; instead of &lt;code&gt;dist/index.html&lt;/code&gt;, or&lt;br&gt;
upload an HTML shell whose JavaScript only works on localhost.&lt;/p&gt;

&lt;p&gt;I use a four-stage boundary:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Generate&lt;/strong&gt; the presentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify&lt;/strong&gt; the exact browser-ready artifact locally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish&lt;/strong&gt; that exact path through a dedicated interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open the returned reader URL&lt;/strong&gt; before sharing it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This boundary keeps content generation and deployment independent. A publishing failure does not&lt;br&gt;
invite the agent to rewrite the deck, and a deck bug does not get hidden by a successful upload.&lt;/p&gt;
&lt;h2&gt;
  
  
  Start with an exact artifact
&lt;/h2&gt;

&lt;p&gt;For a single-file deck, open the file locally and check navigation, fonts, images, and the browser&lt;br&gt;
console. For a framework build, identify the actual output directory and whether it depends on an&lt;br&gt;
absolute base path or remote assets.&lt;/p&gt;

&lt;p&gt;Then give the agent an absolute path rather than a guessed filename:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Publish /absolute/path/deck.html with Slidesfly. Return the complete reader URL,
verify it opens, and keep claim tokens or API keys out of the response.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That prompt is deliberately boring. It names one artifact, defines the expected result, asks for an&lt;br&gt;
effect check, and establishes a credential boundary.&lt;/p&gt;
&lt;h2&gt;
  
  
  Install the publishing interface
&lt;/h2&gt;

&lt;p&gt;The supported website installer provides the CLI and can install the Slidesfly instruction file for&lt;br&gt;
several agent hosts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://slidesfly.com/install.sh | sh
slidesfly &lt;span class="nt"&gt;--version&lt;/span&gt;

&lt;span class="c"&gt;# Pick the host you actually use&lt;/span&gt;
slidesfly &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--target&lt;/span&gt; codex &lt;span class="nt"&gt;--scope&lt;/span&gt; user &lt;span class="nt"&gt;--json&lt;/span&gt;
slidesfly &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--target&lt;/span&gt; claude-code &lt;span class="nt"&gt;--scope&lt;/span&gt; user &lt;span class="nt"&gt;--json&lt;/span&gt;
slidesfly &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--target&lt;/span&gt; cursor &lt;span class="nt"&gt;--scope&lt;/span&gt; user &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The instruction file does not contain a new credential. It teaches the agent when to use the local&lt;br&gt;
CLI or a configured MCP connection, what result to return, and when to stop.&lt;/p&gt;

&lt;p&gt;Publish the verified file with structured output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;slidesfly publish /absolute/path/deck.html &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;"Agent-generated review"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A successful response includes &lt;code&gt;ok: true&lt;/code&gt;, a deck id, a complete reader URL, visibility, and whether&lt;br&gt;
the publish is anonymous. The command's normal and JSON output omit the anonymous claim token.&lt;/p&gt;

&lt;p&gt;The first single-file publish can be anonymous. That is useful for an agent workflow because the&lt;br&gt;
artifact can become a URL before an account flow interrupts the task. The local CLI stores the claim&lt;br&gt;
token in its config so the deck can be claimed later. The token should never be copied into chat,&lt;br&gt;
logs, or source control.&lt;/p&gt;
&lt;h2&gt;
  
  
  Verify the result, not the command
&lt;/h2&gt;

&lt;p&gt;An HTTP upload succeeding only proves that bytes reached a service. It does not prove the deck&lt;br&gt;
works in its final reader.&lt;/p&gt;

&lt;p&gt;Open the returned URL and check at least:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the first slide renders;&lt;/li&gt;
&lt;li&gt;next/previous navigation works;&lt;/li&gt;
&lt;li&gt;local fonts, images, styles, and scripts load;&lt;/li&gt;
&lt;li&gt;there is no dependency on &lt;code&gt;localhost&lt;/code&gt; or a private file path;&lt;/li&gt;
&lt;li&gt;the result does not require same-origin storage or top-level navigation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Slidesfly renders uploaded HTML in a sandboxed, opaque-origin iframe. That boundary is intentional,&lt;br&gt;
but it can expose assumptions that were invisible during local development. If the deck requires a&lt;br&gt;
remote runtime script, same-origin cookies, or application-hosting behavior, report the reader as&lt;br&gt;
unverified and fix the artifact. Do not weaken the verification language just because publishing&lt;br&gt;
succeeded.&lt;/p&gt;
&lt;h2&gt;
  
  
  A reproducible proof
&lt;/h2&gt;

&lt;p&gt;I keep a small example artifact so the full chain can be inspected instead of merely asserted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://slidesfly.com/examples/agent-output/deck.html?utm_source=devto&amp;amp;utm_medium=community&amp;amp;utm_campaign=agent-output-proof-pack" rel="noopener noreferrer"&gt;source HTML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slidesfly.xyz/d/n9d4qxI5r3qGOBg637y2BK?utm_source=devto&amp;amp;utm_medium=community&amp;amp;utm_campaign=agent-output-proof-pack" rel="noopener noreferrer"&gt;live reader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slidesfly.com/guides/publish-ai-generated-html-presentation?utm_source=devto&amp;amp;utm_medium=community&amp;amp;utm_campaign=agent-output-proof-pack" rel="noopener noreferrer"&gt;canonical workflow and current verification record&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the recorded verification point, the 1,953-byte source and the reader asset had the same SHA-256:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;54d0fe40d1e1ea36b2a5150c8ec4eb4603a32cc59847e16deb5c855c5b1f9965
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That hash proves only the linked fixture at that recorded point. It is not evidence that every&lt;br&gt;
uploaded presentation is byte-identical or visually correct. Each new artifact still needs its own&lt;br&gt;
verification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recovery should be explicit
&lt;/h2&gt;

&lt;p&gt;Agent workflows become much safer when failures have a narrow next step:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;File not found:&lt;/strong&gt; locate the real build output, inspect it, and retry with the exact path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invalid file or HTML:&lt;/strong&gt; choose the actual &lt;code&gt;.html&lt;/code&gt;, &lt;code&gt;.htm&lt;/code&gt;, or eligible ZIP artifact; do not rename
an unrelated file to bypass validation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security rejection:&lt;/strong&gt; fix the source and rerun local verification. Never conceal or automatically
bypass the rejection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication required:&lt;/strong&gt; use the agent host's approved secret mechanism. Do not paste an API
key into the conversation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reader verification fails:&lt;/strong&gt; report an unverified result, identify the sandbox or asset
assumption, repair the artifact, republish, and reopen the URL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice what is absent: “try random deployment changes until something is online.” Publishing is a&lt;br&gt;
small, auditable stage with a defined input and output.&lt;/p&gt;

&lt;h2&gt;
  
  
  When this workflow is the wrong tool
&lt;/h2&gt;

&lt;p&gt;Slidesfly publishes existing HTML presentations. It is not an AI presentation generator and it is&lt;br&gt;
not a general application host. Use a normal web deployment platform if the output is an&lt;br&gt;
application with a backend, same-origin authentication, unrestricted navigation, or server-side&lt;br&gt;
runtime requirements.&lt;/p&gt;

&lt;p&gt;For a finished HTML deck, though, separating generation from publishing gives the agent a much&lt;br&gt;
cleaner job: identify one verified artifact, publish it, open the returned URL, and report the result&lt;br&gt;
without exposing credentials. That is the whole pipeline—and that simplicity is the feature.&lt;/p&gt;

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