<?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: Tom</title>
    <description>The latest articles on DEV Community by Tom (@slideforge_5f3f3f08).</description>
    <link>https://dev.to/slideforge_5f3f3f08</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%2F3876924%2Fdeed0cdd-1ae5-4ef8-9581-092c8a176122.png</url>
      <title>DEV Community: Tom</title>
      <link>https://dev.to/slideforge_5f3f3f08</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/slideforge_5f3f3f08"/>
    <language>en</language>
    <item>
      <title>Add PowerPoint Export to Your SaaS in 5 Minutes</title>
      <dc:creator>Tom</dc:creator>
      <pubDate>Fri, 17 Apr 2026 18:19:26 +0000</pubDate>
      <link>https://dev.to/slideforge_5f3f3f08/add-powerpoint-export-to-your-saas-in-5-minutes-526n</link>
      <guid>https://dev.to/slideforge_5f3f3f08/add-powerpoint-export-to-your-saas-in-5-minutes-526n</guid>
      <description>&lt;p&gt;&lt;strong&gt;Add "Export to PowerPoint" to your SaaS product with a single API call â€” no python-pptx, no layout code, no font debugging.&lt;/strong&gt; $0.03/slide, synchronous response, real editable .pptx.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Integration (5 minutes)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Python
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;export_to_pptx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dashboard_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.slideforge.dev/v1/render&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SLIDEFORGE_KEY&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;template&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kpi_dashboard&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dashboard_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;metrics&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dashboard_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;metrics&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;theme_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dashboard_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;theme&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;consulting_blue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pptx_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Node.js
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;exportToPptx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.slideforge.dev/v1/render&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bearer &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SLIDEFORGE_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;kpi_dashboard&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metrics&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nx"&gt;pptx_url&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Per-Customer Branding
&lt;/h2&gt;

&lt;p&gt;Save a theme per customer â€” their brand on every export. Themes persist across sessions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost at Scale
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;100 exports/month x 5 slides = $15/month&lt;/li&gt;
&lt;li&gt;1,000 exports/month x 5 slides = $127.50/month (with volume discount)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://slideforge.dev/blog/add-powerpoint-export-saas" rel="noopener noreferrer"&gt;Full guide&lt;/a&gt; | &lt;a href="https://slideforge.dev/docs/api/render" rel="noopener noreferrer"&gt;API docs&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://slideforge.dev/blog/add-powerpoint-export-saas" rel="noopener noreferrer"&gt;slideforge.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>saas</category>
      <category>api</category>
      <category>tutorial</category>
      <category>python</category>
    </item>
    <item>
      <title>Custom Themes: Brand Your SlideForge Output</title>
      <dc:creator>Tom</dc:creator>
      <pubDate>Fri, 17 Apr 2026 18:18:07 +0000</pubDate>
      <link>https://dev.to/slideforge_5f3f3f08/custom-themes-brand-your-slideforge-output-1e3i</link>
      <guid>https://dev.to/slideforge_5f3f3f08/custom-themes-brand-your-slideforge-output-1e3i</guid>
      <description>&lt;p&gt;&lt;strong&gt;Every slide SlideForge generates uses a theme â€” colors, fonts, and spacing that match your brand.&lt;/strong&gt; 8 built-in themes work out of the box. Three ways to create custom themes: JSON API, upload a .pptx, or agent extraction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built-in Themes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Theme ID&lt;/th&gt;
&lt;th&gt;Primary&lt;/th&gt;
&lt;th&gt;Style&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;consulting_blue&lt;/td&gt;
&lt;td&gt;#1E3A5F&lt;/td&gt;
&lt;td&gt;Classic consulting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;consulting_dark&lt;/td&gt;
&lt;td&gt;#111827&lt;/td&gt;
&lt;td&gt;Dark, amber accent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;investor_pitch&lt;/td&gt;
&lt;td&gt;#1A1A2E&lt;/td&gt;
&lt;td&gt;Startup pitch deck&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;startup_bold&lt;/td&gt;
&lt;td&gt;#6C2BD9&lt;/td&gt;
&lt;td&gt;Bold purple&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Use with: &lt;code&gt;"theme_id": "consulting_blue"&lt;/code&gt; in any request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 1: JSON API
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.slideforge.dev/v1/themes &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sf_live_YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"name": "acme_brand", "colors": {"primary": "#2B5EA7", "accent": "#E87722"}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Method 2: Extract from .pptx
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.slideforge.dev/v1/themes/upload &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sf_live_YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"file=@brand-template.pptx"&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"name=acme_from_pptx"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Method 3: Via MCP Agent
&lt;/h2&gt;

