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.
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.
- 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.