Cloud-Native POS Platform for Retail (.NET / Azure).

Principal engineer on a modular monolith POS platform built on .NET and Azure.
Industry
Field POS for an operator network in North America
Role
Principal engineer. I ship features in the modules, and I own the patterns those features are built on.

The platform is a modular monolith on .NET running in Azure. The product team needed something that could move fast on features while not collapsing under per-customer customization. We landed on a modular monolith with strong vertical-slice conventions, an override system for per-customer behavior, and async messaging through NServiceBus when modules need to talk to each other.

The codebase splits by feature, not by layer. Each module owns its features, persistence, and DTOs, with shared building blocks for Cosmos DB, abstractions, and infrastructure. Three hosts compose those modules differently. A REST API exposes endpoints. An RPC service exposes the same modules without endpoints for internal callers. A worker runs background jobs over NServiceBus using only the RPC surface, so it never reaches into a module directly.

The override system is the piece that lets the platform serve very different operators without forking. Inside each module, a per-variant folder holds customer-specific behavior overrides for features, services, processes, and RPC services. The dependency injection swaps the right variant in based on the deployment, so a customer-specific tweak is a deliberate override rather than a branch of the base code.

The workflow engine handles long-running operations like payment and activation: state machines, retries, compensation, idempotency. Roslyn analyzers enforce the conventions across the whole solution. Dependency direction, naming, the module boundary rules. If someone tries to reach across a module the wrong way, the build breaks before the PR opens.

The vertical slice template scaffolds new endpoints in minutes. The pattern is the same for every feature: a command or query, a handler, a validator, a presenter. New engineers ramp on the template, not on a slide deck.

Alongside the backend work, I led the migration of the platform’s hosting onto Terraform-managed Azure resources. Container Apps, networking, secrets, observability, the lot, defined in code with the state stored remotely and the plan reviewed in pull requests. A deployment change now goes through the same review gate as a code change, environments rebuild cleanly from scratch, and the gap between local and production stays small.

Stack
  • NET
  • Azure Container Apps
  • Cosmos DB
  • SQL Server
  • Redis
  • NServiceBus
  • FusionCache
  • Roslyn analyzers
  • Terraform