
@react-three/fiber
A React renderer for Threejs
About
A React renderer for Threejs
What detecting @react-three/fiber tells you about a site
@react-three/fiber is the React renderer for Three.js, so finding it tells you the site does real-time 3D and the team chose to express that scene declaratively as React components rather than imperative Three.js calls. That choice signals a React-native engineering culture and usually a product where 3D is central (a configurator, a hero experience, a game or a visualisation), not an incidental flourish. Its presence almost guarantees Three.js is also in the bundle and that the page is doing meaningful GPU work behind the DOM.
Why the exact @react-three/fiber version matters
react-three-fiber's v8 rewrite reworked the reconciler, event system and React-version requirements, and its compatibility with specific Three.js revisions is tight, so the exact version constrains both the React era and which Three revision the scene was authored against. Mismatches between fiber and Three versions are a known source of breakage, which makes the pinned pair genuinely diagnostic.
@react-three/fiber in a real-world stack
When you find @react-three/fiber in a bundle, it rarely travels alone. three and @react-three/drei, on a React or Next.js base.
Quick facts
npm install @react-three/fiberCommon pairings
Packages this one expects to find in the same project. Each is also a Sourcemap Explorer detection target.
What @react-three/fiber pulls in
@react-three/fiber declares 10 direct dependencies — each one also rides into any bundle that ships @react-three/fiber, so they are detection targets too. Reading them is a quick way to understand the package's real footprint .
How Sourcemap Explorer detects @react-three/fiber
@react-three/fiber ships as v9.7.0, published 2026-07-31 and carries 10 direct dependencies, 8 peer dependencies (expo, react, three), 305 versions on the registry. Those exact numbers are the footprint Sourcemap Explorer matches when @react-three/fiber rides inside a deployed bundle — here is how the detection works.
We catch @react-three/fiber from two complementary signals: bundled source paths and the embedded package.json. Modern bundlers (webpack, Vite, esbuild, Rollup, Turbopack) preserve the original node_modules/@react-three/fiber/ paths inside the JavaScript sourcemap's sources[] array — that's the canonical signal. When the matching package.json is also captured in sourcesContent[], we read the exact version field — patch number included. No regex guessing, no version inference.
- 1
Confirm the site exposes sourcemaps
In DevTools Network, check the response headers of any application script for `SourceMap` or `X-SourceMap`. Failing that, fetch the script's last 4 KB and look for a `//# sourceMappingURL=` comment — that map is where the `@react-three/fiber` paths live.
- 2
Find the package in the bundle
Open DevTools → Network → reload. Click any application script and look at its sourcemap. Inside, search `sources[]` for entries matching `node_modules/@react-three/fiber/` — every match confirms the package is bundled. The matching `sourcesContent[i]` for `node_modules/@react-three/fiber/package.json` gives you the exact installed version.
- 3
Read the version directly from package.json
Run `jq -r '. as $m | $m.sources | to_entries[] | select(.value | endswith("node_modules/@react-three/fiber/package.json")) | $m.sourcesContent[.key] | fromjson | .version' bundle.js.map`. Sourcemap Explorer automates the same query in the popup.
Major releases of @react-three/fiber
When each major version first landed. Major bumps are where breaking changes live, so this timeline is the fastest way to date the @react-three/fiber version a site actually ships against the ecosystem.
Recent versions
@react-three/fiber README
Live mirror of the GitHub README, for reference. Updated whenever the repo's default branch changes.
@react-three/fiber
react-three-fiber is a React renderer for threejs.
Build your scene declaratively with re-usable, self-contained components that react to state, are readily interactive and can participate in React's ecosystem.
npm install three @types/three @react-three/fiber
[!WARNING]
Three-fiber is a React renderer, it must pair with a major version of React, just like react-dom, react-native, etc. @react-three/fiber@8 pairs with react@18, @react-three/fiber@9 pairs with react@19.
Does it have limitations?
None. Everything that works in Threejs will work here without exception.
Is it slower than plain Threejs?
No. There is no overhead. Components render outside of React. It outperforms Threejs in scale due to React's scheduling abilities.
Can it keep up with frequent feature updates to Threejs?
Yes. It merely expresses Threejs in JSX, <mesh /> dynamically turns into new THREE.Mesh(). If a new Threejs version adds, removes or changes features, it will be available to you instantly without depending on updates to this library.
What does it look like?
| Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (live demo). |
|
import { createRoot } from 'react-dom/client'
import React, { useRef, useState } from 'react'
import { Canvas, useFrame } from '@react-three/fiber'
function Box(props) {
// This reference gives us direct access to the THREE.Mesh object
const ref = useRef()
// Hold state for hovered and clicked events
const [hovered, hover] = useState(false)
const [clicked, click] = useState(false)
// Subscribe this component to the render-loop, rotate the mesh every frame
useFrame((state, delta) => (ref.current.rotation.x += delta))
// Return the view, these are regular Threejs elements expressed in JSX
return (
<mesh
{...props}
ref={ref}
scale={clicked ? 1.5 : 1}
onClick={(event) => click(!clicked)}
onPointerOver={(event) => hover(true)}
onPointerOut={(event) => hover(false)}>
<boxGeometry args={[1, 1, 1]} />
<meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />
</mesh>
)
}
createRoot(document.getElementById('root')).render(
<Canvas>
<ambientLight intensity={Math.PI / 2} />
<spotLight position={[10, 10, 10]} angle={0.15} penumbra={1} decay={0} intensity={Math.PI} />
<pointLight position={[-10, -10, -10]} decay={0} intensity={Math.PI} />
<Box position={[-1.2, 0, 0]} />
<Box position={[1.2, 0, 0]} />
</Canvas>,
)
Show TypeScript example
npm install @types/three
import * as THREE from 'three'
import { createRoot } from 'react-dom/client'
import React, { useRef, useState } from 'react'
import { Canvas, useFrame, ThreeElements } from '@react-three/fiber'
function Box(props: ThreeElements['mesh']) {
const ref = useRef<THREE.Mesh>(null!)
const [hovered, hover] = useState(false)
const [clicked, click] = useState(false)
useFrame((state, delta) => (ref.current.rotation.x += delta))
return (
<mesh
{...props}
ref={ref}
scale={clicked ? 1.5 : 1}
onClick={(event) => click(!clicked)}
onPointerOver={(event) => hover(true)}
onPointerOut={(event) => hover(false)}>
<boxGeometry args={[1, 1, 1]} />
<meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />
</mesh>
)
}
createRoot(document.getElementById('root') as HTMLElement).render(
<Canvas>
<ambientLight intensity={Math.PI / 2} />
<spotLight position={[10, 10, 10]} angle={0.15} penumbra={1} decay={0} intensity={Math.PI} />
<pointLight position={[-10, -10, -10]} decay={0} intensity={Math.PI} />
<Box position={[-1.2, 0, 0]} />
<Box position={[1.2, 0, 0]} />
</Canvas>,
)
Live demo: https://codesandbox.io/s/icy-tree-brnsm?file=/src/App.tsx
Show React Native example
This example relies on react 18 and uses expo-cli, but you can create a bare project with their template or with the react-native CLI.
# Install expo-cli, this will create our app
npm install expo-cli -g
# Create app and cd into it
expo init my-app
cd my-app
# Install dependencies
npm install three @react-three/fiber@beta react@rc
# Start
expo start
Some configuration may be required to tell the Metro bundler about your assets if you use useLoader or Drei abstractions like useGLTF and useTexture:
// metro.config.js
module.exports = {
resolver: {
sourceExts: ['js', 'jsx', 'json', 'ts', 'tsx', 'cjs'],
assetExts: ['glb', 'png', 'jpg'],
},
}
import React, { useRef, useState } from 'react'
import { Canvas, useFrame } from '@react-three/fiber/native'
function Box(props) {
const mesh = useRef(null)
const [hovered, setHover] = useState(false)
const [active, setActive] = useState(false)
useFrame((state, delta) => (mesh.current.rotation.x += delta))
return (
<mesh
{...props}
ref={mesh}
scale={active ? 1.5 : 1}
onClick={(event) => setActive(!active)}
onPointerOver={(event) => setHover(true)}
onPointerOut={(event) => setHover(false)}>
<boxGeometry args={[1, 1, 1]} />
<meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />
</mesh>
)
}
export default function App() {
return (
<Canvas>
<ambientLight intensity={Math.PI / 2} />
<spotLight position={[10, 10, 10]} angle={0.15} penumbra={1} decay={0} intensity={Math.PI} />
<pointLight position={[-10, -10, -10]} decay={0} intensity={Math.PI} />
<Box position={[-1.2, 0, 0]} />
<Box position={[1.2, 0, 0]} />
</Canvas>
)
}
Documentation, tutorials, examples
Visit docs.pmnd.rs
First steps
You need to be versed in both React and Threejs before rushing into this. If you are unsure about React consult the official React docs, especially the section about hooks. As for Threejs, make sure you at least glance over the following links:
- Make sure you have a basic grasp of Threejs. Keep that site open.
- When you know what a scene is, a camera, mesh, geometry, material, fork the demo above.
- Look up the JSX elements that you see (mesh, ambientLight, etc), all threejs exports are native to three-fiber.
- Try changing some values, scroll through our API to see what the various settings and hooks do.
Some helpful material:
- Threejs-docs and examples
- Discover Threejs, especially the Tips and Tricks chapter for best practices
- Bruno Simons Threejs Journey, arguably the best learning resource, now includes a full R3F chapter
Ecosystem
There is a vibrant and extensive ecosystem around three-fiber, full of libraries, helpers and abstractions.
@react-three/drei– useful helpers, this is an ecosystem in itself@react-three/gltfjsx– turns GLTFs into JSX components@react-three/postprocessing– post-processing effects@react-three/uikit– WebGL rendered UI components for three-fiber@react-three/test-renderer– for unit tests in node@react-three/offscreen– offscreen/worker canvas for react-three-fiber@react-three/flex– flexbox for react-three-fiber@react-three/xr– VR/AR controllers and events@react-three/csg– constructive solid geometry@react-three/rapier– 3D physics using Rapier@react-three/cannon– 3D physics using Cannon@react-three/p2– 2D physics using P2@react-three/a11y– real a11y for your scene@react-three/gpu-pathtracer– realistic path tracingcreate-r3f-app next– nextjs starterlamina– layer based shader materialszustand– flux based state managementjotai– atoms based state managementvaltio– proxy based state managementreact-spring– a spring-physics-based animation libraryframer-motion-3d– framer motion, a popular animation libraryuse-gesture– mouse/touch gesturesleva– create GUI controls in secondsmaath– a kitchen sink for math helpersminiplex– ECS (entity management system)composer-suite– composing shaders, particles, effects and game mechanicstriplex– visual editor for react-three-fiberkoestlich– UI component library for react-three-fiber
Usage Trend of the @react-three Family
Who is using Three-fiber
A small selection of companies and projects relying on three-fiber.
vercel(design agency)basement(design agency)studio freight(design agency)14 islands(design agency)ueno(design agency) — videoflux.ai(PCB builder)colorful.app(modeller)bezi(modeller)readyplayer.me(avatar configurator)zillow(real estate)lumalabs.ai/genie(AI models)skybox.blockadelabs(AI envmaps)3dconfig(floor planer)buerli.io(CAD)getencube(CAD)glowbuzzer(CAD) — videotriplex(editor) — videotheatrejs(editor) — video
How to contribute
If you like this project, please consider helping out. All contributions are welcome as well as donations to Opencollective, or in crypto BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH, ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682.
Backers
Thank you to all our backers! 🙏
Contributors
This project exists thanks to all the people who contribute.
FAQ
What is @react-three/fiber used for?
A React renderer for Threejs
How can I tell if a website is using @react-three/fiber?
Open the page in Chrome with the Sourcemap Explorer extension installed and read the Stack tab. We catch `@react-three/fiber` from two complementary signals: `node_modules/@react-three/fiber/` paths inside the JavaScript sourcemap, and the embedded `package.json` we read for exact-version detection. Without the extension you can do the same lookup manually in DevTools — the steps are listed in the "How Sourcemap Explorer detects" section above.
How do I find out which version of @react-three/fiber a website is running?
Read it straight from the site's JavaScript sourcemap. When a build ships source maps, the bundled `@react-three/fiber/package.json` carries the exact `version` string — Sourcemap Explorer extracts it in one click on the Stack tab, and you can do it by hand in DevTools by opening the `.map` file and searching for `node_modules/@react-three/fiber/package.json`. That is far more reliable than inferring the version from an asset-hash or a `?ver=` query string, which is all surface-level detectors have to go on. The current npm release is 9.7.0, but real deployments frequently run an older pinned version — which is exactly why reading the bundled number matters.
What is the latest version of @react-three/fiber?
9.7.0, as published on the npm registry. The "Recent versions" table on this page lists the most recent 8 releases with their release dates. Sourcemap Explorer reports the version actually bundled into a site, which can lag the latest release by months on real-world deployments.
Is @react-three/fiber actively maintained?
Very actively maintained — the last release shipped within the past three months. The last published release was 2026-07-31. Source code: https://github.com/pmndrs/react-three-fiber.
Where can I read more?
Project homepage: https://github.com/pmndrs/react-three-fiber#readme. Source code: https://github.com/pmndrs/react-three-fiber. Published on npm: https://www.npmjs.com/package/@react-three/fiber. Licensed as MIT.
Keep reading on Sourcemap Explorer
Detection deep dives
Alternative tools
Detected by Sourcemap Explorer
When a bundle ships sourcemaps, we read the embedded package.json for @react-three/fiber and report the precise version (the registry's latest is v9.7.0, published 2026-07-31; the bundled copy is often older). Without sourcemaps, an import / require in the page's scripts is enough to flag it.


