Frontend interfaces
Vue 3 + TypeScript
Used to replace interfaces screen by screen or build new operational tools. Vue supports incremental adoption, while TypeScript makes component and API contracts explicit during change.
Application services
Node.js + NestJS
Used for APIs, integration services and workflow orchestration. NestJS gives the codebase visible modules and boundaries, with TypeScript shared across browser and server work where appropriate.
Transactional data
PostgreSQL + Redis
PostgreSQL is the default for records that need relational integrity and transactions. Redis is added for caching, queues or short-lived state, not as a substitute for the system of record.
System integration
REST, OpenAPI + RabbitMQ
OpenAPI defines synchronous interfaces that teams can review and test independently. RabbitMQ is used when work needs to be decoupled, retried or processed asynchronously.
Runtime and delivery
Docker + automated CI/CD
Containers keep the agreed runtime repeatable across development, test and production. Automated build, test and deployment checks reduce manual release variation; orchestration is added only when operations require it.
Operational evidence
OpenTelemetry + Grafana
Traces, metrics and logs provide a comparable view of the current and new paths during migration. The telemetry remains portable if the client changes its monitoring backend.
The preferred set is not a mandatory replacement list.
We compare compatibility, support lifetime, security, operational fit, team capability, migration effort and total ownership cost before selecting a technology.
- Keep
- A supported component remains testable, operable and clearly owned.
- Upgrade
- Staying in the same ecosystem reduces migration surface and retraining.
- Isolate
- A stable contract controls a component that cannot move in the current stage.
- Replace
- Support, security, operating cost or delivery constraints outweigh compatibility.