<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Blogs on AJTech</title>
    <link>https://ajtech.nl/blog/</link>
    <description>Recent content in Blogs on AJTech</description>
    <generator>Hugo -- 0.152.2</generator>
    <language>en</language>
    <copyright>Copyright © 2023–2026, Arash Jalalat; all rights reserved</copyright>
    <lastBuildDate>Mon, 23 Feb 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://ajtech.nl/blog/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Building a Microsoft Learn AI Agent with GitHub Copilot SDK and C#</title>
      <link>https://ajtech.nl/blog/building-ai-agent-with-github-copilot-sdk/</link>
      <pubDate>Mon, 23 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://ajtech.nl/blog/building-ai-agent-with-github-copilot-sdk/</guid>
      <description>Build a specialized AI agent using the GitHub Copilot SDK and C# that is grounded in Microsoft Learn knowledge via MCP. Includes a full Docker Compose setup with Open WebUI for a chat experience.</description>
      <enclosure url="https://ajtech.nl/images/2026/02/ai-agent-copilot-sdk-cover.png" type="image/jpeg" />
    </item>
    <item>
      <title>Building an MCP Server with Azure Functions: Extending GitHub Copilot in the Cloud</title>
      <link>https://ajtech.nl/blog/create-your-own-mcp-server/</link>
      <pubDate>Thu, 06 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://ajtech.nl/blog/create-your-own-mcp-server/</guid>
      <description>Build a cloud-native MCP server using Azure Functions to extend GitHub Copilot with custom tools. Learn how to implement the Model Context Protocol with serverless architecture.</description>
      <enclosure url="https://ajtech.nl/images/2025/11/mcp-server-design.jpg" type="image/jpeg" />
    </item>
    <item>
      <title>Ask GitHub Copilot for code review in your .NET project</title>
      <link>https://ajtech.nl/blog/ask-github-copilot-for-code-review-in-your-dotnet-project/</link>
      <pubDate>Tue, 22 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://ajtech.nl/blog/ask-github-copilot-for-code-review-in-your-dotnet-project/</guid>
      <description>&lt;p&gt;In this blog post, I’ll share my experience building a &lt;strong&gt;.NET 8 Azure Function App&lt;/strong&gt; that retrieves a user profile via the Microsoft Graph API. The function app is designed to run in Azure and return the user profile of the logged-in user via Microsoft Entra-ID. While the technical implementation was exciting, the interesting part of this journey was using &lt;strong&gt;GitHub Copilot&lt;/strong&gt; as a code reviewer through Pull Requests in GitHub. It became generally available on &lt;a href=&#34;https://github.blog/changelog/2025-04-04-copilot-code-review-now-generally-available/&#34;&gt;April 4th&lt;/a&gt;. I’ll walk you through the process, share my thoughts on Copilot’s feedback, and highlight areas where it shines and where it could improve.&lt;/p&gt;</description>
      <enclosure url="https://ajtech.nl/images/2025/04/DSC08809.jpg" type="image/jpeg" />
    </item>
    <item>
      <title>Boost your Azure Pipeline with Bicep&#39;s deployer() function</title>
      <link>https://ajtech.nl/blog/boost-your-azure-pipeline-with-biceps-deployer-function/</link>
      <pubDate>Mon, 13 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://ajtech.nl/blog/boost-your-azure-pipeline-with-biceps-deployer-function/</guid>
      <description>&lt;h1 id=&#34;context&#34;&gt;Context&lt;/h1&gt;
&lt;p&gt;Last month Microsoft released its newest Bicep version &lt;code&gt;v0.32.4&lt;/code&gt; which includes an interesting function called &lt;code&gt;deployer()&lt;/code&gt;. This function can retrieve the ObjectId and TenantId of the deploying Service principal. This can be very helpful in certain cases such as assigning tags to Azure resources or to assign a role to the deploying Service principal.&lt;/p&gt;
&lt;p&gt;In my experience you have strong Infrastructure as Code (IaC) setup when you combine both Bicep with Azure Pipelines for deploying resources to Azure. Let&amp;rsquo;s have a look what we can do with the new &lt;code&gt;deployer()&lt;/code&gt; function.&lt;/p&gt;</description>
      <enclosure url="https://ajtech.nl/images/2025/01/bicep-deployer.jpg" type="image/jpeg" />
    </item>
    <item>
      <title>How to summarize a Git repository using NotebookLM</title>
      <link>https://ajtech.nl/blog/how-to-summarize-a-git-repository-using-notebooklm/</link>
      <pubDate>Mon, 11 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://ajtech.nl/blog/how-to-summarize-a-git-repository-using-notebooklm/</guid>
      <description>&lt;h2 id=&#34;exploring-notebooklms-audio-overview-feature&#34;&gt;Exploring NotebookLM’s Audio Overview Feature&lt;/h2&gt;
