{"schemaVersion":1,"locale":"en","generatedAt":"2026-08-17T10:20:33.413Z","profile":{"slug":"profile","source":"content/profile.md","url":"https://krzemo.dev/about/","translated":true,"frontmatter":{"schemaVersion":1,"headline":"Senior backend engineer — .NET, distributed systems, AI-facing APIs","summary":"Senior backend engineer working mostly in .NET and C#, with a bias toward systems that stay understandable after the second year. I design and ship multi-tenant SaaS backends end to end: data model, API surface, auth, deployment. Lately I build interfaces meant for language models as well as for people — MCP servers and retrieval APIs over the same source of truth that renders the human-facing site.","location":{"city":"Rzeszów","country":"PL","timezone":"Europe/Warsaw"},"name":"Dominik Krzemiński","availability":"selective","email":"me@krzemo.dev","links":[{"rel":"repo","url":"https://github.com/krzemooo","label":"GitHub"},{"rel":"profile","url":"https://www.linkedin.com/in/krzemooo","label":"LinkedIn"}],"languages":[{"code":"pl","level":"native"},{"code":"en","level":"professional"}],"coreStack":["dotnet","csharp","aspnet-core","ef-core","postgres","typescript","docker","kubernetes","azure","anthropic-api"],"education":[{"id":"wsiz-rzeszow","institution":"University of Information Technology and Management in Rzeszów","degree":"Engineer's degree (Inżynier), Computer Science","years":{"start":2018,"end":2022}},{"id":"ekonomik-rzeszow","institution":"Ekonomik Rzeszów","degree":"Technician diploma, Digital Graphic Processes","years":{"start":2013,"end":2017}}]},"body":"I build backends that other people have to maintain, so I optimise for the\nboring properties: explicit boundaries, a data model that survives contact with\nreal usage, and deployment that a single person can reason about at 2 a.m.\n\nMost of my work is .NET on PostgreSQL, split into services only where the\nseams are real. I care about the parts that rarely make it into a job ad —\nmigration strategy, backpressure, what happens when a third-party integration\ngoes down for six hours.\n\nThe recent thread in my work is building for two audiences at once. A product\nnow has human users and machine users, and the machine ones deserve a\nfirst-class interface rather than a scraped approximation of the UI. This site\nis the smallest honest demonstration of that idea."},"projects":[{"slug":"stampulse","source":"content/projects/stampulse.md","url":"https://krzemo.dev/projects/stampulse/","translated":true,"frontmatter":{"schemaVersion":1,"title":"Stampulse","tagline":"Loyalty platform for local businesses — mobile app, two web portals, one .NET backend.","summary":"Stampulse replaces paper stamp cards with a multi-tenant loyalty platform: a Flutter app for end customers, separate React portals for venue owners and their staff, and a .NET backend built from focused services behind a gateway. I own the architecture end to end — tenant isolation, the GDPR-shaped data model, OpenIddict-based auth, and the Kubernetes deployment pipeline. The interesting constraint is that a venue's staff device is shared, offline half the time, and operated in ten seconds at a counter.","role":"Lead engineer","metrics":[{"id":"apps","value":"5","label":"Apps in one monorepo"},{"id":"services","value":"6","label":"Backend services"}],"status":"active","period":{"start":"2024-01"},"stack":["dotnet","csharp","aspnet-core","ef-core","postgres","redis","react","flutter","kubernetes","grpc"],"links":[{"rel":"demo","url":"https://stampulse.com"}],"keywords":["loyalty","multi-tenant","gdpr","microservices"],"confidential":false,"featured":true,"order":10,"draft":false},"body":"## The problem\n\nPaper stamp cards get lost, and the venue owner ends up with no data at all —\nno idea who comes back, how often, or what a returning customer is worth.\nExisting loyalty apps solve this by making the customer install one app per\ncafé, which nobody does.\n\n## Shape of the system\n\nThe backend is a small number of services that own clearly separate data:\nidentity, tenants and venues, loyalty programs, campaigns, and reporting.\nThey talk over gRPC internally and sit behind a single gateway. Everything\ntenant-scoped carries the tenant id in the data model rather than relying on a\nruntime filter that one forgotten query can bypass.\n\n## What was actually hard\n\nThe staff-facing flow. A shared device behind a counter, an employee who may\nhave started that morning, and a customer who will wait about ten seconds.\nThat pushed a lot of complexity backwards into the API: idempotent stamp\nissuance, conflict resolution for offline batches, and an audit trail that\nsurvives a device being handed to someone else mid-shift."},{"slug":"beacon","source":"content/projects/beacon.md","url":"https://krzemo.dev/projects/beacon/","translated":true,"frontmatter":{"schemaVersion":1,"title":"Beacon","tagline":"A Raspberry Pi status device aggregating AI coding sessions across machines into one ambient display.","summary":"Beacon is a personal ambient-status device: a Raspberry Pi with an OLED display and status LEDs that aggregates Claude Code sessions running across several machines, so a finished run or a session waiting on input surfaces without alt-tabbing through terminals. A FastAPI service ingests session events reported from each machine into SQLite; the device renders them through local, rule-based status classification — no cloud dependency in the loop. The hardware went live in August 2026, and the architecture keeps adjusting as real usage surfaces edge cases the pre-hardware design did not anticipate.","role":"Creator","metrics":[],"status":"prototype","period":{"start":"2026-08"},"stack":["python","fastapi","sqlite","raspberry-pi"],"links":[],"keywords":["ambient-computing","hardware","developer-tooling"],"confidential":false,"featured":false,"order":20,"draft":false},"body":"Born from a real workflow problem: several concurrent AI coding sessions\nacross machines, and no way to know which one finished or blocked without\npolling terminals by hand. Beacon turns that state into ambient hardware —\nan event-ingestion service on one side, a rule-based classifier and a\nglanceable display on the other."},{"slug":"pawid","source":"content/projects/pawid.md","url":"https://krzemo.dev/projects/pawid/","translated":true,"frontmatter":{"schemaVersion":1,"title":"PawID","tagline":"An early-stage pet-management concept built around retrieval-based visual breed identification.","summary":"PawID is an early-stage concept for a mobile/web app that helps pet owners manage their pets — profiles, health records, reminders — built around a breed identifier working from a photo or a free-text description. The current work is a proof of concept measuring retrieval quality for that identification step: reference photos embedded with CLIP, indexed in a Chroma vector store, and matched against query images across dog and cat breeds. The main app has no codebase yet — this is deliberate technical de-risking before any build commitment.","role":"Creator","metrics":[],"status":"prototype","period":{"start":"2026-07"},"stack":["python","clip","chroma"],"links":[],"keywords":["proof-of-concept","image-retrieval","mobile"],"confidential":false,"featured":false,"order":30,"draft":false},"body":"Pet owners currently juggle paper vaccination books, a phone gallery of\nphotos, and guesswork about a rescue's actual breed mix. PawID starts from\nthe breed-identification piece because it carries the technical risk: if\nembedding-based retrieval cannot separate visually close breeds reliably,\nthe product around it is not worth building. The POC exists to answer that\nquestion first."},{"slug":"ha-inel","source":"content/projects/ha-inel.md","url":"https://krzemo.dev/projects/ha-inel/","translated":true,"frontmatter":{"schemaVersion":1,"title":"Inel Home Assistant integration","tagline":"A reverse-engineered Home Assistant integration for the Inel InelNet wall controller.","summary":"A custom Home Assistant integration for the Inel InelNet wall controller, a RS-485 shutter/light/socket controller with no public API or documentation. Reverse-engineered from the controller's own web interface, it exposes shutters, lights, sockets and gates as native Home Assistant entities. Published as open source for anyone else running the same hardware.","role":"Creator","metrics":[],"status":"maintained","period":{"start":"2026-07"},"stack":["python","home-assistant"],"links":[],"keywords":["home-assistant","reverse-engineering","open-source"],"confidential":false,"featured":false,"order":40,"draft":false},"body":"Built for my own home network, where this brand of wall controller had no\nexisting Home Assistant support. Reverse-engineering the controller's web UI\nturned out to be the only route in — no documented API exists — so the\nintegration talks to the same endpoints the controller's own interface uses."}],"experience":[{"slug":"enixware","source":"content/experience/enixware.md","url":"https://krzemo.dev/about/","translated":true,"frontmatter":{"schemaVersion":1,"role":"Backend Engineer","location":"Remote","highlights":["Backend engineering for a high-traffic transactional platform — service design, implementation, and day-to-day operation.","Built internal services and the analytics and statistics layer on OpenSearch, turning operational data into product decisions.","Managed infrastructure as code with Terraform across AWS and DigitalOcean, carrying DevOps duties alongside development.","Automated end-to-end testing with Playwright and contributed to Next.js front-end surfaces."],"company":"Enixware","employmentType":"fulltime","period":{"start":"2023-11"},"remote":true,"stack":["dotnet","csharp","aws","digitalocean","terraform","opensearch","nextjs","playwright"],"order":10,"draft":false},"body":"Current role. Backend services for a high-traffic transactional platform:\nthe services themselves, the infrastructure they run on, and the analytics\nthat explain them."},{"slug":"bluesoft","source":"content/experience/bluesoft.md","url":"https://krzemo.dev/about/","translated":true,"frontmatter":{"schemaVersion":1,"role":"Senior .NET Developer","location":"Warsaw, PL","highlights":["A short senior engagement centred on legacy-system takeover and migration planning.","Reverse-engineered a production system, interviewed its users, and produced the analysis that shaped its successor."],"company":"BlueSoft","employmentType":"fulltime","period":{"start":"2023-08","end":"2023-10"},"remote":true,"stack":["dotnet","csharp"],"order":20,"draft":false},"body":"Brief but focused: taking over a working legacy system and preparing the\nanalysis its replacement was built from."},{"slug":"mobitouch","source":"content/experience/mobitouch.md","url":"https://krzemo.dev/about/","translated":true,"frontmatter":{"schemaVersion":1,"role":".NET Developer","location":"Remote","highlights":["Backend development on a high-availability SaaS platform built as microservices on Azure and Kubernetes.","Worked with asynchronous messaging over RabbitMQ and internal gRPC APIs between services.","Combined development with technical support, DevOps, and data-driven performance optimisation."],"company":"mobitouch","employmentType":"fulltime","period":{"start":"2022-10","end":"2023-08"},"remote":true,"stack":["dotnet","csharp","azure","kubernetes","docker","rabbitmq","grpc"],"order":30,"draft":false},"body":"Microservices work on Azure and Kubernetes — development, inter-service\nmessaging, and the operational side of keeping a SaaS platform healthy."},{"slug":"ideo","source":"content/experience/ideo.md","url":"https://krzemo.dev/about/","translated":true,"frontmatter":{"schemaVersion":1,"role":".NET Developer","location":"Rzeszów, PL","highlights":["Developed and supported business-critical systems in a regulated industry, from the business and user layer down.","Delivered a logistics-sector web application on ASP.NET Core, including its data analysis and reporting.","Deep business-side involvement — client meetings, advisory, and requirements analysis alongside delivery."],"company":"Ideo Software","employmentType":"fulltime","period":{"start":"2021-06","end":"2022-10"},"remote":false,"stack":["dotnet","csharp","aspnet-core","azure","kubernetes"],"order":40,"draft":false},"body":"On-site in Rzeszów: regulated-industry systems and a logistics application,\nwith as much time spent with the client as with the code."},{"slug":"mukisolution","source":"content/experience/mukisolution.md","url":"https://krzemo.dev/about/","translated":true,"frontmatter":{"schemaVersion":1,"role":".NET Developer","location":"Rzeszów, PL","highlights":["Started in IT support, then moved into .NET Framework development on an ERP system for small and medium businesses.","Built warehousing, dispatch, and sales modules, integrating IoT devices on the warehouse side.","Ran requirements interviews with end users and translated them into data models and UI/UX."],"company":"MukiSolution","employmentType":"contract","period":{"start":"2017-11","end":"2021-07"},"remote":false,"stack":["dotnet-framework","csharp","sql-server","iot"],"order":50,"draft":false},"body":"Where the .NET specialization started — IT support first, then ERP\ndevelopment across warehousing, dispatch, and sales."}],"stack":[{"entry":{"id":"anthropic-api","label":"Anthropic API","category":"ai","level":"working","since":2024,"url":"https://docs.anthropic.com"},"projectCount":0,"experienceCount":0,"isCore":true},{"entry":{"id":"aspnet-core","label":"ASP.NET Core","category":"backend","level":"expert","since":2017,"url":"https://learn.microsoft.com/aspnet/core"},"projectCount":1,"experienceCount":1,"isCore":true},{"entry":{"id":"astro","label":"Astro","category":"frontend","level":"working","since":2024,"url":"https://astro.build"},"projectCount":0,"experienceCount":0,"isCore":false},{"entry":{"id":"aws","label":"AWS","category":"infra","level":"working","since":2023,"url":"https://aws.amazon.com"},"projectCount":0,"experienceCount":1,"isCore":false},{"entry":{"id":"azure","label":"Azure","category":"infra","level":"working","since":2022,"url":"https://azure.microsoft.com"},"projectCount":0,"experienceCount":2,"isCore":true},{"entry":{"id":"chroma","label":"Chroma","category":"data","level":"familiar","since":2026,"url":"https://www.trychroma.com"},"projectCount":1,"experienceCount":0,"isCore":false},{"entry":{"id":"clip","label":"CLIP","category":"ai","level":"familiar","since":2026,"url":"https://github.com/openai/CLIP"},"projectCount":1,"experienceCount":0,"isCore":false},{"entry":{"id":"csharp","label":"C#","category":"language","level":"expert","since":2016,"url":"https://learn.microsoft.com/dotnet/csharp"},"projectCount":1,"experienceCount":5,"isCore":true},{"entry":{"id":"digitalocean","label":"DigitalOcean","category":"infra","level":"working","since":2023,"url":"https://www.digitalocean.com"},"projectCount":0,"experienceCount":1,"isCore":false},{"entry":{"id":"docker","label":"Docker","category":"infra","level":"expert","since":2018,"url":"https://www.docker.com"},"projectCount":0,"experienceCount":1,"isCore":true},{"entry":{"id":"dotnet","label":".NET","category":"backend","level":"expert","since":2016,"url":"https://dotnet.microsoft.com"},"projectCount":1,"experienceCount":4,"isCore":true},{"entry":{"id":"dotnet-framework","label":".NET Framework","category":"backend","level":"expert","since":2017,"url":"https://learn.microsoft.com/dotnet/framework"},"projectCount":0,"experienceCount":1,"isCore":false},{"entry":{"id":"ef-core","label":"EF Core","category":"data","level":"expert","since":2017,"url":"https://learn.microsoft.com/ef/core"},"projectCount":1,"experienceCount":0,"isCore":true},{"entry":{"id":"fastapi","label":"FastAPI","category":"backend","level":"working","since":2026,"url":"https://fastapi.tiangolo.com"},"projectCount":1,"experienceCount":0,"isCore":false},{"entry":{"id":"flutter","label":"Flutter","category":"frontend","level":"working","since":2023,"url":"https://flutter.dev"},"projectCount":1,"experienceCount":0,"isCore":false},{"entry":{"id":"grpc","label":"gRPC","category":"backend","level":"working","since":2021,"url":"https://grpc.io"},"projectCount":1,"experienceCount":1,"isCore":false},{"entry":{"id":"home-assistant","label":"Home Assistant","category":"tooling","level":"working","since":2026,"url":"https://www.home-assistant.io"},"projectCount":1,"experienceCount":0,"isCore":false},{"entry":{"id":"iot","label":"IoT","category":"infra","level":"familiar","since":2018},"projectCount":0,"experienceCount":1,"isCore":false},{"entry":{"id":"kubernetes","label":"Kubernetes","category":"infra","level":"working","since":2021,"url":"https://kubernetes.io"},"projectCount":1,"experienceCount":2,"isCore":true},{"entry":{"id":"mcp","label":"Model Context Protocol","category":"ai","level":"working","since":2025,"url":"https://modelcontextprotocol.io"},"projectCount":0,"experienceCount":0,"isCore":false},{"entry":{"id":"nextjs","label":"Next.js","category":"frontend","level":"familiar","since":2023,"url":"https://nextjs.org"},"projectCount":0,"experienceCount":1,"isCore":false},{"entry":{"id":"opensearch","label":"OpenSearch","category":"data","level":"working","since":2023,"url":"https://opensearch.org"},"projectCount":0,"experienceCount":1,"isCore":false},{"entry":{"id":"playwright","label":"Playwright","category":"tooling","level":"working","since":2023,"url":"https://playwright.dev"},"projectCount":0,"experienceCount":1,"isCore":false},{"entry":{"id":"postgres","label":"PostgreSQL","category":"data","level":"expert","since":2017,"url":"https://www.postgresql.org"},"projectCount":1,"experienceCount":0,"isCore":true},{"entry":{"id":"python","label":"Python","category":"language","level":"working","since":2026,"url":"https://www.python.org"},"projectCount":3,"experienceCount":0,"isCore":false},{"entry":{"id":"rabbitmq","label":"RabbitMQ","category":"backend","level":"working","since":2022,"url":"https://www.rabbitmq.com"},"projectCount":0,"experienceCount":1,"isCore":false},{"entry":{"id":"raspberry-pi","label":"Raspberry Pi","category":"infra","level":"familiar","since":2026,"url":"https://www.raspberrypi.com"},"projectCount":1,"experienceCount":0,"isCore":false},{"entry":{"id":"react","label":"React","category":"frontend","level":"working","since":2019,"url":"https://react.dev"},"projectCount":1,"experienceCount":0,"isCore":false},{"entry":{"id":"redis","label":"Redis","category":"data","level":"working","since":2019,"url":"https://redis.io"},"projectCount":1,"experienceCount":0,"isCore":false},{"entry":{"id":"sql-server","label":"SQL Server","category":"data","level":"working","since":2017,"url":"https://www.microsoft.com/sql-server"},"projectCount":0,"experienceCount":1,"isCore":false},{"entry":{"id":"sqlite","label":"SQLite","category":"data","level":"working","since":2026,"url":"https://www.sqlite.org"},"projectCount":1,"experienceCount":0,"isCore":false},{"entry":{"id":"terraform","label":"Terraform","category":"infra","level":"working","since":2023,"url":"https://www.terraform.io"},"projectCount":0,"experienceCount":1,"isCore":false},{"entry":{"id":"typescript","label":"TypeScript","category":"language","level":"expert","since":2018,"url":"https://www.typescriptlang.org"},"projectCount":0,"experienceCount":0,"isCore":true}]}