Sauté the aromatics: In a large pot over medium heat, melt the butter. Add the onion with a pinch of salt and cook 4–5 minutes until soft and translucent.
Stir in the garlic and cook 30 seconds until fragrant.
Add vegetables and simmer: Add the cauliflower florets and potato. Pour in the broth and bring to a boil. Reduce to a gentle simmer, cover, and cook 15–18 minutes, until the cauliflower and potato are very tender.
Blend until smooth: Turn off the heat.
Use an immersion blender to puree the soup until velvety. Alternatively, carefully transfer in batches to a blender and blend until smooth, then return to the pot.
Stir in dairy and seasonings: Over low heat, stir in the milk or half-and-half, Dijon, and smoked paprika. Warm gently—do not let it boil.
Add the cheese: Sprinkle in the cheddar and Parmesan a handful at a time, stirring constantly until melted and smooth.
If the soup is too thick, add a splash more milk or broth.
Season to taste: Add salt and pepper until the flavors pop. For extra sharpness, add a touch more Dijon or a squeeze of lemon.
Serve: Ladle into bowls and top with chopped chives, extra cheese, croutons, or crispy bacon if you like.