Skip to content
CoRISE
CASE / 05Architecture & Modernization · Product Engineering

Modernizing Legacy APIs into a Web Application Platform

We rebuilt access to a legacy API and proprietary data delivery model based on Windows and COM as a browser-accessible web application. Rather than replacing the existing service, we abstracted its legacy interface behind a typed adapter, domain model and REST API, enabling use from a modern React web application.

Design boundaries that make legacy assets reusable.

Contain legacy dependencies within a boundary instead of spreading them across the application.

↔ Scroll horizontally to see the full diagram.

An integration boundary contains legacy dependenciesWindows runtime, COM objects, proprietary containers and the vendor API are handled at an integration boundary. The vendor API connects to the F# adapter, domain model, REST API and React application. The adapter retains the Windows/COM integration responsibility; browser clients do not inherit it. This is a conceptual responsibility and integration view.LEGACY SIDE — CONTAINEDMODERN SIDE — EXTENSIBLEINTEGRATION BOUNDARYWINDOWS RUNTIMECOM OBJECTPROPRIETARY DATA CONTAINERVENDOR-SPECIFIC APIF# ADAPTERDOMAIN MODELREST APIREACT APPLICATION
Fig. 01 — Contain legacy dependencies so the modern application can evolve independently.

Valuable data, locked behind an old interface.

The external data service offered extensive data and capabilities accumulated over many years, but access depended on Windows COM objects and proprietary data formats.

The customer wanted to make these capabilities accessible through a browser-based application.

Create a new boundary around a system that cannot be rewritten.

We could not rewrite the external legacy system itself. Instead, we introduced an abstraction / anti-corruption layer between the vendor-specific interface and the new application.

↔ Scroll horizontally to see the full diagram.

An abstraction layer around the existing systemAn integration boundary containing a typed adapter, domain model and REST API separates the legacy system from modern applications.INTEGRATION BOUNDARYCOM / PROPRIETARYLEGACY SYSTEMTYPED ADAPTERDOMAIN MODELREST APIMODERNAPPLICATIONS
Fig. 02 — Legacy System → Integration Boundary (Typed Adapter → Domain Model → REST API) → Modern Applications

Modernization does not always mean replacement. Sometimes the better solution is to contain a legacy dependency within a robust boundary.

From a vendor-specific API to a typed domain API.

The foundational F# adapter and REST modernization technology came from prior development by CoRISE’s technical advisor. CoRISE used this engineering asset to design, develop and integrate the customer-facing web application.

The adapter wrapped the legacy COM interface and exposed a more structured F# API. Its purposes were to:

↔ Scroll horizontally to see the full diagram.

Transform COM data into a typed domain modelThe F# adapter wraps the COM API and maps its data into a typed domain model.COM APIF# ADAPTERTYPEDDOMAIN MODEL
Fig. 03 — COM API → F# Adapter → Typed Domain Model

Keep the legacy model from leaking throughout the application.

↔ Scroll horizontally to see the full diagram.

Direct dependency without a boundaryThe frontend or application directly depends on COM, vendor types and proprietary data.DIRECT DEPENDENCYFRONTEND / APPLICATIONCOM / VENDOR TYPES /PROPRIETARY DATA
Without Boundary — Direct dependency on the vendor API

This boundary follows the anti-corruption layer concept in Domain-Driven Design.

Turn a local API into a service accessible over a network.

↔ Scroll horizontally to see the full diagram.

From COM to RESTThe F# adapter and domain model translate the COM API into a REST interface consumed over HTTP and JSON.COM APIF# ADAPTERDOMAIN MODELREST APIHTTP / JSON
Fig. 04 — COM API → F# Adapter → Domain Model → REST API → HTTP / JSON

The REST layer went beyond a mechanical COM-to-HTTP proxy. It introduced a stable application boundary with:

The goal was to make the system usable by modern clients without exposing the legacy implementation model.

Turn legacy data into a product people can use in a browser.

