Benny Emmers

Software architect and lead developer · .NET, Azure, integration

Brasschaat, Belgium Dutch (native), English (fluent), French (basic) bennyemmers@benlar.be winkelduel.be Nederlandse versie

Profile

Architect and lead developer, .NET since 2002. Thirty-one years in software, the last four at Overseas, where I moved a Navision landscape to Business Central online and own the integration platform around it.

What I look for is code that outlives its author. Isolation between services, and plugins that add functionality without touching anything that already runs. Several systems I designed are still in production after more than five years, which is the only measure of architecture I trust.

In most of the teams I have worked in I ended up leading the group. Three former colleagues have called me their mentor, and one of them wrote it in public, crediting the step from medior to senior developer. That is the part of the work I would keep if I had to choose. Since April 2026 I also build and ship WinkelDuel on my own, a price comparison product for Dutch and Belgian supermarkets.

Everything up to WinkelDuel I wrote by hand. WinkelDuel is where I work with coding agents, and where an LLM sits inside the product as a component, so I have now built software both ways and can say what each one costs.

Current focus · autumn 2026

Embeddings on pgvector went live this month for the product matching across twelve shops. The extension runs on the Postgres that was already there, with a vector column and an HNSW index on cosine. The model is multilingual at 384 dimensions and generates locally through ONNX inside the process, which holds the cost per lookup at zero. Embeddings select the candidates, the rules that were already there do the hard filtering. Size and quantity stayed rule-based, because embeddings cannot reliably tell 1 L from 1,5 L and a wrong size makes the entire comparison wrong. A GTIN match keeps precedence over both. I measured the old rules first against an evaluation set of a few hundred confirmed matches, so what it gained is a number instead of an impression. Since June, an Aspire AppHost over the WinkelDuel API and Postgres with the existing telemetry arriving in the dashboard. The MAUI project hangs in the AppHost as well, so a single trace runs from a tap in the app through the API down to the query on Postgres. Plus Docker, and the Bicep that Aspire generates for Container Apps.

Career

Sept 2022 to now

Overseas

Azure and integration architect

Distribution for tax-free shops at airports and on cruise ships. A team of three, two of us developers, so the work here does not divide into neat roles.

Bluebird · from a weekly price mail to the B2B web shop

It started as the weekly price-change mail. Sales sees the coming changes on Tuesday and can still intervene, customers get the new prices on Thursday. That foundation became Bluebird, the B2B shop most Overseas customers order through today, replacing a Python version that had reliability problems. Angular front end, ASP.NET Core API, orders landing in the ERP. It ran on our own servers first and moved to Azure later. After the Business Central migration the price sync moved to Azure Functions and runs in two steps over two queues: one message per customer to fetch prices, then the result onto a second queue that writes to the database. Splitting it there is what buys both the throughput and the reliability, because a failure retries one step instead of the whole run.

Overseas Integration Platform

Once Bluebird stood, I started replacing the many separate applications that talked to Navision directly. Some were Python, others were built inside SQL itself, and nothing was shared between them. The platform reuses what Bluebird already had, the ERP sync above all. It is a message-based SOA on NServiceBus with three endpoints: one for Business Central, one for outbound messages and one for inbound. The two message endpoints speak whatever the other side speaks, REST, FTP and XML among them. The endpoints are hosted as Windows services on our own servers, which is where this one stays. One plugin per integration, each in its own folder with its own assemblies, so a new flow ships without touching what already runs, and the deployment pipeline follows that same structure. It replaced Boomi. Reliability was the whole point, and the messaging is what buys it. Anything that fails on a temporary cause stays put and can be replayed once the cause is gone, whether that was a database connection that dropped or a bug we only fixed the day after. Nothing is lost because a system happened to be down at the wrong moment. When something does fail the developers get a mail with the diagnosis, usually before a user has noticed.

Projects hanging off the platform

Over a dozen integrations run on it as plugins: EDI, WMS, OrderEye, Slim, Multiscan, Rio, Entra ID sync for external BI users, Jira ticket creation, warehouse scan, bank statement scan, Stream, Zetes, ASN export, and more since. Multiscan is one of the more physical ones, a device that measures items in three dimensions, with a Blazor screen in front of it and a Python solution behind it that it replaced. Each of these is a plugin rather than one more application with habits of its own.

Navision to Business Central online · live 2025

Drove the migration end to end and did the AL extension work inside Business Central as well as the .NET side. Six companies run on it today. A SaaS tenant has no back door, so every integration had to move onto the official APIs. That rework landed without a functional freeze, because the endpoints were already isolated behind their own contracts. The migration is the clearest return I have had on architecture that was set up years earlier.

Document recognition · where it started

Warehouse documents first. Find the barcodes on a scanned batch and split it into separate documents along them. Bank statements came next and asked for more: extract enough from each page to file it against the right bank account. A few thousand of those two in total. Between them they are where we learned how extraction actually behaves, which is what made the next one affordable.

OrderEye · sales and purchase documents

