Skip to content

Releases: rodeo-rbx/rodeo

v1.5.1

Choose a tag to compare

@github-actions github-actions released this 27 Oct 21:12

Fixes

  • A run's output now prints in the order the script wrote it. Lines from print, warn and 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

Choose a tag to compare

@github-actions github-actions released this 26 Oct 23:34

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=1 turns the error into a warning.
  • --context elevated is now --context mcp, with no alias. The new --context cmd runs 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 the rodeo.rbxm that older versions write. Delete rodeo.rbxm from 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.
  • --mode ends a running session of another kind before switching. An explicit --mode edit ends any running session; to leave it running, omit --mode (for example, --dom edit).
  • roblox.import, roblox.export and roblox.capture are now importInstances, exportInstances and captureViewport. The old names still work but are deprecated.
  • Captures go to .rodeo/.temp/captures by default instead of .rodeo-screenshots.

New

CLI

  • Parallel serves and versions. Every command resolves its port as --port, then RODEO_PORT, then 44872. Serves on different ports are independent, so projects can pin a rodeo version and a port in .mise.toml and run different versions on one machine. A Studio that rodeo launched connects only to its own serve. See Port.
  • --adapter lune|lute runs 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 an adapters option. See Runtime adapters.
  • --save with --studio-id or --dom-id saves that Studio after a successful run, like rodeo save.
  • --dom-id pins server and client DataModels as well as edit ones.
  • A --studio-id or --dom-id on the command line overrides a directive's --place and its --save, so a script whose directive launches a place can run in a Studio that is already open. A --place on the command line overrides a directive's --studio-id or --dom-id.
  • --show-widgets rodeo keeps the serve's own rodeo panel visible.
  • rodeo setup installs the rodeo agent skill into whichever of the project's .claude/skills and .agents/skills folders exist. It replaces a copy from an older rodeo.
  • Environment variables are documented in CLI usage, including the new RODEO_PORT and RODEO_LAUNCH_TIMEOUT.

@rodeo/roblox

  • captureViewport can capture as a Studio device-simulator preset (device) or at a custom viewportSize. It takes scalingMode, pixelDensity, orientation, deviceForm and resample options, and returns the image's size.
  • exportEditableImage and importEditableImage write PNG and read PNG or JPEG.
  • exportEditableMesh and importEditableMesh handle glTF 2.0 (.glb, .gltf) and Wavefront OBJ.
  • exportEditableScene and importEditableScene handle glTF scenes with materials, skins, morphs and animation. Native Roblox animation clips export with their rigs.

@rodeo/process and @rodeo/stream

  • New process options: env adds variables to the inherited environment, input (for run and system) is written to the child's stdin, and shell (for system) picks the shell. When a signal ends the process, the result includes signal.
  • stream.read(handle, size) on a process's stdout or stderr returns as soon as any output is available, up to size bytes.

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_TIMEOUT seconds (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 serve starts 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 --detach is adopted by the next serve on its port, so rodeo kill and rodeo state handle 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 mcp works with StudioMCP's current API.
  • NextGenerationReplication play tests: a --studio-id run 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 ./profiles stay.

Saving and files

  • A save blocked by a Studio dialog fails at once and names the dialog.
  • exportInstances keeps newer properties. It writes properties newer than rbx_xml's database into .rbxmx, and warns when an in-memory EditableMesh or EditableImage would be lost.
  • ScaleToPhysicalSize captures 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.ViewportSize are 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 --source longer 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

v1.5.0-rc.15 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 14 Oct 11:37

Breaking

  • @lune/* and @lute/* requires need --adapter lune or --adapter lute, on the command line or in the script's directive (-- @rodeo run --adapter lute). Without it, these aliases resolve through your .luaurc like 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; set RODEO_LUNE or RODEO_LUTE to use another build. See Runtime adapters for how values cross and the caveats.

New

  • --adapter lute resolves Lute's standard library (@std/*) and batteries (@batteries/*).
  • rodeo setup installs the rodeo skill into the project's .claude/skills and .agents/skills folders, 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 adapters option.

Fixes

  • A --studio-id run on a play test's server or client could stay queued until it timed out when the place uses NextGenerationReplication.
  • Captures under ScaleToPhysicalSize at 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 --source longer 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.ViewportSize are 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.14 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 13 Oct 06:54

v1.5.0-rc.13

v1.5.0-rc.13 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 10 Oct 09:52

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

v1.5.0-rc.12 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 10 Oct 05:20

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

v1.5.0-rc.9 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 23 Sep 06:57

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

v1.5.0-rc.11 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 23 Sep 08:30

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

v1.5.0-rc.10 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 23 Sep 08:08

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

v1.5.0-rc.8 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 22 Sep 20:17

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 animationRig and animationSampleRate import options. Native clips are SceneAnimation.clip: CurveAnimation; migrate consumers from .sequence to .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.