Desktop "Add node" button triggers PIN-pairing, not manual-node registration
Summary
The desktop UI's Settings → Cluster → Add node button (AddNodeModal.tsx)
is the only obvious entry point for adding a node by IP address, but it
actually invokes PIN-pairing (useInvitePairing().start(ip)), not the
nvpair-manual-nodes registration that a user would expect from the label
"Add node". There is no UI surface anywhere in the desktop app to add a
node to nvpair-manual-nodes. Combined with the in-memory-only state of
nvpair-manual-nodes, this means a user with a peer reachable over Tailscale
/ VPN has no documented path to make the peer stay online.
Reproduction
- Open Settings → Cluster.
- Click Add node.
- Type the peer's Tailscale IP (e.g.
100.121.35.74) → click Invite.
- Observe: pairing handshake fires (PIN prompt on the other side); on accept
the cluster membership grows but configs/manual-nodes.json remains [].
Code reference
desktop/src/ui/components/AddNodeModal.tsx:
const handleManualInvite = useCallback(() => {
const ip = manualIp.trim()
if (!ip) return
void pairing.start(ip) // <- PIN-pairing, not nvpair-manual-nodes
}, [manualIp, pairing])
The render shows this only as a manual-IP invite — there is no second button or
tab for "register as manual node".
Why this matters
The nvpair-manual-nodes worker exists specifically to probe peers by IP when
mDNS can't reach them (e.g. across VPNs). It is documented in
services/nvpair-manual-nodes/README.md and supported via JSON-RPC
(node/add with { address, name?, tls_port?, mtls? }). The Electron-side
store (desktop/src/electron/service-bridge/manual-nodes-store.ts) already
persists entries in configs/manual-nodes.json and replays them via
modular-supervisor.ts:replayManualNodes() on startup. All the wiring exists
except the UI surface.
Suggested fix
Add a second control to AddNodeModal.tsx (e.g. a tab "Add as manual node"
or a checkbox "Skip pairing — register for direct probing only") that calls
the broker's node/add relay with { address, name }. The store already
saves on success.
Workaround
Edit ~/.config/Nvidia Corporation/Personal AI Router/configs/manual-nodes.json
by hand with the documented schema [{id, address, name}] and restart the app
— the supervisor will replay it on startup. See companion issue for the
upstream symptom this addresses.
Environment
- nvpair 0.1.1
- Linux 7.2.5-3-omarchy
Desktop "Add node" button triggers PIN-pairing, not manual-node registration
Summary
The desktop UI's Settings → Cluster → Add node button (
AddNodeModal.tsx)is the only obvious entry point for adding a node by IP address, but it
actually invokes PIN-pairing (
useInvitePairing().start(ip)), not thenvpair-manual-nodesregistration that a user would expect from the label"Add node". There is no UI surface anywhere in the desktop app to add a
node to
nvpair-manual-nodes. Combined with the in-memory-only state ofnvpair-manual-nodes, this means a user with a peer reachable over Tailscale/ VPN has no documented path to make the peer stay online.
Reproduction
100.121.35.74) → click Invite.the cluster membership grows but
configs/manual-nodes.jsonremains[].Code reference
desktop/src/ui/components/AddNodeModal.tsx:The render shows this only as a manual-IP invite — there is no second button or
tab for "register as manual node".
Why this matters
The
nvpair-manual-nodesworker exists specifically to probe peers by IP whenmDNS can't reach them (e.g. across VPNs). It is documented in
services/nvpair-manual-nodes/README.mdand supported via JSON-RPC(
node/addwith{ address, name?, tls_port?, mtls? }). The Electron-sidestore (
desktop/src/electron/service-bridge/manual-nodes-store.ts) alreadypersists entries in
configs/manual-nodes.jsonand replays them viamodular-supervisor.ts:replayManualNodes()on startup. All the wiring existsexcept the UI surface.
Suggested fix
Add a second control to
AddNodeModal.tsx(e.g. a tab "Add as manual node"or a checkbox "Skip pairing — register for direct probing only") that calls
the broker's
node/addrelay with{ address, name }. The store alreadysaves on success.
Workaround
Edit
~/.config/Nvidia Corporation/Personal AI Router/configs/manual-nodes.jsonby hand with the documented schema
[{id, address, name}]and restart the app— the supervisor will replay it on startup. See companion issue for the
upstream symptom this addresses.
Environment