<?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: velmurugan</title>
    <description>The latest articles on DEV Community by velmurugan (@velmurugan_murugesan).</description>
    <link>https://dev.to/velmurugan_murugesan</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%2F692520%2Fd222ea47-46bd-4ab2-98af-3bc5d8e4af7c.jpeg</url>
      <title>DEV Community: velmurugan</title>
      <link>https://dev.to/velmurugan_murugesan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/velmurugan_murugesan"/>
    <language>en</language>
    <item>
      <title>I Was Tired of Uploading Photos to Random Sites — So I Built My Own Filter Tool</title>
      <dc:creator>velmurugan</dc:creator>
      <pubDate>Fri, 17 Jul 2026 10:30:27 +0000</pubDate>
      <link>https://dev.to/velmurugan_murugesan/i-was-tired-of-uploading-photos-to-random-sites-so-i-built-my-own-filter-tool-3a2d</link>
      <guid>https://dev.to/velmurugan_murugesan/i-was-tired-of-uploading-photos-to-random-sites-so-i-built-my-own-filter-tool-3a2d</guid>
      <description>&lt;p&gt;As an Android developer, I've spent years building apps for other companies. Like a lot of engineers, I've always had a stack of side projects I wanted to ship for myself. This one started from a genuinely annoying problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Every time I wanted to apply a quick cinematic or vintage look to a photo, I'd end up on some free "online photo filter" site — and almost every single one of them worked the same way: upload your photo to their server, wait, download the result, and quietly wonder where that photo just went and who else could see it.&lt;/p&gt;

&lt;p&gt;For casual edits that's a small risk. But it bugged me enough that I decided to build the tool myself, with a different default.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5z4w62y222s37rk88zbo.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5z4w62y222s37rk88zbo.jpeg" alt="photofilters.online homepage showing the AI photo filter editor interface" width="799" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://photofilters.online" rel="noopener noreferrer"&gt;photofilters.online&lt;/a&gt;&lt;/strong&gt; is a free, browser-based photo editor with curated, AI-powered presets — but with one core architectural decision that shapes everything else:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your photos never leave your device.&lt;/strong&gt; All processing happens locally in the browser. No server uploads, no storage, no privacy policy you have to trust — it's true by construction, because the image data simply never gets transmitted.&lt;/p&gt;

&lt;p&gt;Feature set:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Curated preset categories&lt;/strong&gt; — Cinematic, Vintage Film, Portrait, Landscape, Cyberpunk, Moody, Matte, and HDR looks, ready to apply instantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI text-to-preset generator&lt;/strong&gt; — describe the mood/color grade you want in plain language, and it generates a custom filter look&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero friction&lt;/strong&gt; — no sign-up, no install, no account, no watermark&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1a2n5ottvxz7whkagqaz.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1a2n5ottvxz7whkagqaz.jpeg" alt="Before and after comparison of a cinematic AI photo filter applied using photofilters.online" width="799" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why build it client-side
&lt;/h2&gt;

&lt;p&gt;Coming from Android dev, where you're constantly thinking about what data actually needs to leave the device vs. what can be processed on-device, "upload your photo to our server just to apply a filter" always felt like the wrong default for something this simple.&lt;/p&gt;

&lt;p&gt;Modern browsers are genuinely capable of handling image processing and AI-assisted styling entirely client-side. So instead of treating privacy as a policy or an afterthought, I built the processing pipeline so the photo never has a reason to leave the browser tab in the first place — no server, no upload endpoint, no storage layer for user images at all.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy1hzbu96s1mj9ufiz4wr.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy1hzbu96s1mj9ufiz4wr.jpeg" alt="AI text-to-preset generator on photofilters.online creating a custom photo filter from a text description" width="375" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;This is an early build, and I'm actively adding more preset styles and refining the AI preset generator based on feedback. If there's interest, I can follow this up with a technical deep-dive — architecture, how the local AI preset generation works, tradeoffs of client-side processing vs. server-side, etc.&lt;/p&gt;

&lt;p&gt;👉 Try it here: &lt;strong&gt;&lt;a href="https://photofilters.online" rel="noopener noreferrer"&gt;photofilters.online&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Would genuinely appreciate feedback — what filters you'd want to see, what's confusing, what's missing. Comment below or reach out.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If a technical breakdown of the client-side AI pipeline would be useful, let me know in the comments and I'll write it up next.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Getting started with jetpack compose</title>
      <dc:creator>velmurugan</dc:creator>
      <pubDate>Wed, 01 Sep 2021 17:28:54 +0000</pubDate>
      <link>https://dev.to/velmurugan_murugesan/getting-started-with-jetpack-compose-5290</link>
      <guid>https://dev.to/velmurugan_murugesan/getting-started-with-jetpack-compose-5290</guid>
      <description>&lt;ol&gt;
&lt;li&gt;Basic components
&lt;a href="https://howtodoandroid.com/jetpack-compose-components"&gt;https://howtodoandroid.com/jetpack-compose-components&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Modifiers
&lt;a href="https://howtodoandroid.com/jetpack-compose-modifiers"&gt;https://howtodoandroid.com/jetpack-compose-modifiers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Layouts
&lt;a href="https://howtodoandroid.com/jetpack-compose-layouts"&gt;https://howtodoandroid.com/jetpack-compose-layouts&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Constraint Layout
&lt;a href="https://howtodoandroid.com/jetpack-compose-constraintlayout"&gt;https://howtodoandroid.com/jetpack-compose-constraintlayout&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Scaffold Layout
&lt;a href="https://howtodoandroid.com/jetpack-compose-scaffold-layout/"&gt;https://howtodoandroid.com/jetpack-compose-scaffold-layout/&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>android</category>
      <category>jetpackcompose</category>
      <category>kotlin</category>
      <category>composecomponents</category>
    </item>
  </channel>
</rss>
