Skip to content

Add payjoin ohttp relay settings with cloud backup support - #842

Open
Sandipmandal25 wants to merge 4 commits into
masterfrom
feat/ohttp-relay-settings
Open

Add payjoin ohttp relay settings with cloud backup support#842
Sandipmandal25 wants to merge 4 commits into
masterfrom
feat/ohttp-relay-settings

Conversation

@Sandipmandal25

@Sandipmandal25 Sandipmandal25 commented Jul 19, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds a new PayJoin Relay settings screen on iOS and Android, allowing users to configure a custom OHTTP relay URL for PayJoin sends. When no custom relay is configured, Cove continues using the built-in public relays (relay.payjoin.org, ohttp.achow101.com, pj.bobspacebkk.com).

Changes

  • added PayJoin Relay settings screen on iOS and Android
  • supports configuring a custom OHTTP relay URL
  • validates relay URLs in Rust (https only)
  • stores the canonical parsed URL and returns the normalized value to the UI
  • re-validates on read so invalid values can never be returned from storage
  • clearing the field restores the default public relay list
  • includes the setting in cloud backup export/import (following the block explorer settings implementation in Add custom block explorer settings #790)
  • restore skips invalid or empty relay values with a warning instead of failing the entire import

Checklist

UI

iOS Android

Summary by CodeRabbit

  • New Features
    • Added PayJoin/OHTTP relay settings to Android and iOS.
    • Users can view default relay options and set a custom HTTPS relay URL.
    • Relay settings are included in backup export and restored on import.
  • Bug Fixes
    • Invalid relay URLs are rejected, and existing valid relay settings are preserved when restoring from backup.

@coderabbitai

coderabbitai Bot commented Jul 19, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 751fd8f3-0039-4bab-9582-b1711554302a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds HTTPS-only OHTTP relay configuration with normalized persistence, backup export/import support, and Android and iOS settings screens accessible through a new settings route.

Changes

OHTTP relay configuration

Layer / File(s) Summary
Relay storage and routing contract
rust/src/database/global_config.rs, rust/src/router.rs
Adds persisted relay URL accessors, HTTPS validation and normalization, clearing behavior, related errors, tests, and the OhttpRelay settings route.
Backup export and restoration
rust/src/backup/model.rs, rust/src/backup/export.rs, rust/src/backup/import.rs, rust/src/backup/verify.rs
Adds optional relay URL backup serialization, export, validated restoration, and coverage for valid, invalid, empty, and legacy values.
Android relay settings flow
android/app/src/main/java/org/bitcoinppl/cove/flows/SettingsFlow/*, android/app/src/main/res/values/strings.xml, android/detekt-baseline.xml
Adds the settings entry and route, plus a Compose screen for viewing default relays, editing, saving, resetting, and displaying errors or success feedback.
iOS relay settings flow
ios/Cove/Flows/SettingsFlow/*
Adds the settings entry and route, plus a SwiftUI screen for viewing default relays, editing, saving, resetting, and displaying alerts or success feedback.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant RelaySettingsScreen
  participant GlobalConfigTable
  participant BackupService

  User->>RelaySettingsScreen: Enter and save relay URL
  RelaySettingsScreen->>GlobalConfigTable: Validate and persist URL
  GlobalConfigTable-->>RelaySettingsScreen: Return normalized URL or error
  BackupService->>GlobalConfigTable: Read configured relay URL
  GlobalConfigTable-->>BackupService: Return relay setting for backup
Loading

Possibly related PRs

Suggested reviewers: praveenperera

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 51.72% 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
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.
Title check ✅ Passed The title matches the main change: adding PayJoin/OHTTP relay settings with cloud backup support.
Description check ✅ Passed The description is mostly complete and covers the main required sections, though it omits the Testing and Platform Coverage section.
✨ 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 feat/ohttp-relay-settings

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.

@greptile-apps

greptile-apps Bot commented Jul 19, 2026

Copy link
Copy Markdown

Greptile Summary

This PR adds a PayJoin/OHTTP relay settings screen on iOS and Android, backed by a new Rust storage layer that validates HTTPS-only relay URLs, stores them as canonical JSON, re-validates on read, and includes them in cloud backup export/import. It also migrates gracefully from an older single-URL key to a multi-URL list.

  • Rust core: Two new GlobalConfigKey variants (OhttpRelayUrl / OhttpRelayUrls), parse_ohttp_relay_url for HTTPS-only validation, migration from the single-URL key, and payjoin::ohttp_relays() now returns custom relays (unshuffled) when set or falls back to the shuffled public defaults.
  • Backup: AppSettings gains ohttp_relay_urls with serde(default) for backward-compatible deserialization; restore_ohttp_relay_urls skips invalid entries instead of aborting the entire import, matching the block-explorer restore pattern.
  • UI: iOS uses a Form-based view with per-error-type alerts; Android uses a Compose scaffold with undo-on-delete and a SharedPreferences-backed toggle between default and custom relay sets.

Confidence Score: 5/5

Safe to merge — all changed paths are well-tested, backup import gracefully skips bad data, and error handling is correctly differentiated in both UI layers.

The relay validation, storage, migration, and backup integration all behave correctly for every realistic code path. The one inconsistency found (whitespace-only input to set_ohttp_relay_urls leaves the legacy OhttpRelayUrl key alive) requires the single-URL API to have been used beforehand, which no current UI code does — it has no practical impact today.

Files Needing Attention: rust/src/database/global_config.rs — the canonical-empty branch of set_ohttp_relay_urls should also delete OhttpRelayUrl for symmetry with the empty-input branch.

Important Files Changed

Filename Overview
rust/src/database/global_config.rs Adds OhttpRelayUrl (single) and OhttpRelayUrls (multi-URL JSON) keys, validation, migration path, and extensive tests; minor inconsistency in set_ohttp_relay_urls when all inputs are whitespace
rust/src/backup/import.rs Adds restore_ohttp_relay_urls which correctly filters invalid URLs, skips without error, and only surfaces DB-write failures; tests cover all branches
rust/src/backup/model.rs Adds ohttp_relay_urls field to AppSettings with serde(default) for backward-compatible deserialization; tests verify old backups without the field still deserialize correctly
rust/src/manager/wallet_manager/payjoin.rs ohttp_relays() now returns custom relays from DB (no shuffle) when set, or falls back to shuffled defaults; change is intentional and correctly wired
ios/Cove/Flows/SettingsFlow/OhttpRelaySettingsView.swift New SwiftUI settings view with proper error discrimination between InvalidOhttpRelayUrl and storage failures; uses multi-relay setOhttpRelayUrls API throughout
android/app/src/main/java/org/bitcoinppl/cove/flows/SettingsFlow/OhttpRelaySettingsScreen.kt New Compose screen with undo-on-delete, switch-to-defaults/custom toggle backed by SharedPreferences, and proper exception type discrimination in save()
rust/src/backup/export.rs Exports ohttp_relay_urls() (custom relays only, never hardcoded defaults) into AppSettings; correct and minimal change
rust/src/router.rs Adds OhttpRelay variant to SettingsRoute enum; straightforward and complete

Sequence Diagram

sequenceDiagram
    participant UI as iOS / Android UI
    participant FFI as UniFFI (GlobalConfigTable)
    participant DB as redb Database
    participant PJ as payjoin::ohttp_relays()
    participant Relay as OHTTP Relay

    UI->>FFI: setOhttpRelayUrls(urls)
    FFI->>FFI: "parse_ohttp_relay_url (HTTPS-only validate & normalize)"
    FFI->>DB: set OhttpRelayUrls (JSON array)
    DB-->>FFI: Ok / Err
    FFI-->>UI: canonical URLs / InvalidOhttpRelayUrl / storage error

    UI->>FFI: ohttpRelayUrls()
    FFI->>DB: get OhttpRelayUrls
    alt OhttpRelayUrls present
        DB-->>FFI: JSON array
        FFI->>FFI: re-validate each URL
    else migrate from single key
        FFI->>DB: get OhttpRelayUrl
        DB-->>FFI: single URL or None
    end
    FFI-->>UI: Vec String

    Note over PJ: On PayJoin send
    PJ->>FFI: ohttpRelayUrls()
    alt custom relays set
        FFI-->>PJ: custom list (stored order)
    else no custom relays
        FFI-->>PJ: empty list, use shuffled OHTTP_RELAYS
    end
    PJ->>Relay: OHTTP request (first relay that succeeds)
Loading

Reviews (5): Last reviewed commit: "Redesign OHTTP relay settings with card ..." | Re-trigger Greptile

Comment thread ios/Cove/Flows/SettingsFlow/OhttpRelaySettingsView.swift Outdated
Comment thread rust/src/backup/import.rs Outdated
Comment thread ios/Cove/Flows/SettingsFlow/OhttpRelaySettingsView.swift
@Sandipmandal25 Sandipmandal25 self-assigned this Jul 19, 2026
@Sandipmandal25 Sandipmandal25 added the SoB-2026 Project for Summer of Bitcoin 2026 label Jul 19, 2026
@Sandipmandal25

Copy link
Copy Markdown
Collaborator Author

@greptileai

@Sandipmandal25

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 19, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (2)
android/detekt-baseline.xml (1)

1178-1178: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Re-evaluate baseline suppression.

If you choose to log the exceptions in OhttpRelaySettingsScreen.kt (as suggested in the review for that file), this SwallowedException suppression—as well as the TooGenericExceptionCaught suppression on line 1237—will no longer be necessary and should be removed to keep the baseline clean.

🤖 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 `@android/detekt-baseline.xml` at line 1178, Remove the SwallowedException
baseline entry for OhttpRelaySettingsScreen.kt and also remove its associated
TooGenericExceptionCaught suppression. Only make these removals if the
exceptions in OhttpRelaySettingsScreen.kt are now logged, leaving unrelated
baseline suppressions unchanged.
ios/Cove/Flows/SettingsFlow/OhttpRelaySettingsView.swift (1)

77-113: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Remove ineffective isSaving state and dismiss keyboard on reset.

The isSaving state is set to true and false synchronously within a single main-thread execution cycle, because the FFI call config.setOhttpRelayUrl is synchronous. SwiftUI coalesces these state changes, meaning the UI never actually re-renders with isSaving = true.

Since the save operation completes practically instantly and the button is immediately disabled by the updated URL equality check anyway, the isSaving state is unnecessary and can be removed entirely.

Additionally, consider dismissing the keyboard in the reset() function for a consistent user experience.

♻️ Proposed refactor

Note: You can also safely remove @State private var isSaving = false (line 8) and the isSaving || check from the button's .disabled() modifier (line 58).

-    private func save() {
-        guard !isSaving else { return }
-
-        let inputToSave = input
-
-        isSaving = true
-        isInputFocused = false
+    private func save() {
+        let inputToSave = input
+        isInputFocused = false
 
         do {
             let normalized = try config.setOhttpRelayUrl(url: inputToSave)
             input = normalized ?? ""
 
             Task { `@MainActor` in
                 await dismissAllPopups()
                 try? await Task.sleep(for: .milliseconds(250))
                 await MiddlePopup(state: .success("Relay saved successfully"))
                     .dismissAfter(2)
                     .present()
             }
         } catch DatabaseError.GlobalConfig(.InvalidOhttpRelayUrl) {
             showInvalidUrlAlert = true
         } catch {
             showUpdateFailedAlert = true
         }
-
-        isSaving = false
     }
 
     private func reset() {
+        isInputFocused = false
         do {
             try config.clearOhttpRelayUrl()
             input = ""
         } catch {
             showUpdateFailedAlert = true
         }
     }
🤖 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 `@ios/Cove/Flows/SettingsFlow/OhttpRelaySettingsView.swift` around lines 77 -
113, Remove the isSaving state and its guard, assignments, and button
.disabled() dependency from the settings view, since save() is synchronous and
URL equality already prevents duplicate saves. Update reset() to dismiss the
keyboard by clearing isInputFocused consistently with save().
🤖 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
`@android/app/src/main/java/org/bitcoinppl/cove/flows/SettingsFlow/OhttpRelaySettingsScreen.kt`:
- Line 66: Update the Settings screen’s config initialization around Database
and globalConfig so both the originating Database instance and GlobalConfigTable
are retained and closed via a Compose DisposableEffect when the screen leaves
composition; call close() before releasing references, using the generated
AutoCloseable APIs confirmed by the binding definitions.

In `@rust/src/database/global_config.rs`:
- Around line 405-406: Update the URL parsing error conversion in the
surrounding global configuration flow to use cove_util::ResultExt::map_err_str
instead of the manual closure, ensuring ResultExt is imported if necessary and
preserving GlobalConfigTableError::InvalidOhttpRelayUrl as the error variant.

---

Nitpick comments:
In `@android/detekt-baseline.xml`:
- Line 1178: Remove the SwallowedException baseline entry for
OhttpRelaySettingsScreen.kt and also remove its associated
TooGenericExceptionCaught suppression. Only make these removals if the
exceptions in OhttpRelaySettingsScreen.kt are now logged, leaving unrelated
baseline suppressions unchanged.

In `@ios/Cove/Flows/SettingsFlow/OhttpRelaySettingsView.swift`:
- Around line 77-113: Remove the isSaving state and its guard, assignments, and
button .disabled() dependency from the settings view, since save() is
synchronous and URL equality already prevents duplicate saves. Update reset() to
dismiss the keyboard by clearing isInputFocused consistently with save().
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 231acc33-6ffd-4d97-87c6-53aaef4170d1

📥 Commits

Reviewing files that changed from the base of the PR and between b82a236 and e2f5d25.

⛔ Files ignored due to path filters (2)
  • android/app/src/main/java/org/bitcoinppl/cove_core/cove.kt is excluded by !android/app/src/main/java/org/bitcoinppl/cove_core/**
  • ios/CoveCore/Sources/CoveCore/generated/cove.swift is excluded by !**/generated/**, !ios/CoveCore/Sources/CoveCore/generated/**
📒 Files selected for processing (14)
  • android/app/src/main/java/org/bitcoinppl/cove/flows/SettingsFlow/MainSettingsScreen.kt
  • android/app/src/main/java/org/bitcoinppl/cove/flows/SettingsFlow/OhttpRelaySettingsScreen.kt
  • android/app/src/main/java/org/bitcoinppl/cove/flows/SettingsFlow/SettingsContainer.kt
  • android/app/src/main/res/values/strings.xml
  • android/detekt-baseline.xml
  • ios/Cove/Flows/SettingsFlow/MainSettingsSections.swift
  • ios/Cove/Flows/SettingsFlow/OhttpRelaySettingsView.swift
  • ios/Cove/Flows/SettingsFlow/SettingsContainer.swift
  • rust/src/backup/export.rs
  • rust/src/backup/import.rs
  • rust/src/backup/model.rs
  • rust/src/backup/verify.rs
  • rust/src/database/global_config.rs
  • rust/src/router.rs

Comment thread rust/src/database/global_config.rs Outdated
@Sandipmandal25
Sandipmandal25 force-pushed the feat/ohttp-relay-settings branch from e2f5d25 to ebb08b3 Compare July 19, 2026 15:24
@bitcoinppl bitcoinppl deleted a comment from coderabbitai Bot Jul 19, 2026
@Sandipmandal25

Copy link
Copy Markdown
Collaborator Author

@coderabbitai re review

@Sandipmandal25

Copy link
Copy Markdown
Collaborator Author

@greptileai

@coderabbitai

coderabbitai Bot commented Jul 19, 2026

Copy link
Copy Markdown

The Comment images show the new iOS PayJoin Relay settings flow. The first screen contains the description of OHTTP relay privacy, the default relays https://relay.payjoin.org, https://ohttp.achow101.com, and https://pj.bobspacebkk.com, plus a custom relay URL field with Save and red Reset to Default actions. The second screen shows PayJoin Relay added to the General Settings list alongside Network, Appearance, Node, Block Explorer, and Currency.

@Sandipmandal25 Re-reviewing PR #842 from the current changes.

✅ Action performed

Full review finished.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (3)
rust/src/database/global_config.rs (1)

389-390: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Add a blank line after the setup binding.

As per coding guidelines, add blank lines between logical steps in function bodies, specifically after setup/result bindings and before new control flow.

♻️ Proposed fix
             let parsed = url::Url::parse(&url).ok()?;
+
             if parsed.scheme() != "https" {
🤖 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 `@rust/src/database/global_config.rs` around lines 389 - 390, Insert a blank
line between the Url parsing binding and the subsequent scheme-validation
conditional in the surrounding function, keeping the existing parsing and
control-flow logic unchanged.

Source: Coding guidelines

ios/Cove/Flows/SettingsFlow/OhttpRelaySettingsView.swift (2)

105-112: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Dismiss keyboard on reset.

Consider dismissing the keyboard when resetting to the default relays, matching the user experience in the save() method.

♻️ Proposed refactor
     private func reset() {
+        isInputFocused = false
         do {
             try config.clearOhttpRelayUrl()
             input = ""
🤖 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 `@ios/Cove/Flows/SettingsFlow/OhttpRelaySettingsView.swift` around lines 105 -
112, Update the reset() method to dismiss the keyboard when resetting succeeds,
matching the keyboard dismissal behavior already implemented in save(). Keep the
existing input reset and error-alert handling unchanged.

4-16: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Avoid double instantiation of the database configuration handle.

The Database().globalConfig() handle is currently instantiated twice: once as an inline property and once inside the init() method. You can cleanly resolve this by declaring the property type and assigning it entirely within init().

♻️ Proposed refactor
-    private let config = Database().globalConfig()
+    private let config: GlobalConfigTable
 
     `@State` private var input: String
     `@State` private var isSaving = false
     `@State` private var showInvalidUrlAlert = false
     `@State` private var showUpdateFailedAlert = false
     `@FocusState` private var isInputFocused: Bool
 
     init() {
-        let config = Database().globalConfig()
-        _input = State(initialValue: config.ohttpRelayUrl() ?? "")
+        let dbConfig = Database().globalConfig()
+        self.config = dbConfig
+        _input = State(initialValue: dbConfig.ohttpRelayUrl() ?? "")
     }
🤖 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 `@ios/Cove/Flows/SettingsFlow/OhttpRelaySettingsView.swift` around lines 4 -
16, Update OhttpRelaySettingsView so the globalConfig handle is initialized only
once inside init(). Declare config with an explicit type without an inline
initializer, assign it in init(), and use that initialized config to derive
_input while preserving the existing state behavior.
🤖 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.

Nitpick comments:
In `@ios/Cove/Flows/SettingsFlow/OhttpRelaySettingsView.swift`:
- Around line 105-112: Update the reset() method to dismiss the keyboard when
resetting succeeds, matching the keyboard dismissal behavior already implemented
in save(). Keep the existing input reset and error-alert handling unchanged.
- Around line 4-16: Update OhttpRelaySettingsView so the globalConfig handle is
initialized only once inside init(). Declare config with an explicit type
without an inline initializer, assign it in init(), and use that initialized
config to derive _input while preserving the existing state behavior.

In `@rust/src/database/global_config.rs`:
- Around line 389-390: Insert a blank line between the Url parsing binding and
the subsequent scheme-validation conditional in the surrounding function,
keeping the existing parsing and control-flow logic unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 41de6019-aff4-4d9f-9414-401780258197

📥 Commits

Reviewing files that changed from the base of the PR and between b82a236 and ebb08b3.

⛔ Files ignored due to path filters (2)
  • android/app/src/main/java/org/bitcoinppl/cove_core/cove.kt is excluded by !android/app/src/main/java/org/bitcoinppl/cove_core/**
  • ios/CoveCore/Sources/CoveCore/generated/cove.swift is excluded by !**/generated/**, !ios/CoveCore/Sources/CoveCore/generated/**
📒 Files selected for processing (14)
  • android/app/src/main/java/org/bitcoinppl/cove/flows/SettingsFlow/MainSettingsScreen.kt
  • android/app/src/main/java/org/bitcoinppl/cove/flows/SettingsFlow/OhttpRelaySettingsScreen.kt
  • android/app/src/main/java/org/bitcoinppl/cove/flows/SettingsFlow/SettingsContainer.kt
  • android/app/src/main/res/values/strings.xml
  • android/detekt-baseline.xml
  • ios/Cove/Flows/SettingsFlow/MainSettingsSections.swift
  • ios/Cove/Flows/SettingsFlow/OhttpRelaySettingsView.swift
  • ios/Cove/Flows/SettingsFlow/SettingsContainer.swift
  • rust/src/backup/export.rs
  • rust/src/backup/import.rs
  • rust/src/backup/model.rs
  • rust/src/backup/verify.rs
  • rust/src/database/global_config.rs
  • rust/src/router.rs

@praveenperera

Copy link
Copy Markdown
Contributor

@Sandipmandal25 i like the design it looks good and fits with the rest of the app, do you have what it looks like on android? I'm just wondering if we should start a new sub section called "Advanced" and put that in there, or inside node? How do other apps do this?

@Sandipmandal25

Copy link
Copy Markdown
Collaborator Author

@Sandipmandal25 i like the design it looks good and fits with the rest of the app, do you have what it looks like on android? I'm just wondering if we should start a new sub section called "Advanced" and put that in there, or inside node? How do other apps do this?

i will attach the photos of android too and i think advanced makes more sense than node like the other apps like sparrow and nunchuk do the same block explorer could move there too!

@praveenperera

Copy link
Copy Markdown
Contributor

Where does sparrow and bull put it?

@Sandipmandal25

Copy link
Copy Markdown
Collaborator Author

Where does sparrow and bull put it?

bull bitcoin does it automatically without a user setting It has an advanced options screen for tor proxy and custom electrum server but the relay is purely non configurable and sparrow doesnt have it v1 only. so so cove would be first. but advanced feels right

@praveenperera

Copy link
Copy Markdown
Contributor

@Sandipmandal25 should it be configureable at all? can they use multiple relays?

@praveenperera
praveenperera force-pushed the feat/ohttp-relay-settings branch from ebb08b3 to fd9aed1 Compare July 21, 2026 13:17
@Sandipmandal25

Copy link
Copy Markdown
Collaborator Author

@Sandipmandal25 should it be configureable at all? can they use multiple relays?

yes, mainly for self hosted relays. multiple isnt needed since the defaults already rotate.The defaults already rotate across 3 randomly

@praveenperera

Copy link
Copy Markdown
Contributor

@Sandipmandal25 the rotation does that happen in the PDK code or ours? And are we upgraded to PDK 1.0?

@Sandipmandal25

Copy link
Copy Markdown
Collaborator Author

@Sandipmandal25 the rotation does that happen in the PDK code or ours? And are we upgraded to PDK 1.0?

rotation is in our code not the pdk we shuffle the list with rand on each call. and were on 0.25.0 not 1.0 yet.

@Sandipmandal25
Sandipmandal25 force-pushed the feat/ohttp-relay-settings branch 5 times, most recently from 49091e1 to 3f495bc Compare July 23, 2026 09:40
@Sandipmandal25

Copy link
Copy Markdown
Collaborator Author

iOS PayJoin Relay list iOS PayJoin Relay add

Android PayJoin Relay list Android PayJoin Relay add

@Sandipmandal25

Copy link
Copy Markdown
Collaborator Author

@greptileai

@Sandipmandal25

Copy link
Copy Markdown
Collaborator Author

@praveenperera should we have a cap for adding max relay? or its fine?

@praveenperera

praveenperera commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

@Sandipmandal25 i think we can just leave it, this looks good, how it look on android?

@Sandipmandal25

Copy link
Copy Markdown
Collaborator Author

@Sandipmandal25 i think we can just leave it, this looks good, how it look on android?

Android PayJoin Relay settings Android Add Relay

Android Custom Relay list Android Relay action

@praveenperera

Copy link
Copy Markdown
Contributor

@Sandipmandal25 looks alright but ios looks much nicer

@Sandipmandal25

Copy link
Copy Markdown
Collaborator Author

@Sandipmandal25 looks alright but ios looks much nicer

Yeah agree ios looks better should i try to match ios design more closely?

@praveenperera

Copy link
Copy Markdown
Contributor

can you do some research into what idiomatic android material design 3 should look like for a screen like this?

@Sandipmandal25

Copy link
Copy Markdown
Collaborator Author

can you do some research into what idiomatic android material design 3 should look like for a screen like this?

Sure i will do that and update accordingly!

@Sandipmandal25
Sandipmandal25 force-pushed the feat/ohttp-relay-settings branch 4 times, most recently from d4c23b6 to 2b52bc5 Compare July 29, 2026 08:30
@Sandipmandal25

Copy link
Copy Markdown
Collaborator Author

@greptileai

@Sandipmandal25

Copy link
Copy Markdown
Collaborator Author

PayJoin Relay screen 1 PayJoin Relay screen 2 PayJoin Relay screen 3

@Sandipmandal25
Sandipmandal25 force-pushed the feat/ohttp-relay-settings branch from 2b52bc5 to c96ff43 Compare July 31, 2026 11:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

SoB-2026 Project for Summer of Bitcoin 2026

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants