Godot 3 to Godot 4
Port your project with the real Godot 4 API.
Find old syntax and names before they become runtime surprises. Godotwright rewrites the mechanical part of a port with migrate, reviews GDScript against its bundled Godot 4.7 reference and gives replacement hints for the rest.
Review a project you are porting
Back up or commit your Godot 3 project first, then follow the official Godot migration guide. Use Node.js 22.12 or newer to review the project without installing Godot or configuring a model/API key:
npx -y godotwright migrate /path/to/your-project # shows the rewrites and what is left
npx -y godotwright migrate /path/to/your-project --write # applies them
npx -y godotwright review /path/to/your-projectmigrate turns export, onready and tool into annotations, renames classes, functions, properties and constants that no longer exist in Godot 4, rewrites yield() to await and connect(), emit_signal() and funcref() to signals and callables, and moves members such as OS.get_ticks_msec(). It leaves strings, comments and node paths alone and lists what still needs a hand (setget, move_and_slide(velocity), RPC keywords). Scenes and project settings are not converted; Godot's own --convert-3to4 does those.
Pass the directory containing project.godot. Follow each finding's file and line number, update the code, and run the review again. Look up a replacement with npx -y godotwright api CharacterBody2D. A review is static analysis; it does not replace opening the converted project in the matching Godot version and testing gameplay. Native validation with godotwright check requires Godot 4.7.
GDScript syntax changes
These are the Godot 3 forms recognized by the review's api/godot3-syntax rule. Adapt annotations and RPC options to your project's behavior.
export varis@export varin Godot 4.onready varis@onready varin Godot 4.toolis@toolin Godot 4.setgetis gone in Godot 4; usevar x: T: set = _set_x, get = _get_xor set()/get blocks.yield()isawaitin Godot 4, e.g.await get_tree().create_timer(1.0).timeout.PackedScene.instance()isinstantiate()in Godot 4.- network keywords are
@rpc(...)annotations in Godot 4. funcref()is a Callable in Godot 4:object.methodorCallable(object, "method").connect("signal", target, "method")issignal_name.connect(target.method)in Godot 4..method()super calls aresuper.method()in Godot 4.
APIs that moved
Use the new owner or property. Choose the getter or setter appropriate to the original access. Timestamp APIs differ in units: Time.get_unix_time_from_system() returns seconds, so preserve any required milliseconds conversion when replacing OS.get_system_time_msecs().
| Godot 3 | Godot 4 |
|---|---|
Engine.editor_hint | Engine.is_editor_hint() |
OS.get_date | Time.get_date_dict_from_system() |
OS.get_datetime | Time.get_datetime_dict_from_system() |
OS.get_screen_size | DisplayServer.screen_get_size() |
OS.get_system_time_msecs | Time.get_unix_time_from_system() |
OS.get_ticks_msec | Time.get_ticks_msec() |
OS.get_ticks_usec | Time.get_ticks_usec() |
OS.get_time | Time.get_time_dict_from_system() |
OS.get_unix_time | Time.get_unix_time_from_system() |
OS.max_window_size | get_window().max_size |
OS.min_window_size | get_window().min_size |
OS.set_window_title | DisplayServer.window_set_title() or get_window().title |
OS.vsync_enabled | DisplayServer.window_set_vsync_mode() |
OS.window_borderless | get_window().borderless |
OS.window_fullscreen | DisplayServer.window_set_mode() |
OS.window_position | get_window().position |
OS.window_size | DisplayServer.window_get_size() / window_set_size() |
Renamed classes
The bundled API maps these Godot 3 class names to their Godot 4 names. Renaming a class is only a starting point: method signatures and behavior can also change. For example, CharacterBody2D.move_and_slide() takes no velocity argument; set velocity first.
| Godot 3 | Godot 4 |
|---|---|
ARVRAnchor | XRAnchor3D |
ARVRCamera | XRCamera3D |
ARVRController | XRController3D |
ARVRInterface | XRInterface |
ARVRInterfaceGDNative | Node3D |
ARVROrigin | XROrigin3D |
ARVRPositionalTracker | XRPositionalTracker |
ARVRServer | XRServer |
AStar | AStar3D |
AnimatedSprite | AnimatedSprite2D |
Area | Area3D |
AudioStreamOGGVorbis | AudioStreamOggVorbis |
AudioStreamRandomPitch | AudioStreamRandomizer |
AudioStreamSample | AudioStreamWAV |
BakedLightmap | LightmapGI |
BakedLightmapData | LightmapGIData |
BitmapFont | FontFile |
BoneAttachment | BoneAttachment3D |
BoxShape | BoxShape3D |
CPUParticles | CPUParticles3D |
CSGBox | CSGBox3D |
CSGCombiner | CSGCombiner3D |
CSGCylinder | CSGCylinder3D |
CSGMesh | CSGMesh3D |
CSGPolygon | CSGPolygon3D |
CSGPrimitive | CSGPrimitive3D |
CSGShape | CSGShape3D |
CSGSphere | CSGSphere3D |
CSGTorus | CSGTorus3D |
Camera | Camera3D |
CapsuleShape | CapsuleShape3D |
ClippedCamera | Camera3D |
CollisionObject | CollisionObject3D |
CollisionPolygon | CollisionPolygon3D |
CollisionShape | CollisionShape3D |
ConcavePolygonShape | ConcavePolygonShape3D |
ConeTwistJoint | ConeTwistJoint3D |
ConvexPolygonShape | ConvexPolygonShape3D |
CubeMap | Cubemap |
CubeMesh | BoxMesh |
CylinderShape | CylinderShape3D |
DirectionalLight | DirectionalLight3D |
Directory | DirAccess |
DynamicFont | FontFile |
DynamicFontData | FontFile |
EditorNavigationMeshGenerator | NavigationMeshGenerator |
EditorSceneImporter | EditorSceneFormatImporter |
EditorSceneImporterFBX | EditorSceneFormatImporterFBX2GLTF |
EditorSceneImporterGLTF | EditorSceneFormatImporterGLTF |
EditorSpatialGizmo | EditorNode3DGizmo |
EditorSpatialGizmoPlugin | EditorNode3DGizmoPlugin |
GIProbe | VoxelGI |
GIProbeData | VoxelGIData |
Generic6DOFJoint | Generic6DOFJoint3D |
GeometryInstance | GeometryInstance3D |
GradientTexture | GradientTexture2D |
HeightMapShape | HeightMapShape3D |
HingeJoint | HingeJoint3D |
ImmediateGeometry | ImmediateMesh |
ImmediateGeometry3D | ImmediateMesh |
InterpolatedCamera | Camera3D |
InterpolatedCamera3D | Camera3D |
JSONParseResult | JSON |
Joint | Joint3D |
KinematicBody | CharacterBody3D |
KinematicBody2D | CharacterBody2D |
KinematicCollision | KinematicCollision3D |
LargeTexture | ImageTexture |
Light | Light3D |
Light2D | PointLight2D |
LineShape2D | WorldBoundaryShape2D |
Listener | AudioListener3D |
Listener2D | AudioListener2D |
MeshInstance | MeshInstance3D |
MultiMeshInstance | MultiMeshInstance3D |
MultiplayerPeerGDNative | MultiplayerPeerExtension |
Navigation2DServer | NavigationServer2D |
NavigationAgent | NavigationAgent3D |
NavigationMeshInstance | NavigationRegion3D |
NavigationObstacle | NavigationObstacle3D |
NavigationPolygonInstance | NavigationRegion2D |
NavigationRegion | NavigationRegion3D |
NavigationServer | NavigationServer3D |
NetworkedMultiplayerCustom | MultiplayerPeerExtension |
NetworkedMultiplayerENet | ENetMultiplayerPeer |
NetworkedMultiplayerPeer | MultiplayerPeer |
Occluder | OccluderInstance3D |
OmniLight | OmniLight3D |
OpenSimplexNoise | FastNoiseLite |
PHashTranslation | OptimizedTranslation |
PacketPeerGDNative | PacketPeerExtension |
PanoramaSky | Sky |
Particles2D | GPUParticles2D |
ParticlesMaterial | ParticleProcessMaterial |
Path | Path3D |
PathFollow | PathFollow3D |
PhysicalBone | PhysicalBone3D |
Physics2DDirectBodyState | PhysicsDirectBodyState2D |
Physics2DDirectSpaceState | PhysicsDirectSpaceState2D |
Physics2DServer | PhysicsServer2D |
Physics2DServerSW | GodotPhysicsServer2D |
Physics2DShapeQueryParameters | PhysicsShapeQueryParameters2D |
Physics2DTestMotionResult | PhysicsTestMotionResult2D |
PhysicsBody | PhysicsBody3D |
PhysicsDirectBodyState | PhysicsDirectBodyState3D |
PhysicsDirectSpaceState | PhysicsDirectSpaceState3D |
PhysicsServer | PhysicsServer3D |
PhysicsShapeQueryParameters | PhysicsShapeQueryParameters3D |
PhysicsTestMotionResult | PhysicsTestMotionResult3D |
PinJoint | PinJoint3D |
PlaneShape | WorldBoundaryShape3D |
PopupDialog | Popup |
Position2D | Marker2D |
Position3D | Marker3D |
ProceduralSky | Sky |
RayCast | RayCast3D |
RayShape | SeparationRayShape3D |
RayShape2D | SeparationRayShape2D |
Reference | RefCounted |
RemoteTransform | RemoteTransform3D |
ResourceInteractiveLoader | ResourceLoader |
RigidBody | RigidBody3D |
SceneTreeTween | Tween |
Shape | Shape3D |
ShortCut | Shortcut |
Skeleton | Skeleton3D |
SkeletonIK | SkeletonIK3D |
SliderJoint | SliderJoint3D |
SoftBody | SoftBody3D |
Spatial | Node3D |
SpatialGizmo | Node3DGizmo |
SpatialMaterial | StandardMaterial3D |
SphereShape | SphereShape3D |
SpotLight | SpotLight3D |
SpringArm | SpringArm3D |
Sprite | Sprite2D |
StaticBody | StaticBody3D |
StreamCubemap | CompressedCubemap |
StreamCubemapArray | CompressedCubemapArray |
StreamPeerGDNative | StreamPeerExtension |
StreamPeerSSL | StreamPeerTLS |
StreamTexture | CompressedTexture2D |
StreamTexture2D | CompressedTexture2D |
StreamTexture2DArray | CompressedTexture2DArray |
StreamTextureLayered | CompressedTextureLayered |
TCP_Server | TCPServer |
Tabs | TabBar |
TextFile | Node3D |
Texture | Texture2D |
TextureArray | Texture2DArray |
TextureProgress | TextureProgressBar |
ToolButton | Button |
VehicleBody | VehicleBody3D |
VehicleWheel | VehicleWheel3D |
VideoPlayer | VideoStreamPlayer |
Viewport | SubViewport |
ViewportContainer | SubViewportContainer |
VisibilityEnabler | VisibleOnScreenEnabler3D |
VisibilityEnabler2D | VisibleOnScreenEnabler2D |
VisibilityNotifier | VisibleOnScreenNotifier3D |
VisibilityNotifier2D | VisibleOnScreenNotifier2D |
VisibilityNotifier3D | VisibleOnScreenNotifier3D |
VisualInstance | VisualInstance3D |
VisualServer | RenderingServer |
VisualShaderNodeBooleanUniform | VisualShaderNodeBooleanParameter |
VisualShaderNodeColorUniform | VisualShaderNodeColorParameter |
VisualShaderNodeCubeMap | VisualShaderNodeCubemap |
VisualShaderNodeCubemapUniform | VisualShaderNodeCubemapParameter |
VisualShaderNodeScalarClamp | VisualShaderNodeClamp |
VisualShaderNodeScalarConstant | VisualShaderNodeFloatConstant |
VisualShaderNodeScalarFunc | VisualShaderNodeFloatFunc |
VisualShaderNodeScalarInterp | VisualShaderNodeMix |
VisualShaderNodeScalarOp | VisualShaderNodeFloatOp |
VisualShaderNodeScalarSmoothStep | VisualShaderNodeSmoothStep |
VisualShaderNodeScalarSwitch | VisualShaderNodeSwitch |
VisualShaderNodeScalarTransformMult | VisualShaderNodeTransformOp |
VisualShaderNodeScalarUniform | VisualShaderNodeFloatParameter |
VisualShaderNodeTextureUniform | VisualShaderNodeTexture2DParameter |
VisualShaderNodeTextureUniformTriplanar | VisualShaderNodeTextureParameterTriplanar |
VisualShaderNodeTransformMult | VisualShaderNode |
VisualShaderNodeTransformUniform | VisualShaderNodeTransformParameter |
VisualShaderNodeUniform | VisualShaderNodeParameter |
VisualShaderNodeUniformRef | VisualShaderNodeParameterRef |
VisualShaderNodeVec3Uniform | VisualShaderNodeVec3Parameter |
VisualShaderNodeVectorClamp | VisualShaderNodeClamp |
VisualShaderNodeVectorInterp | VisualShaderNodeMix |
VisualShaderNodeVectorScalarMix | VisualShaderNodeMix |
VisualShaderNodeVectorScalarSmoothStep | VisualShaderNodeSmoothStep |
VisualShaderNodeVectorScalarStep | VisualShaderNodeStep |
VisualShaderNodeVectorSmoothStep | VisualShaderNodeSmoothStep |
WebRTCDataChannelGDNative | WebRTCDataChannelExtension |
WebRTCMultiplayer | WebRTCMultiplayerPeer |
WebRTCPeerConnectionGDNative | WebRTCPeerConnectionExtension |
WindowDialog | Window |
XRAnchor | XRAnchor3D |
XRController | XRController3D |
XROrigin | XROrigin3D |
YSort | Node2D |
Keep reviewing as you migrate
A clean static report is not a guarantee that the port is complete. Check scenes, resources, physics and rendering in Godot, and play-test each migrated feature. See all Godotwright tools and the official migration guide for the engine changes.