From 9bf71736d57c62beed0d74512e14b9bc427bf2b3 Mon Sep 17 00:00:00 2001 From: John Coffey Date: Fri, 30 Oct 2026 19:52:28 -0700 Subject: [PATCH] Relays: say when the relay keys are wrapped (RL-35) When the server wraps the relay keys under the key file INBUXA_RELAY_KEY_FILE names, the Relays page says so, and to back that file up on its own: without it, held mail can't be opened and every relay needs a new join. A node without the file shows why in its links' errors, as any link error. --- src/features/relays/RelaysPage.tsx | 14 ++++++++++++++ src/features/relays/model.ts | 2 ++ src/i18n/en.json | 3 ++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/features/relays/RelaysPage.tsx b/src/features/relays/RelaysPage.tsx index e3e7112..ec5ce31 100644 --- a/src/features/relays/RelaysPage.tsx +++ b/src/features/relays/RelaysPage.tsx @@ -13,6 +13,8 @@ * held mail can be discarded and outbound mail cancelled. A relay older * than this server can be handed a signed release to upgrade to. The link * CA they all share can be replaced without a new join on each (RL-34). + * When the relay keys are wrapped under a key file, the page says to back + * it up (RL-35). */ import { useCallback, useEffect, useMemo, useState, type ReactNode } from 'react'; @@ -26,6 +28,7 @@ import { Inbox, KeyRound, Loader2, + LockKeyhole, Plus, RefreshCw, Send, @@ -1286,6 +1289,17 @@ export function RelaysPage() { ) } /> + {relays.some((r) => r.keysWrapped) && ( +

+ + + {t( + 'relays.keysWrapped', + 'The relay keys are wrapped under the key file INBUXA_RELAY_KEY_FILE names. Back that file up on its own: without it, mail the relays hold can’t be opened, and every relay needs a new join.', + )} + +

+ )} {replacement && (