Every layer, still a layer.

Mosaic reads your .psd or .svg straight into Roblox Studio and rebuilds it as native Frames, TextLabels and UIGradients. Not a flattened image you have to re-export every time a pixel changes.

hero.psd: 29 layers → 1 Frame
capability-report.json
  • Frame / Rectanglenativemaps directly to a Roblox Frame
  • Button.psd:CTAapproximatedUICorner applies one radius to all four corners; the largest was used
  • Hero/Backdrop.svgrasterizedradial and angular gradients have no linear equivalent, so this fill was baked to an image
  • Card.psd:Shadowunrepresentableinner shadows cannot be faked with UIStroke and were dropped from the report

Reads your .psd directly7-day money-back guarantee

An image and a native object are not the same thing.

In Roblox, an image can't just live in your file. Every image has to be uploaded, pass moderation, and get referenced by a numeric ID before it exists. A native UI object needs none of that. It's just a Frame, with properties, and it's there the moment it's created.

Image asset

  1. Export the layer from Photoshop
  2. Upload it to Roblox
  3. Wait for moderation to clear it
  4. Get back a numeric AssetId
  5. Wire that ID into your UI

Want to nudge one pixel? Repeat all five steps.

Native object

  1. Open the .psd in Mosaic
  2. Frame appears in Explorer instantly
  3. Click it. Change a property.
  4. Ship it.

No queue, no ID, no re-export. It's just an object.


Three passes, from design file to a plan you can trust.

No exporting first. Mosaic opens the file itself and keeps what a flattened image would throw away.

01

Open the file, not an export of it

Point Mosaic at a .psd directly, or import an .svg from Photopea, Illustrator, or Figma. Photoshop's own SVG export flattens most content to raster. Reading the .psd itself is what keeps the layer tree, vector masks, layer effects, and type layers intact as structured data.

02

It reads intent, not just pixels

Internally, the file becomes a DesignDocument: what you meant, including things Roblox can't render on its own. That document runs through a series of compiler passes that decide how each piece should become a real Roblox object.

03

You get a plan, and a report

The output is a RobloxPlan: Frames with UICorner, UIStroke and UIGradient, TextLabels with mapped fonts, UIListLayouts recovered from evenly spaced rows. Every element ships with a reason.

nativeapproximatedrasterizedunrepresentable

Built around how people design for Roblox.

The freelancer

You design in Photoshop because your clients understand Photoshop.

Right now you rebuild every mockup pixel-by-pixel inside Studio afterward: twice the work, once billed. Mosaic turns the same .psd into the Frame hierarchy itself, so what you send the client is closer to what ships.

The dev studio

60 image layers in one file, all needing the right asset.

Bulk-import your PNGs once through Studio's own Asset Manager. Mosaic matches and binds them to the right layer by name automatically. Anything left unmatched is flagged clearly, not silently skipped.

Anyone tired of the queue

A rounded frame with a gradient doesn't need to be a picture.

Moderation queues exist for pictures. Mosaic keeps everything that can be represented as a native object (corners, strokes, gradients, layout) out of that queue entirely.

Teams with changing designs

A design update shouldn't mean a rebuild.

Fonts, gradients, and effects decided once in the design file are gone the moment someone hand-fixes a re-import in Studio. Mosaic re-imports the same file the same way every time.


What we tell you, not hide.

Every design tool has limits. Mosaic's rule is that you always know exactly which ones you hit, and why. Nothing is silently dropped.

Trust & security
Untrusted files

Design files are treated as untrusted input. Document size, nesting depth, element count, coordinate range, and text length are all bounded. A malformed or hostile file is refused with an explanation, not a frozen editor.

Local by default

Everything runs on your machine: no server, no upload of your design file, no account required to use the plugin.

Asset handling
Images

A plugin can't upload assets. That's a Roblox platform restriction, not a Mosaic one. Bulk-import your PNGs through Studio's Asset Manager first; Mosaic matches and binds them by name. Anything left over is flagged, not dropped.

Preview pixels

Until a real asset is bound, what you see drawn in the preview is session-only. Mosaic tells you this in-app, before it matters. It never breaks silently later.

Hidden layers

A layer hidden in your source file comes in hidden (Visible = false), never deleted. Conditional states you built on purpose stay intact.

Rendering limits
Fonts

A design font that isn't native to Roblox gets mapped to the nearest built-in family. Every substitution is named in the capability report, so you know exactly what changed.

Blur & inner shadow

Roblox's UI system has no native blur or inner shadow. Mosaic reports these as unrepresentable instead of quietly leaving them out of the plan.

Corner radius

UICorner takes one radius per element. A design with a different radius on each corner gets approximated to the closest single value.

Gradients

UIGradient is linear-only on Roblox. Radial gradients are rasterized to an image rather than faked with a linear one.


One plugin, one price.

7-day money-back guarantee, no questions askedRuns in Roblox Studio on Windows and Mac

Images still need a one-time upload through Roblox's own Asset Manager first, since plugins can't upload assets directly. Mosaic adopts them automatically by name from there. Mosaic is also listed on the Roblox Creator Store, which is a separate purchase from this one.


Send your first .psd through, and see what stays a layer.

Subscribe, your license key shows up the moment you verify your email. Covered by a 7-day money-back guarantee.

No server

Mosaic runs entirely inside Studio, on your machine.

No uploads

Your design file never leaves your computer.

One quick signup

A verified email gets you a license key, nothing else to fill out.