Skip to content

linuxct/pulseloop-android

Repository files navigation

logo

PulseLoop for Android
Latest Version Compatibility

Vibe-coded project notice This app was built entirely with AI assistance (Claude) from scratch — it is not a manually maintained codebase. The original app is PulseLoopIOS, an iOS app for the same smart ring hardware, which actually did the groundwork for supporting these ring devices in the first place. This repository started as a full, ground-up Android port of that app, rewritten in Kotlin with Jetpack Compose, and has since grown its own feature set on top.

What is this?

PulseLoop Android is a companion app for smart health rings (jring, Colmi R02). It connects to your ring over BLE, syncs health data, lets you browse your history day by day, surfaces insights through an AI-powered coach, and can export everything to your own observability stack.

What's new in 2.1

The headline additions since 2.0.0:

  • Health Connect export — write the data PulseLoop collects into Android Health Connect (heart rate, SpO₂, HRV, temperature, steps, distance, calories, sleep, and workouts — plus estimated blood pressure and blood sugar when opted in) so any other Android health app can read it.
  • Daily AI Coach summaries — opt-in bedtime and wake-up notifications, written by the coach from your real data, recapping your day and last night's sleep.
  • Sturdier OpenTelemetry backfill — pick how far back to export (3 / 7 / 30 / 90 days or all history), reset backfill progress to re-send from scratch, and never get stuck: samples a server rejects as too old are skipped so newer data keeps flowing.

What's new in 2.0.0

The headline additions in this release:

  • Two complete UI themes — a Legacy look and a Material You look (dynamic wallpaper-based color), switchable at runtime, with the home-screen launcher icon swapping to match.
  • Data export to OpenTelemetry (OTLP) — push all of your health data to any OTLP/HTTP endpoint (Grafana, Prometheus/Mimir, VictoriaMetrics, ClickHouse, …) and graph it however you like.
  • Extended ring vitals — blood pressure, blood sugar, stress, and fatigue (jring), read alongside SpO₂, with calibration and an explicit opt-in.
  • Browse your history — a built-in date/calendar picker lets you scroll back to any past day on the Vitals, Activity, and Sleep screens.

Screenshots

PulseLoop ships with two complete, runtime-switchable UI styles. Both render the same data and features — they just look and feel different, so you can pick whichever you prefer from Settings → Appearance.

Original design (V1)

The original, high-contrast, purple accents PulseLoop look — the default theme.

Today (light)
Today
Daily dashboard · light
Today with extended vitals (dark)
Today · extended vitals
BP & blood-sugar tiles · dark
Vitals 24h (light)
Vitals · 24h
Heart rate & SpO₂ with tooltips · light
Vitals week (light)
Vitals · Week
Weekly HR, SpO₂ & stress · light
Activity today (dark)
Activity · Today
Steps, calories & workouts · dark
Activity week (dark)
Activity · Week
7-day steps & calories · dark
Sleep night (light)
Sleep · Night
Score & stage architecture · light
Sleep week (dark)
Sleep · Week
7-night duration trend · dark
Coach (dark)
AI Coach
Conversational health Q&A · dark
Settings (dark)
Settings
Profile, ring & goals · dark
Debug (light)
Debug
Live BLE packet feed · light
Debug archive (light)
Debug archive
Debug file generation & export · light

Material 3 Expressive with Material You — P4 mode (V2)

Android's Material 3 Expressive design with Material You dynamic color, drawn from your wallpaper on Android 12+.

Today with extended vitals (light)
Today · extended vitals
Step ring + BP & blood sugar · light
Today (dark)
Today
Step ring & live timeline · dark
Vitals 24h (light)
Vitals · 24h
Heart rate & SpO₂ · light
Vitals week (light)
Vitals · Week
Weekly HR, SpO₂ & stress · light
Vitals on a past day (light)
Vitals · any past day
Calendar date browsing · light
Activity today (light)
Activity · Today
Steps, distance & workouts · light
Choose activity (light)
Start a workout
Choose activity + GPS · light
Live workout recording (light)
Live recording
HR zones & live map route · light
Sleep night (dark)
Sleep · Night
Score & stage architecture · dark
AI Coach (dark)
AI Coach
Conversational health Q&A · dark
Settings (light)
Settings
Vitals opt-in, coach & P4 mode · light
Data export (light)
Data export
OpenTelemetry / OTLP setup · light

Features

Appearance & Themes

PulseLoop ships with two full visual styles you can switch between at any time from Settings:

  • Original — the original, high-contrast, purple accents PulseLoop look (the default).
  • Material 3 Expressive + Material You (P4 mode) — Android's Material 3 Expressive design with Material You's dynamic, wallpaper-derived color on Android 12+.

Switching styles re-themes the entire app instantly, and the app's home-screen launcher icon automatically swaps to the matching icon.

Onboarding

