A Complete SaaS in 19 Megabytes of RAM
Since January 2025 every German business has to be able to receive electronic invoices, and over the next two years everyone will have to send them. That felt like the right moment to see whether jdBasic can carry a real, paying-customers web product. Two weeks later, www.profi-rg.de is live: a German e-invoicing SaaS that reads XRechnung and ZUGFeRD files, validates them against the EN 16931 rule set, and creates compliant invoices - with accounts, email verification, a free tier and Stripe subscriptions.
Everything in it is jdBasic: the HTTP server routes, the session auth, the hand-written XML parser that understands both UBL and CII dialects, the validation engine with its BR/BR-DE rules, the PDF writer that can embed the invoice XML into a hybrid PDF, the Stripe and Resend integrations. SQLite is statically linked into the runtime; the deployment is one binary plus a folder of scripts and templates.
The part that surprised me
I measured the production process on the VPS after hammering it with parse-validate-render requests:
- ~19 MB RSS for the whole application - stable under load
- 3.9 MB binary, 4.9 MB total on disk including all templates
- single-digit milliseconds per request, end to end
- its sister app (a kanban board in the same stack) sits at 19 MB after 22 days of uptime
For context, here is what comparable stacks need according to publicly documented numbers: a bare Node.js/Express hello world starts around 32-55 MB, Django is commonly quoted at roughly 100 MB per gunicorn worker, and a fresh Rails/Puma worker typically takes 250-400 MB before it grows toward the gigabyte mark under traffic. In other words: the entire multi-tenant SaaS uses less memory than an empty Express project.
There is no magic in that - it is what you get when one interpreter process serves everything, the runtime is a single statically linked C++ binary, and there is no framework tower between the socket and your code. But it changes the economics: on one small 8 GB VPS this app, the ticket board, nginx and a database-per-app model coexist without ever thinking about memory.
Try it
The free viewer at profi-rg.de/viewer renders any XRechnung or ZUGFeRD file into a readable invoice with a full rule-by-rule validation report - no signup needed. And if you want the language underneath, jdBasic lives at jdbasic.org, where you can run it in the browser.