From the Lab

What I build when
I set myself
the brief

None of my work over the past 30 years would have been possible without open source — and I would like to give something back. These projects hold what has accumulated over those years: insights from client work, much of which did make it into those projects. Other ideas did not, because the scope was too tight or the timing was wrong — good approaches that were left on the table. Those are the ones I finish here and release under a free licence. Not a hobby project: it is the same software that runs in my own products.

Release in preparation

HiveWeaver — Automate processes, simulate the future

Two jobs, one platform. HiveWeaver lets AI agents take on real work — handling cases, operating systems, keeping processes moving. And it lets those same agents rehearse a process harmlessly before it meets real customers. The real appeal is the combination: first the rehearsal, then your approval, then the very same thing for real.

One half is automation. Agents take on recurring tasks, reach into your systems and work through cases without anyone starting each one by hand. To keep that accountable, every step declares up front what it will do — and anything that costs money, cannot be undone or touches sensitive data waits for explicit approval. No agent spends money unnoticed. The other half is the preview. How will an audience react to a campaign before you release the budget? Where does a process break when people do not use it as designed? For that, HiveWeaver populates a situation with hundreds of agents that have roles, react to one another and decide — realistic, but without consequences. And the two interlock: a process first runs as a rehearsal, you see the likely outcome, you approve — and the very same process then does the work for real. It stays affordable because most decisions need no language model at all, just plain rules; the model steps in where it earns its price. Which model does the work is your choice — a major provider or one on your own hardware. HiveWeaver runs on your infrastructure, not in someone else's cloud.

What sets it apart

  • Agents that actually act: they operate your systems and work through cases instead of merely making suggestions.
  • Approval where it counts: anything that costs money or cannot be undone waits for your explicit yes.
  • Rehearse first, commit second: the same process first runs without consequences — you see the outcome and decide whether it should run for real.
  • Traceable and affordable: for every action you can tell why it turned out that way and what it cost; simple decisions run as rules rather than expensive model calls.
  • Stays in-house: runs on your own infrastructure with the language model of your choice, including a local one.

Technology

  • .NET
  • .NET Aspire
  • Microsoft Orleans
  • PostgreSQL
  • SignalR
  • Angular
  • LoomWeaver
Licence
Apache-2.0

The source code is currently being prepared for release. Once the repository is open, the link will appear here.

What you can rehearse before it counts

An announcement that could backfire. You describe your plan in one sentence and add a few of your own documents — market analyses, reactions to earlier decisions, feedback from retailers. From that, HiveWeaver builds the audience itself and plays the announcement through. The bundled example is a manufacturer who will no longer include a charger in the box: how does that land, and with whom does it land worst?

A vote before the vote. Five thousand citizens in different circumstances, plus a handful of voices with reach. The same policy is played through in three versions — in the example a four-day week, a congestion charge and school uniforms. In the end you see not only which version carries the most people, but also which argument sinks the others.

A campaign across several channels. The same content as a video, as an image campaign and as a professional post, each against the audience that actually spends time there. Or, a size up: ten thousand traders betting on an outcome — the likely price settles by itself, without anyone setting it.

What all of these have in common is that you end up not with a gut feeling but with a written result and its reasoning — plus the ability to read back every individual reaction that led to it.

Where it goes beyond a single AI assistant

Adding appointments, answering and sorting emails, sending a summary at six in the morning: HiveWeaver handles that too, and the matching flows ship as ready-made examples. It is simply not what sets the platform apart from other systems — plenty of tools solve those tasks by now.

The difference shows where many cases run at once and influence one another. Take a wholesaler's complaints handling: hundreds of cases a day, dragging on for weeks, with queries, partial deliveries and escalations. In HiveWeaver every case gets its own agent that accompanies it from beginning to end and remembers what has happened so far — no context that has to be reassembled on every call. Alongside them stand roles: a reviewer, the specialist department, the approver. They talk to each other instead of working through a rigid chain.

