Credential profiles for every group
Save separate Open Cloud keys for users and groups. Switch from the header before you upload — keys stay masked and browser-only.
Roblox asset workspace
Find. Organize. Ship. Every rbxassetid in one place — bulk upload, model packages you can overwrite in place, InsertService scripts for instant Studio loading, and credential profiles for every group you ship to.
Local-first · Multi-profile Open Cloud · Upload → Workspace scripts
UI_IconHome
SFX_ClickSoft
Char_HeroMesh
Credential profiles
Manage multiple Open Cloud keys without re-pasting. Switch between your personal account and studio groups from the header — uploads always target the active profile.
Try it below
Upload target: Assets publish to Group 2847291 using Main studio group
Real settings panel — your keys stay in the browser until upload.
Show, don't tell
Search, filter, create folders, rename and reparent collections, select assets, and drag them onto folders — identical behavior to the Asset Library panel.
Try it
Full workspace preview — create folders, rename, reparent, delete, select assets, and drag them onto collections. Changes reset on refresh.
6 assets · 11 folders · search collapsed
| Name | Type | Asset ID | Collection | Tags | ||
|---|---|---|---|---|---|---|
| UI_IconInventory | Image | Assets/UI/Icons | uiiconsinventory | |||
| SFX_ClickSoft | Audio | Assets/Audio/UI | sfxuiclick | |||
| Char_HeroMesh | Mesh | Assets/Characters/Hero | characterheromesh | |||
| Env_TreeCluster | Model | Assets/World/Nature | environmentnaturefoliage | |||
| UI_IconSettings | Image | Assets/UI/Icons | uiiconssettings | |||
| Music_LobbyLoop | Audio | Assets/Audio/Music | musiclobbyloop |
Showing 6 of 6 in All assets
Model packages
Roblox models upload as packages — not raw mesh blobs. Studio Vault creates them through Open Cloud like any other asset, then lets you push a new FBX to the same asset ID when art changes.
Scripts, instances, and datastore references keep working because the rbxassetid never changes — only the package content does.
Supported flows
1 · Upload creates a package
FBX, RBXM, GLTF, and GLB upload as Roblox Model assets — full packages, not loose instances.
Env_TreeCluster
tree_cluster.rbxm
rbxassetid://6612049381
You get a new rbxassetid pointing at the published package — ready to reference in Studio or scripts.
2 · Update overwrites the package
Same panel as the workspace library. Target an existing model asset ID and send a new FBX via Open Cloud PATCH — the ID stays put.
Iterating on a mesh? Push revisions without re-wiring rbxassetid:// across your place files.
Upload → Workspace
Select packages or audio in your library — or fresh uploads in Results — and generate production-ready Luau. Models load via InsertService; sounds become Sound instances with configured SoundId values.
1-- Studio Vault · Studio asset loader
2-- Generated 2026-06-30 · 2 packages · 1 sound
3-- Paste into ServerScriptService (Play Solo) or run from Studio Command Bar.
4
5local InsertService = game:GetService("InsertService")
6
7local PARENT = game:GetService("Workspace")
8local SOUND_VOLUME = 1
9local SOUND_LOOPED = false
10local SOUND_PLAY_ON_INSERT = false
11local SOUND_ROLLOFF_MAX = 10000
12
13local ASSETS = {
14 { id = 6612049381, name = "Env_TreeCluster", kind = "package" }, -- Model: Env_TreeCluster
15 { id = 9123847102, name = "SFX_ClickSoft", kind = "audio" }, -- Audio: SFX_ClickSoft
16 { id = 7729103845, name = "Char_HeroMesh", kind = "package" }, -- Mesh: Char_HeroMesh
17}
18
19local function insertSound(entry)
20 local sound = Instance.new("Sound")
21 sound.Name = entry.name
22 sound.SoundId = "rbxassetid://" .. entry.id
23 sound.Volume = SOUND_VOLUME
24 sound.Looped = SOUND_LOOPED
25 sound.RollOffMaxDistance = SOUND_ROLLOFF_MAX
26 sound.Parent = PARENT
27 if SOUND_PLAY_ON_INSERT then
28 sound:Play()
29 end
30 return sound
31end
32
33local function resolvePackage(loaded: Instance): Instance
34 if loaded:IsA("Model") or loaded:IsA("MeshPart") or loaded:IsA("Folder") then
35 return loaded
36 end
37 local model = loaded:FindFirstChildWhichIsA("Model", true)
38 return model or loaded
39end
40
41local function insertPackage(entry, index: number)
42 local ok, loaded = pcall(function()
43 return InsertService:LoadAsset(entry.id)
44 end)
45 if not ok or not loaded then
46 warn("[StudioVault] Failed to load", entry.name, entry.id)
47 return nil
48 end
49 local instance = resolvePackage(loaded)
50 instance.Name = entry.name
51 local offset = Vector3.new((index - 1) % 3 * 20, 0, math.floor((index - 1) / 3) * 20)
52local primary = instance:IsA("Model") and instance.PrimaryPart
53if primary then
54 local _, size = instance:GetBoundingBox()
55 instance:PivotTo(CFrame.new(offset + Vector3.new(0, size.Y / 2, 0)))
56else
57 instance:PivotTo(CFrame.new(offset))
58end
59 instance.Parent = PARENT
60 return instance
61end
62
63local loadedCount = 0
64
65for index, entry in ipairs(ASSETS) do
66 if entry.kind == "audio" then
67 insertSound(entry)
68 loadedCount += 1
69 else
70 local instance = insertPackage(entry, index)
71 if instance then
72 loadedCount += 1
73 end
74 end
75end
76
77print("[StudioVault] Inserted", loadedCount, "asset(s) into", PARENT:GetFullName())Live preview · edit options in the workspace library
Why developers switch
Creator Dashboard was built for publishing. Studio Vault was built for the daily work of managing hundreds of assets across experiences. Try credential profile switching above.
4 types
Images, audio, models, meshes — one queue
0 servers
Multi-profile credentials never leave your browser
∞ local
IndexedDB library with no upload limits
Results panel
Same copy-all format as the workspace.
| Name | Asset ID | Status | |
|---|---|---|---|
| UI_IconInventory | rbxassetid://18472930102 | Done | |
| SFX_ClickSoft | rbxassetid://9123847102 | Done | |
| Char_HeroMesh | rbxassetid://7729103845 | Done |
Display name formatter
Pick a filename — see the Roblox name update live.
Queue statuses
Every state you see during a real batch upload.
rbxassetid://9123847102
Workflow
Including model packages you can overwrite without new IDs. See the package update workflow.
Save separate Open Cloud keys for users and groups. Switch from the header before you upload — keys stay masked and browser-only.
Filter by type, folder, tag, or asset ID. No more digging through Creator Dashboard tabs.
Collections work like folders mixed with playlists. Group by project, style, or release.
Queue images, audio, meshes, and model packages (FBX, RBXM, GLTF). Watch each file move from queued to done.
Tags, thumbnails, filenames, and rbxassetid URIs — stored locally, searchable forever.
Per-item progress, retry logic, and clear error messages. You always know what happened.
Select uploaded packages and audio — export Luau with InsertService layout for models and configured Sound instances with rbxassetid SoundIds.
Models upload as Roblox packages. Push a new FBX to an existing asset ID via Open Cloud PATCH — no broken references in your game.
Your Open Cloud key. Your machine. Your asset library.
FAQ
Roblox Open Cloud uploads, local asset libraries, credential profiles, and developer workflows — answered.
Studio Vault is a local-first Roblox asset workspace for browsing, organizing, and bulk-uploading images, audio, models, and meshes through Open Cloud. It stores your asset library in the browser and keeps credentials on your machine.
Creator Dashboard is built for publishing individual assets. Studio Vault is built for day-to-day development: batch uploads, searchable local libraries, folders, tags, and fast access to rbxassetid values across projects.
Create an Open Cloud API key at create.roblox.com with the asset permission scope. Open Studio Vault, paste your API key, creator ID, and creator type in Credentials, add supported files to the upload queue, then click Start batch. Uploaded rbxassetid values appear in your local library automatically.
Your Open Cloud API keys are saved in browser localStorage only. You can save multiple credential profiles for different users or groups, switch between them from the workspace header, and keys are sent to Roblox during uploads through a local proxy — never stored on a server.
Yes. Studio Vault supports multiple credential profiles. Add a profile per user or group in Settings, paste the matching Open Cloud key and creator ID, then switch the active profile from the header before uploading. Existing single-key settings migrate automatically.
Studio Vault supports Image, Audio, Model, and Mesh assets via Roblox Open Cloud, including PNG, JPG, JPEG, WEBP, MP3, OGG, WAV, FLAC, FBX, GLTF, GLB, RBXM, RBXMX, and MESH files.
FBX, RBXM, GLTF, and GLB files upload as Roblox Model assets through Open Cloud. After upload, you can replace a package's content by targeting its asset ID in the library and sending a new FBX file — the rbxassetid stays the same so scripts and instances keep working.
Studio Vault can generate Luau scripts that load your uploaded model packages into Roblox Studio Workspace via InsertService. Pick assets from your library, choose ServerScript, ModuleScript, or Command Bar output, and paste the script into Studio for instant loading during development.
Yes. Studio Vault is free, open source, and runs in your browser. There are no subscriptions, usage fees, or paid tiers. You only need a Roblox account with Open Cloud API access.
No telemetry, analytics, or cloud storage. Your asset library lives in browser IndexedDB. API keys stay in localStorage. The only outbound network traffic during uploads goes from your machine to Roblox's Open Cloud API through a local Next.js proxy required because Roblox blocks direct browser CORS requests.
Yes. Export your local library as JSON or CSV to back up metadata, move between machines, or share rbxassetid records with teammates. Import portable exports to merge libraries without re-uploading assets to Roblox.
You can use the hosted site or run it locally with npm install and npm run dev. Self-hosting keeps everything on your machine — useful for teams that want full control over the upload proxy and deployment.