Start by warming milk until it’s just warm to the touch – about like bath water. Too hot and it’ll kill the yeast, too cool and it won’t activate properly.
In a large bowl, whisk together 3 cups of the flour (we’ll save some for later), sugar, yeast, and salt. Make a well in the center – this helps everything mix evenly.
Pour in warm milk, melted butter (make sure it’s not hot!), and eggs. Mix with a wooden spoon until you get a shaggy dough. It’ll look a bit messy at this point – that’s perfect.
Now start adding the remaining flour, about 1/4 cup at a time, until the dough pulls away from the sides of the bowl. You might not need all the flour, and that’s okay. You want the dough to feel tacky but not sticky – if it sticks to your finger and doesn’t pull away cleanly, add a bit more flour.
Turn the dough onto a lightly floured surface and knead for about 8-10 minutes. You’ll know it’s ready when you can stretch a small piece thin enough to see light through it without it breaking – bakers call this the “windowpane test.”
Place the dough in a lightly greased bowl, cover with a damp towel, and let rise in a warm spot until doubled in size, about 1 hour. I like to turn my oven on for just a minute, then turn it off and use that slightly warm space.