A case where nothing is happening right now costs nothing. That is why ten thousand of them can be open at the same time without the bill exploding. This is precisely the difference from an assistant you pay per call and that forgets what it was about after each one.

The real advantage, though, comes earlier. Before a single real customer is affected, you run that same process against invented customers — including the awkward kind who fill the form in wrongly, chase three times and cancel in the end. You see where it jams, improve it, and only then switch to live operation. It is the same process, not a test version of it. With an off-the-shelf assistant you go live and hope.

On top of that come the things such projects usually founder on inside a company: everything can stay in-house, language model included. Every step is provable after the fact — who, when, why, at what cost. And anything that costs money or cannot be undone waits for approval instead of simply happening.

What it costs — and how you steer it

In AI projects it is usually not the technology that becomes the problem but the invoice at the end of the month. That is why HiveWeaver settles up front which decision may consult a language model and which may not.

An example from the bundled scenarios: on a marketplace the market maker calculates by fixed rules — it needs no model to match supply and demand. Only the traders, who are meant to read a mood, actually ask. The bulk of operations therefore costs nothing.

The same distinction works within a single run: the few voices with reach get the expensive, careful model — the thousand listeners in the audience get a cheap one. The result stays meaningful, the bill stays manageable.

And because what every single step cost is recorded, after the first run you can see in black and white where the money goes — instead of finding out at the end of the month.

Released

LoomWeaver — Workbenches that grow with your product

Many business applications are, at heart, a workbench: several things open at once, panes side by side, a command palette, settings. And sooner or later customers, partners or your own community want to add something — without anyone touching the core to make room. LoomWeaver provides exactly that frame for Angular applications: the surface that takes in extensions safely, and the contract every extension keeps to. HiveWeaver's user interface runs on it.

What you would otherwise build afresh in every product, LoomWeaver brings along: panes that split and pop out into their own windows, named workspaces, shortcuts and a command palette, theming, sign-in, the question about unsaved changes. Domain logic, on the other hand, the platform has none. The actual product is assembled from extensions — I call them weavers — composed into a distribution. And your own user interface goes through the same door a stranger's extension does: there is no privileged interface for the maker, which is the only reason a published contract cannot quietly rot. Letting outside code in comes with three rungs of trust: composed in, isolated in its own frame, or installed at runtime from a catalogue with a consent the user grants and revokes themselves. Every capability is denied until it is explicitly granted. And because every action is registered only once, it is at the same time a button, a shortcut, a palette entry and a tool for an AI agent, one that never reaches further than the person at the keyboard. LoomWeaver ships no server: settings, working state and sign-in connect to your own backend, whatever stack it runs on.

What sets it apart

  • A finished workbench: splittable panes, tabs, command palette, workspaces and theming — the parts you would otherwise rebuild in every product.
  • Extensible without a rebuild: your own user interface and third-party extensions use the same contract; there is no privileged door for the maker.
  • Trust in three rungs: composed in, isolated in its own frame or installed at runtime — every capability stays denied until it is explicitly granted.
  • AI agents built in: every registered action is available to an agent that never reaches more than the person at the screen.
  • Written down for assistants: the platform is documented in machine-readable form, so an AI assistant builds on it with tools rather than guesses.

Technology

  • Angular
  • TypeScript
  • Nx
  • Tailwind CSS
  • AG-UI
  • Model Context Protocol
Licence
Apache-2.0

What a product ships before its first extension

An empty distribution is already a complete workbench. A rail with the tools on the left, panes in the middle that split by dragging and pop out into their own window, tabs inside them with preview and pinning. On top of that, named workspaces that capture a whole way of working, a command palette, quick open, settings with permissions, and a catalogue from which users install extensions.

Everything a person does there by hand, your own code can do as well: every pane, every workspace, every switch is at the same time a service the product itself calls. Turn a built-in control off and offer the same action from your own toolbar. A switch removes the control, never the capability.

