{"id":51327824,"url":"https://github.com/linuxct/pulseloop-android","last_synced_at":"2026-07-01T20:02:46.874Z","repository":{"id":367040690,"uuid":"1278310209","full_name":"linuxct/pulseloop-android","owner":"linuxct","description":"Subscription free, privacy first, AI-native health companion app for smart rings","archived":false,"fork":false,"pushed_at":"2026-06-24T09:59:57.000Z","size":423,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-24T11:10:34.705Z","etag":null,"topics":["ai-native","colmi","foss","health","jring","privacy-first","pulseloop","smartring"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/linuxct.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-23T17:07:05.000Z","updated_at":"2026-06-24T10:40:45.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/linuxct/pulseloop-android","commit_stats":null,"previous_names":["linuxct/pulseloop-android"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/linuxct/pulseloop-android","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxct%2Fpulseloop-android","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxct%2Fpulseloop-android/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxct%2Fpulseloop-android/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxct%2Fpulseloop-android/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/linuxct","download_url":"https://codeload.github.com/linuxct/pulseloop-android/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxct%2Fpulseloop-android/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35020872,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-01T02:00:05.325Z","response_time":130,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-native","colmi","foss","health","jring","privacy-first","pulseloop","smartring"],"created_at":"2026-07-01T20:02:45.320Z","updated_at":"2026-07-01T20:02:46.868Z","avatar_url":"https://github.com/linuxct.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\" width=\"100%\"\u003e\n  \u003cimg src=\"app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png\" alt=\"logo\"\u003e\u003cbr/\u003e\n\u003c/p\u003e\n\n# PulseLoop for Android\u003cbr/\u003e [![Latest Version](https://img.shields.io/github/v/release/linuxct/pulseloop-android)](https://github.com/linuxct/pulseloop-android/releases/latest) ![Compatibility](https://img.shields.io/badge/compat-API%2035%2B-brightgreen)\n\n\u003e **Vibe-coded project notice**\n\u003e This app was built entirely with AI assistance (Claude) from scratch — it is not a manually maintained codebase.\n\u003e The original app is **[PulseLoopIOS](https://github.com/saksham2001/PulseLoopIOS)**, an iOS app for the same smart ring hardware, which actually did the groundwork for supporting these ring devices in the first place.\n\u003e 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.\n\n## What is this?\n\nPulseLoop 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.\n\n## What's new in 2.0.0\n\nThe headline additions in this release:\n\n- **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.\n- **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.\n- **Extended ring vitals** — blood pressure, blood sugar, stress, and fatigue (jring), read alongside SpO₂, with calibration and an explicit opt-in.\n- **Browse your history** — a built-in date/calendar picker lets you scroll back to any past day on the Vitals, Activity, and Sleep screens.\n\n## Screenshots\n\nPulseLoop 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**.\n\n### Original design (V1)\n\nThe original, high-contrast, purple accents PulseLoop look — the default theme.\n\n| | | |\n|:--:|:--:|:--:|\n| \u003cimg src=\"https://i.imgur.com/m5qLxFl.png\" width=\"250\" alt=\"Today (light)\"\u003e\u003cbr/\u003e**Today**\u003cbr/\u003e\u003csub\u003eDaily dashboard · light\u003c/sub\u003e | \u003cimg src=\"https://i.imgur.com/fX8tlY4.png\" width=\"250\" alt=\"Today with extended vitals (dark)\"\u003e\u003cbr/\u003e**Today · extended vitals**\u003cbr/\u003e\u003csub\u003eBP \u0026amp; blood-sugar tiles · dark\u003c/sub\u003e | \u003cimg src=\"https://i.imgur.com/L2A43Dr.png\" width=\"250\" alt=\"Vitals 24h (light)\"\u003e\u003cbr/\u003e**Vitals · 24h**\u003cbr/\u003e\u003csub\u003eHeart rate \u0026amp; SpO₂ with tooltips · light\u003c/sub\u003e |\n| \u003cimg src=\"https://i.imgur.com/fLpTU6I.png\" width=\"250\" alt=\"Vitals week (light)\"\u003e\u003cbr/\u003e**Vitals · Week**\u003cbr/\u003e\u003csub\u003eWeekly HR, SpO₂ \u0026amp; stress · light\u003c/sub\u003e | \u003cimg src=\"https://i.imgur.com/TpmZt87.png\" width=\"250\" alt=\"Activity today (dark)\"\u003e\u003cbr/\u003e**Activity · Today**\u003cbr/\u003e\u003csub\u003eSteps, calories \u0026amp; workouts · dark\u003c/sub\u003e | \u003cimg src=\"https://i.imgur.com/LhmMZGN.png\" width=\"250\" alt=\"Activity week (dark)\"\u003e\u003cbr/\u003e**Activity · Week**\u003cbr/\u003e\u003csub\u003e7-day steps \u0026amp; calories · dark\u003c/sub\u003e |\n| \u003cimg src=\"https://i.imgur.com/mMA8jqc.png\" width=\"250\" alt=\"Sleep night (light)\"\u003e\u003cbr/\u003e**Sleep · Night**\u003cbr/\u003e\u003csub\u003eScore \u0026amp; stage architecture · light\u003c/sub\u003e | \u003cimg src=\"https://i.imgur.com/t1a0xQM.png\" width=\"250\" alt=\"Sleep week (dark)\"\u003e\u003cbr/\u003e**Sleep · Week**\u003cbr/\u003e\u003csub\u003e7-night duration trend · dark\u003c/sub\u003e | \u003cimg src=\"https://i.imgur.com/a5ILXbw.png\" width=\"250\" alt=\"Coach (dark)\"\u003e\u003cbr/\u003e**AI Coach**\u003cbr/\u003e\u003csub\u003eConversational health Q\u0026amp;A · dark\u003c/sub\u003e |\n| \u003cimg src=\"https://i.imgur.com/qS0qFre.png\" width=\"250\" alt=\"Settings (dark)\"\u003e\u003cbr/\u003e**Settings**\u003cbr/\u003e\u003csub\u003eProfile, ring \u0026amp; goals · dark\u003c/sub\u003e | \u003cimg src=\"https://i.imgur.com/NkpfItc.png\" width=\"250\" alt=\"Debug (light)\"\u003e\u003cbr/\u003e**Debug**\u003cbr/\u003e\u003csub\u003eLive BLE packet feed · light\u003c/sub\u003e | \u003cimg src=\"https://i.imgur.com/7pJARRT.png\" width=\"250\" alt=\"Debug archive (light)\"\u003e\u003cbr/\u003e**Debug archive**\u003cbr/\u003e\u003csub\u003eDebug file generation \u0026amp; export · light\u003c/sub\u003e |\n\n### Material 3 Expressive with Material You — P4 mode (V2)\n\nAndroid's Material 3 Expressive design with Material You dynamic color, drawn from your wallpaper on Android 12+.\n\n| | | |\n|:--:|:--:|:--:|\n| \u003cimg src=\"https://i.imgur.com/uHvYwRI.png\" width=\"250\" alt=\"Today with extended vitals (light)\"\u003e\u003cbr/\u003e**Today · extended vitals**\u003cbr/\u003e\u003csub\u003eStep ring + BP \u0026amp; blood sugar · light\u003c/sub\u003e | \u003cimg src=\"https://i.imgur.com/8VYEcDn.png\" width=\"250\" alt=\"Today (dark)\"\u003e\u003cbr/\u003e**Today**\u003cbr/\u003e\u003csub\u003eStep ring \u0026amp; live timeline · dark\u003c/sub\u003e | \u003cimg src=\"https://i.imgur.com/lGvf48S.png\" width=\"250\" alt=\"Vitals 24h (light)\"\u003e\u003cbr/\u003e**Vitals · 24h**\u003cbr/\u003e\u003csub\u003eHeart rate \u0026amp; SpO₂ · light\u003c/sub\u003e |\n| \u003cimg src=\"https://i.imgur.com/agEgHZq.png\" width=\"250\" alt=\"Vitals week (light)\"\u003e\u003cbr/\u003e**Vitals · Week**\u003cbr/\u003e\u003csub\u003eWeekly HR, SpO₂ \u0026amp; stress · light\u003c/sub\u003e | \u003cimg src=\"https://i.imgur.com/7gu4FoV.png\" width=\"250\" alt=\"Vitals on a past day (light)\"\u003e\u003cbr/\u003e**Vitals · any past day**\u003cbr/\u003e\u003csub\u003eCalendar date browsing · light\u003c/sub\u003e | \u003cimg src=\"https://i.imgur.com/eqSHv1g.png\" width=\"250\" alt=\"Activity today (light)\"\u003e\u003cbr/\u003e**Activity · Today**\u003cbr/\u003e\u003csub\u003eSteps, distance \u0026amp; workouts · light\u003c/sub\u003e |\n| \u003cimg src=\"https://i.imgur.com/INBIlOn.png\" width=\"250\" alt=\"Choose activity (light)\"\u003e\u003cbr/\u003e**Start a workout**\u003cbr/\u003e\u003csub\u003eChoose activity + GPS · light\u003c/sub\u003e | \u003cimg src=\"https://i.imgur.com/Q6NECKj.png\" width=\"250\" alt=\"Live workout recording (light)\"\u003e\u003cbr/\u003e**Live recording**\u003cbr/\u003e\u003csub\u003eHR zones \u0026amp; live map route · light\u003c/sub\u003e | \u003cimg src=\"https://i.imgur.com/cAOfO2x.png\" width=\"250\" alt=\"Sleep night (dark)\"\u003e\u003cbr/\u003e**Sleep · Night**\u003cbr/\u003e\u003csub\u003eScore \u0026amp; stage architecture · dark\u003c/sub\u003e |\n| \u003cimg src=\"https://i.imgur.com/4cnsH3G.png\" width=\"250\" alt=\"AI Coach (dark)\"\u003e\u003cbr/\u003e**AI Coach**\u003cbr/\u003e\u003csub\u003eConversational health Q\u0026amp;A · dark\u003c/sub\u003e | \u003cimg src=\"https://i.imgur.com/ONhiABS.png\" width=\"250\" alt=\"Settings (light)\"\u003e\u003cbr/\u003e**Settings**\u003cbr/\u003e\u003csub\u003eVitals opt-in, coach \u0026amp; P4 mode · light\u003c/sub\u003e | \u003cimg src=\"https://i.imgur.com/KoTpiTe.png\" width=\"250\" alt=\"Data export (light)\"\u003e\u003cbr/\u003e**Data export**\u003cbr/\u003e\u003csub\u003eOpenTelemetry / OTLP setup · light\u003c/sub\u003e |\n\n## Features\n\n### Appearance \u0026 Themes\nPulseLoop ships with two full visual styles you can switch between at any time from Settings:\n- **Original** — the original, high-contrast, purple accents PulseLoop look (the default).\n- **Material 3 Expressive + Material You (P4 mode)** — Android's Material 3 Expressive design with Material You's dynamic, wallpaper-derived color on Android 12+.\n\nSwitching styles re-themes the entire app instantly, and the app's home-screen launcher icon automatically swaps to the matching icon.\n\n### Onboarding\nA five-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, and pairing your ring — all before landing on the main app.\n\n### Ring Pairing \u0026 Auto-Reconnect\nThe 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.\n\n### Today Dashboard\nThe home screen gives you a full picture of your day at a glance:\n- A hero insight card summarising the most important health signal of the day\n- 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\n- A 7-day trend section with bar or line charts for each metric so you can spot patterns across the week\n- A goals progress section showing how close you are to your daily step, sleep, and activity targets\n- A chronological timeline of health events throughout the day\n\n### Vitals\nDedicated 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:\n- **Heart rate**: a line chart of all HR readings; tap any point for a popup showing the exact value and timestamp\n- **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\n- **Blood pressure** (jring, opt-in): a dual-line systolic/diastolic chart with a combined `123 / 88` tooltip and clinical zone coloring\n- **Blood sugar** (jring, opt-in): an estimated glucose chart with in-range / high / low zone coloring\n- **Stress \u0026 fatigue** (jring): 0–100 scores with plain-language explanations of what they mean\n- **Per-characteristic measurement**: each card has its own Measure button to trigger a live reading on demand, shown with a pulsing \"Measuring…\" indicator\n- **Browse history**: pick any past date to review that day's vitals\n\n\u003e 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.\n\n### Sleep\nFull sleep architecture visualisation for every night:\n- 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\n- A stage breakdown summary with total time in each stage and a sleep score, with naps and awake gaps handled correctly\n- A weekly bar chart of total sleep duration across the past 7 nights\n- **Browse history**: pick any past night to review its full breakdown\n\n### Activity\nDaily activity tracking and workout history:\n- A daily summary card with steps, distance, calories, and active minutes\n- 7-day bar charts for steps and calories to track weekly trends\n- A scrollable list of all recorded workout sessions ordered by date, with activity type, duration, and distance\n- **Browse history**: pick any past date to review that day's activity\n\n### Live Workout Recording\nStart a workout session from the Record tab:\n- Choose from multiple activity types\n- See live stats during the workout: elapsed time, current heart rate, step count, distance, and estimated calories\n- GPS route is recorded continuously throughout the session\n- After finishing, a summary screen shows total stats and an interactive map of the GPS route you travelled\n\n### AI Coach\nA conversational health coach powered by OpenAI:\n- Full chat interface with message history persisted across sessions\n- Streaming responses with a live typing cursor so you see the answer appear in real time\n- 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\n- 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\n- Follow-up suggestion chips appear after each answer so you can dig deeper with one tap\n- The coach is only aware of blood pressure and blood sugar when you have explicitly enabled the extended-vitals feature\n- Configurable OpenAI model; start a new conversation or clear history at any time\n- Requires signing in to your OpenAI account from Settings\n\n### Data Export (OpenTelemetry)\nSend your health data to your own observability backend as OTLP/HTTP gauge metrics:\n- Works with any OTLP-compatible endpoint — Grafana Alloy / Grafana Cloud, Prometheus/Mimir, VictoriaMetrics, ClickHouse, and more\n- Authentication options: none, Basic, Bearer token, or a custom header (e.g. multi-tenant `X-Scope-OrgID`); credentials are stored **encrypted** on-device\n- **Incremental export** (only new data since the last run) or a **full backfill** of your entire history\n- Optional GPS-route export, a Wi-Fi-only toggle, and a built-in \"Test connection\" check\n- Runs in the background via WorkManager; payloads are hand-built protobuf, gzip-compressed\n- Self-contained — no SDKs or vendor lock-in; the exporter speaks the OTLP wire format directly\n\n### Settings\n- **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\n- **Goals**: configure daily step, sleep, and active-minutes targets\n- **Appearance**: switch between the Original and Material 3 Expressive with Material You themes\n- **Estimated vitals \u0026 calibration** (jring): opt in to blood pressure / blood sugar, and calibrate them against a reference cuff / glucometer reading\n- **Ring management**: view paired ring name, MAC address, battery level, firmware, and connection state; manually sync or forget the ring\n- **AI Coach**: connect or disconnect your OpenAI account and choose the model\n- **Data export**: configure the OpenTelemetry endpoint and trigger exports\n- **About**: app version and update check\n\n### Debug \u0026 Diagnostics\nA developer-facing debug screen accessible from the header:\n- A live feed of raw BLE packets received from the ring (up to the last 200), useful for verifying protocol decoding\n- A wearable event log (up to the last 100 entries) showing higher-level events like syncs and connections\n- Export all diagnostics to a JSON file and share it via the system share sheet for offline analysis\n- Clear all logs with a single tap\n\n## Supported Devices\n\n| Device | Heart Rate | SpO₂ | Steps | Sleep | Activity | Stress | Blood Pressure | Blood Sugar |\n|--------|:----------:|:----:|:-----:|:-----:|:--------:|:------:|:--------------:|:-----------:|\n| jring | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓\\* | ✓\\* |\n| Colmi R02 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | — | — |\n\n\u003e **\\* 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.\n\n\u003e **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.\n\n## Requirements\n\n- Android 15+ (API 35)\n- A supported ring device (jring or Colmi R02)\n- An OpenAI account to use the AI Coach feature (optional)\n- An OTLP/HTTP endpoint to use the Data Export feature (optional)\n\n## Building\n\n1. Clone the repository\n2. Create a `local.properties` file at the project root with:\n   ```\n   sdk.dir=/path/to/your/Android/Sdk\n   MAPS_API_KEY=your_google_maps_api_key\n   ```\n3. Open in Android Studio and run, or build via Gradle:\n   ```\n   ./gradlew assembleDebug\n   ```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinuxct%2Fpulseloop-android","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flinuxct%2Fpulseloop-android","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinuxct%2Fpulseloop-android/lists"}