Melt butter in a large pot or Dutch oven over medium heat. Add chopped onion and cook until softened, about 5-7 minutes.
Add minced garlic and cook for 1 minute more until fragrant.
Stir in the flour and cook for 1 minute, stirring constantly, to make a roux.
Gradually whisk in the vegetable broth until smooth. Add the cubed potatoes and bring to a boil.
Reduce heat, cover, and simmer for 15-20 minutes, or until potatoes are tender.
Add the broccoli florets to the pot. Cover and simmer for another 5-7 minutes, or until broccoli is tender-crisp.
Carefully transfer the soup to a blender or use an immersion blender to blend until smooth and creamy. Work in batches if using a standard blender and ensure the lid is vented.
Return the soup to the pot. Stir in the milk, salt, and pepper. Heat gently over low heat until warmed through; do not boil.
Serve hot, garnished with extra broccoli florets or a swirl of cream if desired.
Notes
This soup can be made vegan by using plant-based milk and omitting the butter or using a vegan alternative.