The user interface runs without a backend. Where there is one, it reaches it through three narrow ports: settings, working state and sign-in. Which technology sits behind them is of no concern to the platform.

Screenshot of a LoomWeaver workbench: a narrow tool rail on the left, two panes split side by side with tabs in the middle, a status bar at the bottom
Two panes side by side, split by dragging. Rail, panes, palette and status bar belong to the platform; what appears inside them comes from extensions.

Three rungs of trust instead of one switch

A good tool sparks ideas, and some users would build them themselves if they could. They cannot, because there is no way in. Opening one means isolation, permissions, a catalogue, updates and an interface you promise not to break. That is not a feature, that is half a year of work.

LoomWeaver distinguishes three rungs. Your own extensions run composed into the product. Someone else's code runs isolated in its own frame with no reach into the page, written in whatever framework they like. And from a curated catalogue users install at runtime themselves, after a dialog that lists the capabilities requested. What the user has allowed, the user can also revoke, disable and remove.

All three rungs use the same contract behind the same broker, which denies every capability until it is explicitly granted. Moving an extension down a rung is a decision about trust, not a rewrite.

Screenshot of the install dialog for an extension from the catalogue: it lists the two capabilities requested and offers Cancel and Install
The consent dialog before installation: which capabilities the extension demands is settled before the click, not after.

An agent never reaches further than the person

In LoomWeaver an action is registered exactly once. From that come the button, the shortcut, the context menu and the palette entry, without anyone maintaining four lists. With a single flag the same action additionally becomes a tool for an AI agent. There is no second list of tools beside the first, so it cannot drift apart.

For the link to the agent, LoomWeaver relies on AG-UI, an open protocol between an application and an agentic backend that is not mine. A backend that speaks it drives the product with nothing in between, and the other end can be swapped. Which model does the work, which transport, which key: that remains your decision.

Every call passes through the same seam a click does, so the agent inherits the capabilities and the access rules that already apply. A refusal reads the same whatever its reason, so nothing can be learned about what is installed by asking. If the person says no, the workbench is never asked.

Screenshot of a LoomWeaver workbench with a quote open; beside it an assistant panel showing the tool call that opened it, the workbench's answer, and a second call that was declined and never ran
The result on the left, the path to it on the right: one call executed, one declined. The declined one never reached the workbench.
Released

Stratara — The framework for modern software solutions

Every larger business application raises the same questions. How does an input reliably reach the database? How do reports keep pace with the data? How do multi-step processes finish cleanly, even when something goes wrong along the way? Who is allowed to do what? Stratara brings these building blocks ready-made and matched to one another, instead of assembling them from four separate libraries.

The individual building blocks are nothing special — the .NET world offers each of them several times over. The effort lies in fitting them together: every library follows its own release rhythm, and the seams between them come back to bite you after a year or two. In Stratara everything belongs together and moves forward together. Three things mattered most to me. First, speed: the application should not wait while writing happens in the background, and as load grows the work should spread across more machines rather than a bigger one. Second, traceability: every operation stays fully recorded, and anyone changing the database behind the application's back is exposed at the next check. Third, data protection from the outset: even a system that forgets nothing must be able to erase personal data on request — so Stratara deletes the key rather than the data, making it unreadable even in old backups. I built Stratara for my own products because I wanted all of this to be the normal case, not an expensive add-on. That is why it carries the MIT licence — free to use, commercially too.

What sets it apart

  • All of a piece: inputs, operations, reporting, multi-step processes and sign-in interlock and are maintained together.
  • Grows with the load: as traffic rises the work spreads across more machines — no rebuild, no bigger box.
  • Audit-ready in production: every operation stays traceable, and changes made behind the application's back are exposed.
  • GDPR without a break: personal data can be erased without destroying the history — right into old backups.

Technology

  • .NET
  • PostgreSQL
  • Entity Framework Core
  • RabbitMQ
  • Azure Service Bus
  • OpenTelemetry