CoRISE built a customer-facing React application using the modernized API. The frontend consumes the REST API as a conventional web client without needing to understand:

  • COM
  • Windows-specific calls
  • Proprietary data container behavior
  • Vendor-specific API structure

React is an implementation choice; the central change is architectural modernization.

  • Browser-based access

  • Independent frontend evolution

  • UI / UX flexibility

  • Easier integration

  • Additional future clients

  • Clear separation of responsibilities

Legacy System → Boundary → Reusable Modern Capability.

↔ Scroll horizontally to see the full diagram.

End-to-end legacy API modernization architectureThe external legacy data service exposes COM and proprietary data through a legacy boundary to the F# adapter, domain model and REST API. The React web app uses the API across the network boundary. Future clients are extension points, not delivered clients in this case. COM integration through the adapter still requires a Windows-side runtime.COM / PROPRIETARY DATAMODERN APPLICATION BOUNDARYNETWORK / API BOUNDARYFUTURE EXTENSION POINTEXTERNAL LEGACY DATA SERVICELEGACY BOUNDARYF# ADAPTERDOMAIN MODELREST APIREACT WEB APPFUTURE CLIENTS
Fig. 05 — External Legacy Data Service → Legacy Boundary → F# Adapter → Domain Model → REST API → React Web App / Future Clients

From desktop-bound integration to a reusable service.

Windows-bound Integration

↔ Scroll horizontally to see the full diagram.

Desktop-oriented tight couplingClient code is tightly coupled to the vendor API and COM, without a browser access path.NO BROWSER PATHCLIENT CODEVENDOR API / COMdesktop-oriented, tightly coupled
Before — Windows-bound Integration

Connect prior engineering work to customer value.

CoRISE’s technical advisor developed the foundational F# wrapper and REST modernization technology as an independent technical project. CoRISE drew on this engineering asset and expertise to build the customer application.

Turn engineering knowledge accumulated by people and organizations into reusable technology that delivers customer value.

↔ Scroll horizontally to see the full diagram.

Reuse prior engineering assets in a customer projectThe technical advisor’s independent engineering asset becomes a reusable capability applied in CoRISE’s customer project to deliver product value.INDEPENDENTENGINEERING ASSETREUSABLE CAPABILITYCUSTOMER PROJECTPRODUCT VALUE
Fig. 06 — Independent Engineering Asset → Reusable Capability → Customer Project → Product Value

What this case demonstrates.

  1. 01

    Legacy API Modernization

    Connect existing assets to a modern architecture while preserving their value.

  2. 02

    Anti-Corruption Layer

    Keep external system models and APIs from leaking throughout an application.

  3. 03

    Typed Integration

    Use types to transform a legacy interface into an accessible domain model.

  4. 04

    API Modernization

    Turn a local, desktop-oriented interface into a service API.

  5. 05

    Product Engineering

    Take integration through to a web application that people can actually use.

CoRISE’s contribution

  • Customer requirements
  • Web application design
  • React frontend development
  • API integration
  • User experience implementation
  • Use of the legacy adapter architecture
  • Frontend / backend separation through REST
  • Boundary design between the legacy interface and web application
  • Connecting domain and application models
  • Legacy COM integration expertise
  • F# adapter expertise
  • REST modernization knowledge
  • Legacy API modernization architecture

The foundational adapter technology already existed. CoRISE brought it into the customer project and delivered the application and integration.

Legacy API Modernization
COM / Proprietary Data Container
F#
Typed Domain Model
REST / HTTP / JSON
React / TypeScript
Anti-Corruption Layer / Adapter

Make legacy technology a reusable asset.

Instead of replacing a valuable existing data service, this work isolated its legacy interface inside an adapter. The architecture preserved the existing asset while making it usable by web applications, APIs and future applications.

We designed a durable boundary between old and new systems, preserving existing value while enabling new uses.

Contact

Connect indispensable legacy systems to the next architecture.

Discuss incremental API modernization, boundary design and web enablement for COM, proprietary APIs, Windows dependencies and older data interfaces that still hold business value.

Start a conversation

Back to all work