<?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: Mohamed Amine Ben Mallessa</title>
    <description>The latest articles on DEV Community by Mohamed Amine Ben Mallessa (@benmallessamohamedamine).</description>
    <link>https://dev.to/benmallessamohamedamine</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%2F4014251%2Ff911cb52-4614-4ec3-8f26-78f6ce58775f.png</url>
      <title>DEV Community: Mohamed Amine Ben Mallessa</title>
      <link>https://dev.to/benmallessamohamedamine</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/benmallessamohamedamine"/>
    <language>en</language>
    <item>
      <title>Migration Photopea vers PDF serveur : retour d'expérience sur un pipeline de rendu avec Playwright</title>
      <dc:creator>Mohamed Amine Ben Mallessa</dc:creator>
      <pubDate>Sat, 04 Jul 2026 03:32:20 +0000</pubDate>
      <link>https://dev.to/benmallessamohamedamine/migration-photopea-vers-pdf-serveur-retour-dexperience-sur-un-pipeline-de-rendu-avec-playwright-2dj8</link>
      <guid>https://dev.to/benmallessamohamedamine/migration-photopea-vers-pdf-serveur-retour-dexperience-sur-un-pipeline-de-rendu-avec-playwright-2dj8</guid>
      <description>&lt;p&gt;&lt;em&gt;📖 Article original : &lt;a href="https://gist.github.com/mohamed-amine-ben-mallessa/df35e6bb0c7c81770c45b751bd40409e" rel="noopener noreferrer"&gt;GitHub Gist&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Par Mohamed Amine Ben Mallessa — Lead Dev Sollea AI&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Le contexte technique
&lt;/h2&gt;

&lt;p&gt;L'application qu'on a livrée permet de générer des affiches personnalisées à partir d'un simple formulaire web. L'utilisateur remplit ses informations, et l'application produit un document prêt à imprimer.&lt;/p&gt;

&lt;p&gt;Architecture : &lt;strong&gt;Next.js 15&lt;/strong&gt; (frontend par Nassim Tarkhani) + &lt;strong&gt;FastAPI&lt;/strong&gt; (backend par Nassim Tarkhani). Une stack moderne, mais le maillon faible était le rendu des documents — c'est là que je suis intervenu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le piège des solutions « gratuites »
&lt;/h2&gt;

&lt;p&gt;Quand on a commencé, Photopea semblait être la solution idéale. En pratique, le maintenir en production s'est révélé très coûteux :&lt;/p&gt;

&lt;h3&gt;
  
  
  Problème n°1 : L'iframe introuvable
&lt;/h3&gt;

&lt;p&gt;Le PSD était hébergé sur un serveur public. Les en-têtes CORS nécessaires n'étaient pas supportés par l'infrastructure du client.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problème n°2 : Les exports fantômes
&lt;/h3&gt;

&lt;p&gt;Les exports transitaient par un appel API. En cas de latence réseau, les fichiers étaient tronqués sans alerte.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problème n°3 : Aucun rendu serveur
&lt;/h3&gt;

&lt;p&gt;Le rendu passait obligatoirement par le navigateur du client. Pas de génération automatisée possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problème n°4 : L'effet « boîte noire »
&lt;/h3&gt;

&lt;p&gt;Impossible de diagnostiquer la source des bugs de rendu.&lt;/p&gt;

&lt;h2&gt;
  
  
  La solution que j'ai développée
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Décision 1 : Un template HTML = une affiche
&lt;/h3&gt;

&lt;p&gt;Au lieu d'un PSD fermé, chaque format d'affiche est un fichier HTML ouvert, versionné dans le dépôt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Décision 2 : Playwright pour le rendu serveur
&lt;/h3&gt;

&lt;p&gt;Chromium headless via Playwright produit un PDF vectoriel parfait et un PNG haute résolution. ~3,5 secondes par affiche.&lt;/p&gt;

&lt;h3&gt;
  
  
  Décision 3 : La même source de vérité
&lt;/h3&gt;

&lt;p&gt;Le template HTML sert à la fois pour l'aperçu live et le rendu final. &lt;strong&gt;Garantie que l'aperçu est identique au document imprimé.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Le résultat
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Métrique&lt;/th&gt;
&lt;th&gt;Avant (Photopea)&lt;/th&gt;
&lt;th&gt;Après (Moteur HTML)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dépendances externes&lt;/td&gt;
&lt;td&gt;2 (Canva, Photopea)&lt;/td&gt;
&lt;td&gt;1 (Playwright)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coût licence&lt;/td&gt;
&lt;td&gt;$$$ (Canva Enterprise)&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Temps de rendu&lt;/td&gt;
&lt;td&gt;30-60s&lt;/td&gt;
&lt;td&gt;~3,5s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rendu serveur&lt;/td&gt;
&lt;td&gt;Impossible&lt;/td&gt;
&lt;td&gt;PDF + PNG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fiabilité&lt;/td&gt;
&lt;td&gt;Fragile&lt;/td&gt;
&lt;td&gt;Robuste&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Ce que cette expérience m'a appris
&lt;/h2&gt;

&lt;p&gt;Les solutions « gratuites » qui nécessitent une infrastructure complexe reviennent souvent plus chères qu'une solution simple qu'on maîtrise de bout en bout. Un template HTML n'a pas la puissance d'un PSD, mais il est &lt;strong&gt;lisible, versionnable et reproductible&lt;/strong&gt; — trois avantages décisifs pour la production.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Mohamed Amine Ben Mallessa&lt;/strong&gt; — Lead Dev chez Sollea AI&lt;br&gt;
🔗 &lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Merci à **Nassim Tarkhani&lt;/em&gt;* pour le développement frontend et backend FastAPI.*&lt;/p&gt;

&lt;h1&gt;
  
  
  playwright #html #pdfgeneration #fastapi #nextjs #retourdexperience #solleaai #opensource
&lt;/h1&gt;




&lt;h2&gt;
  
  
  💻 Vous avez un projet similaire ?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sollea AI&lt;/strong&gt; — Développement full-stack, automatisation IA, solutions sur mesure.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://sollea-ai.com" rel="noopener noreferrer"&gt;Sollea AI&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Équipe dirigée par **Mohamed Amine Ben Mallessa&lt;/em&gt;* — Lead Dev Sollea AI*&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>opensource</category>
      <category>devops</category>
      <category>python</category>
    </item>
    <item>
      <title>Comment remplacer Canva et Photoshop par un moteur HTML open source avec Playwright</title>
      <dc:creator>Mohamed Amine Ben Mallessa</dc:creator>
      <pubDate>Sat, 04 Jul 2026 03:32:18 +0000</pubDate>
      <link>https://dev.to/benmallessamohamedamine/comment-remplacer-canva-et-photoshop-par-un-moteur-html-open-source-avec-playwright-4h2f</link>
      <guid>https://dev.to/benmallessamohamedamine/comment-remplacer-canva-et-photoshop-par-un-moteur-html-open-source-avec-playwright-4h2f</guid>
      <description>&lt;p&gt;&lt;em&gt;📖 Article original : &lt;a href="https://gist.github.com/mohamed-amine-ben-mallessa/002a7c28c1c5fd1e83580f8db3a77cc0" rel="noopener noreferrer"&gt;GitHub Gist&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Par Mohamed Amine Ben Mallessa — Lead Dev Sollea AI&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Le produit qu'on a construit
