Changelog

Made at build time from the repository: each stable tag of paprika3d/paprika3d with its 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 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 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 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 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 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 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 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 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>.

Skills

Hooks (Claude Code)

In the project

Packaging

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

Week of 2026-10-19

Guides added

Week of 2026-10-12

paprika3d 0.1.4

Tagged v0.1.4 on 2026-10-14.

paprika3d 0.1.3

Tagged v0.1.3 on 2026-10-14.

paprika3d 0.1.2

Tagged v0.1.2 on 2026-10-14.

paprika3d 0.1.1

Tagged v0.1.1 on 2026-10-14.

paprika3d 0.1.0

Tagged 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