<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Nitin Kumar Singh</title><link>https://nitinksingh.com/</link><description>Recent content on Nitin Kumar Singh</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>© 2026 Nitin Kumar Singh. All rights reserved.</copyright><lastBuildDate>Wed, 19 Aug 2026 08:00:00 +0530</lastBuildDate><atom:link href="https://nitinksingh.com/index.xml" rel="self" type="application/rss+xml"/><item><title>The AI Gateway in Azure API Management: A Control Plane for Enterprise AI</title><link>https://nitinksingh.com/posts/apim-as-an-ai-gateway/</link><pubDate>Wed, 08 Jul 2026 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/apim-as-an-ai-gateway/</guid><description>One control plane for enterprise AI — how APIM&amp;rsquo;s AI gateway gives security, network, and infrastructure teams governance over models, MCP tools, and agents. The full v2 surface.</description></item><item><title>Zero-Secrets Architecture on Azure: Managed Identity for AI Agents</title><link>https://nitinksingh.com/posts/zero-secrets-azure-managed-identity/</link><pubDate>Thu, 09 Jul 2026 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/zero-secrets-azure-managed-identity/</guid><description>The governance case for keyless Azure: why shared keys are a liability, how managed identity plus RBAC fixes it, and how security, network, and platform teams enforce it.</description></item><item><title>The Auth Chapter Every MCP Tutorial Skips: Real SSO for Microsoft Graph</title><link>https://nitinksingh.com/posts/mcp-sso-microsoft-graph/</link><pubDate>Wed, 19 Aug 2026 08:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/mcp-sso-microsoft-graph/</guid><description>Production auth for an MCP server on Microsoft Graph: browser SSO with a public client and PKCE, delegated tokens, the On-Behalf-Of exchange, and the engineering that keeps an 85-tool surface safe.</description></item><item><title>Groundedness Detection vs Groundedness Evaluation: Two Azure Products, One Name</title><link>https://nitinksingh.com/posts/groundedness-detection-vs-evaluation/</link><pubDate>Thu, 06 Aug 2026 08:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/groundedness-detection-vs-evaluation/</guid><description>One name, two products, two lifecycle stages. Azure AI Content Safety&amp;rsquo;s Groundedness detection blocks and corrects ungrounded answers at runtime; the Evaluation SDK&amp;rsquo;s GroundednessEvaluator scores them offline in CI. Here&amp;rsquo;s the decision boundary for RAG, the without-Foundry path for each, the honest recall numbers, and the open-source substitutes.</description></item><item><title>The Production Guardrail Stack: Presidio + Azure Content Safety + NeMo Guardrails Around a MAF Agent</title><link>https://nitinksingh.com/posts/production-guardrail-stack-presidio-content-safety-nemo/</link><pubDate>Wed, 05 Aug 2026 08:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/production-guardrail-stack-presidio-content-safety-nemo/</guid><description>Microsoft ships real code for every guardrail layer, but no sample wires them together around one agent. Here&amp;rsquo;s the reference stack — Presidio for PII, Content Safety for harm categories, NeMo Guardrails for programmable rails, FIDES for deterministic flow control — where each fits in the MAF middleware pipeline, and the licenses.</description></item><item><title>Defense-in-Depth for AI Agents on Azure: Prompt Shields, Spotlighting, and the Coverage Gap</title><link>https://nitinksingh.com/posts/prompt-shields-spotlighting-defense-in-depth/</link><pubDate>Tue, 04 Aug 2026 08:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/prompt-shields-spotlighting-defense-in-depth/</guid><description>Prompt Shields is a real input classifier, but it&amp;rsquo;s probabilistic — and Spotlighting and Groundedness are model-only, so an agent&amp;rsquo;s tool calls can pass completely unscanned. Here&amp;rsquo;s what each defense blocks, where the agent coverage gap is, and how to layer probabilistic filters with deterministic controls.</description></item><item><title>Cost Control for LLM Apps: Caching, Batching, Model Tiers</title><link>https://nitinksingh.com/posts/cost-control-llm-apps/</link><pubDate>Mon, 03 Aug 2026 08:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/cost-control-llm-apps/</guid><description>The levers that actually move an Azure OpenAI bill — model tier, the four caches, output discipline, batching — in order of impact.</description></item><item><title>Observability for AI Agents on Azure: OpenTelemetry GenAI to the Agent Dashboard</title><link>https://nitinksingh.com/posts/agent-observability-azure-monitor/</link><pubDate>Mon, 20 Jul 2026 10:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/agent-observability-azure-monitor/</guid><description>How to see what an AI agent actually did: the OpenTelemetry GenAI span tree, wired into Azure Monitor, from the agent runtime through the APIM AI gateway and across the MCP boundary — with the copy-paste KQL and the gotchas that will cost you an afternoon.</description></item><item><title>The Agent Harness</title><link>https://nitinksingh.com/posts/agent-harness/</link><pubDate>Mon, 20 Jul 2026 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/agent-harness/</guid><description>A model can only generate text. The harness is the loop around it that calls tools, manages context, gates actions, and decides when to stop.</description></item><item><title>Every Evaluator in the Azure AI Evaluation SDK, and When to Use Each</title><link>https://nitinksingh.com/posts/azure-ai-evaluation-sdk-evaluators/</link><pubDate>Tue, 14 Jul 2026 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/azure-ai-evaluation-sdk-evaluators/</guid><description>A reference to all 39 evaluators in Azure&amp;rsquo;s AI Evaluation SDK — quality, RAG, agent, safety, and custom — organized by which ones you can actually import, and which only exist in the cloud catalog.</description></item><item><title>The OBO Chain Through MCP: Passing User Identity from an Agent to Microsoft Graph</title><link>https://nitinksingh.com/posts/obo-chain-through-mcp/</link><pubDate>Tue, 14 Jul 2026 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/obo-chain-through-mcp/</guid><description>How an AI agent reaches Microsoft Graph as the signed-in user through MCP — why token passthrough fails, and how on-behalf-of, Conditional Access, and RBAC secure the chain.</description></item><item><title>The Learning Loop Is the Moat: An Architect's Read on Nadella's Reverse Information Paradox</title><link>https://nitinksingh.com/updates/reverse-information-paradox-learning-loop/</link><pubDate>Mon, 13 Jul 2026 11:00:00 +0530</pubDate><guid>https://nitinksingh.com/updates/reverse-information-paradox-learning-loop/</guid><description>&lt;p&gt;Satya Nadella just &lt;a href="https://x.com/satyanadella/status/2076323181154230284" target="_blank" rel="noreferrer"&gt;named something&lt;/a&gt; every architect should pin to the wall. Kenneth Arrow&amp;rsquo;s old information paradox said a seller can&amp;rsquo;t prove information&amp;rsquo;s worth without revealing it: disclose, and you&amp;rsquo;ve given it away. AI inverts it: now the &lt;em&gt;buyer&lt;/em&gt; leaks. To get real value from a model you feed it your proprietary context, and the vendor learns more about you than you learn from it.&lt;/p&gt;</description></item><item><title>Choosing the Right Agent Identity: Managed Identity, Entra Agent ID, OBO, or Service Principal</title><link>https://nitinksingh.com/posts/choosing-the-right-agent-identity/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/choosing-the-right-agent-identity/</guid><description>The first design decision for any Azure AI agent is which identity it uses. A decision matrix across managed identity, Entra Agent ID, on-behalf-of, and service principals.</description></item><item><title>The Keyless Cookbook: Managed Identity for Every Azure Service Your Agent Touches</title><link>https://nitinksingh.com/posts/azure-keyless-managed-identity-cookbook/</link><pubDate>Thu, 09 Jul 2026 14:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/azure-keyless-managed-identity-cookbook/</guid><description>The exact RBAC role, disable-local-auth switch, and DefaultAzureCredential snippet for every Azure hop an agent uses — OpenAI, AI Search, Cosmos, SQL, Blob, Key Vault, and more.</description></item><item><title>Microsoft Foundry's Production-Agent Release: A Solution Architect's Read</title><link>https://nitinksingh.com/updates/microsoft-foundry-production-agents/</link><pubDate>Thu, 09 Jul 2026 10:00:00 +0530</pubDate><guid>https://nitinksingh.com/updates/microsoft-foundry-production-agents/</guid><description>&lt;p&gt;Microsoft&amp;rsquo;s Build 2026 announcement, &lt;a href="https://azure.microsoft.com/en-us/blog/frontier-models-and-production-agents-advancing-microsoft-foundry-for-the-agentic-era/" target="_blank" rel="noreferrer"&gt;&lt;em&gt;Frontier models and production agents advancing Microsoft Foundry for the agentic era&lt;/em&gt;&lt;/a&gt;, reframes Foundry from a model catalog into a place you run production agents. The headline that makes it real: hosted agents in Foundry Agent Service are &lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-june-2026/" target="_blank" rel="noreferrer"&gt;now generally available&lt;/a&gt;, and the catalog spans both OpenAI and Anthropic frontier models (&lt;a href="https://learn.microsoft.com/en-us/azure/foundry/what-is-foundry" target="_blank" rel="noreferrer"&gt;1,900+&lt;/a&gt; on Microsoft Learn, not the &amp;ldquo;11,000&amp;rdquo; some coverage repeats).&lt;/p&gt;</description></item><item><title>Zed and DeltaDB: Version Control Between Commits</title><link>https://nitinksingh.com/updates/zed-and-deltadb-version-control-between-commits/</link><pubDate>Wed, 08 Jul 2026 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/updates/zed-and-deltadb-version-control-between-commits/</guid><description>&lt;p&gt;I used to think the commit was the natural unit of software history. It is clean: a hash, a message, something CI can chew on and a reviewer can revert, cherry-pick, or blame. Then AI coding agents made the gap around the commit impossible to ignore.&lt;/p&gt;</description></item><item><title>Magentic-UI + Fara-7B: A Local-First Computer-Use Agent You Can Actually Run</title><link>https://nitinksingh.com/updates/magentic-ui-fara-local-first-agent/</link><pubDate>Thu, 02 Jul 2026 12:00:00 +0530</pubDate><guid>https://nitinksingh.com/updates/magentic-ui-fara-local-first-agent/</guid><description>&lt;p&gt;If you&amp;rsquo;ve been waiting for a computer-use agent you can run on your own machine (sandboxed, human-in-the-loop, open source), &lt;a href="https://github.com/microsoft/magentic-ui" target="_blank" rel="noreferrer"&gt;Microsoft&amp;rsquo;s Magentic-UI&lt;/a&gt; is the repo to clone this week. It now leads with &lt;strong&gt;MagenticLite&lt;/strong&gt; (&amp;ldquo;Big tasks. Small models.&amp;rdquo;), a redesign from Microsoft Research AI Frontiers that pairs a small-model orchestrator with a dedicated browser-use model and keeps you in control the whole way.&lt;/p&gt;</description></item><item><title>Microsoft Agent Framework Makes Tool and File Access Approval-by-Default</title><link>https://nitinksingh.com/updates/agent-framework-approval-by-default/</link><pubDate>Thu, 02 Jul 2026 10:00:00 +0530</pubDate><guid>https://nitinksingh.com/updates/agent-framework-approval-by-default/</guid><description>&lt;p&gt;Microsoft Agent Framework&amp;rsquo;s latest releases, &lt;a href="https://github.com/microsoft/agent-framework/releases" target="_blank" rel="noreferrer"&gt;Python 1.10.0&lt;/a&gt; (June 30) and .NET 1.12.0 (July 2), change a security default that&amp;rsquo;s easy to miss in the changelog: agent tools and file access now require approval unless you opt out. Both land as breaking changes.&lt;/p&gt;</description></item><item><title>AI Security: Prompt Injection, Jailbreaks, and Guardrails</title><link>https://nitinksingh.com/posts/ai-security-prompt-injection-jailbreaks-and-guardrails/</link><pubDate>Sun, 24 May 2026 10:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/ai-security-prompt-injection-jailbreaks-and-guardrails/</guid><description>&lt;p&gt;The OWASP LLM Top 10 exists because shipping an LLM to production without a security model is a new category of risk that the existing web application security playbook doesn&amp;rsquo;t fully cover. Prompt injection has held the #1 spot on that list since the first version was published, and it&amp;rsquo;s not there because researchers think it might be a problem someday. It&amp;rsquo;s been demonstrated against production systems at companies that knew what they were doing.&lt;/p&gt;</description></item><item><title>MAF v1 — Deployment with Docker and Compose</title><link>https://nitinksingh.com/posts/maf-v1-25-deployment/</link><pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-25-deployment/</guid><description>Package the agent stack with one multi-target Dockerfile, one Compose file, and a dev.sh script with health gates locally.</description></item><item><title>MAF v1 — Prompt engineering (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-24-prompt-engineering/</link><pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-24-prompt-engineering/</guid><description>Structure prompts around identity, grounding, task rules, role context, and YAML composition so agents stay consistent over time.</description></item><item><title>MAF v1 — E-commerce repo guided tour (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-21-putting-it-all-together/</link><pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-21-putting-it-all-together/</guid><description>Every MAF concept from the prior chapters, mapped to the exact file and line where it lives in the live e-commerce repo.</description></item><item><title>MAF v1 — Evaluation framework (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-23-evaluation-framework/</link><pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-23-evaluation-framework/</guid><description>Build an eval pipeline with golden datasets, scoring, smoke/full modes, and CI gates to catch prompt regressions before release.</description></item><item><title>MAF v1 — Python ↔ .NET asymmetries: a porting reference</title><link>https://nitinksingh.com/posts/maf-v1-22-python-dotnet-asymmetries/</link><pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-22-python-dotnet-asymmetries/</guid><description>Compare the six Python and .NET MAF API differences you will hit when porting samples, from constructors to workflow wiring.</description></item><item><title>MAF v1 — DevUI for agents and workflows (Python)</title><link>https://nitinksingh.com/posts/maf-v1-20b-devui/</link><pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-20b-devui/</guid><description>Run MAF DevUI locally to test prompts, inspect tool calls and OTel spans, and register agents by code or directory discovery.</description></item><item><title>MAF v1 — Production hardening (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-20c-production-hardening/</link><pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-20c-production-hardening/</guid><description>Add HTTP-layer production patterns for password reset, refresh-token rotation, reuse detection, and secret rotation in APIs.</description></item><item><title>MAF v1 — Workflow Visualization (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-20-visualization/</link><pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-20-visualization/</guid><description>Render any workflow as Mermaid (GitHub-friendly) or Graphviz DOT (production runbooks). One line each, deterministic output, dark-mode-safe palette.</description></item><item><title>MAF v1 — Declarative Workflows (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-19-declarative-workflows/</link><pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-19-declarative-workflows/</guid><description>Define a workflow in YAML, load it at runtime, and tweak orchestration without recompiling the Python or .NET app safely.</description></item><item><title>MAF v1 — Human-in-the-Loop (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-17-human-in-the-loop/</link><pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-17-human-in-the-loop/</guid><description>Pause a workflow for human input, resume it with the same request_id, and keep the caller-side contract simple across runs.</description></item><item><title>MAF v1 — State and Checkpoints (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-18-state-and-checkpoints/</link><pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-18-state-and-checkpoints/</guid><description>Persist workflow state at superstep boundaries, reload snapshots in a fresh process, and continue without losing progress.</description></item><item><title>MAF v1 — Group Chat Orchestration (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-15-group-chat-orchestration/</link><pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-15-group-chat-orchestration/</guid><description>Use a centralized manager to pick speakers each round, compare round-robin and agent-driven strategies, and cap runaway loops.</description></item><item><title>MAF v1 — Handoff Orchestration (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-14-handoff-orchestration/</link><pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-14-handoff-orchestration/</guid><description>Let a Triage agent route the conversation to Math or History specialists, handle handbacks, and guard against loops in production.</description></item><item><title>MAF v1 — Magentic Orchestration (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-16-magentic-orchestration/</link><pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-16-magentic-orchestration/</guid><description>Use Magentic orchestration for autonomous planning: a manager keeps facts, delegates to workers, reassesses, and replans when stuck.</description></item><item><title>MAF v1 — Agents in Workflows (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-11-agents-in-workflows/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-11-agents-in-workflows/</guid><description>Wrap a ChatClientAgent as a workflow executor, chain two translators, and hide adapter plumbing behind AgentWorkflowBuilder.</description></item><item><title>MAF v1 — Concurrent Orchestration (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-13-concurrent-orchestration/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-13-concurrent-orchestration/</guid><description>Fan one input out to an expert panel, aggregate the responses, and keep wall-clock time bounded by the slowest branch cleanly.</description></item><item><title>MAF v1 — Sequential Orchestration (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-12-sequential-orchestration/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-12-sequential-orchestration/</guid><description>Use SequentialBuilder or BuildSequential to pass one conversation through Writer, Reviewer, and Finalizer agents without hand-built adapters.</description></item><item><title>MCP: What It Is and Why It Changes How You Build AI Tools</title><link>https://nitinksingh.com/posts/mcp-what-it-is-and-why-it-changes-how-you-build-ai-tools/</link><pubDate>Tue, 21 Apr 2026 10:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/mcp-what-it-is-and-why-it-changes-how-you-build-ai-tools/</guid><description>&lt;p&gt;Before MCP existed, adding tools to an AI application meant writing the same glue code over and over. You had OpenAI&amp;rsquo;s function calling syntax. Anthropic had tool use with a slightly different schema. LangChain abstracted over both, but now you depended on LangChain&amp;rsquo;s versioning decisions. Every new model provider meant rewriting your tool definitions. Every new tool meant re-registering it across every AI integration you maintained.&lt;/p&gt;</description></item><item><title>MAF v1 — MCP Tools (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-08-mcp-tools/</link><pubDate>Sun, 19 Apr 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-08-mcp-tools/</guid><description>Stand up a Python MCP server and consume it from Python and .NET MAF agents, including discovery and AITool wiring from one server.</description></item><item><title>MAF v1 — Workflow Events and Builder (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-10-workflow-events-and-builder/</link><pubDate>Sun, 19 Apr 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-10-workflow-events-and-builder/</guid><description>Two kinds of workflow events — lifecycle and custom. Subscribe to the stream in Python and .NET, filter by type, and wire a live progress indicator.</description></item><item><title>MAF v1 — Workflow Executors and Edges (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-09-workflow-executors-and-edges/</link><pubDate>Sun, 19 Apr 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-09-workflow-executors-and-edges/</guid><description>Model deterministic workflows with executors as nodes, edges as routes, and a Pregel-style scheduler in Python and .NET.</description></item><item><title>MAF v1 — Context Providers (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-05-context-providers/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-05-context-providers/</guid><description>Add per-request context with focused providers, compose them before each LLM call, and plug in TextSearchProvider for simple RAG.</description></item><item><title>MAF v1 — Middleware and the Agent Pipeline (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-06-middleware/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-06-middleware/</guid><description>Use middleware to wrap agent runs, intercept tool calls, and redact PII before the LLM sees it in both Python and .NET safely.</description></item><item><title>MAF v1 — Observability with OpenTelemetry (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-07-observability-otel/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-07-observability-otel/</guid><description>Wire OpenTelemetry spans for agent runs with GenAI attributes, using console export for dev and OTLP for production tracing.</description></item><item><title>Building a Multi-Agent E-Commerce Platform: The Complete Guide</title><link>https://nitinksingh.com/posts/building-a-multi-agent-e-commerce-platform-the-complete-guide/</link><pubDate>Sun, 12 Apr 2026 12:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/building-a-multi-agent-e-commerce-platform-the-complete-guide/</guid><description>&lt;p&gt;Most AI agent tutorials end at &amp;ldquo;hello world.&amp;rdquo; You build a single agent with one or two tools, it answers a few questions, and that is it. The gap between that tutorial and a production system with multiple agents, authentication, observability, and a real frontend is enormous.&lt;/p&gt;</description></item><item><title>AI Agents: Concepts and Your First Implementation</title><link>https://nitinksingh.com/posts/ai-agents-concepts-and-your-first-implementation/</link><pubDate>Sun, 12 Apr 2026 11:55:00 +0530</pubDate><guid>https://nitinksingh.com/posts/ai-agents-concepts-and-your-first-implementation/</guid><description>&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Revised with .NET examples&lt;/strong&gt; — A newer version of this article, covering both Python and .NET, is available as part of the &lt;em&gt;MAF v1: Python and .NET&lt;/em&gt; series: &lt;a href="https://nitinksingh.com/posts/maf-v1-01-first-agent/" &gt;MAF v1 — 01-first-agent&lt;/a&gt;, &lt;a href="https://nitinksingh.com/posts/maf-v1-02-add-tools/" &gt;MAF v1 — 02-add-tools&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Prompt Engineering for AI Agents -- Grounding, Roles, and YAML Configuration</title><link>https://nitinksingh.com/posts/prompt-engineering-for-ai-agents--grounding-roles-and-yaml-configuration/</link><pubDate>Sun, 12 Apr 2026 11:50:00 +0530</pubDate><guid>https://nitinksingh.com/posts/prompt-engineering-for-ai-agents--grounding-roles-and-yaml-configuration/</guid><description>&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Revised with .NET examples&lt;/strong&gt; — A newer version of this article, covering both Python and .NET, is available as part of the &lt;em&gt;MAF v1: Python and .NET&lt;/em&gt; series: &lt;a href="https://nitinksingh.com/posts/maf-v1-24-prompt-engineering/" &gt;MAF v1 — 24-prompt-engineering&lt;/a&gt;. The newer version pulls role-specific behavior out of the system prompt and into a &lt;a href="https://nitinksingh.com/posts/maf-v1-05-context-providers/" &gt;context provider&lt;/a&gt;, so you don&amp;rsquo;t re-instantiate the agent per role. The five concerns and YAML composition below are still the canonical architecture; the new chapter shows the modernised wiring.&lt;/p&gt;</description></item><item><title>Building Domain-Specific Tools -- Giving Agents Real Capabilities</title><link>https://nitinksingh.com/posts/building-domain-specific-tools--giving-agents-real-capabilities/</link><pubDate>Sun, 12 Apr 2026 11:45:00 +0530</pubDate><guid>https://nitinksingh.com/posts/building-domain-specific-tools--giving-agents-real-capabilities/</guid><description>&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Revised with .NET examples&lt;/strong&gt; — A newer version of this article, covering both Python and .NET, is available as part of the &lt;em&gt;MAF v1: Python and .NET&lt;/em&gt; series: &lt;a href="https://nitinksingh.com/posts/maf-v1-02-add-tools/" &gt;MAF v1 — 02-add-tools&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Multi-Agent Architecture: Orchestration and the A2A Protocol</title><link>https://nitinksingh.com/posts/multi-agent-architecture-orchestration-and-the-a2a-protocol/</link><pubDate>Sun, 12 Apr 2026 11:40:00 +0530</pubDate><guid>https://nitinksingh.com/posts/multi-agent-architecture-orchestration-and-the-a2a-protocol/</guid><description>&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Revised with .NET examples&lt;/strong&gt; — A newer version of this article, covering both Python and .NET, is available as part of the &lt;em&gt;MAF v1: Python and .NET&lt;/em&gt; series: &lt;a href="https://nitinksingh.com/posts/maf-v1-14-handoff-orchestration/" &gt;MAF v1 — 14-handoff-orchestration&lt;/a&gt;, &lt;a href="https://nitinksingh.com/posts/maf-v1-21-putting-it-all-together/" &gt;MAF v1 — Putting it all together (Ch21)&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Observability -- Tracing Multi-Agent Workflows with OpenTelemetry</title><link>https://nitinksingh.com/posts/observability--tracing-multi-agent-workflows-with-opentelemetry/</link><pubDate>Sun, 12 Apr 2026 11:35:00 +0530</pubDate><guid>https://nitinksingh.com/posts/observability--tracing-multi-agent-workflows-with-opentelemetry/</guid><description>&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Revised with .NET examples&lt;/strong&gt; — A newer version of this article, covering both Python and .NET, is available as part of the &lt;em&gt;MAF v1: Python and .NET&lt;/em&gt; series: &lt;a href="https://nitinksingh.com/posts/maf-v1-07-observability-otel/" &gt;MAF v1 — 07-observability-otel&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Frontend: Rich Cards and Streaming Responses</title><link>https://nitinksingh.com/posts/frontend-rich-cards-and-streaming-responses/</link><pubDate>Sun, 12 Apr 2026 11:30:00 +0530</pubDate><guid>https://nitinksingh.com/posts/frontend-rich-cards-and-streaming-responses/</guid><description>&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Revised with .NET examples&lt;/strong&gt; — A newer version of this article, covering both Python and .NET, is available as part of the &lt;em&gt;MAF v1: Python and .NET&lt;/em&gt; series: &lt;a href="https://nitinksingh.com/posts/maf-v1-03-streaming-and-multiturn/" &gt;MAF v1 — 03-streaming-and-multiturn&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Production Readiness: Auth, RBAC, and Deployment</title><link>https://nitinksingh.com/posts/production-readiness-auth-rbac-and-deployment/</link><pubDate>Sun, 12 Apr 2026 11:25:00 +0530</pubDate><guid>https://nitinksingh.com/posts/production-readiness-auth-rbac-and-deployment/</guid><description>&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Revised, split, and expanded&lt;/strong&gt; — The two halves of this article are now separate chapters in the &lt;em&gt;MAF v1: Python and .NET&lt;/em&gt; series: the &lt;strong&gt;auth + hardening&lt;/strong&gt; half is covered by &lt;a href="https://nitinksingh.com/posts/maf-v1-20c-production-hardening/" &gt;MAF v1 — 20c production hardening&lt;/a&gt; (with the password reset, refresh-token rotation, and graceful secret rotation that the original missed), and the &lt;strong&gt;deployment&lt;/strong&gt; half is covered by &lt;a href="https://nitinksingh.com/posts/maf-v1-25-deployment/" &gt;MAF v1 — 25 deployment&lt;/a&gt; (with the .NET twin Dockerfile and a &lt;code&gt;dev.sh&lt;/code&gt; that polls instead of sleeping). The architecture below is still the canonical reference for the combined story.&lt;/p&gt;</description></item><item><title>Agent Memory -- Remembering Across Conversations</title><link>https://nitinksingh.com/posts/agent-memory--remembering-across-conversations/</link><pubDate>Sun, 12 Apr 2026 11:20:00 +0530</pubDate><guid>https://nitinksingh.com/posts/agent-memory--remembering-across-conversations/</guid><description>&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Revised with .NET examples&lt;/strong&gt; — A newer version of this article, covering both Python and .NET, is available as part of the &lt;em&gt;MAF v1: Python and .NET&lt;/em&gt; series: &lt;a href="https://nitinksingh.com/posts/maf-v1-04-sessions/" &gt;MAF v1 — 04-sessions&lt;/a&gt;, &lt;a href="https://nitinksingh.com/posts/maf-v1-05-context-providers/" &gt;MAF v1 — 05-context-providers&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Evaluating Agent Quality -- Testing What You Cannot Unit Test</title><link>https://nitinksingh.com/posts/evaluating-agent-quality--testing-what-you-cannot-unit-test/</link><pubDate>Sun, 12 Apr 2026 11:15:00 +0530</pubDate><guid>https://nitinksingh.com/posts/evaluating-agent-quality--testing-what-you-cannot-unit-test/</guid><description>&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Revised with .NET examples&lt;/strong&gt; — A newer version of this article, covering both Python and .NET, is available as part of the &lt;em&gt;MAF v1: Python and .NET&lt;/em&gt; series: &lt;a href="https://nitinksingh.com/posts/maf-v1-23-evaluation-framework/" &gt;MAF v1 — 23-evaluation-framework&lt;/a&gt;. The newer version applies three substantive fixes to the framework below — canonical &lt;code&gt;AgentRunResponse&lt;/code&gt; extraction (no more &lt;code&gt;hasattr&lt;/code&gt; chain), word-boundary alias matching (the original false-positives &lt;code&gt;&amp;quot;profit&amp;quot;&lt;/code&gt; against the &lt;code&gt;&amp;quot;price&amp;quot;&lt;/code&gt; alias), and a smoke / full tier split for CI vs nightly runs. Read this article for the conceptual ground; read the new one for the production-grade implementation.&lt;/p&gt;</description></item><item><title>MCP Integration -- Connecting AI Agents to the Tool Ecosystem</title><link>https://nitinksingh.com/posts/mcp-integration--connecting-ai-agents-to-the-tool-ecosystem/</link><pubDate>Sun, 12 Apr 2026 11:10:00 +0530</pubDate><guid>https://nitinksingh.com/posts/mcp-integration--connecting-ai-agents-to-the-tool-ecosystem/</guid><description>&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Revised with .NET examples&lt;/strong&gt; — A newer version of this article, covering both Python and .NET, is available as part of the &lt;em&gt;MAF v1: Python and .NET&lt;/em&gt; series: &lt;a href="https://nitinksingh.com/posts/maf-v1-08-mcp-tools/" &gt;MAF v1 — 08-mcp-tools&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Graph-Based Workflows -- Beyond Simple Orchestration</title><link>https://nitinksingh.com/posts/graph-based-workflows--beyond-simple-orchestration/</link><pubDate>Sun, 12 Apr 2026 11:05:00 +0530</pubDate><guid>https://nitinksingh.com/posts/graph-based-workflows--beyond-simple-orchestration/</guid><description>&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Revised with .NET examples&lt;/strong&gt; — A newer version of this article, covering both Python and .NET, is available as part of the &lt;em&gt;MAF v1: Python and .NET&lt;/em&gt; series: &lt;a href="https://nitinksingh.com/posts/maf-v1-09-workflow-executors-and-edges/" &gt;MAF v1 — 09-workflow-executors-and-edges&lt;/a&gt;, &lt;a href="https://nitinksingh.com/posts/maf-v1-10-workflow-events-and-builder/" &gt;MAF v1 — 10-workflow-events-and-builder&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>MAF v1 — Sessions (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-04-sessions/</link><pubDate>Sun, 12 Apr 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-04-sessions/</guid><description>Serialize an AgentSession to JSON, persist it, reload in a fresh process, and have the agent pick up exactly where it left off.</description></item><item><title>MAF v1 — Streaming and Multi-turn (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-03-streaming-and-multiturn/</link><pubDate>Sun, 12 Apr 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-03-streaming-and-multiturn/</guid><description>Stream tokens as they arrive and reuse a session across turns so the LLM sees the full conversation. ~60 lines of code per language.</description></item><item><title>MAF v1 — Adding Tools (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-02-add-tools/</link><pubDate>Sat, 11 Apr 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-02-add-tools/</guid><description>Give an agent a callable function, let the LLM decide when to use it, and compare Python and .NET tool loops side by side.</description></item><item><title>MAF v1 — Setup your dev environment (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-00-setup/</link><pubDate>Sat, 11 Apr 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-00-setup/</guid><description>Install uv, .NET 9, Docker, OpenAI keys, and a verify script so Chapter 1 starts with both Python and .NET environments ready.</description></item><item><title>MAF v1 — Your First Agent (Python + .NET)</title><link>https://nitinksingh.com/posts/maf-v1-01-first-agent/</link><pubDate>Sat, 11 Apr 2026 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/posts/maf-v1-01-first-agent/</guid><description>Build the smallest useful Microsoft Agent Framework program: one LLM call, one response, and the same shape in Python and .NET.</description></item><item><title>What Is an AI Agent? (And When Should You Build One)</title><link>https://nitinksingh.com/posts/what-is-an-ai-agent-and-when-should-you-build-one/</link><pubDate>Tue, 07 Apr 2026 10:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/what-is-an-ai-agent-and-when-should-you-build-one/</guid><description>&lt;p&gt;Every vendor selling software right now claims their product is &amp;ldquo;agentic.&amp;rdquo; I&amp;rsquo;ve seen chatbots with a system prompt called an agent. I&amp;rsquo;ve seen a scheduled Python script described as autonomous AI. I&amp;rsquo;ve also shipped actual agents to production, at an insurance company, handling FNOL triage, policy lookup, and claims routing. The gap between what gets marketed as an agent and what you&amp;rsquo;d actually build in production is wide, and it&amp;rsquo;s expensive to get wrong.&lt;/p&gt;</description></item><item><title>Dev Tunnels: Test Webhooks and Share Local Apps Without a Deploy</title><link>https://nitinksingh.com/updates/dev-tunnels-test-webhooks-and-share-local-apps-without-a-deploy/</link><pubDate>Sat, 04 Apr 2026 10:00:00 +0530</pubDate><guid>https://nitinksingh.com/updates/dev-tunnels-test-webhooks-and-share-local-apps-without-a-deploy/</guid><description>&lt;p&gt;If you read the &lt;a href="https://nitinksingh.com/posts/cloudflare-tunnel-expose-localhost-for-webhooks-and-oauth/" &gt;Cloudflare Tunnel post&lt;/a&gt;, you know the problem: localhost does not accept webhooks, OAuth providers reject &lt;code&gt;http://localhost&lt;/code&gt; as a redirect URI, and showing a client a work-in-progress means a deploy. Cloudflare Tunnel solves it, but it wants a Cloudflare account and domain setup.&lt;/p&gt;</description></item><item><title>Why I Switched from npm to pnpm (And Why You Should Too)</title><link>https://nitinksingh.com/posts/why-i-switched-from-npm-to-pnpm-and-why-you-should-too/</link><pubDate>Fri, 03 Apr 2026 10:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/why-i-switched-from-npm-to-pnpm-and-why-you-should-too/</guid><description>&lt;p&gt;If you write JavaScript or TypeScript professionally, you&amp;rsquo;ve used npm. It ships with Node.js, it&amp;rsquo;s everywhere, and for years it was the only game in town. But after running npm on real-world projects (enterprise monorepos, Next.js apps, Angular dashboards, CI pipelines that bill by the minute), I can tell you: &lt;strong&gt;npm is holding you back&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Building Dictum — a macOS Dictation App with Tauri 2 (Rust + React) &amp; Azure OpenAI</title><link>https://nitinksingh.com/posts/building-dictum-a-macos-dictation-app-with-tauri-2-rust--react-azure-openai/</link><pubDate>Sat, 21 Mar 2026 10:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/building-dictum-a-macos-dictation-app-with-tauri-2-rust--react-azure-openai/</guid><description>&lt;p&gt;macOS has had built-in dictation since Monterey. It is fine: press and hold a key, speak, done. But it requires Apple&amp;rsquo;s servers (unless you download the enhanced on-device model), only works in some apps, and you have zero control over punctuation, formatting, or hotkeys.&lt;/p&gt;</description></item><item><title>Azure App Registration: A Complete Guide from Zero to Working App</title><link>https://nitinksingh.com/posts/azure-app-registration-a-complete-guide-from-zero-to-working-app/</link><pubDate>Sat, 10 Jan 2026 10:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/azure-app-registration-a-complete-guide-from-zero-to-working-app/</guid><description>&lt;p&gt;Every Microsoft integration I have shipped starts at the same gate. Call the Graph API, wire up SharePoint, add &amp;ldquo;Sign in with Microsoft&amp;rdquo; to an app, and none of it works until you have an App Registration. Get it wrong and nothing downstream authenticates, which is why this is the one setup step I slow down for instead of clicking through.&lt;/p&gt;</description></item><item><title>Cloudflare Tunnel: Expose localhost for Webhooks and OAuth</title><link>https://nitinksingh.com/posts/cloudflare-tunnel-expose-localhost-for-webhooks-and-oauth/</link><pubDate>Sat, 03 Jan 2026 10:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/cloudflare-tunnel-expose-localhost-for-webhooks-and-oauth/</guid><description>Expose localhost with a stable custom subdomain using Cloudflare Tunnel — a free ngrok alternative that works behind NAT and corporate firewalls, with no session limits.</description></item><item><title>Adding .NET Aspire to an Existing Clean Architecture Project</title><link>https://nitinksingh.com/posts/adding-.net-aspire-to-an-existing-clean-architecture-project/</link><pubDate>Sat, 20 Dec 2025 10:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/adding-.net-aspire-to-an-existing-clean-architecture-project/</guid><description>The exact steps to add Aspire to a running .NET + Angular + PostgreSQL app: two projects, one line in Program.cs, and a project reference.</description></item><item><title>Building Production-Ready Microservices with .NET Aspire: A Complete E-Commerce Demo</title><link>https://nitinksingh.com/posts/building-production-ready-microservices-with-.net-aspire-a-complete-e-commerce-demo/</link><pubDate>Sat, 06 Dec 2025 10:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/building-production-ready-microservices-with-.net-aspire-a-complete-e-commerce-demo/</guid><description>A production-quality .NET Aspire demo — five microservices, PostgreSQL, Redis, and RabbitMQ, all orchestrated from a single C# AppHost file.</description></item><item><title>Microsoft Ignite 2025: Microsoft Foundry - The Unified Enterprise AI Platform</title><link>https://nitinksingh.com/updates/microsoft-ignite-2025-microsoft-foundry-the-unified-enterprise-ai-platform/</link><pubDate>Sat, 22 Nov 2025 12:00:00 +0530</pubDate><guid>https://nitinksingh.com/updates/microsoft-ignite-2025-microsoft-foundry-the-unified-enterprise-ai-platform/</guid><description>&lt;p&gt;I was at Microsoft Ignite for the Foundry announcements, and the framing runs ahead of the substance. Microsoft rebranded most of its Azure AI stack as &lt;strong&gt;Microsoft Foundry&lt;/strong&gt;: one PaaS spanning models, agents, tools, knowledge, and governance. Underneath the launch-day gloss, three things actually matter to anyone shipping enterprise agents.&lt;/p&gt;</description></item><item><title>Build Custom MCP Catalogs with Docker: Enterprise Control for AI Tooling</title><link>https://nitinksingh.com/updates/build-custom-mcp-catalogs-with-docker-enterprise-control-for-ai-tooling/</link><pubDate>Fri, 24 Oct 2025 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/updates/build-custom-mcp-catalogs-with-docker-enterprise-control-for-ai-tooling/</guid><description>&lt;p&gt;Docker shipped a set of tools that let a platform team decide exactly which Model Context Protocol servers developers can run: a catalog format, an open-source Gateway, and a Toolkit built into Docker Desktop. The &lt;a href="https://hub.docker.com/mcp" target="_blank" rel="noreferrer"&gt;official catalog&lt;/a&gt; carries 220+ containerized MCP servers, and you can fork it, trim it, or build a private catalog that points at images in your own registry.&lt;/p&gt;</description></item><item><title>.NET Architecture at Scale: Visual Guide to Modern Design Patterns</title><link>https://nitinksingh.com/posts/.net-architecture-at-scale-visual-guide-to-modern-design-patterns/</link><pubDate>Sat, 05 Jul 2025 12:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/.net-architecture-at-scale-visual-guide-to-modern-design-patterns/</guid><description>&lt;h1 class="relative group"&gt;.NET Architecture at Scale: Visual Guide to Modern Design Patterns&#10; &lt;div id="net-architecture-at-scale-visual-guide-to-modern-design-patterns" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#net-architecture-at-scale-visual-guide-to-modern-design-patterns" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h1&gt;&#10;&lt;p&gt;I keep a page like this open in a browser tab. When a team asks which pattern fits a new service, I would rather point at a decision tree and a comparison table than argue it from memory for the third time that month. So I wrote the reference I wanted: the 16 patterns I actually reach for in .NET systems, each with its diagram, a code sketch, and the trade-off it forces on you.&lt;/p&gt;</description></item><item><title>Streamlining AI Development with LiteLLM Proxy: A Comprehensive Guide</title><link>https://nitinksingh.com/posts/streamlining-ai-development-with-litellm-proxy-a-comprehensive-guide/</link><pubDate>Sun, 25 May 2025 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/streamlining-ai-development-with-litellm-proxy-a-comprehensive-guide/</guid><description>&lt;p&gt;At some point I had three side projects each talking to a different LLM provider, with API keys pasted into three &lt;code&gt;.env&lt;/code&gt; files and three slightly different client wrappers. Swapping GPT-4o for Claude in any of them meant editing code. That is a silly amount of friction for what is, underneath, the same chat-completion call, so I put a LiteLLM proxy in front of everything and never went back.&lt;/p&gt;</description></item><item><title>Elevating Code Quality with Custom GitHub Copilot Instructions</title><link>https://nitinksingh.com/posts/elevating-code-quality-with-custom-github-copilot-instructions/</link><pubDate>Sat, 24 May 2025 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/elevating-code-quality-with-custom-github-copilot-instructions/</guid><description>&lt;p&gt;The first time I let Copilot loose on one of my Angular repos, it wrote a perfectly reasonable component for 2021: constructor injection, class properties for state, NgModule imports. We were on Angular 19 with signals and standalone components.&lt;/p&gt;</description></item><item><title>Building a Comprehensive RAG System: A Deep Dive Into Knowledge Architecture</title><link>https://nitinksingh.com/posts/building-a-comprehensive-rag-system-a-deep-dive-into-knowledge-architecture/</link><pubDate>Thu, 24 Apr 2025 10:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/building-a-comprehensive-rag-system-a-deep-dive-into-knowledge-architecture/</guid><description>&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; This guide walks you through building a production-ready RAG system using FastAPI, ChromaDB, MinIO, and OpenAI. Learn document chunking, vector embeddings, hybrid search, and real-world deployment strategies.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 class="relative group"&gt;Introduction&#10; &lt;div id="introduction" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#introduction" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;As a .NET developer watching the AI space move fast, I found myself both excited and skeptical. When tools like Claude.ai and ChatGPT started offering out-of-the-box RAG solutions, I wanted to build my own system with full control over the implementation.&lt;/p&gt;</description></item><item><title>Stretch Tracker: Advanced Technical Architecture and Implementation</title><link>https://nitinksingh.com/posts/stretch-tracker-advanced-technical-architecture-and-implementation/</link><pubDate>Sun, 20 Apr 2025 08:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/stretch-tracker-advanced-technical-architecture-and-implementation/</guid><description>&lt;h2 class="relative group"&gt;The Birth of the Stretch Tracker: A Developer&amp;rsquo;s Story&#10; &lt;div id="the-birth-of-the-stretch-tracker-a-developers-story" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-birth-of-the-stretch-tracker-a-developers-story" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;As developers, we often find ourselves deeply immersed in our work, sitting for hours on end in front of our screens without even realizing how much time has passed. I was no different. During a particularly intensive project, I noticed the toll these long coding sessions were taking on my physical health - back pain, stiff neck, and decreased productivity became unwelcome companions in my daily routine.&lt;/p&gt;</description></item><item><title>Simplify Your Workflow: How to Build Custom Commands with the .NET CLI</title><link>https://nitinksingh.com/posts/simplify-your-workflow-how-to-build-custom-commands-with-the-.net-cli/</link><pubDate>Tue, 14 Jan 2025 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/simplify-your-workflow-how-to-build-custom-commands-with-the-.net-cli/</guid><description>&lt;p&gt;Our support team used to open the Azure portal every time someone needed a user&amp;rsquo;s group memberships. Click through Azure AD, find the user, expand groups, copy the list, paste it into a ticket. A dozen times a day. It was slow, and it needed portal access we would rather not hand out widely.&lt;/p&gt;</description></item><item><title>Deploying Ollama with Open WebUI Locally: A Step-by-Step Guide</title><link>https://nitinksingh.com/posts/deploying-ollama-with-open-webui-locally-a-step-by-step-guide/</link><pubDate>Sat, 11 Jan 2025 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/deploying-ollama-with-open-webui-locally-a-step-by-step-guide/</guid><description>&lt;p&gt;I run LLMs on my own machine for two reasons: my prompts never leave my hardware, and I can experiment all day without watching an API meter. The setup used to be the hard part. Wrangling Python environments, CUDA drivers, and model weights by hand was enough friction that most people quit before the first token.&lt;/p&gt;</description></item><item><title>Simplify Git Workflows Across Multiple Repositories with Git Submodules and Meta-Repositories</title><link>https://nitinksingh.com/posts/simplify-git-workflows-across-multiple-repositories-with-git-submodules-and-meta-repositories/</link><pubDate>Fri, 10 Jan 2025 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/simplify-git-workflows-across-multiple-repositories-with-git-submodules-and-meta-repositories/</guid><description>&lt;h2 class="relative group"&gt;Six repositories, one system, too many clone commands&#10; &lt;div id="six-repositories-one-system-too-many-clone-commands" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#six-repositories-one-system-too-many-clone-commands" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;On a typical microservices project I have five or six repositories open at once: a couple of APIs, a frontend, shared infrastructure scripts, sometimes a docs repo. Onboarding a new developer meant a wiki page full of clone commands, and &amp;ldquo;which commit of the API works with this frontend?&amp;rdquo; was answered by asking whoever was online.&lt;/p&gt;</description></item><item><title>Simplifying Database Queries with AI &amp; SQL Automation</title><link>https://nitinksingh.com/posts/simplifying-database-queries-with-ai-sql-automation/</link><pubDate>Mon, 06 Jan 2025 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/simplifying-database-queries-with-ai-sql-automation/</guid><description>&lt;p&gt;Business users kept asking my team for one-off data pulls: how many orders above $150 in December, which products are low on stock, that sort of thing. Every request meant a developer dropping their work to write a throwaway SQL query. So I built a REST API that does the translation instead. It feeds the database schema to an LLM, gets back a SQL query, runs it, and returns JSON. One codebase, four interchangeable providers (OpenAI, Azure OpenAI, Claude, and Gemini), switched by a single environment variable.&lt;/p&gt;</description></item><item><title>Efficient File Management on Azure Blob Storage: CRUD Operations and Upload Strategies</title><link>https://nitinksingh.com/posts/efficient-file-management-on-azure-blob-storage-crud-operations-and-upload-strategies/</link><pubDate>Sun, 29 Dec 2024 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/efficient-file-management-on-azure-blob-storage-crud-operations-and-upload-strategies/</guid><description>&lt;h2 class="relative group"&gt;The short version&#10; &lt;div id="the-short-version" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-short-version" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Four ways to get a file into Azure Blob Storage from a .NET and Angular app, and when each one earns its keep:&lt;/p&gt;</description></item><item><title>Implementing SharePoint File CRUD Operations using Microsoft Graph API</title><link>https://nitinksingh.com/posts/implementing-sharepoint-file-crud-operations-using-microsoft-graph-api/</link><pubDate>Tue, 24 Dec 2024 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/implementing-sharepoint-file-crud-operations-using-microsoft-graph-api/</guid><description>&lt;h2 class="relative group"&gt;Introduction&#10; &lt;div id="introduction" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#introduction" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Storing files in SharePoint from a .NET service sounds like it should be a solved problem, and it is, as long as you make one decision early: delegated or application permissions. That single choice changes who shows up as &amp;ldquo;Created by&amp;rdquo; on every file and whether your service needs a signed-in user at all. Get it wrong and you rebuild the auth layer later.&lt;/p&gt;</description></item><item><title>Building an AI-Driven Chat Application with .NET, Azure OpenAI, and Angular</title><link>https://nitinksingh.com/posts/building-an-ai-driven-chat-application-with-.net-azure-openai-and-angular/</link><pubDate>Sat, 07 Dec 2024 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/building-an-ai-driven-chat-application-with-.net-azure-openai-and-angular/</guid><description>&lt;h3 class="relative group"&gt;Introduction&#10; &lt;div id="introduction" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#introduction" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h3&gt;&#10;&lt;p&gt;I built this chat app to answer a narrow question: how little infrastructure do you actually need to stream tokens from Azure OpenAI into a browser? Less than most tutorials assume. There is no SignalR here and no WebSocket hub.&lt;/p&gt;</description></item><item><title>Best Practices for Creating and Using DTOs in the API</title><link>https://nitinksingh.com/posts/best-practices-for-creating-and-using-dtos-in-the-api/</link><pubDate>Sun, 01 Dec 2024 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/best-practices-for-creating-and-using-dtos-in-the-api/</guid><description>&lt;p&gt;Serializing domain entities straight to the client looks like a shortcut until the first schema change. Rename one property on the entity and every consumer of the API breaks with it, and you find out from their bug reports. DTOs are the cheap insurance against that: the entity can change shape freely because the contract the client sees is a separate class you control. This post covers the DTO conventions I use in the Contact Management Application and why each one exists.&lt;/p&gt;</description></item><item><title>Clean Architecture: Introduction to the Project Structure</title><link>https://nitinksingh.com/posts/clean-architecture-introduction-to-the-project-structure/</link><pubDate>Sun, 01 Dec 2024 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/clean-architecture-introduction-to-the-project-structure/</guid><description>&lt;p&gt;Most Clean Architecture articles stop at the circle diagram. The part that actually decides whether a team can live with the pattern is more mundane: which project does this class go in, which direction do the references point, and where do the interfaces live. I built the &lt;a href="https://github.com/nitin27may/clean-architecture-docker-dotnet-angular" target="_blank" rel="noreferrer"&gt;Contact Management Application&lt;/a&gt; as a .NET Core Web API to answer exactly those questions with running code, and this series walks through it layer by layer.&lt;/p&gt;</description></item><item><title>Dependency Injection Setup Across Layers</title><link>https://nitinksingh.com/posts/dependency-injection-setup-across-layers/</link><pubDate>Sun, 01 Dec 2024 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/dependency-injection-setup-across-layers/</guid><description>&lt;p&gt;Program.cs is where service registration goes to rot. It starts at five lines, then every feature adds its repositories, validators, and settings bindings until nobody can tell which layer owns what. The Contact Management Application avoids that with one rule: each layer registers its own services through an extension method, and Program.cs only calls those methods. This post walks through that setup layer by layer, using the real code, including two spots where the real code deserves a warning label.&lt;/p&gt;</description></item><item><title>Dockerizing the .NET Core API, Angular and MS SQL Server</title><link>https://nitinksingh.com/posts/dockerizing-the-.net-core-api-angular-and-ms-sql-server/</link><pubDate>Sun, 01 Dec 2024 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/dockerizing-the-.net-core-api-angular-and-ms-sql-server/</guid><description>&lt;p&gt;Getting the Contact Management Application running used to mean installing the .NET SDK, Node, and a local SQL Server, then hoping the versions matched mine. That is three toolchains of setup before anyone sees a login page. Containerizing the stack collapses all of it into &lt;code&gt;docker-compose up --build&lt;/code&gt;: the API, the Angular frontend, SQL Server, and an nginx load balancer come up together, wired the same way on every machine. This post walks through the Dockerfiles and compose files that make that work, including the parts I would do differently today.&lt;/p&gt;</description></item><item><title>Error Handling and Exception Management in the API</title><link>https://nitinksingh.com/posts/error-handling-and-exception-management-in-the-api/</link><pubDate>Sun, 01 Dec 2024 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/error-handling-and-exception-management-in-the-api/</guid><description>&lt;p&gt;An unhandled exception in a default ASP.NET Core API gives the client an empty 500 and gives you a stack trace in a log nobody is watching. The only thing worse is the API that returns the stack trace to the caller. The Contact Management Application takes the middle path: one middleware catches everything, maps known exception types to sensible status codes, returns a predictable JSON shape, and logs the details server-side. This post walks through that implementation and where I would lean on the newer built-in alternatives instead.&lt;/p&gt;</description></item><item><title>Handling Authorization and Role-Based Access Control (RBAC)</title><link>https://nitinksingh.com/posts/handling-authorization-and-role-based-access-control-rbac/</link><pubDate>Sun, 01 Dec 2024 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/handling-authorization-and-role-based-access-control-rbac/</guid><description>&lt;h2 class="relative group"&gt;Introduction&#10; &lt;div id="introduction" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#introduction" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Static role checks (&lt;code&gt;[Authorize(Roles = &amp;quot;Admin&amp;quot;)]&lt;/code&gt;) fall apart the first time someone asks you to add a permission without a redeploy. Once roles and permissions have to change at runtime, hard-coded role attributes become a liability. The Contact Management Application takes a different route: a dynamic policy provider that builds authorization policies from the database at request time, covering both the backend API and the Angular frontend, wired into JWT authentication without breaking the separation of concerns Clean Architecture expects.&lt;/p&gt;</description></item><item><title>Implementing Activity Logging with Custom Attributes</title><link>https://nitinksingh.com/posts/implementing-activity-logging-with-custom-attributes/</link><pubDate>Sun, 01 Dec 2024 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/implementing-activity-logging-with-custom-attributes/</guid><description>&lt;p&gt;The first version of audit logging in the Contact Management Application was what most codebases end up with: &lt;code&gt;_logger.LogInformation(&amp;quot;Creating contact...&amp;quot;)&lt;/code&gt; copy-pasted into every controller action. It worked, until someone forgot one, and the one they forgot was of course the action the auditors asked about. Logging that depends on developer discipline isn&amp;rsquo;t an audit trail; it&amp;rsquo;s a suggestion.&lt;/p&gt;</description></item><item><title>Implementing AutoMapper for DTO Mapping with Audit Details</title><link>https://nitinksingh.com/posts/implementing-automapper-for-dto-mapping-with-audit-details/</link><pubDate>Sun, 01 Dec 2024 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/implementing-automapper-for-dto-mapping-with-audit-details/</guid><description>&lt;p&gt;Early versions of the Contact Management Application had the same four lines at the end of every create and update method: set &lt;code&gt;CreatedBy&lt;/code&gt;, set &lt;code&gt;CreatedOn&lt;/code&gt; (or their &lt;code&gt;Updated*&lt;/code&gt; twins), then save. Copy-pasted audit code gets forgotten just often enough to make the audit columns untrustworthy, and an audit column you can&amp;rsquo;t trust is worse than none. Moving that logic into AutoMapper profiles fixed it in one place.&lt;/p&gt;</description></item><item><title>Seeding Initial Data Using Docker Compose and SQL Scripts</title><link>https://nitinksingh.com/posts/seeding-initial-data-using-docker-compose-and-sql-scripts/</link><pubDate>Sun, 01 Dec 2024 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/seeding-initial-data-using-docker-compose-and-sql-scripts/</guid><description>&lt;h2 class="relative group"&gt;Introduction&#10; &lt;div id="introduction" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#introduction" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Nothing kills momentum on a new project like cloning the repo, running &lt;code&gt;docker compose up&lt;/code&gt;, and landing on an empty database. No roles, no permissions, no login, so nothing works until someone reads the wiki and hand-runs a SQL script. On the Contact Management Application I wanted &lt;code&gt;docker compose up&lt;/code&gt; to be the whole setup: containers come up, the schema seeds itself, and you can log in.&lt;/p&gt;</description></item><item><title>Unit of Work Pattern and Its Role in Managing Transactions</title><link>https://nitinksingh.com/posts/unit-of-work-pattern-and-its-role-in-managing-transactions/</link><pubDate>Sun, 01 Dec 2024 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/unit-of-work-pattern-and-its-role-in-managing-transactions/</guid><description>&lt;p&gt;The bug that makes people care about the Unit of Work pattern is the partial write. An operation inserts a row in one table, fails on the second, and the database lands in a state nobody designed for. I&amp;rsquo;ve spent enough late evenings reconstructing &amp;ldquo;how did this record end up half-created&amp;rdquo; timelines to want transaction boundaries stated explicitly in code, not implied by hope.&lt;/p&gt;</description></item><item><title>Using Dapper for Data Access and Repository Pattern</title><link>https://nitinksingh.com/posts/using-dapper-for-data-access-and-repository-pattern/</link><pubDate>Sun, 01 Dec 2024 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/using-dapper-for-data-access-and-repository-pattern/</guid><description>&lt;h2 class="relative group"&gt;Introduction&#10; &lt;div id="introduction" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#introduction" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;On the Contact Management Application I reached for Dapper instead of Entity Framework Core, and the reason was boring: I wanted to see the SQL. EF Core is fine until a generated query does something surprising under load, and then you are reverse-engineering LINQ translations at 2 a.m.&lt;/p&gt;</description></item><item><title>Validating Inputs with FluentValidation</title><link>https://nitinksingh.com/posts/validating-inputs-with-fluentvalidation/</link><pubDate>Sun, 01 Dec 2024 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/validating-inputs-with-fluentvalidation/</guid><description>&lt;h2 class="relative group"&gt;Introduction&#10; &lt;div id="introduction" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#introduction" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Validation is the one part of a request I refuse to trust anywhere but the edge. Domain objects assume they are already valid; rejecting a malformed email or a missing name belongs at the API boundary, before that data reaches a service or a repository.&lt;/p&gt;</description></item><item><title>GitHub Codespaces: Streamlining Cloud-Based Development</title><link>https://nitinksingh.com/posts/github-codespaces-streamlining-cloud-based-development/</link><pubDate>Tue, 22 Oct 2024 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/github-codespaces-streamlining-cloud-based-development/</guid><description>&lt;p&gt;My first serious Codespaces session was a demo I nearly cancelled. I wanted to show my &lt;a href="https://github.com/nitin27may/mean-docker" target="_blank" rel="noreferrer"&gt;mean-docker&lt;/a&gt; starter (Angular, Express, MongoDB, everything in Docker Compose) to someone whose laptop had none of that installed. No Node, no Docker Desktop, no MongoDB. Instead of walking them through an afternoon of setup, I clicked &amp;ldquo;Create codespace&amp;rdquo; on the repo and had the full stack running in a browser tab a few minutes later.&lt;/p&gt;</description></item><item><title>Pushing Custom Images to Docker Hub Using GitHub Actions</title><link>https://nitinksingh.com/posts/pushing-custom-images-to-docker-hub-using-github-actions/</link><pubDate>Sat, 22 Jul 2023 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/pushing-custom-images-to-docker-hub-using-github-actions/</guid><description>&lt;p&gt;In the &lt;a href="https://nitinksingh.com/posts/pushing-docker-image-to-docker-hub/" &gt;previous article&lt;/a&gt; I built a custom nginx image and pushed it to Docker Hub by hand: build, tag, login, push. That works exactly once. The second time you forget the tag, the third time a teammate pushes from a laptop with a stale base image, and soon nobody can say which commit produced the image running in production. The fix is boring and reliable: let GitHub Actions do the build and push on every commit to master.&lt;/p&gt;</description></item><item><title>Pushing Docker Image to Docker Hub</title><link>https://nitinksingh.com/posts/pushing-docker-image-to-docker-hub/</link><pubDate>Sat, 22 Jul 2023 09:00:00 +0530</pubDate><guid>https://nitinksingh.com/posts/pushing-docker-image-to-docker-hub/</guid><description>&lt;p&gt;A custom image that only exists on your laptop is not shipped; it is a local experiment. The moment a teammate or a server needs to run it, the image has to live in a registry. Docker Hub is the one most people start with, and the push workflow is the same shape you will later use against Azure Container Registry or Amazon ECR, so it is worth doing once by hand before automating it. This post walks through that manual path with a small nginx-based image.&lt;/p&gt;</description></item><item><title>About</title><link>https://nitinksingh.com/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/about/</guid><description>&lt;h2 class="relative group"&gt;Hi, I&amp;rsquo;m Nitin&#10; &lt;div id="hi-im-nitin" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#hi-im-nitin" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Lead Solutions Architect based in the Greater Toronto Area, Canada. 15+ years building enterprise software across insurance, fintech, and SaaS platforms. I design the architecture and write the code — from system design and API contracts through to deployment on AKS.&lt;/p&gt;</description></item><item><title>Archives</title><link>https://nitinksingh.com/archives/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/archives/</guid><description/></item><item><title>Projects</title><link>https://nitinksingh.com/projects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://nitinksingh.com/projects/</guid><description/></item></channel></rss>