A smart SaveInstance tool that saves Roblox games the way they actually look — working terrain, unions, media, decompiled scripts, and asset recovery.
Fork of UniversalSynSaveInstance focused on visual accuracy and ease of use. No extra dependencies — load straight from GitHub raw.
Paste this into your executor:
--!nocheck
local Params = {
RepoURL = "https://raw.githubusercontent.com/achmdfzn/SaveInstanceFetch/main/",
Prepass = "prepass",
}
local Loader = loadstring(game:HttpGet(Params.RepoURL .. Params.Prepass .. ".luau", true), Params.Prepass)
assert(Loader, "[SaveInstanceFetch] failed to compile prepass loader (check your connection / RepoURL)")
local prepass = Loader()
local Options = {} -- saveinstance options — see docs/option.md
local PrepassOptions = {} -- optional — PersistentCache and RepoURL default sensibly
prepass(Options, PrepassOptions)The two
[Error]lines your editor shows (could be nilonloadstring,Unknown global 'game') are just the type-checker not knowing the executor environment — the script runs fine. The--!nocheckheader silences them, and theassertturns a failed download into a clear message instead of anilcall crash.
Wait until you see [saveinstance] Saved!, then check your executor's workspace folder:
*.rbxlx— the save file (open in Roblox Studio)saveinstance_assets/— downloaded assets, ready to drag-drop into Studio (whenDownloadAssets = true)saveinstance-capabilities.txt/saveinstance-verify.txt/saveinstance-assets.txt— diagnostics
Privacy note: when an executor lacks a native decompiler, scripts are decompiled via the third-party lua.expert API — script bytecode is sent off-device. Set
noscripts = trueto skip decompiling entirely.
| Goal | Add to Options |
|---|---|
| Full union mesh + terrain on StreamingEnabled maps | FullUnionTerrainSupport = true |
Recover private meshes to .obj (Blender / Studio) |
ExportObj = true, SetStreaming = true |
| Save the map only, skip decompile | noscripts = true |
| Skip instances by name / tag | IgnoreNamePatterns = {"^Camera$"} / IgnoreTags = {"EditorOnly"} |
| Save ONLY tagged instances | SaveOnlyTags = {"SaveMe"} |
| Reset a stale decompile cache | PrepassOptions.ClearCache = true |
| Pin to a specific version | PrepassOptions.PinVersion = "1.5.0" |
| Load from the dev channel | PrepassOptions.Channel = "dev" |
| Force a fresh download (skip update check) | PrepassOptions.CheckForUpdates = false |
Full option reference: docs/option.md.
The second argument to prepass(Options, PrepassOptions) controls the loader itself — downloading, caching, update checks, and version pinning. All are optional and default sensibly.
| Option | Default | Description |
|---|---|---|
RepoURL |
raw.githubusercontent.com/achmdfzn/SaveInstanceFetch/main/ |
Base URL the loader fetches saveinstance.luau, version.txt, and CHANGELOG.md from. |
ScriptName |
"saveinstance" |
Name of the main script to load from RepoURL. |
Channel |
nil |
Repo branch to load from (e.g. "main", "dev"). Built on top of RepoBase. |
Ref |
nil |
Explicit branch/tag to load from; overrides Channel. |
PinVersion |
nil |
Refuse to run unless the loaded version matches (e.g. "1.5.0"). Guards against unexpected main changes. |
PersistentCache |
true |
Reuse decompiled scripts from disk across runs (skips repeat API calls). |
CacheDir |
"saveinstance_decompile_cache" |
Workspace folder for the decompile cache. |
ClearCache |
false |
Wipe the decompile cache before this run. |
CacheMainScript |
true |
Keep the last good saveinstance.luau on disk and fall back to it if a download fails or returns a bad body. |
MainScriptCacheFile |
"saveinstance_source_cache.luau" |
Workspace file for the main-script fallback copy. |
CheckForUpdates |
true |
Fetch version.txt and log when a newer version is published. |
ShowChangelog |
true |
When an update is found, print the top of the remote CHANGELOG.md. |
VerifyHash |
true |
If version.txt publishes a hash, verify the downloaded source matches before running it. |
These control how the decompile prepass runs, separate from the loader/cache settings above.
| Option | Default | Description |
|---|---|---|
UseSaveInstancePrepass |
false |
Use saveinstance.luau's built-in DecompilePrepass instead of the loader's own hook-based prepass. Wires PrepassConcurrency, PrepassRateGap, and PrepassApiUrl from the loader's rate settings. |
MaxScripts |
nil |
Cap the number of scripts to decompile (maps to Options.PrepassMaxScripts). Only applied when UseSaveInstancePrepass = true. |
SkipPrepass |
false |
Skip the decompile prepass entirely — no scripts are decompiled, but saveinstance still runs (scripts stay empty). |
SkipSaveInstance |
false |
Run the prepass only and return without invoking saveinstance. Useful for warming the decompile cache. |
MaxInFlight |
8 |
How many decompile requests run at once. Kept low so mobile / low-RAM executors don't run out of memory. Raise it (e.g. 20) on a strong PC executor for more speed. |
RequestsPerMinute |
600 |
Rate cap for decompile requests. Lower it if the API rate-limits you; raise it for speed on a fast connection. |
NoProgressUI |
false |
Disable the on-screen Drawing progress bar. Set true on executors whose Drawing implementation is incomplete or crash-prone (e.g. some Xeno / Solara builds). The prepass detects a broken Drawing automatically, but this forces it off. |
The executor force-closes / crashes mid-save. Two common causes:
Crash during the decompile progress bar (especially Xeno / Solara). The on-screen progress bar uses the Drawing API, which is incomplete on some executors. The loader now probes Drawing and guards every frame, but if it still crashes, turn the bar off:
local PrepassOptions = { NoProgressUI = true }Crash from memory / too many requests (mobile, low-RAM). Lower concurrency and cap how many scripts are decompiled:
local PrepassOptions = {
NoProgressUI = true, -- also skip the Drawing UI to be safe
MaxInFlight = 3, -- fewer simultaneous requests = less memory
RequestsPerMinute = 300,
MaxScripts = 200, -- decompile at most 200 scripts
}To skip decompiling entirely (map/assets only — lightest possible run), set Options.noscripts = true or PrepassOptions.SkipPrepass = true.
| Executor | Terrain | Union Mesh | Scripts |
|---|---|---|---|
| Synapse / Wave | Yes | Yes | Yes |
| Volt | Yes | Yes | Yes (native decompiler) |
| Fluxus | Yes | Partial | Yes |
| Xeno / Solara | No | No | Yes |
No
gethiddenproperty(Xeno/Solara) means terrain & union mesh can't be saved. Checksaveinstance-capabilities.txtafter a run for your executor's support.
saveinstance.luau— main serializer (terrain, unions, decompile, export)prepass.luau— loader/wrapper: caches decompile to disk, hooksdecompile, verifies + loads saveinstancedocs/option.md— full option referenceversion.txt— current published version (checked by the loader for updates)CHANGELOG.md— what changed per releaseROADMAP.md— planned workmoonwave.toml— Moonwave documentation config
Builds on UniversalSynSaveInstance, USSI Prepass, lua.expert, and SaveInstance 420 Edition.