OpenComposite#

OpenComposite OpenXR (previously known as OpenOVR - OpenVR for OculusVR - but renamed due to confusion with OpenVR) is an implementation of SteamVR’s API - OpenVR, forwarding calls directly to the OpenXR runtime. Think of it as a backwards version of ReVive, for the OpenXR compatible headsets.

⚠️ Warning

OpenComposite hasn’t been updated since 2024. It’s been largely replaced by xrizer, but a handful of games may still run better on OpenComposite.

Please note the OpenVR implementation is incomplete and contains only what’s necessary to run most games for compatibility. If you plan to implement software, utilize the OpenXR API, specification: https://registry.khronos.org/OpenXR/specs/1.0/html/xrspec.html.

OpenComposite is required for Steam Play games to work in VR regardless of API. Due to the number of confounding factors surrounding setup, sandboxing, and more quirks; we recommend you use Envision to setup and manage your VR.

Contributions to improve the OpenVR to OpenXR mapping are welcome.

Forcing additional devices as trackers#

OpenComposite has the environment variable OPENCOMPOSITE_TRACKER_SERIALS to allow using non-tracker devices as trackers in SteamVR games. The expected format is as follows: serial1;serial2 where each ‘serial’ is a device serial like LHR-00000000 or WiVRn HMD. You can set this on games by setting this launch option in Steam: env OPENCOMPOSITE_TRACKER_SERIALS="LHR-00000001;LHR-00000002" %command%.

To obtain info for lighthouse devices, you may look at the top of the Monado stdout when using steamvr_lh. For other types of devices there are multiple ways of obtaining device serials:

  • OpenComposite log file

    The OpenComposite log file at ~/.local/state/OpenComposite/logs/opencomposite.log will log all seen devices when checking for trackers, so you can search for Checking for generic trackers... in the log file and look below for Found usable xdev.

  • motoc

    motoc has the show subcommand for viewing all device names, serials, and positions relative to the space origin.

Rebinding controls#

The process is mostly the same as xrizer. However, there are a few differences:

  • The custom bindings must be in a directory named OpenComposite, not xrizer. You cannot override this location using an environment variable.
  • The name of the .json file should be the controller_type associated with the bindings file, listed in the game’s action manifest file (normally named actions.json), but unlike xrizer, with the underscores still included. For example: vive_controller.json, knuckles.json, oculus_touch.json