Skip to content

Compatibility and language support

OpenAxis 1.0 is Release Candidate 1. The wire identifier is openaxis/1.0; package versions use each ecosystem’s RC notation. This site documents the current repository implementation, which may be newer than a package published to a registry. Match examples and package source to the same revision while 1.0 is unreleased.

OpenAxis 1.0 and later require Rotatrix 1.6.0 or newer. For the current OpenAxis 1.x protocol, all four SDKs connect using openaxis/1.0. The minimum Rotatrix version does not establish support for future protocol majors; those need an explicitly compatible server release.

SDK package versions identify the application-facing API, independently of Rotatrix and protocol versions. See Versioning below. Compatibility with a host application such as a CAD tool also depends on its integration and runtime; consult that integration’s supported application versions.

The SDKs target strict feature and behavioral parity. The table below records current support; missing capabilities are implementation gaps, not intended language limitations. Their execution models and API spelling follow their programming languages.

CapabilityPythonC#TypeScriptC++
WebSocket client and protocol typesAvailableAvailableAvailableAvailable
Connection supervision and metadata replayOpenAxisConnectionManagerOpenAxisConnectionManagerOpenAxisConnectionManagerOpenAxisConnectionManager
Synchronous native application sessionAvailableAvailableAvailableAvailable
Camera and optional object streamsAvailableAvailableAvailableAvailable
Rigid object comparisoncompare_objectObject comparison callbackcompareObjectPosescompare_object_poses / callback
Awaitable application camera operationsAsyncNavigationSessionNo dedicated async application sessionAsyncNavigationSessionNot implemented
Awaitable application object operationsNot implementedNot implementedOptional objectAdapter on AsyncNavigationSessionNot implemented
Application schedulingRequired scheduler for synchronous sessionRequired schedulerDefault event-loop scheduler or supplied schedulerRequired native Scheduler
Observation/correction diagnosticsCallback (event, **values)NavigationObserver virtual methodsTyped onEvent({ event, values }) or legacy (event, values)on_event(const NavigationEvent&); legacy diagnostics callback
Three.js OrbitControls adapterAvailable
Shared diagnostic collector/presentationNavigationDiagnosticsNavigationDiagnosticsNavigationDiagnosticsNavigationDiagnostics
Diagnostic refresh deadlineexpires_atExpiresAtexpiresAtexpires_at
Pose value representationCameraPose / ObjectPose dataclassesImmutable geometry/navigation structsStructural objects with t, r, projection fieldsPose value struct
Completion of native writesSynchronous, or awaited in async variantSynchronous adapter callbackSynchronous, or awaited in async variantSynchronous; optional realized pose

An asynchronous WebSocket transport does not imply asynchronous native application callbacks. For example, returning a Promise from TypeScript applyPose is not supported by its synchronous NavigationSession contract; use AsyncNavigationSession.

from openaxis.navigation_session import NavigationSession, WriteResult, compare, compare_object
from openaxis.async_navigation_session import AsyncNavigationSession

Python intentionally does not re-export everything at the package root. Its underscored implementation modules are not the integration import surface. TypeScript’s package root exports navigation sessions; protocol and geometry also have separate package subpaths. C# integration assemblies need no friend assembly access to consume the NavigationSession.

TypeScript’s synchronous camera adapter receives CameraPoseMessage; its NavigationObjectAdapter receives ObjectPoseMessage. Object comparison ignores camera projection fields and uses translation and rotation tolerances. NavigationSession.isActive follows C#‘s IsActive: false once a gesture ends or is cancelled, including while final queued cleanup is pending.

SDK conformance establishes shared state behavior, not native camera precision, picking quality, rendering performance or application compatibility. Use the integration checklist in the actual host.

C++ native viewer validation currently covers Windows; cross-platform source does not establish macOS/Linux runtime coverage. Its synchronous coordinator supports shared session traces, unknown-readback recovery and custom comparisons. Awaitable host support is recorded in the table above.

Asynchronous reads and writes cannot make concurrent native input atomic. Unknown-readback recovery cannot reconstruct an adjustment already overwritten while observations were unavailable. See reconciliation.

The RC endpoint does not authenticate clients, pair devices or allowlist browser origins. The native plaintext endpoint is restricted to loopback. Browser access prompts are not OpenAxis authentication. Read the specification’s security considerations before configuring browser access.

All SDKs accept integer identifiers, sequence counters, and integer timestamps from 0 through 2^53 - 1 inclusive. The shared protocol fixtures check both the maximum and the first out-of-range value. Monotonic counters do not wrap within their scope; SDK request allocators fail on exhaustion instead of reusing IDs.

Pose sequence numbers and delta ID allocators are connection-scoped. Applied-delta watermarks are target- and gesture-scoped: they reset on gesture replacement and appear only after that gesture’s first identified delta. A watermark from an old gesture cannot acknowledge current work.

Vector components and projection values require finite numeric values in all four SDKs. Numeric strings and booleans are rejected. Projection values must also be positive.

Observers expose navigation state, query outcomes and camera/object correction evidence for supported streams. Python sync and async sessions share camera-event payloads; the async session does not yet support objects. Callback shapes and field spelling remain language-specific; see the event reference.

TypeScript and C++ allow multiple ordinary input listeners through addListener and add_listener. Python and C# expose one ordinary listener alongside the exclusive navigation-session listener. Applications combining multiple custom consumers need to dispatch within that listener in Python/C#.

Each SDK package follows Semantic Versioning independently of the other SDKs and the protocol specification. For stable packages, patch releases contain backward-compatible fixes, minor releases add compatible functionality or deprecate APIs, and major releases introduce incompatible changes. Prereleases use each package ecosystem’s notation.

The public compatibility promise includes API signatures, callback payloads, ownership, lifecycle delivery, error behavior and supported runtime requirements. A fix that breaks documented behavior requires a major release. Additive observer changes follow the event extensibility contract.

A Python-only fix can increment the Python patch version without releasing the other SDKs. Shared features and behavior remain subject to the same parity and conformance requirements even when package versions differ. Release notes identify changes and any new runtime requirements for each affected package.

All current SDKs use the openaxis/1.0 wire identifier. Package major versions do not determine protocol support: an SDK 2.0 release can continue using that wire identifier. The specification defines protocol revision and negotiation rules. Use capability declarations and unsupported RPC responses to determine optional feature availability.

All SDK clients automatically send sdk.name and sdk.version in hello. The SDK names are openaxis-python, openaxis-csharp, openaxis-typescript and openaxis-cpp; the name identifies the implementation language and the version identifies its package release. Integrations should supply their own optional version through client_version (Python/C++), clientVersion (TypeScript), or the clientVersion constructor argument (C#). Supply the application version through Target.app_version (Python), target.app_version (TypeScript/C++), or Target.AppVersion (C#). On the wire these are always client_version and target.app_version. Versions are non-empty opaque diagnostic strings; omit unavailable values. They do not affect target matching, authentication, or capability negotiation.