<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Work on Mohamad Dbouk</title>
    <link>https://mdbouk.com/work/</link>
    <description>Recent content in Work on Mohamad Dbouk</description>
    <generator>Hugo -- 0.147.7</generator>
    <language>en-us</language>
    <atom:link href="https://mdbouk.com/work/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Cloud-Native POS Platform (.NET / Azure)</title>
      <link>https://mdbouk.com/work/cloud-native-pos-platform/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mdbouk.com/work/cloud-native-pos-platform/</guid>
      <description>Principal engineer on a modular monolith POS platform built on .NET and Azure.</description>
      <content:encoded><![CDATA[<p><strong>Industry:</strong> Field POS for an operator network in North America</p>
<p><strong>Role:</strong> Principal engineer. I ship features in the modules, and I own the patterns those features are built on.</p>
<p>The platform is a modular monolith on .NET running in Azure. My work splits two ways. Most weeks I&rsquo;m in the modules, building the same kind of features any senior engineer on the team would. The rest of the time I&rsquo;m on the platform itself. That includes the vertical slice template the team uses for every new endpoint, the override system that lets us ship per-customer behavioral variants without forking the base code, and the workflow engine we use for long-running operations like payment and activation. Roslyn analyzers enforce the conventions so they don&rsquo;t quietly drift over time.</p>
<p><strong>Result:</strong> New endpoints scaffold in minutes from the template. Cross-module coupling defects get blocked at compile time. Per-customer behavior ships without parallel forks of the base code.</p>
<p><strong>Stack:</strong> .NET 9, Azure Container Apps, Cosmos DB, SQL Server, Redis, NServiceBus, FusionCache.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Greenfield Multi-Tenant POS SaaS for Restaurants (MENA)</title>
      <link>https://mdbouk.com/work/greenfield-multi-tenant-pos-saas/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mdbouk.com/work/greenfield-multi-tenant-pos-saas/</guid>
      <description>Tech lead on a multi-tenant POS SaaS built from zero for the restaurant industry, with database-per-tenant isolation and federated identity.</description>
      <content:encoded><![CDATA[<p><strong>Industry:</strong> Multi-tenant POS SaaS for the restaurant industry (MENA)</p>
<p><strong>Role:</strong> Tech lead. I owned the architecture across backend, frontend, cloud, and DevOps, did most of the building myself, and managed the team that delivered the platform.</p>
<p>The platform is a multi-tenant POS SaaS that any restaurant operator can sign up to. Each tenant gets its own SQL Server database and its own Keycloak realm for federated identity. Each tenant typically runs a brand hierarchy: a parent group, one or more restaurant concepts, and stores under each concept. The piece I&rsquo;m proudest of is the tenant onboarding flow. Adding a new tenant kicks off a saga that provisions the database, sets up the Keycloak realm, creates the admin user, and runs migrations across every module. If anything fails along the way, the saga rolls each step back cleanly.</p>
<p>Staff verification runs over WhatsApp instead of SMS, because that&rsquo;s what the region actually uses day to day. I built the frontend, the CI/CD, and the Terraform infrastructure alongside the backend, so the conventions stay consistent across all of it.</p>
<p><strong>Result:</strong> Onboarding a new tenant went from several days of manual setup to one automated workflow. Tenant isolation is enforced at the database layer, not at the row level.</p>
<p><strong>Stack:</strong></p>
<ul>
<li>Backend: .NET, Keycloak, Azure Service Bus, SQL Server (one database per tenant), Redis, SignalR.</li>
<li>Frontend: TypeScript, Vite.</li>
<li>Infrastructure and DevOps: Terraform, Azure Container Apps, Azure pipelines, GitHub Actions.</li>
<li>Quality and ops: Playwright for end-to-end tests, k6 for load, Serilog and Seq for logs.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>OutThink | Cybersecurity Human Risk Management SaaS</title>
      <link>https://mdbouk.com/work/outthink/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mdbouk.com/work/outthink/</guid>
      <description>Lead Software Engineer on a cybersecurity human risk management SaaS built on .NET, microservices, and CQRS.</description>
      <content:encoded><![CDATA[<p><strong>Industry:</strong> Cybersecurity SaaS (employee security awareness and human risk management)</p>
<p><strong>Role:</strong> Lead Software Engineer, 2022 to 2024. Two years on the platform team, designing microservices and the patterns behind them.</p>
<p>OutThink builds a SaaS platform that lets large organizations measure and reduce the cybersecurity risk caused by people: phishing simulations, training modules, behavioral scoring. The platform splits along microservice lines, with each service owning a slice of the human-risk domain. My work focused on the architecture and the patterns the team built against: domain-driven microservice boundaries, CQRS for the read and write split, a hybrid data strategy with SQL Server for the relational core and a NoSQL store for the event-shaped data, and Azure-native infrastructure including API Management and Cognitive Services for the AI features the product needed. I also mentored the team on TDD, unit testing, and Agile delivery, and reviewed code across the platform.</p>
<p><strong>Result:</strong> A microservice platform that scales horizontally with the customer base. An event-driven core that handles real-time learning and simulation data without backpressure on the transactional path.</p>
<p><strong>Stack:</strong> .NET 8, C#, Azure, Azure API Management, Azure Cognitive Services, SQL Server, NoSQL, CQRS, event-driven messaging.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Bottomline (TreasuryXpress) | Multi-Tenant Treasury Management SaaS</title>
      <link>https://mdbouk.com/work/bottomline-treasuryxpress/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mdbouk.com/work/bottomline-treasuryxpress/</guid>
      <description>Head of DevOps on a multi-tenant treasury management SaaS, leading the migration to AKS and shipping the patterns that ran 200&#43; enterprise deployments.</description>
      <content:encoded><![CDATA[<p><strong>Industry:</strong> Treasury management SaaS for global enterprises</p>
<p><strong>Role:</strong> Head of DevOps, 2019 to 2022. Three years owning the infrastructure and delivery pipeline across 200+ enterprise tenants.</p>
<p>The platform was a treasury management product running on Azure for hundreds of enterprise customers, each on their own deployment with their own configuration. The work that mattered most was making that fleet operable at scale. I led the migration from Azure App Services and SQL into Azure Kubernetes Service with Helm and PostgreSQL Flexible Server, set up CI/CD in Azure DevOps for both cloud and on-prem clients, and built a custom Azure Bot that technical managers used to deploy to specific clients without going through the pipeline themselves.</p>
<p>On the multi-tenant side, I shipped patterns for both approaches the product needed (multi-database single web app, and shared-database multi-schema single web app), wrote a tool to provision and deploy multiple client schemas in one database, and ran the database CI/CD flow on dacpac and Microsoft Database Project.</p>
<p><strong>Result:</strong> Deployments for 200+ tenants automated end to end. Move off long-lived VMs and onto containers. Hotfix and tagging cycles compressed from manual to scripted.</p>
<p><strong>Stack:</strong> .NET, Azure DevOps, Azure Kubernetes Service, Helm, Azure SQL, PostgreSQL Flexible Server, Azure Functions, Azure Bot Service, dacpac, SonarQube, Veracode.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
