<?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: jevithos</title>
    <description>The latest articles on DEV Community by jevithos (@converigo).</description>
    <link>https://dev.to/converigo</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%2F4026432%2Fe8f855bf-d0f0-4dd2-9b3f-6163076803f9.png</url>
      <title>DEV Community: jevithos</title>
      <link>https://dev.to/converigo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/converigo"/>
    <language>en</language>
    <item>
      <title>How I Built a Plugin-Based File Converter with Python</title>
      <dc:creator>jevithos</dc:creator>
      <pubDate>Thu, 23 Jul 2026 07:46:24 +0000</pubDate>
      <link>https://dev.to/converigo/how-i-built-a-plugin-based-file-converter-with-python-4jmp</link>
      <guid>https://dev.to/converigo/how-i-built-a-plugin-based-file-converter-with-python-4jmp</guid>
      <description>&lt;p&gt;When I started building &lt;strong&gt;Converigo&lt;/strong&gt;, I thought the biggest challenge would be converting files.&lt;/p&gt;

&lt;p&gt;I was wrong.&lt;/p&gt;

&lt;p&gt;The real challenge wasn't converting a PDF or an image—it was designing a system that could continue to grow without becoming a maintenance nightmare.&lt;/p&gt;

&lt;p&gt;At first, adding a new converter was straightforward. A few functions, a couple of routes, and everything worked as expected.&lt;/p&gt;

&lt;p&gt;But after adding more formats, I realized the project was heading toward a common problem: &lt;strong&gt;the core application was becoming responsible for everything.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That wasn't going to scale.&lt;/p&gt;




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

&lt;p&gt;Many projects begin with something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;converter&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jpg_to_pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;convert_jpg_to_pdf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;converter&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pdf_to_word&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;convert_pdf_to_word&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;converter&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;png_to_webp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;convert_png_to_webp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;converter&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mp4_to_mp3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;convert_mp4_to_mp3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There's nothing wrong with this approach when you only have a few converters.&lt;/p&gt;

&lt;p&gt;But what happens when you have 20?&lt;/p&gt;

&lt;p&gt;Or 50?&lt;/p&gt;

&lt;p&gt;Or even 100?&lt;/p&gt;

&lt;p&gt;Every new format requires editing the core application.&lt;/p&gt;

&lt;p&gt;Every change increases the risk of breaking something that already works.&lt;/p&gt;

&lt;p&gt;Maintenance becomes slower.&lt;/p&gt;

&lt;p&gt;Testing becomes harder.&lt;/p&gt;

&lt;p&gt;Eventually, the converter engine becomes a giant file that nobody wants to touch.&lt;/p&gt;




&lt;h2&gt;
  
  
  Rethinking the Architecture
&lt;/h2&gt;

&lt;p&gt;Instead of making the application responsible for every conversion, I decided that &lt;strong&gt;each converter should be responsible for itself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The solution was a plugin-based architecture.&lt;/p&gt;

&lt;p&gt;Rather than storing every converter inside one large application, each conversion format lives in its own module.&lt;br&gt;
&lt;/p&gt;

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

├── image/
│   ├── jpg_to_png.py
│   ├── png_to_jpg.py
│   └── webp_to_png.py
│
├── document/
│   ├── pdf_to_docx.py
│   ├── docx_to_pdf.py
│   └── pdf_to_xlsx.py
│
├── audio/
│   └── mp4_to_mp3.py
│
└── video/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This simple separation completely changed the development experience.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Common Interface
&lt;/h2&gt;

&lt;p&gt;Every converter follows the same interface.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ConverterPlugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;source_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;target_format&lt;/span&gt;
    &lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because every plugin behaves the same way, the engine doesn't need to know how each conversion actually works.&lt;/p&gt;

&lt;p&gt;It simply discovers the appropriate plugin and executes it.&lt;/p&gt;

&lt;p&gt;Adding support for another file format becomes much easier.&lt;/p&gt;

&lt;p&gt;No huge refactoring.&lt;/p&gt;

&lt;p&gt;No giant switch statements.&lt;/p&gt;

&lt;p&gt;No complicated routing logic.&lt;/p&gt;

&lt;p&gt;Just add another plugin.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Works Better
&lt;/h2&gt;

&lt;p&gt;Moving to a plugin-based architecture immediately brought several advantages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Easier Maintenance
&lt;/h3&gt;

&lt;p&gt;Each converter is isolated.&lt;/p&gt;

&lt;p&gt;Fixing a PDF converter doesn't affect image converters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better Testing
&lt;/h3&gt;

&lt;p&gt;Every plugin can be tested independently.&lt;/p&gt;

&lt;p&gt;Regression testing becomes much simpler.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cleaner Code
&lt;/h3&gt;

&lt;p&gt;Instead of one massive conversion engine, responsibilities are clearly separated.&lt;/p&gt;

&lt;p&gt;Finding bugs is easier.&lt;/p&gt;

&lt;p&gt;Reviewing pull requests becomes faster.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better Scalability
&lt;/h3&gt;

&lt;p&gt;Adding a new converter is mostly independent work.&lt;/p&gt;

&lt;p&gt;As the project grows, the architecture grows with it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;One thing surprised me during development.&lt;/p&gt;

