<?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: Maxim Mitenkov</title>
    <description>The latest articles on DEV Community by Maxim Mitenkov (@max_mitenkov).</description>
    <link>https://dev.to/max_mitenkov</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%2F4013277%2Fbb7a0c00-0c91-4f69-b663-b66810302332.jpg</url>
      <title>DEV Community: Maxim Mitenkov</title>
      <link>https://dev.to/max_mitenkov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/max_mitenkov"/>
    <language>en</language>
    <item>
      <title>Batch Image Processing: From Photoshop Actions to Browser Pipelines — What Actually Works</title>
      <dc:creator>Maxim Mitenkov</dc:creator>
      <pubDate>Fri, 10 Jul 2026 06:15:08 +0000</pubDate>
      <link>https://dev.to/max_mitenkov/batch-image-processing-from-photoshop-actions-to-browser-pipelines-what-actually-works-2cop</link>
      <guid>https://dev.to/max_mitenkov/batch-image-processing-from-photoshop-actions-to-browser-pipelines-what-actually-works-2cop</guid>
      <description>&lt;p&gt;I process between 50 and 100 images every month. Portfolio shots, Behance uploads, Pinterest pins, client deliverables in multiple formats. For years I jumped between three bad options: Photoshop actions that break when the canvas size changes, ImageMagick scripts I wrote once and forgot how to edit, and cloud converters that make me upload client artwork to someone else's server.&lt;/p&gt;

&lt;p&gt;Last month I got tired enough to build something better. But before I tell you what I made, let's look at what already exists — and where each approach falls apart.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Landscape: 5 Ways to Batch-Process Images
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Setup Time&lt;/th&gt;
&lt;th&gt;Privacy&lt;/th&gt;
&lt;th&gt;Flexibility&lt;/th&gt;
&lt;th&gt;Learning Curve&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;&lt;strong&gt;Photoshop Actions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;td&gt;✅ Local&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Repetitive, identical workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ImageMagick / CLI scripts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hours&lt;/td&gt;
&lt;td&gt;✅ Local&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Developers, server pipelines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Cloud converters&lt;/strong&gt; (TinyPNG, Squoosh)&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;❌ Upload required&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;One-off optimization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Cloud APIs&lt;/strong&gt; (Sharp, Cloudinary)&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;❌ Upload required&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Production apps, automation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Browser-based pipeline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;✅ Local&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Designers, freelancers, privacy-first workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1. Photoshop Actions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The good:&lt;/strong&gt; If every image is the same size and needs the same sequence (resize → sharpen → export JPEG at 80%), Actions are fast. Record once, play on a folder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The bad:&lt;/strong&gt; Actions are brittle. Change the aspect ratio of your source images and the crop breaks. Need a slightly different export for one client? Duplicate the entire action set. Need to process 200 images while you grab coffee? Photoshop will hang or crash.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt; You are a photographer with a fixed studio workflow and identical source files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to skip it:&lt;/strong&gt; Variable dimensions, multiple output formats, or anything that needs logic (e.g., "if width &amp;gt; 1920, resize; else, keep original").&lt;/p&gt;




&lt;h2&gt;
  
  
  2. ImageMagick &amp;amp; CLI Scripts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The good:&lt;/strong&gt; Infinite flexibility. Resize, crop, composite, watermark, convert formats — all in one command. Runs on servers. Free. Fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The bad:&lt;/strong&gt; You are now a programmer. The syntax is arcane (&lt;code&gt;convert input.jpg -resize 800x800^ -gravity center -extent 800x800 output.jpg&lt;/code&gt;). Scripts you write in January become unreadable by June. And if you need visual feedback — "does this crop look right?" — you're opening every output file manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt; You are a developer building a CI/CD pipeline, or you need to process thousands of images on a server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to skip it:&lt;/strong&gt; You are a designer who wants to see what happens before you commit to a workflow. Or you need to tweak parameters visually.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Cloud Converters (TinyPNG, Squoosh, etc.)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The good:&lt;/strong&gt; Zero setup. Drag, drop, download. Squoosh even runs in the browser (though it's single-image, not batch).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The bad:&lt;/strong&gt; You upload your files to a third party. For client work, NDAs, or personal artwork, that's a dealbreaker. And batch features are usually premium, subscription-only, or nonexistent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt; Quick one-off optimization of a few personal images where privacy doesn't matter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to skip it:&lt;/strong&gt; Client files, proprietary artwork, or anything requiring a repeatable workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Cloud APIs (Sharp, Cloudinary, Uploadcare)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The good:&lt;/strong&gt; Production-grade. URL-based transformations (&lt;code&gt;?w=800&amp;amp;q=80&lt;/code&gt;). Integrates into apps. Handles millions of images.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The bad:&lt;/strong&gt; Requires backend integration. Costs scale with usage. And again — your images leave your device.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt; You are building a SaaS or e-commerce platform that serves dynamic images.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to skip it:&lt;/strong&gt; You are a freelancer processing files for a one-time deliverable. Overkill and expensive.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Browser-Based Pipelines (What I Built)