&lt;/h2&gt;

&lt;p&gt;Avec mon équipe chez Sollea AI, nous avons développé une plateforme SaaS de génération d'affiches événementielles. L'application complète — développée en Next.js 15 (frontend par Nassim Tarkhani) et FastAPI (backend par Nassim Tarkhani) — permet à des utilisateurs non techniques de remplir un formulaire et d'obtenir instantanément une affiche professionnelle prête à imprimer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le mur qu'on a rencontré
&lt;/h2&gt;

&lt;p&gt;Le pipeline de rendu original reposait sur deux briques externes :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Canva Connect / Autofill&lt;/strong&gt; : nécessitait un plan Enterprise à plusieurs milliers d'euros par an. Bloqué administrativement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Photopea&lt;/strong&gt; (alternative gratuite à Photoshop dans le navigateur) : fonctionnait en théorie, mais en pratique c'était un cauchemar technique :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chargement d'un PSD public dans un iframe — contraintes CORS impossibles à contourner proprement&lt;/li&gt;
&lt;li&gt;Ré-upload des exports vers le backend — fragilité réseau&lt;/li&gt;
&lt;li&gt;Artefacts bizarres dans le payload des tickets&lt;/li&gt;
&lt;li&gt;Aucun rendu côté serveur possible&lt;/li&gt;
&lt;li&gt;Pas d'injection de photos dans les mockups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bref : &lt;strong&gt;deux impasses techniques&lt;/strong&gt;, une équipe bloquée, un client qui attend.&lt;/p&gt;

&lt;h2&gt;
  
  
  La solution que j'ai développée
&lt;/h2&gt;

&lt;p&gt;J'ai remplacé l'ensemble du pipeline par un &lt;strong&gt;moteur de « render templates » HTML&lt;/strong&gt; qui tient dans 3 concepts :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Un template&lt;/strong&gt; = un dossier &lt;code&gt;backend/templates/&amp;lt;slug&amp;gt;/&lt;/code&gt; avec un &lt;code&gt;template.html&lt;/code&gt; + un &lt;code&gt;manifest.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L'aperçu live&lt;/strong&gt; = le frontend charge le template dans une iframe et lui envoie les données du formulaire par &lt;code&gt;postMessage&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Le rendu final&lt;/strong&gt; = Playwright (Chromium headless) ouvre le même template, injecte les données et exporte en &lt;strong&gt;PDF A4 vectoriel&lt;/strong&gt; + &lt;strong&gt;PNG 300 dpi&lt;/strong&gt; (~3,5 secondes)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ajouter un nouveau format d'affiche ? Il suffit de déposer un dossier. &lt;strong&gt;Zéro code backend, zéro code frontend.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce qu'on a supprimé
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;132 lignes de code Canva OAuth&lt;/li&gt;
&lt;li&gt;243 lignes de renderer Photopea&lt;/li&gt;
&lt;li&gt;87 lignes de compositeur canvas&lt;/li&gt;
&lt;li&gt;33 lignes de route d'export Photopea&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Résultat :&lt;/strong&gt; ~500 lignes de code supprimées, 0 dépendance externe de design, des affiches générées 10× plus vite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi c'est important
&lt;/h2&gt;

&lt;p&gt;Pas besoin de Canva Enterprise. Pas besoin de Photoshop. Pas besoin de SaaS payant. Un fichier HTML, un manifeste JSON, et Playwright.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;L'open source a encore gagné.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Article original publié sur GitHub Gist.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mohamed Amine Ben Mallessa&lt;/strong&gt; — Lead Dev chez Sollea AI&lt;br&gt;
🔗 &lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Merci à **Nassim Tarkhani&lt;/em&gt;* pour le développement frontend et backend FastAPI.*&lt;/p&gt;

&lt;h1&gt;
  
  
  opensource #playwright #htmltemplates #fastapi #nextjs #devops #solutions Techniques #innovation
&lt;/h1&gt;




&lt;h2&gt;
  
  
  💻 Vous avez un projet similaire ?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sollea AI&lt;/strong&gt; — Développement full-stack, automatisation IA, solutions sur mesure.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://sollea-ai.com" rel="noopener noreferrer"&gt;Sollea AI&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Équipe dirigée par **Mohamed Amine Ben Mallessa&lt;/em&gt;* — Lead Dev Sollea AI*&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>opensource</category>
      <category>python</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Vector PDF and 300 DPI PNG generated in 3 seconds with Playwright — Complete guide</title>
      <dc:creator>Mohamed Amine Ben Mallessa</dc:creator>
      <pubDate>Sat, 04 Jul 2026 01:18:05 +0000</pubDate>
      <link>https://dev.to/benmallessamohamedamine/vector-pdf-and-300-dpi-png-generated-in-3-seconds-with-playwright-complete-guide-4e56</link>
      <guid>https://dev.to/benmallessamohamedamine/vector-pdf-and-300-dpi-png-generated-in-3-seconds-with-playwright-complete-guide-4e56</guid>
      <description>&lt;p&gt;&lt;em&gt;📖 Original article: &lt;a href="https://gist.github.com/mohamed-amine-ben-mallessa/2be6f82322d3bd014e487e4453f48b53" rel="noopener noreferrer"&gt;GitHub Gist&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;By Mohamed Amine Ben Mallessa — Lead Dev at Sollea AI&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The challenge
&lt;/h2&gt;

&lt;p&gt;Generate customized vector PDF posters and high-res PNG images server-side on the fly. No fat client, no browser UI, no paid SaaS.&lt;/p&gt;

&lt;p&gt;The solution? Playwright (headless Chromium) + versioned HTML templates.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Form → HTML template + postMessage → Playwright headless → A4 vector PDF + 300 DPI PNG
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The template&lt;/strong&gt;: a self-contained HTML file with inline CSS and SVG. No external dependencies, no font loading, no network requests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The render&lt;/strong&gt;: Playwright opens the template, injects data via JavaScript, exports as PDF (1 page, vector, A4) and PNG (300 DPI, 2480×3508px).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The speed&lt;/strong&gt;: ~3.5 seconds per document. Fully reproducible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it beats wkhtmltopdf or Puppeteer
&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;Reliability&lt;/th&gt;
&lt;th&gt;Vector&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;Ease of use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;wkhtmltopdf&lt;/td&gt;
&lt;td&gt;⚠️ CSS issues&lt;/td&gt;
&lt;td&gt;✅ PDF&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ Unmaintained&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Puppeteer&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️ Heavy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Playwright&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅✅&lt;/td&gt;
&lt;td&gt;✅✅&lt;/td&gt;
&lt;td&gt;✅✅&lt;/td&gt;
&lt;td&gt;✅✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Playwright handles fonts, viewport, headless mode natively, and integrates perfectly with FastAPI.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trick
&lt;/h2&gt;