&lt;p&gt;The hardest part wasn't writing conversion logic.&lt;/p&gt;

&lt;p&gt;It was designing an architecture that would still feel clean after adding dozens of converters.&lt;/p&gt;

&lt;p&gt;Looking back, spending extra time on architecture early saved much more time later.&lt;/p&gt;

&lt;p&gt;Good architecture doesn't make software more complicated.&lt;/p&gt;

&lt;p&gt;It makes future development much simpler.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;The plugin system is still evolving.&lt;/p&gt;

&lt;p&gt;Some improvements I'm currently working on include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More conversion formats&lt;/li&gt;
&lt;li&gt;Better validation&lt;/li&gt;
&lt;li&gt;Performance optimization&lt;/li&gt;
&lt;li&gt;Batch conversion&lt;/li&gt;
&lt;li&gt;Public API&lt;/li&gt;
&lt;li&gt;AI-powered recommendations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is simple.&lt;/p&gt;

&lt;p&gt;Adding a new converter should require as little effort as possible while keeping the existing system stable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Building software isn't only about solving today's problem.&lt;/p&gt;

&lt;p&gt;It's also about making tomorrow's changes easier.&lt;/p&gt;

&lt;p&gt;A plugin architecture won't be the right solution for every project, but for a growing file conversion platform, it has proven to be a practical and maintainable approach.&lt;/p&gt;

&lt;p&gt;I'm curious how other developers would approach this challenge.&lt;/p&gt;

&lt;p&gt;Would you choose a plugin system, microservices, or something completely different?&lt;/p&gt;

&lt;p&gt;I'd love to hear your thoughts in the comments.&lt;/p&gt;




&lt;p&gt;If you're interested in the project, you can check out &lt;strong&gt;Converigo&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="https://converigo.com" rel="noopener noreferrer"&gt;https://converigo.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm always happy to hear feedback, suggestions, and ideas for improving the platform.&lt;/p&gt;

&lt;p&gt;If you've built a plugin-based architecture before, I'd love to know what worked well for you.&lt;/p&gt;

</description>
      <category>python</category>
      <category>webdev</category>
      <category>architecture</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Introducing Converigo: Building a Fast, Free &amp; Secure Online File Converter</title>
      <dc:creator>jevithos</dc:creator>
      <pubDate>Wed, 15 Jul 2026 05:10:15 +0000</pubDate>
      <link>https://dev.to/converigo/introducing-converigo-building-a-fast-free-secure-online-file-converter-5blh</link>
      <guid>https://dev.to/converigo/introducing-converigo-building-a-fast-free-secure-online-file-converter-5blh</guid>
      <description>&lt;h1&gt;
  
  
  Introducing Converigo
&lt;/h1&gt;

&lt;p&gt;Every day, millions of people need to convert files.&lt;/p&gt;

&lt;p&gt;PDF to JPG.&lt;br&gt;
PNG to WebP.&lt;br&gt;
MP4 to MP3.&lt;br&gt;
Word to PDF.&lt;/p&gt;

&lt;p&gt;Many online tools are slow, filled with ads, or require software installation.&lt;/p&gt;

&lt;p&gt;That's why we built &lt;strong&gt;Converigo&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  What is Converigo?
&lt;/h1&gt;

&lt;p&gt;Converigo is a fast, free, and secure online file conversion platform designed to make file conversion simple for everyone.&lt;/p&gt;

&lt;p&gt;It supports images, documents, audio, video, PDF tools, and more.&lt;/p&gt;

&lt;p&gt;Our goal is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast conversion&lt;/li&gt;
&lt;li&gt;Secure processing&lt;/li&gt;
&lt;li&gt;Clean user experience&lt;/li&gt;
&lt;li&gt;No installation required&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Current Features
&lt;/h1&gt;

&lt;p&gt;Currently available tools include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PDF to JPG&lt;/li&gt;
&lt;li&gt;JPG to PDF&lt;/li&gt;
&lt;li&gt;PNG to JPG&lt;/li&gt;
&lt;li&gt;WebP to PNG&lt;/li&gt;
&lt;li&gt;MP4 to MP3&lt;/li&gt;
&lt;li&gt;Word to PDF&lt;/li&gt;
&lt;li&gt;PDF to Word&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More converters are continuously being added.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why We Built It
&lt;/h1&gt;

&lt;p&gt;We believe file conversion should be simple.&lt;/p&gt;

&lt;p&gt;No unnecessary complexity.&lt;/p&gt;

&lt;p&gt;No confusing interfaces.&lt;/p&gt;

&lt;p&gt;Just upload, convert, and download.&lt;/p&gt;




&lt;h1&gt;
  
  
  What's Next?
&lt;/h1&gt;

&lt;p&gt;Our roadmap includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More conversion formats&lt;/li&gt;
&lt;li&gt;Batch conversion&lt;/li&gt;
&lt;li&gt;API access&lt;/li&gt;
&lt;li&gt;AI-powered file recommendations&lt;/li&gt;
&lt;li&gt;Developer tools&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Try Converigo
&lt;/h1&gt;

&lt;p&gt;🌐 &lt;a href="https://converigo.com" rel="noopener noreferrer"&gt;https://converigo.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We'd love your feedback and suggestions for future features.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>python</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
