Skip to content

PointSav Documentation

The engineering library for the PointSav platform — operating systems and services for regulated businesses that own their data, their AI, and their record-keeping outright. Where the monorepo holds the code, this wiki holds the reasoning: architecture, services, security, and the governance commitments that bind future development.

Pair a new device

← All revisions

f99f9774 · PointSav Digital Systems ·

feat(machine-authorization): rewrite Machine authorization guide group against real source, split into own category

View the full record as of this revision →

@@ -0,0 +1,95 @@
---
schema: foundry-doc-v1
title: "Pair a new device"
slug: pair-a-new-device
short_description: "Pairs an unpaired os-console device onto the PPN mesh: read the pairing code from the startup screen, have an administrator approve it, and confirm network admission."
category: machine-authorization
index_group: pairing-and-tokens
content_type: how-to
type: how-to
quality: complete
status: active
audience: "Engineers (hands on keyboard); network administrators"
last_edited: 2026-08-06
editor: pointsav-engineering
paired_with: pair-a-new-device.es.md
research_trail:
  sources: [pointsav-monorepo service-ppn-pairing (join-request, pending, approve, deny, status routes), app-console-keys (pairing screen, QR rendering, status polling), os-network-admin (approval tool), app-network-admin (mesh-admission poller)]
  verification_method: "independently source-verified against pointsav-monorepo on 2026-08-06 by reading the Rust source directly, with file:line citations recorded per claim; endpoint paths, request/response payload shapes, the Crockford base32 charset, the 600-second code lifetime, the 2-second client poll, the 5-second admin poll, and the 30-second mesh-admission poll were each confirmed at their definition site rather than inferred from prior documentation"
---

## Prerequisites

- A device running `os-console` that has not yet been paired — Machine-Based Authorization is inactive on it (see [[machine-based-auth]])
- A WireGuard keypair present on that device; the client submits its public key as part of the join request
- Network reachability from the device to your pairing server, port 9205 by default
- An administrator who can reach the same pairing server and run `os-network-admin`
- A node identifier in `<username>@<tenant>` form for the device

## Purpose

Register an unpaired device with `service-ppn-pairing` so an administrator can approve it onto the WireGuard mesh — about five minutes of active work across two people, plus an unbounded wait between approval and actual network reachability.

## Procedure

### On the device being paired

1. Start `os-console` on the unpaired device. The pairing screen opens automatically at startup and holds the entire screen until the device is paired; there is no menu path or F-key that reaches it.

2. Read the eight-character pairing code from the screen. It is displayed as `XXXX-XXXX` and drawn from the Crockford base32 charset `0123456789ABCDEFGHJKMNPQRSTVWXYZ` — I, L, O, and U are absent, so a code read aloud carries no O/0 or I/1 ambiguity to resolve.

3. Optional: scan the QR block beside the code instead of transcribing it. The QR encodes `PAIR:<code>` with the dash stripped, rendered as a pixel image on terminals supporting the Kitty or Sixel graphics protocols, or as a Unicode half-block image otherwise.

4. Hand the code to your administrator within 600 seconds. The code expires ten minutes after issue, and the client must submit a fresh join request after that.

5. Leave the device on the pairing screen. The client polls its status every two seconds and will not move off the screen until that poll returns approved, denied, or expired.

### On the administrator's workstation

6. Start `os-network-admin`. It polls the pending-request list every five seconds and prints each request with its code, node ID, `bottom` (target substrate), and `arch`.

7. Match the printed code against the code read off the device screen. This comparison is the only identity check in the flow — the endpoints themselves perform none.

   > **Warning:** the approve and deny endpoints carry no access-control check of their own. Anyone who can reach the pairing server's port and holds a valid code can approve or deny a request. Network access to port 9205 is the entire security boundary for this mechanism; place and firewall the pairing server on that basis.

8. Approve the request with the curl command `os-network-admin` prints next to it:

   ```bash
   curl -s -X POST http://<pairing-server>:9205/v1/node-join/approve \
     -H 'Content-Type: application/json' \
     -d '{"code":"XXXX-XXXX"}'
   ```

   To reject the request instead, post the same body shape to `/v1/node-join/deny`.