&lt;p&gt;Your AI agent calls &lt;code&gt;upload_file&lt;/code&gt; with &lt;code&gt;purpose: "theme"&lt;/code&gt; and extracts colors automatically.&lt;/p&gt;

&lt;p&gt;Themes persist across sessions. Auto-generates tint ramps and WCAG contrast checks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://slideforge.dev/blog/custom-themes-guide" rel="noopener noreferrer"&gt;Full guide&lt;/a&gt; | &lt;a href="https://slideforge.dev/console/themes" rel="noopener noreferrer"&gt;Browse themes&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://slideforge.dev/blog/custom-themes-guide" rel="noopener noreferrer"&gt;slideforge.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>design</category>
      <category>branding</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Write Effective Briefs for AI Slide Generation</title>
      <dc:creator>Tom</dc:creator>
      <pubDate>Fri, 17 Apr 2026 18:18:03 +0000</pubDate>
      <link>https://dev.to/slideforge_5f3f3f08/how-to-write-effective-briefs-for-ai-slide-generation-5b7c</link>
      <guid>https://dev.to/slideforge_5f3f3f08/how-to-write-effective-briefs-for-ai-slide-generation-5b7c</guid>
      <description>&lt;p&gt;&lt;strong&gt;The quality of your SlideForge output depends almost entirely on the quality of your brief.&lt;/strong&gt; A good brief produces a polished slide in one shot. A vague brief wastes iterations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The #1 Mistake: Being Vague
&lt;/h2&gt;

&lt;p&gt;Bad: "Make a slide about our revenue."&lt;/p&gt;

&lt;p&gt;Good: "KPI dashboard: Revenue $12.4M (+18% YoY), New Clients 847 (+23%), Gross Margin 71% (-2pp), NPS 4.6 (+0.3). Kicker: Q1 2026 REVIEW."&lt;/p&gt;

&lt;h2&gt;
  
  
  5 Rules
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Include actual data&lt;/strong&gt; â€” never "include relevant metrics." The engine doesn't know your metrics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Name the slide type&lt;/strong&gt; â€” "SWOT analysis", "2x2 matrix", "timeline with 5 milestones"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Describe the visual structure&lt;/strong&gt; â€” "3-column comparison table, highlight column 2 as recommended"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specify chrome&lt;/strong&gt; â€” title, kicker, footer, page number, source attribution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use iteration for refinement, not generation&lt;/strong&gt; â€” get structure right first, then iterate on details ($0.10 vs $0.20)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Brief Templates
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;KPI Dashboard:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;"KPI dashboard: [Metric1] [Value] ([Trend]), [Metric2] [Value] ([Trend]). Kicker: [SECTION]."&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comparison Table:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;"3-column comparison. Columns: [A], [B], [C]. Rows: [Feature1], [Feature2]. Use checkmarks. Highlight [B] as recommended."&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timeline:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;"Horizontal timeline with [N] milestones: [Date1]: [Event1], [Date2]: [Event2]. Highlight [Date2] as current."&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://slideforge.dev/blog/write-effective-briefs" rel="noopener noreferrer"&gt;Full guide with more templates&lt;/a&gt; | &lt;a href="https://slideforge.dev/console/playground" rel="noopener noreferrer"&gt;Try in Playground&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://slideforge.dev/blog/write-effective-briefs" rel="noopener noreferrer"&gt;slideforge.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>productivity</category>
      <category>api</category>
    </item>
    <item>
      <title>Declarative Slides: CSS Flexbox Layout for PowerPoint</title>
      <dc:creator>Tom</dc:creator>
      <pubDate>Fri, 17 Apr 2026 18:17:27 +0000</pubDate>
      <link>https://dev.to/slideforge_5f3f3f08/declarative-slides-css-flexbox-layout-for-powerpoint-493d</link>
      <guid>https://dev.to/slideforge_5f3f3f08/declarative-slides-css-flexbox-layout-for-powerpoint-493d</guid>
      <description>&lt;p&gt;&lt;strong&gt;Build PowerPoint slides from JSON specs using CSS Flexbox layout and 24 composable components.&lt;/strong&gt; Deterministic rendering in &amp;lt;1s. Like React for slides, but the output is an editable .pptx.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Idea
