Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Code owners for PulseLoop.
#
# When branch protection is set to "require review from Code Owners", every PR
# will require an approving review from the owner(s) listed here before it can
# be merged. Right now that's the maintainer.
#
# Syntax: <path pattern> <@owner ...>

# Default owner for everything in the repo.
* @saksham2001
105 changes: 105 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
name: "🐛 Bug report"
description: Something isn't working the way it should.
title: "[Bug]: "
labels: ["bug", "triage"]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to file a bug! Please search [existing issues](https://github.com/saksham2001/PulseLoopIOS/issues) first to avoid duplicates.

- type: textarea
id: what-happened
attributes:
label: What happened?
description: A clear description of the bug, and what you expected instead.
placeholder: When I sync sleep from my Colmi R02, REM minutes show as 0…
validations:
required: true

- type: textarea
id: steps
attributes:
label: Steps to reproduce
description: Exact steps so we can see it too.
placeholder: |
1. Connect ring
2. Open Sleep tab
3. Pull to sync
4. See …
validations:
required: true

- type: dropdown
id: ring
attributes:
label: Which ring are you using?
options:
- "jring (generic SMART_RING / 56ff)"
- "Colmi R02"
- "Colmi R03 / R06 / R07 / R09 / R10 / R12"
- "Colmi R11"
- "Yawell R05 / R10 / R11 / H59"
- "Other / not sure"
- "No ring — using demo data"
validations:
required: true

- type: input
id: ios-version
attributes:
label: iOS version
placeholder: "e.g. iOS 26.4"
validations:
required: true

- type: input
id: device
attributes:
label: iPhone model
placeholder: "e.g. iPhone 16 Pro"
validations:
required: false

- type: input
id: app-version
attributes:
label: PulseLoop version / commit
description: Settings → About, or the git commit you built from.
placeholder: "e.g. main @ a1b2c3d"
validations:
required: false

- type: dropdown
id: area
attributes:
label: Which area is affected?
options:
- "BLE connection / pairing"
- "Data sync / decoding"
- "Today / Vitals / Sleep / Activity UI"
- "Workout recording / Live Activity"
- "AI Coach"
- "Notifications"
- "Other"
validations:
required: true

- type: textarea
id: logs
attributes:
label: Logs / screenshots
description: Console logs, crash text, or screenshots. Please redact anything personal.
render: shell
validations:
required: false

- type: checkboxes
id: checks
attributes:
label: Before submitting
options:
- label: I searched existing issues and this isn't a duplicate.
required: true
- label: I removed any personal health data / secrets from logs and screenshots.
required: true
11 changes: 11 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
blank_issues_enabled: false
contact_links:
- name: 💬 Questions & discussion
url: https://github.com/saksham2001/PulseLoopIOS/discussions
about: Ask questions, share setups, or discuss ideas before filing an issue.
- name: 🔒 Report a security or privacy vulnerability
url: https://github.com/saksham2001/PulseLoopIOS/security/advisories/new
about: Please report vulnerabilities privately — do NOT open a public issue.
- name: 📖 Project writeup
url: https://sakshambhutani.xyz/projects/20_project/
about: How PulseLoop works, in depth.
61 changes: 61 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
name: "✨ Feature request"
description: Suggest an idea or improvement for PulseLoop.
title: "[Feature]: "
labels: ["enhancement", "triage"]
body:
- type: markdown
attributes:
value: |
Thanks for the idea! Please check the [Roadmap in the README](https://github.com/saksham2001/PulseLoopIOS#goals--roadmap) and [existing issues](https://github.com/saksham2001/PulseLoopIOS/issues) first.

- type: textarea
id: problem
attributes:
label: What problem does this solve?
description: What are you trying to do that's hard or impossible today?
placeholder: "I want to … but currently …"
validations:
required: true

- type: textarea
id: solution
attributes:
label: Proposed solution
description: What would you like to see happen?
validations:
required: true

- type: dropdown
id: area
attributes:
label: Area
options:
- "New wearable support (use the wearable template instead if you have a specific ring)"
- "AI Coach (tools, prompts, on-device LLM)"
- "Data / decoding / sync"
- "UI / DesignSystem"
- "Workouts / Live Activity"
- "Apple Health integration"
- "Privacy / transparency"
- "Other"
validations:
required: true

- type: textarea
id: alternatives
attributes:
label: Alternatives considered
description: Other approaches you thought about, and why you prefer this one.
validations:
required: false

- type: dropdown
id: contribute
attributes:
label: Would you be willing to work on this?
options:
- "Yes, I'd like to implement it"
- "Maybe, with some guidance"
- "No, just suggesting"
validations:
required: false
109 changes: 109 additions & 0 deletions .github/ISSUE_TEMPLATE/new_wearable_support.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
name: "📟 New wearable support"
description: Request or report support for a new ring / wearable.
title: "[Wearable]: "
labels: ["wearable", "enhancement", "triage"]
body:
- type: markdown
attributes:
value: |
PulseLoop is built around a **device-agnostic driver layer** (`RingProtocol/`), so adding a
wearable means writing a driver that declares its capabilities and decodes its packets.
The more protocol detail you can give here, the more likely this gets implemented — and the
easier it is to do it without owning the hardware. See [CONTRIBUTING.md](../CONTRIBUTING.md)
for how the driver layer works.

- type: input
id: model
attributes:
label: Ring / wearable model
placeholder: "e.g. Colmi R08, Oura-clone XYZ, …"
validations:
required: true

- type: input
id: advertised-name
attributes:
label: Advertised BLE name
description: The name it broadcasts (visible in a BLE scanner app like LightBlue / nRF Connect).
placeholder: "e.g. R08_A1B2, SMART_RING, COLMI R1x…"
validations:
required: false

- type: input
id: ble-service
attributes:
label: Primary BLE service UUID(s)
description: The custom service the ring exposes (from a BLE scanner).
placeholder: "e.g. 6e40fff0-…, 56ff, de5bf728-…"
validations:
required: false

- type: textarea
id: characteristics
attributes:
label: Characteristics (write / notify UUIDs)
description: Which characteristic do commands go to, and which one sends notifications back?
placeholder: |
Write: 6e40fff6-…
Notify: 6e40fff7-…
validations:
required: false

- type: checkboxes
id: capabilities
attributes:
label: Which capabilities does this device have? (best guess is fine)
options:
- label: Heart rate (spot)
- label: Heart rate (history)
- label: Heart rate (live / workout)
- label: SpO₂
- label: Steps / distance / calories
- label: Sleep stages
- label: REM sleep
- label: HRV
- label: Stress
- label: Body temperature
- label: Battery level
- label: Find device

- type: textarea
id: packets
attributes:
label: Known packet formats / captures
description: >
If you've sniffed any packets (e.g. via the vendor app + a BLE logger), paste the raw
20-byte command/notification bytes here. This is the single most useful thing for adding a driver.
render: text
validations:
required: false

- type: input
id: vendor-app
attributes:
label: Vendor app it ships with
placeholder: "e.g. QRing, Colmi, GloryFit, Da Fit"
validations:
required: false

- type: dropdown
id: have-hardware
attributes:
label: Do you have this device and can you test a driver?
options:
- "Yes — I own it and can test builds"
- "Yes — and I can capture packets"
- "No — just requesting support"
validations:
required: true

- type: dropdown
id: contribute
attributes:
label: Would you like to write the driver yourself?
options:
- "Yes, I'd like to implement it"
- "Maybe, with guidance"
- "No, just requesting"
validations:
required: false
60 changes: 60 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<!--
Thanks for contributing to PulseLoop! 🫀
Please fill this out so your PR can be reviewed quickly. Delete sections that
don't apply. PRs need (1) all CI checks green and (2) one approving review
before they can be merged.
-->

## Summary

<!-- What does this PR do, and why? Keep it short. -->

## Related issues

<!-- e.g. "Closes #123" / "Part of #45". Link an issue when you can. -->

## Type of change

- [ ] 🐛 Bug fix (non-breaking change that fixes an issue)
- [ ] ✨ New feature (non-breaking change that adds functionality)
- [ ] 📟 New / improved wearable support (BLE driver layer)
- [ ] 🤖 Coach / LLM change (tools, prompts, orchestration)
- [ ] 🎨 UI / DesignSystem change
- [ ] 🧹 Refactor / chore (no behavior change)
- [ ] 📝 Docs only
- [ ] ⚠️ Breaking change (existing data, settings, or APIs change)

## How was this tested?

<!--
PulseLoop's BLE + Live Activity features need a REAL device — the simulator
can't reach the ring. Tell us what you actually ran:
-->

- [ ] Added / updated unit tests (`PulseLoopTests`)
- [ ] Ran the test suite locally (`⌘U` in Xcode)
- [ ] Tested on a physical device with a real ring — model: <!-- e.g. Colmi R02 -->
- [ ] Tested with demo data (`-seedDemo YES`, no hardware)
- [ ] N/A (docs / non-code change)

## Privacy & data

<!--
PulseLoop is privacy-first: health data stays on device, and the only thing that
leaves is a coach question the user chooses to send. Confirm this PR keeps that promise.
-->

- [ ] This change does **not** send health data off-device without explicit user action.
- [ ] No secrets, API keys, or personal data are committed.
- [ ] N/A

## Screenshots / recordings

<!-- For UI changes, before/after screenshots or a screen recording help a lot. -->

## Checklist

- [ ] My code follows the project's style (SwiftLint passes).
- [ ] I ran the tests and they pass.
- [ ] I updated docs / README where relevant.
- [ ] I read the [Contributing guide](../CONTRIBUTING.md).
Loading
Loading