<?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: Su, Jun-Ming</title>
    <description>The latest articles on DEV Community by Su, Jun-Ming (@sujunmin).</description>
    <link>https://dev.to/sujunmin</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%2F531190%2Fece875c3-2d0c-433b-a03b-2ca0869a32d6.jpeg</url>
      <title>DEV Community: Su, Jun-Ming</title>
      <link>https://dev.to/sujunmin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sujunmin"/>
    <language>en</language>
    <item>
      <title>How I Built agy-ppt — An Agent Skill That Turns Reports into PowerPoint Decks Without the AI-Slop Look</title>
      <dc:creator>Su, Jun-Ming</dc:creator>
      <pubDate>Fri, 02 Oct 2026 09:20:22 +0000</pubDate>
      <link>https://dev.to/sujunmin/how-i-built-agy-ppt-an-agent-skill-that-turns-reports-into-powerpoint-decks-without-the-ai-slop-chn</link>
      <guid>https://dev.to/sujunmin/how-i-built-agy-ppt-an-agent-skill-that-turns-reports-into-powerpoint-decks-without-the-ai-slop-chn</guid>
      <description>&lt;p&gt;Every AI-generated slide deck looks the same. You know the look: purple gradient background, three generic icon cards in a row, a stock photo of diverse people pointing at a whiteboard. I call it the AI-slop fingerprint, and once you've seen it, you can't unsee it.&lt;/p&gt;

&lt;p&gt;I build a lot of decks with AI agents, and I got tired of apologizing for how they look. So I built &lt;a href="https://github.com/sujunmin/agy-ppt" rel="noopener noreferrer"&gt;agy-ppt&lt;/a&gt; — an open-source agent skill that turns reports into PowerPoint decks with actual visual design. It's MIT licensed, and it installs with one command.&lt;/p&gt;

&lt;p&gt;But the interesting part of this story isn't the skill. It's the experiment that decided the entire architecture — and it has to do with how image models handle Traditional Chinese text.&lt;/p&gt;

&lt;h2&gt;
  
  
  The experiment: Gemini vs GPT on dense Traditional Chinese
&lt;/h2&gt;

&lt;p&gt;In my own testing, I found that Gemini-generated images can barely hold any Traditional Chinese text. Give it a slide layout with a paragraph or two of Chinese and the characters blur, warp, or dissolve into plausible-looking gibberish.&lt;/p&gt;

&lt;p&gt;Run the exact same layout through GPT's image models, and it holds dozens of Chinese characters cleanly — dense paragraphs, data tables, small annotations, all legible.&lt;/p&gt;

&lt;p&gt;This matters more than it sounds. Slides are the most text-dense visuals in common use. A marketing hero image can survive on five words; a slide with five words is an empty slide. If your renderer can't do dense CJK text, you cannot do slides. Full stop.&lt;/p&gt;

&lt;p&gt;So the renderer wasn't chosen by brand loyalty. It was chosen by experiment: GPT image models render every slide.&lt;/p&gt;

&lt;h2&gt;
  
  
  One director, strict ownership
&lt;/h2&gt;

&lt;p&gt;With the renderer settled, I split the remaining work by what each agent is actually good at — and I made the ownership brutally explicit, because multi-agent workflows rot the moment two agents both think they're in charge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antigravity (AGY)&lt;/strong&gt; is the sole director. It owns the outline (&lt;code&gt;outline.md&lt;/code&gt;), the visual spec (&lt;code&gt;deck_spec.json&lt;/code&gt;), the copy on every slide, the approval gates, and content/visual QA. The workflow is always AGY → worker → AGY. Workers never hand off to each other directly, and nobody moves to the next phase without AGY.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kiro&lt;/strong&gt; owns all engineering. Every line of executable code — assembly scripts, validators, schema changes, bug fixes — goes through Kiro. AGY may run existing verified scripts, but it may not modify code just because it can.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex&lt;/strong&gt; renders images. Only images. It is explicitly forbidden from touching the outline, the visual spec, the copy, the page count, the code, or the assembly step — and forbidden from faking AI-generated slides with Pillow, SVG, or python-pptx. This sounds paranoid until you've watched an image agent "helpfully" rewrite your facts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This strictness is the whole trick. Most agent pipelines fail not on capability but on authority ambiguity. Here there is none.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contracts before code
&lt;/h2&gt;

&lt;p&gt;The skill wasn't vibe-coded. Every phase of the build was written up as a contract before implementation — &lt;code&gt;docs/&lt;/code&gt; holds dozens of them: raster contracts, image contracts, provider UX contracts, grounding/translation contracts, validation contracts, each with its own validation report.&lt;/p&gt;

&lt;p&gt;And the contracts are frozen. A CI check called &lt;code&gt;frozen-contract-guard&lt;/code&gt; blocks any pull request that violates them. Verification runs in three classes: deterministic CI that must pass before any merge, a manual release-readiness pass in a clean-room environment before shipping, and scheduled live validation against a stable public source.&lt;/p&gt;

&lt;p&gt;There's also a boundary the project states explicitly and honestly: CI verifies engineering contracts — syntax, schemas, determinism, recovery scenarios. It does not and cannot verify semantic truth, such as whether a claim on a slide actually matches its source document. That judgment stays with AGY's review, by design. Knowing what your automation &lt;em&gt;can't&lt;/em&gt; prove is part of engineering rigor too.&lt;/p&gt;

&lt;h2&gt;
  
  
  No API keys
&lt;/h2&gt;

&lt;p&gt;The skill is OAuth-only. It assumes three CLIs already logged in with their own subscription sessions — Google AI Pro, Kiro Pro, ChatGPT Plus — and it never touches, copies, or forwards any OAuth tokens. No &lt;code&gt;OPENAI_API_KEY&lt;/code&gt;, no key management, no billing surprises. If you have the subscriptions, you have the pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approval gates before pixels
&lt;/h2&gt;

&lt;p&gt;Nothing renders until you've approved three things: the outline, the visual style, and a real single-slide sample. Only then does the full deck generate, slide by slide, with QA notes at each step. Re-rendering one bad slide is cheap; discovering on slide 18 that the design direction was wrong is expensive.&lt;/p&gt;

&lt;p&gt;The output is hybrid PowerPoint: full-page 16:9 rendered images preserve the visual fidelity (this is what kills the AI-slop look), while key text, native charts, and images stay editable and replaceable inside PowerPoint. A typo fix shouldn't require a re-render.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add sujunmin/agy-ppt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's also on &lt;a href="https://clawhub.ai/sujunmin/skills/agy-ppt" rel="noopener noreferrer"&gt;ClawHub&lt;/a&gt;. The one hard requirement: your agent environment needs image-generation capability — that's the load-bearing wall of the whole pipeline.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/vPSsj7aZMtU" rel="noopener noreferrer"&gt;70-second demo&lt;/a&gt; · &lt;a href="https://github.com/sujunmin/agy-ppt" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6cdqqcqdlrintiftvf2y.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6cdqqcqdlrintiftvf2y.gif" alt="agy-ppt output preview" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you make decks in CJK languages — the use case most slide tools ignore — I'd especially like to hear what breaks for you. Issues welcome; I read every one.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