&lt;p&gt;One HTML template = live preview in the browser AND final PDF/PNG render. No duplicate code, no preview/production divergence.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;postMessage({ type: "setState", state: formData })&lt;/code&gt; → the template updates. Whether inside a frontend iframe or Playwright's headless Chromium.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we gained
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Zero subscription cost (no Canva, no Adobe)&lt;/li&gt;
&lt;li&gt;3.5s generation time&lt;/li&gt;
&lt;li&gt;Perfect vector PDF (no pixelation)&lt;/li&gt;
&lt;li&gt;Print-ready PNG&lt;/li&gt;
&lt;li&gt;Templates versioned in Git&lt;/li&gt;
&lt;li&gt;New format = one folder&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published on GitHub Gist.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mohamed Amine Ben Mallessa&lt;/strong&gt; — Lead Dev at Sollea AI&lt;br&gt;
🔗 &lt;a href="https://sollea-ai.com" rel="noopener noreferrer"&gt;Sollea AI&lt;/a&gt; · &lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  playwright #fastapi #pdfgeneration #htmltemplates #opensource #python #webdev
&lt;/h1&gt;




&lt;h2&gt;
  
  
  💻 Have a similar project?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sollea AI&lt;/strong&gt; — Full-stack development, AI automation, custom solutions.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://sollea-ai.com" rel="noopener noreferrer"&gt;Sollea AI&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Team led by **Mohamed Amine Ben Mallessa&lt;/em&gt;* — Lead Dev at Sollea AI*&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>python</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>PDF vectoriel et PNG 300 dpi générés en 3 secondes avec Playwright — Guide complet</title>
      <dc:creator>Mohamed Amine Ben Mallessa</dc:creator>
      <pubDate>Sat, 04 Jul 2026 01:13:16 +0000</pubDate>
      <link>https://dev.to/benmallessamohamedamine/pdf-vectoriel-et-png-300-dpi-generes-en-3-secondes-avec-playwright-guide-complet-3dm2</link>
      <guid>https://dev.to/benmallessamohamedamine/pdf-vectoriel-et-png-300-dpi-generes-en-3-secondes-avec-playwright-guide-complet-3dm2</guid>
      <description>&lt;p&gt;&lt;em&gt;📖 Article original : &lt;a href="https://gist.github.com/mohamed-amine-ben-mallessa/a080c23b29e9c535799a41552058c684" rel="noopener noreferrer"&gt;GitHub Gist&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Par Mohamed Amine Ben Mallessa — Lead Dev Sollea AI&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Le défi
&lt;/h2&gt;

&lt;p&gt;Nous devions générer des affiches personnalisées au format PDF vectoriel et PNG haute résolution, à la volée, côté serveur. Pas de client lourd, pas de navigateur, pas de SaaS externe.&lt;/p&gt;

&lt;p&gt;La solution ? Playwright (Chromium headless) + un template HTML versionné.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment ça marche
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Formulaire → Template HTML + postMessage → Playwright headless → PDF A4 vectoriel + PNG 300 dpi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Le template&lt;/strong&gt; : un fichier HTML autonome avec son CSS inline et son SVG. Pas de dépendance externe, pas de polices à charger, pas de requêtes réseau.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le rendu&lt;/strong&gt; : Playwright ouvre le template, injecte les données via JavaScript, exporte en PDF (1 page, vectoriel, A4) et en PNG (300 dpi, 2480×3508px).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le temps&lt;/strong&gt; : ~3,5 secondes par document. Reproductible à l'identique.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi c'est mieux que wkhtmltopdf ou Puppeteer
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;th&gt;Fiabilité&lt;/th&gt;
&lt;th&gt;Vectoriel&lt;/th&gt;
&lt;th&gt;Taille&lt;/th&gt;
&lt;th&gt;Facilité&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;wkhtmltopdf&lt;/td&gt;
&lt;td&gt;⚠️ CSS capricieux&lt;/td&gt;
&lt;td&gt;✅ PDF&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ Obsolète&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Puppeteer&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️ Lourd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Playwright&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅✅&lt;/td&gt;
&lt;td&gt;✅✅&lt;/td&gt;
&lt;td&gt;✅✅&lt;/td&gt;
&lt;td&gt;✅✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Playwright gère nativement les polices, le viewport, le mode headless, et s'intègre parfaitement avec FastAPI via un simple &lt;code&gt;subprocess&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  L'astuce
&lt;/h2&gt;

&lt;p&gt;Un seul template HTML = aperçu live dans le navigateur + rendu final PDF/PNG. Pas de code en double, pas de divergence preview/production.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;postMessage({ type: "setState", state: formData })&lt;/code&gt; → le template se met à jour. Que ce soit dans l'iframe du frontend ou dans Chromium headless.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce qu'on a gagné
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;0 abonnement (ni Canva, ni Adobe)&lt;/li&gt;
&lt;li&gt;3,5s de temps de génération&lt;/li&gt;
&lt;li&gt;PDF vectoriel parfait (pas de pixelisation)&lt;/li&gt;
&lt;li&gt;PNG prêt à imprimer&lt;/li&gt;
&lt;li&gt;Templates versionnés dans Git&lt;/li&gt;
&lt;li&gt;Ajout d'un nouveau format = 1 dossier&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Le client économise des milliers d'euros par an et gagne en autonomie.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Article initialement publié sur GitHub Gist.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mohamed Amine Ben Mallessa&lt;/strong&gt; — Lead Dev chez Sollea AI&lt;br&gt;
🔗 &lt;a href="https://sollea-ai.com" rel="noopener noreferrer"&gt;Sollea AI&lt;/a&gt; · &lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  playwright #fastapi #pdfgeneration #htmltemplates #opensource #python #webdev
&lt;/h1&gt;




&lt;h2&gt;
  
  
  💻 Vous avez un projet similaire ?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sollea AI&lt;/strong&gt; — Développement full-stack, automatisation IA, solutions sur mesure.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://sollea-ai.com" rel="noopener noreferrer"&gt;Sollea AI&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Équipe dirigée par **Mohamed Amine Ben Mallessa&lt;/em&gt;* — Lead Dev Sollea AI*&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>python</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Génération de documents PDF en 3 secondes avec Playwright et FastAPI — Tutoriel</title>
      <dc:creator>Mohamed Amine Ben Mallessa</dc:creator>
      <pubDate>Sat, 04 Jul 2026 01:11:24 +0000</pubDate>
      <link>https://dev.to/benmallessamohamedamine/generation-de-documents-pdf-en-3-secondes-avec-playwright-et-fastapi-tutoriel-37mj</link>
      <guid>https://dev.to/benmallessamohamedamine/generation-de-documents-pdf-en-3-secondes-avec-playwright-et-fastapi-tutoriel-37mj</guid>
      <description>&lt;p&gt;&lt;em&gt;📖 Article original : &lt;a href="https://gist.github.com/mohamed-amine-ben-mallessa/a080c23b29e9c535799a41552058c684" rel="noopener noreferrer"&gt;GitHub Gist&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Par Mohamed Amine Ben Mallessa — Lead Dev Sollea AI&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Le défi