An eleven-step guided setup walks you through creating your profile (name, age, sex, height, weight), setting a health baseline, configuring daily goals for steps, sleep, and active minutes, opting in to the estimated blood-pressure / blood-sugar vitals, signing in to the AI Coach, enabling the daily summary notifications, setting up OpenTelemetry data export, enabling Health Connect export, choosing your theme, and pairing your ring — all before landing on the main app. Every step after the welcome and baseline screens is optional and can be skipped.

Ring Pairing & Auto-Reconnect

The pairing screen scans for nearby BLE devices and highlights rings it recognizes (jring, Colmi R02) with signal strength (RSSI) so you can pick the right one. Once paired, the app registers the ring with Android's Companion Device Manager, which means the app reconnects automatically whenever the ring comes into range — no manual action required. Connection state (scanning, connecting, connected, disconnected) is reflected everywhere in real time.

Today Dashboard

The home screen gives you a full picture of your day at a glance:

  • A hero insight card summarising the most important health signal of the day
  • Metric tiles covering steps, active calories, heart rate, SpO₂, sleep duration, and distance — each with a mini sparkline of the last 7 readings — plus optional blood-pressure and blood-sugar tiles when the extended-vitals feature is enabled
  • A 7-day trend section with bar or line charts for each metric so you can spot patterns across the week
  • A goals progress section showing how close you are to your daily step, sleep, and activity targets
  • A chronological timeline of health events throughout the day

Vitals

Dedicated charts for continuous health metrics, all with tap-to-inspect tooltips, a dotted reference guideline, and 00:00 / 06:00 / 12:00 / 18:00 time markers:

  • Heart rate: a line chart of all HR readings; tap any point for a popup showing the exact value and timestamp
  • SpO₂: a line chart of blood oxygen readings; since the ring does not store SpO₂ in its own history, the app automatically triggers a live measurement on every sync cycle and saves the result
  • Blood pressure (jring, opt-in): a dual-line systolic/diastolic chart with a combined 123 / 88 tooltip and clinical zone coloring
  • Blood sugar (jring, opt-in): an estimated glucose chart with in-range / high / low zone coloring
  • Stress & fatigue (jring): 0–100 scores with plain-language explanations of what they mean
  • Per-characteristic measurement: each card has its own Measure button to trigger a live reading on demand, shown with a pulsing "Measuring…" indicator
  • Browse history: pick any past date to review that day's vitals — the line charts replay a quick draw-in animation each time you switch range or jump to a different day

Blood pressure and blood sugar are estimates produced by an inexpensive ring sensor. They are off by default, hidden behind a Settings opt-in, and always treated as low-confidence — including by the AI Coach.

Sleep

Full sleep architecture visualisation for every night:

  • A stage timeline chart showing the chronological sequence of Awake, REM, Light, and Deep sleep blocks — tap anywhere for a tooltip with the stage and time at that point
  • A stage breakdown summary with total time in each stage and a sleep score, with naps and awake gaps handled correctly
  • A weekly bar chart of total sleep duration across the past 7 nights
  • Browse history: pick any past night to review its full breakdown

Activity

Daily activity tracking and workout history:

  • A daily summary card with steps, distance, calories, and active minutes
  • 7-day bar charts for steps and calories to track weekly trends
  • A scrollable list of all recorded workout sessions ordered by date, with activity type, duration, and distance
  • Browse history: pick any past date to review that day's activity

Live Workout Recording

Start a workout session from the Record tab:

  • Choose from multiple activity types
  • See live stats during the workout: elapsed time, current heart rate, step count, distance, and estimated calories
  • GPS route is recorded continuously throughout the session
  • After finishing, a summary screen shows total stats, a heart-rate card with the session's average, minimum, and maximum plus a chart of HR across the workout, and an interactive map of the GPS route you travelled (the map follows your light/dark theme)

AI Coach

A conversational health coach powered by OpenAI:

  • Full chat interface with message history persisted across sessions
  • Streaming responses with a live typing cursor so you see the answer appear in real time
  • The coach has access to a broad suite of data tools — heart rate, SpO₂, sleep, activity, steps and goals, workout history, the extended vitals, and personal memory — and queries your actual data before answering
  • Responses include a title, summary, optional bullet points, an embedded trend chart with labelled axes where relevant, a confidence level (high / medium / low / insufficient data), optional data-quality notes, and safety callouts for any health-sensitive observations
  • Follow-up suggestion chips appear after each answer so you can dig deeper with one tap
  • The coach is only aware of blood pressure and blood sugar when you have explicitly enabled the extended-vitals feature
  • Optional daily summaries: opt in to a warm evening recap of your day at bedtime and a morning recap of last night's sleep when you wake — each written by the coach from your real data and delivered as a system notification (with a canned fallback when the coach isn't signed in)
  • Configurable OpenAI model; start a new conversation or clear history at any time
  • Requires signing in to your OpenAI account from Settings

Data Export (OpenTelemetry)

