The $75 Photoshop Plugin That Cost Me... Nothing (I Built It Instead)
I was scrolling through Instagram Reels recently when an ad, presented as a "tutorial," caught my eye. It was for a Photoshop plugin called "DITHERTONE Pro," showcasing a rather striking visual effect – lines that seemed to follow an image's contours, giving it a distinct, almost cyberpunk aesthetic. It genuinely looked impressive. Then, the price appeared: $75. That figure made me pause. Not because I'm against paying for well-crafted software, but because the effect itself felt incredibly familiar. It was a strong sense of déjà vu, like I'd seen this exact visual style generated somewhere else, in a context far removed from polished, commercial plugins. The Ghost of Glitch My mind immediately jumped back a few years. I used to be quite involved in the datamoshing and glitch art scene – not so much these days, but I still have a soft spot for creative data bending. And in that world, a collection of Processing scripts by Tomasz Sulej, called "GenerateMe," was pretty well-known. He'd developed a range of tools, from pixel sorting to very accurate VHS tape emulations. And wouldn't you know it, one of those scripts, "FM Modulation," produced an effect that was practically a dead ringer for what "DITHERTONE Pro" was selling. It created those same intricate, flowing lines that followed the image's inherent structure. The core aesthetic was undeniably there, born from a free, open-source script. Now, those GenerateMe scripts were (and are) clever pieces of work. But using them today isn't exactly a seamless experience. They are, after all, products of a slightly different era in creative coding. For instance, you'll likely need to download a specific, older version of Processing to ensure they run correctly, as they often haven't been updated for the latest Processing releases. The user experience is also very minimal – typically just an image preview. Controlling the FM Modulation script involved moving the mouse cursor to adjust parameters, which, while interesting, isn't the most precise method. And if you wanted to process your own image? That meant editing the source code to change the input file path. So, while not ancient, they require a fair bit of fiddling and aren't what you'd call user-friendly by today's standards – definitely a bit of a pain. Why Not Rebuild It for the Web? And Make it Free. So, there's this cool effect, locked away in an old script that’s a hassle to use, or available via a $75 plugin. The plugin undoubtedly offers a more polished experience and likely more features, but for that core, captivating FM modulation effect? The price felt steep, especially knowing its open-source roots. "I could probably build that," I thought. The idea started to form: take the essence of that FM Modulation script and rewrite it for the web. Make it accessible, easy to use, and, importantly, free for anyone to try. I'd done something similar before with an old AVI glitch tool that messed with frame indexes (I wrote about that here), and the challenge was appealing. If the core logic was sound, why not modernize its delivery? Choosing the Right Weapons Alright, so the goal was set: bring FM modulation to the web. The next question was how. My gut feeling, based on what I knew about the FM modulation algorithm – lots of loops, complex math, angles, and bits of signal processing theory – was that a straightforward JavaScript implementation might not cut it. Especially for larger images, I had visions of the browser grinding to a halt, fans spinning up, and a generally laggy, unpleasant experience. This is where the idea of using Rust compiled to WebAssembly (WASM) came in. Rust offers near-native performance, which is perfect for CPU-intensive tasks like heavy image processing. WASM allows that Rust code to run in the browser at speeds that JavaScript alone often can't match for these kinds of operations. Plus, the plan was to offload this heavy lifting to a Web Worker, keeping the main browser thread free and the UI responsive. It felt like the right architectural choice to deliver both the complex visual effect and a smooth user experience. The Build: Rust to WASM Delivers With the tech stack decided, it was time to get to work. I set up the Rust workspace: fm_core for the actual image processing, and a separate module to interface with wasm-pack for the WebAssembly compilation. I have to say, the experience of getting Rust code to run on the web via WASM was surprisingly smooth. The Rust community has built an impressive ecosystem here. Honestly, I was expecting more of a battle – the usual snags and configuration issues when you're trying to make different technologies play nice. But wasm-pack handled its part elegantly, and the necessary glue code between JavaScript and the compiled WASM module was straightforward. Getting the Rust logic up and running in the browser happened with minimal friction, which was a very welcome development and speak

I was scrolling through Instagram Reels recently when an ad, presented as a "tutorial," caught my eye. It was for a Photoshop plugin called "DITHERTONE Pro," showcasing a rather striking visual effect – lines that seemed to follow an image's contours, giving it a distinct, almost cyberpunk aesthetic. It genuinely looked impressive. Then, the price appeared: $75.
That figure made me pause. Not because I'm against paying for well-crafted software, but because the effect itself felt incredibly familiar. It was a strong sense of déjà vu, like I'd seen this exact visual style generated somewhere else, in a context far removed from polished, commercial plugins.
The Ghost of Glitch
My mind immediately jumped back a few years. I used to be quite involved in the datamoshing and glitch art scene – not so much these days, but I still have a soft spot for creative data bending. And in that world, a collection of Processing scripts by Tomasz Sulej, called "GenerateMe," was pretty well-known. He'd developed a range of tools, from pixel sorting to very accurate VHS tape emulations.
And wouldn't you know it, one of those scripts, "FM Modulation," produced an effect that was practically a dead ringer for what "DITHERTONE Pro" was selling. It created those same intricate, flowing lines that followed the image's inherent structure. The core aesthetic was undeniably there, born from a free, open-source script.
Now, those GenerateMe scripts were (and are) clever pieces of work. But using them today isn't exactly a seamless experience. They are, after all, products of a slightly different era in creative coding.
For instance, you'll likely need to download a specific, older version of Processing to ensure they run correctly, as they often haven't been updated for the latest Processing releases. The user experience is also very minimal – typically just an image preview. Controlling the FM Modulation script involved moving the mouse cursor to adjust parameters, which, while interesting, isn't the most precise method. And if you wanted to process your own image? That meant editing the source code to change the input file path. So, while not ancient, they require a fair bit of fiddling and aren't what you'd call user-friendly by today's standards – definitely a bit of a pain.
Why Not Rebuild It for the Web? And Make it Free.
So, there's this cool effect, locked away in an old script that’s a hassle to use, or available via a $75 plugin. The plugin undoubtedly offers a more polished experience and likely more features, but for that core, captivating FM modulation effect? The price felt steep, especially knowing its open-source roots.
"I could probably build that," I thought. The idea started to form: take the essence of that FM Modulation script and rewrite it for the web. Make it accessible, easy to use, and, importantly, free for anyone to try. I'd done something similar before with an old AVI glitch tool that messed with frame indexes (I wrote about that here), and the challenge was appealing. If the core logic was sound, why not modernize its delivery?
Choosing the Right Weapons
Alright, so the goal was set: bring FM modulation to the web. The next question was how. My gut feeling, based on what I knew about the FM modulation algorithm – lots of loops, complex math, angles, and bits of signal processing theory – was that a straightforward JavaScript implementation might not cut it. Especially for larger images, I had visions of the browser grinding to a halt, fans spinning up, and a generally laggy, unpleasant experience.
This is where the idea of using Rust compiled to WebAssembly (WASM) came in. Rust offers near-native performance, which is perfect for CPU-intensive tasks like heavy image processing. WASM allows that Rust code to run in the browser at speeds that JavaScript alone often can't match for these kinds of operations. Plus, the plan was to offload this heavy lifting to a Web Worker, keeping the main browser thread free and the UI responsive. It felt like the right architectural choice to deliver both the complex visual effect and a smooth user experience.
The Build: Rust to WASM Delivers
With the tech stack decided, it was time to get to work. I set up the Rust workspace: fm_core for the actual image processing, and a separate module to interface with wasm-pack for the WebAssembly compilation. I have to say, the experience of getting Rust code to run on the web via WASM was surprisingly smooth. The Rust community has built an impressive ecosystem here.
Honestly, I was expecting more of a battle – the usual snags and configuration issues when you're trying to make different technologies play nice. But wasm-pack handled its part elegantly, and the necessary glue code between JavaScript and the compiled WASM module was straightforward. Getting the Rust logic up and running in the browser happened with minimal friction, which was a very welcome development and speaks volumes about the maturity of Rust's WASM tooling.
Vibe coding critique
Now, about AI tools. I did use GitHub Copilot in agent mode here and there, mostly for helping translate some of the gnarlier math from Processing to Rust. It can be a great assistant for many tasks, and that agentic workflow has great potential for speeding things up significantly. But let's be brutally honest: AI isn't writing your next masterpiece, and it sure as hell isn't a substitute for actual engineering skill. The current crop of "AI can code better than engineers" tech bros and founders, churning out their AI-powered software rot machines, are in for a rude awakening. You can't just prompt your way to a solid, maintainable, secure application – that takes understanding, discipline, and a grasp of fundamentals that these tools simply don't possess. Relying on AI as a crutch without that oversight is just asking for a dumpster fire of a codebase down the road.
The Payoff
After all that wrestling with Rust, WASM, and Web Workers, I'm happy to say the project came together. I'm calling it the "Image Frequency Modulation tool," and you can try it out right now at modulate.kopanko.com.
The front end is built with React and shadcn/ui, giving it a clean and modern interface. When you upload an image and tweak the parameters, the actual heavy lifting – the FM modulation processing – is done by the Rust/WASM module running inside a Web Worker. This means the image processing happens asynchronously, off the main browser thread, so the UI stays snappy and responsive even while your image is being transformed. It’s designed to do that one core thing – generate those cool FM modulation effects – and do it well, without any fuss. And, of course, it's completely free to use.
Conclusion: So, About That $75 Plugin...
And there you have it. From a slightly overpriced Instagram ad to a free, performant web tool. It was a fun challenge, a good excuse to dive deeper into Rust and WASM, and ultimately, a way to bring a cool visual effect to more people without a price tag.
While the commercial plugin might offer a broader suite of features for professional workflows, if you're just looking to experiment with this specific FM modulation aesthetic, my little tool gets the job done. Sometimes, the satisfaction of building it yourself (and then sharing it) is worth more than any plugin.
So go ahead, give it a spin here. Upload an image, play with the settings, and see what kind of visual weirdness you can create. Maybe you'll save yourself $75 in the process.