Repository navigation
Releases: rodeo-rbx/rodeo
Release list
v1.5.1
Fixes
- A run's output now prints in the order the script wrote it. Lines from
print,warnand errors could come out shuffled, for example a warning before the print above it, or an error's trace lines out of order. The order also changed from run to run.
Full Changelog: v1.5.0...v1.5.1
v1.5.0
The first stable release since 1.3.0. 1.4.0 never had a stable release, so its release candidates are included here. Docs: rodeo-rbx.github.io/rodeo.
Upgrading from 1.3
- The CLI, the serve and the Studio plugin must be the same build. A mismatch is now an error, so stop any 1.3 serve before running 1.5 on its port.
RODEO_SKIP_VERSION_CHECK=1turns the error into a warning. --context elevatedis now--context mcp, with no alias. The new--context cmdruns at command-bar identity without Studio's MCP server. It works in the edit DataModel of a Studio that rodeo launched.@lune/*requires need--adapter lune, either on the command line or in the script's directive (-- @rodeo run --adapter lune). They now run on the real Lune 0.10.5 instead of rodeo's partial reimplementation. The first run that uses it downloads Lune to~/.rodeo/runtimes.- Each serve writes its own plugin file,
rodeo-<build>-<port>.rbxm. 1.5 never touches therodeo.rbxmthat older versions write. Deleterodeo.rbxmfrom Studio's plugins folder once you no longer use 1.3 or older: when a Studio stays open after its serve exits, that old plugin retries the port fast enough to slow Studio down. --modeends a running session of another kind before switching. An explicit--mode editends any running session; to leave it running, omit--mode(for example,--dom edit).roblox.import,roblox.exportandroblox.captureare nowimportInstances,exportInstancesandcaptureViewport. The old names still work but are deprecated.- Captures go to
.rodeo/.temp/capturesby default instead of.rodeo-screenshots.
New
CLI
- Parallel serves and versions. Every command resolves its port as
--port, thenRODEO_PORT, then 44872. Serves on different ports are independent, so projects can pin a rodeo version and a port in.mise.tomland run different versions on one machine. A Studio that rodeo launched connects only to its own serve. See Port. --adapter lune|luteruns code written for Lune or Lute. Its standard-library requires reach the real runtime, which rodeo runs alongside the script.lute(Lute 1.0.1-nightly.20260730) covers@lute/*,@std/*and@batteries/*. The TypeScript and Lune clients take anadaptersoption. See Runtime adapters.--savewith--studio-idor--dom-idsaves that Studio after a successful run, likerodeo save.--dom-idpins server and client DataModels as well as edit ones.- A
--studio-idor--dom-idon the command line overrides a directive's--placeand its--save, so a script whose directive launches a place can run in a Studio that is already open. A--placeon the command line overrides a directive's--studio-idor--dom-id. --show-widgets rodeokeeps the serve's own rodeo panel visible.rodeo setupinstalls the rodeo agent skill into whichever of the project's.claude/skillsand.agents/skillsfolders exist. It replaces a copy from an older rodeo.- Environment variables are documented in CLI usage, including the new
RODEO_PORTandRODEO_LAUNCH_TIMEOUT.
@rodeo/roblox
captureViewportcan capture as a Studio device-simulator preset (device) or at a customviewportSize. It takesscalingMode,pixelDensity,orientation,deviceFormandresampleoptions, and returns the image's size.exportEditableImageandimportEditableImagewrite PNG and read PNG or JPEG.exportEditableMeshandimportEditableMeshhandle glTF 2.0 (.glb,.gltf) and Wavefront OBJ.exportEditableSceneandimportEditableScenehandle glTF scenes with materials, skins, morphs and animation. Native Roblox animation clips export with their rigs.
@rodeo/process and @rodeo/stream
- New
processoptions:envadds variables to the inherited environment,input(forrunandsystem) is written to the child's stdin, andshell(forsystem) picks the shell. When a signal ends the process, the result includessignal. stream.read(handle, size)on a process's stdout or stderr returns as soon as any output is available, up tosizebytes.
Fixes
Launching
- A launched Studio that never connects fails the launch. The usual cause is an expired sign-in. The launch now fails after
RODEO_LAUNCH_TIMEOUTseconds (default 120) and rodeo closes that Studio, instead of waiting forever. - Fewer Studio sign-outs. Closing a Studio right after launch, or launching several at once, no longer signs you out of Studio.
- macOS launches: the "reopen windows?" prompt that appears after a Studio crash no longer blocks every later launch. Background Studios no longer take keyboard focus on multi-display setups.
- A run sent right after
rodeo servestarts waits for the serve's studio backend instead of failing. - Team Create places no longer hang a
rodeo run --place. - A Studio left open by
--detachis adopted by the next serve on its port, sorodeo killandrodeo statehandle it.
Runs
- Mode switches no longer retry forever. A transition that can't finish fails.
- No more silent hangs. Every run's error is reported once, and a run that fails to start, or whose return value can't be written, ends with an error.
- Quieter output. A run that starts its own serve prints only that serve's errors. The full log is in
RODEO_LOG_DIR. --context mcpworks with StudioMCP's current API.- NextGenerationReplication play tests: a
--studio-idrun on the server or a client no longer stays queued until it times out. - Profiler dumps no longer pile up. While a serve runs, Studio's auto-capture profiler dumps are deleted five minutes after they're written. The copies in
./profilesstay.
Saving and files
- A save blocked by a Studio dialog fails at once and names the dialog.
exportInstanceskeeps newer properties. It writes properties newer than rbx_xml's database into.rbxmx, and warns when an in-memoryEditableMeshorEditableImagewould be lost.ScaleToPhysicalSizecaptures at a pixel density above the display's now work.
Windows
- Background Studios stay behind your windows without taking keyboard focus. They're restored once up, so captures and
Camera.ViewportSizeare correct. - Stopping a serve closes the Studios it launched and restores its fflag and dock-layout patches.
- Killing a Studio ends its play-test processes too. A Studio that exits to update itself no longer leaves the update half-done.
- A
--sourcelonger than Windows' command-line limit works. rodeo run --detach's output closes when the run ends, not when the detached Studio exits.
Security
- The studio backend refuses WebSocket connections from web browsers. Before, a web page open while a serve ran could connect to its port and receive runs.
Full Changelog: v1.3.0...v1.5.0
v1.5.0-rc.15
Breaking
@lune/*and@lute/*requires need--adapter luneor--adapter lute, on the command line or in the script's directive (-- @rodeo run --adapter lute). Without it, these aliases resolve through your.luaurclike any other, and a require that nothing resolves fails only if it runs.- With an adapter, those requires reach the real runtime (Lune 0.10.5, Lute 1.0.1-nightly.20260730), which rodeo runs beside the script. The first run that uses one downloads it to
~/.rodeo/runtimes; setRODEO_LUNEorRODEO_LUTEto use another build. See Runtime adapters for how values cross and the caveats.
New
--adapter luteresolves Lute's standard library (@std/*) and batteries (@batteries/*).rodeo setupinstalls the rodeo skill into the project's.claude/skillsand.agents/skillsfolders, whichever exist, and replaces a copy from an older rodeo.- A require of an alias that nothing resolves no longer fails bundling; it errors only if it runs.
- The TypeScript and Lune clients take an
adaptersoption.
Fixes
- A
--studio-idrun on a play test's server or client could stay queued until it timed out when the place uses NextGenerationReplication. - Captures under
ScaleToPhysicalSizeat a pixel density above the display's failed with "no new frame appeared". - An empty-place launch sometimes opened Studio's "Lighting Technology Migration" dialog, and saves then timed out.
Windows
- A save that a Studio dialog blocks fails at once, naming the dialog.
- A
--sourcelonger than Windows' command-line limit works. - Background Studios stay behind your windows without taking keyboard focus, and are restored once up, so captures and
Camera.ViewportSizeare right. - Stopping a serve closes the Studios it launched and restores its fflag and dock-layout patches.
- Killing a Studio ends its play-test processes too, and a Studio that exits to update itself no longer leaves the update half-done.
rodeo run --detach's output closes when the run ends, not when the detached Studio exits.- A backend no longer registers seconds late when stale plugin files are around.
- No warning about Studio's stale registry pointer on every command.
Full Changelog: v1.5.0-rc.14...v1.5.0-rc.15
v1.5.0-rc.14
v1.5.0-rc.13
What's Changed
- Adopt a --detach Studio left running by an earlier serve on the port by @revvy02 in #54
- Delete old auto-capture dumps and wait for a run's tail dump by @revvy02 in #50
Full Changelog: v1.5.0-rc.12...v1.5.0-rc.13
v1.5.0-rc.12
What's Changed
- Document process.run's result fields; give the Lune adapter process.exec by @revvy02 in #40
- Name the missing API when a Lune adapter module lacks it by @revvy02 in #41
- Give the Lune adapter process.create by @revvy02 in #58
- Match Lute's process.run and system options and results by @revvy02 in #59
- Take turns launching Studios while a sign-in renewal is due by @revvy02 in #48
- Let a CLI --studio-id/--dom-id override a directive's --place by @revvy02 in #47
- Pass run params through a BindableFunction; end runs that fail to start by @revvy02 in #44
- Report every run's error once, through the done message by @revvy02 in #43
- Let --dom-id pin server and client DOMs by @revvy02 in #46
- End the running session before a mode switch; fail stuck transitions by @revvy02 in #55
- Save pinned Studios, default serve --studio's port, warn on lost content by @revvy02 in #53
- Stop saying solo play-test captures come back black by @revvy02 in #42
- Write properties newer than rbx_xml's database into .rbxmx exports by @revvy02 in #49
- Refuse runs from servers older than the plugin version check by @revvy02 in #51
New Contributors
Full Changelog: v1.5.0-rc.11...v1.5.0-rc.12
v1.5.0-rc.9
Rodeo now exports native Roblox primitive geometry and original-resolution images through the shared editable-scene API.
- Export block, ball, cylinder, wedge, corner wedge and supported legacy primitive meshes, respecting native sizing and legacy Scale/Offset.
- Preserve scalar emission and transmission; export Neon and Glass/ForceField approximations with explicit warnings.
- Supply original host images through
exportEditableScene(..., { imageSources = { [previewImage] = "original.png" } }), avoiding the EditableImage preview-size limit. - Export sized, unposed skins without requiring live Bone instances, and fix missing-Bone binding handling.
Validated with 44 Rust tests, 25 Studio scene tests and consumer integration/visual checks. Curved primitives use tessellation; legacy mesh textures/tint and scaled live Bone poses remain unsupported. No asset-upload API changes.
v1.5.0-rc.11
Includes native rig animation export from rc.10 and fixes fractional-key timestamps. Source keys and generated samples now deduplicate at glTF float32 precision, so clips with times such as 0.1 and 0.3 export successfully. Regression coverage includes both KeyframeSequence and CurveAnimation clips.
Native Roblox animation clips can now be exported with their rigs through roblox.exportEditableScene:
roblox.exportEditableScene("walk.glb", {rig}, {
animationClips = {{rig = rig, clip = clip}},
animationSampleRate = 60,
})- Evaluates KeyframeSequence and CurveAnimation clips through an isolated Roblox Animator, preserving the caller's pose and running tracks.
- Exports Motor6D, kinematic AnimationConstraint and Bone hierarchies, with welds for rigid attachments. Pivot offsets and live skin bindings are preserved.
- Bakes full rig poses at 60 Hz by default, plus source key times. Interpolation between samples approximates native easing and reports a warning. Portable glTF channels still round-trip without resampling.
- Handles single-key static poses, preserves loop/priority/named-keyframe/marker metadata in glTF extras, and rejects incomplete skins or unsupported rig structures before replacing the destination. Markers remain portable metadata rather than native event tracks.
Validation: 44 Rust runtime tests and 28 live Studio scene tests, including Khronos glTF validation. Publishing/uploading remains separate.
v1.5.0-rc.10
Known issue: native clips with fractional key times can fail export when authored keys and generated samples round to the same float32 time. This is fixed in rc.11; use that release.
Native Roblox animation clips can now be exported with their rigs through roblox.exportEditableScene:
roblox.exportEditableScene("walk.glb", {rig}, {
animationClips = {{rig = rig, clip = clip}},
animationSampleRate = 60,
})- Evaluates KeyframeSequence and CurveAnimation clips through an isolated Roblox Animator, preserving the caller's pose and running tracks.
- Exports Motor6D, kinematic AnimationConstraint and Bone hierarchies, with welds for rigid attachments. Pivot offsets and live skin bindings are preserved.
- Bakes full rig poses at 60 Hz by default, plus source key times. Interpolation between samples approximates native easing and reports a warning. Portable glTF channels still round-trip without resampling.
- Handles single-key static poses, preserves loop/priority/named-keyframe/marker metadata in glTF extras, and rejects incomplete skins or unsupported rig structures before replacing the destination. Markers remain portable metadata rather than native event tracks.
Validation: 44 Rust runtime tests and 28 live Studio scene tests, including Khronos glTF validation. Publishing/uploading remains separate.
v1.5.0-rc.8
Editable scene imports now always return one scene Model, with native playback built inside it when supported. Static and animated files share the same result shape.
- Removed the
animationRigandanimationSampleRateimport options. Native clips areSceneAnimation.clip: CurveAnimation; migrate consumers from.sequenceto.clip. - Preserve compatible source interpolation and cubic translation tangents. Approximate quaternion cubic/composed motion adaptively, report Studio clock quantization, and preserve the original glTF channels for export.
- Keep morph base geometry unposed and shared across instances; retain deltas and per-instance weights without hidden pose subtraction.
- Round-trip Attachments using explicit metadata, retain native material identities and scalar PBR factors, and avoid SurfaceAppearance/dummy images on untextured imports.
- Preserve source frame metadata on cloned instances, separate geometry size from child transforms, aggregate warnings, and add strict import/export validation.
- Discard incomplete streamed exports without overwriting the destination or retaining writer handles. Add a release version-staging command.
Validation: 23 Studio scene tests, 43 Rust runtime tests, release-stamp regression, seven pinned Khronos assets passing the independent glTF validator and Blender imports. Consumer validation covers 60 three-to-roblox scenes, independent rig playback and five rbx-rip integration tests. Visual comparisons are under visual-reviews/mesh/scene-review.
Scale and morph-weight channels remain portable data; Animator does not render them. Native playback limitations, an explicit morph preview helper, reusable asset materialization, and typed protobuf descriptors are tracked in #22, #23, #24 and #25.