ADR-001accepted
Azure App Service over Container Apps, Static Web Apps, and Vercel
Needed a hosting target for a Next.js 16 standalone Node.js app that integrates with Azure AI Foundry via Managed Identity. The app requires server-side rendering, API routes, and a persistent process (not serverless cold-starts per-request). As a Cloud Solution Architect at Microsoft, choosing Azure was a given — but which Azure service?
Cost OptimizationOperational Excellence
2025-12-01View decision →
ADR-002accepted
Next.js `output: "standalone"` over default build for deployment
Azure App Service zip-deploy works by uploading a zip and letting the process run. The default Next.js build produces a `.next/` folder that still requires a full `node_modules/` (~300MB) at runtime. This made the deploy zip large and slow, and required `npm install` post-deploy or bundling all dependencies.
Operational ExcellencePerformance Efficiency
2025-12-05View decision →
ADR-003accepted
NextAuth v5 credentials-only over OAuth providers for admin access
The portfolio has an admin panel (`/admin`) for managing all content. Only one person (Saurav) needs access. Authentication was required to protect CRUD APIs and prevent public access to the editor.
SecurityOperational Excellence
2025-12-10View decision →
ADR-004accepted
Tailwind CSS v4 CSS-first config over v3 config-file approach
Starting a new Next.js project in late 2025, Tailwind CSS v4 was available as a release candidate. v4 introduces a CSS-first configuration model using `@theme` in `globals.css`, replacing the JavaScript `tailwind.config.js` file. The choice was to adopt v4 early or stay on the stable v3.
Operational Excellence
2025-12-12View decision →
ADR-005accepted
Azure AI Foundry Agent over direct Azure OpenAI API calls
The portfolio needed an AI chatbot grounded on portfolio content, and an AI Writer that can draft blog posts, case studies, and other content types. The choice was between calling the Azure OpenAI chat completions API directly, or using the Azure AI Foundry Agent API which wraps a model with persistent tools.
ReliabilityOperational Excellence
2026-01-08View decision →
ADR-006accepted
RAG via AI Foundry `file_search` vector store over custom embedding pipeline
The chatbot needs to answer questions about Saurav's portfolio content (projects, case studies, blog posts, events, talks). A RAG pipeline was needed to ground the model on real content rather than hallucinating. Options ranged from building a custom embedding + vector database pipeline to using managed services.
Cost OptimizationOperational Excellence
2026-01-10View decision →
ADR-007accepted
Azure Blob Storage for media over git-tracked binaries
The admin panel allows uploading cover images for blog posts, case studies, events, and certifications. These images need to be stored somewhere accessible to both the Next.js app and public visitors. Options were to store them in the git repo, or an external blob store.
Performance EfficiencyCost Optimization
2026-01-15View decision →
ADR-008accepted
GitHub Actions CI/CD over Azure DevOps Pipelines
The portfolio needed an automated build and deploy pipeline. As a Microsoft employee, Azure DevOps was the obvious enterprise choice. However, the portfolio is on a personal GitHub repository, not an Azure DevOps organization.
Operational Excellence
2026-01-18View decision →
ADR-009accepted
Managed Identity over API keys for Azure AI service authentication
The portfolio calls Azure AI Foundry from the App Service backend for chatbot responses and AI Writer generation. Azure services support two authentication patterns: API keys (static secrets stored in environment variables) or Managed Identity (token-based, no secrets).
Security
2026-01-20View decision →
ADR-010accepted
Client-side Application Insights over server-side Node.js SDK telemetry
Monitoring was needed for the portfolio — page views, performance metrics, and exceptions. Azure Application Insights supports both a browser JavaScript SDK and a Node.js server SDK. The choice was which to instrument.
Performance EfficiencyCost Optimization
2026-01-25View decision →
ADR-011accepted
Zod `safeParse` validation at every API boundary
The admin panel has CRUD API routes for 6 content types. Each route receives JSON payloads from the admin UI. Without validation, malformed payloads could cause unhandled exceptions, corrupt content files, or open injection vectors.
ReliabilitySecurity
2026-02-01View decision →
ADR-012accepted
Events override merge pattern over direct JSON editing
Events data (32 speaking engagements) is auto-generated from DOCX source files via `scripts/generate-events.mjs`. The generator produces correct IDs and dates but cannot extract professional summaries, curated highlights, or correct topic tags. Manual corrections were needed, but direct edits to `events.json` would be overwritten on the next generation run.
ReliabilityOperational Excellence
2026-02-10View decision →