&lt;/h2&gt;

&lt;p&gt;Instead of "describe what you want" (unpredictable AI), declare the exact structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"spec"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chrome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Q1 Dashboard"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"display"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"flex"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"direction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"column"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"gap"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"children"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"component"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Metric"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"metrics"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$12.4M"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Revenue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"trend"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"+18%"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"trend_dir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"up"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]}},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"component"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BarList"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Enterprise"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mid-Market"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]}}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  24 Components
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Components&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Metrics&lt;/td&gt;
&lt;td&gt;Metric, KPIGrid, ScoreCard, Gauge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Charts&lt;/td&gt;
&lt;td&gt;BarList, BarChart, StackedBar, DonutChart, Sparkline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Layouts&lt;/td&gt;
&lt;td&gt;Card, Grid, Columns, SplitPane&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content&lt;/td&gt;
&lt;td&gt;TextBlock, BulletList, Quote, Callout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Diagrams&lt;/td&gt;
&lt;td&gt;Steps, Timeline, Funnel, FlowChart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Tracker, RAGStatus, ProgressBar&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same spec = same output, every time. $0.05/slide, &amp;lt;1s.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://slideforge.dev/docs/api/components" rel="noopener noreferrer"&gt;Browse components&lt;/a&gt; | &lt;a href="https://slideforge.dev/sign-up" rel="noopener noreferrer"&gt;Sign up free&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://slideforge.dev/blog/declarative-slides-flexbox" rel="noopener noreferrer"&gt;slideforge.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>design</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Translate PowerPoint Files Programmatically in 2026</title>
      <dc:creator>Tom</dc:creator>
      <pubDate>Fri, 17 Apr 2026 18:17:23 +0000</pubDate>
      <link>https://dev.to/slideforge_5f3f3f08/translate-powerpoint-files-programmatically-in-2026-15hl</link>
      <guid>https://dev.to/slideforge_5f3f3f08/translate-powerpoint-files-programmatically-in-2026-15hl</guid>
      <description>&lt;p&gt;&lt;strong&gt;Translate .pptx files into 8 languages while preserving fonts, colors, charts, and layout.&lt;/strong&gt; Text-run-level replacement via API â€” no regeneration, no broken formatting. $0.02/slide.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Translating slides manually means copy-pasting into Google Translate, then pasting back into 47 text boxes. German text is ~30% longer than English, so boxes overflow. Fonts break. Hours wasted.&lt;/p&gt;

&lt;h2&gt;
  
  
  The API Call
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.slideforge.dev/v1/translate &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sf_live_YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"job_id": "SLIDE_JOB_ID", "target_language": "de"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns a job_id â€” poll for completion. The translated .pptx preserves all formatting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supported Languages
&lt;/h2&gt;

&lt;p&gt;English, German, French, Spanish, Italian, Portuguese, Dutch, Polish.&lt;/p&gt;

&lt;h2&gt;
  
  
  Options
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;concise_mode: true&lt;/code&gt; â€” shorter translations for tight text boxes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;include_notes: true&lt;/code&gt; â€” also translate speaker notes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;include_tables: true&lt;/code&gt; â€” translate table cells (default)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;$0.02/slide. A 20-slide deck costs $0.40.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://slideforge.dev/docs/api/translate" rel="noopener noreferrer"&gt;Full docs&lt;/a&gt; | &lt;a href="https://slideforge.dev/sign-up" rel="noopener noreferrer"&gt;Sign up free&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://slideforge.dev/blog/translate-powerpoint-api" rel="noopener noreferrer"&gt;slideforge.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>tutorial</category>
      <category>localization</category>
      <category>python</category>
    </item>
    <item>
      <title>Every Way to Generate Slides Programmatically in 2026</title>
      <dc:creator>Tom</dc:creator>
      <pubDate>Fri, 17 Apr 2026 18:16:50 +0000</pubDate>
      <link>https://dev.to/slideforge_5f3f3f08/every-way-to-generate-slides-programmatically-in-2026-1c9k</link>
      <guid>https://dev.to/slideforge_5f3f3f08/every-way-to-generate-slides-programmatically-in-2026-1c9k</guid>
      <description>&lt;p&gt;&lt;strong&gt;Compare every way to generate slides programmatically in 2026: SlideForge, Gamma, SlideSpeak, 2Slides, FlashDocs, python-pptx, Aspose, and Presenton.&lt;/strong&gt; Features, pricing, and how to choose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;Pricing&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SlideForge&lt;/td&gt;
