Skip to content

Releases: ISpooferMotion/ISpooferMotion-V2

ISpooferMotion v2.5.13

Choose a tag to compare

@github-actions github-actions released this 07 Aug 09:45
07903f3

v2.5.13

A follow-up to v2.5.12: the plugin could still fail to find the desktop app when the default ports were busy, because the app silently fell back to a random OS port no scan range could ever reach.

Fixed

  • The desktop app bound a random port when 14285-14289 were occupied, so the plugin could never find it. The local plugin HTTP server tried the five default ports (14285-14289) and, if all were taken, asked the OS for any free port -- which lands in the 49152+ ephemeral range, far outside any Daemon Port Scan Range the Studio plugin can be set to. The app looked healthy but the plugin reported "No desktop app found" forever. This commonly happened when a previous instance didn't shut down cleanly and was still holding a port. The server now increments up through 14320 instead of going random, so it always lands on a port the plugin can reach; if every port in 14285-14320 is busy it fails loudly instead of going dark. The desktop app also detects which process is squatting on the default ports (via the Windows TCP table on Windows, lsof on macOS/Linux) and shows a banner naming it and telling the user exactly which port to widen the plugin's Daemon Port Scan Range to.

ISpooferMotion v2.5.12

Choose a tag to compare

@github-actions github-actions released this 05 Aug 23:04
b3b32a5

v2.5.12

Two real bugs that lost user assets (pasted image IDs discarded as animations, and recoverable multi-asset jobs aborted early), plus a full Settings panel redesign and a clearer "why won't the plugin connect" message.

