Develop

IWSDK Troubleshooting

Updated: Sep 4, 2026
Start with the symptom below, then check the named configuration or asset path.

The Enter XR control is unavailable

  • Serve the application over HTTPS.
  • Confirm that the browser and device support the requested session mode.
  • Check xr.sessionMode in the World.create() options.
  • Start the session from a user action when the runtime requires one.
enterXRButton.addEventListener('click', () => world.launchXR());
See World for session helpers.

Hand tracking is unavailable

Enable hand tracking through the World XR feature configuration.
import { SessionMode, World } from '@iwsdk/core';

const world = await World.create(document.getElementById('scene')!, {
  xr: {
    sessionMode: SessionMode.ImmersiveVR,
    features: { handTracking: true },
  },
});
The runtime also needs browser and device support for hand tracking.

A scene file returns 404

IWSDK 0.5.3 accepts native .iwsdk.scene.json and .scene.json level files. Place a Vite-served file under public/scenes and make the URL match its public path.
const world = await World.create(container, {
  level: '/scenes/main.iwsdk.scene.json',
});
Do not run a legacy level generator or point level at a removed format.

A UIKitML asset returns 404

Place the source .uikitml file under public/ui and reference that source path from the asset manifest.
const assets = {
  menu: {
    type: AssetType.UIKitML,
    url: '/ui/menu.uikitml',
  },
} satisfies AssetManifest;
IWSDK parses UIKitML at runtime. There is no compiled JSON file or UIKitML Vite plugin to inspect.

UIKitML parsing fails

  • Check the reported source line and column.
  • Match element names exactly; they are case-sensitive.
  • Use supported elements and properties from the selected component sets.
  • Write CSS properties in kebab case.
  • Resolve relative media and TTF paths from the .uikitml file’s URL.

Vite reports a stale generated dependency chunk

After changing IWSDK versions, stop the development server, remove Vite’s dependency cache, and restart the server.
rm -rf node_modules/.vite/deps
npm run dev
This rebuilds Vite’s dependency pre-bundle. Do not add a second copy of the dependency to work around a stale cached chunk.

A standard material appears dark

IWSDK does not inject lighting into an empty scene. Add light components or author dome and image-based lighting on the level root.
const world = await World.create(container, {
  level: '/scenes/main.iwsdk.scene.json',
});
Confirm that the referenced scene contains the intended lighting components.

Pointer events do not fire

  • Add RayInteractable for ray and browser-canvas selection.
  • Add PokeInteractable for fingertip touch interaction.
  • Enable the grabbing feature for grab components.
  • Confirm that the target mesh is visible to the pointer intersection path.
entity.addComponent(RayInteractable);
entity.object3D!.addEventListener('click', activateEntity);
See Pointers for the supported pointer types and controls.