Skip to content

What brepjs is NOT

Knowing the non-goals matters as much as knowing the goals. brepjs is opinionated, and a few things are deliberately out of scope. If you need any of these, brepjs is the wrong tool — pick something else.

Not a renderer

brepjs has no graphics, no canvas, no WebGL, no scene graph. The output of every modelling operation is a B-Rep shape; you mesh it (shape(s).mesh()) and hand the triangle data to your renderer of choice — Three.js, Babylon.js, raw WebGL, react-three-fiber.

The Three.js Integration chapter covers the meshing → rendering pipeline.

Not a mesh library

If you have triangle data and want to do operations on triangle data, use Three.js, Babylon.js, or Manifold. brepjs only ingests meshes via importSTL, which converts triangles into a B-Rep approximation — useful for measurement and STEP conversion, not for further triangle work.

Not an organic modeller

brepjs has no SubD modelling, no T-splines, no sculpting tools, no Blender-style modifier stack. The geometry it can express is whatever OpenCascade's NURBS-based kernel can express — planes, cylinders, cones, spheres, tori, B-spline surfaces, swept and revolved surfaces. Excellent for parts; not the right tool for character modelling, terrain, or hand-sculpted forms.

Not a real-time CSG library

fuse, cut, and intersect are exact boolean operations on B-Rep shapes — they take milliseconds to seconds depending on shape complexity, not microseconds. If you need real-time CSG (e.g. for live editing of dozens of operations per frame), the kernel will be too slow and a mesh-CSG library is a better fit.

Not a constraint solver for 2D drafting

brepjs ships a Sketcher for building 2D profiles fluently (movePointerTo, lineTo, tangentArcTo, close, extrude). It does not ship a 2D constraint solver: you cannot say "make these two lines parallel" or "constrain this distance to 10mm". For constraint-based parametric drafting, use Solvespace or PythonOCC.

Not an assembly solver

brepjs ships an assembly module for grouping parts and applying mate constraints (concentric, distance, plane-on-plane), but the solver is intentionally limited:

  • It uses the original face coordinates of each part, so distance constraints do not compose across multiple mates in the same chain
  • There is no degree-of-freedom analysis, no kinematic motion, no collision detection

For multi-body kinematic assemblies, use a dedicated mechanical CAD tool. brepjs assemblies are appropriate for static parametric placement (e.g. "snap this insert into that bin").

Not server-side renderable

brepjs requires WASM to run. Server-side rendering frameworks (Next.js SSR, Nuxt SSR, Remix) cannot execute the kernel during render. You must use brepjs in client-side components — dynamic(import, { ssr: false }) in Next.js, <ClientOnly> in Nuxt, etc. The Frameworks chapter covers patterns for each framework.

Not a multi-user collaboration tool

brepjs is a library, not a service. It has no networking, no shared state, no operational transform, no presence. If you need real-time collaborative CAD editing, you build that on top — brepjs handles the geometry kernel, you handle the syncing.

Not a manufacturing toolpath generator

brepjs models parts. It does not generate G-code, slicer output, or CAM toolpaths. Export your part to STEP and feed it to Fusion 360 Manufacturing, PrusaSlicer, or any CAM/slicer tool.

Not a magic black box

The kernel is OpenCascade. The pitfalls of OpenCascade — boolean failures on near-coincident geometry, fillet failures on tight curvature, healing requirements after STEP imports — are inherited by brepjs. The library wraps them in nicer types and clearer errors, but the underlying geometry concerns are the same. Read Healing & Sewing before you ship anything that imports STEP from third parties.

Next steps

Released under the Apache 2.0 License.