Fixed

  • Pasted image IDs were mis-typed as animations and discarded. IDs pasted into the spoofer default to animation as their assumed type. When the actual asset behind such an ID was an image, the upload path rejected it because the payload type did not match the real AssetTypeId -- the asset was dropped with no attempt to correct the type. Now the upload path fetches the real AssetTypeId via the economy details endpoint on a type mismatch, reclassifies confirmed images as Image, and uploads them. Non-image mismatches still reject conservatively.
  • Recoverable multi-asset jobs were aborted by the fast-fail gate. The fast-fail guard aborted any job whose batch metadata AND batch download-URL calls both came back empty for the whole list. But batch endpoints return empty for many developer assets that are still reachable through discovery (digging into the creator's owned places for a place-context id). Real jobs of 10-30+ animations were dying in ~2s with a "broken cookie/place/key" message even though every asset was individually downloadable. Now the guard probes discovery reachability on a sample asset before aborting, and never aborts when a forced place id is present. Empty batches alone are no longer treated as a death sentence.
  • AnimationId (ContentId-typed) rejected the patch value. Modern Roblox types Animation.AnimationId as ContentId, which accepts a plain rbxassetid:// string but rejects a Content object. The patcher's coerce path only knew about Content-typed properties, so ContentId fields fell through and the assignment silently no-op'd (each followed by a successful AnimationContent patch as a side-effect, masking it). Now the coerce path has an explicit ContentId branch that assigns the asset URI as a string.
  • Open Cloud API key was lost on restart. The keyring crate was declared with no features (keyring = "3"), and keyring v3 ships no default backend -- so on Windows it silently fell back to an in-memory mock store. set_password/get_password worked within a session but nothing was ever written to the OS Credential Manager, so every secret vanished on restart. The cookie masked it because auto-detect re-reads it from Roblox Studio's own credential entry each launch; the API key had no such fallback. windows-native is now enabled on the keyring dependency so secrets persist to the Windows Credential Manager. The API key is also given its own keyring entry, written before the cookie-bearing blob so it survives even when that blob exceeds the Credential Manager's 2560-byte cap, and saveSecrets is gated on the initial load completing so a racing cookie-auto-detect save can't overwrite a not-yet-restored key with empty.

Added

  • Slider settings with hover tooltips. The in-Studio Settings panel is rebuilt: numeric inputs are sliders with a hover-tooltip that appears on hover-intent (short delay, warm window, grace period, fade) instead of always-visible descriptions. The Daemon Port range is a dual-thumb slider with two value boxes. Each slider shows a "Recommended: X" line. Units (e.g. MB) are rendered in the value box.
  • Clear button and Open Logs. The logs panel has a Clear button. "Export Logs" is renamed to "Open Logs" -- Roblox exposes no clipboard API to plugins, so copy-to-clipboard is not possible; Open Logs reveals the log file in the OS file manager instead.
  • Connect-failure reason in the plugin. When the plugin can't find the desktop app, the console now says why: either "No desktop app found on ports X-Y..." or "Found a server on ports X-Y but it isn't ISpooferMotion...". The reason logs once per disconnect episode, not every discovery cycle, so it doesn't spam.

Changed

  • Daemon Port range is read live each discovery cycle. Changing the port range in Settings now takes effect without a plugin reload; the module-level defaults are only used if the setting is missing.

ISpooferMotion v2.5.11

Choose a tag to compare

@github-actions github-actions released this 30 Jul 20:30
Fix Content-property patch silent no-op + v2.5.11

Patch side now handles every known asset property by name in addition
to reading current-value type, so a Content property whose readback
errors or whose Content.fromUri isn't available no longer falls
through to a raw digit assignment that Studio silently rejects.

- coercePropertyValue: property-name lookup maps for CONTENT_PROPERTIES
  and NUMBER_ASSET_PROPERTIES cover the readback-fails case. Content
  values tried via Content.fromUri -> Content.new -> raw URI string in
  that order, so older Studio builds still succeed.
- Also handles HumanoidDescription body parts + PackageLink fields
  explicitly (int64 not Content).
- version bump 2.5.10 -> 2.5.11, changelog written in the usual voice.

ISpooferMotion v2.5.9

Choose a tag to compare

@github-actions github-actions released this 30 Jul 09:07

v2.5.9

Makes community asset-cache contributions reliable.

Fixed

  • Community-cache writes no longer fail silently. The app now checks the API response and reports writes that the server rejects instead of discarding every result.
  • Temporary API failures are retried. Timeouts, rate limits, and server errors receive up to three attempts with bounded backoff; permanent client errors fail immediately.
  • Completed jobs now wait for cache contributions to finish. Writes run with limited concurrency instead of being launched as untracked background tasks that could be lost when the process exits.
  • Legacy cache migrations are only marked complete after every entry is accepted. An incomplete migration remains eligible for another attempt on the next startup.
  • Telemetry opt-out now takes effect immediately. Disabling telemetry no longer depends on the config server responding, stale config requests cannot re-enable contributions, and queued cache retries stop when contributions are disabled.
  • Telemetry heartbeat now respects the telemetry setting. Turning telemetry off stops the heartbeat and clears its timer instead of continuing to send it in the background.
  • Maintenance mode now clears after service recovery. A later healthy config response resets the banner instead of leaving the application stuck in maintenance mode.
  • Community-cache endpoint validation is stricter. Plain HTTP remains available for local development, but only exact loopback hosts qualify; lookalike hostnames such as localhost.example.com are rejected.

Internal

  • Added local HTTP-server tests covering the POST payload, transient retries, and permanent-error handling.
  • Duplicate asset discoveries within a job are collapsed to one contribution before upload, and endpoint refreshes no longer erase the useful in-memory session cache.
  • Updated stale frontend fixtures for timestamped spoofing logs and the account switcher so the full test suite covers the current UI again.
  • The community cache remains write-only. Asset resolution reads only the app's in-memory session cache and never fetches mappings from the remote API.

ISpooferMotion v2.5.8

Choose a tag to compare

@github-actions github-actions released this 29 Jul 14:10
Fix half-replaced animations + clearer error messages (v2.5.8)

- plugin: scan AnimationContent alongside AnimationId. Roblox's runtime
  reads whichever is set, so patching only AnimationId left
  AnimationContent pointing at the original and the character played
  the un-spoofed animation. The daemon patcher already handles Content
  values -- just needed the scanner to capture the property.
- messages: auto-triage when a whole job fails, replace "successfully
  resolved metadata for 0 assets" with a real warning, differentiate
  "blocked by Roblox" from "private", humanize "error decoding
  response body", fix the "a Animation" grammar, and make the
  "auto-replacement queued" line honest about needing the plugin
  loaded in Studio.
- plugin version bumped to 2.5.8 to match app.

ISpooferMotion v2.5.7

Choose a tag to compare

@github-actions github-actions released this 29 Jul 12:18
Fix replacement race, wrong-type uploads, plugin categorization, and …

ISpooferMotion v2.5.6

Choose a tag to compare

@github-actions github-actions released this 28 Jul 20:12
Restore V1 spoofer download speed (v2.5.6)

Fixes a regression where jobs with a few private assets stalled for 5+
minutes behind the shared rate limiter. Root cause was four V2-only
divergences from V1's download algorithm, all reverted here:

- Only run discovery when no place_id was supplied (was unconditional)
- Removed retry-on-403 loop (403 is terminal for a URL/cookie combo)
- Restored fully parallel graph queries (was throttled to 3 concurrent)
- Retry budget back to 3 attempts / 30s timeout (was 10 / 45s)

Also adds a progress heartbeat every 10 candidate URLs and a bail-out
after 5 consecutive permanent failures so a stuck asset can't hold the
shared rate limiter for a whole job.

ISpooferMotion v2.5.5

Choose a tag to compare

@github-actions github-actions released this 26 Jul 20:23
chore(release): bump version to 2.5.5, add changelog

ISpooferMotion v2.5.4

Choose a tag to compare

@github-actions github-actions released this 24 Jul 18:58
chore(release): bump version to 2.5.4, add changelog

Performance fix for the per-asset social-graph discovery cache. See
changelogs/v2.5.4.md.

ISpooferMotion v2.5.3

Choose a tag to compare

@github-actions github-actions released this 24 Jul 08:20
chore(release): bump version to 2.5.3, add changelog

See changelogs/v2.5.3.md for the full list of fixes and features.