&lt;/h2&gt;

&lt;p&gt;Nous devions générer des affiches personnalisées au format PDF vectoriel et PNG haute résolution, à la volée, côté serveur. Pas de client lourd, pas de navigateur, pas de SaaS externe.&lt;/p&gt;

&lt;p&gt;La solution ? Playwright (Chromium headless) + un template HTML versionné.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment ça marche
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Formulaire → Template HTML + postMessage → Playwright headless → PDF A4 vectoriel + PNG 300 dpi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Le template&lt;/strong&gt; : un fichier HTML autonome avec son CSS inline et son SVG. Pas de dépendance externe, pas de polices à charger, pas de requêtes réseau.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le rendu&lt;/strong&gt; : Playwright ouvre le template, injecte les données via JavaScript, exporte en PDF (1 page, vectoriel, A4) et en PNG (300 dpi, 2480×3508px).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le temps&lt;/strong&gt; : ~3,5 secondes par document. Reproductible à l'identique.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi c'est mieux que wkhtmltopdf ou Puppeteer
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;th&gt;Fiabilité&lt;/th&gt;
&lt;th&gt;Vectoriel&lt;/th&gt;
&lt;th&gt;Taille&lt;/th&gt;
&lt;th&gt;Facilité&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;wkhtmltopdf&lt;/td&gt;
&lt;td&gt;⚠️ CSS capricieux&lt;/td&gt;
&lt;td&gt;✅ PDF&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ Obsolète&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Puppeteer&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️ Lourd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Playwright&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅✅&lt;/td&gt;
&lt;td&gt;✅✅&lt;/td&gt;
&lt;td&gt;✅✅&lt;/td&gt;
&lt;td&gt;✅✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Playwright gère nativement les polices, le viewport, le mode headless, et s'intègre parfaitement avec FastAPI via un simple &lt;code&gt;subprocess&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  L'astuce
&lt;/h2&gt;

&lt;p&gt;Un seul template HTML = aperçu live dans le navigateur + rendu final PDF/PNG. Pas de code en double, pas de divergence preview/production.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;postMessage({ type: "setState", state: formData })&lt;/code&gt; → le template se met à jour. Que ce soit dans l'iframe du frontend ou dans Chromium headless.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce qu'on a gagné
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;0 abonnement (ni Canva, ni Adobe)&lt;/li&gt;
&lt;li&gt;3,5s de temps de génération&lt;/li&gt;
&lt;li&gt;PDF vectoriel parfait (pas de pixelisation)&lt;/li&gt;
&lt;li&gt;PNG prêt à imprimer&lt;/li&gt;
&lt;li&gt;Templates versionnés dans Git&lt;/li&gt;
&lt;li&gt;Ajout d'un nouveau format = 1 dossier&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Le client économise des milliers d'euros par an et gagne en autonomie.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Article initialement publié sur GitHub Gist.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mohamed Amine Ben Mallessa&lt;/strong&gt; — Lead Dev chez Sollea AI&lt;br&gt;
🔗 &lt;a href="https://sollea-ai.com" rel="noopener noreferrer"&gt;Sollea AI&lt;/a&gt; · &lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  playwright #fastapi #pdfgeneration #htmltemplates #opensource #python #webdev
&lt;/h1&gt;




&lt;h2&gt;
  
  
  💻 Vous avez un projet similaire ?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sollea AI&lt;/strong&gt; — Développement full-stack, automatisation IA, solutions sur mesure.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://sollea-ai.com" rel="noopener noreferrer"&gt;Sollea AI&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Équipe dirigée par **Mohamed Amine Ben Mallessa&lt;/em&gt;* — Lead Dev Sollea AI*&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>python</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>From fragile iframes to server-side PDFs: a rendering migration story with Playwright</title>
      <dc:creator>Mohamed Amine Ben Mallessa</dc:creator>
      <pubDate>Sat, 04 Jul 2026 01:07:09 +0000</pubDate>
      <link>https://dev.to/benmallessamohamedamine/from-fragile-iframes-to-server-side-pdfs-a-rendering-migration-story-with-playwright-hhl</link>
      <guid>https://dev.to/benmallessamohamedamine/from-fragile-iframes-to-server-side-pdfs-a-rendering-migration-story-with-playwright-hhl</guid>
      <description>&lt;p&gt;&lt;strong&gt;By Mohamed Amine Ben Mallessa — Lead Dev at Sollea AI&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The technical context
&lt;/h2&gt;

&lt;p&gt;The application we shipped generates customized posters from a simple web form. Users fill in their event details (dates, venue, times) and the app produces a print-ready document.&lt;/p&gt;

&lt;p&gt;Tech stack: &lt;strong&gt;Next.js 15&lt;/strong&gt; (App Router, TypeScript, TanStack Query) + &lt;strong&gt;FastAPI&lt;/strong&gt; (SQLAlchemy 2, PostgreSQL). Modern stack — but document rendering was the weak link.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trap of "free" solutions
&lt;/h2&gt;

&lt;p&gt;When we started, Photopea looked ideal: a free Photoshop clone, scriptable via JavaScript. In production, it turned into a maintenance sink:&lt;/p&gt;

&lt;h3&gt;
  
  
  Issue #1: The elusive iframe
&lt;/h3&gt;

&lt;p&gt;PSD files had to be publicly hosted with &lt;code&gt;Access-Control-Allow-Origin: *&lt;/code&gt;. A CORS requirement that the client's infrastructure couldn't meet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Issue #2: Ghost exports
&lt;/h3&gt;

&lt;p&gt;Exports traveled through a backend API route (&lt;code&gt;/photopea/exports&lt;/code&gt;). Network latency or timeouts could silently truncate exports.&lt;/p&gt;

&lt;h3&gt;
  
  
  Issue #3: No server-side rendering
&lt;/h3&gt;

&lt;p&gt;Everything went through the client's browser. No automated generation, no CI/CD pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Issue #4: The black box effect
&lt;/h3&gt;

&lt;p&gt;When a poster had rendering issues, nobody could tell if the problem was Photopea, the network, the PSD, or the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix in 3 decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Decision 1: HTML template = poster
&lt;/h3&gt;

&lt;p&gt;Instead of a closed PSD, each poster format is an open HTML file versioned in the repo. Full control of layout, CSS, SVG.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decision 2: Playwright for server-side render
&lt;/h3&gt;

