<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>2026-02 on Funky Si's Blog</title><link>https://www.funkysi1701.com/2026/02/</link><description>Recent content in 2026-02 on Funky Si's Blog</description><generator>Hugo -- gohugo.io</generator><language>en-gb</language><managingEditor>funkysi1701@gmail.com (Simon Foster)</managingEditor><webMaster>funkysi1701@gmail.com (Simon Foster)</webMaster><lastBuildDate>Mon, 23 Feb 2026 20:00:00 +0000</lastBuildDate><atom:link href="https://www.funkysi1701.com/2026/02/index.xml" rel="self" type="application/rss+xml"/><item><title>Azure Container Registry vs AWS Elastic Container Registry: A Developer's Comparison</title><link>https://www.funkysi1701.com/posts/2026/acr-vs-ecr/</link><author>funkysi1701@gmail.com (funkysi1701)</author><pubDate>Mon, 23 Feb 2026 20:00:00 +0000</pubDate><guid>https://www.funkysi1701.com/posts/2026/acr-vs-ecr/</guid><category term="Azure">Azure</category><category term="AWS">AWS</category><category term="Docker">Docker</category><category term="Containers">Containers</category><category term="DevOps">DevOps</category><category term="ACR">ACR</category><category term="ECR">ECR</category><category term="Cloud">Cloud</category><media:content medium="image" type="image/png" url="https://www.funkysi1701.com/images/2026/acr-vs-ecr.png"/><description>&lt;p&gt;As someone who works with both Azure and AWS regularly, I&amp;rsquo;ve had hands-on experience with both &lt;strong&gt;Azure Container Registry (ACR)&lt;/strong&gt; and &lt;strong&gt;AWS Elastic Container Registry (ECR)&lt;/strong&gt;. Recently, while migrating my blog&amp;rsquo;s deployment pipeline to use ECR, I encountered some interesting differences that are worth sharing.&lt;/p&gt;
&lt;h2 id="the-basics"&gt;The Basics&lt;a class="anchor ms-1" href="#the-basics" aria-label="Permalink: The Basics"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Both services provide secure, private Docker container registries that integrate seamlessly with their respective cloud ecosystems. They&amp;rsquo;re designed to store, manage, and deploy container images for your applications.&lt;/p&gt;
&lt;h3 id="azure-container-registry-acr"&gt;Azure Container Registry (ACR)&lt;a class="anchor ms-1" href="#azure-container-registry-acr" aria-label="Permalink: Azure Container Registry (ACR)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fully managed Docker registry service&lt;/li&gt;
&lt;li&gt;Integrated with Azure Kubernetes Service (AKS), Azure Container Instances, and other Azure services&lt;/li&gt;
&lt;li&gt;Supports Docker images and OCI artifacts&lt;/li&gt;
&lt;li&gt;Available in multiple tiers: Basic, Standard, Premium&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="aws-elastic-container-registry-ecr"&gt;AWS Elastic Container Registry (ECR)&lt;a class="anchor ms-1" href="#aws-elastic-container-registry-ecr" aria-label="Permalink: AWS Elastic Container Registry (ECR)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fully managed Docker container registry&lt;/li&gt;
&lt;li&gt;Integrated with Amazon ECS, EKS, and AWS Lambda&lt;/li&gt;
&lt;li&gt;Supports Docker images and OCI artifacts&lt;/li&gt;
&lt;li&gt;Single pricing model with pay-as-you-go&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;OCI artifacts&lt;/strong&gt; are container-related objects that follow the Open Container Initiative (OCI) specifications. Originally, OCI defined standards for Docker container images, but now it covers a broader range of artifacts—including Helm charts, software bill of materials (SBOMs), and other files—stored in container registries.&lt;/p&gt;
&lt;h2 id="pricing-comparison"&gt;Pricing Comparison&lt;a class="anchor ms-1" href="#pricing-comparison" aria-label="Permalink: Pricing Comparison"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is where things get interesting.&lt;/p&gt;
&lt;h3 id="azure-container-registry"&gt;Azure Container Registry&lt;a class="anchor ms-1" href="#azure-container-registry" aria-label="Permalink: Azure Container Registry"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ACR uses a &lt;strong&gt;tiered pricing model&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Basic&lt;/strong&gt;: £4.23/month + storage (£0.083/GB) + bandwidth&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Standard&lt;/strong&gt;: £16.93/month + storage (£0.083/GB) + bandwidth&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Premium&lt;/strong&gt;: £42.32/month + storage (£0.083/GB) + bandwidth + geo-replication&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Premium tier adds features like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Geo-replication across Azure regions&lt;/li&gt;
&lt;li&gt;Content trust for image signing&lt;/li&gt;
&lt;li&gt;Private link with private endpoints&lt;/li&gt;
&lt;li&gt;Enhanced throughput&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="aws-elastic-container-registry"&gt;AWS Elastic Container Registry&lt;a class="anchor ms-1" href="#aws-elastic-container-registry" aria-label="Permalink: AWS Elastic Container Registry"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ECR uses &lt;strong&gt;simple pay-as-you-go pricing&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;: $0.10/GB per month (£0.08/GB)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Transfer&lt;/strong&gt;: Standard AWS data transfer pricing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No base fee&lt;/strong&gt; - you only pay for what you use&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="authentication--setup"&gt;Authentication &amp; Setup&lt;a class="anchor ms-1" href="#authentication--setup" aria-label="Permalink: Authentication &amp;amp; Setup"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is where I hit some friction with ECR.&lt;/p&gt;
&lt;h3 id="azure-container-registry-1"&gt;Azure Container Registry&lt;a class="anchor ms-1" href="#azure-container-registry-1" aria-label="Permalink: Azure Container Registry"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ACR authentication is straightforward:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Login using Azure CLI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;az acr login --name myregistry
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Or use service principal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker login myregistry.azurecr.io -u $SP_ID -p $SP_PASSWORD
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# In pipelines, it&amp;#39;s seamless with Azure DevOps tasks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The Azure DevOps integration is particularly smooth - the &lt;code&gt;Docker@2&lt;/code&gt; task handles authentication automatically when using service connections.&lt;/p&gt;
&lt;h3 id="aws-elastic-container-registry-1"&gt;AWS Elastic Container Registry&lt;a class="anchor ms-1" href="#aws-elastic-container-registry-1" aria-label="Permalink: AWS Elastic Container Registry"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ECR authentication requires an extra step:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Get login password and pipe to docker login&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aws ecr get-login-password --region eu-north-1 | &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; docker login --username AWS --password-stdin &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 111111111111.dkr.ecr.eu-north-1.amazonaws.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In my Azure Pipelines, I had to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install AWS CLI (not included by default)&lt;/li&gt;
&lt;li&gt;Configure AWS credentials as environment variables&lt;/li&gt;
&lt;li&gt;Run the login command manually&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;task&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;CmdLine@2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;displayName&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Install AWS CLI&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;inputs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;script&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; curl &amp;#34;https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip&amp;#34; -o &amp;#34;awscliv2.zip&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; unzip -q awscliv2.zip
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ./aws/install --bin-dir ~/.local/bin --install-dir ~/.local/aws-cli
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;task&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;CmdLine@2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;displayName&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Login to ECR&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;env&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;$(AWS_ACCESS_KEY_ID)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;$(AWS_SECRET_ACCESS_KEY)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;inputs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;script&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; export PATH=$HOME/.local/bin:$PATH
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; aws ecr get-login-password --region eu-north-1 | \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; docker login --username AWS --password-stdin \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 111111111111.dkr.ecr.eu-north-1.amazonaws.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Winner&lt;/strong&gt;: ACR (simpler authentication, especially in Azure DevOps)&lt;/p&gt;
&lt;h2 id="image-naming--urls"&gt;Image Naming &amp; URLs&lt;a class="anchor ms-1" href="#image-naming--urls" aria-label="Permalink: Image Naming &amp;amp; URLs"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="azure-container-registry-2"&gt;Azure Container Registry&lt;a class="anchor ms-1" href="#azure-container-registry-2" aria-label="Permalink: Azure Container Registry"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Clean, predictable naming:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;myregistry.azurecr.io/myapp:v1.0.0
myregistry.azurecr.io/namespace/myapp:latest
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="aws-elastic-container-registry-2"&gt;AWS Elastic Container Registry&lt;a class="anchor ms-1" href="#aws-elastic-container-registry-2" aria-label="Permalink: AWS Elastic Container Registry"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Includes your AWS account ID:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;111111111111.dkr.ecr.eu-north-1.amazonaws.com/funkysi1701/blog:10.1.1.123-develop
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The account ID in the URL may pose a security consideration - it&amp;rsquo;s visible to anyone who has access to your images or deployment configs. Attackers could use the account ID for targeted phishing, social engineering, or brute-force attacks. If combined with leaked credentials or misconfigured permissions, it makes it easier for someone to identify and target your AWS resources.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Winner&lt;/strong&gt;: ACR (cleaner URLs)&lt;/p&gt;
&lt;h2 id="features-comparison"&gt;Features Comparison&lt;a class="anchor ms-1" href="#features-comparison" aria-label="Permalink: Features Comparison"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;ACR&lt;/th&gt;
&lt;th&gt;ECR&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Image Scanning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Premium tier&lt;/td&gt;
&lt;td&gt;✅ Included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vulnerability Scanning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Premium tier&lt;/td&gt;
&lt;td&gt;✅ Basic + Enhanced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Geo-Replication&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Premium tier&lt;/td&gt;
&lt;td&gt;❌ Manual setup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Webhooks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ All tiers&lt;/td&gt;
&lt;td&gt;✅ Included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Image Retention Policies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ All tiers&lt;/td&gt;
&lt;td&gt;✅ Lifecycle policies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Private Endpoints&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Premium tier&lt;/td&gt;
&lt;td&gt;✅ VPC endpoints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Image Signing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Content Trust&lt;/td&gt;
&lt;td&gt;✅ AWS Signer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cross-Region Replication&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Premium&lt;/td&gt;
&lt;td&gt;❌ Requires manual setup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Import from Docker Hub&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Built-in&lt;/td&gt;
&lt;td&gt;❌ Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="integration-with-kubernetes"&gt;Integration with Kubernetes&lt;a class="anchor ms-1" href="#integration-with-kubernetes" aria-label="Permalink: Integration with Kubernetes"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="acr--aks"&gt;ACR + AKS&lt;a class="anchor ms-1" href="#acr--aks" aria-label="Permalink: ACR + AKS"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Seamless integration with Azure Kubernetes Service:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Attach ACR to AKS cluster&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;az aks update --name myaks --resource-group mygroup --attach-acr myregistry
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;AKS nodes can pull images without credentials. Magical.&lt;/p&gt;
&lt;h3 id="ecr--eks"&gt;ECR + EKS&lt;a class="anchor ms-1" href="#ecr--eks" aria-label="Permalink: ECR + EKS"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Also integrated, but requires IAM roles:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Attach IAM policy to EKS node role&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aws iam attach-role-policy &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --role-name eksNodeRole &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Works well once configured, but requires understanding of AWS IAM.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Winner&lt;/strong&gt;: Tie (both integrate well with their respective K8s offerings)&lt;/p&gt;
&lt;h2 id="developer-experience"&gt;Developer Experience&lt;a class="anchor ms-1" href="#developer-experience" aria-label="Permalink: Developer Experience"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="what-i-like-about-acr"&gt;What I Like About ACR&lt;a class="anchor ms-1" href="#what-i-like-about-acr" aria-label="Permalink: What I Like About ACR"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Simple authentication in Azure DevOps&lt;/li&gt;
&lt;li&gt;Clean, readable image URLs&lt;/li&gt;
&lt;li&gt;Excellent documentation&lt;/li&gt;
&lt;li&gt;Azure Portal UI is intuitive&lt;/li&gt;
&lt;li&gt;Helm chart support is first-class&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="what-i-like-about-ecr"&gt;What I Like About ECR&lt;a class="anchor ms-1" href="#what-i-like-about-ecr" aria-label="Permalink: What I Like About ECR"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;No minimum cost - truly pay-per-use&lt;/li&gt;
&lt;li&gt;Built-in vulnerability scanning at all levels&lt;/li&gt;
&lt;li&gt;AWS CLI is powerful and ubiquitous&lt;/li&gt;
&lt;li&gt;Great for multi-cloud strategies&lt;/li&gt;
&lt;li&gt;Excellent API and automation support&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pain-points"&gt;Pain Points&lt;a class="anchor ms-1" href="#pain-points" aria-label="Permalink: Pain Points"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;ACR&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Premium tier gets expensive for features that should be standard&lt;/li&gt;
&lt;li&gt;Minimum £4/month even for tiny projects&lt;/li&gt;
&lt;li&gt;Geo-replication requires Premium tier (£42/month)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Geo-replication is important because it allows your container images and artifacts to be stored and accessed in multiple geographic regions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ECR&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Authentication is more complex outside AWS&lt;/li&gt;
&lt;li&gt;Account ID in image URL&lt;/li&gt;
&lt;li&gt;Requires AWS CLI installation in non-AWS CI/CD&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="my-real-world-experience"&gt;My Real-World Experience&lt;a class="anchor ms-1" href="#my-real-world-experience" aria-label="Permalink: My Real-World Experience"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For my blog&amp;rsquo;s deployment pipeline, I recently migrated from ACR to ECR primarily for &lt;strong&gt;cost reasons&lt;/strong&gt;. Here&amp;rsquo;s what I learned:&lt;/p&gt;
&lt;h3 id="the-migration"&gt;The Migration&lt;a class="anchor ms-1" href="#the-migration" aria-label="Permalink: The Migration"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Before (ACR)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cost: ~£4.50/month (Basic tier + minimal storage)&lt;/li&gt;
&lt;li&gt;Authentication: Seamless in Azure DevOps&lt;/li&gt;
&lt;li&gt;Image URLs: Clean and simple&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;After (ECR)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cost: £0/month (due to free trial)&lt;/li&gt;
&lt;li&gt;Authentication: Required custom pipeline steps&lt;/li&gt;
&lt;li&gt;Image URLs: Include AWS account ID&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="was-it-worth-it"&gt;Was It Worth It?&lt;a class="anchor ms-1" href="#was-it-worth-it" aria-label="Permalink: Was It Worth It?"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For my small personal project, &lt;strong&gt;yes&lt;/strong&gt; - saving money is meaningful. But the setup was more complex than I expected.&lt;/p&gt;
&lt;p&gt;For enterprise workloads, I&amp;rsquo;d still choose ACR Premium if I needed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Geo-replication&lt;/li&gt;
&lt;li&gt;Content trust&lt;/li&gt;
&lt;li&gt;Azure-native integration&lt;/li&gt;
&lt;li&gt;Enterprise support&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="recommendations"&gt;Recommendations&lt;a class="anchor ms-1" href="#recommendations" aria-label="Permalink: Recommendations"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="choose-acr-if"&gt;Choose ACR if&lt;a class="anchor ms-1" href="#choose-acr-if" aria-label="Permalink: Choose ACR if"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;✅ You&amp;rsquo;re heavily invested in Azure ecosystem&lt;br&gt;
✅ You need geo-replication&lt;br&gt;
✅ You want seamless AKS integration&lt;br&gt;
✅ You value simplified authentication&lt;br&gt;
✅ You need Azure-native compliance features&lt;/p&gt;
&lt;h3 id="choose-ecr-if"&gt;Choose ECR if&lt;a class="anchor ms-1" href="#choose-ecr-if" aria-label="Permalink: Choose ECR if"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;✅ You want zero minimum costs&lt;br&gt;
✅ You&amp;rsquo;re on AWS or multi-cloud&lt;br&gt;
✅ You need built-in vulnerability scanning&lt;br&gt;
✅ You prefer pay-per-use pricing&lt;br&gt;
✅ You&amp;rsquo;re comfortable with IAM and AWS CLI&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;a class="anchor ms-1" href="#conclusion" aria-label="Permalink: Conclusion"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Both ACR and ECR are excellent services. Your choice should depend on:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Your cloud platform&lt;/strong&gt; - Use the registry that matches your deployment target&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Your budget&lt;/strong&gt; - ECR wins for small projects, ACR Premium for enterprise features&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Your team&amp;rsquo;s expertise&lt;/strong&gt; - Stick with what your team knows&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Your requirements&lt;/strong&gt; - Need geo-replication? ACR Premium. Need low-cost? ECR.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For my personal projects, I&amp;rsquo;m happy with ECR&amp;rsquo;s cost savings. For enterprise work, I still recommend ACR Premium for its advanced features and Azure integration.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s your experience with container registries? Let me know in the comments!&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;a class="anchor ms-1" href="#resources" aria-label="Permalink: Resources"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/container-registry/" target="_blank" rel="noopener noreferrer"&gt;Azure Container Registry Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ecr/" target="_blank" rel="noopener noreferrer"&gt;AWS ECR Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/en-gb/pricing/details/container-registry/" target="_blank" rel="noopener noreferrer"&gt;ACR Pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/ecr/pricing/" target="_blank" rel="noopener noreferrer"&gt;ECR Pricing&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>NDC London 2026</title><link>https://www.funkysi1701.com/posts/2026/ndc-london-2026/</link><author>funkysi1701@gmail.com (funkysi1701)</author><pubDate>Mon, 02 Feb 2026 20:46:00 +0000</pubDate><guid>https://www.funkysi1701.com/posts/2026/ndc-london-2026/</guid><category term="NDCLondon">NDCLondon</category><category term="Conference">Conference</category><category term="DotNet">DotNet</category><category term="AI">AI</category><category term="Accessibility">Accessibility</category><category term="WCAG">WCAG</category><category term="Playwright">Playwright</category><category term="Testing">Testing</category><category term="Azure">Azure</category><category term="OpenTelemetry">OpenTelemetry</category><category term="UX">UX</category><category term="Volunteering">Volunteering</category><category term="2026">2026</category><media:content medium="image" type="image/jpeg" url="https://www.funkysi1701.com/images/2026/ndc-me.jpg"/><description>&lt;img src="https://www.funkysi1701.com/images/2026/ndc-me.jpg" alt="Volunteering at NDC London 2026" width="250px" style="float:left;padding-right: 15px; " /&gt;
&lt;p&gt;For the second year running, I had the privilege of volunteering at NDC London – one of Europe&amp;rsquo;s premier software development conferences. This year&amp;rsquo;s event was packed with insights on AI, accessibility, testing automation, and the future of software development. If you&amp;rsquo;re interested in my first experience, check out my &lt;a href="https://www.funkysi1701.com/posts/2025/volunteering-at-ndc/"&gt;2025 report&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;The volunteer experience was just as rewarding as last year – the team was fantastic, the energy was incredible, and the sense of community was palpable. In this post, I&amp;rsquo;ll focus on the talks I attended and the key insights I gained from them.&lt;/p&gt;
&lt;p&gt;As I mentioned last year, volunteering gave me a &lt;strong&gt;superpower&lt;/strong&gt;: increased confidence to network with speakers, vendors, fellow volunteers, and attendees. The connections you make at conferences like this are invaluable, and being part of the team made it even easier to engage with the community.&lt;/p&gt;
&lt;h2 id="wednesday"&gt;Wednesday&lt;a class="anchor ms-1" href="#wednesday" aria-label="Permalink: Wednesday"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="lets-break-some-wcag-rules-speaker-elise-kristiansen"&gt;Let’s Break Some WCAG Rules (Speaker: Elise Kristiansen)&lt;a class="anchor ms-1" href="#lets-break-some-wcag-rules-speaker-elise-kristiansen" aria-label="Permalink: Let’s Break Some WCAG Rules (Speaker: Elise Kristiansen)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This eye-opening talk examined how pervasively websites violate Web Content Accessibility Guidelines (WCAG). For those unfamiliar, WCAG provides a framework to make web content accessible to everyone, including people with disabilities. The guidelines are organized into three conformance levels:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Level A&lt;/strong&gt; - The bare minimum requirements&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level AA&lt;/strong&gt; - The legal requirement (what most laws mandate)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level AAA&lt;/strong&gt; - The gold standard, aspirational but not legally required&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The statistics Elise shared were sobering: 15-25% of people have some form of disability (whether permanent, temporary, or situational), yet a staggering &lt;strong&gt;94.8% of websites contain at least one WCAG AA violation&lt;/strong&gt; – meaning they&amp;rsquo;re actually breaking the law.&lt;/p&gt;
&lt;p&gt;One of the most powerful demonstrations was a colour blindness test where only colour blind individuals could read certain numbers. It really drove home how design choices can inadvertently exclude significant portions of our users.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaways:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WCAG compliance isn&amp;rsquo;t optional – it&amp;rsquo;s a legal requirement and moral imperative&lt;/li&gt;
&lt;li&gt;Stop using &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; for everything; HTML is semantically rich for a reason&lt;/li&gt;
&lt;li&gt;Consider learning to use a screen reader to understand user experiences better&lt;/li&gt;
&lt;li&gt;Accessibility benefits everyone, not just those with disabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="social-engineering-hacking-humans-speaker-pawel-sucholbiak"&gt;Social Engineering: Hacking Humans (Speaker: Pawel Sucholbiak)&lt;a class="anchor ms-1" href="#social-engineering-hacking-humans-speaker-pawel-sucholbiak" aria-label="Permalink: Social Engineering: Hacking Humans (Speaker: Pawel Sucholbiak)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A timely reminder that as soon as humans enter the equation, social engineering becomes a significant security risk. This talk explored various tactics malicious actors use to manipulate people into divulging confidential information or performing actions that compromise security.&lt;/p&gt;
&lt;p&gt;Pawel demonstrated real-world scenarios like phishing emails that appear to come from trusted colleagues, pretexting phone calls where attackers impersonate IT support, and how seemingly innocent information shared on social media can be weaponized. The human element remains the weakest link in any security chain.&lt;/p&gt;
&lt;h3 id="supercharged-testing-ai-powered-workflows-with-playwright--mcp-speaker-debbie-obrien"&gt;Supercharged Testing: AI-Powered Workflows with Playwright + MCP (Speaker: Debbie O’Brien)&lt;a class="anchor ms-1" href="#supercharged-testing-ai-powered-workflows-with-playwright--mcp-speaker-debbie-obrien" aria-label="Permalink: Supercharged Testing: AI-Powered Workflows with Playwright + MCP (Speaker: Debbie O’Brien)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;d heard Debbie discuss the Playwright MCP (Model Context Protocol) on .NET Rocks, but seeing it demonstrated live was transformative. This session showed how AI can dramatically enhance testing workflows by understanding test intent and generating Playwright test code.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve already started using it to write some tests for this very website!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaway:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Experiment with the Playwright MCP – it&amp;rsquo;s a game-changer for test automation&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="the-undersea-cable-network-speaker-richard-campbell"&gt;The Undersea Cable Network (Speaker: Richard Campbell)&lt;a class="anchor ms-1" href="#the-undersea-cable-network-speaker-richard-campbell" aria-label="Permalink: The Undersea Cable Network (Speaker: Richard Campbell)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Richard took us on a fascinating journey through the history of undersea telecommunications cables – the literal backbone of the internet. He explored how these cables are laid, maintained, and the significant challenges when they&amp;rsquo;re damaged (whether accidental or deliberate). It&amp;rsquo;s humbling to realize that our globally connected world depends on physical cables crossing ocean floors.&lt;/p&gt;
&lt;h3 id="java-sucks-so-c-didnt-have-to-speaker-adele-carpenter"&gt;Java Sucks (So C# Didn’t Have To) (Speaker: Adele Carpenter)&lt;a class="anchor ms-1" href="#java-sucks-so-c-didnt-have-to-speaker-adele-carpenter" aria-label="Permalink: Java Sucks (So C# Didn’t Have To) (Speaker: Adele Carpenter)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An entertaining and insightful exploration of Java&amp;rsquo;s history, examining how its early popularity locked in certain design decisions that became problematic over time. Adele showed how C# learned from Java&amp;rsquo;s mistakes and made different choices that enabled better evolution. The key lesson: early success can create technical debt that&amp;rsquo;s nearly impossible to pay down.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://speakerdeck.com/97adele/java-sucks-so-c-number-didnt-have-to" target="_blank" rel="noopener noreferrer"&gt;View the slides&lt;/a&gt;
&lt;/p&gt;
&lt;h3 id="think-like-a-user-practical-ux-design-tips-for-developers-speaker-lex-lofthouse"&gt;Think Like a User: Practical UX Design Tips for Developers (Speaker: Lex Lofthouse)&lt;a class="anchor ms-1" href="#think-like-a-user-practical-ux-design-tips-for-developers-speaker-lex-lofthouse" aria-label="Permalink: Think Like a User: Practical UX Design Tips for Developers (Speaker: Lex Lofthouse)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This session challenged developers to shift perspectives and consider user experience from the ground up. Lex provided practical, actionable advice for creating more intuitive interfaces.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.figma.com/deck/FgeSzQhT74JlnxW3iiONqj/UX-Tips?node-id=1-42&amp;amp;t=h9PIcTBhU6KRDMNU-1" target="_blank" rel="noopener noreferrer"&gt;View the slides&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Recommended Reading:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;The Design of Everyday Things&lt;/em&gt; by Don Norman&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="thursday"&gt;Thursday&lt;a class="anchor ms-1" href="#thursday" aria-label="Permalink: Thursday"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="opentelemetry-at-scale-101-intro-to-opamp-speakers-aakansha-priya-and-adriana-villela"&gt;OpenTelemetry At Scale 101: Intro to OpAMP (Speakers: Aakansha Priya and Adriana Villela)&lt;a class="anchor ms-1" href="#opentelemetry-at-scale-101-intro-to-opamp-speakers-aakansha-priya-and-adriana-villela" aria-label="Permalink: OpenTelemetry At Scale 101: Intro to OpAMP (Speakers: Aakansha Priya and Adriana Villela)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This session introduced OpAMP (Open Agent Management Protocol) for managing OpenTelemetry collectors at scale. While the scale discussed was beyond my current needs, it was valuable to understand the challenges and solutions for production observability in large distributed systems.&lt;/p&gt;
&lt;h3 id="a-defence-of-technical-excellence-speaker-chris-simon"&gt;A Defence of Technical Excellence (Speaker: Chris Simon)&lt;a class="anchor ms-1" href="#a-defence-of-technical-excellence-speaker-chris-simon" aria-label="Permalink: A Defence of Technical Excellence (Speaker: Chris Simon)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chris made a compelling argument for maintaining high technical standards even under pressure to deliver quickly. Technical excellence isn&amp;rsquo;t about perfectionism – it&amp;rsquo;s about sustainable, maintainable code that serves the business long-term.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://chrissimon.au/speaking/talks/a-defence-of-technical-excellence/?read-more=1" target="_blank" rel="noopener noreferrer"&gt;Read more about this talk&lt;/a&gt;
&lt;/p&gt;
&lt;h3 id="how-to-git-away-with-murder-speaker-sergès-goma"&gt;How to Git Away with Murder (Speaker: Sergès Goma)&lt;a class="anchor ms-1" href="#how-to-git-away-with-murder-speaker-sergès-goma" aria-label="Permalink: How to Git Away with Murder (Speaker: Sergès Goma)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A humorous yet practical look at Git workflows and how to recover from common (and not-so-common) Git disasters. The Q&amp;amp;A session at the end turned into a group therapy session where attendees shared their most spectacular Git mishaps and recovery stories. If you&amp;rsquo;ve ever accidentally force-pushed to main, this talk was for you!&lt;/p&gt;
&lt;h3 id="code-that-writes-code-net-source-generators-speaker-glenn-f-henriksen"&gt;Code That Writes Code: .NET Source Generators (Speaker: Glenn F. Henriksen)&lt;a class="anchor ms-1" href="#code-that-writes-code-net-source-generators-speaker-glenn-f-henriksen" aria-label="Permalink: Code That Writes Code: .NET Source Generators (Speaker: Glenn F. Henriksen)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Source generators are one of .NET&amp;rsquo;s most powerful yet underutilized features. Glenn demonstrated how they can eliminate boilerplate, improve performance by moving work to compile-time, and create type-safe code generation patterns. This is definitely an area I need to explore more for my own projects.&lt;/p&gt;
&lt;h3 id="warm-and-fuzzy-semantic-search-in-net-speaker-jonathan-j-tower"&gt;Warm and Fuzzy: Semantic Search in .NET (Speaker: Jonathan “J.” Tower)&lt;a class="anchor ms-1" href="#warm-and-fuzzy-semantic-search-in-net-speaker-jonathan-j-tower" aria-label="Permalink: Warm and Fuzzy: Semantic Search in .NET (Speaker: Jonathan “J.” Tower)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Jonathan delivered an excellent introduction to implementing semantic search using vector databases. He covered several options for .NET developers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SQL Server 2025&lt;/strong&gt; with native vector support&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Cosmos DB&lt;/strong&gt; for NoSQL vector storage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qdrant&lt;/strong&gt; as a specialized vector database&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The talk also touched on &lt;strong&gt;Semantic Kernel&lt;/strong&gt;, which is now part of the Microsoft Agent Framework – a significant development for building intelligent applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Action Items:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Implement semantic search for my blog to improve content discovery&lt;/li&gt;
&lt;li&gt;Explore the &lt;a href="https://github.com/trailheadtechnology/dotnet-semantic-search/tree/main/code" target="_blank" rel="noopener noreferrer"&gt;demo code on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="coding-4-fun-8-bit-game-emulation-in-net-speaker-alex-thissen"&gt;Coding 4 Fun: 8-bit Game Emulation in .NET (Speaker: Alex Thissen)&lt;a class="anchor ms-1" href="#coding-4-fun-8-bit-game-emulation-in-net-speaker-alex-thissen" aria-label="Permalink: Coding 4 Fun: 8-bit Game Emulation in .NET (Speaker: Alex Thissen)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pure fun! Alex walked through building an 8-bit game emulator in .NET, demonstrating low-level programming concepts in a modern language. A great reminder that not everything we build needs to be &amp;ldquo;enterprise-ready&amp;rdquo; – sometimes coding is just about learning and enjoyment. Lots of shifting bytes around, so a great example of the different things you can do with .NET.&lt;/p&gt;
&lt;h2 id="friday"&gt;Friday&lt;a class="anchor ms-1" href="#friday" aria-label="Permalink: Friday"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="keynote-ai-powered-app-development-speaker-steve-sanderson"&gt;Keynote: AI-Powered App Development (Speaker: Steve Sanderson)&lt;a class="anchor ms-1" href="#keynote-ai-powered-app-development-speaker-steve-sanderson" aria-label="Permalink: Keynote: AI-Powered App Development (Speaker: Steve Sanderson)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Steve Sanderson delivered an inspiring keynote on how AI is transforming application development. The &lt;a href="https://github.com/features/copilot/cli" target="_blank" rel="noopener noreferrer"&gt;GitHub Copilot CLI&lt;/a&gt;
was demonstrated, with a new feature added in front of our eyes. Hundreds of Pull Requests can be generated with AI, but they all need reviewing and maintaining by Software Developers and there are no easy answers for managing that.&lt;/p&gt;
&lt;h3 id="what-in-the-hunger-games-is-happening-with-recruitment-speaker-suzi-edwards-alexander"&gt;What in the Hunger Games is Happening with Recruitment? (Speaker: Suzi Edwards-Alexander)&lt;a class="anchor ms-1" href="#what-in-the-hunger-games-is-happening-with-recruitment-speaker-suzi-edwards-alexander" aria-label="Permalink: What in the Hunger Games is Happening with Recruitment? (Speaker: Suzi Edwards-Alexander)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A frank and often amusing look at the current state of tech recruitment. Suzi traced how we arrived at today&amp;rsquo;s challenging hiring landscape – from the first interview questions created by Thomas Edison, to the rise of LinkedIn and modern recruitment processes. Recruitment is broken, and there are no easy ways of fixing it.&lt;/p&gt;
&lt;h3 id="the-great-brain-robbery-navigating-the-dark-future-of-online-manipulation-speaker-jeff-watkins"&gt;The Great Brain Robbery: Navigating the Dark Future of Online Manipulation (Speaker: Jeff Watkins)&lt;a class="anchor ms-1" href="#the-great-brain-robbery-navigating-the-dark-future-of-online-manipulation-speaker-jeff-watkins" aria-label="Permalink: The Great Brain Robbery: Navigating the Dark Future of Online Manipulation (Speaker: Jeff Watkins)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A sobering examination of how online platforms use psychological manipulation and dark patterns to exploit users&amp;rsquo; attention and data. Jeff didn&amp;rsquo;t just highlight the problems – he offered strategies for recognizing and resisting these tactics, both as developers and as users. This talk was rather bleak reinforcing the notion that you can not trust anything you see or read online.&lt;/p&gt;
&lt;h3 id="beyond-the-ai-hype-whats-real-whats-next-speaker-richard-campbell"&gt;Beyond the AI Hype: What’s Real, What’s Next (Speaker: Richard Campbell)&lt;a class="anchor ms-1" href="#beyond-the-ai-hype-whats-real-whats-next-speaker-richard-campbell" aria-label="Permalink: Beyond the AI Hype: What’s Real, What’s Next (Speaker: Richard Campbell)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Richard cut through the AI hype to examine what&amp;rsquo;s genuinely transformative versus what&amp;rsquo;s just marketing. He explored current capabilities, realistic near-term developments, and the fundamental limitations we need to understand. A perfect counterbalance to the morning&amp;rsquo;s optimistic keynote – both perspectives are necessary for making informed decisions about AI adoption.&lt;/p&gt;
&lt;h3 id="resilient-by-design-speaker-chris-ayers"&gt;Resilient by Design (Speaker: Chris Ayers)&lt;a class="anchor ms-1" href="#resilient-by-design-speaker-chris-ayers" aria-label="Permalink: Resilient by Design (Speaker: Chris Ayers)"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The final session I attended focused on building resilient systems in Azure from the ground up. Chris covered how much downtime you can have if your SLA is 99.99% (8.6s a day see &lt;a href="https://uptime.is" target="_blank" rel="noopener noreferrer"&gt;uptime.is&lt;/a&gt;
) – but more importantly, the mindset shift required to design for failure rather than just success. In production, it&amp;rsquo;s not &lt;em&gt;if&lt;/em&gt; things will fail, but &lt;em&gt;when&lt;/em&gt; and &lt;em&gt;how gracefully&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id="networking-break-jetbrains-rider-team"&gt;Networking Break: JetBrains Rider Team&lt;a class="anchor ms-1" href="#networking-break-jetbrains-rider-team" aria-label="Permalink: Networking Break: JetBrains Rider Team"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I skipped one session to have an extended conversation with the &lt;a href="https://www.jetbrains.com/rider/" target="_blank" rel="noopener noreferrer"&gt;JetBrains Rider&lt;/a&gt;
team at their booth. These unstructured conversations are often where you get the most value at conferences – I am a big fan of Visual Studio, but I have never tried Rider, this informal chat has encouraged me to download Rider and give it a try.&lt;/p&gt;
&lt;h2 id="final-thoughts"&gt;Final Thoughts&lt;a class="anchor ms-1" href="#final-thoughts" aria-label="Permalink: Final Thoughts"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;NDC London 2026 was another incredible experience. The breadth of topics – from accessibility and UX to AI, observability, and system resilience – reflects the diverse skills modern developers need.&lt;/p&gt;
&lt;p&gt;My key takeaways from this year:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Accessibility is non-negotiable&lt;/strong&gt; – both legally and morally&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI tools are here to stay&lt;/strong&gt; – learn to leverage them effectively&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Technical excellence matters&lt;/strong&gt; – shortcuts today become tomorrow&amp;rsquo;s technical debt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Community is everything&lt;/strong&gt; – the conversations between sessions were as valuable as the talks themselves&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Huge thanks to the NDC organizing team, my fellow volunteers, all the speakers who shared their knowledge, and the attendees who made this such an engaging event. If you get the chance to attend (or volunteer at) &lt;a href="https://ndcconferences.com/" target="_blank" rel="noopener noreferrer"&gt;NDC Conferences&lt;/a&gt;
, I highly recommend it.&lt;/p&gt;
&lt;p&gt;Interested in attending NDC London 2027? Follow &lt;a href="https://twitter.com/NDC_Conferences" target="_blank" rel="noopener noreferrer"&gt;@NDC_Conferences&lt;/a&gt;
for updates!&lt;/p&gt;
&lt;p&gt;See you at NDC London 2027! 🚀&lt;/p&gt;
&lt;p&gt;&lt;img class="img-fluid" alt="The Awesome Volunteer Team at NDC London" src="https://www.funkysi1701.com/cdn-cgi/image/width=800,quality=75/images/2026/ndc-team.jpg" loading="lazy"
width="2048" height="1536"
/&gt;
&lt;/p&gt;</description></item></channel></rss>