Skip to content

Desktop "Add node" button invokes PIN-pairing, not manual-node registration — no UI surface for nvpair-manual-nodes #92

Description

@BaLaurent

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

  1. Open Settings → Cluster.
  2. Click Add node.
  3. Type the peer's Tailscale IP (e.g. 100.121.35.74) → click Invite.
  4. 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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions