# Changelog
https://paprika3d.com/docs/changelog

Made at build time from the repository: each stable tag of [paprika3d/paprika3d](https://github.com/paprika3d/paprika3d) with its [CHANGELOG.md](https://github.com/paprika3d/paprika3d/blob/main/CHANGELOG.md) entry and the tools the release added or removed since the tag before, and each guide's date added and dates re-verified. A week with none of these has no section.

## Week of 2026-10-26

### paprika3d 0.3.2

Tagged [v0.3.2](https://github.com/paprika3d/paprika3d/tree/v0.3.2) on 2026-10-29.

`perf` with `variants` stops after 5 rounds, not 8: a variant still undecided by then reads `no clear change`
as before, and a 5-variant call takes about two thirds as long. Changes of about 10% are caught less often.

### paprika3d 0.3.1

Tagged [v0.3.1](https://github.com/paprika3d/paprika3d/tree/v0.3.1) on 2026-10-29.

`perf` with `variants` repeats each measure over fresh page loads and says a change only when it holds across them:
two loads of the same page differ by 2 to 4 times the spread inside one sample, so a variant that changed nothing read
as a change 5 to 8 times in 16 against the old noise line. Each call runs rounds of one baseline run and one run of each
variant still undecided, until the variant's 95% interval on the ratio to the baseline is narrow or clearly away from 1,
8 rounds, or 45 s. A row reads `−45% (−58% to −27%) vs baseline over 4 runs` or `no clear change (−10% to +13%, 8 runs)`,
and the noise line is now `Baseline over N loads: M ms median, runs spread X%` (#163).

Look sheets, cameras, viewports and scroll sweeps skip the z-fighting check, which their replies never print, and probe
the page size once per size instead of on every cell: sheets are 6% to 28% faster on the test pages, with the same
replies and pictures. A sheet's or `test`'s closing reload is left to the next call when that call reloads first anyway,
saving one reload of a 3-cell sheet's 4. `interact` `hover` and `reference` `compare` skip the same check (hover 32% to
55% faster, compare 36% to 54%), and pictures are decoded in the page with `Uint8Array.fromBase64`, so `reference` on a
large photo, `model_audit` shrink and `record: "video"` are 11% to 39% faster. A call's 10 or 20 min limit now covers
its rerun after the page navigates, where a rerun got a whole limit of its own and some calls ran 12 to 19 min (#204).
A call queued behind the after-edit hook's check of the saved checks starts its limit when it runs and opens with how
long it waited, where it spent its own limit waiting and could time out at 10 min (#205).

### paprika3d 0.3.0

Tagged [v0.3.0](https://github.com/paprika3d/paprika3d/tree/v0.3.0) on 2026-10-29.

A minor version because the tool list changes: the `optimize` tool folds into `perf` (below), so the stable build lists
15 tools. The stable build ships readable bundles and the TypeScript they are built from under `source/`, and CONTRIBUTING.md
takes outside changes with a DCO sign-off. `look`'s z-fighting check covers every mesh on a heavy page (all 103 of a
100-mesh test page in about 100 ms, where it checked 0 to 76) and, when it still reaches its limit, says `Surfaces: not
checked for N of M meshes` where the Surfaces line goes (#161). That check counts its work instead of timing itself, so a busy machine names the same fights as an idle one: timed, the Studio at load 20-36 named a fight in only 22-27 of 63 flicker cells (#196). Each open deletes the pictures and clips in all but the
newest 10 run folders (#74). A `perf` variant samples 2 s against the baseline's 4 s, so a 5-variant call takes about
28 s instead of 40 (#163). On a software renderer, each clock frame waits for the GPU, so looks stop hitting the 180 s
timeout (#25). The `look` and `interact` schemas are shorter (the tool list is 13% smaller) and the `threejs-game` skill
is about half its size, with the detail in `references/tools.md`. `paprika-make` asks its questions, has a subagent find
reference pictures the person confirms, and writes the brief before any page file; `paprika-loop` starts only when the
person types it. The `open` reply says geo.js and fx.js are replaced only when the plugin's copy changes. The README
puts the result and install first; the tool, skill and hook tables are on the docs site's plugin page. The after-edit
hook's once-per-session line that a three.js page has not been opened also comes for a page a shell command wrote (a
heredoc or a generator script), found under the session's folder as one changed since the session began (#188). `open`
loads at session start under Claude Code's tool search, which otherwise shows each MCP tool by name only until the agent
searches for it: its tools/list entry carries `_meta: {"anthropic/alwaysLoad": true}`, which Claude Code 2.1.285 and
later read. The `optimize` tool is now `perf` with `optimize: true`: it measures, tries the @paprika3d/three-runtime
switches (`resolution`, `defaults`, `instancing`, `lod`, `dispose`) one at a time, keeps those that help in
`game-runtime.json`, and ends with the final `test` of `game-tests.json` when the project has one. With
`optimize: true`, `perf` takes only `budget`, and the `switches` option is gone. The MCP server starts about a quarter
faster (117 to 85 ms on an M3 Air): it and the hooks run through Node's on-disk compile cache (Node 22.8 and later). A
`look` zoom on a scrolled page shows the box the look listed there, not the part of the page above it, and leaves the
page's scroll where it was (#193). The picture in a tool reply is at most 1,024 pixels wide, not 1,280,
about 850 tokens a look instead of 1,330 (a vision eval on 133 assets found Sonnet's defect recall no lower). The after-edit hook no longer says a three.js page has not been opened when an `open` of it ran in the same batch of tool calls as the write: it reads that `open`'s reply from the hook's own input, since Claude Code adds a batch's results to the transcript up to 100 ms after the hook starts (#194).

Once per install and per update, at the MCP client's first `initialize`, the server sends the install id, the plugin
version, OS and Node version and the client's name and version, so the team can count installs; nothing about the
project, and `DO_NOT_TRACK=1` or `PAPRIKA3D_TELEMETRY=0` turns it off, as for `send_feedback` (the README's what leaves
your machine and SECURITY.md say so). `perf` samples frames as a browser runs them, letting the GPU run at most two
frames behind, instead of waiting for the GPU every frame, which read a frame as its CPU and GPU time added (#191); its
pass times sync on a 1x1 framebuffer the harness owns, so the pass after a multisampled target's resolve is no longer
charged the heavy pass's GPU time; a WebGPURenderer with no device yet no longer stops every frame stamp; and a pass
whose material is three's ShaderPass default is named by its uniforms, not `(unspecified)`. `look` says a subject the
ID image cannot find (drawn by its own shader, or see-through) has its share not measured, instead of `drew no pixel`.
The `interact`, `look` and `perf` descriptions name their siblings and say what fails and what persists.
`paprika-make` and `paprika-loop` ask one question for each of what it is, what it must have, its controls and its
pictures that the request leaves open, so a detailed request gets one or two, and a request that names no pictures
starts the reference subagent before the first question. A `paprika-loop` judge marks a Next item it asked for before
`(asked again)` and names the one tool call that shows it done, and when the last three judges gave the same score the
next builder's prompt says so. The stable build carries SECURITY.md (founders@keeno.dev, the latest release only) and,
in the public repo, a Dockerfile so Glama can run the server and list its tools. `paprika3d check` prints an opt-in
`Tested with paprika3d` line under its plain report with `PAPRIKA3D_TESTED_WITH=1`, for a report pasted into a PR. Five
one-task skills, `threejs-screenshot`, `threejs-play`, `threejs-test`, `threejs-perf` and `threejs-glb-audit`, sit
beside `threejs-game`, so `npx skills add paprika3d/paprika3d --skill <name>` installs one. `asset_search`'s library
holds 57,732 models, with the 549 from Scenario's 3D Collection.

Tools against 0.2.4, 16 then and 15 now: Removed `optimize`.

### paprika3d 0.2.4

Tagged [v0.2.4](https://github.com/paprika3d/paprika3d/tree/v0.2.4) on 2026-10-27.

`templates/viewer.html` sets `NeutralToneMapping` after `stage()`, so a swatch and the material it names read as one
colour, and `references/configurator.md` says why: `stage()`'s ACES default mutes and shifts saturated colours (#183).
Reply lines call the person at the page a viewer, never a player: `look`'s `It blends in` and `Dark` lines, `open`'s
slow-start line, `perf`'s p95 hitch line and the `opening` description (#64); the `threejs-game` skill's first-frame rule
says a page's own controls or labels over the canvas are not a cover.

### paprika3d 0.2.3

Tagged [v0.2.3](https://github.com/paprika3d/paprika3d/tree/v0.2.3) on 2026-10-27.

`perf { costs: true }`'s table header says which total is which when the reply's first line disagrees with it: the first
line counts the frame as drawn (the camera's view plus the shadow pass) and the textures on the GPU (the background and
environment included), the table the main scene's objects (#179). `feel` puts its `State changed during setup` line
right after the `Watched` line, above the HUD and sound lines that count only the watched frames (#182). The
`threejs-game` skill's reload list names an `interact` with `save`, which replays from a fresh reload (#180); its Rapier
paragraph says the project's copy and game-state's worker are separate, so their versions need not match, and which
file each version ships (#181); and the after-edit hook's recheck is explained once, in `references/lighting.md`, with
the skill and the server's instructions pointing there.

### paprika3d 0.2.2

Tagged [v0.2.2](https://github.com/paprika3d/paprika3d/tree/v0.2.2) on 2026-10-27.

One shorter description on every surface: "Three.js MCP server and Claude Code plugin: screenshot, play, test and
profile the three.js pages your coding agent builds." The README drops the publish banner, the install commands it
listed twice, the `window.__game` code and the runtime import (both on the docs site) and the lines about what is never
sent; what leaves your machine lists what each tool sends. `look`'s Hues line leaves out the one object over half the
frame, by name, so the other objects' colours show (#178), and `interact`'s Motion line takes its first sample at frame
1 when no frame has been drawn yet, so a save straight after a reload measures the same run as after a look (#176).
The `threejs-game` skill gains `templates/viewer.html`, a product viewer of named parts whose click cycles a variant, with
`observe` and `setState` for each one, and its goal paragraph is in plain sentences. `asset_search`'s `model` input says
it is optional and what it is sent with.

### paprika3d 0.2.1

Tagged [v0.2.1](https://github.com/paprika3d/paprika3d/tree/v0.2.1) on 2026-10-26.

The public copy for 0.2.0: a new README (the intro reel, the results, install for each agent, the 16 tools with when to
use each, what leaves your machine), the docs site's install and publish pages, shorter package, plugin and registry
descriptions, and this changelog in the package. `paprika3d check` describes the saved checks it reruns. No tool
changes.

### paprika3d 0.2.0

Tagged [v0.2.0](https://github.com/paprika3d/paprika3d/tree/v0.2.0) on 2026-10-26.

The first production release of paprika3d, the three.js toolset for coding agents: a Claude Code plugin and an MCP server
(`npx -y paprika3d serve`) that let an agent open, look at, play, measure and fix the three.js, React Three Fiber and
WebGL pages it writes, in headless Chrome on a paused, seeded clock.

The tool names and their inputs, the skill names, the `paprika3d serve` command and the environment variables in
`server.json` change only in a minor release before 1.0, with a note here. Previews, which may change in any minor release: `publish` (invite-only),
`model_run` and `model_look`, `asset_search`, and `open`'s `browser: "firefox"`. The plugin needs Claude Code 2.1.118
or later; the server needs Google Chrome and Node 20.11 or later.

#### Tools (16)

In Claude Code a tool's full name is `mcp__plugin_paprika3d_paprika__<tool>`.

- **See the page:** `open` (the page in headless Chrome on a paused, seeded clock, with the files it loaded and failed
  to load, dev-server errors, an unsized canvas, an old or removed three.js API; up to 4 pages at once; Firefox on
  request), `look` (a screenshot with the named objects on screen and the ones never seen, and fault lines for
  lighting, z-fighting surfaces, the canvas and HTML over it; modes `target`, `cameras`, `sheet`, `viewports`,
  `scroll`, `zoom`, `sample`, `at`, `opening`, `save`, `compare`), `observe` (the state as JSON) and `reference` (a
  picture the page should match, and the page compared with it by region).
- **Play it:** `interact` (keys, mouse, touch, wheel, scroll, resize and clock steps on exact frames, with what changed
  in the state; `until`, `trace`, `expect`; `save` keeps a play as a check; `record: true` makes a real-time GIF),
  `test` (reruns the saved checks) and `feel` (shake, pops, eased moves versus teleports, flashes, particles, spawns,
  HUD ticks and sounds after an event).
- **Ask it:** `eval` (any JavaScript in the page, with each mesh's triangles, bounds, closed edges, volume and genus).
- **Build it:** `model_run` and `model_look` (a model built in code with three.js and Manifold in a scene kept between
  calls, saved as a .glb), `model_audit` (.glb, .gltf and USD files against a site or Shopify budget, and `shrink`),
  and `asset_search` (57,183 CC BY and CC0 models, 3,545 PBR textures and 1,430 HDRI skies in a hosted library, with
  `pick` and a credit line in `CREDITS.md`).
- **Speed it:** `perf` (frame time, draw calls, triangles and asset size against a desktop, mobile, Quest or site
  budget, with `variants` and `costs`) and `optimize` (resolution, defaults, instancing, LOD and dispose, kept only where
  they help without changing the picture).
- **Publish it:** `publish` (preview, invite-only: the built page on `https://<name>.paprika3d.app`; `rotate: true`
  replaces a key used from a new place).
- **Report:** `send_feedback` (the agent sends the team a bug or criticism of the harness, at most 20 a day).

#### Skills

- `threejs-game`: the method, with reference files for plain three.js, React Three Fiber and Rapier, which Claude loads
  by itself.
- `/paprika3d:paprika-make <request>`: a short brief, one question at a time, written to `BRIEF.md`, then the build.
- `/paprika3d:paprika-loop <request> for <time>`: the same brief built unattended over a set time in fresh `claude -p`
  sessions, a builder and a read-only judge each iteration, a commit each and the best tagged.
- `paprika-publish`: what the agent invokes before `publish`.

#### Hooks (Claude Code)

- After each batch of edits: the saved checks and the page's lighting and surface faults rechecked, said only when one
  starts or stops failing, and a once-a-session note when a three.js page the agent wrote has not been opened.
- On the first stop: the edits never played or looked at and the faults still open, stated once.

#### In the project

- `geo.js` (procedural geometry with Manifold) and `fx.js` (sound effects, canvas textures, particles, a first-load
  stage, texture coordinates, placement), written by `open`; game-state (typed-array state, rewind, Rapier in a
  worker); `three-runtime.js`, written by `optimize`.

#### Packaging

- Both the plugin and the npm package are bundled for Node: nothing is installed from npm and no browser is downloaded.
  The build carries `THIRD_PARTY_NOTICES.md`, the docs site's pages under `docs/`, `AGENTS.md`, `context7.json` and
  `glama.json`.

#### If you tried a 0.1.x preview

The tools and the server key were renamed, with no aliases: `game_*` tools are now plain names (`game_look` is `look`,
`game_act` is `interact`, `game_clock` is an `interact` step) and the full name is
`mcp__plugin_paprika3d_paprika__<tool>` (it was `mcp__plugin_paprika3d_paprika3d__game_<tool>`); update permission
rules and prompts that name them. The game contract (`game_contract`, `game_check`) is gone. Update with
`claude plugin marketplace update paprika3d` and `claude plugin update paprika3d@paprika3d`, then restart Claude Code.

Tools against 0.1.4, 11 then and 16 now: added `open`, `observe`, `eval`, `interact`, `look`, `feel`, `perf`, `optimize`, `model_audit`, `model_run`, `model_look`, `test`, `reference`, `asset_search`, `publish`, `send_feedback`. Removed `game_contract`, `game_open`, `game_observe`, `game_eval`, `game_act`, `game_clock`, `game_look`, `game_feel`, `game_check`, `game_perf`, `game_optimize`.

### Guides added

- [How to add a game over screen and a restart to a three.js game](https://paprika3d.com/docs/guides/add-a-game-over-screen), 2026-10-30
- [AI prompt to make a game: what to tell the agent so the three.js game comes out as you meant](https://paprika3d.com/docs/guides/ai-prompt-to-make-a-game), 2026-10-30
- [Can I make a game with ChatGPT? A small three.js game, and the step after the chat](https://paprika3d.com/docs/guides/can-i-make-a-game-with-chatgpt), 2026-10-30
- [Do I need a game engine to make a game? What a browser and three.js give a first game](https://paprika3d.com/docs/guides/do-i-need-a-game-engine), 2026-10-30
- [How long does it take to make a game with AI? What one session builds in three.js](https://paprika3d.com/docs/guides/how-long-to-make-a-game-with-ai), 2026-10-30
- [How to make a 3D browser game with three.js, from one HTML file](https://paprika3d.com/docs/guides/how-to-make-a-3d-browser-game), 2026-10-30
- [How to vibe code a game: a small three.js game an AI agent writes, opens and plays](https://paprika3d.com/docs/guides/how-to-vibe-code-a-game), 2026-10-30
- [HTML game not working? Why a three.js game shows a blank page when opened as a file](https://paprika3d.com/docs/guides/html-game-not-working), 2026-10-30
- [How to make a character move in JavaScript with the arrow keys, in a three.js game](https://paprika3d.com/docs/guides/make-a-character-move-in-javascript), 2026-10-30
- [How to make a game feel good: what reacts to each hit and pickup in a three.js game](https://paprika3d.com/docs/guides/make-a-game-feel-good), 2026-10-30
- [How to make a game with Claude Code: from install to a three.js game it plays itself](https://paprika3d.com/docs/guides/make-a-game-with-claude-code), 2026-10-30
- [How to make levels in a game: levels as data in a three.js game](https://paprika3d.com/docs/guides/make-levels-in-a-game), 2026-10-30
- [How to make my game look better: light, colour and camera in a three.js game](https://paprika3d.com/docs/guides/make-my-game-look-better), 2026-10-30
- [How to make sound effects for a game in code, with no audio files, in three.js](https://paprika3d.com/docs/guides/make-sound-effects-for-a-game), 2026-10-30
- [My kid wants to make a video game: making a small three.js game together with an AI agent](https://paprika3d.com/docs/guides/my-kid-wants-to-make-a-video-game), 2026-10-30
- [How to put your game online and send friends a link to a three.js game](https://paprika3d.com/docs/guides/put-your-game-online), 2026-10-30
- [How to save the high score of a game in the browser, for a three.js game](https://paprika3d.com/docs/guides/save-the-high-score), 2026-10-30
- [Vibe coding bugs: keep the AI from breaking what already worked in a three.js game](https://paprika3d.com/docs/guides/vibe-coding-bugs), 2026-10-30
- [What game should I make first? Small three.js games an AI agent can finish and play](https://paprika3d.com/docs/guides/what-game-should-i-make-first), 2026-10-30
- [Where to start making a game: a small three.js game in the browser, built with an AI agent](https://paprika3d.com/docs/guides/where-to-start-making-a-game), 2026-10-30
- [Build a three.js game with an AI agent, and check what it made before you trust it](https://paprika3d.com/docs/guides/ai-agent-build-threejs-game), 2026-10-28
- [ChatGPT three.js code not working? Run it, and read which lines are out of date](https://paprika3d.com/docs/guides/chatgpt-threejs-code-not-working), 2026-10-28
- [Control time in three.js tests, and keep movement frame-rate independent](https://paprika3d.com/docs/guides/control-time-threejs-tests), 2026-10-28
- [Deploy a three.js site without a 404: open the built folder before you upload it](https://paprika3d.com/docs/guides/deploy-threejs-site-404), 2026-10-28
- [Free CC0 3D models and textures for three.js: find one, read its licence, place it at real size](https://paprika3d.com/docs/guides/free-cc0-3d-models-textures-threejs), 2026-10-28
- [Inspect a three.js scene graph and live values from a coding agent](https://paprika3d.com/docs/guides/inspect-threejs-scene-graph), 2026-10-28
- [MCP server for 3D modeling with three.js: build a model in code, see it from four sides, save a GLB](https://paprika3d.com/docs/guides/mcp-server-3d-modeling-threejs), 2026-10-28
- [model-viewer vs three.js for a product page with AR, and moving a model or a colour change between them](https://paprika3d.com/docs/guides/model-viewer-vs-threejs), 2026-10-28
- [Multiple three.js canvases on one page: a renderer per widget, one shared canvas, or a scene in a modal](https://paprika3d.com/docs/guides/multiple-threejs-canvases-one-page), 2026-10-28
- [three.js: window is not defined in Next.js, and the blank canvas after the fix](https://paprika3d.com/docs/guides/nextjs-threejs-window-is-not-defined), 2026-10-28
- [React Three Fiber setState in useFrame: count the re-renders in a three.js scene, then switch to refs](https://paprika3d.com/docs/guides/r3f-setstate-in-useframe-rerenders), 2026-10-28
- [Reduce GLB file size for three.js: find the textures, shrink them, check the picture](https://paprika3d.com/docs/guides/reduce-glb-file-size-threejs), 2026-10-28
- [Run three.js in headless Chrome without a GPU, and know what drew the frame](https://paprika3d.com/docs/guides/run-threejs-headless-chrome-without-gpu), 2026-10-28
- [Text in three.js, TextGeometry, a canvas sprite or HTML, what each costs and how to update it](https://paprika3d.com/docs/guides/text-in-threejs), 2026-10-28
- [three.js 3D text with TextGeometry, centred, on several lines, facing the camera, and the font that will not load](https://paprika3d.com/docs/guides/threejs-3d-text-textgeometry), 2026-10-28
- [three.js animation crossfade from walk to run, without a T-pose flash or a fade that stops working](https://paprika3d.com/docs/guides/threejs-animation-crossfade-walk-run), 2026-10-28
- [three.js attach object to bone, so a sword stays in the hand at its own size through the animation](https://paprika3d.com/docs/guides/threejs-attach-object-to-bone), 2026-10-28
- [three.js audio not playing until a click, and positional sound that does not follow the camera](https://paprika3d.com/docs/guides/threejs-audio-not-playing), 2026-10-28
- [Get the three.js bounding box and triangle count of a mesh or GLB model, and check it is watertight](https://paprika3d.com/docs/guides/threejs-bounding-box-triangle-count), 2026-10-28
- [three.js change camera position on scroll, and check where the camera is at every stop](https://paprika3d.com/docs/guides/threejs-camera-position-on-scroll), 2026-10-28
- [three.js camera shake and hit feedback that reads, and the shake that is a bug](https://paprika3d.com/docs/guides/threejs-camera-shake-hit-feedback), 2026-10-28
- [three.js change material color at run time, from a configurator's swatch menu, and check every option](https://paprika3d.com/docs/guides/threejs-change-material-color-configurator), 2026-10-28
- [three.js click on object with a Raycaster, and why the click hits the wrong one](https://paprika3d.com/docs/guides/threejs-click-on-object-raycaster), 2026-10-28
- [three.js collision detection without a physics engine, so the player stops at walls and slides along them](https://paprika3d.com/docs/guides/threejs-collision-detection-without-physics-engine), 2026-10-28
- [three.js colors washed out? Tag colour textures sRGB, and find the ones that are not](https://paprika3d.com/docs/guides/threejs-colors-washed-out), 2026-10-28
- [three.js CSG boolean subtract: cut a window or hole through a mesh, and check that it goes through](https://paprika3d.com/docs/guides/threejs-csg-boolean-subtract), 2026-10-28
- [three.js Draco, meshopt or KTX2? Tell which compression a GLB uses and set up its loader](https://paprika3d.com/docs/guides/threejs-draco-meshopt-ktx2), 2026-10-28
- [three.js emissive material not glowing? Check the emissive colour under the map, the tone mapping, and what it lights](https://paprika3d.com/docs/guides/threejs-emissive-material-not-glowing), 2026-10-28
- [Measure three.js draw calls and FPS, and find what costs the frame](https://paprika3d.com/docs/guides/threejs-fps-draw-calls), 2026-10-28
- [three.js glass transmission: why glass behind glass vanishes or goes black, and the extra render it costs](https://paprika3d.com/docs/guides/threejs-glass-transmission), 2026-10-28
- [three.js glTF animation not playing? Read the mixer, its clock and each action's flags](https://paprika3d.com/docs/guides/threejs-gltf-animation-not-playing), 2026-10-28
- [three.js glTF model failed to load? Find the file, the decoder or the path](https://paprika3d.com/docs/guides/threejs-gltf-model-failed-to-load), 2026-10-28
- [three.js glTF model too dark or black? Give its metal something to reflect](https://paprika3d.com/docs/guides/threejs-gltf-model-too-dark), 2026-10-28
- [three.js glTF textures black on iOS? Add up what the textures take on a phone](https://paprika3d.com/docs/guides/threejs-gltf-textures-black-ios), 2026-10-28
- [three.js HDRI environment and background, shown or hidden, at the strength you want](https://paprika3d.com/docs/guides/threejs-hdri-environment), 2026-10-28
- [three.js HTML labels over a model with CSS2DRenderer, and why they land wrong, drift or show through](https://paprika3d.com/docs/guides/threejs-html-labels-css2drenderer), 2026-10-28
- [three.js import map for three/addons: load OrbitControls and loaders from examples/jsm without a bundler](https://paprika3d.com/docs/guides/threejs-import-map-examples-jsm), 2026-10-28
- [three.js in WordPress or Webflow: a canvas that fits the post, a model path that loads, or an iframe](https://paprika3d.com/docs/guides/threejs-in-wordpress-webflow-iframe), 2026-10-28
- [three.js InstancedMesh color per instance, and why setColorAt changes nothing](https://paprika3d.com/docs/guides/threejs-instancedmesh-color-per-instance), 2026-10-28
- [three.js InstancedMesh disappears when the camera moves? Check its bounding sphere](https://paprika3d.com/docs/guides/threejs-instancedmesh-disappears-frustum-culling), 2026-10-28
- [three.js isometric camera with an OrthographicCamera that fits any screen, keeps the scene off the near plane and puts the mouse on the right tile](https://paprika3d.com/docs/guides/threejs-isometric-camera-orthographic), 2026-10-28
- [three.js line width not working, why linewidth stays 1 pixel, fat lines with Line2 and dashed lines that draw solid](https://paprika3d.com/docs/guides/threejs-line-width-not-working), 2026-10-28
- [three.js looks different from Blender? Measure the page against the render, then fix the light units, tone mapping and world](https://paprika3d.com/docs/guides/threejs-looks-different-from-blender), 2026-10-28
- [three.js match a reference image: rebuild its camera, place objects on its pixels, check the colours](https://paprika3d.com/docs/guides/threejs-match-reference-image-camera), 2026-10-28
- [three.js minimap and game HUD, a second camera in a corner and a health bar that updates](https://paprika3d.com/docs/guides/threejs-minimap-game-hud), 2026-10-28
- [three.js model loading slow? Time a first visit on 4G and show a progress bar](https://paprika3d.com/docs/guides/threejs-model-loading-slow), 2026-10-28
- [three.js morph targets lip sync, with visemes driven on every mesh of the face and checked frame by frame](https://paprika3d.com/docs/guides/threejs-morph-targets-lip-sync), 2026-10-28
- [three.js onBeforeCompile not working? Read the shader each material compiled to see which patch it got](https://paprika3d.com/docs/guides/threejs-onbeforecompile-not-working), 2026-10-28
- [three.js OrbitControls limit zoom and rotation, so the camera stays out of the model and above the ground](https://paprika3d.com/docs/guides/threejs-orbitcontrols-limit-zoom-rotation), 2026-10-28
- [three.js smooth camera transition with OrbitControls, without a snap at the end or a jump at the start](https://paprika3d.com/docs/guides/threejs-orbitcontrols-smooth-camera-transition), 2026-10-28
- [three.js OrbitControls and page scroll on mobile, so a swipe scrolls past the canvas and the wheel scrolls the page](https://paprika3d.com/docs/guides/threejs-orbitcontrols-touch-page-scroll), 2026-10-28
- [three.js outline selected object on hover with OutlinePass, around the whole model, and what the pass draws](https://paprika3d.com/docs/guides/threejs-outline-selected-object-on-hover), 2026-10-28
- [three.js page speed and Lighthouse: what a 3D hero costs the rest of the page](https://paprika3d.com/docs/guides/threejs-page-speed-lighthouse), 2026-10-28
- [three.js physics in a web worker, without jitter between the step and the render](https://paprika3d.com/docs/guides/threejs-physics-web-worker), 2026-10-28
- [three.js Points particles: size by distance, why they disappear, and how many to draw](https://paprika3d.com/docs/guides/threejs-points-particles-size-disappear), 2026-10-28
- [three.js responsive canvas that resizes without stretching and keeps the scene in frame on a phone](https://paprika3d.com/docs/guides/threejs-responsive-canvas-resize), 2026-10-28
- [Retarget a Mixamo animation to another rig in three.js, when renamed tracks twist the arms and flip the legs](https://paprika3d.com/docs/guides/threejs-retarget-mixamo-animation), 2026-10-28
- [three.js selective bloom on some objects, without the glow showing through walls](https://paprika3d.com/docs/guides/threejs-selective-bloom), 2026-10-28
- [three.js ShaderMaterial uniform not updating? Find which copy of the uniform the shader reads](https://paprika3d.com/docs/guides/threejs-shadermaterial-uniform-not-updating), 2026-10-28
- [three.js shadow map performance: count the shadow passes, then draw static shadows once](https://paprika3d.com/docs/guides/threejs-shadow-map-performance), 2026-10-28
- [three.js shadows not showing? Check four switches, then the shadow camera](https://paprika3d.com/docs/guides/threejs-shadows-not-showing), 2026-10-28
- [three.js SSAO artifacts: glass that darkens like a solid box, halos on the wall, and what the pass costs](https://paprika3d.com/docs/guides/threejs-ssao-artifacts), 2026-10-28
- [three.js third person camera that follows the player smoothly, stays out of walls, and orbits a moving player with OrbitControls](https://paprika3d.com/docs/guides/threejs-third-person-camera-follow), 2026-10-28
- [three.js third person character controller with Rapier, checked frame by frame on slopes, stairs and a long fall](https://paprika3d.com/docs/guides/threejs-third-person-character-controller), 2026-10-28
- [three.js tilemap and sprite sheet, without lines at the tile edges, frames at the right speed and tile collision](https://paprika3d.com/docs/guides/threejs-tilemap-sprite-sheet), 2026-10-28
- [three.js too many meshes? Merge, instance or batch, chosen by what each one keeps](https://paprika3d.com/docs/guides/threejs-too-many-meshes-merge-or-instance), 2026-10-28
- [three.js transparent background with alpha, and the post-processing pass that paints it black again](https://paprika3d.com/docs/guides/threejs-transparent-background), 2026-10-28
- [three.js transparent objects render in the wrong order? Name what each pixel drew, then set alphaTest, renderOrder or depthWrite](https://paprika3d.com/docs/guides/threejs-transparent-objects-wrong-order), 2026-10-28
- [three.js upgrade looks different? Measure what each change did, between the old version and the new](https://paprika3d.com/docs/guides/threejs-upgrade-looks-different), 2026-10-28
- [three.js USDZ exporter for AR Quick Look: why the file grows, how to shrink it, and reading it back](https://paprika3d.com/docs/guides/threejs-usdz-ar-quick-look), 2026-10-28
- [Use the same glTF model twice in three.js, with clone() or SkeletonUtils.clone, and find the copy that is missing](https://paprika3d.com/docs/guides/threejs-use-same-gltf-model-twice-clone), 2026-10-28
- [three.js virtual joystick and touch look for a phone game, beside keyboard and pointer lock on a computer](https://paprika3d.com/docs/guides/threejs-virtual-joystick-mobile-touch-controls), 2026-10-28
- [three.js terrain heightmap a character walks on, with its feet on the ground as drawn instead of sinking or floating](https://paprika3d.com/docs/guides/threejs-walk-on-terrain-heightmap), 2026-10-28
- [three.js WebGL context lost? Count what each level and each renderer leaves on the GPU](https://paprika3d.com/docs/guides/threejs-webgl-context-lost), 2026-10-28
- [three.js WebGPU or WebGL backend, which one drew the page and what changes with the renderer](https://paprika3d.com/docs/guides/threejs-webgpu-or-webgl-backend), 2026-10-28
- [three.js z-fighting flicker? Find the faces that share a plane, and check the fix from every side](https://paprika3d.com/docs/guides/threejs-z-fighting-flicker), 2026-10-28
- [Unit test a three.js app in a real browser, with checks that rerun after every edit](https://paprika3d.com/docs/guides/unit-test-threejs-app), 2026-10-28
- [Visual regression test a three.js scene at an exact frame, with a saved baseline and a pixel diff](https://paprika3d.com/docs/guides/visual-regression-test-threejs), 2026-10-28

## Week of 2026-10-19

### Guides added

- [MCP server that screenshots a WebGL canvas, for three.js pages](https://paprika3d.com/docs/guides/mcp-server-screenshot-webgl-canvas), 2026-10-19
- [A Playwright alternative for three.js and WebGL pages built by agents](https://paprika3d.com/docs/guides/playwright-alternative-threejs-webgl), 2026-10-19
- [React Three Fiber MCP server: see and test your R3F three.js scene](https://paprika3d.com/docs/guides/react-three-fiber-mcp-server), 2026-10-19

## Week of 2026-10-12

### paprika3d 0.1.4

Tagged [v0.1.4](https://github.com/paprika3d/paprika3d/tree/v0.1.4) on 2026-10-14.

### paprika3d 0.1.3

Tagged [v0.1.3](https://github.com/paprika3d/paprika3d/tree/v0.1.3) on 2026-10-14.

### paprika3d 0.1.2

Tagged [v0.1.2](https://github.com/paprika3d/paprika3d/tree/v0.1.2) on 2026-10-14.

### paprika3d 0.1.1

Tagged [v0.1.1](https://github.com/paprika3d/paprika3d/tree/v0.1.1) on 2026-10-14.

### paprika3d 0.1.0

Tagged [v0.1.0](https://github.com/paprika3d/paprika3d/tree/v0.1.0) on 2026-10-13.

Tools (11): `game_contract`, `game_open`, `game_observe`, `game_eval`, `game_act`, `game_clock`, `game_look`, `game_feel`, `game_check`, `game_perf`, `game_optimize`.

### Guides added

- [Test a three.js game with Claude Code](https://paprika3d.com/docs/guides/test-threejs-game-claude-code), 2026-10-16
- [Screenshot a three.js scene headless from a coding agent](https://paprika3d.com/docs/guides/screenshot-threejs-scene-headless), 2026-10-14
- [Find out why a three.js model is not visible](https://paprika3d.com/docs/guides/threejs-model-not-visible), 2026-10-14

Updated 2026-10-30.