Licence
MIT

How an operation travels through the system

An input is not processed on the spot — it is accepted and acknowledged. The interface gets its confirmation within milliseconds and does not wait for writing, checking and reporting to finish in the background. To the user the application feels responsive even when there is a lot to do behind the scenes.

The actual work is distributed by a message bus to workers that share the load between them. As demand grows you put more workers next to them, on the same machine or on additional servers. That is the difference between "we need a bigger machine" and "we start three more instances", and it decides your cloud bill later on.

So that multiple workers do not get in each other's way, the data streams are fixed across 4096 partitions. For any single business case exactly one worker writes — across different cases everything runs in parallel. Reporting is then actively notified rather than polling in a loop to ask whether anything is new. That is why read data is virtually up to date without a database being queried constantly for nothing.

Flow diagram: inputs from the interface, a background job and an AI agent go to a message bus that distributes the work across several worker nodes; these write into the event store with 4096 partitions, which actively notifies the projections
The path of an input: acknowledged immediately, distributed across any number of workers in the background, finally handed to the projections without polling.

Why it stays fast even with large volumes

In .NET methods are often invoked dynamically — convenient for the developer, but every single call costs something. On a business case with ten entries you will not notice. On one that has grown over years it adds up with every entry. Stratara therefore translates these call paths once into a fixed function and then calls it directly. What has been resolved once stays resolved.

The effect is measurable. A business case with a million entries is rebuilt completely in a good eleven milliseconds — and memory use stays constant at 64 bytes regardless of length. Put differently: no garbage is produced for the memory manager to clean up later, however long the history grows.

The numbers come from a fanless MacBook Air, not from a tuned server. They are conservative rather than flattering — and you can re-measure them yourself, the benchmark project is in the repository.

Benchmark table: 10,000 entries in 0.11 ms, 100,000 in 1.13 ms, 1,000,000 in 11.6 ms — memory use stays at 64 bytes in all three cases
Time grows linearly with volume, memory use does not at all — a hundred times the data, the same 64 bytes.

When someone tampers with the data after the fact

Every entry carries the fingerprint of the one before it. If an amount is later changed directly in the database — through a faulty migration, a restored backup, or deliberately — the recalculated fingerprint no longer matches the stored one. The next verification pass does not merely report that something is wrong, it names the exact position.

A chain like this on its own will not stop someone with full database access who simply recalculates every fingerprint. That is why a checkpoint can be anchored outside your own infrastructure at regular intervals. Stratara records that point; you connect the external source. I would rather say this plainly than promise more with the word "immutable" than the technology delivers.

Comparison of two chains: above an untouched chain of three entries whose fingerprints match; below the same chain in which an amount was changed from 50 to 5,000 — from that entry on the fingerprints no longer match
Above the untouched chain, below the same one after a silent edit: the break becomes visible at exactly entry 2.

Erasing without destroying the history

Anyone wanting to truly remove one person's data would have to catch it everywhere at once: in the history, in every report derived from it, in intermediate states, in every copy and in every backup ever taken. Within the statutory 30-day window that is barely achievable in a provable way — one overlooked backup is enough.

Stratara turns the task around. Each data subject's information sits under its own key. A single call destroys that key, and with it every copy becomes unreadable in one go — including those nobody can technically reach any more. The history stays complete, but the person can no longer be reconstructed from it.

The same mechanism carries two further topics: it separates different customers' data cryptographically, and it provides the key management that auditors ask about under SOC 2 and ISO 27001.

Diagram: one call destroys a person's single key; as it is the only key that decrypts the data, history, snapshots, backups as well as replicas and exports all turn into permanent noise at once
One call, one key — and every copy becomes unreadable at the same moment, backups included.
Working together

The same care
for your project

These projects are the most honest work sample I can offer: you can read the source, follow the decisions and judge for yourself whether you like what you see. That is exactly how I approach client work too. Tell me about yours.