Marc Römmelt

Senior software engineer. Usually the first or lead engineer on a product: I set up the architecture, keep it boring, and stay long enough to defend it.

TypeScript · Node.js · Fürth (Nürnberg) · remote-first · freelance via 0815 Software UG · availability on request

Book a callhallo@marcroemmelt.de

Marc Römmelt, smiling, outdoors

ask

Questions? Ask the genie.

It knows my work, my terms and my limits, and it passes real enquiries straight to me.

An AI assistant answers from what Marc wrote about himself and passes enquiries on to Marc. Datenschutz

what I do

Hard backend problems, solved simply.

First or lead engineer

Take a product from idea to production, and set up the architecture, tooling and team habits it will live with for years.

Untangling systems

Multi-tenancy, service boundaries, independent deploys, migrations off frameworks that stopped fitting. Backwards-compatible, while production keeps running.

Event-driven backends

Queues, idempotent consumers, event sourcing and CQRS where correctness matters, like payroll that must reproduce any past month exactly.

AI that does real work

Real-time voice agents, LLM tool calling and WhatsApp integrations, with DSGVO and EU data residency designed in.

selected work

Six projects since 2019.

Self-taught, with a degree in entrepreneurship and a founder's habit of owning the whole product. Each project opens into the context, the decisions and the stack.

  1. 2026 — nowSparkassen-FinanzgruppeSenior engineer, freelance · via Web Computing GmbHDecoupling about 20 services behind a chatbot with 300+ tenants, so each service ships on its own while the platform stays in production.
  2. 2026CalluraFounder and sole engineer · own productPhone and WhatsApp AI for funeral homes. Built end to end on infrastructure that cost about as much as dinner per month. Now paused.
  3. 2023 — 2026PenzillaLead engineer · B2B SaaS for corporate pensionsSecond engineer, then tech lead; grew the team from two to six. Rebuilt multi-tenancy (query timeouts to zero, database connections from 200 to 20) and built event-sourced payroll integrated with DATEV, SAP and Personio.
  4. 2022 — 2023TheMakers.aiTechnical lead · B2B marketplaceTurned a proof of concept into a maintainable product. Hired and led four engineers and a product manager.
  5. 2021 — 2022FanzoneLead engineer, freelance · sports collectiblesOne codebase for web, iOS and Android. Introduced test-driven development through mob programming.
  6. 2019 — 2020ELIGOEngineer · candidate assessmentBroke up a monolithic Vue.js front end and built multi-tenant theming and authentication.

how I build

Complexity very, very bad.

My LinkedIn headline, borrowed from The Grug Brained Developer by Carson Gross. It is a joke. It is also the method.

Boring first

Postgres, a monolith, one server, until the problem proves it needs more. Distribution is a cost; pay it where it earns its keep.

Measure, then fix

Traces and a baseline before anyone says "fixed".

Plain over clever

Pure functions, honest types, code a new teammate can follow on day one.

Tests first

Test-driven by default. It is how I move fast without breaking what pays the bills.

Privacy from the first diagram

DSGVO, EU hosting and the AI Act shape the design before the first line of code.

Agents as power tools

Claude Code drafts, I review until I own every line. Faster, same standard. Where the client agrees, of course.

stack

Tools I reach for.

working together

Freelance, remote-first, in for the long run.

Contract
Through 0815 Software UG, billed hourly. Direct or through an agency.
Location
Remote-first. On-site around Nürnberg whenever it helps, elsewhere for kick-offs.
Duration
Three months or longer. Short architecture reviews too.
Availability
On request. I finish engagements properly before starting the next.

contact

Got a hard problem? Tell me about it.

I read and answer every message myself.

call
Book a call
mail
hallo@marcroemmelt.de
linkedin
in/marcroemmelt
cv
Marc_Roemmelt_CV.pdf
back

2023 — 2026 · Lead engineer · B2B SaaS for corporate pensions

Penzilla

B2B software for corporate pension administration. I joined as the second engineer and became tech lead about a year in, when the previous lead left. When I left, the platform managed 3,000–4,000 active employment contracts for about 50 customers, including Pro7 and Personio, and the team had grown from two to six.

A modular monolith, on purpose

NestJS with a hexagonal core, event-driven workflows over SQS and SNS with idempotent consumers, PostgreSQL on RDS, React for the admin and customer apps, all on AWS (Fargate, Lambda) with infrastructure in CDK. Microservices were the fashion. A team of two to six needed every engineer shipping, not a distributed system to babysit. I would make the same call again.

Multi-tenancy that stopped getting in the way

Schema-per-tenant had hit a wall: more than 100 Prisma clients (Prisma cannot share a pool across schemas), saturated RDS connections, frequent query timeouts, and brittle cross-tenant features. I designed a parallel-write migration to column-based tenancy. It changed only the ORM access layer, no application code, and reads switched over tenant by tenant once verified.

Afterwards: query timeouts went to zero, database connections from 200 to 20, and the RDS cluster got smaller. All tenants now use one shared connection pool. Each request names its tenant once, with a single set_config call, and features that work across tenants no longer need a separate database client per tenant.

Payroll, where correctness is not negotiable

Event-sourced with CQRS read models, so any past month reproduces exactly. Forward-effective adjustments and retroactive corrections that rewrite history are handled as two different things. It integrates asynchronously with DATEV Lohn und Gehalt, DATEV LODAS, SAP and Personio, each with its own data shape and cutoff-day (Stichtag) rules. It stays consistent with the HR data upstream and the payroll provider downstream when either side corrects the past.

Observability that says what broke

Replaced a noisy Opsgenie and CloudWatch setup with OpenTelemetry on Grafana Cloud: traces, logs and metrics, alerts defined as code next to the code they watch, incidents through Grafana IRM.

Off Next.js

Next.js was chosen before I joined. For a B2B product with separate front-end and back-end concerns, its rendering boundaries were opaque and its API patterns awkward. I made the case, got the team behind it, and moved us to a separate React front end and NestJS back end. The code became much easier to reason about.

The team

Hired five engineers, first alongside the previous lead, later leading hiring myself. Made code review, static analysis and shared conventions the default. Decisions were collaborative: my view usually carried, and we owned the result together.

Stack

  • TypeScript
  • Node.js
  • NestJS
  • React
  • Tailwind
  • PostgreSQL
  • AWS (Fargate, SQS, SNS, Lambda, RDS)
  • CDK
  • OpenTelemetry
  • Grafana Cloud

Want more depth? Book a call or write to hallo@marcroemmelt.de.