Modernising MedData and EDent without stopping the clinics

2024 – 2025 · Middle, then lead front-end developer, Bepro-Devhub

Angular 14 → 17standalone componentsOnPushOpenAPI/SwaggerIndexedDBDocker SwarmBitbucket Pipelinesmeddata.uz ↗medinfocom.uz/meddata-saas ↗edent.uz ↗

Context

MedData automates hospital workflows, patient management and medical data processing; EDent manages dental clinics: patients, schedules, treatments and billing. Both run on one large enterprise Angular application, used every day by clinics across Uzbekistan.

The problem

The codebase was on Angular 14 with growing technical debt and slow builds. Every deployment environment needed its own static environment.*.ts file and therefore its own build. API clients were written and maintained by hand and drifted from the backend. Clinics on poor connections hit the API on every screen for reference data that rarely changed.

Constraints

Production system in daily clinical use: no big-bang rewrite, no downtime, no freeze on feature work while the migration ran.

What I did

Migrated the application from Angular 14 to 17 incrementally, module by module, moving to standalone components and OnPush change detection and updating the key dependencies on the way. Replaced the static environment files with runtime configuration: the container writes a config.json at start from variables injected by Docker Swarm, and an APP_INITIALIZER loads it, so one build serves every environment. Integrated an OpenAPI/Swagger generator so the TypeScript API clients are generated from the backend contract instead of maintained by hand. Built an IndexedDB cache for reference data so cached screens stop calling the API and stay fast on low-bandwidth connections. Worked with the backend and DevOps teams on the release process in Bitbucket Pipelines.

Docker Swarm secret
config.json at start
APP_INITIALIZER
one build, every environment
Runtime configuration path. Before: one environment.*.ts per deployment, one build each.

What happened

One build now serves every environment; the per-deployment environment files are gone. API clients are regenerated from the OpenAPI spec when the backend changes, so a contract change is a regeneration, not an afternoon. Screens backed by the IndexedDB cache stop calling the API for reference data, and clinics on slow connections open them noticeably faster. Clinics kept working through every step.

← All projects