Case studies

What we have done

01 · Modernization

Java 21 upgrade of a GIS platform

Java · GeoTools · GeoServer · Spring · PostGIS

316 Java classes and 337 JSPs behind an Ant build, with 129 JARs checked into WEB-INF/lib. Now Maven, Jakarta and Java 21.

02 · Decomposition

.NET monolith to microservices

.NET 10 · Aspire · YARP · EF Core · Wolverine

The boundaries are read from the entities, the DbContext and the call graph. The code is moved, not regenerated, and only the seams are written.

03 · Governance

Governance review of a vibe-coded application

Any language · report first, then fix

Twelve detector families find the slop, the structural map ranks it by what is actually reachable, and the fix lands on a work branch one compiled file at a time.

04 · Greenfield

Greenfield build of a 3D viewer

Next.js 16 · React 19 · Rust · axum · PostgreSQL 17

The monorepo, the OpenAPI contract, the caching layer, the containers and the pipeline are composed from tested blocks. The model writes the decoder and the viewer.

05 · Test suite

Selenium to Playwright migration

Java, C# or Python · Playwright · TypeScript

Every locator a provable equivalent of the one it replaces. Unported tests stay visibly unported, so nothing unfinished can report a pass.

06 · Test data

Test data generation across services

REST routes · SQL · stored procedures

Every operation split into three layers — what arrives, what it touches inside, what it hands back — so integration tests, service-level tests and contract tests each get the rows they need. Derived from the schema and the routes, not copied from production.

07 · Migration

VB and XML to Java

VB6 or VB.NET · XSD · XSLT · Java 21 · Spring Boot

A booking desk written against a global distribution system. The Java model is generated from the XSDs, so an element that appears in no sample message still exists with the right type.

08 · Migration

RPG on IBM i to Java

RPGLE · SQLRPGLE · DDS · DB2 for i · Java 21

Indicators, the program cycle and record-level access recovered by a parser and written out explicitly, before a line of Java exists. Display files become an API, a phased front end, or nothing — that is an answer, not an assumption.

09 · Data tier

The AS/400 database to a relational schema

DDS · DB2 for i · PostgreSQL or DB2 LUW · JPA

Logical files become the indexes and views the programs actually depend on. Constraints the RPG enforces but the schema never declared are proposed with their evidence and their violating rows — never applied silently.

10 · Integration

MuleSoft 4 to Spring Boot

Mule 4 · DataWeave · RAML · Java 21 · Spring Boot

Flows become Spring Integration or Camel routes and the RAML stays the contract. DataWeave is translated beside its source, and the API Manager policies that never lived in the repository are listed rather than lost.

11 · Assessment

An IBM i estate read into one model

RPG · CL · DDS · COBOL/400 · SQL · CMD · binder source · JT400

Fourteen kinds of source member, identified by extension, then content, then the parser. One model of programs, files, screens, jobs and calls, traced to member and line, before the target is chosen.

12 · API enablement

API enablement of an IBM i core

Service programs · binder source · JT400 · XMLSERVICE · .NET or Java

What to expose starts from the export list in the binder source and the call graph behind it. Interactive programs are split into an endpoint and a page; the bridges that reached into the box are removed, not reimplemented.

13 · Batch

The IBM i batch layer to jobs, queues and transactions

CL · SBMJOB · OVRDBF · data queues · data areas · triggers · commitment control

CL is orchestration and lands as job code. Submitted jobs become scheduled jobs with dependencies from the CL call graph, overrides become configuration, keyed data queues get a queue with selective receive, and every commit scope is matched file for file.