Home/Services
Services
Software development, and everything it depends on.
We build business applications in C# and .NET. Where the data underneath is the hard part — too large, too messy, or too important to handle casually — we take that on too, and we keep the whole thing running afterwards.
01 — Software development
Applications built to still make sense in fifteen years
The bulk of what we do. Over twenty years of commercial development sits behind it, and our crime analytics platform has been in continuous service since 2011 — which is the only way to find out whether the decisions taken at the start were the right ones.
C#, .NET and ASP.NET Core MVC
Authentication, subscription billing, admin tooling, search, content, document generation and all the unglamorous parts in between. We work in ASP.NET Core MVC on .NET 10, with SQL Server behind it, and we have shipped applications at every size from a single-purpose tool to a platform of 40 controllers and 238 views serving thousands of paying subscribers.
Layering is not decoration. Domain models, data access, services and presentation are separate projects with real boundaries, so business logic is never trapped inside a controller and a change in one place does not require archaeology in four others. It costs a little at the start and is the reason a decade-old system is still straightforward to change.
We also take on applications somebody else started — systems that worked fine at first and have since outgrown their original shape. That work is less glamorous than a rewrite and usually a great deal cheaper.
What we build
- Web
- ASP.NET Core MVC applications
- Data
- SQL Server schema and performance
- Commerce
- Subscription billing and payments
- Output
- Generated PDF and reporting
- Mobile
- Android with .NET MAUI
- Rescue
- Applications that have outgrown themselves
Tested where it counts
Unit, integration and end-to-end suites across our estate — 274 test files and counting — concentrated on the logic that would cost a customer something if it broke. We are not interested in coverage as a number; we are interested in sleeping through deployments.
02 — Data engineering
Getting data into a shape you can build on
Most data problems are not analysis problems. They are loading problems, shape problems and consistency problems, and they do not go away after the first import.
Ingestion that expects to fail
Scheduled pipelines that handle the source being late, malformed, silently revised or simply absent. Retries, change detection, validation and an audit trail for every load, so that when a number moves you can say why.
Schema and query design at scale
We work routinely with tables in the hundreds of millions of rows, where the difference between a good and a bad execution plan is the difference between a product and a timeout. Indexing, partitioning and query tuning are design work, not something done afterwards.
Reference and geospatial data
Postcodes, coordinates, administrative geography, population and deprivation. We maintain our own UK postcode toolkit, so we know what it takes to keep reference data correct rather than merely present.
Keeping it current
A dataset loaded once is a demo. Ours run on monthly cycles, unattended, with dry-run modes and logs you can read after the fact. That is the part most projects underestimate.
03 — Hosting & operations
We run what we build
Our own products are live, paid for and depended on. That is a strong incentive against clever shortcuts, and it is the main thing we offer that a build-and-hand-over supplier cannot.
Azure, end to end
Compute, scheduled work, storage, telemetry and identity. Deployment and environments set up so that releasing is dull, which is the highest praise a deployment process can receive.
Observable in production
Structured logging, distributed tracing and real telemetry throughout. When something misbehaves at 2am we would rather read what happened than guess at it — and so would you.
Secure and current
The whole estate runs on .NET 10. We upgrade deliberately and stay close to the current release, because falling behind is a debt that compounds quietly and is paid all at once.
Cost and resilience by design
Decided up front rather than discovered on the first invoice. We would rather tell you what a thing will cost to run before it is built than explain the bill afterwards.
04 — Data analysis
From records to a number somebody can defend
Our own platforms exist to answer questions that carry consequences — is this area safe enough, is this vehicle a risk. The same discipline applies to your data: warehouse it properly, model it honestly, and make the answer something a person or an agent can rely on.
One platform, from raw source to answer
We work across the Microsoft data platform rather than at one end of it. Sources land and are staged, modelled into a warehouse designed for the questions people actually ask, and surfaced through Power BI semantic models that everything else — reports, exports and agents — can share. One definition of a measure, used everywhere.
That modelling stage is also where a dataset gets understood before anything is built on it. We profile it, find the gaps and outliers, and test whether a scoring model behaves the way it should. It is far cheaper to discover that data cannot support a question in a model than in production.
What this covers
- Platform
- Microsoft Fabric and Azure
- Warehousing
- Dimensional models and incremental loads
- BI
- Power BI semantic models and reports
- Scoring
- Weighted models and national benchmarking
- Agents
- Grounded on governed data
- Output
- Reports, board packs and generated PDF
Warehousing
Dimensional models built around the questions a business actually asks, with incremental loading, history kept where history matters, and a layered path from raw landing to trusted output.
Microsoft Fabric
Lakehouse and warehouse workloads, pipelines and orchestration in one place, with storage and semantic layer joined up rather than stitched together across half a dozen services.
Business intelligence
Power BI semantic models, measures and reports, with access controlled at the row level so the same report can safely be handed to a board, a region and a single site.
Agent integration
Making your data answerable in natural language, grounded on the governed model rather than on a guess. An agent is only as trustworthy as the semantic layer beneath it — which is why we build that first.
A score nobody can interrogate is a score nobody should trust
Where we publish a score, we publish how it is calculated — sources, weightings and benchmarks. Clients working in safeguarding and duty of care have to show their reasoning to a governor, an inspector or a court. So should their suppliers.
How we work
Engineering practice
These are habits, not aspirations. They come from running our own software in production for years.
Layered by default
Domain models, data access, services and presentation are separate projects with real boundaries. It costs a little at the start and pays for itself many times over by year ten.
Tested where it counts
Unit, integration and end-to-end suites across the estate — 274 test files and counting. Concentrated on scoring logic, ingestion and anything a customer would notice breaking.
Observable in production
Structured logging, distributed tracing and real telemetry throughout, so a problem is something you read rather than something you reproduce.
Current, not legacy
The whole estate runs on .NET 10. We stay close to the current release, deliberately.
Methodology in the open
Where we publish a score, we publish how it is calculated. If our reasoning cannot survive being looked at, it should not be shipped.
Built to be handed over
Documented, conventional and readable. Nothing we write should require its author to be in the room.
Get in touch
Tell us what you are trying to build.
A dataset you cannot get value out of, an application that has outgrown its original shape, or something that needs building from nothing. We would be glad to hear about it.
info@meddalwedd.co.uk