Peel your potatoes and cut them into ¾-inch chunks — you'll end up with just over 6 cups. Place the pieces into a medium pot, cover with cold water, and bring to a full boil. Keep them boiling for exactly 5 to 6 minutes — just enough to soften slightly, not cook through. Drain well and set aside.
Grease a 9×13-inch baking pan or any 3 to 4-quart oven-safe dish. Scatter the warm drained potatoes, cubed ham, and 1 cup (about 100g) of shredded white cheddar into the dish. Gently fold them together and set the dish aside. Preheat your oven to 375°F (191°C).
Place a large skillet over medium heat and melt 3 tablespoons (43g) of butter. Toss in ¾ cup (100g) of chopped onion and 3 minced garlic cloves. Cook for about 3 minutes, stirring occasionally, until the onion softens. Stir in ¾ teaspoon salt, ½ teaspoon pepper, ½ teaspoon smoked paprika, ½ teaspoon ground mustard, 1 teaspoon dried parsley, and 3 tablespoons (24g) of flour. Stir until the flour is fully absorbed.
Reduce the heat to low. Slowly pour in 2 cups (480ml) of whole milk, stirring the entire time. Let the sauce simmer for 3 to 5 minutes until it thickens to a gravy-like consistency. Taste and adjust seasoning if needed, then remove from heat.
Pour the warm sauce over the potato and ham mixture in the baking dish. Gently fold everything together until well coated.
Cover the dish tightly with aluminum foil and bake at 375°F (191°C) for 30 minutes. Remove the foil, scatter the remaining ½ cup (about 50g) of shredded cheese over the top, and bake uncovered for another 5 to 10 minutes until the cheese is fully melted and the edges are bubbling. Remove from the oven and top with fresh parsley, green onion, chives, or a drizzle of hot sauce before serving.
Store any leftovers covered in the refrigerator for up to 1 week. To reheat the full casserole, cover with foil and warm in a 350°F (177°C) oven for 20 minutes.