Fix common problems
Find your symptom and follow the steps. Start with doctor, which reports what would break a build without changing your files.
On this page
First checks
Run these from the game directory and note the first error:
node --version
pnpm --version
pnpm exec threenative doctor --text --target web
pnpm typecheck
pnpm build:webThreeNative needs Node 20.19.0 or newer and pnpm 10 or newer. Doctor reports missing or mismatched
@threenative packages, a game entry with no default export and a missing web entry. Replace
--target web with desktop or android to check that build's prerequisites.
If the cause is still unclear, compare against a freshly generated project with the same template.
Install fails on sharp or libvips
If sharp conflicts with a system libvips, reinstall with sharp's prebuilt binary:
SHARP_IGNORE_GLOBAL_LIBVIPS=1 pnpm install SHARP_IGNORE_GLOBAL_LIBVIPS=1 npm installDo not install with
--ignore-scripts. Core's postinstall writes the project's MCP configuration.
A type or export is missing
- Run
pnpm exec threenative doctor --textand look for version mismatches. - Keep every
@threenativepackage on the same version.
The world is blank or black
- Check the console for the first startup error.
- Confirm the scene loads and the camera faces an object.
- Check lights, materials and which renderer the game picked.
Loading stops partway
- Look for asset names that never finish loading.
- If you hold startup with
ctx.startup.hold(), start that work fromctx.startup.whenFrameworkReady(). Work started fromwhenReady()waits on its own hold. - Handle load errors for every file the game needs to start.
A model returns 404 or fails to decode
- Check its logical path and its entry in
assets.manifest.json. - Convert it to a format the target supports. See Assets.
A mouse action does not fire
- Bind mouse buttons with
mouseButtons.buttonsis the gamepad. - Check that a UI element is not taking the click.
fire: { keys: ["Space"], mouseButtons: [0] }Characters share one animation pose
- Create one
SkeletalMesh3Dper character. It clones the skeleton from itssource. - Update each instance's clip separately.
The HUD is blank or lags
- Check that the UI mounts and receives its first state update.
- Read state through the
@threenative/uihooks, such asuseGameState, and handle the value before the first update arrives.
A sound is silent on a device
- Check that audio unlocked after the first user input.
- Play a supported format close to the listener.
- Check paused voices and sound options, then test pause and resume.
The native runtime download fails
- Check the installed
@threenative/runtime-nativeversion. - Read the manifest filename and the download or checksum error.
- Check your network. If you work offline, set
THREENATIVE_PREBUILT_MANIFESTto a localprebuilt-lock.json.
THREENATIVE_RUNTIME_SOURCE does not fix a failed download. It needs a full engine checkout.
The game only runs from the project folder
- Build a release container with
pnpm exec threenative build --target desktop --mode release. - Extract it somewhere else and run the verifier on it. See Native runtime.
- On Linux, install the prerequisites the verifier names.
Report a bug
Remove tokens, signing keys and personal data from logs first. Then include:
- What you expected, what happened and the action that triggers it.
- Package versions, the command, the platform and the renderer.
- The first error and the relevant doctor or startup output.
- A small repro, a failing playtest or exact steps.
- For a visual bug, a capture from the game camera. For a slowdown, the scene and render resolution.