Quick answer: Call DisplayServer.window_set_min_size(Vector2i(800, 600), DisplayServer.MAIN_WINDOW_ID) from _ready. Set fallback in Project Settings → Display → Window.

User resizes the window smaller than your UI tolerates. min_size set in _init didn’t stick because the window wasn’t fully realized yet.

The Fix

extends Node

func _ready():
    DisplayServer.window_set_min_size(
        Vector2i(800, 600),
        DisplayServer.MAIN_WINDOW_ID
    )

Belt-and-braces: also set in Project Settings so the early window honors the limit.

Verifying

Drag window resize. Cannot shrink below 800×600. Without the fix: shrinks freely.

“_ready timing. window_id explicit. Min holds.”

Related Issues

For canvas layer input, see canvas input. For onready order, see onready order.

_ready. Window id. Min sticks.