<?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: Luis</title>
    <description>The latest articles on DEV Community by Luis (@shrpp).</description>
    <link>https://dev.to/shrpp</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%2F3902888%2Fcc86d725-a2cb-4278-9ee7-74ac35d50af9.jpeg</url>
      <title>DEV Community: Luis</title>
      <link>https://dev.to/shrpp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shrpp"/>
    <language>en</language>
    <item>
      <title>Your auth server shouldn't cost more RAM than your entire app. So I wrote my own in Rust.</title>
      <dc:creator>Luis</dc:creator>
      <pubDate>Tue, 28 Apr 2026 20:33:54 +0000</pubDate>
      <link>https://dev.to/shrpp/your-auth-server-shouldnt-cost-more-ram-than-your-entire-app-so-i-wrote-my-own-in-rust-1o83</link>
      <guid>https://dev.to/shrpp/your-auth-server-shouldnt-cost-more-ram-than-your-entire-app-so-i-wrote-my-own-in-rust-1o83</guid>
      <description>&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%2F5sv19fyrmmbthhsz3jdx.gif" 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%2F5sv19fyrmmbthhsz3jdx.gif" alt="This is for you!" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've been using Keycloak for almost 1 year across freelance projects — large-scale enterprise apps and small side projects alike. The appeal was always the same: it's free, battle-tested, and it works.&lt;/p&gt;

&lt;p&gt;Until it doesn't.&lt;/p&gt;

&lt;p&gt;The documentation is a labyrinth. Pages and pages of concepts and configurations that make sense if you already know Keycloak, but are genuinely hostile if you're just trying to get started.&lt;/p&gt;

&lt;p&gt;But the real breaking point was the math. A DigitalOcean droplet with enough RAM to run Keycloak comfortably costs more than most small projects can justify. And SaaS alternatives like Clerk or Auth0 aren't much better — you're paying per seat, per month, forever, while handing your users' credentials to a third party.&lt;/p&gt;

&lt;p&gt;So two weeks ago I started building my own. Written in Rust. Running in under 20MB of RAM.&lt;/p&gt;

&lt;p&gt;This is what I learned.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Landscape Problem
&lt;/h2&gt;

&lt;p&gt;Let's talk about numbers. When you're a small team or even a solo developer, you're almost always choosing between the cheapest or most self-hosted options available:&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%2Fcho7nughzjzzooron2mp.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%2Fcho7nughzjzzooron2mp.png" alt="Comparison table" width="791" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keycloak idles at ~512MB RAM. Authentik runs a server and a worker separately — combined you're looking at ~735MB, plus a Redis instance on top. Zitadel is more reasonable at ~150MB, but still needs a comfortable server to run well. All of them are written in Java, Python, or Go — runtimes that carry overhead by design.&lt;/p&gt;

&lt;p&gt;If your VPS has 1GB of RAM, you've already spent most of it before your app starts. And if you're on a $6/mo droplet — which is where a lot of freelance and side projects live — you don't have that RAM to spare.&lt;/p&gt;

&lt;p&gt;SaaS alternatives solve the infrastructure problem but create new ones. Clerk starts at $25/mo. Auth0 at $23/mo. Both charge per seat as you grow, and both mean your users' credentials live on someone else's servers under someone else's encryption model.&lt;/p&gt;

&lt;p&gt;The gap between "what auth costs to run" and "what a small project can actually afford" is exactly where OVTL lives (you can even run a Minecraft vanilla server without any problem on the lowest tier).&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Rust???
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Honest answer&lt;/strong&gt;: I wanted something lean by default, not by configuration.&lt;/p&gt;

&lt;p&gt;Garbage-collected runtimes like the JVM introduce overhead you can't fully control — memory spikes, pause times, warmup costs. For an auth server that needs to be predictable, that's a problem. Rust doesn't have a garbage collector. The binary starts in under a second and stays there.&lt;/p&gt;

