Port a place¶
This is the full pass, from a .rbxl to a published Nova place. It is written
for a typical modern Roblox place (2019–2023) that uses scripts, GUIs, remotes,
and data stores.
1. Make a working copy¶
- Duplicate the place file; never edit the original.
- Note the place's Roblox era and its main systems.
- If the place uses Team Create or cloud-only assets, export a local copy first.
2. Load it and capture the damage¶
Open the copy in NovaStudio and watch the Output window. Collect every line like:
SerializerBinary: skipping unknown class 'UIListLayout'
SerializerBinary: skipping unknown class 'UICorner'
Those are the classes that will not exist at runtime. Group them:
- UI layout/modifier — expect the most work.
- Physics constraints/movers — check the specific class.
- Avatar/rendering — check for
Bone,SurfaceAppearance,WrapLayer. - Platform services —
TextChatService,VRService,VideoFrame, etc.
Open the corresponding reference page for each class. The page tells you whether the class is missing, partial, or present with missing members.
3. Get the place to run¶
Start with the server:
- Confirm
ServerScriptServicescripts parse. Luau syntax is accepted; type annotations do not need to be removed. - Replace missing services/classes that run at startup. A single startup error can stop the rest of the server script.
- Check
requirepaths andReplicatedStoragecontents. - Run Play Solo and fix the first error, then repeat.
Do not fix UI yet. Get the DataModel and gameplay loop running first.
4. Fix data and networking¶
- Confirm the server is authoritative for currency, health, inventory, and position.
- Replace
UnreliableRemoteEventwithRemoteEvent. - Add rate limits and type checks to remotes.
- Test with a local server and two clients.
- Move persistence to
DataStoreServiceif the place used a profile library built on modern DataStore options. See Data stores.
5. Replace UI layout¶
This is usually the biggest visual task.
- Find every layout/modifier instance in the Explorer.
- For each list/grid, add a manual layout module (tutorial).
- Replace rounded corners/gradients/strokes with 9-slice images or baked assets.
- Replace aspect-ratio constraints with a size-recalculation function.
- Run the UI at several resolutions; manual layouts need explicit resize handling.
If a screen is too complex to port, rebuild that screen rather than trying to emulate the layout engine.
6. Fix physics and spatial queries¶
- Replace
Workspace:RaycastwithFindPartOnRayWithIgnoreList. - Replace
GetPartBoundsInBox/GetPartsInPartwithFindPartsInRegion3WithIgnoreList. - Check constraints. Hinge, BallSocket, Spring, Rope, Align*, LinearVelocity, AngularVelocity, VectorForce, WeldConstraint, Weld, Motor6D are present. Prismatic, Cylindrical, Universal, and Plane are not.
- Re-test vehicles and ragdolls; PGS behavior may differ slightly.
7. Fix presentation¶
- Audio: check
SoundId, rolloff, and effects. ReplacePitchwithPlaybackSpeed. - Animations: use
Animator:LoadAnimation; remove skeletal/skinned avatar assumptions. - Assets: confirm every image, mesh, and sound resolves through the deployment.
- Lighting: replace
Atmosphere/CloudswithLighting/Skysettings.
8. Test the full matrix¶
- Play Solo.
- Local server, one client.
- Local server, two clients.
- Web client, if supported.
- Join, respawn, leave, rejoin.
- Buy a product / claim a reward, if the place has economy.
- Save data, rejoin, confirm it loaded.
9. Publish¶
- Save a local copy.
- Publish through Studio to the deployment.
- Join the published place from a fresh client.
- Check the server log and the client Output window.
- Keep the pre-port copy and a list of the changes you made.
Checklist¶
- Original place backed up.
- Unknown classes inventoried.
- Server scripts run.
- Remotes validated and rate-limited.
- Data persistence tested across a rejoin.
- UI layouts replaced.
- Physics/spatial queries replaced.
- Audio/animation/assets checked.
- Two-client test passed.
- Published place re-tested.