Add: MaterialPropertyBlock support. This allows you to change material properties of objects without breaking batching and instancing.
It can be used by calling const block = MaterialPropertyBlock.get(myObject); and then set or remove overrides on the block.
This even supports the same material being rendered as transparent for one object and opaque for another.
Add: Support of ReflectionProbe + Lightmap rendering on the same object
Add: CustomShader (Unlit) support with VideoPlayer component
Improved ?stats console logs with info about shaders and used memory
Improved documentation
Update gltf-progressive dependency with improved texture LOD handling and GPU memory management
Unity Integration
Editor UI improvements for components
GLTF import improvements for objects with Needle Engine components
Compatibility fixes for Unity versions
Update UnityGLTF dependency to 2.19.1 with support for EXR and webp import (Plugins need to be enabled in UnityGLTF settings)
NEW: Accessibility support with screen reader overlay. The engine now maintains a visually-hidden DOM tree mirroring 3D scene objects with ARIA roles and labels. Components like Button, Text, DragControls, and USDZ behavior components automatically register accessible elements.
Add: AccessibilityManager accessible via context.accessibility for managing accessible elements, focus, and hover announcements
Add: ReflectionProbe now supports assigning a URL string as texture (for Blender workflows)
Update: Networking backend migrated to Cloudflare Durable Objects for improved scalability, per-room isolation, and reduced latency
Improved MaterialPropertyBlock documentation with examples for material swapping behavior and override management
Improved documentation for Networking, OneEuroFilter, and needle-button web component
NEW: 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"]
}
})
Add: showBalloonMessage now supports duration, once, and key options for controlling message display duration and updating existing messages
Add: needleAI vite plugin — when using Claude Code in a Needle Engine project, the engine automatically provides a project-aware AI skill with Needle Engine context
Add: DragControls now warns when used on static objects that won’t update their transforms
Add: AR overlay support for AppClip sessions
Improve: Stable three.js chunk names in production builds, enabling CDN import maps with predictable URLs
Improve: USDZ export now uses "string" type for input variable names for better spec compatibility
Improve: Gizmo rendering uses consistent font from CDN
Improve: needle-menu layout with correct padding and minimum width for icon-only elements
Improve: Vite project template aligned with online template
Improve: Updated MaterialX dependency
Improve: JSDoc documentation
Fix: ReflectionProbe support for Blender workflows
Fix: Mac build error (“-50” error)
Fix: PWA defaults when package name is missing
Fix: Improved error handling in MaterialX importer
Unity Integration
Improve: Updated component compiler to version 3. Now with improved testing, complex types, tooltips and more.
Improve: Vite project template aligned with web version
Fix: EditorSync enum fields now send correct integer values instead of string names
Fix: EditorSync now tracks changes from IMGUI-based inspectors (e.g. post-processing volumes)
Fix: EditorSync no longer re-applies stale changes after scene reload
Improve: ReflectionProbe now uses integrated box intersection and gizmo
Improve: ReflectionProbe center and size now have default values and improved JSDoc documentation
Improve: Comprehensive TypeScript declarations for Vite and Next.js plugins with full JSDoc, @param, @returns, and @example tags for API documentation (NE-6952)
Improve: Plugin type declarations are now auto-generated from source
Remove: loadMaterialX vite plugin setting (no longer needed)
Unity Integration
Add: Node.js 24 support
Fix: NodeModuleTypesImporter for Unity 6000.3.10 — Client.Pack no longer fails when org id is not set - this fixes installation of FaceFilter and CarPhysics packages in Unity 6000.3.10
Fix: Node.js version validation messages now list all supported versions (18, 20, 22, 24)
Needle Engine now supports compressing EXR skybox and environment textures using our FastHDR format. Compared to standard EXR files, FastHDR textures load 10x faster, use 95% less GPU memory, and eliminate frame drops during environment map loading. This makes high-quality image-based lighting practical even on mobile devices.
MaterialX — Lights and Magic
MaterialX support takes a major leap forward. This release adds full lights and shadows support including point lights, spot lights, and directional lights. Displacement mapping now works with both offset and vector modes. Transparency is handled automatically with detection and support for opaque, transparent, and masked rendering modes — bringing MaterialX materials much closer to feature parity with native engine shaders.
Vite 8 — Powered by Rolldown
Needle Engine now supports Vite 8, which uses the Rolldown bundler written in Rust. This brings extremely fast bundling to both development and production builds, significantly reducing build times for larger projects.
iOS WebXR via AppClip
WebXR is now available on iOS through AppClip sessions. This brings AR support to iPhone and iPad, allowing users to experience immersive WebXR content on Apple devices without needing to install a dedicated app.
Needle Engine
NEW: Compression support for EXR skybox and environment textures (powered by Needle’s FastHDR):
10x faster than EXR
95% less GPU memory
Zero framedrops
NEW: Support for Vite 8, now powered by Rolldown (Rust) for extremely fast bundling
NEW: MaterialX Lights and Magic update:
Lights and shadow suppport: point lights, spot lights, directional lights
Displacement: full support for offset and vector displacement
Transparency Modes: auto-detection and support for opaque, transparent, and masked material rendering modes
See
Change: OrbitControls now uses lookAtTarget and lockLookAtTarget instead of a LookAtConstraint component. The LookAtConstraint component has been deprecated.
Change: EventList addEventListener now returns a method that can be called to remove the callback function again: const remove = myEventList.addEventListener(() => { ... })
Change: Rapier Physics colliders will now just be disabled instead of removed from the physics world when a Collider component becomes inactive.
Change: Postprocessing now has an adaptiveResolution option (default true) which can automatically scale down resolution slightly for Retina or high pixel density screens if performance drops (See the Volume component for more information)
Improved: Networking types (Typescript)
Improved: Dependencies chunking for faster loading and improved LCP score(Largest Contentful Paint)
Fix: NextJS support
Unity Integration
NEW: EXR compression
NEW: Major MaterialX export improvements. See changes above
Add: AnimatorControllerBuilder for building animator controllers from code (experimental)
Add: XR global events now return an unsubscribe function + onBeforeXRSessionRequest event
Add: getComponent by string name (experimental)
Add: FastHDR (PMREM) support for GroundProjection
Fix: setParamWithoutReload losing URL hash
Fix: Physics treeshaking when used in code-only projects
Improved: Vite logger with “latest” symlink, mobile fix, and more readable timestamps (at node_modules/.needle/logs). This is useful for local AI to help debug
Unity Integration
Add: Needle AI chat integration with inspector, hierarchy context menus, and login
Add: SceneSwitcher: “unload” button, drop highlight, preview button sizing, hide play button for non-scene assets
Change: MaterialX export in Needle Engine projects no longer requires PRO license
NEW: Scene Bindings (experimental) — auto-generated TypeScript types from your glTF scenes, providing typed access to nodes, components, and properties via ctx.sceneData or needle.sceneData. Types are generated automatically by a Vite plugin whenever your scene files change — no configuration needed. Works with any glTF/GLB assigned as src on <needle-engine>, including remote URLs and Needle Cloud assets. The API shape (particularly $components and $object accessors) may evolve based on feedback. Can be disabled with dts: { enabled: false } in your Vite plugin config.
// fully typed, with autocomplete for every node and component
const cam = ctx.sceneData.MyScene.MainCamera.$object; // THREE.PerspectiveCamera
const orbit = ctx.sceneData.MyScene.MainCamera.$components.OrbitControls; // typed!
NEW: SSR support (experimental) — import Needle Engine in Node.js/SSR frameworks (SvelteKit, Next.js, Nuxt) without ReferenceError crashes. The engine now provides SSR-safe base classes and skips browser-dependent initialization on the server. Core rendering still happens client-side — SSR support means your app can import and reference engine code server-side without errors.
NEW: JSX type declarations for <needle-engine> and other web components — first-class support for React, Preact, SolidJS, and other JSX-based frameworks with full autocomplete and type checking
NEW: needle shorthand (experimental) — quick access to the current engine context from anywhere without passing ctx around. Works in React/Svelte/Vue components, button handlers, or plain JavaScript. SSR-safe.
import { needle } from "@needle-tools/engine";
needle.scene.traverse(obj => { ... }); // access the three.js scene
needle.renderer; // access the WebGLRenderer
needle.sceneData.MyScene.Camera.$components.OrbitControls.autoRotate = true;
NEW: context.lights array and context.mainLight getter for easy access to all scene lights and the primary directional light
Add: needlePlugins() can now be called without arguments — the Vite command is resolved automatically. This simplifies setup in frameworks like SvelteKit where defineConfig doesn’t expose the command:
Fix: BloomEffect and Sharpening were pulling in the entire postprocessing library even in projects that don’t use postprocessing, increasing bundle size unnecessarily
Fix: SceneSwitcher now shows the object name in the URL when referencing scene objects (instead of just an index)
Improved: Vite plugin reliability (fewer unnecessary reloads, cleaner log output)
Unity Integration
Improved: Needle Cloud AI can now pull context from your local Unity and web project for more relevant assistance
Improved: Sample search now matches tags (e.g. searching “rendering” finds samples tagged with “rendering”) and ranks results by title > description > tags