Flow

SDK Parity

Where each Pilot Protocol SDK stands today and what's planned to close the gap.

Three official SDKs ship under one brand: Python, Node.js, and Swift (iOS/macOS). They all speak the same wire protocol — but they don't yet expose the same public API surface. This page tracks where they line up and where they don't.

Status at a glance

SDKPackageCoverageNotes
Node.js pilotprotocol on npm Feature complete TypeScript types, using support, Buffer I/O. The reference surface alongside Python.
Python pilotprotocol on PyPI Feature complete Full type hints (py.typed), context managers, snake_case naming.
Swift sdk-swift (SwiftPM) Core trust + datagrams Embedded daemon (XCFramework, no separate process). Streams, networks, managed networks, policy, member tags, high-level services, and most registry admin are not yet exposed.

Summary by feature category

Feature category Node Python Swift Notes
Lifecycle (construct, dispose)Each SDK uses its native idiom (using, with, deinit).
Daemon admin — info, health
Daemon admin — rotateKeyPlanned for Swift.
Trust — initiate handshake, list trusted peers
Trust admin — approve/reject/pending/revokePlanned for Swift.
Trust convenience — waitForTrustShipped in Swift and Python (wait_for_trust). Planned for Node.
Datagrams — sendTo, recvFromSwift uses send(to:port:data:) and returns a typed Datagram.
Datagrams — broadcastPlanned for Swift.
Streams — dial, listen, Conn, ListenerPlanned for Swift.
Registry admin — hostname / visibility / deregister / tags / webhookPlanned for Swift.
Networks — list/join/leave/members/invite/respondPlanned for Swift.
Managed networks — status/forceCycle/reconcilePlanned for Swift.
Managed networks — score/rankingsRemoved in v1.10 — the symbols are no longer present in shipped libpilot builds.
Policy — get/setPlanned for Swift.
Member tags — get/setPlanned for Swift.
High-level services — sendMessage, sendFile, publishEvent, subscribeEventPlanned for Swift.
FFI loader — findLibrary / loadLibraryprivaten/aIntentional: Swift embeds the library in an XCFramework — no loader needed.
Typed response structs (Config, StartResult, Datagram, Error)n/an/aSwift idiom. Node/Python return untyped Record<string, unknown> / dict[str, Any] from the same RPCs.

What counts as a gap

Naming differences across languages are not gaps. The matrix collapses idiomatic equivalents into a single canonical row:

A real gap is an operation that one SDK does not expose at all. Those are the rows in the matrix marked unintentional — every one of them has a follow-up ticket to close it.

Full method matrix

The complete row-per-method matrix — including exact signatures and rationale for each gap — is generated by a deterministic script in the main protocol repo (scripts/parity-audit/). Re-running it against newer commits of the three SDKs regenerates the matrix locally (the script writes to ./inventory/).

Roadmap

End-state target: full parity across all three SDKs, except for the two intentional rows above (the FFI loader and Swift's typed response structs).

Cross-SDK versioning is documented in the GOVERNANCE file in the main protocol repo: all three SDKs share the same MAJOR.MINOR line, with coordinated releases when the wire protocol changes.