Skip to content
Home/Portfolio/Vitals Ingestion Pipeline

Vitals Ingestion Pipeline

Device readings like heart rate and blood pressure, cleaned up and shown live in under 100ms.

Health Data & CloudCase study5 technologies
Quick summary

A data pipeline that takes bursts of readings from medical devices, drops impossible or duplicate values, and keeps the latest good reading ready for the app to show.

Vitals Ingestion Pipeline preview

Overview

What this is and why it matters, in plain English.

A data pipeline that takes bursts of readings from medical devices, drops impossible or duplicate values, and keeps the latest good reading ready for the app to show.

Device readings like heart rate and blood pressure, cleaned up and shown live in under 100ms.

The situation

What was going on before, and why it needed fixing.

Device vendors posted vitals in bursts. Impossible samples, like a heart rate of zero or a duplicated timestamp, landed in the chart next to real readings.

Device vendors posted bursts of vitals. Bad samples (a heart rate of 0, a duplicated timestamp) landed in the chart next to real ones.

What it needed to do

The outcomes the project had to deliver.

  • Absorb bursts without dropping data.
  • Reject impossible and duplicate samples.
  • Serve the latest reading without scanning the raw stream.

What I did

My part of the work and who I worked with.

I designed the pipeline on AWS and wrote the Python validation Lambda, the Redis latest-value store, and the REST read API.

How it works

The main building blocks, from the screen people use to the data underneath.

Kinesis took the burst, a Python Lambda dropped impossible values, and Redis held the latest accepted reading for the query API.

  1. 01

    AWS Kinesis

    Takes bursts from devices and buffers them for processing.

  2. 02

    Python Lambda

    Applies validation rules, drops impossible values and duplicates, and stamps server time.

  3. 03

    Redis

    Holds the latest accepted reading per patient and signal.

  4. 04

    REST API

    Reads the latest values from Redis instead of the stream.

Key choices and trade-offs

Every build involves trade-offs. These are the important ones and what each one cost.

DecisionTrade-off
Server timestamp wins.Device time is ignored for ordering, but out-of-order clocks cannot corrupt the chart.
Latest value in Redis.History is served elsewhere, but the common read is instant.

Under the hood

Implementation details for technical readers, with a code sample.

  • Latest reads under 100ms.
  • Rule-based sample rejection in Python.
  • Kinesis absorbing ingest bursts.
def accept(sample: dict) -> bool:
    hr = sample.get('heart_rate')
    if hr is not None and not 30 <= hr <= 220:
        return False
    spo2 = sample.get('spo2')
    if spo2 is not None and not 50 <= spo2 <= 100:
        return False
    return True

Problems solved

What got in the way, and how each problem was fixed.

  1. 01

    Out-of-order device clocks had to lose to the server timestamp.

    The Lambda orders samples by server receipt time, so device clock drift cannot reorder readings.

  2. 02

    A spike of identical payloads could not inflate the chart.

    Duplicate payloads are detected and dropped before they reach storage.

  3. 03

    The read API had to avoid scanning the raw stream on every page load.

    The read API serves the latest value from Redis rather than scanning the stream on every page load.

Security, speed and growth

How data is protected, and how the system stays fast as usage grows.

Security

Device and API access are authenticated, and processing happens inside the AWS account without exposing the raw stream.

Speed & growth

Latest-reading queries return in under 100ms from Redis, independent of stream volume.

Quality and releases

How changes were tested and shipped safely.

Replay tests with recorded bursts, impossible values and duplicate payloads verify what is accepted and rejected.

Tech stack

The tools and technologies used, for recruiters and technical reviewers.

PythonAWS KinesisLambdaRedisREST

Results

Measured outcomes recorded for this project.

MetricResult
Latest read<100 ms
Rejected samplesrules python
IngestKinesis burst

Questions

Plain answers first, then the detail a technical reviewer would ask about.

Common questions

What happens to bad readings?
Impossible values and duplicates are filtered out, so the app shows the last good reading, not the last packet.
Is it fast enough for live monitoring?
Yes. The latest accepted reading is served in under 100ms.

For your tech lead

What counts as a bad sample?
Impossible values, such as a heart rate of zero, and duplicate payloads.
Why not read from Kinesis directly?
Scanning the stream per page load is slow; Redis keeps the latest value ready.

Key takeaways

  • •Device readings like heart rate and blood pressure, cleaned up and shown live in under 100ms.
  • •Built with Python, AWS Kinesis, Lambda, Redis, REST.
Send a brief
Engagement

Choose how we work together

01

Join your team

A senior engineer inside your team. I work in your codebase, standups and code reviews, and stay long enough to own a real part of the product. Under the hood: Laravel, Node.js, Python or AWS.

Full-time or long contract
02

Work solely for your company

A dedicated engineer for one company. I take the product from planning to the live version: backend, data, hosting and screens, with your product as my focus.

Dedicated contract
03

One project

A clearly defined build, then a clean handover: an MVP, taking an AI-built prototype (Lovable, Bolt, Cursor) to production, a migration, or an AI feature. Get in touch to discuss scope and pricing.

Fixed-scope project

Prefer to hire through a platform? I'm onUpworkand