> ## Documentation Index
> Fetch the complete documentation index at: https://docs.speckle.systems/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> These docs contain multiple Speckle product experiences. For Speckle 2026.9, prefer /next/ pages for the topics and changes they cover. The navigation label Current does not override this version-specific precedence.
> Coverage under /next/ is incremental. Use Current documentation for unchanged topics and when a /next/ page says coverage is unavailable or explicitly refers you to Current. Do not infer a feature was removed from a missing page.
> Read the page-specific documentation status, applicability, affected guidance and replacement links in agent-only content. Impacted, changed and superseded apply only to the stated scope; they do not mean the entire feature is deprecated. Historical connector guides apply only to the legacy connector described.
> Match guidance to the customer's deployment version, model data format and connector. Respect plan, permission and compatibility restrictions. If an unknown version or data format changes the answer, ask a focused clarification; do not infer deployment version from the date alone.

# 3D Viewer

> Introduction to the Speckle Viewer architecture built on three.js. Learn about viewer-core features like automatic batching, BVH acceleration, and instanced rendering, plus the extensible extension system for custom functionality.

The speckle viewer is developed on top of [three.js](https://threejs.org/) and for the most part it behaves like a typical three.js application. However, Speckle viewer builds custom functionality on top of three.js when it comes to loading and storing data, object interpretation, scenegraph structure, and rendering.

The Viewer library is organized into `viewer-core` and `extensions`.

## Viewer-core

<Frame>
  <img src="https://mintcdn.com/speckle/tH1u1dKYaNtn7MaZ/images/developers/viewer/viewer-core.png?fit=max&auto=format&n=tH1u1dKYaNtn7MaZ&q=85&s=f3531db6d4a0f5b001cd502449f45e78" alt="Viewer core" width="442" height="559" data-path="images/developers/viewer/viewer-core.png" />
</Frame>

The `viewer-core` has it's own API and can be used as a standalone to develop applications. If all you want is a barebone web viewer, the viewer core is what you are looking for. Some of the features you'll be getting are:

* Automatic object batching
* Relative to eye rendering
* Multi level [BVH](https://en.wikipedia.org/wiki/Bounding_volume_hierarchy)s
* Automatic [instanced rendering](https://en.wikipedia.org/wiki/Geometry_instancing)
* Progressive [ambient occlusion](https://en.wikipedia.org/wiki/Ambient_occlusion)
* Shadowcatcher

## Extensions

In order to better customize the viewer functionality and behavior we've added support for extensions. A lot of explicit viewer functionality is provided via such extensions

<Frame>
  <img src="https://mintcdn.com/speckle/tH1u1dKYaNtn7MaZ/images/developers/viewer/extensions_core.png?fit=max&auto=format&n=tH1u1dKYaNtn7MaZ&q=85&s=a0aa6fc8e2e2fc3e9e0f76c768c631c9" alt="Extensions core" width="720" height="559" data-path="images/developers/viewer/extensions_core.png" />
</Frame>

Extensions are a way in which you can easily drop in additional functionality to your viewer instance. If the default behavior or functionality of an extension does not exactly fit your needs, you can easily extend on it and change the way it works.

<Note>
  Probably the most important aspect with extensions, is that you can develop your own! More details
  on this topic will follow in a dedicated chapter.
</Note>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.