<?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: Jacob Corne</title>
    <description>The latest articles on DEV Community by Jacob Corne (@jacob_corne_494d0abcb8c4d).</description>
    <link>https://dev.to/jacob_corne_494d0abcb8c4d</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3936978%2Fe0ea4df9-5969-4ecf-bcc3-d4c70bc48a56.jpg</url>
      <title>DEV Community: Jacob Corne</title>
      <link>https://dev.to/jacob_corne_494d0abcb8c4d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jacob_corne_494d0abcb8c4d"/>
    <language>en</language>
    <item>
      <title>Your marketplace users are uploading their home address in every photo. You're storing all of it.</title>
      <dc:creator>Jacob Corne</dc:creator>
      <pubDate>Sun, 24 May 2026 18:30:35 +0000</pubDate>
      <link>https://dev.to/jacob_corne_494d0abcb8c4d/your-marketplace-users-are-uploading-their-home-address-in-every-photo-youre-storing-all-of-it-3e74</link>
      <guid>https://dev.to/jacob_corne_494d0abcb8c4d/your-marketplace-users-are-uploading-their-home-address-in-every-photo-youre-storing-all-of-it-3e74</guid>
      <description>&lt;p&gt;Every photo taken on a smartphone has EXIF metadata baked in. GPS coordinates, device serial number, timestamp — the full telemetry package. Social platforms like Instagram and Twitter strip this automatically on upload. Good for them.&lt;/p&gt;

&lt;p&gt;E-commerce marketplaces? Most don't.&lt;/p&gt;

&lt;p&gt;That means when someone lists a vintage jacket on your platform and photographs it in their living room, you're now storing their home address to sub-20-meter accuracy. Every buyer — and every scraper — can extract it. Stalking cases have been traced back to exactly this. Under GDPR and CCPA, GPS coordinates in photos count as personal data. You're collecting it, storing it, and serving it — probably without even knowing.&lt;/p&gt;

&lt;p&gt;I built Filtrate because this problem should take one API call to fix, not a quarter of engineering time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;&lt;br&gt;
One endpoint. Three operations. Every image.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;POST /v1/process&lt;/strong&gt; &lt;br&gt;
takes an image and returns it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;EXIF stripped&lt;/strong&gt;&lt;br&gt;
— GPS, device info, timestamps, all gone&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compressed to WebP&lt;/strong&gt;&lt;br&gt;
— smaller files, same visual quality&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI-moderated&lt;/strong&gt;&lt;br&gt;
— flagged for explicit content, fraud signals, banned logos&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You get back the processed image and a moderation verdict. That's it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Show me the code&lt;br&gt;
curl:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="sb"&gt;`&lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://filtrate.polsia.app/api/v1/process &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer your_api_key"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"image=@product-photo.jpg"&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;JavaScript:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="s2"&gt;`const form = new FormData();
form.append('image', fileInput.files[0]);

const res = await fetch('https://filtrate.polsia.app/api/v1/process', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer your_api_key' },
  body: form
});

const { processedImageUrl, moderation } = await res.json();
// moderation.verdict: "safe" | "flagged"
// moderation.categories: ["explicit", "fraud", "banned_logo"]
Response:

{
  "processedImageUrl": "https://...",
  "moderation": {
    "verdict": "safe",
    "categories": [],
    "confidence": 0.97
  },
  "metadata": {
    "originalFormat": "jpeg",
    "outputFormat": "webp",
    "originalSize": 2841000,
    "processedSize": 487000,
    "exifStripped": true
  }
}`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drop it into your upload pipeline. One call replaces three vendors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest numbers&lt;/strong&gt;&lt;br&gt;
I'm not going to claim sub-200ms latency. That would be a lie.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Average processing time: 3.3 seconds.&lt;/strong&gt;&lt;br&gt;
That includes EXIF stripping, WebP compression, and running the image through GPT-4o-mini for moderation. For a background upload pipeline, that's fine. For real-time preview? You'd want to show the original and swap in the processed version.&lt;/p&gt;

&lt;p&gt;Cache hits are different. Filtrate uses MD5-based verdict caching — if you've already processed an identical image, subsequent calls return in ~5ms. Duplicate uploads are instant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing: $0.002 per image.&lt;/strong&gt;&lt;br&gt;
Two-tenths of a cent. No credit bundles, no opaque tiers, no enterprise-sales-required pricing. A free tier to get started, no credit card required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this replaces&lt;/strong&gt;&lt;br&gt;
If you're stitching together image compliance today, your stack probably looks something like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you need  |  Current solution  |  What you're paying&lt;/strong&gt;&lt;br&gt;
Metadata stripping | Custom code/ExifToolwrapper | Engineering time&lt;/p&gt;

&lt;p&gt;Image optimization | Cloudinary/imgix | $89+/mo or credit bundles&lt;/p&gt;

&lt;p&gt;Content moderation | Sightengine or Amazon Rekognition | $29+/mo or AWS pay-as-you-go complexity&lt;/p&gt;

&lt;p&gt;That's three vendors, three integrations, three billing dashboards, and a homegrown orchestration layer to sequence them. Filtrate is one endpoint, one bill, one response object.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who this is for&lt;/strong&gt;&lt;br&gt;
Engineering teams at marketplaces processing user-generated images. If your users upload product photos — Poshmark, Depop, Vinted, Grailed, ThredUp, Wallapop, or anything like them — and you're not stripping EXIF metadata on ingest, you have a compliance gap and a privacy liability right now.&lt;/p&gt;

&lt;p&gt;Also useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Indie hackers&lt;/strong&gt; building marketplace MVPs who don't want to deal with three separate image services&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Any platform accepting user uploads&lt;/strong&gt; where you need moderation but don't want to build a review pipeline&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Teams migrating off Cloudinary&lt;/strong&gt; who don't need the full DAM and just want processing + compliance&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Under the hood&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;EXIF stripping:&lt;/strong&gt; Full removal — GPS, device info, timestamps, serial numbers, software tags. The processed image has zero metadata leakage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compression:&lt;/strong&gt; WebP output. Typical reduction is 70-85% file size with no visible quality loss.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Moderation:&lt;/strong&gt; GPT-4o-mini vision model. Checks for explicit content, fraud indicators, and banned logos. Returns a confidence score with every verdict.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Caching:&lt;/strong&gt; MD5 hash of the input image. Identical uploads skip the full pipeline and return cached results in milliseconds.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Try it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The playground is live: filtrate.polsia.app&lt;/p&gt;

&lt;p&gt;Upload an image, see what comes back. No account needed to try the playground. API keys are free — sign up, get a key, start processing.&lt;/p&gt;

&lt;p&gt;No credit card. No sales call. No 14-day trial that auto-charges.&lt;/p&gt;

&lt;p&gt;If your marketplace is storing GPS coordinates in user photos today, that's a liability you can fix in one afternoon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Playground &amp;amp; API docs: filtrate.polsia.app&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pricing: filtrate.polsia.app/pricing&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built by a solo dev who got tired of stitching three vendors together every time a marketplace needed image compliance. &lt;/p&gt;

&lt;p&gt;Questions? &lt;a href="mailto:filtrate@polsia.app"&gt;filtrate@polsia.app&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>privacy</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
