Point relay pairing at the Pulse Mobile install page

A Relay customer who enables Remote Access and generates a pairing QR
has nothing to scan it with: Pulse Mobile is early access and its
install links live on the authenticated download page, which nothing
in the pairing flow mentioned. Add the pointer to the pairing help
text, pin it in the panel contract test, and give docs/RELAY.md the
same install path instead of 'join early access when available'.
This commit is contained in:
rcourtman 2026-07-07 20:04:36 +01:00
parent 8113f3e8c3
commit d43255889d
4 changed files with 26 additions and 2 deletions

View file

@ -82,7 +82,7 @@ Relay configuration is stored encrypted in `relay.enc` in the Pulse data directo
### iOS / Android
1. Join mobile early access when available.
1. Pulse Mobile is in early access. Relay and Pro customers get install links from the authenticated [download page](https://pulserelay.pro/download.html).
2. Open Pulse Mobile and tap **Connect to Server**.
3. Scan the QR code from **Settings → Relay** in your Pulse web UI.
4. The app connects via the relay for push notifications and secure Open Pulse handoff.

View file

@ -2,11 +2,15 @@ import { Component, For, Show } from 'solid-js';
import type { OnboardingQRResponse } from '@/api/onboarding';
import { Card } from '@/components/shared/Card';
import { formField, formHelpText, labelClass } from '@/components/shared/Form';
import { PULSE_PRO_DOWNLOAD_URL } from '@/utils/licensePresentation';
import {
getRelayDiagnosticClass,
RELAY_CODE_BLOCK_CLASS,
RELAY_DIAGNOSTICS_TITLE_CLASS,
RELAY_DIAGNOSTICS_WRAP_CLASS,
RELAY_PAIRING_APP_AVAILABILITY_TEXT,
RELAY_PAIRING_APP_DOWNLOAD_LINK_CLASS,
RELAY_PAIRING_APP_DOWNLOAD_LINK_LABEL,
RELAY_PRIMARY_BUTTON_CLASS,
RELAY_QR_IMAGE_CLASS,
RELAY_SECONDARY_BUTTON_CLASS,
@ -62,7 +66,17 @@ export const RelayPairingSection: Component<RelayPairingSectionProps> = (props)
</div>
<p class={formHelpText}>
Generate a QR code that provisions a dedicated Pulse Mobile relay access credential.
Generate a QR code that provisions a dedicated Pulse Mobile relay access credential.{' '}
{RELAY_PAIRING_APP_AVAILABILITY_TEXT}{' '}
<a
href={PULSE_PRO_DOWNLOAD_URL}
target="_blank"
rel="noreferrer"
class={RELAY_PAIRING_APP_DOWNLOAD_LINK_CLASS}
>
{RELAY_PAIRING_APP_DOWNLOAD_LINK_LABEL}
</a>
.
</p>
<Show when={props.showPairing}>

View file

@ -55,4 +55,9 @@ describe('Onboarding QR payload contract', () => {
expect(relaySettingsPanelStateSource).toContain('setInterval(() => void loadStatus(), 5000)');
expect(relayPairingSectionSource).toContain('getRelayDiagnosticClass');
});
it('points pairing users at the download page for the Pulse Mobile app', () => {
expect(relayPairingSectionSource).toContain('PULSE_PRO_DOWNLOAD_URL');
expect(relayPairingSectionSource).toContain('RELAY_PAIRING_APP_AVAILABILITY_TEXT');
});
});

View file

@ -40,6 +40,11 @@ export const RELAY_ENABLE_HELP_TEXT =
export const RELAY_ACTIVATION_REQUIRED_LABEL = 'Activation required';
export const RELAY_ACTIVATION_REQUIRED_MESSAGE =
'Remote Access is enabled, but this instance does not have an active Relay token. Activate a Relay-capable plan or turn Remote Access off before pairing mobile clients.';
export const RELAY_PAIRING_APP_AVAILABILITY_TEXT =
'Pulse Mobile is in early access; install links for Relay and Pro plans are on';
export const RELAY_PAIRING_APP_DOWNLOAD_LINK_LABEL = 'your download page';
export const RELAY_PAIRING_APP_DOWNLOAD_LINK_CLASS =
'font-medium text-blue-600 underline-offset-2 hover:underline dark:text-blue-400';
export function getRelayDiagnosticClass(severity: 'warning' | 'error'): string {
return severity === 'error'