In a large pot or Dutch oven, melt butter 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.
Whisk in the flour and cook for 1 minute, stirring constantly, to create a roux.
Gradually whisk in the chicken broth, ensuring no lumps form.
Add the diced potatoes to the pot. Bring to a boil, then reduce heat, cover, and simmer for 15-20 minutes, or until potatoes are fork-tender.
Carefully transfer about half of the soup to a blender or use an immersion blender directly in the pot to blend until smooth. Return the blended soup to the pot.
Stir in the milk and heavy cream. Heat through, but do not boil. Season with salt and black pepper to taste.
Serve hot, garnished with your favorite toppings such as shredded cheddar cheese, chives, or bacon bits.
Notes
For a thicker soup, you can use less broth or add more potatoes. If you prefer a thinner soup, add a little more broth or milk.