Skip to content

docs: Privacy Policy + Play Store Data Safety + in-app link (#202)#267

Merged
RaheemJnr merged 1 commit into
mainfrom
docs/privacy-data-safety-202
May 21, 2026
Merged

docs: Privacy Policy + Play Store Data Safety + in-app link (#202)#267
RaheemJnr merged 1 commit into
mainfrom
docs/privacy-data-safety-202

Conversation

@RaheemJnr
Copy link
Copy Markdown
Owner

@RaheemJnr RaheemJnr commented May 21, 2026

Summary

Canonical Privacy Policy, Play Store Data Safety reference, and the in-app link from Settings to the public Privacy Policy.

docs/PRIVACY.md

Canonical Privacy Policy covering the v1.6.x feature surface end-to-end. Sections:

  • Data we collect (none)
  • Data stored on your device (wallet keys, address book contacts, sync state, cached blockchain data, app preferences)
  • Network communications (libp2p to CKB peers, optional GitHub Releases poll, optional explorer Custom Tabs)
  • Permissions (every manifest declaration explained)
  • Data deletion (per-wallet + uninstall paths)
  • Children's privacy
  • Third-party services (none)
  • Open source / GitHub link
  • Changes-to-policy procedure
  • Contact: GitHub Issues + Discussions + privacy@pocket-node.com
  • Jurisdictional notes for GDPR + CCPA/CPRA (both essentially no-ops because no data is collected)

The doc is also the source the website's /privacy page will eventually render from (sync mechanism mirrors USER_GUIDE.md).

docs/PLAY_STORE_DATA_SAFETY.md

Copy-pasteable answers for the Play Console Data Safety form:

  • Top-level: No to data collection or sharing
  • Encrypted in transit: Yes (libp2p Noise + Yamux + TCP; HTTPS for the two optional public-API uses)
  • User-deletable: Yes (per-wallet Settings flow + system uninstall)
  • Per-permission rationale table
  • Network-access explanation
  • Reviewer guidance pointing at the exact source directories that contain all network code
  • Change procedure so future contributors keep the file in sync with the Play Console submission

In-app link

SettingsScreen.kt gets a new Privacy Policy row under About → Open Source. Uses Lucide.ShieldCheck (already imported), opens https://pocket-node.com/privacy via the existing Custom Tabs helper. New settings_privacy_policy string resource.

Why pocket-node.com (not pocketnode.app)

Per the v2.0.0 launch plan, pocket-node.com is the new canonical public domain. The in-app PRIVACY_URL points there directly. A follow-up sweep will update the website's metadataBase and other pocketnode.app references.

Test plan

  • ./gradlew compileDebugKotlin succeeds
  • New Lucide.ShieldCheck icon already imported (no new import needed)
  • settings_privacy_policy string resource present in values/strings.xml
  • Visual check on a debug build: Settings scrolls to About → Open Source → Privacy Policy rows in the right order
  • Open Privacy Policy: opens Custom Tabs against https://pocket-node.com/privacy (requires domain to be live)

Refs #202, #200, #205

Summary by CodeRabbit

  • New Features

    • Added Privacy Policy link to the Settings screen for easy access
  • Documentation

    • Published comprehensive Privacy Policy detailing data handling, permissions, and user privacy rights
    • Published Data Safety disclosure for Play Store compliance

Review Change Stack

What ships

- docs/PRIVACY.md: canonical Privacy Policy. Substance covers the
  full v1.6.x feature surface — Address Book contacts, V2 Keystore
  + Argon2id PIN, sync state, DAO compensation cache, GitHub
  Releases poll for the in-app updater, Custom Tabs hand-off for
  the public block explorer. Includes jurisdictional notes for
  GDPR and CCPA/CPRA (both essentially no-ops because no data is
  collected). Lists every permission the manifest declares and
  the specific feature each one supports.

- docs/PLAY_STORE_DATA_SAFETY.md: copy-pasteable Data Safety form
  answers for the Play Console. Top-level "No" for data
  collection, per-permission rationale table, network-access
  explanation, deletion paths, reviewer guidance pointing at the
  exact directories in the source tree they can audit. Includes
  the change procedure so future contributors know to keep the
  file in sync with the Play Console submission.

- Settings → Privacy Policy: new SettingsLinkRow in the About
  section. Uses Lucide.ShieldCheck (already imported in the
  same file), opens https://pocket-node.com/privacy via the
  shared Custom Tabs helper. New PRIVACY_URL constant + new
  `settings_privacy_policy` string resource.

- .gitignore: whitelisted the two new docs/ files alongside
  USER_GUIDE.md and GRANT_COMPLETION_REPORT.md.

Why pocket-node.com (not pocketnode.app)

Per the v2.0.0 launch plan, pocket-node.com is the new canonical
public domain. The in-app PRIVACY_URL points there directly so
the link is right out of the gate when the domain goes live. A
follow-up commit will sweep the website's metadataBase and the
other pocketnode.app references in the codebase.

Refs #202, #200
@vercel
Copy link
Copy Markdown

vercel Bot commented May 21, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
pocket-node Ready Ready Preview, Comment May 21, 2026 6:25pm

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 21, 2026

📝 Walkthrough

Walkthrough

This PR adds comprehensive privacy and compliance documentation to the Pocket Node app. It introduces a Privacy Policy document detailing data handling practices, a Play Store Data Safety form describing data collection and encryption, and integrates a direct link to the privacy policy in the Android Settings interface.

Changes

Privacy and Compliance Documentation

Layer / File(s) Summary
Privacy Policy and Data Safety Documentation
docs/PRIVACY.md, docs/PLAY_STORE_DATA_SAFETY.md, .gitignore
Introduces Privacy Policy covering no external data collection, on-device storage (wallet keys, address book, blockchain cache), network communications (libp2p Noise+Yamux, HTTPS), and GDPR/CCPA compliance. Adds Play Store Data Safety form with structured responses on encryption in transit, user deletion pathways, permission rationale, and policy change procedures. Updates .gitignore to track both documents as exceptions to the broader docs/* ignore pattern.
In-App Privacy Policy Link
android/app/src/main/java/.../SettingsScreen.kt, android/app/src/main/res/values/strings.xml
Adds PRIVACY_URL constant to SettingsScreen.kt pointing to the canonical policy URL, creates Android string resource settings_privacy_policy with label "Privacy Policy", and wires a new clickable row in the Settings "ABOUT" section that opens the privacy policy URL in the browser.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~5 minutes

Possibly related issues

  • #202: PR implements the requested Privacy Policy and Play Store Data Safety documentation files, adds the canonical privacy URL constant, and integrates an in-app Settings link to the privacy policy—directly addressing the compliance and transparency requirements described in issue #202.

Poem

🐰 A privacy pledge, now clear and bright,
Through docs and settings, shining light!
No data flows beyond the wall—
Just local keys and blockchain's call.
Trust and safety, bundled tight,
Pocket Node stands strong and right! 🔐

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main changes: adding Privacy Policy and Play Store Data Safety documentation plus an in-app Settings link.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/privacy-data-safety-202

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f5933dea08

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +19 to +22
The only network traffic the app generates is:
- Peer-to-peer libp2p connections from the embedded CKB light client to public Nervos CKB nodes. The libp2p transport in use is Noise + Yamux over TCP, which encrypts all peer-to-peer traffic.
- HTTPS to GitHub's public Releases API for the optional in-app updater.
- HTTPS to public CKB block explorers when the user taps a transaction or block link.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Correct Data Safety network-traffic disclosure

This section states that the listed three items are the app’s only network traffic, but the app also performs HTTPS calls to fiat price APIs (https://api.coingecko.com/... and fallback https://api.binance.com/...) in PriceRepository.fetchFromCoinGecko/fetchFromBinance, and that path is invoked from HomeViewModel.initializeWallet() via fetchPrice() without any separate opt-in. Shipping these incomplete statements as the Play Console source-of-truth can produce an inaccurate Data Safety submission.

Useful? React with 👍 / 👎.

Comment thread docs/PRIVACY.md
Comment on lines +40 to +43
In addition, the App may connect to two specific public services if you opt in:

- **GitHub Releases API** to check for new versions of the App when the in-app updater is enabled. The request is a public unauthenticated read; no identifying information is sent beyond your IP address (visible to GitHub as the request origin).
- **Public CKB block explorer** when you tap a transaction or block link in the App. These open in your phone's browser via Custom Tabs; the explorer operator's privacy policy applies to that session.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Include fiat-price API calls in Privacy Policy

The policy says the app may contact only two public services (GitHub Releases and block explorers) and only if the user opts in, but runtime code also calls CoinGecko/Binance for CKB/USD pricing (PriceRepository) and HomeViewModel triggers that fetch during wallet initialization. This makes the published privacy description materially inaccurate for normal app usage and should be corrected to match actual network behavior.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/PRIVACY.md (1)

104-105: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Use a single canonical authority statement.

Line 104 says both copies are authoritative, which can create legal ambiguity if they ever diverge. Keep one canonical source and label the other as a mirror.

Proposed wording adjustment
-This Privacy Policy is also published at [pocket-node.com/privacy](https://pocket-node.com/privacy) and at [docs/PRIVACY.md](https://github.com/RaheemJnr/pocket-node/blob/main/docs/PRIVACY.md) in the source repository. Either copy is the authoritative version for end users.
+This Privacy Policy is published at [pocket-node.com/privacy](https://pocket-node.com/privacy). The copy at [docs/PRIVACY.md](https://github.com/RaheemJnr/pocket-node/blob/main/docs/PRIVACY.md) is a repository mirror.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/PRIVACY.md` around lines 104 - 105, The paragraph in PRIVACY.md
currently states both online copies are authoritative, creating ambiguity;
update that sentence to designate a single canonical source (either the website
URL pocket-node.com/privacy or the repository docs/PRIVACY.md) and explicitly
label the other location as a mirror. Edit the sentence in the file (the
paragraph referencing pocket-node.com/privacy and docs/PRIVACY.md) so it reads
that the chosen source is the authoritative policy and the alternate is a mirror
copy for convenience.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/PLAY_STORE_DATA_SAFETY.md`:
- Around line 62-64: Add a language hint to the fenced code block containing the
privacy URL so markdownlint MD040 is avoided: change the opening fence from ```
to ```text for the block that currently contains
"https://pocket-node.com/privacy" (the fenced code block in
PLAY_STORE_DATA_SAFETY.md) so the block explicitly declares its language.
- Around line 72-73: The "No publisher-operated servers" claim conflicts with
later mentions of automatic light-client peer traffic and optional updater
polling; update the first bullet to explicitly acknowledge that while the app
has no publisher-operated analytics/auth servers, it does initiate automatic
peer-to-peer traffic for the light client and optional updater polling. Edit the
"No publisher-operated servers" bullet (and anywhere it asserts "every byte...
is user-initiated") to say user actions drive most traffic but the app also
performs automatic light-client peer networking (see external/ckb-light-client)
and optional updater polling (see the updater module under
android/app/src/.../data/update), and keep the openness note about verifiability
and QR scanner code unchanged.

In `@docs/PRIVACY.md`:
- Around line 22-23: Replace the overbroad sentence "Nothing leaves your phone
unless you explicitly initiate a blockchain transaction" with a precise
statement that acknowledges background network operations used by the app (e.g.,
peer sync, update checks, explorer queries). Edit the privacy text to say that
user-generated content is kept locally but certain metadata and network requests
(peer synchronization, update checks, and optional explorer queries) may be sent
or fetched automatically; mention that explicit transactions to the blockchain
are separate and require user action. Ensure the revised sentence appears where
the original claim is currently written so readers see the corrected data-flow
description.

---

Outside diff comments:
In `@docs/PRIVACY.md`:
- Around line 104-105: The paragraph in PRIVACY.md currently states both online
copies are authoritative, creating ambiguity; update that sentence to designate
a single canonical source (either the website URL pocket-node.com/privacy or the
repository docs/PRIVACY.md) and explicitly label the other location as a mirror.
Edit the sentence in the file (the paragraph referencing pocket-node.com/privacy
and docs/PRIVACY.md) so it reads that the chosen source is the authoritative
policy and the alternate is a mirror copy for convenience.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 36b0a79a-1a3a-47e6-ab45-08cb088a0197

📥 Commits

Reviewing files that changed from the base of the PR and between 728b3f1 and f5933de.

📒 Files selected for processing (5)
  • .gitignore
  • android/app/src/main/java/com/rjnr/pocketnode/ui/screens/settings/SettingsScreen.kt
  • android/app/src/main/res/values/strings.xml
  • docs/PLAY_STORE_DATA_SAFETY.md
  • docs/PRIVACY.md

Comment on lines +62 to +64
```
https://pocket-node.com/privacy
```
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add a language hint to the fenced code block.

This avoids markdownlint MD040 warnings.

Proposed fix
-```
+```text
 https://pocket-node.com/privacy
</details>

<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion

🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 62-62: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/PLAY_STORE_DATA_SAFETY.md` around lines 62 - 64, Add a language hint to
the fenced code block containing the privacy URL so markdownlint MD040 is
avoided: change the opening fence from ``` to ```text for the block that
currently contains "https://pocket-node.com/privacy" (the fenced code block in
PLAY_STORE_DATA_SAFETY.md) so the block explicitly declares its language.

Comment on lines +72 to +73
1. **No publisher-operated servers.** Every byte the app sends leaves the device by user-initiated action (a transaction broadcast or a manual QR scan). There is no analytics endpoint, no auth server, no push notification gateway, no remote feature flag service, no remote logging.
2. **Open source.** The reviewer can verify every Data Safety claim by reading the source at `https://github.com/RaheemJnr/pocket-node`. The light client's network traffic lives in `external/ckb-light-client/`; the in-app updater lives in `android/app/src/main/java/com/rjnr/pocketnode/data/update/`; the QR scanner lives in `android/app/src/main/java/com/rjnr/pocketnode/ui/screens/scanner/`. There is no other network code.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fix contradictory “user-initiated only” network claim.

Line 72 says every byte sent is user-initiated, but the same doc states automatic light-client peer traffic (and optional updater polling). This inconsistency can hurt Play review credibility.

Proposed wording adjustment
-1. **No publisher-operated servers.** Every byte the app sends leaves the device by user-initiated action (a transaction broadcast or a manual QR scan). There is no analytics endpoint, no auth server, no push notification gateway, no remote feature flag service, no remote logging.
+1. **No publisher-operated servers.** The app communicates directly with public CKB peers for wallet functionality, and optionally with public services explicitly described above (GitHub Releases API, explorer links). There is no analytics endpoint, no auth server, no push notification gateway, no remote feature flag service, and no remote logging.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/PLAY_STORE_DATA_SAFETY.md` around lines 72 - 73, The "No
publisher-operated servers" claim conflicts with later mentions of automatic
light-client peer traffic and optional updater polling; update the first bullet
to explicitly acknowledge that while the app has no publisher-operated
analytics/auth servers, it does initiate automatic peer-to-peer traffic for the
light client and optional updater polling. Edit the "No publisher-operated
servers" bullet (and anywhere it asserts "every byte... is user-initiated") to
say user actions drive most traffic but the app also performs automatic
light-client peer networking (see external/ckb-light-client) and optional
updater polling (see the updater module under android/app/src/.../data/update),
and keep the openness note about verifiability and QR scanner code unchanged.

Comment thread docs/PRIVACY.md
Comment on lines +22 to +23
All data generated by the App is stored locally on your Android device. Nothing leaves your phone unless you explicitly initiate a blockchain transaction. Locally stored data includes:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Correct the data-flow claim in Line 22.

“Nothing leaves your phone unless you explicitly initiate a blockchain transaction” conflicts with your own documented peer sync/update-check/explorer flows. This overclaim can create disclosure mismatch risk.

Proposed wording adjustment
-All data generated by the App is stored locally on your Android device. Nothing leaves your phone unless you explicitly initiate a blockchain transaction. Locally stored data includes:
+All data generated by the App is stored locally on your Android device. The app performs network communication only as described in the “Network communications” section (peer sync, optional update checks, optional explorer opens). Locally stored data includes:
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
All data generated by the App is stored locally on your Android device. Nothing leaves your phone unless you explicitly initiate a blockchain transaction. Locally stored data includes:
All data generated by the App is stored locally on your Android device. The app performs network communication only as described in the "Network communications" section (peer sync, optional update checks, optional explorer opens). Locally stored data includes:
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/PRIVACY.md` around lines 22 - 23, Replace the overbroad sentence
"Nothing leaves your phone unless you explicitly initiate a blockchain
transaction" with a precise statement that acknowledges background network
operations used by the app (e.g., peer sync, update checks, explorer queries).
Edit the privacy text to say that user-generated content is kept locally but
certain metadata and network requests (peer synchronization, update checks, and
optional explorer queries) may be sent or fetched automatically; mention that
explicit transactions to the blockchain are separate and require user action.
Ensure the revised sentence appears where the original claim is currently
written so readers see the corrected data-flow description.

@RaheemJnr RaheemJnr merged commit 05c7ce2 into main May 21, 2026
7 checks passed
@RaheemJnr RaheemJnr deleted the docs/privacy-data-safety-202 branch May 21, 2026 19:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant