<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Notes from production | Mohammad Abukhadija</title>
    <link>https://blog.mohammadabukhadija.tech/</link>
    <description>Architecture, security, infrastructure, and AI in Arabic-first products.</description>
    <language>en</language>
    <item>
      <title>Building an Arabic-first, multi-tenant legal platform</title>
      <link>https://blog.mohammadabukhadija.tech/arabic-first-multi-tenant-legal-platform/</link>
      <guid>https://blog.mohammadabukhadija.tech/arabic-first-multi-tenant-legal-platform/</guid>
      <description>How Nibras is put together: one .NET image in two roles, a request pipeline where order is security, firm isolation in the data layer, authorization that fails closed, background work that never charges twice, and an AI assistant that has to ask first.</description>
      <pubDate>Thu, 05 Nov 2026 00:00:00 GMT</pubDate>
      <category>architecture</category>
      <category>multi-tenancy</category>
      <category>security</category>
      <category>AI</category>
      <category>.NET</category>
      <category>PostgreSQL</category>
    </item>
    <item>
      <title>Arabic legal RAG on PostgreSQL and pgvector, in .NET</title>
      <link>https://blog.mohammadabukhadija.tech/arabic-legal-rag-postgres-pgvector/</link>
      <guid>https://blog.mohammadabukhadija.tech/arabic-legal-rag-postgres-pgvector/</guid>
      <description>How the legal assistant in Nibras finds Jordanian law: Arabic normalization, statute-aware chunking, an exact-article path before any vector search, debounced indexing, firm-scoped retrieval in SQL, and a rule that a legal answer without a source does not get generated.</description>
      <pubDate>Thu, 05 Nov 2026 00:00:00 GMT</pubDate>
      <category>AI</category>
      <category>RAG</category>
      <category>PostgreSQL</category>
      <category>pgvector</category>
      <category>Arabic</category>
      <category>.NET</category>
    </item>
    <item>
      <title>Fatoora: one product, three architectures</title>
      <link>https://blog.mohammadabukhadija.tech/fatoora-one-product-three-architectures/</link>
      <guid>https://blog.mohammadabukhadija.tech/fatoora-one-product-three-architectures/</guid>
      <description>An Arabic invoice maker built three times in three weeks: a localStorage-first static page with optional Supabase sync, then two Next.js versions on Neon and Clerk. What moved where, why, and which shortcuts were deliberate.</description>
      <pubDate>Thu, 05 Nov 2026 00:00:00 GMT</pubDate>
      <category>architecture</category>
      <category>next.js</category>
      <category>postgresql</category>
      <category>arabic</category>
      <category>rtl</category>
      <category>side project</category>
    </item>
    <item>
      <title>Hand-tracked VFX with MediaPipe, OpenCV, and Pygame</title>
      <link>https://blog.mohammadabukhadija.tech/hand-tracked-vfx-mediapipe-opencv/</link>
      <guid>https://blog.mohammadabukhadija.tech/hand-tracked-vfx-mediapipe-opencv/</guid>
      <description>A webcam effect that puts a glowing orb, particles, and a holographic HUD on your fingertips, and fires a burst when your hands meet. How the real-time loop works, how the gesture is read from landmarks, where the frame time goes, and the PyInstaller path bug that hides your model file.</description>
      <pubDate>Thu, 05 Nov 2026 00:00:00 GMT</pubDate>
      <category>computer vision</category>
      <category>Python</category>
      <category>MediaPipe</category>
      <category>OpenCV</category>
      <category>Pygame</category>
      <category>PyInstaller</category>
    </item>
    <item>
      <title>Ratcheting architecture rules in a modular monolith</title>
      <link>https://blog.mohammadabukhadija.tech/ratcheting-architecture-rules-modular-monolith/</link>
      <guid>https://blog.mohammadabukhadija.tech/ratcheting-architecture-rules-modular-monolith/</guid>
      <description>How I keep module boundaries honest in a large .NET and React codebase without a big-bang cleanup: a generated module manifest, an import and cycle checker in CI, a recorded baseline of existing violations, and a build that fails only on new ones.</description>
      <pubDate>Thu, 05 Nov 2026 00:00:00 GMT</pubDate>
      <category>architecture</category>
      <category>CI/CD</category>
      <category>.NET</category>
      <category>React</category>
      <category>TypeScript</category>
      <category>refactoring</category>
    </item>
    <item>
      <title>Shipping a paywalled ML model with Flask</title>
      <link>https://blog.mohammadabukhadija.tech/shipping-a-paywalled-ml-model-flask/</link>
      <guid>https://blog.mohammadabukhadija.tech/shipping-a-paywalled-ml-model-flask/</guid>
      <description>How a scikit-learn car-price model became a small paid web product: loading the artifacts without taking the site down, carrying form state across a payment redirect, and being honest about what a return URL proves.</description>
      <pubDate>Thu, 05 Nov 2026 00:00:00 GMT</pubDate>
      <category>python</category>
      <category>flask</category>
      <category>machine learning</category>
      <category>payments</category>
      <category>deployment</category>
    </item>
    <item>
      <title>The tenant came from a header: EF Core query filters and the value behind them</title>
      <link>https://blog.mohammadabukhadija.tech/tenant-from-a-header-ef-core-multi-tenancy/</link>
      <guid>https://blog.mohammadabukhadija.tech/tenant-from-a-header-ef-core-multi-tenancy/</guid>
      <description>EF Core global query filters made tenant isolation in my HR prototype look solved. The filters were fine. The value feeding them fell back to a request header and a hard-coded default. How I traced it, and how to fix it.</description>
      <pubDate>Thu, 05 Nov 2026 00:00:00 GMT</pubDate>
      <category>multi-tenancy</category>
      <category>security</category>
      <category>.NET</category>
      <category>EF Core</category>
      <category>ASP.NET Core</category>
    </item>
    <item>
      <title>Working with contractors without handing over the codebase</title>
      <link>https://blog.mohammadabukhadija.tech/working-with-contractors-without-handing-over-the-codebase/</link>
      <guid>https://blog.mohammadabukhadija.tech/working-with-contractors-without-handing-over-the-codebase/</guid>
      <description>How I designed a shared development server where developers get a full private copy of the code, run tests and open pull requests themselves, and still never reach production, take the source home, or touch real data.</description>
      <pubDate>Thu, 05 Nov 2026 00:00:00 GMT</pubDate>
      <category>security</category>
      <category>platform engineering</category>
      <category>devops</category>
      <category>Linux</category>
      <category>CI/CD</category>
    </item>
  </channel>
</rss>
