Prep the vegetables. Peel and cut the potatoes into 3/4-inch chunks. Dice the onion, celery, and carrots.
Mince the garlic.
Sauté the base. In a large pot or Dutch oven, melt the butter over medium heat. Add onion, celery, and carrots with a pinch of salt. Cook 5–7 minutes, stirring, until the onions are translucent and the carrots begin to soften.
Add garlic and seasonings. Stir in the garlic and thyme.
Cook 30 seconds, just until fragrant.
Make a light roux. Sprinkle flour over the vegetables and stir to coat. Cook 1–2 minutes to remove the raw flour taste. Don’t let it brown too much.
Add stock and potatoes. Slowly pour in the stock while stirring to avoid lumps.
Add the bay leaf and potatoes. Bring to a gentle boil, then reduce to a steady simmer.
Simmer until tender. Cook 15–20 minutes, stirring occasionally, until the potatoes are tender when pierced with a fork. Taste and season with salt and pepper.
Adjust the texture. For a creamier body, lightly mash a few potato pieces against the side of the pot, or use an immersion blender for 3–5 quick pulses.
Keep plenty of chunks for that classic texture.
Finish with dairy. Stir in the milk or half-and-half. Simmer 2–3 minutes more, just until heated through. Do not boil after adding dairy.
Optional add-ins. Stir in corn, diced ham, or crumbled cooked bacon.
Warm through for 1–2 minutes.
Serve. Remove the bay leaf. Ladle into bowls and top with chopped chives or parsley. Add a sprinkle of cheddar if you like.