Built on what the warehouse and bank statement work taught us, with Azure AI Document Intelligence doing the reading. On the sales side it creates the sales order in Business Central and reports back to the customer every line where the price in their own document differs from the real price in BC. On the purchase side it checks what the vendor sent against what BC holds. The user sees at a glance which lines disagree and corrects them by hand, and those corrections go back to BC. Business Central keeps a trace of everything OrderEye handled. A few hundred invoices a month go through it. It does not run the other two extractions, it inherited their principles.

  • Bluebird and the integration platform share a large body of code through internal NuGet packages. One uniform way of working covers everything built here, so a fix in a shared library arrives in both. Both sit on .NET 10 today, migrated up from 8.
  • Set up Azure DevOps and the release pipelines for both applications. Staging runs on our own servers for both. In production only Bluebird sits on Azure, the integration platform stays on premise.
  • Observability follows that same split. On premise a middleware catches the logging and the unhandled exceptions, and it is that middleware the developer mails come out of. What runs on Azure reports into Application Insights. Every API is described in Swagger.
  • The code follows OWASP, and the secrets sit in Key Vault instead of in configuration. Personal data falls under GDPR, so anonymisation is designed in wherever the data does not need to stay identifiable.
  • Alongside the development work I administer the Azure environment: the resources, the users on the tenant, the cost, and the support when somebody cannot get in.
  • Gave the training when the platform was new, and I review the technical design choices of the other developer.
  • Per environment a different object graph in the IoC container, so staging and production differ in configuration rather than in code.

.NET 10, ASP.NET Core, Blazor, Business Central (AL), Azure App Service, Azure Functions, Azure Storage queues, Azure Blob storage, Application Insights, Entra ID, Azure AI Document Intelligence, NServiceBus, EF Core, SQL Server, Angular, REST, Swagger, SOAP, FTP, XML, Azure DevOps, OAuth 2

Apr 2026 to now

WinkelDuel

Founder and developer

Price comparison for Dutch and Belgian supermarkets. Live in the Microsoft Store, on Google Play and in the App Store.

  • Twelve shop adapters over public REST and GraphQL APIs, with a Playwright-driven Chromium for the shops that sit behind Akamai or Imperva.
  • One Blazor Hybrid UI running on Windows, Android and iOS through .NET MAUI. The API is ASP.NET Core on Azure App Service with PostgreSQL and EF Core.
  • Product matching is layered: the shop's own GTIN when there is one, then rules, then a cached and validated LLM fallback for titles that refuse to line up. Since August 2026 embeddings on pgvector sit in that stack as well, hybrid with the rules, on a local ONNX model of 384 dimensions behind an HNSW index on cosine.
  • Telemetry is my own pipeline instead of a third-party SDK, since June through OpenTelemetry into the Aspire dashboard. A price comparator that ships user data to an ad network has nothing left to sell. Passwords are salted and hashed, and the local secrets sit behind DPAPI.
  • Everything from the store submissions to the privacy statements is mine, which is a different kind of work than architecture and worth having done once.

.NET 10, .NET MAUI, Blazor Hybrid, ASP.NET Core, PostgreSQL, EF Core, Azure App Service, REST, GraphQL, Playwright, OpenTelemetry, pgvector, MSIX, Google Play, App Store

Mar to Sept 2022

Atlas Copco

Azure technical architect

Industrial tools and equipment.

  • Maintained and extended the Hybrid Integration Platform, with Azure API Management at its centre and Entra ID for OAuth and policy. HIP is the infrastructure and governance the Atlas Copco community uses to build and find integration services.
  • Set up HIP 2.0 and an ESB application.
  • Guided and reviewed the technical work of an offshore team in India.

Azure API Management, Entra ID, Azure DevOps, .NET 6, OAuth 2, EF, REST

2015 to 2017 and 2018 to 2022

Biocartis

.NET technical architect

Molecular diagnostics for personalised medicine.

  • Set up the SOA architecture for Idylla Explore, which collects and reprocesses the data from tests customers run on the Idylla instrument, and checks new recipes against existing data. A database per service, IdentityServer for security, NServiceBus between services, AngularJS on the client.
  • Extended it with a report generator that QA uses to release or reject a batch of cartridges. One plugin per cartridge type, so a new cartridge on the market means a new plugin and nothing else.
  • Wrote the shared architecture libraries and distributed them as NuGet packages, and built the backend for the apps meant to replace the instrument console.
  • Worked on the ALM on TFS and Azure VMs: continuous integration, nightly builds, unit, integration and system tests, StyleCop and dependency scanning. Coached the other developers into SOLID and into working with NServiceBus.
  • Test and customer data falls under GDPR. Anonymisation was part of the design wherever the analysis did not need to identify anyone, and the code followed OWASP.

ASP.NET Core, OAuth 2, IdentityServer, EF, SOA, NServiceBus, REST, AngularJS, React, Electron, DDD, TDD, Git, Scrum, CosmosDB, Aspose Words, xUnit, FakeItEasy, Azure VMs

Earlier career

Condensed. Full detail on request.

May 2017 to Feb 2018
Xerius · Lead developer and scrum master

