Sauté the aromatics: In a large pot or Dutch oven, melt the butter over medium heat. Add the chopped onion and a pinch of salt.
Cook 4–5 minutes until soft and translucent. Stir in the garlic and cook 30 seconds more until fragrant.
Build the roux: Sprinkle the flour over the onions. Stir constantly for 1–2 minutes to cook off the raw flour taste.
The mixture will look pasty—this is your thickening base.
Add the broth slowly: Pour in the broth a bit at a time, whisking as you go to prevent lumps. Once smooth, add the remaining broth and bring to a gentle simmer.
Stir in the hashbrowns: Add the frozen hashbrowns straight from the bag. Stir well to separate any clumps.
Season with salt, pepper, and optional thyme and smoked paprika.
Simmer until tender: Cover partially and simmer 15–20 minutes, stirring occasionally, until the potatoes are soft and the soup has thickened.
Add milk and cheese: Lower the heat to medium-low. Stir in the milk or half-and-half. Add the shredded cheddar a handful at a time, stirring until melted and smooth.
Finish with sour cream: Remove from heat.
Stir in the sour cream until fully blended. Taste and adjust seasoning with more salt and pepper as needed.
Serve with toppings: Ladle into bowls and finish with bacon, green onions, extra cheese, or a little hot sauce for kick.