&lt;td&gt;API + MCP (27 tools)&lt;/td&gt;
&lt;td&gt;Native .pptx + PDF + PNG&lt;/td&gt;
&lt;td&gt;$0.03-$0.20/slide&lt;/td&gt;
&lt;td&gt;Developers, AI agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gamma&lt;/td&gt;
&lt;td&gt;Consumer + API&lt;/td&gt;
&lt;td&gt;Web native (export breaks)&lt;/td&gt;
&lt;td&gt;$10-$20/mo&lt;/td&gt;
&lt;td&gt;Web presentations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SlideSpeak&lt;/td&gt;
&lt;td&gt;Consumer + API&lt;/td&gt;
&lt;td&gt;.pptx&lt;/td&gt;
&lt;td&gt;$29-$34/mo&lt;/td&gt;
&lt;td&gt;Document summarization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2Slides&lt;/td&gt;
&lt;td&gt;API + MCP&lt;/td&gt;
&lt;td&gt;.pptx (template) / Images (AI)&lt;/td&gt;
&lt;td&gt;$0.025-$1.10/slide&lt;/td&gt;
&lt;td&gt;Budget templates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;python-pptx&lt;/td&gt;
&lt;td&gt;Python library&lt;/td&gt;
&lt;td&gt;.pptx (full control)&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Full programmatic control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aspose.Slides&lt;/td&gt;
&lt;td&gt;Library (.NET/Java)&lt;/td&gt;
&lt;td&gt;.pptx + conversion&lt;/td&gt;
&lt;td&gt;$3,000-$4,000/yr&lt;/td&gt;
&lt;td&gt;Enterprise format conversion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Presenton&lt;/td&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;.pptx / PDF&lt;/td&gt;
&lt;td&gt;Free (BYO keys)&lt;/td&gt;
&lt;td&gt;Self-hosted, privacy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How to Choose
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API-first with editable .pptx&lt;/strong&gt; â†’ SlideForge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web presentations for humans&lt;/strong&gt; â†’ Gamma&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full programmatic control, free&lt;/strong&gt; â†’ python-pptx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise format conversion&lt;/strong&gt; â†’ Aspose.Slides&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-hosted with your own keys&lt;/strong&gt; â†’ Presenton&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://slideforge.dev/blog/presentation-apis-2026" rel="noopener noreferrer"&gt;Full comparison on slideforge.dev&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://slideforge.dev/blog/presentation-apis-2026" rel="noopener noreferrer"&gt;slideforge.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>comparison</category>
      <category>python</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Generate PowerPoint from Python in 2026</title>
      <dc:creator>Tom</dc:creator>
      <pubDate>Fri, 17 Apr 2026 18:16:46 +0000</pubDate>
      <link>https://dev.to/slideforge_5f3f3f08/how-to-generate-powerpoint-from-python-in-2026-4nk2</link>
      <guid>https://dev.to/slideforge_5f3f3f08/how-to-generate-powerpoint-from-python-in-2026-4nk2</guid>
      <description>&lt;p&gt;&lt;strong&gt;Three ways to create .pptx files from Python in 2026: python-pptx (free library), SlideForge API ($0.03/slide), and PptxGenJS.&lt;/strong&gt; This tutorial covers working code for each, the pain points, and when to use which.&lt;/p&gt;

&lt;h2&gt;
  
  
  python-pptx: The DIY Approach
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pptx&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Presentation&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pptx.util&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Inches&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pt&lt;/span&gt;