&lt;p&gt;There's also the security angle, which — for something that guards your users' credentials — kind of matters. Rust's ownership model eliminates entire classes of memory vulnerabilities at compile time. Not in production. Not in a postmortem. At compile time.&lt;/p&gt;

&lt;p&gt;Honestly, once it clicks, it's hard to go back.&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%2Flyc1rknk9za0da6vijsh.gif" 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%2Flyc1rknk9za0da6vijsh.gif" alt="Not really..." width="374" height="374"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Wait, it's also secure?
&lt;/h2&gt;

&lt;p&gt;Building an auth server from scratch means making calls that aren't obvious until you're deep in it. These shaped OVTL the most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero-knowledge encryption&lt;/strong&gt;. User data is encrypted at rest with &lt;em&gt;AES-256-GCM&lt;/em&gt; using a double-envelope key model — the server never handles plaintext credentials directly. I built a separate Rust crate for this called &lt;a href="https://crates.io/crates/hefesto" rel="noopener noreferrer"&gt;hefesto&lt;/a&gt; because nothing existing fit what I needed. It's the part I'm most proud of.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-tenancy via PostgreSQL RLS&lt;/strong&gt;. Tenant isolation is enforced at the database level through &lt;em&gt;Row Level Security&lt;/em&gt; — not in application code. Even if something goes wrong at the app layer, tenants can't bleed into each other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PKCE required, not optional&lt;/strong&gt;. A lot of auth servers support &lt;em&gt;PKCE&lt;/em&gt; but don't enforce it. OVTL requires it on every &lt;em&gt;Authorization Code flow&lt;/em&gt;. Minor friction for developers, real protection against token interception attacks.&lt;/p&gt;

&lt;p&gt;None of these were the easy path. But they're what makes the difference between an auth server you can trust and one you just hope works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The result?&lt;/strong&gt; A full OAuth2 + OIDC stack, multi-tenant, zero-knowledge encrypted — running in under 20MB of RAM. On the same $6 VPS your app already lives on. No sidecars, no Redis, no dedicated server. Just your app and your auth, together.&lt;/p&gt;




&lt;h2&gt;
  
  
  Oh, and did I mention it has a TUI?
&lt;/h2&gt;

&lt;p&gt;No web UI required. You manage tenants, users, clients, roles, and permissions straight from your terminal — with guided wizard setup. Because if you're already living in the terminal, why would you open a browser just to create a tenant?&lt;/p&gt;

&lt;p&gt;It looks something like this:&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="nv"&gt;$ &lt;/span&gt;ovlt &lt;span class="nt"&gt;--url&lt;/span&gt; http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And yes, it has wizards. Friendly ones.&lt;/p&gt;




&lt;h2&gt;
  
  
  So...what's next? (besides sleep)
&lt;/h2&gt;

&lt;p&gt;OVTL is two weeks old. Yes, two weeks. It's alpha, it's rough around the edges, and there's a list of things I know need fixing — OIDC compliance, email delivery, and a bunch of stuff I probably haven't discovered yet. I'm not going to pretend it's ready for production, because it's not.&lt;/p&gt;

&lt;p&gt;But here's the thing — the core actually works. OAuth2 + OIDC, multi-tenant, zero-knowledge encrypted, MFA, social login, audit log, all sitting comfortably under 20MB of RAM. For two weeks of work, I'll take it.&lt;/p&gt;

&lt;p&gt;If you're the kind of developer who enjoys poking at half-finished things, finding edge cases, or just watching someone build in public and occasionally panic — you're going to feel right at home.&lt;/p&gt;

&lt;p&gt;Drop by &lt;a href="https://ovlt.tech" rel="noopener noreferrer"&gt;ovlt.tech&lt;/a&gt; and tell me what you think. The GitHub Discussion is open and I read everything.&lt;/p&gt;

&lt;p&gt;Come break it. Seriously, please do.&lt;/p&gt;

</description>
      <category>security</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>rust</category>
    </item>
  </channel>
</rss>