&lt;/h2&gt;

&lt;p&gt;I wanted something that combined the &lt;strong&gt;privacy of ImageMagick&lt;/strong&gt;, the &lt;strong&gt;visual feedback of Photoshop&lt;/strong&gt;, and the &lt;strong&gt;zero-setup of cloud tools&lt;/strong&gt; — without the downsides of any of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Image Pipeline&lt;/strong&gt; runs entirely in the browser. You build a visual pipeline by connecting nodes:&lt;/p&gt;

&lt;p&gt;[Load Images] → [Resize to 800px width] → [Compress 80%] → [Export WebP]&lt;/p&gt;

&lt;p&gt;Hit &lt;strong&gt;Process&lt;/strong&gt;. Everything happens via Canvas API in your tab. Images never touch a server. Download a ZIP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The good:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero setup&lt;/strong&gt; — open URL, drag files, done&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy&lt;/strong&gt; — no upload, no account, no API key&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual&lt;/strong&gt; — see the pipeline, tweak parameters, preview results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeatable&lt;/strong&gt; — save the pipeline, reuse next week&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free tier&lt;/strong&gt; — 10 files/day, no credit card&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The bad:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Browser memory limits (don't throw 500 RAW files at it)&lt;/li&gt;
&lt;li&gt;No server-side automation (it's a GUI tool, not a CI/CD step)&lt;/li&gt;
&lt;li&gt;Simpler than ImageMagick for advanced compositing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You are a designer, illustrator, or photographer batch-preparing assets&lt;/li&gt;
&lt;li&gt;You handle client files under NDA&lt;/li&gt;
&lt;li&gt;You want a repeatable workflow without writing code&lt;/li&gt;
&lt;li&gt;You need multiple output formats from one source set&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to skip it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need to process 10,000 images programmatically (use ImageMagick)&lt;/li&gt;
&lt;li&gt;You need dynamic image serving in a web app (use Cloudinary)&lt;/li&gt;
&lt;li&gt;You need advanced layer compositing (use Photoshop)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Decision Matrix
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"I need to resize 50 portfolio images for my website"&lt;/strong&gt;&lt;br&gt;
→ Browser pipeline wins. 2 minutes, no upload, ZIP download.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"I need to optimize 10,000 user-uploaded avatars per day"&lt;/strong&gt;&lt;br&gt;
→ Cloud API or ImageMagick. This is a backend problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"I need to compress one image for Twitter"&lt;/strong&gt;&lt;br&gt;
→ Squoosh or TinyPNG. Fastest for single files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"I need to apply the exact same crop and color grade to 200 studio photos"&lt;/strong&gt;&lt;br&gt;
→ Photoshop Actions. If the workflow never changes, Actions are still king.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"I need a script that resizes, watermarks, and uploads to S3 automatically"&lt;/strong&gt;&lt;br&gt;
→ ImageMagick + Bash/Python. You're a developer; this is your world.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works Under the Hood
&lt;/h2&gt;

&lt;p&gt;If you're curious about the technical side:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image decoding&lt;/strong&gt; — native &lt;code&gt;FileReader&lt;/code&gt; + &lt;code&gt;Image&lt;/code&gt; constructor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manipulation&lt;/strong&gt; — HTML5 Canvas API (&lt;code&gt;drawImage&lt;/code&gt;, &lt;code&gt;toBlob&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compression&lt;/strong&gt; — Canvas &lt;code&gt;toBlob&lt;/code&gt; with quality parameter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ZIP generation&lt;/strong&gt; — JSZip, entirely client-side&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No WebAssembly&lt;/strong&gt; — intentionally kept simple to avoid bundle bloat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The entire app is static HTML/JS hosted on Vercel. No server, no database, no API routes for image processing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It or Build Your Own
&lt;/h2&gt;

&lt;p&gt;If you process images regularly and none of the existing tools fit your workflow cleanly, give it a shot:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://imagepipeline.art" rel="noopener noreferrer"&gt;imagepipeline.art&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or if you're a developer and prefer CLI — honestly, stick with ImageMagick. It's unbeatable for automation. This tool is for everyone else who got tired of the trade-offs.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's your batch processing workflow? Do you script it, automate it, or still click through Photoshop one file at a time?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Image Pipeline is live on Product Hunt! 🚀</title>
      <dc:creator>Maxim Mitenkov</dc:creator>
      <pubDate>Tue, 07 Jul 2026 09:03:38 +0000</pubDate>
      <link>https://dev.to/max_mitenkov/image-pipeline-is-live-on-product-hunt-4pcc</link>
      <guid>https://dev.to/max_mitenkov/image-pipeline-is-live-on-product-hunt-4pcc</guid>
      <description>&lt;p&gt;Hey dev community!&lt;/p&gt;

&lt;p&gt;My side project &lt;strong&gt;Image Pipeline&lt;/strong&gt; just went live on Product Hunt today.&lt;/p&gt;

&lt;p&gt;It's a privacy-first, browser-based batch image processor with a visual node editor. Built with React 19, Vite, React Flow, and Vercel Edge Functions.&lt;/p&gt;

&lt;p&gt;What it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drag-and-drop node editor (Resize, Compress, Watermark, Export)&lt;/li&gt;
&lt;li&gt;Batch process hundreds of images in one click&lt;/li&gt;
&lt;li&gt;100% client-side — images never leave your browser&lt;/li&gt;
&lt;li&gt;No signup required&lt;/li&gt;
&lt;li&gt;Pay once, use forever ($10 Pro / $30 Lifetime)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're working with images daily — would love your feedback and support!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vote on Product Hunt:&lt;/strong&gt; &lt;a href="https://www.producthunt.com/products/image-pipeline-batch-image-processing" rel="noopener noreferrer"&gt;https://www.producthunt.com/products/image-pipeline-batch-image-processing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it live:&lt;/strong&gt; &lt;a href="https://imagepipeline.art" rel="noopener noreferrer"&gt;https://imagepipeline.art&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks! 🙏&lt;/p&gt;

</description>
      <category>producthunt</category>
      <category>webdev</category>
      <category>batchprocessing</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Building a Client-Side Batch Image Processor with React Flow and Vercel Edge Functions</title>
      <dc:creator>Maxim Mitenkov</dc:creator>
      <pubDate>Fri, 03 Jul 2026 08:34:04 +0000</pubDate>
      <link>https://dev.to/max_mitenkov/building-a-client-side-batch-image-processor-with-react-flow-and-vercel-edge-functions-27ng</link>
      <guid>https://dev.to/max_mitenkov/building-a-client-side-batch-image-processor-with-react-flow-and-vercel-edge-functions-27ng</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;As an illustrator, I handle hundreds of images for clients every month. Resizing, compressing, converting formats — the usual workflow.&lt;/p&gt;

&lt;p&gt;But every tool I tried either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Required uploading to cloud (privacy risk for client work)&lt;/li&gt;
&lt;li&gt;Charged monthly subscriptions (Adobe, Canva)&lt;/li&gt;
&lt;li&gt;Was too complex for simple batch tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;Image Pipeline&lt;/strong&gt; — a browser-based batch image processor with a visual node editor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drag-and-drop node editor (Resize, Crop, Compress, Format, Watermark, Denoise, Rename, Export)&lt;/li&gt;
&lt;li&gt;Batch processing — run the same pipeline on hundreds of images&lt;/li&gt;
&lt;li&gt;100% client-side — images never leave your browser&lt;/li&gt;
&lt;li&gt;ZIP export via Web Worker&lt;/li&gt;
&lt;li&gt;Undo/redo for pipeline edits&lt;/li&gt;
&lt;li&gt;No signup required&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React 19, Vite 8, React Flow 12, Zustand 5, Tailwind CSS 4&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Vercel Edge Functions, Upstash Redis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payments:&lt;/strong&gt; USDT (TRC-20) — no Stripe, no subscriptions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;i18n:&lt;/strong&gt; English + Russian&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The pipeline engine runs entirely in the browser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Images are loaded via &lt;code&gt;FileReader&lt;/code&gt; API&lt;/li&gt;
&lt;li&gt;Processing uses Canvas API and WebAssembly&lt;/li&gt;
&lt;li&gt;ZIP generation happens in a Web Worker (CSP-safe)&lt;/li&gt;
&lt;li&gt;No server-side image processing whatsoever&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rate limiting and payment verification are handled by Vercel Edge Functions with Upstash Redis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monetization
&lt;/h2&gt;

&lt;p&gt;Freemium model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; 10 files per batch, 4 nodes per pipeline, 10 batches per day&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro ($10):&lt;/strong&gt; unlimited files, unlimited nodes, all formats&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lifetime ($30):&lt;/strong&gt; everything in Pro + future features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Crypto-only (USDT TRC-20) — no recurring billing, no chargebacks, global access.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://imagepipeline.art" rel="noopener noreferrer"&gt;https://imagepipeline.art&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback and contributions welcome!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