&lt;span class="n"&gt;prs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Presentation&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;slide&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slides&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_slide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slide_layouts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;txBox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;slide&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shapes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_textbox&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Inches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Inches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Inches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Inches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;txBox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text_frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Q1 Revenue: $12.4M&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;txBox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text_frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;paragraphs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Pt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;prs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;report.pptx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Works great for simple slides. But for consulting-quality output (KPI dashboards, SWOT matrices, timelines), you're looking at 60+ lines per slide â€” fonts, alignment, colors, spacing, all manual.&lt;/p&gt;

&lt;h2&gt;
  
  
  SlideForge API: 5 Lines
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.slideforge.dev/v1/render&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer sf_live_YOUR_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;template&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kpi_dashboard&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;brief&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Revenue $12.4M +18%, Clients 847 +23%, NPS 4.6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pptx_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# ready in &amp;lt;1s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;50 templates, $0.03/slide for templates, $0.20 for AI-designed custom layouts. Real editable .pptx.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use Which
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;python-pptx&lt;/th&gt;
&lt;th&gt;SlideForge&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0.03-$0.20/slide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setup time&lt;/td&gt;
&lt;td&gt;Hours-days&lt;/td&gt;
&lt;td&gt;5 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Design quality&lt;/td&gt;
&lt;td&gt;You manage&lt;/td&gt;
&lt;td&gt;Consulting-grade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Templates&lt;/td&gt;
&lt;td&gt;Build your own&lt;/td&gt;
&lt;td&gt;50 built-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Full control, offline&lt;/td&gt;
&lt;td&gt;Speed, quality, API automation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://slideforge.dev/blog/generate-powerpoint-python" rel="noopener noreferrer"&gt;Full tutorial on slideforge.dev&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://slideforge.dev/blog/generate-powerpoint-python" rel="noopener noreferrer"&gt;slideforge.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>tutorial</category>
      <category>api</category>
      <category>powerpoint</category>
    </item>
    <item>
      <title>Using MCP to Generate Slides from Claude Desktop</title>
      <dc:creator>Tom</dc:creator>
      <pubDate>Mon, 13 Apr 2026 15:08:30 +0000</pubDate>
      <link>https://dev.to/slideforge_5f3f3f08/using-mcp-to-generate-slides-from-claude-desktop-8n9</link>
      <guid>https://dev.to/slideforge_5f3f3f08/using-mcp-to-generate-slides-from-claude-desktop-8n9</guid>
      <description>&lt;p&gt;&lt;strong&gt;SlideForge has a native MCP server that lets Claude Desktop generate consulting-quality PowerPoint files.&lt;/strong&gt; Connect in 30 seconds with OAuth 2.1. Your agent gets 27 tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is MCP?
&lt;/h2&gt;

&lt;p&gt;MCP (Model Context Protocol) lets AI agents call external tools. Instead of Claude trying to generate a .pptx itself, it calls SlideForge â€” consulting-grade templates, AI creative generation, and visual QA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Connect (30 seconds)
&lt;/h2&gt;

&lt;p&gt;Add this to your &lt;code&gt;claude_desktop_config.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"slideforge"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.slideforge.dev/mcp/"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Claude Desktop. OAuth handles authentication automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Also works with:&lt;/strong&gt; Cursor, Windsurf, Claude Code, and any MCP-compatible client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Generate a slide
&lt;/h2&gt;