Led the team responsible for career advice and built the Azure backend behind an existing ASP.MVC and AngularJS application, on Functions, Service Bus and Azure SQL, with DDD, CQRS and event sourcing. Releases went out through Octopus Deploy. Coached the developers into SOLID.

May 2010 to Mar 2015
E'gemin · Lead developer and architect

Set up the architecture and the development environment for warehouse automation and automatic guided vehicles. Independent services over NServiceBus, databases generated from the domain entities, SignalR to the client, and WPF MVVM widgets composed by a workflow. Ran the research and the proofs of concept behind those choices, and set up ALM on Git, Stash and TeamCity.

Nov 2008 to May 2010
The Agile Factory · Senior component developer

ASP.NET front end on an IBM FileNet backend. Designed and built WebDav support and a pluggable help system, and carried installation and support for the Dutch province of Limburg.

Nov 2007 to Nov 2008
Red Cross, via Inter Access Belgium · Lead developer and architect

Led six developers on course automation with three clients: web, ClickOnce and offline. Owned the technical decisions and reported to the project manager.

May 2005 to Nov 2007
Habufa · Senior developer

Technical and analytical advice on the application replacing the ERP system of this furniture wholesaler. Built the DotNetNuke CMS behind the Henders and Hazel website so non-technical staff could maintain it.

Nov 2006 to Jan 2022
All Remote Systems · Analyst and developer, own product

Track and trace. A GPS unit in the vehicle sends position over GPRS, the owner sees the fleet on a website, with reporting, time registration and recovery after theft.

Feb 2000 to May 2005
Bluestar-IT · Architect and developer

Ten assignments from this Dutch consultancy, including Electrabel, Interpolis and PwC, alongside work on Reflex, their own .NET reservation product.

Aug 1999 to Feb 2000
Bayer Antwerp, via Real Software · Developer

Replaced the separate departmental trackers for commissioning a new production plant with one shared overview.

Aug 1995 to Aug 1999
Tokheim · Software engineer

GUI in C and C++ on OS/2 giving petrol station staff everything on one screen.

Technical skills

Level on a 1 to 9 scale, my own assessment. Rows marked Currently are in daily use. The Azure row covers App Service and Web Apps, Functions, Storage queues, Blob storage and Application Insights, alongside administering the tenant, the resources and the users. Observability means a logging and exception middleware on the on-premise side, Application Insights for what runs on Azure, and OpenTelemetry since Aspire.

Languages and platform

C#
9
24 years
Currently
ASP.NET Core
8
7,5 years
Currently
ASP.NET
8
19 years
Currently
Blazor and Blazor Hybrid
8
10 months
Currently
.NET MAUI
7
4 months
Currently
WCF and SOAP
7
7 years
Currently
WPF
7
5 years
June 2015
Windows Workflow Foundation
7
3 years
March 2015
C and C++
4
4 years
August 1999

Architecture and method

SOA architecture
9
16 years
Currently
SOLID and design patterns
9
16 years
Currently
NuGet and library development
9
16 years
Currently
REST(ful)
8
10 years
Currently
Swagger and OpenAPI
8
9 years
Currently
Observability
8
9 years
Currently
TDD
8
11 years
Currently
DDD
8
11 years
Currently
C4 model
8
4 years
Currently
Secure coding and OWASP
8
11 years
Currently
GDPR and data protection
7
8 years
Currently
Leadership and soft skills
8
21 years
Currently
Scrum and agile
8
10 years
September 2022

Azure and cloud

Azure
8
8 years
Currently
Entra ID (Azure AD)
8
6,5 years
Currently
OAuth 2
8
9 years
Currently
Azure DevOps
7
7 years
Currently
Aspire
7
3 months
Currently
Docker and containers
7
3 months
Currently
Bicep and infrastructure as code
7
3 months
Currently
Azure API Management
8
6 months
September 2022

AI in production

Agentic development with coding agents
6
4 months
Currently
Azure AI Document Intelligence
7
1 year
Currently
LLM integration, structured extraction
6
4 months
Currently
Embeddings and vector search (pgvector)
6
1 month
Currently

Messaging and integration

NServiceBus
8
15 years
Currently
SignalR
7
2 years
March 2015

Data

MS SQL Server, design and implementation
8
24 years
Currently
EF and EF Core
8
13 years
Currently
PostgreSQL
7
4 months
Currently

ERP and business platforms

Business Central and Navision, including AL
7
4 years
Currently
DotNetNuke
7
19 years
January 2024
Aspose Words
7
2 years
March 2022

Front end

Angular, React, Vue.js, advanced CSS
6
9 years
Currently
ASP.MVC
5
4 months
March 2015
Infragistics and Telerik
6
1 year
March 2016

Tooling and other

Git
8
10 years
Currently
Jira, Confluence, Stash
7
8,5 years
Currently
Octopus Deploy
5
3 months
February 2018
Playwright and browser automation
7
4 months
Currently
AOP and PostSharp
6
6 months
November 2015
SEO
7
2 years
January 2012

Education and certification

Industrial engineer, electronics with a computer science specialisation 1995

Hoger Instituut der Kempen

MCP id 3067622

References

A referee from Biocartis on request, and others if you want more than one.