Notes from building a metadata-driven framework
Deep dives on Angular, .NET, metadata, RAG over codebases, workflow engines and the architectural choices behind WUIC. Long form, no fluff.
The graph is the source of truth: shipping an embeddable workflow engine
How we built a workflow engine into a metadata-driven Angular framework — why the visual graph stays the single source of truth, and how assisted authoring keeps non-experts productive.
Teaching a local coding agent from its own mistakes: DPO on a 30B model
Our VS Code assistant was passing every test on its curriculum — which meant the curriculum had stopped measuring anything. Here's how we built honest eval sets, found two silent contaminations in our test bench, and used Direct Preference Optimization on the assistant's own redirect pairs to teach a 30B model to pick the right tool on the first try. Five OutOfMemory crashes, one counterintuitive fix, a clean 4-hour training run — and a pre-registered eval gate whose verdict we report as measured, including the part that failed.
Running the WUIC assistant on a local LLM: Ollama, an MCP server, and a free agentic VS Code
We moved the generative half of our RAG chatbot off a paid cloud API and onto a local model served by Ollama on a GPU box — and exposed the same WUIC knowledge to Cline and Continue in VS Code through a tiny MCP server. This is the architecture, the one hard problem (tool-calling), the measured results, and an honest accounting of what a local LLM costs you in quality and latency to save you in money and privacy.
The chatbot's toolbox: the actions an LLM can apply to your app
Our in-product chatbot doesn't just answer questions — it proposes concrete changes to a running app through a typed toolbox, the same function-calling idea behind MCP. Toolbar buttons, validations, computed columns, conditional styles, even SQL fragments. Every proposal is a chip with an Apply button. This post walks the catalogue, one tool at a time, with the prompt that triggers each.
The architecture of an in-product RAG chatbot: from your prompt to the answer
A closed-source codebase chatbot that cites real source files: hybrid BM25 + bge-m3 retrieval, a LoRA-fine-tuned cross-encoder, Claude for synthesis — and a serving stack that moved off Python onto native .NET/ONNX. This post follows a single prompt end-to-end, from the moment you hit send to the cited answer, and explains the architectural choices behind each step.
CrmApp: a free CRM you can install in 10 minutes (and own forever)
CrmApp is the first of three free apps we ship on top of WUIC. Customer pipeline, opportunities, activities, role-based dashboards — no subscription, no per-seat fee, no data going to a third-party cloud. The download is a single ZIP. This post covers what's inside, who it's for, and the licensing rule (spoiler: free unless you recompile).
FatturazioneElettronica: a free Italian e-invoicing app with SDI integration
FatturazioneElettronica is a self-hosted FatturaPA / SDI integration: invoice editor with a full quote-to-invoice document cycle, CADES-BES signature, XSD validation, five interchangeable SDI providers (DirectPec free, ArubaPec / FatturePec / PecIt / Notarify commercial), conservation pipeline. Free distribution, runs on your own SQL Server.
FlottaMezzi: a free fleet management app with geolocation, maintenance deadlines and cost rollups
FlottaMezzi is the third free app on WUIC: vehicle and driver registry, deadline tracking (driver license, insurance, inspection) with a daily scheduled scan, GPS position feed with live map and per-day route playback, per-vehicle cost roll-ups (maintenance, fuel, claims) and dashboards. Free as-shipped, runs on your own SQL Server.
Building reports without code: SQL view to .mrt to printed PDF in one route
WUIC's report engine binds a Stimulsoft .mrt file to a metadata route. Write a SQL view, scaffold it, point the .mrt at the route, drop the route into a menu — the report runs in the embedded viewer with the right data, right filters, and right permissions. No per-report TypeScript, no per-report backend code, no separate auth layer.
The dashboard designer: drag-and-drop that writes JSON metadata, not Angular code
Most low-code dashboards are exported to a proprietary binary or compiled to a per-tenant Angular bundle. WUIC ships an in-browser designer (palette + canvas + property panel) that writes a single JSON column (dom_board.boardcontent) plus per-board CSS sheets (dom_board_sheet) and the runtime renders it without recompile. This post explains the designer UX, the palette of components, the CSS attachment story, and the one trade-off we made about Angular markup inside the JSON.
Mobile-first auto-layout with zero config: how WUIC reflows enterprise tables on a phone
Most enterprise UIs are desktop-only. WUIC's list-grid and edit-form switch to mobile layouts automatically below 768px — table becomes card stack, multi-column form becomes vertical flex, no per-screen template, no per-column responsive flag. This post explains the exact split between runtime template swap (TS) and CSS-only reflow (SCSS) and why we picked that split.
WUIC on Linux, natively: one binary, four DBMS choices, one shell installer
WUIC ships a native Linux deploy on Ubuntu 22.04: .NET 10 + Kestrel + systemd + nginx, with provider drop-in for SQL Server, MySQL, PostgreSQL and Oracle. Same WuicCore.dll on Windows/IIS and Linux — for non-MSSQL DBMSs the runtime loads one satellite provider DLL alongside it. This post walks through the install one-liner, what each DBMS variant actually does on Linux, and what's still Windows-only.
From SQL table to working CRUD form in 30 seconds: a metadata-driven scaffolding approach
How WUIC turns a CREATE TABLE statement into a complete CRUD UI — list, edit form, validation, lookup widgets — without writing a single TypeScript file. How the built-in scaffolder works, what it inspects, and what it skips.
Why we built a metadata-driven Angular framework instead of using Retool
Honest origin story behind WUIC: the moment Retool stopped scaling for our team, the tradeoffs we weighed, and what we did instead.