Cook the bacon: In a large pot or Dutch oven, cook the bacon over medium heat until crispy. Remove and set aside, leaving about 1 tablespoon of bacon grease in the pot.
Sauté the onion and garlic: Add diced onion and cook until soft and translucent, about 3–4 minutes. Stir in the garlic and cook for another 30 seconds.
Make the roux: Melt the butter in the pot, then sprinkle in the flour. Stir for about 1 minute until a smooth paste forms.
Add broth and potatoes: Gradually whisk in the chicken broth, then add the diced potatoes. Bring to a boil, reduce heat, and simmer until potatoes are tender, about 12–15 minutes.
Blend partially: Use an immersion blender to puree about half the soup for a creamy texture while keeping some potato chunks intact.
Add milk, cream, and cheese: Stir in the milk, heavy cream, and cheddar. Heat gently until the cheese melts and the soup thickens. Season with salt and pepper to taste.
Serve: Ladle into bowls, then top with crispy bacon, extra cheddar, and a sprinkle of green onions or chives.