← Back to home

Graduation project

Nabda

A senior graduation project built as six services: wearable firmware, Spring Boot APIs, PostgreSQL persistence, real-time alerts, ML reporting, and mobile/web clients.

C++ · Spring Boot · Python · Flutter · TypeScript 2026 GitHub org ↗

SUMMARY

A wearable streams cardiac data into a Spring Boot backend, which persists state, orchestrates ML report and chatbot services behind REST boundaries, and serves a Flutter app plus a web client.

Problem

Wearable data is only useful if the whole chain holds: a device that streams reliably, a backend that stores and orchestrates, a model that turns raw signal into something readable, and clients that agree with the backend about what is true. Any weak link and it becomes a chart nobody trusts.

What I built

Nabda is my senior graduation project: a cardiac-monitoring platform split into six deployable services - C++ firmware on an ESP8266-based wearable, a Java/Spring Boot backend, a Python ML report API, a Python chatbot, a Flutter mobile app, and a TypeScript web client - documented end to end in a LaTeX thesis.

Architecture / system design

The backend is the hub: firmware streams sensor data in, the backend persists it and orchestrates the report and chatbot services behind REST boundaries, and both clients read from that same API. Keeping the ML and chatbot as separate Python services means the Java backend never carries model dependencies — and either can be redeployed without touching the other.

Failure modes / what broke

The hard parts live at the seams, not inside any one service: a wearable drops connectivity, the report model is slow or unavailable, and two separate clients can drift out of sync with backend state. The service split is what keeps a slow model from taking the whole product down with it.

Proof / metrics / tests

The proof is a working end-to-end path - wearable to backend to report to app - across six services in five languages, with the design written up in a peer-reviewable thesis rather than left implicit in the code.

Lessons learned

The model that writes the report is the smallest part of a health product. Almost all of the engineering is the boundaries around it: transport, persistence, orchestration, and making a degraded service look like a degraded feature instead of a broken app.

field notes

Expanded field notes

WHY IT'S SIX SERVICES

A telehealth product looks like one app to a user and like a distributed system to everyone who builds it. Nabda is split along the lines where the failures actually differ — a device that loses signal is a different problem from a model that takes too long, which is a different problem from a client that renders stale state.

The wearable runs C++ firmware on an ESP8266, capturing sensor data and streaming it to the backend. The Spring Boot backend is the only component that talks to everything else: it exposes the REST APIs, owns persistence, and orchestrates the device, report, and chatbot services.

The intelligence sits behind its own boundaries. The report model API is a Python ML service that turns raw wearable data into a readable health report and returns it to the backend over HTTP. The chatbot is a separate Python service — a conversational health assistant — for the same reason: neither belongs inside a Java backend, and both change on a different cadence than the API does.

Two clients consume the same API: a Flutter mobile app that pairs with the wearable and surfaces health data to users, and a TypeScript web client for dashboards. One backend contract, two surfaces - which is exactly where state drift shows up if the contract is not the single source of truth.

DESIGN NOTE

Splitting the ML report and the chatbot out of the backend was not about scale - it was about dependencies and blast radius. A Java service that has to ship a Python model runtime is a service that can't be deployed independently, and a slow model becomes a slow product.

6
deployable services
5
languages · C++ · Java · Python · Dart · TS
thesis
design written up in LaTeX
Nabda platform architecture wearable esp8266 · c++ spring boot backend · java report api python · ml chatbot python flutter app mobile · dart web client typescript solid = service calls · dashed = device pairing
fig. — the backend is the only component that talks to everything else. The report model and chatbot sit behind their own REST boundaries; both clients read one contract.

hover or tab through any service to trace the platform

contact

Open to backend systems, AI infrastructure, and product engineering roles.