&lt;p&gt;Headless Chromium via Playwright produces a perfect vector PDF and high-res PNG. Average time: 3.5 seconds per poster. Fully reproducible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decision 3: Single source of truth
&lt;/h3&gt;

&lt;p&gt;The same HTML template serves both the live iframe preview AND the Playwright final render. &lt;strong&gt;Zero difference between preview and printed document.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before (Photopea)&lt;/th&gt;
&lt;th&gt;After (HTML Engine)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;External dependencies&lt;/td&gt;
&lt;td&gt;2 (Canva, Photopea)&lt;/td&gt;
&lt;td&gt;1 (Playwright)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License cost&lt;/td&gt;
&lt;td&gt;$$$$ (Canva Enterprise)&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Render time&lt;/td&gt;
&lt;td&gt;30-60s (network dependent)&lt;/td&gt;
&lt;td&gt;~3.5s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server-side render&lt;/td&gt;
&lt;td&gt;Impossible&lt;/td&gt;
&lt;td&gt;PDF + PNG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reliability&lt;/td&gt;
&lt;td&gt;Fragile&lt;/td&gt;
&lt;td&gt;Robust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adding a template&lt;/td&gt;
&lt;td&gt;Complex config&lt;/td&gt;
&lt;td&gt;One folder + manifest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;"Free" solutions with complex infrastructure often end up costing more than a simple solution you fully control.&lt;/p&gt;

&lt;p&gt;An HTML template isn't as powerful as a PSD — but it has three decisive advantages: &lt;strong&gt;it's readable, versionable, and reproducible.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thanks to &lt;strong&gt;Nassim Tarkhani&lt;/strong&gt; for pushing this direction. This idea saved the project.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Mohamed Amine Ben Mallessa&lt;/strong&gt; — Lead Dev at Sollea AI&lt;br&gt;
🔗 &lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Need help with your technical stack? Sollea AI specializes in custom automation and AI solutions.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  playwright #html #pdfgeneration #fastapi #nextjs #engineering #webdev #architecture
&lt;/h1&gt;




&lt;h2&gt;
  
  
  💻 Have a similar project?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sollea AI&lt;/strong&gt; — Full-stack development, AI automation, custom solutions.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://sollea-ai.com" rel="noopener noreferrer"&gt;Sollea AI&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Team led by **Mohamed Amine Ben Mallessa&lt;/em&gt;* — Lead Dev at Sollea AI*&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>opensource</category>
      <category>devops</category>
      <category>python</category>
    </item>
    <item>
      <title>Migration Photopea vers PDF serveur : retour d'expérience sur un pipeline de rendu avec Playwright</title>
      <dc:creator>Mohamed Amine Ben Mallessa</dc:creator>
      <pubDate>Sat, 04 Jul 2026 01:05:56 +0000</pubDate>
      <link>https://dev.to/benmallessamohamedamine/migration-photopea-vers-pdf-serveur-retour-dexperience-sur-un-pipeline-de-rendu-avec-playwright-bjp</link>
      <guid>https://dev.to/benmallessamohamedamine/migration-photopea-vers-pdf-serveur-retour-dexperience-sur-un-pipeline-de-rendu-avec-playwright-bjp</guid>
      <description>&lt;p&gt;CONTENT_PLACEHOLDER&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>opensource</category>
      <category>devops</category>
      <category>python</category>
    </item>
    <item>
      <title>How to replace Canva and Photopea with an open-source HTML render engine using Playwright</title>
      <dc:creator>Mohamed Amine Ben Mallessa</dc:creator>
      <pubDate>Sat, 04 Jul 2026 00:59:59 +0000</pubDate>
      <link>https://dev.to/benmallessamohamedamine/how-to-replace-canva-and-photopea-with-an-open-source-html-render-engine-using-playwright-2p2k</link>
      <guid>https://dev.to/benmallessamohamedamine/how-to-replace-canva-and-photopea-with-an-open-source-html-render-engine-using-playwright-2p2k</guid>
      <description>&lt;p&gt;&lt;em&gt;📖 Article original : &lt;a href="https://gist.github.com/mohamed-amine-ben-mallessa/ee4a98ecd8e6af1d33893e1397986bbb" rel="noopener noreferrer"&gt;GitHub Gist&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;By Mohamed Amine Ben Mallessa — Lead Dev at Sollea AI&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The product we built
&lt;/h2&gt;

&lt;p&gt;My team at &lt;strong&gt;Sollea AI&lt;/strong&gt; developed a SaaS platform for generating event posters. The full-stack application — built with &lt;strong&gt;Next.js 15&lt;/strong&gt; (frontend) and &lt;strong&gt;FastAPI&lt;/strong&gt; (backend) — lets non-technical users fill a form and instantly get a print-ready professional poster.&lt;/p&gt;

&lt;h2&gt;
  
  
  The wall we hit
&lt;/h2&gt;

