Case study · Academic
Equipment and maintenance app for a district hospital in Rwanda
Replaces paper tracking of biomedical, ICT and infrastructure equipment at Kabutare District Hospital with incident reporting, interventions and preventive maintenance.
In brief
- Equipment and maintenance module requested by Kabutare District Hospital (Rwanda): incidents, repairs, preventive maintenance and inventory.
- Lead developer in a team of 4: data model, key features and the CI/CD chain; work continued during a 10-week on-site internship.
- Flutter web and Android client, two Node.js services, Keycloak sign-in with role-based access, Docker Compose behind nginx, 10-stage Jenkins pipeline.
Key facts
- Role
- Lead developer
- Team
- Team of 4
- Period
- –
- Status
- Supervised project defended in April 2026, continued during the on-site internship (May–July 2026)
- AI assistance
- partial Data model, key features and CI/CD by me; part of the code written with Claude Code.
- Stack
Context
Engineering school project (ISIS, supervised student project, 2025–2026) commissioned by Kabutare District Hospital in Rwanda. The app is module 1 of a wider hospital management system: equipment and maintenance. After the project was defended in April 2026, I continued the work on site at the hospital during a 10-week internship (May–July 2026).
Problem
ICT, biomedical and infrastructure equipment was tracked on paper across the hospital’s departments. There was no structured way to report a failure, follow a repair from request to completion, or plan preventive maintenance and replacements.
My role, the team and AI assistance
Team of 4 students. I was the lead developer: the project’s final report credits me with the data model, the key features and the CI/CD chain. Part of the code was written with Claude Code; the coding conventions and a feature verification log are kept in the repository.
Constraints
- Hospital setting: several user profiles (staff who report, supervisors, specialised technicians, administrators) with different rights.
- Bilingual interface: French and English.
- Local deployment: the app had to run on a server inside the hospital, over HTTPS, and be installable on staff phones.
- Traceability: every intervention and every change in an equipment’s life must remain visible.
Solution and architecture
- Client: Flutter app, installable as a web PWA and as an Android APK, with a French/English interface.
- Services: two Node.js/Express services. auth-service manages accounts through the Keycloak administration API and stores application permissions; db-service handles equipment, incidents, intervention sessions and reports, preventive-maintenance protocols, inventory and the audit log, on SQLite.
- Identity: sign-in through Keycloak; the services check RS256 tokens against the published keys (JWKS), with no shared secret. 17 application permissions are mapped to roles.
- Incident workflow: category chosen first, up to 5 photos per report, 10 statuses and 4 urgency levels; a repair can span several intervention sessions and ends with a PDF intervention report.
- Equipment lifecycle: preventive-maintenance checklists, ABC criticality, a replacement plan computed from expected lifespan, and a decommissioning workflow that keeps the history. The physical inventory is imported from a spreadsheet.
- Notifications: transactional emails, web push and a monthly indicator report.
- Deployment: Docker Compose behind nginx; a provisioning script installs an internal certificate authority, HTTPS, a PWA install page with a printable QR poster, backups and updates.
Stack
Flutter and Dart, Node.js and Express, SQLite, Keycloak on PostgreSQL, Docker Compose, nginx, Jenkins, Jest, web push.
Quality and verification
- 26 Jest test files (role-based access, intervention reports, backups, CSV import, equipment lifecycle, pagination) and 7 Flutter test files.
- A 10-stage Jenkins pipeline: analysis and tests of the Flutter app, builds, image publication, deployment of the production and development environments, health check.
- A self-assessment against the Rwanda Hospital Accreditation Standards (11 standards reviewed, with code evidence and quick wins), plus interface, translation and sign-in audits.
Results and status
The supervised project was defended in April 2026, then development continued during the internship at the hospital (May–July 2026). Usage figures at the hospital are not published here.
What I would do differently
- Keep generated files and dependencies out of the repository from the first commit.
- Run the test suites automatically on every change, not only in the deployment pipeline.
- Separate the two services’ data models earlier, to make the incident and inventory modules easier to evolve independently.
Links
- Source code: a cleaned public copy is in preparation.
- Screenshots: to come, on demonstration data.