Device pairing

Establish same-user peer trust across mobile, desktop, and extension surfaces through a versioned protocol with selectable discovery and transport profiles.

Supported approaches

Peer trust establishment

planned

Use versioned Noise handshakes, explicit human confirmation, and application device identity to establish revocable peer trust.

Packages

@playstack/pairing

@playstack/devices

Frameworks and integrations

Discovery profiles

planned

Locate peers through account lookup, mDNS, QR codes, native host manifests, or port files without treating discovery as proof.

Packages

@playstack/pairing

Frameworks and integrations

Transport profiles

planned

Carry encrypted application payloads over LAN sockets, native messaging, localhost WebSockets, ICE, or a server relay.

Packages

@playstack/pairing

Frameworks and integrations

Frameworks and integrations

framework

Next.js

Compose Playstack server contracts, React bindings, SSR handoff, and route adapters at the Next.js application edge.

framework

NestJS

Connect portable Playstack capabilities to dependency injection, guards, decorators, request context, workers, and lifecycle hooks.

Package reference

@playstack/pairing

@playstack/devices

Pair peers, not accounts

A registered device is a client authenticated to an application. A paired device has established mutual trust with another device. Both peers may belong to the same user, but signing in does not automatically authorize direct device-to-device communication.

Separate trust, discovery, and transport

The protocol fixes trust establishment and identifies compatible discovery and transport profiles. A QR code, mDNS record, or account lookup helps locate a peer; none of them proves its identity. The authenticated handshake does that.

ts
import { createPairing } from '@playstack/pairing'

const pairing = createPairing({
  identity: platformIdentityKey,
  devices,
  protocolVersion: 1,
  discovery: mdnsDiscovery(),
  transport: lanWithRelayFallback({ relay }),
})

const request = await pairing.begin({ peerDeviceId })
await pairing.confirm(request.id, displayedShortCode)

Cross-language by construction

Desktop, mobile, and companion products span TypeScript, Swift, and Rust. The normative artifact is therefore the versioned wire protocol and its shared conformance vectors. @playstack/pairing is one implementation, not the definition every other language must reverse engineer.

Planned implementation

The protocol, discovery profiles, transport profiles, and deterministic vectors are specified. The feature remains planned until the TypeScript, Swift, and Rust implementations agree on those vectors and at least one real product integration validates revocation and relay fallback.

Go

Playstack Pro tag
OriginsPricingBlogNewsletterChangelogStatusRoadmap
ContributorsCommunityIn Use ShowcaseCase StudiesPartnersSponsors
FAQsSupportContact

© 2026 Playstack. All rights reserved.

With OSS
Terms of ServicePrivacy PolicyCookie PolicyImprint

By

Commune Software