&lt;p&gt;Ask Claude: &lt;em&gt;"Create a KPI dashboard: revenue $12.4M (+18% YoY), 847 new clients (+23%), NPS 71"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Claude calls &lt;code&gt;suggest_template&lt;/code&gt;, finds a KPI template, calls &lt;code&gt;render_slide&lt;/code&gt;, returns the .pptx with an inline preview. Under 2 seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Iterate
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;"Make the Revenue metric larger and add a green checkmark icon"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Claude calls &lt;code&gt;iterate_slide&lt;/code&gt; with your feedback. $0.10 per iteration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Build a deck
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;"Create a 5-slide deck about our cloud migration strategy for the CTO"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Claude calls &lt;code&gt;generate_deck&lt;/code&gt; â€” plans slides, matches templates, generates in parallel, compiles into one .pptx. ~30 seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  27 MCP Tools
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Slide Generation&lt;/td&gt;
&lt;td&gt;render_slide, generate_slide, iterate_slide, render_spec, suggest_layout, render_preflight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deck Workflows&lt;/td&gt;
&lt;td&gt;generate_deck, consulting_deck, assemble_deck, fork_deck, translate_deck&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discovery&lt;/td&gt;
&lt;td&gt;suggest_template, search_templates, list_templates, search_components, list_components&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jobs &amp;amp; Status&lt;/td&gt;
&lt;td&gt;get_slide_status, list_jobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Account&lt;/td&gt;
&lt;td&gt;get_me, get_usage, get_capabilities, get_agent_onboarding, list_themes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Utilities&lt;/td&gt;
&lt;td&gt;upload_file, submit_feedback&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Template render: $0.03-$0.05/slide (&amp;lt;1s)&lt;/li&gt;
&lt;li&gt;AI generate: $0.20/slide (~30s)&lt;/li&gt;
&lt;li&gt;Iterate: $0.10&lt;/li&gt;
&lt;li&gt;Translate: $0.02/slide&lt;/li&gt;
&lt;li&gt;PDF to PPTX: $0.01/page&lt;/li&gt;
&lt;li&gt;Free trial: $3 credit on signup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://slideforge.dev/docs/mcp" rel="noopener noreferrer"&gt;Full MCP setup guide&lt;/a&gt; | &lt;a href="https://slideforge.dev/sign-up" rel="noopener noreferrer"&gt;Sign up free&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://slideforge.dev/blog/mcp-slides-claude" rel="noopener noreferrer"&gt;slideforge.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>claude</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Automate PowerPoint Reports from Excel with Python</title>
      <dc:creator>Tom</dc:creator>
      <pubDate>Mon, 13 Apr 2026 15:03:54 +0000</pubDate>
      <link>https://dev.to/slideforge_5f3f3f08/automate-powerpoint-reports-from-excel-with-python-42i3</link>
      <guid>https://dev.to/slideforge_5f3f3f08/automate-powerpoint-reports-from-excel-with-python-42i3</guid>
      <description>&lt;p&gt;&lt;strong&gt;You can automate your weekly PowerPoint reports from Excel data with 10 lines of Python â€” no manual formatting, no copy-pasting charts, no last-minute slide tweaks.&lt;/strong&gt; This guide shows two approaches: python-pptx for full control, and SlideForge's API for consulting-quality output in seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: manual report decks
&lt;/h2&gt;

&lt;p&gt;Every Monday morning, someone opens an Excel file, copies numbers into a PowerPoint template, screenshots a chart, pastes it, adjusts the alignment. For a 15-slide weekly report, this takes 1-2 hours. Every week.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach 1: python-pptx (free, full control)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pptx&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Presentation&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pptx.util&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Inches&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pt&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_excel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weekly_metrics.xlsx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sheet_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summary&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;prs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Presentation&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;slide&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slides&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_slide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slide_layouts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;txBox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;slide&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shapes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_textbox&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Inches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Inches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Inches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Inches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;txBox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text_frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Weekly Report&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;txBox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text_frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;paragraphs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Pt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# ... 500+ lines for a full 15-slide deck
&lt;/span&gt;&lt;span class="n"&gt;prs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weekly_report.pptx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works, but maintaining 500+ lines of layout code is a burden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach 2: SlideForge API (10 lines)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.slideforge.dev/v1/render&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer sf_live_YOUR_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;template&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kpi_dashboard&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Week 14 Performance&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;metrics&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$12.4M&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;label&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Revenue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;trend&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;+18%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;trend_dir&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;up&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;847&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;label&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Clients&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;trend&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;+23%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;trend_dir&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;up&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;theme_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;consulting_blue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pptx_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# ready in &amp;lt;1s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;$0.03 per slide. For a full deck, use the deck endpoint (~3s for 5 slides in parallel).&lt;/p&gt;