9. Wait for mesh admission to run separately. Approval appends one record — node ID, WireGuard public key, `bottom`, `arch`, and an approval timestamp — to a file on the pairing server. It does not put the device on the network. A background process polls the fleet controller every 30 seconds and runs the WireGuard command that admits the peer only once the approved node has also appeared in the compute fleet.

## Expected outcome

The device's pairing screen transitions to an Approved state, the request no longer appears in the pending list, and the approval record is on disk on the pairing server. Approved and reachable are two different states: the device becomes reachable on the mesh only after the 30-second admission poller has seen it in the fleet and run WireGuard.

## Verification

On the device: the screen moves to Approved within roughly two seconds of approval, on the next status poll.

On the administrator's side, confirm the request has left the queue:

```bash
curl -s http://<pairing-server>:9205/v1/node-join/pending
```

An approved request is absent from that response. Neither check proves network reachability — that is a later, separate state produced by the admission poller described in step 9.

> **Note:** the `bottom` field in the join request is derived from the device's architecture, not chosen — `aarch64` maps to `seL4`, `x86_64` maps to `netbsd-compat`. There is also no access tier, role, or permission level anywhere in this flow. Network admission is the only thing this mechanism grants.

## Rollback

Before approval: post the code to `/v1/node-join/deny`, or do nothing and let the 600-second expiry close the request.

After approval: no built-in un-pairing command exists today. Removing a paired device means contacting your administrator to remove the WireGuard peer manually on the mesh side — there is no revoke endpoint and no console action that undoes an approval.

## Next steps

- [[navigate-console-tui]] — work the console once the pairing screen releases it
- [[machine-based-auth]] — the authorization model this pairing activates
- [[enroll-ppn-node]] — enroll the machine into a compute fleet, a separate procedure from mesh pairing
Important Information

Corporate structure. PointSav Digital Systems ("PointSav") is currently a trade name of Woodfine Capital Projects Inc. ("Woodfine"), planned to become a wholly-owned Woodfine subsidiary upon incorporation. PointSav does not itself offer, sell, or solicit any security. Any securities offering associated with Woodfine's real-property direct-hold solutions is made exclusively by Woodfine, and only by means of the applicable Private Placement Memorandum.

No investment advice. This wiki's content is provided for engineering, operational, research, and development purposes. Nothing on this wiki constitutes investment advice or a solicitation to invest in any Woodfine partnership or direct-hold solution.

Intellectual property. The PointSav name, trade name, wordmark, and marks, together with all current and future PointSav- and Totebox-branded products, services, and offerings — and the software, source code, documentation, design system, and all related materials — are proprietary to Woodfine and its affiliates, except for components identified as open source. No rights are granted except as expressly set out in a written license or agreement. The full trademark notice appears in the footer of every page on this site.

Open source components. Portions of the platform are made available under permissive open-source licenses identified in the accompanying repository. Use of those components is governed by their respective license terms.

No warranty; informational use. Content on this wiki is provided for general informational purposes only and does not constitute a representation, warranty, or commitment with respect to product functionality, availability, pricing, or roadmap. Some articles describe planned or intended features, capabilities, and milestones — language such as "planned," "intended," "targeted," "may," and "expected" marks this forward-looking content, which is subject to change and does not constitute a commitment regarding future performance.

Confidentiality. Where an article describes an operational or deployment detail that is not intended for public disclosure, that article is not published on this wiki. Content here is general-purpose engineering documentation, not customer-specific configuration.

Jurisdiction. Woodfine Capital Projects Inc. is organized in British Columbia, Canada. References to the Sovereign Data Foundation on this wiki describe a planned or intended initiative only, not a current equity holder or active governance body.

Changes to this notice. PointSav may update this notice from time to time; the version posted on this page governs.

Not a filing system. This wiki is not a securities filing system, an electronic disclosure repository, or a substitute for SEDAR+ or any other regulatory filing system. Formal securities filings are made through the applicable regulatory filing system, not through this wiki.

Full disclaimer. This notice supplements, and does not replace, the full Disclaimers article. In the event of any conflict, the full Disclaimers article governs.

Read the full disclaimer →