Skip to content
@NuroPulse

NuroPulse

A biomarker-based companion app that supports people with Parkinson's, from early screening to long-term care.

NuroPulse

Flutter React Router Supabase

NuroPulse is a patient-to-neurologist companion ecosystem for patients with Parkinson’s that turns quick daily check-ins into clear insights shared with their neurologists through medicine logging and a biomarker-based Parkinson's tremor detection.

Built with O(∩_∩)O for JOINTS Hackathon 2026 ⚙️

System Architecture

flowchart LR
    subgraph MOBILE["Mobile app (Flutter) - patient"]
        direction TB
        UI["Presentation<br/>go_router, flutter_bloc Cubit, fl_chart"]
        DOM["Domain<br/>entities, repository interfaces, use cases"]
        DATA["Data<br/>repository impl, DTOs, supabase_flutter"]
        HIVE[("hive_ce<br/>local results + outbox<br/>flutter_secure_storage: session")]
        subgraph DSPM["DSP module (isolate, on-device)"]
            direction TB
            SENS["sensors_plus<br/>accelerometer ~100 Hz"]
            PIPE["QC gate, resample 50 Hz, band-pass 1-20 Hz<br/>Welch PSD, features, rule-based decision"]
            SENS --> PIPE
        end
        UI --> DOM --> DATA
        DATA --> HIVE
        DOM --> SENS
        PIPE --> DOM
    end

    subgraph WEB["Web dashboard (React Router) - neurologist"]
        direction TB
        WUI["Routes / loaders<br/>patient list, trend charts, medication timeline"]
        WCL["supabase-js client<br/>email + password session"]
        WUI --> WCL
    end

    subgraph SUPA["Supabase backend"]
        direction TB
        AUTH["Auth<br/>anonymous sign-in (patient)<br/>email + password (doctor)<br/>JWT: role authenticated"]
        API["PostgREST + RPC<br/>connect_to_doctor, disconnect,<br/>create_measurement (idempotent on id),<br/>list_my_measurements,<br/>list_patient_measurements"]
        subgraph PG["Postgres + Row Level Security"]
            direction TB
            T1[("profiles<br/>id, role, display_name, connection_code")]
            T2[("patient_doctor_links<br/>patient_id, doctor_id, linked_at, revoked_at")]
            T3[("measurements<br/>status, features jsonb, algo_version,<br/>calibrated, last_dose_at, device jsonb")]
            T4[("medication_schedules / medication_logs<br/>contract pending")]
        end
        AUTH --> API
        API --> PG
    end

    DATA --> AUTH
    DATA --> API
    WCL --> AUTH
    WCL --> API
    API -.-> WCL

    classDef store fill:#e8f0fe,stroke:#2941a3,color:#141a2e
    classDef pending fill:#fff5c2,stroke:#735c00,color:#735c00
    class HIVE,T1,T2,T3 store
    class T4 pending
Loading

How it works

  1. A patient opens the mobile app and runs a short tremor check with the phone resting on a supported hand. No sign-up is needed to start, and the app works offline.
  2. An on-device signal processing module filters the accelerometer data, analyzes its frequency spectrum, and applies a transparent, rule-based decision, so every result can be explained and thresholds can be tuned without any black-box model. Raw sensor signals never leave the phone.
  3. Once the patient links to their neurologist with a connection code, the extracted features and result sync to the backend, and the medication schedule set by the doctor on the web dashboard appears as reminders in the app. Dose logging is captured on the phone too.
  4. The dashboard presents each patient's tremor trend alongside medication timing, closing the loop between screening, treatment, and monitoring, so neurologists review objective patterns between clinic visits instead of relying on memory alone.

Deployments

The NuroPulse web dashboard can be accessed here. The mobile app (for now, only the Android APK build is released) can be installed from here, download the latest .apk file to your Android phone, and install it.

Demo

To ease the process of testing, we have seeded a couple of users in the backend:

Email Password Full Name Role
mzidanek@gmail.com test1234 Mohammad Zidane Kurnianto Patient (via the mobile app)
jikamaka@gmail.com jikamaka123 dr. Nuro Surpulsman, Sp.N Doctor (via the web dashboard)

Team

Built by nama timnya apa, a 4-person team for JOINTS Hackathon 2026 from the Faculty of Computer Science, Universitas Indonesia 💾

Name Institution Role
Name Risyad Athaya Muhammad Information Systems '25 @ Universitas Indonesia Team Leader & Backend Engineer
Zika Mohammad Zidane Kurnianto Information Systems '25 @ Universitas Indonesia Mobile Engineer
Name Rayna Kayla Rayvanka Computer Science '25 @ Universitas Indonesia Business Lead
Name Tania Ju Information Systems '25 @ Universitas Indonesia Frontend Engineer

References

Parkinson screening module

Signal processing

  • Welch, P. D. (1967). The use of fast Fourier transform for the estimation of power spectra: a method based on time averaging over short, modified periodograms. IEEE Transactions on Audio and Electroacoustics, 15(2), 70–73.
  • SciPy documentation. scipy.signal.welch, butter, sosfiltfilt. https://docs.scipy.org/doc/scipy/reference/signal.html

Tremor characterization

  • Deuschl, G., Bain, P., & Brin, M. (1998). Consensus statement of the Movement Disorder Society on Tremor. Movement Disorders, 13(Suppl 3), 2–23.
  • Bhatia, K. P., et al. (2018). Consensus statement on the classification of tremors, from the Task Force on Tremor of the International Parkinson and Movement Disorder Society. Movement Disorders, 33(1), 75–87.

Accelerometer-based Parkinson's data

Problem context

Implementation

Pinned Loading

  1. nuropulse-mobile nuropulse-mobile Public

    Parkinson’s companion app that screens for hand tremor in under half a minute using just your phone’s sensors, then connects you and your neurologist with your medication and tremor history.

    Dart 1

  2. nuropulse-web nuropulse-web Public

    Web dashboard for neurologists to review patients’ measurement schedule and medication timing, built with React Router and Supabase for the NuroPulse Parkinson’s ecosystem.

    TypeScript 1

Repositories

Showing 5 of 5 repositories

Top languages

Loading…

Most used topics

Loading…