&lt;p&gt;The original rendering pipeline depended on two external services:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Canva Connect / Autofill&lt;/strong&gt; : required an Enterprise plan costing thousands per year. Blocked by procurement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Photopea&lt;/strong&gt; (free browser-based Photoshop alternative): worked in theory but was a technical nightmare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loading a public PSD in an iframe → impossible CORS issues&lt;/li&gt;
&lt;li&gt;Re-uploading exports to the backend → network fragility&lt;/li&gt;
&lt;li&gt;Ghost &lt;code&gt;_photopea_preview_url&lt;/code&gt; values appearing in the ticket payload&lt;/li&gt;
&lt;li&gt;No server-side rendering possible (everything went through the client's browser)&lt;/li&gt;
&lt;li&gt;No photo injection into mockups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Two dead ends.&lt;/strong&gt; A blocked team. A waiting client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nassim's insight
&lt;/h2&gt;

&lt;p&gt;It was &lt;strong&gt;Nassim Tarkhani&lt;/strong&gt; who had the intuition: what if we replaced all this with a simple versioned HTML template, rendered by Playwright?&lt;/p&gt;

&lt;p&gt;A self-contained HTML file served statically from the backend, controlled via &lt;code&gt;postMessage&lt;/code&gt;. The same file drives both the live iframe preview AND the server-side PDF/PNG rendering.&lt;/p&gt;

&lt;p&gt;This sounds obvious in hindsight. That's usually the hallmark of the best solutions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;render template engine&lt;/strong&gt; fits in 3 concepts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A template&lt;/strong&gt; = a &lt;code&gt;backend/templates/&amp;lt;slug&amp;gt;/&lt;/code&gt; folder with &lt;code&gt;template.html&lt;/code&gt; + &lt;code&gt;manifest.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The live preview&lt;/strong&gt; = the frontend loads the template in an iframe and sends form data via &lt;code&gt;postMessage&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The final render&lt;/strong&gt; = Playwright (headless Chromium) opens the same template, injects the data and exports &lt;strong&gt;vector A4 PDF&lt;/strong&gt; + &lt;strong&gt;300 DPI PNG&lt;/strong&gt; (~3.5 seconds)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Adding a new poster format? Just drop a folder. &lt;strong&gt;Zero backend code. Zero frontend code.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What we deleted
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;132 lines of Canva OAuth code (connect, callback, refresh)&lt;/li&gt;
&lt;li&gt;243 lines of Photopea renderer (iframe, script injection, error handling)&lt;/li&gt;
&lt;li&gt;87 lines of canvas compositor (working around Photopea's limitations)&lt;/li&gt;
&lt;li&gt;33 lines of Photopea export route&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; ~500 lines deleted, 0 external design dependencies, posters generated 10× faster.&lt;/p&gt;

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

&lt;p&gt;No Canva Enterprise. No Photoshop. No paid SaaS. An HTML file, a JSON manifest, and Playwright.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open source wins again.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on GitHub Gist.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mohamed Amine Ben Mallessa&lt;/strong&gt; — Lead Dev at Sollea AI&lt;br&gt;
🔗 &lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Special thanks to **Nassim Tarkhani&lt;/em&gt;* for the idea and the code review.*&lt;/p&gt;

&lt;h1&gt;
  
  
  opensource #playwright #htmltemplates #fastapi #nextjs #devops #pdfgeneration #innovation
&lt;/h1&gt;




&lt;h2&gt;
  
  
  💻 Have a similar project?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sollea AI&lt;/strong&gt; — Full-stack development, AI automation, custom solutions.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://sollea-ai.com" rel="noopener noreferrer"&gt;Sollea AI&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Team led by **Mohamed Amine Ben Mallessa&lt;/em&gt;* — Lead Dev at Sollea AI*&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>opensource</category>
      <category>python</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Comment remplacer Canva et Photoshop par un moteur HTML open source avec Playwright</title>
      <dc:creator>Mohamed Amine Ben Mallessa</dc:creator>
      <pubDate>Sat, 04 Jul 2026 00:59:53 +0000</pubDate>
      <link>https://dev.to/benmallessamohamedamine/comment-remplacer-canva-et-photoshop-par-un-moteur-html-open-source-avec-playwright-2kjp</link>
      <guid>https://dev.to/benmallessamohamedamine/comment-remplacer-canva-et-photoshop-par-un-moteur-html-open-source-avec-playwright-2kjp</guid>
      <description>&lt;p&gt;&lt;em&gt;📖 Article original : &lt;a href="https://gist.github.com/mohamed-amine-ben-mallessa/31745d1f751f04c4bd20b18483432840" rel="noopener noreferrer"&gt;GitHub Gist&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Par Mohamed Amine Ben Mallessa — Lead Dev Sollea AI&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Le produit qu'on a construit
&lt;/h2&gt;

&lt;p&gt;Avec mon équipe chez Sollea AI, nous avons développé une plateforme SaaS de génération d'affiches événementielles pour un client du secteur de la formation. L'application complète — développée en Next.js 15 (frontend) et FastAPI (backend) — permet à des utilisateurs non techniques de remplir un formulaire et d'obtenir instantanément une affiche professionnelle prête à imprimer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le mur qu'on a rencontré
&lt;/h2&gt;

&lt;p&gt;Le pipeline de rendu original reposait sur deux briques externes :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Canva Connect / Autofill&lt;/strong&gt; : nécessitait un plan Enterprise à plusieurs milliers d'euros par an. Bloqué administrativement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Photopea&lt;/strong&gt; (alternative gratuite à Photoshop dans le navigateur) : fonctionnait en théorie, mais en pratique c'était un cauchemar technique :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chargement d'un PSD public dans un iframe — contraintes CORS impossibles à contourner proprement&lt;/li&gt;
&lt;li&gt;Ré-upload des exports vers le backend — fragilité réseau&lt;/li&gt;
&lt;li&gt;Artefacts bizarres dans le payload des tickets (valeurs &lt;code&gt;_photopea_preview_url&lt;/code&gt; qui s'invitaient sans prévenir)&lt;/li&gt;
&lt;li&gt;Aucun rendu côté serveur possible (tout passait par le navigateur du client)&lt;/li&gt;
&lt;li&gt;Pas d'injection de photos dans les mockups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bref : &lt;strong&gt;deux impasses techniques&lt;/strong&gt;, une équipe bloquée, un client qui attend.&lt;/p&gt;

&lt;h2&gt;
  
  
  L'idée de Nassim
&lt;/h2&gt;

&lt;p&gt;C'est &lt;strong&gt;Nassim Tarkhani&lt;/strong&gt; qui a eu l'intuition : et si on remplaçait ça par un simple template HTML versionné, rendu par Playwright ?&lt;/p&gt;

&lt;p&gt;Un template HTML qu'on sert statiquement depuis le backend et qu'on pilote par &lt;code&gt;postMessage&lt;/code&gt;. Le même fichier sert pour l'aperçu live dans le navigateur ET pour le rendu final PDF/PNG sur le serveur.&lt;/p&gt;

&lt;p&gt;Cette idée paraît simple a posteriori. Mais c'est souvent le signe des meilleures solutions.&lt;/p&gt;

&lt;h2&gt;
  
  
  La solution
&lt;/h2&gt;

&lt;p&gt;Le résultat, c'est un &lt;strong&gt;moteur de « render templates »&lt;/strong&gt; qui tient dans 3 concepts :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Un template&lt;/strong&gt; = un dossier &lt;code&gt;backend/templates/&amp;lt;slug&amp;gt;/&lt;/code&gt; avec un &lt;code&gt;template.html&lt;/code&gt; + un &lt;code&gt;manifest.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L'aperçu live&lt;/strong&gt; = le frontend charge le template dans une iframe et lui envoie les données du formulaire par &lt;code&gt;postMessage&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Le rendu final&lt;/strong&gt; = Playwright (Chromium headless) ouvre le même template, injecte les données et exporte en &lt;strong&gt;PDF A4 vectoriel&lt;/strong&gt; + &lt;strong&gt;PNG 300 dpi&lt;/strong&gt; (~3,5 secondes)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ajouter un nouveau format d'affiche ? Il suffit de déposer un dossier. &lt;strong&gt;Zéro code backend, zéro code frontend.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce qu'on a supprimé
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;132 lignes de code Canva OAuth (connexion, callback, refresh token)&lt;/li&gt;
&lt;li&gt;243 lignes de renderer Photopea (iframe, script injection, gestion d'erreurs)&lt;/li&gt;
&lt;li&gt;87 lignes de compositeur canvas (compensation des limitations Photopea)&lt;/li&gt;
&lt;li&gt;33 lignes de route d'export Photopea&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Résultat :&lt;/strong&gt; ~500 lignes de code supprimées, 0 dépendance externe de design, des affiches générées 10× plus vite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi c'est important
&lt;/h2&gt;

&lt;p&gt;Pas besoin de Canva Enterprise. Pas besoin de Photoshop. Pas besoin de SaaS payant. Un fichier HTML, un manifeste JSON, et Playwright.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;L'open source a encore gagné.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Article original publié sur GitHub Gist.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mohamed Amine Ben Mallessa&lt;/strong&gt; — Lead Dev chez Sollea AI&lt;br&gt;
🔗 &lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Remerciements à **Nassim Tarkhani&lt;/em&gt;* pour l'idée et la review.*&lt;/p&gt;

&lt;h1&gt;
  
  
  opensource #playwright #htmltemplates #fastapi #nextjs #devops #solutions Techniques #innovation
&lt;/h1&gt;




&lt;h2&gt;
  
  
  💻 Vous avez un projet similaire ?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sollea AI&lt;/strong&gt; — Développement full-stack, automatisation IA, solutions sur mesure.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://sollea-ai.com" rel="noopener noreferrer"&gt;Sollea AI&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Équipe dirigée par **Mohamed Amine Ben Mallessa&lt;/em&gt;* — Lead Dev Sollea AI*&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>opensource</category>
      <category>python</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Convertir des images en lot (HEIC, WebP, JPG) gratuitement — Guide pratique</title>
      <dc:creator>Mohamed Amine Ben Mallessa</dc:creator>
      <pubDate>Sat, 04 Jul 2026 00:46:57 +0000</pubDate>
      <link>https://dev.to/benmallessamohamedamine/convertir-des-images-en-lot-heic-webp-jpg-gratuitement-guide-pratique-3blb</link>
      <guid>https://dev.to/benmallessamohamedamine/convertir-des-images-en-lot-heic-webp-jpg-gratuitement-guide-pratique-3blb</guid>
      <description>&lt;p&gt;&lt;em&gt;📖 Article original : &lt;a href="https://gist.github.com/mohamed-amine-ben-mallessa/372bc01f7ad1fdea3dd23ce98d6811e0" rel="noopener noreferrer"&gt;GitHub Gist&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Un guide technique par Mohamed ben mallessa&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Le problème
&lt;/h2&gt;

&lt;p&gt;Recevoir un dossier de 500 fichiers HEIC à convertir en WebP pour un site web est une situation courante pour tout développeur. Les solutions traditionnelles ont leurs limites : ImageMagick nécessite des codecs spécifiques, les convertisseurs en ligne sont limités en taille, et le traitement manuel est exclu à cette échelle.&lt;/p&gt;

&lt;h2&gt;
  
  
  La solution
&lt;/h2&gt;

&lt;p&gt;Photopea (Photoshop gratuit dans le navigateur) supporte nativement tous les formats d'image courants. En l'utilisant comme moteur de conversion piloté par script, on obtient un pipeline batch rapide et fiable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Formats supportés
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Entrée&lt;/th&gt;
&lt;th&gt;Sorties possibles&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HEIC / HEIF&lt;/td&gt;
&lt;td&gt;JPG, PNG, WebP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JPEG&lt;/td&gt;
&lt;td&gt;WebP, PNG, PSD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PNG&lt;/td&gt;
&lt;td&gt;JPG, WebP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WebP&lt;/td&gt;
&lt;td&gt;PNG, JPG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PSD&lt;/td&gt;
&lt;td&gt;PNG, JPG, WebP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SVG&lt;/td&gt;
&lt;td&gt;PNG, JPG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIFF&lt;/td&gt;
&lt;td&gt;PNG, JPG, WebP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Pipeline
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dossier source (500 HEIC) → Photopea → Dossier sortie (500 WebP)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le script préserve la structure des sous-dossiers, applique le redimensionnement et la qualité configurés, et livre les fichiers organisés.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paramètres typiques
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;--format&lt;/span&gt; webp    &lt;span class="c"&gt;# Format de sortie&lt;/span&gt;
&lt;span class="nt"&gt;--quality&lt;/span&gt; 80     &lt;span class="c"&gt;# Qualité (1-100)&lt;/span&gt;
&lt;span class="nt"&gt;--resize&lt;/span&gt; 1920    &lt;span class="c"&gt;# Redimensionnement (côté long)&lt;/span&gt;
&lt;span class="nt"&gt;--output&lt;/span&gt; ./web/  &lt;span class="c"&gt;# Dossier de destination&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Avantages
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Un seul outil&lt;/strong&gt; pour tous les formats d'entrée&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aucun codec&lt;/strong&gt; à installer (Photopea gère tout nativement)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gratuit&lt;/strong&gt; et sans abonnement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local&lt;/strong&gt; — les fichiers ne quittent pas votre machine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structure préservée&lt;/strong&gt; — l'arborescence est conservée&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Mohamed ben mallessa&lt;/strong&gt; — Full-stack developer &amp;amp; solutions B2B&lt;br&gt;
🔗 &lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  opensource #webp #python #tutorial
&lt;/h1&gt;




&lt;h2&gt;
  
  
  💻 Vous avez un projet technique ?
&lt;/h2&gt;

&lt;p&gt;Développement full-stack, automatisation IA, solutions B2B sur mesure.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
💼 &lt;strong&gt;&lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
🎨 &lt;strong&gt;&lt;a href="https://www.behance.net/benmalmoamed" rel="noopener noreferrer"&gt;Behance&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Article initialement publié sur &lt;a href="https://gist.github.com/mohamed-amine-ben-mallessa/372bc01f7ad1fdea3dd23ce98d6811e0" rel="noopener noreferrer"&gt;GitHub Gist&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>webp</category>
      <category>opensource</category>
      <category>python</category>
    </item>
    <item>
      <title>Générer des mockups produits en lot</title>
      <dc:creator>Mohamed Amine Ben Mallessa</dc:creator>
      <pubDate>Sat, 04 Jul 2026 00:46:38 +0000</pubDate>
      <link>https://dev.to/benmallessamohamedamine/generer-des-mockups-produits-en-lot-5a1</link>
      <guid>https://dev.to/benmallessamohamedamine/generer-des-mockups-produits-en-lot-5a1</guid>
      <description>&lt;p&gt;&lt;em&gt;📖 Article original : &lt;a href="https://gist.github.com/mohamed-amine-ben-mallessa/0a6a636b4b56229efa200d2403e432c9" rel="noopener noreferrer"&gt;GitHub Gist&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Un guide technique par Mohamed ben mallessa&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Le besoin
&lt;/h2&gt;

&lt;p&gt;Un template PSD, 50 variantes produit, un seul résultat attendu : 50 mockups finis. La méthode manuelle (ouvrir → glisser → exporter → répéter) prend des heures. L'alternative : un batch automatisé piloté par script.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le fonctionnement
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Un template PSD contenant un smart object nommé (ex: "MOCKUP_PLACEHOLDER")&lt;/li&gt;
&lt;li&gt;Un fichier CSV listant les produits et leurs chemins d'images&lt;/li&gt;
&lt;li&gt;Un script qui itère sur le CSV, remplace le smart object et exporte chaque variante&lt;/li&gt;
&lt;li&gt;Les fichiers PNG sont livrés dans le dossier de sortie&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Cas d'usage
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;E-commerce&lt;/strong&gt; : générer les visuels de tout un catalogue&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Print-on-demand&lt;/strong&gt; : produire les mockups t-shirts/mugs/posters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agency&lt;/strong&gt; : décliner un template pour plusieurs clients&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prérequis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Un template PSD avec un smart object dédié&lt;/li&gt;
&lt;li&gt;Photopea (gratuit, navigateur) — aucune licence nécessaire&lt;/li&gt;
&lt;li&gt;Python 3.8+&lt;/li&gt;
&lt;li&gt;Node.js (pour le serveur MCP)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pipeline type
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CSV (produits) → Photopea → PNG (mockups finis)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chaque ligne du CSV est traitée automatiquement : le smart object est remplacé par l'image correspondante, le document est exporté, et le script passe au suivant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Avantages
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Temps réduit : 50 mockups en quelques minutes&lt;/li&gt;
&lt;li&gt;Cohérence : tous les visuels suivent exactement le même template&lt;/li&gt;
&lt;li&gt;Gratuit : pas d'abonnement Photoshop, pas de SaaS payant&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Mohamed ben mallessa&lt;/strong&gt; — Full-stack developer &amp;amp; solutions B2B&lt;br&gt;
🔗 &lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  opensource #mockups #python #ecommerce
&lt;/h1&gt;




&lt;h2&gt;
  
  
  💻 Vous avez un projet technique ?
&lt;/h2&gt;

&lt;p&gt;Développement full-stack, automatisation IA, solutions B2B sur mesure.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
💼 &lt;strong&gt;&lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
🎨 &lt;strong&gt;&lt;a href="https://www.behance.net/benmalmoamed" rel="noopener noreferrer"&gt;Behance&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Article initialement publié sur &lt;a href="https://gist.github.com/mohamed-amine-ben-mallessa/0a6a636b4b56229efa200d2403e432c9" rel="noopener noreferrer"&gt;GitHub Gist&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>mockups</category>
      <category>opensource</category>
      <category>python</category>
    </item>
    <item>
      <title>Générer des posts réseaux sociaux en une commande — Guide pratique</title>
      <dc:creator>Mohamed Amine Ben Mallessa</dc:creator>
      <pubDate>Sat, 04 Jul 2026 00:41:38 +0000</pubDate>
      <link>https://dev.to/benmallessamohamedamine/generer-des-posts-reseaux-sociaux-en-une-commande-guide-pratique-47do</link>
      <guid>https://dev.to/benmallessamohamedamine/generer-des-posts-reseaux-sociaux-en-une-commande-guide-pratique-47do</guid>
      <description>&lt;p&gt;&lt;em&gt;📖 Article original : &lt;a href="https://gist.github.com/mohamed-amine-ben-mallessa/91eb72bc03ab99b34a856602f85a44cd" rel="noopener noreferrer"&gt;GitHub Gist&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Un guide technique par Mohamed ben mallessa&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Le contexte
&lt;/h2&gt;

&lt;p&gt;Publier régulièrement sur Instagram et LinkedIn demande des visuels adaptés à chaque format : carré pour le fil, story pour les alertes, bannière pour les articles. Produire ces variantes une par une est chronophage.&lt;/p&gt;

&lt;h2&gt;
  
  
  L'approche
&lt;/h2&gt;

&lt;p&gt;Un script unique qui génère les trois formats à partir des mêmes paramètres. Le moteur de rendu est Photopea (Photoshop gratuit dans le navigateur) ou un rendu SVG direct pour plus de rapidité.&lt;/p&gt;

&lt;h2&gt;
  
  
  Formats supportés
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Dimensions&lt;/th&gt;
&lt;th&gt;Usage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Square&lt;/td&gt;
&lt;td&gt;1080×1080&lt;/td&gt;
&lt;td&gt;Fil Instagram, Facebook, LinkedIn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Story&lt;/td&gt;
&lt;td&gt;1080×1920&lt;/td&gt;
&lt;td&gt;Stories Instagram, Facebook&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Banner&lt;/td&gt;
&lt;td&gt;1200×630&lt;/td&gt;
&lt;td&gt;Open Graph, Twitter Cards&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Styles disponibles
&lt;/h2&gt;

&lt;p&gt;7 thèmes visuels prêts à l'emploi :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;modern&lt;/code&gt; — Bleu nuit, accents dorés&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gold&lt;/code&gt; — Noir et or, luxe&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bold&lt;/code&gt; — Rouge, urgence&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;minimal&lt;/code&gt; — Blanc épuré&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tech&lt;/code&gt; — Bleu/cyan, startup&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nature&lt;/code&gt; — Vert forêt&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sunset&lt;/code&gt; — Violet/orangé&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Utilisation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python post_factory.py square &lt;span class="s2"&gt;"TITRE"&lt;/span&gt; &lt;span class="s2"&gt;"Sous-titre"&lt;/span&gt; &lt;span class="s2"&gt;"Accroche"&lt;/span&gt; &lt;span class="s2"&gt;"CTA"&lt;/span&gt; &lt;span class="s2"&gt;"@handle"&lt;/span&gt; output.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le fichier &lt;code&gt;social_post_svg.py&lt;/code&gt; génère des posts sans navigateur, en pur SVG, pour une exécution encore plus rapide.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi c'est utile
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Un seul brief pour tous les formats&lt;/li&gt;
&lt;li&gt;Cohérence visuelle garantie&lt;/li&gt;
&lt;li&gt;Génération en quelques secondes&lt;/li&gt;
&lt;li&gt;Pas d'abonnement à un outil de design&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Mohamed ben mallessa&lt;/strong&gt; — Full-stack developer &amp;amp; solutions B2B&lt;br&gt;
🔗 &lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  opensource #socialmedia #python #tutorial
&lt;/h1&gt;




&lt;h2&gt;
  
  
  💻 Vous avez un projet technique ?
&lt;/h2&gt;

&lt;p&gt;Développement full-stack, automatisation IA, solutions B2B sur mesure.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://github.com/mohamed-amine-ben-mallessa" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
💼 &lt;strong&gt;&lt;a href="https://fr.linkedin.com/in/benmallessa" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
🎨 &lt;strong&gt;&lt;a href="https://www.behance.net/benmalmoamed" rel="noopener noreferrer"&gt;Behance&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Article initialement publié sur &lt;a href="https://gist.github.com/mohamed-amine-ben-mallessa/91eb72bc03ab99b34a856602f85a44cd" rel="noopener noreferrer"&gt;GitHub Gist&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>socialmedia</category>
      <category>opensource</category>
      <category>python</category>
    </item>
  </channel>
</rss>
