Browse our archives by topic…
Editions
.NET Development
View all (406)
TypeDeclaration: An Abstraction for Understanding JSON Schema
The Corvus.Json.CodeGeneration library analyses JSON Schema and builds a TypeDeclaration tree that maps schema patterns to code patterns. The code generator, CLI tool, source generator, and Blazor playground all consume the same abstraction - and you can too.
Building API Reference Documentation From Code, Part 2: Under the Hood
A deep dive into the cross-assembly linking, PDB-based source links, TFM scanning, enrichment merging, and search indexing that power our API reference documentation pipeline.
Building API Reference Documentation From Code, Part 1: The Pipeline
We generate about 8,800 API reference pages from 16 libraries across two engine versions, with source links, TFM availability badges, and hand-authored enrichments - all from a single PowerShell pipeline. Here's how.
AI
View all (14)
How to trust your AI-assisted data analysis
AI tools can produce data analysis that looks authoritative without being verifiable. Whether you're the analyst or the decision-maker relying on the output, this post outlines some practical principles for making AI-assisted analysis trustworthy.
How to Implement Generation in RAG
Understand the generation step of RAG: how LLMs use augmented context to produce grounded responses, how to enforce structured outputs with Pydantic, and how to evaluate response quality.
How to Implement Augmentation in RAG
Understand the augmentation step of RAG: how retrieved documents are structured into prompts, how metadata and citations improve response quality, and how to avoid common pitfalls like prompt injection.
Analytics
View all (171)
How to trust your AI-assisted data analysis
AI tools can produce data analysis that looks authoritative without being verifiable. Whether you're the analyst or the decision-maker relying on the output, this post outlines some practical principles for making AI-assisted analysis trustworthy.
Providing comparative context with DAX Calculated Tables under Row Level Security
Row Level Security in Power BI solves one problem (who sees what) but introduces another - comparisons across the full dataset become impossible. This post describes how Calculated Tables in DAX can provide a solution
How to Implement Generation in RAG
Understand the generation step of RAG: how LLMs use augmented context to produce grounded responses, how to enforce structured outputs with Pydantic, and how to evaluate response quality.
API
View all (18)
ASP.NET Core + Razor + HTMX + Chart.js
Build modern interactive web apps with ASP.NET Core, Razor, and HTMX — bridging HTMX hypermedia to Chart.js JSON APIs using HATEOAS-style stateful links.
How to design APIs for Accessibility
Learn how accessibility-aware API design creates a great experience for all developers, not just those with accessibility needs.
ASP.NET Core MVC authentication in Azure Container Apps
A short rundown of why you need the ForwardedHeadersMiddleware when using Azure Container Apps to host an ASP.NET Core MVC app requiring authentication
Apprenticeship
View all (61)
Guest Blog Post: Hello World! I'm Ray and I'm doing work experience.
Ray, a Year 10 student, spent a week at endjin doing work experience.
Retrospecting on my career at endjin
Liam joined endjin as part of the Software Engineering Apprenticeship 2021 cohort. In this post he looks back on his time at endjin before moving on.
Life as an Apprentice Engineer at endjin
Eli joined endjin as part of the Software Engineering Apprenticeship 2021 cohort. In this post she reflects on her first two years.
Architecture
View all (75)
The Data Product Canvas: The Theory Behind The Canvas
The Data Product Canvas fuses the Business Model Canvas with Data Mesh's 'data as a product' principle, combining visual strategic collaboration with product-minded data ownership.
The Data Product Canvas in Action
See the Data Product Canvas in action with a real-world scenario. Follow along as we work through each building block to design a high-impact, feasible data product for a national garden center chain facing revenue challenges.
The Data Product Canvas: Deep Dive into the Building Blocks
The Data Product Canvas has nine building blocks, best completed right-to-left starting with Audience and Actionable Insight, to keep data products purpose-driven and user-centred.
Automation
View all (6)
Power Query - Where can you use it? - Power BI
In this series of posts, we look at all the places where you can integrate Power Query as part of your data solutions. Here we look at Power BI.
Power Query - Where can you use it? - Microsoft 365
In this series of posts, we look at all the places where you can integrate Power Query as part of your data solutions. Here we look at Microsoft 365.
Playwright C# SDK to automate 2FA authentication for AAD and MSA
Learn to configure AAD or MSA 2FA profiles for UI automation testing with Time-based One-Time Passwords.
Azure
View all (193)
Integration Testing Azure Functions Part 5: Reqnroll in Build Pipeline
Integration testing Azure Functions with Reqnroll and C#. Part 5 covers running your Corvus.Testing specs in Azure DevOps and GitHub Actions pipelines.
Integration Testing Azure Functions Part 4: Reqnroll Configuration
Integration testing Azure Functions with Reqnroll and C#. Part 4 shows how to supply or override configuration values for the functions apps under test.
Integration Testing Azure Functions Part 3: Reqnroll hooks
Integration testing Azure Functions with Reqnroll and C#. Part 3 uses scenario and feature hooks to start functions apps and keep your BDD specs readable.
Azure Container Apps
View all (1)
Scaling API Ingestion with the Queue-of-Work Pattern
The queue-of-work pattern enables massive parallelism for API ingestion by breaking large jobs into thousands of independent work items processed by concurrent workers. This approach reduced data ingestion time for our use case from 15 hours to under 2 hours while providing automatic retry handling and fault tolerance at a fraction of the cost of traditional orchestration tools.
Azure Synapse Analytics
View all (54)
Scaling API Ingestion with the Queue-of-Work Pattern
The queue-of-work pattern enables massive parallelism for API ingestion by breaking large jobs into thousands of independent work items processed by concurrent workers. This approach reduced data ingestion time for our use case from 15 hours to under 2 hours while providing automatic retry handling and fault tolerance at a fraction of the cost of traditional orchestration tools.
Batch Processing Triggered Pipeline Runs in Azure Synapse
Bursty event triggers in Azure Synapse can fire the same pipeline repeatedly. A batched-trigger orchestrator collapses them into a single coordinated run.
Reliably refresh Semantic Model from ADF or Synapse Pipelines
This post describes a pattern for reliably refreshing Power BI semantic models from Azure Data Factory or Azure Synapse Pipelines.
Big Compute
View all (28)
What is a Data Lakehouse?
What exactly is a Data Lakehouse? This blog gives a general introduction to their history, functionality, and what they might mean for you!
Azure Synapse Analytics: serverless replacing the data warehouse
Serverless data architectures enable leaner data insights and operations. How do you reap the rewards while avoiding the potential pitfalls?
Benchmarking Azure Synapse SQL Serverless with Polyglot Notebooks
New Azure Synapse Analytics service offers SQL Serverless for on-demand data lake queries. We tested its potential as a Data Lake Analytics replacement.
Big Data
View all (23)
Medallion Architecture in Excel
Apply the Medallion Architecture to Excel: use the three-tab rule to separate raw data, logic, and output for cleaner, maintainable spreadsheets.
Scaling API Ingestion with the Queue-of-Work Pattern
The queue-of-work pattern enables massive parallelism for API ingestion by breaking large jobs into thousands of independent work items processed by concurrent workers. This approach reduced data ingestion time for our use case from 15 hours to under 2 hours while providing automatic retry handling and fault tolerance at a fraction of the cost of traditional orchestration tools.
Polars Workloads on Microsoft Fabric
Polars now ships inside Microsoft Fabric by default. Here's how to use it alongside Fabric's other analytics tools and what that means for your data workflows.
Cloud
View all (15)
Your Cloud AI SLA Tells You Less Than You Think
Traditional cloud SLAs measure API uptime, not behavioural stability. This post talks about how silent AI model drift can quietly break your agents and the questions you might want to ask vendors.
Microsoft Fabric variable libraries: best practices guide
Variable libraries in Microsoft Fabric manage environment-specific configuration. Learn where you can use them and how to set safer defaults for Dev/Test/Prod.
Ingesting SharePoint Data into Microsoft Fabric: Your Options
SharePoint isn't going away. This post compares five ways to ingest SharePoint data into Microsoft Fabric, with guidance on cost, complexity, and incremental loading.
Culture
View all (128)
Returning to work after a career break, with help from remote work
After years away, I returned to work in the UK. Here's how remote flexibility protected my mental health and made that transition possible!
Guest Blog Post: Hello World! I'm Ray and I'm doing work experience.
Ray, a Year 10 student, spent a week at endjin doing work experience.
Retrospecting on my career at endjin
Liam joined endjin as part of the Software Engineering Apprenticeship 2021 cohort. In this post he looks back on his time at endjin before moving on.
Data
View all (127)
How to trust your AI-assisted data analysis
AI tools can produce data analysis that looks authoritative without being verifiable. Whether you're the analyst or the decision-maker relying on the output, this post outlines some practical principles for making AI-assisted analysis trustworthy.
Providing comparative context with DAX Calculated Tables under Row Level Security
Row Level Security in Power BI solves one problem (who sees what) but introduces another - comparisons across the full dataset become impossible. This post describes how Calculated Tables in DAX can provide a solution
Optimising DAX: Practical Examples
The final post in the Optimising DAX series: the CALCULATE trap, variables and IF.EAGER, slicer costs, and a practical approach to isolating slow queries.
Data Engineering
View all (64)
Optimising DAX: Practical Examples
The final post in the Optimising DAX series: the CALCULATE trap, variables and IF.EAGER, slicer costs, and a practical approach to isolating slow queries.
Optimising DAX: Data Materialisation
Data materialisation is when the storage engine gives up on efficient processing and rebuilds the entire table. This post explains what triggers it, why it's expensive, and how to delay it.
Optimising DAX: The Formula Engine and Storage Engine
When you execute a DAX query, two engines divide up the work. Understanding the split between the formula engine and the storage engine is key to writing performant DAX.
Data Storytelling
View all (1)
How to Build Mobile Navigation in Power BI
This is follow guide to designing a mobile navigation in Power BI, covering form, icons, states, actions, with a view to enhancing report design & UI.
Databricks
View all (11)
Multi-layer Caching with the Decorator Pattern
Databricks SQL cold starts kill web API performance. Fix it with two-layer caching: Azure Blob Storage & IMemoryCache, using the Decorator pattern.
What is a Data Lakehouse?
What exactly is a Data Lakehouse? This blog gives a general introduction to their history, functionality, and what they might mean for you!
Notebooks in Azure Databricks
Azure Databricks Notebooks combine live code in Python, SQL, Scala, or R with visualisations and markdown. Here's how to set them up, attach clusters, manage libraries, and integrate them into ADF/Synapse pipelines.
Dataverse
View all (3)
Accessing multi-select choice labels in Synapse Link for Dataverse
Learn how to access multi-select choice column choice labels from Azure Synapse Link for Dataverse using PySpark or SQL.
How to access choice labels: Azure Synapse Link for Dataverse with SQL
Learn how to access the choice labels from Azure Synapse Link for Dataverse using T-SQL through SQL Serverless and by using Spark SQL in a Synapse Notebook.
How to access choice labels: Azure Synapse Link Dataverse with PySpark
PySpark recipe for accessing choice (option set) labels, not just integer values, from Dataverse data exposed via Azure Synapse Link in your Synapse lakehouse.
DevOps
View all (37)
Your Cloud AI SLA Tells You Less Than You Think
Traditional cloud SLAs measure API uptime, not behavioural stability. This post talks about how silent AI model drift can quietly break your agents and the questions you might want to ask vendors.
Trying Out WSL Containers: Microsoft's Built-In Alternative to Docker Desktop
Microsoft's new WSL Containers (wslc) promises container management on Windows without Docker Desktop. I tried it with dev containers, Aspire, and Docker Compose - here's what works, what doesn't, and whether you should switch yet.
Adventures in Least Privilege: When an owner isn't an owner
A troubleshooting journey through Microsoft Entra ID that reveals the subtle but critical distinction between App Registration ownership and Service Principal ownership - and why it matters for least-privilege automation.
DuckDB
View all (10)
Polars Workloads on Microsoft Fabric
Polars now ships inside Microsoft Fabric by default. Here's how to use it alongside Fabric's other analytics tools and what that means for your data workflows.
Practical Polars: Code Examples for Everyday Data Tasks
Unlock Python Polars with this hands-on guide featuring practical code examples for data loading, cleaning, transformation, aggregation, and advanced operations that you can apply to your own data analysis projects.
Under the Hood: What Makes Polars So Scalable and Fast?
Polars gets its speed from a strict type system, lazy evaluation, and automatic parallelism. Here's how each piece works under the hood.
Engineering Practices
View all (155)
Trying Out WSL Containers: Microsoft's Built-In Alternative to Docker Desktop
Microsoft's new WSL Containers (wslc) promises container management on Windows without Docker Desktop. I tried it with dev containers, Aspire, and Docker Compose - here's what works, what doesn't, and whether you should switch yet.
Rx.NET v7.0 Now Available
Rx.NET 7.0 is now available, with the potential to reduce deployable application size by up to 90MB.
Multi-layer Caching with the Decorator Pattern
Databricks SQL cold starts kill web API performance. Fix it with two-layer caching: Azure Blob Storage & IMemoryCache, using the Decorator pattern.
Innovation
View all (35)
AI Strategy: Think Top-Down, Experiment Bottom-Up
Top-down AI strategy and bottom-up experimentation both fail alone: leading organisations combine them to drive real business results.
The Data Product Canvas: The Theory Behind The Canvas
The Data Product Canvas fuses the Business Model Canvas with Data Mesh's 'data as a product' principle, combining visual strategic collaboration with product-minded data ownership.
The Data Product Canvas in Action
See the Data Product Canvas in action with a real-world scenario. Follow along as we work through each building block to design a high-impact, feasible data product for a national garden center chain facing revenue challenges.
Internet of Things
View all (14)
SQL Notebooks for Azure Synapse SQL Pools & SQL on demand
Wishing Azure Synapse Analytics had support for SQL notebooks? Fear not, it's easy to take advantage rich interactive notebooks for SQL Pools and SQL on Demand.
ArrayPool vs MemoryPool—minimizing allocations in AIS.NET
How we diagnosed unexpected allocations in AIS.NET, comparing ArrayPool<T> vs MemoryPool<T> to hit zero-allocation per-message GC targets in a .NET parsing library.
Talking about Azure Synapse on Microsoft Mechanics!
I was recently invited on to Microsoft Mechanics to talk about the new on-demand SQL Serverless offering within Azure Synapse. If you have been following along with my previous blog posts you will know that we've been hard at work applying Azure Synapse against real customer workloads. In the video I take you through the service by solving a real-world IoT problem for one of our telco customers.
Machine Learning
View all (31)
How to Implement Generation in RAG
Understand the generation step of RAG: how LLMs use augmented context to produce grounded responses, how to enforce structured outputs with Pydantic, and how to evaluate response quality.
How to Implement Augmentation in RAG
Understand the augmentation step of RAG: how retrieved documents are structured into prompts, how metadata and citations improve response quality, and how to avoid common pitfalls like prompt injection.
How to Implement Retrieval in RAG
Understand the retrieval step of RAG: Learn how database queries, keyword search, vector search, and hybrid approaches find the right information to ground your LLM responses.
Microsoft Fabric
View all (42)
Microsoft Fabric Workspace Topology Patterns
Workspace topology is one of the first decisions you'll make in Microsoft Fabric, and one of the hardest to undo once you're underway. This post will help you start with the right foundations in place.
Announcing Fabric Weekly: a free Microsoft Fabric newsletter
Fabric Weekly is a free weekly newsletter covering everything Microsoft Fabric. Sign up to stay on top of the latest features, updates, and community content.
Microsoft Fabric variable libraries: best practices guide
Variable libraries in Microsoft Fabric manage environment-specific configuration. Learn where you can use them and how to set safer defaults for Dev/Test/Prod.
Modern Compute
View all (3)
Modern Compute: Compute-Intensive Workloads
We have a wide range of computational mechanisms at our disposal, some of which emerged thanks to recent advances in AI. In this post, we look at the kinds of workloads that can take advantage of these.
Modern Compute: Unavoidable Practicalities
Thanks in part to recent advances in AI, we have a range of computational mechanisms at our disposal. However, certain universal truths apply to all of them.
After the AI Storm: Modern Compute
AI's current hype cycle has driven massive hardware investment. Even if AI disappoints, those hardware capabilities remain. What else can we do with them?
Open Source
View all (68)
Rx.NET v7.0 Now Available
Rx.NET 7.0 is now available, with the potential to reduce deployable application size by up to 90MB.
Ix.NET v7.0: .NET 10 and LINQ for IAsyncEnumerable<T>
Ix.NET 7.0.0 is now available. Because .NET 10.0 now includes LINQ for IAsyncEnumerable, Ix.NET's System.Linq.Async has had to step back. This post explains what has changed and why.
Rx.NET v6.1 Now Available
Rx.NET 6.1 is now available, adding three new features: DisposeWith, a TakeUntil overload that takes a CancellationToken, and ResetExceptionDispatchState.
OpenChain
View all (4)
Exploring OpenChain: From License Compliance to Security Assurance
Open-source software has become an essential part of many organisation's software supply chain, however, this poses challenges with license compliance and security assurance.
The OpenChain specification explained
When implementing OpenChain, understanding the specification will help guide your organisation to having processes in place to review and manage open-source software
What are the risks with open-source software?
The key risks associated with open-source software, from whether you use it minimally, to using it throughout all your systems.
Power BI
View all (79)
Providing comparative context with DAX Calculated Tables under Row Level Security
Row Level Security in Power BI solves one problem (who sees what) but introduces another - comparisons across the full dataset become impossible. This post describes how Calculated Tables in DAX can provide a solution
Top Features of Notebooks in Microsoft Fabric
Lakehouse integration, built-in notebook resources, and collaboration features that set Microsoft Fabric notebooks apart from Jupyter and Databricks.
Reliably refresh Semantic Model from ADF or Synapse Pipelines
This post describes a pattern for reliably refreshing Power BI semantic models from Azure Data Factory or Azure Synapse Pipelines.
Python
View all (27)
Fabric Performance Benchmarking - Spark versus Python Notebooks
Benchmarking Pandas, PySpark, Polars, and DuckDB on Microsoft Fabric: in-process Python engines run 4-5x cheaper and faster than Spark for common workloads.
Scaling API Ingestion with the Queue-of-Work Pattern
The queue-of-work pattern enables massive parallelism for API ingestion by breaking large jobs into thousands of independent work items processed by concurrent workers. This approach reduced data ingestion time for our use case from 15 hours to under 2 hours while providing automatic retry handling and fault tolerance at a fraction of the cost of traditional orchestration tools.
Polars Workloads on Microsoft Fabric
Polars now ships inside Microsoft Fabric by default. Here's how to use it alongside Fabric's other analytics tools and what that means for your data workflows.
Security and Compliance
View all (29)
Adventures in Least Privilege: When an owner isn't an owner
A troubleshooting journey through Microsoft Entra ID that reveals the subtle but critical distinction between App Registration ownership and Service Principal ownership - and why it matters for least-privilege automation.
No-code/Low-code is software DIY - how do you avoid DIY disaster?
No-code/Low-code democratizes software development with little to no coding skills needed. But how do you evaluate if software DIY is the right choice for you?
Exploring OpenChain: From License Compliance to Security Assurance
Open-source software has become an essential part of many organisation's software supply chain, however, this poses challenges with license compliance and security assurance.
Snowflake
View all (3)
Endjin is a Snowflake Partner
Snowflake is a cloud native data warehouse platform, that enabled data engineering, data science, data lakes, data sharing and data warehousing. Endjin are very excited to announce our partnership.
Snowflake Connector for Azure Data Factory - Part 2
Integrate Snowflake into your Azure Data Factory pipelines using custom Azure Functions. Learn how to load data and run queries in our detailed step-by-step guide.
Snowflake Connector for Azure Data Factory - Part 1
Explore the lack of a native Azure Data Factory connector for Snowflake and discover alternatives for integration between these popular platforms.
Spark
View all (5)
Writing structured data to SharePoint from Synapse Notebooks
Write data back to SharePoint from Synapse Notebooks using PySpark, the Microsoft Graph API, and Service Principal auth — Drive IDs, tokens, and upload patterns.
Reading structured data from SharePoint in Synapse Notebooks
This post describes an approach to copy files and data from SharePoint into Azure using Synapse Notebooks.
Spark dev containers: packaging code for testability
Once you've thoroughly tested your code against the local Spark service in your dev container, you'll want to run it in a real Spark cluster. This posts shows how to deploy such code to Microsoft Fabric.
Startups
View all (15)
How to Monetize APIs with Azure API Management
Explore monetizing APIs with our guide. We offer strategies, videos, and code via Azure API Management to fast-track your business model.
10 ways working with Microsoft helped endjin grow since 2010
Microsoft recently shot a video interviewing endjin co-founder, Howard van Rooijen, and Director of Engineering, James Broome, about how Microsoft has helped endjin grow over the past decade. This posts the top 10 ways in which Microsoft helped - from providing access to valuable software and services, to opening up sales channels, to helping to navigate the minefield of UK Financial Services regulations around cloud adoption.
What makes a successful FinTech start-up?
In this post we discuss the characteristics of a great FinTech startup, and the importance of the API Economy to innovation in Financial Services.
Strategy
View all (76)
Your Cloud AI SLA Tells You Less Than You Think
Traditional cloud SLAs measure API uptime, not behavioural stability. This post talks about how silent AI model drift can quietly break your agents and the questions you might want to ask vendors.
AI Strategy: Think Top-Down, Experiment Bottom-Up
Top-down AI strategy and bottom-up experimentation both fail alone: leading organisations combine them to drive real business results.
The Data Product Canvas: The Theory Behind The Canvas
The Data Product Canvas fuses the Business Model Canvas with Data Mesh's 'data as a product' principle, combining visual strategic collaboration with product-minded data ownership.
UX
View all (25)
Learning from disaster: a Titanic Power BI report walkthrough
In Paul Waller's final, and posthumously published blog post, he takes you through a creative walk-through of the Titanic Power BI Report he created with Barry Smart.
How to Build Mobile Navigation in Power BI
This is follow guide to designing a mobile navigation in Power BI, covering form, icons, states, actions, with a view to enhancing report design & UI.
Power BI Images That Pop: Intuitive, easy-to-maintain reports
Explore integrating icons, pictograms and images into Power BI in the optimal way to enhance the user experience and minimise effort required to build and maintain reports.
Visualisation
View all (18)
Learning from disaster: a Titanic Power BI report walkthrough
In Paul Waller's final, and posthumously published blog post, he takes you through a creative walk-through of the Titanic Power BI Report he created with Barry Smart.
How to Build Mobile Navigation in Power BI
This is follow guide to designing a mobile navigation in Power BI, covering form, icons, states, actions, with a view to enhancing report design & UI.
Power BI Images That Pop: Intuitive, easy-to-maintain reports
Explore integrating icons, pictograms and images into Power BI in the optimal way to enhance the user experience and minimise effort required to build and maintain reports.