In a large pot or Dutch oven, melt the butter over medium heat. Add the chopped onion and cook until softened, about 5-7 minutes.
Add the minced garlic and cook for another minute until fragrant.
Whisk in the flour and cook for 1-2 minutes, stirring constantly, to create a roux.
Gradually whisk in the vegetable broth, ensuring no lumps form. Bring to a simmer.
Add the diced potatoes to the pot. Bring back to a simmer, then reduce heat to low, cover, and cook for 15-20 minutes, or until potatoes are tender.
Using an immersion blender, carefully blend the soup until smooth and creamy. Alternatively, transfer the soup in batches to a regular blender and blend until smooth.
Stir in the milk and heavy cream. Heat the soup gently over low heat, stirring occasionally, until heated through. Do not boil.
Season with salt and black pepper to taste. Serve hot.
Notes
Garnish with chives, shredded cheddar cheese, or a swirl of sour cream for extra flavor.