<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>imranemon.tech</title><description>Posts on .NET, EF Core, DevOps, Kubernetes, and cloud infrastructure — drawn from real production work.</description><link>https://imranemon.tech/</link><item><title>When OAuth Login 500s in Prod but Not Locally: The Migration That Never Ran</title><link>https://imranemon.tech/blog/oauth-500-prod-migrations-never-ran/</link><guid isPermaLink="true">https://imranemon.tech/blog/oauth-500-prod-migrations-never-ran/</guid><description>A production 500 on every Google/Facebook social login, with a 42P01 &apos;relation does not exist&apos; error buried under classified rejection logs. Root cause: EF Core migrations were gated behind IsDevelopment() and never ran in production.</description><pubDate>Thu, 10 Sep 2026 00:00:00 GMT</pubDate><category>dotnet</category><category>ef-core</category><category>postgresql</category><category>oauth</category></item><item><title>The Caddyfile That Committed Broken: File-Global Matchers Get Rejected</title><link>https://imranemon.tech/blog/caddy-global-matcher-rejected/</link><guid isPermaLink="true">https://imranemon.tech/blog/caddy-global-matcher-rejected/</guid><description>A security fix that never actually deployed: a Caddy request matcher defined at file-global scope is invalid Caddyfile syntax, Caddy rejects the whole config, and the bootstrap silently skipped it. Here&apos;s the snippet pattern that fixes it.</description><pubDate>Wed, 09 Sep 2026 00:00:00 GMT</pubDate><category>caddy</category><category>devops</category><category>security</category></item><item><title>Virus Scanning a 2-vCPU VPS: Why ClamAV Became a Docker Sidecar</title><link>https://imranemon.tech/blog/clamav-sidecar-architecture/</link><guid isPermaLink="true">https://imranemon.tech/blog/clamav-sidecar-architecture/</guid><description>Running ClamAV for user-uploaded document scanning on a tiny VPS seemed impossible — 1GB RAM for the daemon, plus cold-start signature loads. The architecture that made it work: a ClamAV sidecar container speaking the clamd INSTREAM protocol.</description><pubDate>Tue, 08 Sep 2026 00:00:00 GMT</pubDate><category>dotnet</category><category>docker</category><category>security</category><category>architecture</category></item><item><title>EF Core NoTracking Broke 50 Repository Methods, and I Reverted It</title><link>https://imranemon.tech/blog/ef-core-global-notracking-revert/</link><guid isPermaLink="true">https://imranemon.tech/blog/ef-core-global-notracking-revert/</guid><description>A one-line &apos;performance optimization&apos; — global AsNoTracking in EF Core — silently broke every fetch-then-mutate pattern in a 50-method repository layer. Here&apos;s the failure mode and why I rolled it back.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><category>dotnet</category><category>ef-core</category><category>postgresql</category></item><item><title>The Two-Second Crash: Debugging Hangfire.PostgreSql on a Fresh VPS</title><link>https://imranemon.tech/blog/hangfire-postgres-enlistment-crash/</link><guid isPermaLink="true">https://imranemon.tech/blog/hangfire-postgres-enlistment-crash/</guid><description>Our API container kept dying ~2 seconds after boot on a freshly rebuilt VPS. Caddy 502s everywhere. The culprit was a transaction-enlistment mismatch between Hangfire.PostgreSql and Npgsql.</description><pubDate>Sun, 06 Sep 2026 00:00:00 GMT</pubDate><category>dotnet</category><category>hangfire</category><category>postgresql</category><category>docker</category></item></channel></rss>