Needle Engine is a web-first 3D framework built on three.js for building games, configurators, AR/VR experiences, and interactive websites.
Built-in: Rapier Physics | WebXR (incl. iOS) | Multiplayer & VOIP | Blender & Unity Integration
Built on three.js and the glTF standard, Needle Engine delivers flexible, extensible web experiences with built-in collaboration and XR support. Use it standalone with npm or with powerful editor integrations for Unity and Blender.
Changelog | Documentation | Samples | Showcase | API Reference
npm install @needle-tools/engine
Try it now on StackBlitz | Getting Started Guide
import { Behaviour, serializable } from "@needle-tools/engine";
export class MyComponent extends Behaviour {
@serializable()
speed: number = 1;
start() {
console.log("Component started on:", this.gameObject.name);
}
update() {
this.gameObject.rotateY(this.context.time.deltaTime * this.speed);
}
}
import { Behaviour, Rigidbody, BoxCollider } from "@needle-tools/engine";
export class PhysicsBox extends Behaviour {
awake() {
// Add a physics body — Rapier is built in, no extra install needed
const rb = this.gameObject.addComponent(Rigidbody);
rb.useGravity = true;
// Add a collider
this.gameObject.addComponent(BoxCollider);
}
}
import { Behaviour, syncField } from "@needle-tools/engine";
export class SyncedCounter extends Behaviour {
// Automatically synced across all connected clients
@syncField()
count: number = 0;
onPointerClick() {
// Reassign to trigger sync (this is required for sync to work)
this.count = this.count + 1;
}
}
import { onStart, onUpdate } from "@needle-tools/engine";
onStart((context) => {
console.log("Engine started!");
});
onUpdate((context) => {
// Called every frame
});
WebXR & AR — immersive experiences on Android and iOS
WebXRImageTracking — AR image targets with full tracking lifecycleWebXRPlaneTracking — AR surface detectionScene & Asset Management
SceneSwitcher — load different scenes by URLAssetReference — runtime asset loading by URLNestedGltf — lazy-load GLB files on demand within a scenePhysics & Interaction — Built-in Rapier physics engine
Rigidbody, BoxCollider, SphereCollider, MeshCollider — full physics simulationCharacterController — movement with gravity, slopes, and stepsDragControls — click-and-drag 3D objects with zero codeSpatialTrigger — proximity and enter-zone detectionMultiplayer & Networking — real-time collaboration out of the box
SyncedRoom + @syncField() — automatic state synchronizationVoip — built-in WebRTC voice chatPlayerSync — player object sync on join/leaveSyncedCamera — camera sync for observer sessionsRendering & Effects
Animation & Media
VideoPlayer — full video playback componentAudioSource — 3D spatial audioFramework Integration — works with React, Vue, Svelte, or vanilla JS/TS
Needle Engine works standalone with just npm — no editor required. For asset-heavy workflows, use our editor integrations:
| Preview | Example | Description | Links |
|---|---|---|---|
![]() |
Multiuser Cross device experience, Desktop, AR & VR (Sandbox) | Real-time collaborative multiplayer sandbox experience with WebXR on Android and iOS | |
![]() |
Image Tracking AR | AR image tracking example (iOS and Android). See docs | |
| Scrollytelling Bike Example | Timeline Animation using ScrollFollow, ViewBox and FocusRect | Project on Github | |
| See-Through Walls | See-Through component sample | ||
| Cursor Follow | Cursor Follow sample | ||
| Animate Anything | Interactive animation system | Code on Stackblitz • three.js Example | |
| Postprocessing Effects | Custom magnifier effect with post-processing | Code on Stackblitz | |
![]() |
Unity ShaderGraph to MaterialX & mtlx materials | Using @needle-tools/materialx | |
| Camera Focus DIV 1 | Responsive layout with camera focus | Code on Stackblitz | |
| Camera Focus DIV 2 | Click-to-move camera focus example | Code on Stackblitz | |
| FastHDR Loading | 10x faster than EXR, non-blocking, 95% less GPU memory | Code on Stackblitz • Learn more | |
| Scrollytelling Example | Scroll, physics and cursor interaction: a playful 3D interactive scrollytelling website | Included in Samples Package | |
| AR Restaurant | Interactive AR restaurant experience | Code on Github | |
| Custom Loading Overlay | Wait for LODs with custom loading states | Code on Stackblitz | |
| React Shopping Cart | E-commerce integration with React | Code on Stackblitz | |
👋 More examples on samples.needle.tools, docs.needle.tools and in the Needle Engine Stackblitz Collection
🌵 Needle •
Github •
Twitter •
Discord •
Forum •
Youtube
makeFilesLocal build option overhauled — builds can now be fully self-contained and work offline. The plugin downloads external CDN assets at build time and bundles them locally. This is essential for playable ads, app stores that require single-origin or self-contained bundles, offline-capable PWAs, and restricted hosting environments. Supports auto-detection of used features, per-feature opt-in/opt-out, and platform presets. Covers Draco decoders, KTX2 transcoders, MaterialX, WebXR input profiles, skybox/environment textures, Google Fonts, third-party scripts, and more.
Example in vite.config.js:needlePlugin({
makeFilesLocal: "auto" // auto-detect and download only what your project uses
})
// or with fine-grained control:
needlePlugin({
makeFilesLocal: {
enabled: true,
features: ["draco", "ktx2", "fonts"],
excludeFeatures: ["xr"]
}
})
showBalloonMessage now supports duration, once, and key options for controlling message display duration and updating existing messagesneedleAI vite plugin — when using Claude Code in a Needle Engine project, the engine automatically provides a project-aware AI skill with Needle Engine context"string" type for input variable names for better spec compatibilityAccessibilityManager accessible via context.accessibility for managing accessible elements, focus, and hover announcementsconst block = MaterialPropertyBlock.get(myObject); and then set or remove overrides on the block.?stats console logs with info about shaders and used memory