&lt;h3 id=&#34;context&#34;&gt;Context&lt;/h3&gt;
&lt;p&gt;Recently, Google introduced an exciting new feature for NotebookLM: &lt;strong&gt;Audio Overview&lt;/strong&gt;. For those unfamiliar, NotebookLM is a personal AI-powered research assistant (powered by &lt;a href=&#34;https://blog.google/technology/ai/google-gemini-next-generation-model-february-2024&#34;&gt;Gemini 1.5 Pro&lt;/a&gt;) designed for efficient summarization and note-taking. By uploading your documents, whether PDFs, websites, or text files, NotebookLM analyzes and organizes the content. This allows you to interact with it in various ways.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Audio Overview&lt;/strong&gt; feature, in particular, caught my attention. It essentially creates a podcast-like experience where two AI hosts discuss your research topic in real time. This conversational format offers a unique way to engage with your content, which can make complex topics more accessible and enjoyable. What’s even better? You can guide the discussion by providing specific instructions, ensuring the conversation focuses on aspects most relevant to you.&lt;/p&gt;</description>
      <enclosure url="https://ajtech.nl/images/2024/11/notebooklm-ollama-openwebui-feature.jpg" type="image/jpeg" />
    </item>
    <item>
      <title>Building and deploying a chatbot with Azure Functions OpenAI Extension and model GPT-4o mini</title>
      <link>https://ajtech.nl/blog/azure-functions-openai-extension/</link>
      <pubDate>Mon, 05 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://ajtech.nl/blog/azure-functions-openai-extension/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In this blog post, we will explore how to integrate Azure Functions with the OpenAI extension. This integration allows you to use triggers and bindings with the powerful capabilities of OpenAI within your serverless functions. We will walk through the setup, configuration, and deployment of an Azure Functions project that uses the OpenAI extension, using Bicep templates for infrastructure as code.&lt;/p&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;Before we begin, ensure you have the following tools and resources:&lt;/p&gt;</description>
      <enclosure url="https://ajtech.nl/images/2024/08/funcapp-openai-extension.jpg" type="image/jpeg" />
    </item>
    <item>
      <title>Azure Functions on Container Apps</title>
      <link>https://ajtech.nl/blog/azure-functions-on-container-apps/</link>
      <pubDate>Tue, 18 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://ajtech.nl/blog/azure-functions-on-container-apps/</guid>
      <description>&lt;p&gt;Recently, I created my first video about Azure Functions on Azure Container Apps, which you can find below. I also made a &lt;a href=&#34;https://github.com/arashjalalat/AzureFunctionsOnContainerApps&#34;&gt;GitHub repository&lt;/a&gt; where you can find the source code, allowing you to set up the Azure Functions on ACA yourself.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/3YbCj6o8xLk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;</description>
    </item>
    <item>
      <title>Extract text from image to AI project</title>
      <link>https://ajtech.nl/blog/extract-text-from-image-to-ai-project/</link>
      <pubDate>Mon, 18 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://ajtech.nl/blog/extract-text-from-image-to-ai-project/</guid>
      <description>&lt;p&gt;In today&amp;rsquo;s digital age, extracting text from images has become a common task in various domains, from document digitization to text analysis. Optical Character Recognition (OCR) engines like &lt;a href=&#34;https://tesseract-ocr.github.io&#34;&gt;Tesseract&lt;/a&gt; have played a significant role in making this process efficient and accessible. However, improving the accuracy and usability of OCR systems remains a challenge. In this blog post, we&amp;rsquo;ll explore (based on two examples) how to enhance text extraction from images using Tesseract in conjunction with OpenAI&amp;rsquo;s Generative AI capabilities.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Semantic Kernel with C# minimal API</title>
      <link>https://ajtech.nl/blog/semantic-kernel-with-c-minimal-api/</link>
      <pubDate>Sun, 17 Dec 2023 16:44:38 +0000</pubDate>
      <guid>https://ajtech.nl/blog/semantic-kernel-with-c-minimal-api/</guid>
      <description>semantic-kernel-with-c-minimal-api</description>
      <enclosure url="https://ajtech.nl/images/2023/12/SemanticKernel_dotnet-1.jpg" type="image/jpeg" />
    </item>
    <item>
      <title>Smooth Sailing with DevOps: Deploying Azure Storage Account using Terraform and Azure YAML Pipelines</title>
      <link>https://ajtech.nl/blog/smooth-sailing-with-devops-deploying-azure-storage-account-using-terraform-and-azure-yaml-pipelines/</link>
      <pubDate>Sun, 29 Oct 2023 21:07:50 +0000</pubDate>
      <guid>https://ajtech.nl/blog/smooth-sailing-with-devops-deploying-azure-storage-account-using-terraform-and-azure-yaml-pipelines/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Hi 👋 my fellow tech enthusiasts. As a DevOps Engineer, I often find myself navigating the complex waters of IT challenges both at work and during my free time. Today, I want to share a recent journey into the world of DevOps where we&amp;rsquo;ll be deploying an Azure Storage Account using Terraform and Azure YAML Pipelines. So, grab your virtual life vests, and let&amp;rsquo;s embark on this adventure.&lt;/p&gt;
&lt;h2 id=&#34;why-terraform-and-azure-yaml-pipelines&#34;&gt;Why Terraform and Azure YAML Pipelines?&lt;/h2&gt;
&lt;p&gt;Terraform, an Infrastructure as Code (IaC) tool, is a powerful choice for provisioning and managing cloud resources. When combined with Azure DevOps YAML Pipelines, it becomes an even more powerful force for automating deployments, ensuring consistency, and facilitating collaboration within your DevOps team.&lt;/p&gt;</description>
      <enclosure url="https://ajtech.nl/images/2023/10/ADO_Terraform_Azure-2.png" type="image/jpeg" />
    </item>
    <item>
      <title>Azure Workload identity federation with Azure DevOps</title>
      <link>https://ajtech.nl/blog/azure-workload-identity-federation-with-azure-devops/</link>
      <pubDate>Sun, 01 Oct 2023 20:09:40 +0000</pubDate>
      <guid>https://ajtech.nl/blog/azure-workload-identity-federation-with-azure-devops/</guid>
      <description>&lt;p&gt;About 2 months ago I wrote a blog post about &lt;a href=&#34;https://ajtech.nl/workload-identity-federation-with-github-actions/&#34;&gt;workload identity federation&lt;/a&gt; with GitHub Actions. When an application needs to access cloud based resources it often needs to think about authentication and authorization. Using workload identity federation there is no need to use any keys or secrets. For example, Google Cloud Platform and Microsoft Azure are providing this great feature. And now this feature has also been released for Azure DevOps! This means that organizations can now take advantage of this to provide an even more secure way to connect to Azure from Azure DevOps, or rather Azure Pipelines, via a Service Connection.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deploy VM instance with GCP and Terraform</title>
      <link>https://ajtech.nl/blog/deploy-vm-instance-with-gcp-and-terraform/</link>
      <pubDate>Tue, 22 Aug 2023 17:57:10 +0000</pubDate>
      <guid>https://ajtech.nl/blog/deploy-vm-instance-with-gcp-and-terraform/</guid>
      <description>&lt;p&gt;You probably are wondering how this website is built and where it is hosted. Maybe you already find out the answer to the first question. This website is powered by Ghost. Ghost is a free and open source blogging platform. They have 2 versions, one managed and one self-hosted. I opted for the self-hosted solution since I usually like to deep dive into IT related projects. Also I wanted to learn how to deploy a blogging website to a self-hosted platform. My blog represents my company AJTech Consulting. This blog is hosted on Google Cloud Platform (GCP) and deployed via Terraform (which is an Infrastructure as Code tool) into Docker containers. A container running the Ghost engine, one running the MySQL database and a container running the reverse proxy with Traefik. A reverse proxy is a server that accepts a request from a client and then forwards the request to another server. So basically it sits in front of backend applications. To keep the containers up-to-date and receive important updates I regularly run a script on the Linux VM.&lt;/p&gt;</description>
      <enclosure url="https://ajtech.nl/images/2023/10/website-design.png" type="image/jpeg" />
    </item>
    <item>
      <title>Azure Workload identity federation with GitHub Actions and user-managed identity</title>
      <link>https://ajtech.nl/blog/workload-identity-federation-with-github-actions/</link>
      <pubDate>Mon, 17 Jul 2023 18:01:21 +0000</pubDate>
      <guid>https://ajtech.nl/blog/workload-identity-federation-with-github-actions/</guid>
      <description>&lt;p&gt;Usually when running software workload (e.g. script or container-based applications) an identity is involved for authentication and access resources. Software workload running inside Microsoft Azure can use a Service Principal or &lt;a href=&#34;https://learn.microsoft.com/en-gb/azure/active-directory/managed-identities-azure-resources/overview&#34; target=&#34;_blank&#34;&gt;(User)-Managed Identity&lt;/a&gt;. However, when running software workload outside Azure most of the times we have to use credentials (like secrets or certificates) in order to access Azure AD protected resources such as Azure Key Vault or Azure Storage. This can pose a risk since secrets needs to be stored somewhere and regularly rotated to improve security.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to protect and discover secrets with Gitleaks?</title>
      <link>https://ajtech.nl/blog/how-to-protect-and-discover-secrets-with-gitleaks/</link>
      <pubDate>Sun, 18 Jun 2023 11:32:41 +0000</pubDate>
      <guid>https://ajtech.nl/blog/how-to-protect-and-discover-secrets-with-gitleaks/</guid>
      <description>&lt;p&gt;Detecting and discovering secrets or (hardcoded) passwords in a code repository should be an ongoing process for everyone involved in code development. But this process should not take all the time so that we have more time to contribute to good code quality. Fortunately, nowadays there are various tools that help us to automatically check that no sensitive data is present. Secrets, such as API keys and passwords are a well-known example of this. Continue reading on how you can easily do this in your local dev environment with Gitleaks.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Use (User)-managed identity with Azure Identity library to connect to Azure DevOps</title>
      <link>https://ajtech.nl/blog/use-user-managed-identity-with-azure-identity-library-to-connect-to-azure-devops/</link>
      <pubDate>Fri, 12 May 2023 10:01:04 +0000</pubDate>
      <guid>https://ajtech.nl/blog/use-user-managed-identity-with-azure-identity-library-to-connect-to-azure-devops/</guid>
      <description>&lt;p&gt;With the recently introduced &lt;a href=&#34;https://devblogs.microsoft.com/devops/introducing-service-principal-and-managed-identity-support-on-azure-devops/&#34;&gt;service principal &amp;amp; managed identity&lt;/a&gt; in Azure DevOps by Microsoft it is now possible to replace the less secure Personal Access Token (PAT) to connect to Azure DevOps resources. These resources can be accessed via the Azure DevOps API such as Work Items, Pipelines and Repositories and is used by many automated processes. An example could be to use an Azure Function app. In this article I want to show how you can connect to Azure DevOps with a user managed identity with the use of Azure Identity library. This library is recommended if you intend or if you are working with C# codebase. The user managed identity is an Azure resources which can be easily managed in Azure.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Use ChatGPT UI with your own API key</title>
      <link>https://ajtech.nl/blog/use-chatgpt-ui-with-your-own-api-key/</link>
      <pubDate>Sun, 09 Apr 2023 22:21:49 +0000</pubDate>
      <guid>https://ajtech.nl/blog/use-chatgpt-ui-with-your-own-api-key/</guid>
      <description>&lt;p&gt;ChatGPT has become increasingly popular in recent months. At the time of writing, version 3.5 is in active use by the public and the even more advanced version 4 is being integrated by large companies such as Microsoft. Compared to ChatGPT-3.5 the latest version is able to process a much larger input, up to &lt;a href=&#34;https://www.sciencefocus.com/future-technology/gpt-3/&#34;&gt;25.000&lt;/a&gt; words and makes fewer mistakes called &amp;lsquo;hallucinations&amp;rsquo;. The most convenient way to get started with ChatGPT is to register as a new user on the OpenAI website for free. However, a major drawback is the lack of performance when using the official ChatGPT UI platform with the free account. That&amp;rsquo;s a pity, because the strength of ChatGPT is the speed of generating a response. There are several options to take advantage of the high speed. You can either subscribe to ChatGPT and use a paid plan for $24 p/m or you can get started yourself by using an API key in combination with a self-hosted, open source, user interface.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to secure passwords with gopass on multiple devices?</title>
      <link>https://ajtech.nl/blog/how-to-use-gopass-on-multiple-linux-machines/</link>
      <pubDate>Sat, 18 Mar 2023 22:42:48 +0000</pubDate>
      <guid>https://ajtech.nl/blog/how-to-use-gopass-on-multiple-linux-machines/</guid>
      <description>&lt;p&gt;When we work with data we can use different ways of security. For my own project where I often use scripts on Linux machines, I figured out how to keep passwords safe. I used &lt;a href=&#34;https://github.com/gopasspw/gopass&#34;&gt;gopass&lt;/a&gt;. This is an open source UNIX password manager that uses gpg and version control with git. This means that passwords are encrypted and decrypted with gpg while keeping all the changes in a Git repository. This makes it very very flexible, because a git clone can always be made in case a new machine needs to be set up or if several devices want to use the password manager. If you are comfortable with the command-line interface keep reading, because we are going to execute multiple commands! I&amp;rsquo;m going to demonstrate these commands on a Linux (Debian OS) machine, but feel free to use another system.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automated API tests with Postman CLI</title>
      <link>https://ajtech.nl/blog/automated-api-tests-with-postman-cli/</link>
      <pubDate>Sun, 12 Mar 2023 16:51:11 +0000</pubDate>
      <guid>https://ajtech.nl/blog/automated-api-tests-with-postman-cli/</guid>
      <description>&lt;p&gt;On a project I was working on, I recently researched how to apply Postman CLI to an Azure DevOps pipeline. Postman is a powerful tool to run both manual tests and ultimately to have these tests performed automatically. For the automated tests I have actually always used Newman until now, but recently I also used Postman CLI. I believe that Postman CLI setup is easier. I assume that you have a basic understanding of Postman.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