Send your health data to your own observability backend as OTLP/HTTP gauge metrics:

  • Works with any OTLP-compatible endpoint — Grafana Alloy / Grafana Cloud, Prometheus/Mimir, VictoriaMetrics, ClickHouse, and more
  • Authentication options: none, Basic, Bearer token, or a custom header (e.g. multi-tenant X-Scope-OrgID); credentials are stored encrypted on-device
  • Incremental export (only new data since the last run) or a full backfill of your entire history
  • Backfill window: choose how far back to export — the last 3, 7, 30, or 90 days, or all history
  • Resilient backfill: samples your server rejects as too old (outside its out-of-order / ingestion window, e.g. Grafana Cloud / Mimir) are skipped and the watermark advances past them, so a stuck oldest window never blocks newer data from flowing — with a "skipped, too old" count surfaced per type
  • Reset backfill progress: a confirm-guarded action that clears the record of what has already been exported and re-sends your whole history from scratch (data already stored on your server is left untouched)
  • Per-data-type export status: rows showing the last exported timestamp for each metric, along with any error and the skipped count
  • Optional GPS-route export, a Wi-Fi-only toggle, and a built-in "Test connection" check
  • Runs in the background via WorkManager; payloads are hand-built protobuf, gzip-compressed
  • Self-contained — no SDKs or vendor lock-in; the exporter speaks the OTLP wire format directly

Health Connect Export

Write the health data PulseLoop collects into Android Health Connect so other Android health apps can read it:

  • Write-only: PulseLoop only ever writes into Health Connect and never reads or imports anything back — it requests write permissions exclusively
  • Exports heart rate, SpO₂, heart-rate variability (RMSSD), body temperature, steps, distance, total calories burned, sleep sessions (with their stages), and workouts (exercise sessions, with the GPS route when one was recorded); estimated blood pressure and blood sugar are exported only while the extended-vitals opt-in is enabled
  • Availability-aware: detects whether Health Connect is present, out of date, or unavailable on the device, and offers to install or update it as needed
  • Runtime permission flow: enabling the export launches Health Connect's own permission dialog, and the export stays off until permissions are granted
  • Incremental background sync: runs in the background via WorkManager, keeping a per-type high-water mark so each run only writes new data — the first run backfills your history, and deterministic record IDs make re-sends idempotent upserts (no duplicates)
  • Opt in during onboarding or from a dedicated Settings entry, with per-data-type export status rows

Settings

  • Profile: view and edit your name, age, biological sex, height, and weight — used for calorie estimation (Mifflin-St Jeor BMR), personalised coach context, and pushed to the ring to improve its estimates
  • Goals: configure daily step, sleep, and active-minutes targets
  • Appearance: switch between the Original and Material 3 Expressive with Material You themes
  • Estimated vitals & calibration (jring): opt in to blood pressure / blood sugar, and calibrate them against a reference cuff / glucometer reading
  • Ring management: view paired ring name, MAC address, battery level, firmware, and connection state; manually sync or forget the ring
  • AI Coach: connect or disconnect your OpenAI account and choose the model
  • Daily summary: turn the bedtime / wake-up coach notifications on or off and set your bedtime
  • Data export: configure the OpenTelemetry endpoint, backfill window, and trigger exports
  • Health Connect: enable writing your data into Android Health Connect, grant permissions, and run an export or backfill
  • About: app version and update check

Debug & Diagnostics

A developer-facing debug screen accessible from the header:

  • A live feed of raw BLE packets received from the ring (up to the last 200), useful for verifying protocol decoding
  • A wearable event log (up to the last 100 entries) showing higher-level events like syncs and connections
  • Export all diagnostics to a JSON file and share it via the system share sheet for offline analysis
  • Clear all logs with a single tap

Supported Devices

Device Heart Rate SpO₂ Steps Sleep Activity Stress Blood Pressure Blood Sugar
jring ✓* ✓*
Colmi R02

* Estimated, opt-in, low-confidence. Blood pressure and blood sugar are derived estimates from the jring sensor, off by default and gated behind a Settings opt-in. The jring additionally reports a fatigue score; the Colmi R02 additionally reports HRV and skin temperature.

jring SpO₂ note: The jring does not store SpO₂ readings in its internal history the way it does for heart rate. The app works around this by automatically triggering a live SpO₂ measurement on every sync cycle. An additional on-demand measurement can also be triggered at any time from the Vitals screen.

Requirements

  • Android 15+ (API 35)
  • A supported ring device (jring or Colmi R02)
  • An OpenAI account to use the AI Coach feature (optional)
  • An OTLP/HTTP endpoint to use the Data Export feature (optional)
  • Android Health Connect to use the Health Connect export feature (optional; the app prompts you to install or update it if needed)

Building

  1. Clone the repository
  2. Create a local.properties file at the project root with:
    sdk.dir=/path/to/your/Android/Sdk
    MAPS_API_KEY=your_google_maps_api_key
    
  3. Open in Android Studio and run, or build via Gradle:
    ./gradlew assembleDebug
    

About

Subscription free, privacy first, AI-native health companion app for smart rings

Topics

Resources

License

Stars

4 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors