Healthcare platform — multi-site laboratory network
Laboratoire SION · UNILAB
A platform for a network of eight medical laboratories that were each running an isolated copy of a legacy application, covering four distinct systems built by one engineer: the public website, a site-synchronisation layer, a commercial and accounting steering tool, and a lab-operations service now piloted at one site.
- Client
- Laboratoires SION — Cameroon
- Role
- Head of IT Department — sole engineer of the platform
- Period
- September 2025 – present
- Status
- In production (rolling out site by site)
Confidential engagementThe problem
Laboratoires SION operates eight laboratory sites in Yaoundé, Douala and Bafoussam. Each site ran its own copy of a legacy Django laboratory application backed by a local SQLite database, with no way to modify the software and no connection between sites. Management had no consolidated view of revenue, prescribers or patients across the network, and every figure had to be assembled by hand from exports.
The eight databases had been forked from a single trunk in November 2023 and kept allocating identifiers from the same counter. By September 2026, 72% of prescription identifiers, 69% of patient identifiers and 42% of prescriber identifiers collided between sites, which made any naive merge impossible. Backups were manual, run on Windows workstations exposed to power cuts, and there was no central management of who could do what.
The brief was therefore twofold: give management a reliable picture of the activity now, without touching the legacy application, and then replace it site by site without ever interrupting the reception desks, some of which can be offline for up to 72 hours.
The product
Four systems, each solving one part of that brief — see the tabs below for what each one actually does and the specific problem it had to solve: the public website (patient- and prescriber-facing), Bridge (the data-synchronisation layer that makes everything else possible), Pilot (the steering tool management uses daily) and Home (the target service that will eventually replace the legacy application, piloted today at one site).
Everything is designed, coded, tested, deployed and operated by one engineer, with an architecture document that frames 13 structural decisions and 38 documented trade-offs, and a 40-page deployment guide used by the client's own staff.
My role
I joined Laboratoires SION in September 2025 as Head of the IT Department. On this platform I am the only engineer across all four systems: I wrote the architecture document, then designed, coded, tested and deployed every component, from the Bun synchronisation agents to the Flutter workstation, and wrote the runbooks the client's staff use.
The work is organised in dated milestones: public website in October 2025, the Pilot steering tool on the legacy databases from March 2026, Bridge (multi-site synchronisation) from June 2026, and Home's federated services, workstation and delivery portal in September 2026. Later milestones of Home's target architecture (task orchestration, notifications, a realtime gateway) are specified but not yet built.
The systems
Public website
In productionlaboratoiresion.org — bilingual marketing site
The network's single public entry point, serving six different audiences from one bilingual (FR/EN) Next.js site: patients looking up an exam and its price, prescribers, insurers, research partners and job applicants each get their own section (Espace Patient, Espace Pro, Nos Agences, Recherche Scientifique, Blog), with a public exam catalogue that publishes both the standard price and the insurance price for every test, across categories from routine blood chemistry to tumour markers.
- Next.js
- next-intl
- Tailwind CSS
- Vercel
One public site, six different visitors
The problem
A laboratory network's website has to serve a patient checking a price, a prescriber looking for a partner lab, an insurer checking coverage terms and a researcher looking for a partner site — from the same navigation, without turning into either a corporate brochure that ignores patients or a booking app that ignores everyone else.
What I built
The site is organised around clearly labelled paths for each audience rather than one generic menu, with the exam catalogue — the single most useful page for a patient — one click from the home page in either language, and pricing published openly rather than gated behind a contact form.
The outcome
- Laboratory sites
- 8architecture document, 2 Sept 2026
- Workstations
- 42architecture document, 2 Sept 2026
- Prescriptions per day
- ~90architecture document, 2 Sept 2026
- Automated tests
- 2,000+Jest, Flutter and Bun suites
- Roles / permissions / scopes
- 13 / 68 / 6
- Lines of code
- ~230kTypeScript and Dart
- Data models
- 102Prisma: 43 referential, 41 operations, 18 identity
- VPS hardening
- Lynis 82/100
as of 25 September 2026
Management now has one consolidated, role-partitioned view of revenue, prescribers and patients across the eight sites, computed from databases that are backed up automatically instead of by hand. The public website, Bridge and Pilot are in full production; Home's federated services and Flutter workstation are installed at one pilot site and are being rolled out site by site.
The platform is delivered with an operations kit rather than a set of scripts: one image per service built in CI and pinned by digest, deployments triggered by webhook, rollback to the previous digest, off-site backups with a rehearsed restore, and a VPS hardened to a Lynis score of 82/100. The whole codebase, around 230,000 lines of TypeScript and Dart, is covered by more than 2,000 automated tests and was written by a single developer over about 437 commits.
Technical stack
- Web
- Next.js (App Router)
- React 19
- Tailwind CSS 4
- next-auth v5
- next-intl
- Workstation
- Flutter 3 / Dart
- drift + sqlite3 (offline store)
- Riverpod
- go_router
- PDF printing
- Services
- NestJS 11
- Apollo Federation 2 (supergraph composed and checked in CI)
- Prisma 7 on PostgreSQL
- TypeORM (synchronisation API)
- Bun agents compiled to native binaries
- better-sqlite3
- Data
- PostgreSQL 16
- SQLite + Online Backup API
- Redis (token revocation)
- Operations
- Docker Compose, one image per service, deployed by digest
- Traefik with ForwardAuth
- GitHub Actions (CI, supergraph checks, images, Flutter and Bun builds)
- pgbackrest + restic, secrets with SOPS/age
- Vercel (public website)
- Quality
- Jest (unit and end-to-end)
- flutter test
- bun test
- husky + lint-staged + Prettier


