<?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: Jay Thorat</title>
    <description>The latest articles on DEV Community by Jay Thorat (@jaythorat).</description>
    <link>https://dev.to/jaythorat</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%2F3859994%2F3cbe4e5d-50a2-4d1f-958d-bc13fb3d9fb5.png</url>
      <title>DEV Community: Jay Thorat</title>
      <link>https://dev.to/jaythorat</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jaythorat"/>
    <language>en</language>
    <item>
      <title>I Built a Disposable Email Service Because Every Existing One Had Terrible UX</title>
      <dc:creator>Jay Thorat</dc:creator>
      <pubDate>Fri, 03 Apr 2026 19:27:47 +0000</pubDate>
      <link>https://dev.to/jaythorat/i-built-a-disposable-email-service-because-every-existing-one-had-terrible-ux-158i</link>
      <guid>https://dev.to/jaythorat/i-built-a-disposable-email-service-because-every-existing-one-had-terrible-ux-158i</guid>
      <description>&lt;p&gt;I needed a temporary email address. Simple enough, right?&lt;/p&gt;

&lt;p&gt;I opened the top results — Guerrilla Mail, Temp Mail, 10MinuteMail — and every single one felt like stepping into a website from 2008. Ads covering half the screen, pop-ups, slow loading, confusing layouts. These are supposed to be &lt;em&gt;privacy&lt;/em&gt; tools, yet they're stuffed with third-party trackers.&lt;/p&gt;

&lt;p&gt;I closed all the tabs and thought: &lt;em&gt;I'll just build one myself.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;MeowMail&lt;/strong&gt; — a disposable email service at &lt;a href="https://meowmail.in" rel="noopener noreferrer"&gt;meowmail.in&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One click, you get an inbox. No signup, no account, no cookies.&lt;/li&gt;
&lt;li&gt;Emails arrive in real-time.&lt;/li&gt;
&lt;li&gt;Everything auto-expires. Nothing is stored forever.&lt;/li&gt;
&lt;li&gt;Zero ads. Zero tracking.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. Nothing clever. Just a temp inbox that works and doesn't fight you.&lt;/p&gt;

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

&lt;p&gt;This is where it got interesting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backend: Elixir + Phoenix
&lt;/h3&gt;

&lt;p&gt;I didn't want to depend on a third-party email relay like Mailgun or SendGrid to &lt;em&gt;receive&lt;/em&gt; emails. I wanted to own the entire pipeline. So I built a custom SMTP server in Elixir using &lt;code&gt;gen_smtp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Incoming Email → SMTP Server → Email Parser → PostgreSQL → WebSocket broadcast
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Elixir was a perfect fit here. The BEAM VM handles thousands of concurrent SMTP connections without breaking a sweat, and Phoenix Channels gave me real-time delivery to the browser out of the box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key backend components:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SMTP Server&lt;/strong&gt; — Accepts inbound email directly, validates sender/recipient, enforces size limits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email Processor&lt;/strong&gt; — Parses MIME, extracts headers/body/attachments, sanitizes HTML&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate Limiter&lt;/strong&gt; — Hammer-based rate limiting to prevent abuse&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleanup Worker&lt;/strong&gt; — Background process that purges expired emails (TTL-based)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;REST API&lt;/strong&gt; — Phoenix controllers serving inbox and email data to the frontend&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Frontend: React + Vite + Tailwind CSS
&lt;/h3&gt;

&lt;p&gt;Minimal, fast, dark-themed UI. No component library — just clean custom components.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-time updates&lt;/strong&gt; via Phoenix WebSocket channels — new emails appear instantly without polling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Split-pane inbox&lt;/strong&gt; — email list on the left, detail view on the right&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sandboxed HTML rendering&lt;/strong&gt; — emails with HTML are rendered in a sandboxed iframe to prevent XSS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attachment support&lt;/strong&gt; — view and download attachments inline&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fully responsive&lt;/strong&gt; — works on mobile&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Infrastructure
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL for email storage&lt;/li&gt;
&lt;li&gt;Redis for rate limiting&lt;/li&gt;
&lt;li&gt;EC2 for hosting&lt;/li&gt;
&lt;li&gt;Cloudflare for DNS + Web Analytics (no Google Analytics — that would defeat the purpose)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Design Decisions I'm Happy About
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. No third-party email relay
&lt;/h3&gt;

&lt;p&gt;Owning the SMTP layer means no vendor lock-in, no per-email costs, and full control over what gets accepted or rejected. The tradeoff is more complexity, but Elixir made it manageable.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. TTL-based expiry, not user-triggered deletion
&lt;/h3&gt;

&lt;p&gt;Emails expire automatically. Users can delete manually too, but the system doesn't rely on them to clean up. This keeps storage bounded and predictable.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. No accounts for MVP
&lt;/h3&gt;

&lt;p&gt;The simplest version of a temp mail service doesn't need auth. You visit, you get an inbox, you use it, you leave. Adding accounts later is a layered addition, not a rewrite.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. WebSocket-first, not polling
&lt;/h3&gt;

&lt;p&gt;Polling an API every few seconds is wasteful and gives a sluggish feel. Phoenix Channels made real-time delivery trivially easy — when an email hits the SMTP server, it's in your browser within a second.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prerendering for SEO&lt;/strong&gt; — It's a React SPA, so Google has to execute JavaScript to see content. SSR or prerendering would help with crawlability. On the list for later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email threading&lt;/strong&gt; — Right now each email is standalone. Grouping by conversation would be a nice UX improvement.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Email forwarding (like Firefox Relay)&lt;/li&gt;
&lt;li&gt;Custom domain support (bring your own domain)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://meowmail.in" rel="noopener noreferrer"&gt;meowmail.in&lt;/a&gt;&lt;/strong&gt; — takes one click, no signup.&lt;/p&gt;

&lt;p&gt;If you've ever been frustrated by a bloated temp mail service, I built this for people like us. Would love to hear your feedback.&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.amazonaws.com%2Fuploads%2Farticles%2F24ub5rj25j57mgrt2tz3.png" 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.amazonaws.com%2Fuploads%2Farticles%2F24ub5rj25j57mgrt2tz3.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>ux</category>
    </item>
  </channel>
</rss>