&lt;h2&gt;
  
  
  Scheduling
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cron:&lt;/strong&gt; &lt;code&gt;0 7 * * 1 python3 weekly_report.py&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Actions:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;7&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also works with Airflow, n8n, and Zapier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost comparison
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;python-pptx:&lt;/strong&gt; Free, 500+ lines, 2-4 hours to build&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SlideForge:&lt;/strong&gt; $0.03-$0.05/slide = &lt;strong&gt;$23-39/year&lt;/strong&gt; for a 15-slide weekly report&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual:&lt;/strong&gt; 1-2 hours/week = $2,500-5,000/year&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://slideforge.dev/sign-up" rel="noopener noreferrer"&gt;Sign up&lt;/a&gt; for $3 free credit.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://slideforge.dev/blog/automate-powerpoint-excel-python" rel="noopener noreferrer"&gt;slideforge.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>automation</category>
      <category>api</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Convert PDF to Editable PowerPoint via API</title>
      <dc:creator>Tom</dc:creator>
      <pubDate>Mon, 13 Apr 2026 15:01:55 +0000</pubDate>
      <link>https://dev.to/slideforge_5f3f3f08/how-to-convert-pdf-to-editable-powerpoint-via-api-2o1i</link>
      <guid>https://dev.to/slideforge_5f3f3f08/how-to-convert-pdf-to-editable-powerpoint-via-api-2o1i</guid>
      <description>&lt;p&gt;&lt;strong&gt;SlideForge can convert a PDF back into an editable .pptx file — with real text boxes, shapes, and images — not a rasterized image pasted onto a slide.&lt;/strong&gt; Upload a PDF exported from PowerPoint, Keynote, Google Slides, Canva, or LaTeX Beamer, and get an editable deck in seconds. $0.01 per page, fully automated via API.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: PDFs are a dead end
&lt;/h2&gt;

&lt;p&gt;You receive a competitor's deck as a PDF. A client sends last quarter's board presentation. Your design team exports to PDF "for safety." Now you need to update one number, swap a logo, or translate it into German. You can't. The PDF is a sealed format.&lt;/p&gt;

&lt;p&gt;The usual options are terrible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Adobe Acrobat "Export to PowerPoint"&lt;/strong&gt; — rasterizes every element into background images. Text boxes are fake overlays. Fonts don't match.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SmallPDF / iLovePDF / CloudConvert&lt;/strong&gt; — same approach. OCR + image paste. Not editable in any meaningful way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual recreation&lt;/strong&gt; — open the PDF, squint at the layout, rebuild it from scratch in PowerPoint. Takes hours per deck.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How SlideForge does it differently: vector extraction
&lt;/h2&gt;

&lt;p&gt;SlideForge doesn't OCR your PDF. It reads the actual vector content stream — the same drawing commands that placed shapes, positioned text runs, and embedded images. The engine reconstructs these as real PowerPoint objects: text boxes with the original font and size, rectangles with the original fill colors, images at their source resolution.&lt;/p&gt;

&lt;p&gt;The result: you open the .pptx in PowerPoint and click on any element. It's a real shape. You can edit the text, change the color, move it, delete it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Analyze (free)
&lt;/h2&gt;

&lt;p&gt;Before converting, check what you're working with:&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Convert
&lt;/h2&gt;

&lt;p&gt;Returns  with a . Poll  for progress and the final .&lt;/p&gt;

&lt;h2&gt;
  
  
  What gets preserved
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Text&lt;/strong&gt; — original font family, size, color, bold/italic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shapes&lt;/strong&gt; — rectangles, rounded rects, ovals, lines, freeform paths&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Images&lt;/strong&gt; — embedded at source resolution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tables&lt;/strong&gt; — reconstructed as PowerPoint table objects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layout&lt;/strong&gt; — element positioning matches the original PDF&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Supported sources
&lt;/h2&gt;

&lt;p&gt;PowerPoint, Apple Keynote, Google Slides, Canva, LaTeX Beamer, LibreOffice Impress. The  endpoint tells you whether a specific PDF is supported.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;$0.01 per page. A 24-page deck costs $0.24. Failed extractions are refunded.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://slideforge.dev/sign-up" rel="noopener noreferrer"&gt;Sign up&lt;/a&gt; for $3 free credit (enough for 300 pages), or &lt;a href="https://slideforge.dev/docs/quickstart" rel="noopener noreferrer"&gt;read the quickstart&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://slideforge.dev/blog/pdf-to-editable-powerpoint" rel="noopener noreferrer"&gt;slideforge.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>pdf</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
