Prep the potatoes. Peel and dice into 1/2-inch cubes for quick, even cooking. Rinse briefly to remove excess starch.
Cook the aromatics. In a large pot, melt the butter over medium heat.
Add onion and a pinch of salt. Cook 5–6 minutes until soft, then add garlic and cook 30 seconds more.
Make the roux. Sprinkle in the flour and stir until it coats the onions. Cook 1–2 minutes to remove the raw flour taste.
Add broth and potatoes. Slowly whisk in the broth to avoid lumps.
Add the diced potatoes and bring to a gentle boil, then reduce to a simmer.
Simmer until tender. Cook 12–15 minutes, stirring occasionally, until the potatoes are fork-tender. Don’t let it boil hard.
Add the dairy. Stir in milk or half-and-half. Warm through over low heat.
Taste and season with salt, pepper, and paprika if using.
Thicken to your liking. For a thicker soup, mash some potatoes in the pot with a potato masher or blend a cup of the soup and return it.
Add the cheese. Turn heat to low. Add cheddar a handful at a time, stirring until melted before adding more. Avoid boiling after cheese goes in.
Finish with sour cream. Stir in sour cream for extra tang and silkiness.
Adjust seasoning again.
Serve. Ladle into bowls and top with green onions, bacon, extra cheese, or a crack of black pepper.