Skip to content

Assets and content

Nova resolves content through the deployment's asset proxy. Asset IDs use the same rbxassetid:// form as Roblox, and the Content datatype is supported.

Common asset properties

local decal = Instance.new("Decal")
decal.Texture = "rbxassetid://123456789"
decal.Face = Enum.NormalId.Front
decal.Parent = workspace:WaitForChild("Poster")

local mesh = Instance.new("SpecialMesh")
mesh.MeshType = Enum.MeshType.FileMesh
mesh.MeshId = "rbxassetid://987654321"
mesh.TextureId = "rbxassetid://123456780"
mesh.Parent = workspace:WaitForChild("Statue")

local sound = Instance.new("Sound")
sound.SoundId = "rbxassetid://555555555"
sound.Parent = workspace:WaitForChild("Speaker")

Properties that accept content use the Content type: Decal.Texture, Sound.SoundId, MeshPart.MeshId, MeshPart.TextureID, Animation.AnimationId, and similar. Assigning a plain string with the same rbxassetid:// form works.

Where assets come from

The official platform serves assets through its own proxy. The client does not talk to Roblox's asset CDN. That means:

  • Assets uploaded to the Nova deployment resolve.
  • Assets that exist only on Roblox may not resolve unless the deployment has imported or proxied them.
  • A place that depends on a specific Roblox marketplace asset may show a placeholder or fail to load that asset.

If you are porting a place, inventory the assets it uses and confirm they exist on the target deployment before debugging the place logic.

Preloading

local ContentProvider = game:GetService("ContentProvider")

local assets = {
    "rbxassetid://123456789",
    "rbxassetid://987654321",
}

ContentProvider:PreloadAsync(assets)

Preload images, meshes, and sounds that must be ready on the first frame. Large places should preload during a loading screen rather than during gameplay.

Meshes and CSG

  • MeshPart is supported, including modern mesh formats v1–v5.
  • SpecialMesh is supported.
  • CSG unions (UnionOperation, NegateOperation, PartOperation) load, render, collide, and can be selected in Studio.
  • Mesh v4/v5 skinning data is parsed but not rendered; use non-skinned meshes.

AssetService and InsertService

AssetService and InsertService exist, but their modern methods are limited. AssetService:LoadAsset is not part of Nova's surface. InsertService exposes legacy insert/approval methods; it does not provide the modern asset-loading API.

For runtime content, prefer:

  1. Store the asset IDs in a ModuleScript or configuration instance.
  2. Preload them with ContentProvider.
  3. Create the instances (Decal, Sound, MeshPart) yourself.

Common problems

Symptom Fix
Image is blank The asset is not present on the deployment, or the ID is wrong.
Mesh is invisible The mesh asset did not load; check MeshId and the Output window.
Sound is silent Check SoundId, IsLoaded, and whether the sound is 3D-parented.
Texture looks flat SurfaceAppearance is not supported; bake the texture into TextureID.
CSG union is missing Check that the union asset loaded; re-import the place if needed.

Next