I build the parts of products users never see — and always rely on. I care about clean service boundaries, well-modeled data, and APIs other teams can build on without surprises.
Lately I've been taking projects the whole way: containerizing services, wiring up CI/CD, and self-hosting off the platform to learn what it was quietly doing for me. [Edit this with your own story.]
Learning ops in public — taking a NestJS API from laptop to a self-hosted box with Nginx, HTTPS and CI/CD by hand.
A production-ready multi-tenant SaaS backend starter — auth, background jobs, real-time notifications and caching, built in public.
A complete NextAuth implementation — 2FA, role-based routing and best-practice security patterns on Next.js Server Actions.
Portfolio and engineering journal. Content lives in Postgres and is edited from a custom admin panel — write markdown, save, it's live.
Built Impactly, a B2B ESG data intelligence platform serving financial institutions across the Nordics and Baltics. Independently designed a dynamic carbon emissions calculator for Estonia, Latvia and Lithuania, integrated ElasticSearch for fast retrieval across large company and ESG datasets, and built a JSON-driven form engine so new data workflows shipped without frontend changes.
Designed a device session management system limiting concurrent logins via refresh-token tracking — first in PostgreSQL, then migrated to Redis for performance. Built an internal Employee Management System backend in NestJS, merged three sites into a single Strapi CMS, and wrote a Strapi plugin issuing CloudFront signed URLs for private S3 assets.
Built MVC-architecture APIs for enterprise applications using .NET Web API and Microsoft SQL Server, and sharpened relational database fundamentals through hands-on SQL query optimisation.
A reference architecture I reach for — stateless services behind a gateway, async work off the hot path, and a database treated as a first-class design surface.
Versioned, well-typed APIs so consumers never guess. The schema is the source of truth.
Keep slow work off the request path with queues and workers; fail and retry gracefully.
Logs, metrics and traces from day one — you can't fix what you can't see.
Model the data carefully, lean on Postgres, and index for the queries that matter.
Open to backend and platform roles. Drop a note here, or reach me directly.