Every technology choice in Reze Studio is optimized for one goal: a timeline editor that feels native in a browser tab. The engine layer (reze-engine) handles GPU rendering, physics simulation, and IK entirely off the main thread via WebGPU. The framework layer (Next.js 16 + React 19) provides the declarative shell, while a set of carefully chosen hot-path bypasses keep React out of the 60Hz render loop entirely. The UI layer (shadcn/ui + Tailwind CSS v4) delivers accessible, composable primitives without introducing a heavyweight component runtime.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/AmyangXYZ/reze-studio/llms.txt
Use this file to discover all available pages before exploring further.
reze-engine
reze-engine (v0.15) is the custom runtime that powers everything inside the WebGPU canvas. It is not a wrapper around an existing engine — it is a ground-up TypeScript implementation of:- WebGPU renderer — a modern GPU pipeline with support for MMD-style NPR shading, bloom post-processing, and a configurable ground plane.
- Bullet physics port — a TypeScript translation of Bullet Physics for rigid-body simulation of skirts, hair, and other secondary motion attached to PMX models.
- IK solver — a full implementation of the VMD IK specification so foot-contact and eye-target bones drive correctly during playback.
- VMD import/export — binary
.vmdparsing and serialization including bone keyframes, morph keyframes, and the 128-point Bézier interpolation format. - PMX loader — complete PMX model parsing including skeleton, morphs, materials, and texture coordinates.
reze-engine@^0.15.1) and exposes a TypeScript API around an Engine class and a Model class. EngineBridge in Reze Studio holds the only live Engine reference and wires it to React state via useEffect.
reze-engine on GitHub
Source, changelog, and API reference for the engine powering Reze Studio.
Reze Studio Live
Try the editor in your browser — no install required.
Next.js and React
Reze Studio runs on Next.js 16 (package version^16.1.6) with the App Router. The entire application is a single route (app/page.tsx) that mounts the provider tree and <StudioPage>. There is no server-side data fetching — PMX models and VMD animations are loaded client-side from public/ or from user-supplied files via the browser’s File API.
React 19 (19.2.3) is used throughout. Every interactive component is marked "use client" at the top of the file. The useSyncExternalStore hook (stable since React 18) is the backbone of the external store pattern — see the Architecture page for details.
reactStrictMode is set to false in next.config.ts to avoid double-invoking engine initialization effects during development:
UI Layer
The component library is shadcn/ui (devDependencyshadcn@^3.8.4), which generates unstyled Radix UI primitives into components/ui/ and styles them with Tailwind. The following shadcn/ui components are used across the studio:
Button— file menu actions, load/export triggersMenubar/MenubarMenu/MenubarContent/MenubarItem— the File, Help, and Settings menus in the left panelTabs/TabsList/TabsTrigger/TabsContent— right-panel Properties vs Materials split, and timeline Dopesheet vs Curve Editor splitSlider— rotation and translation sliders in the Properties InspectorInput— direct numeric entry for bone rotations, translations, and the frame counter
tailwindcss@^4) provides the utility classes that shadcn/ui components build on. The tw-animate-css plugin (^1.4.0) adds animation utilities used in overlay transitions. Class merging is handled by clsx + tailwind-merge via a cn() helper in lib/utils.ts:
radix-ui@^1.4.3) supplies the accessibility primitives that shadcn/ui components sit on top of — focus management, keyboard navigation, and ARIA attributes for menus, tabs, and dialogs are all handled by Radix.
WebGPU
WebGPU is the graphics API that reze-engine uses for all rendering and GPU compute. It was chosen over WebGL for several reasons:- Modern pipeline — explicit resource binding, pipeline state objects, and a compute shader stage that matches how contemporary GPUs are designed.
- Performance — lower CPU overhead per draw call compared to WebGL, and no driver state machine to fight with.
- GPU compute — physics constraints and skinning can run in compute shaders, freeing the CPU for JS logic.
Reze Studio requires a WebGPU-capable browser. If you open the app in a browser that does not support WebGPU, the viewport will display an error message and no model will load. Use Chrome 113 or later, Edge 113 or later, or Safari 18+ for the best experience.
Dependencies
The following table lists every production dependency declared inpackage.json:
| Dependency | Version | Purpose |
|---|---|---|
next | ^16.1.6 | App Router framework, dev server, build pipeline |
react | 19.2.3 | UI runtime, useSyncExternalStore, hooks |
react-dom | 19.2.3 | DOM renderer for React 19 |
reze-engine | ^0.15.1 | WebGPU renderer, physics, IK, VMD/PMX I/O |
lucide-react | ^0.563.0 | Icon set (FilePlus2, FolderOpen, FileMusic, FileDown, etc.) |
radix-ui | ^1.4.3 | Accessible Radix UI primitives (menus, tabs, sliders) |
class-variance-authority | ^0.7.1 | Variant-based className composition for shadcn/ui |
clsx | ^2.1.1 | Conditional className builder |
tailwind-merge | ^3.4.0 | Tailwind class deduplication |
@vercel/analytics | ^1.6.1 | Page-view analytics (injected in app/layout.tsx) |
TypeScript
The entire codebase is strict TypeScript 5 (typescript@^5). All context files, component files, and library modules are typed end-to-end — there are no any escapes in production paths. Engine types (AnimationClip, BoneKeyframe, MorphKeyframe, GizmoDragEvent, etc.) are imported directly from reze-engine’s type declarations.
Notable typing patterns used throughout the studio:
SetStateAction<T>andDispatch<SetStateAction<T>>from React are used for action signatures so consumers can pass either a direct value or an updater function.RefObject<T>is used for shared refs (e.g.currentFrameRef,playheadDrawRef) to communicate that the ref identity is stable but the value is mutable.ReadonlySet<string>is used for bone and morph name sets to prevent accidental mutation.