Proof the yeast: In a large bowl, whisk the warm milk and sugar.
Sprinkle yeast over the top and let it sit for 5–10 minutes until foamy. If it doesn’t foam, your yeast may be inactive or the milk too hot or cold.
Mix the wet ingredients: Stir in the melted butter, egg, and vanilla (if using). Whisk until smooth.
Add dry ingredients: Add 3 cups of flour and the salt.
Stir with a wooden spoon until a shaggy dough forms. If it’s very sticky, add more flour 1–2 tablespoons at a time.
Knead the dough: Turn the dough onto a lightly floured surface. Knead for 8–10 minutes until smooth, elastic, and slightly tacky but not sticky.
You can also use a stand mixer with a dough hook on medium-low for about 6–8 minutes.
First rise: Form the dough into a ball and place it in a lightly oiled bowl. Cover with a clean towel or plastic wrap. Let rise in a warm, draft-free spot until doubled, about 60–90 minutes.
Shape the loaf: Punch down the dough gently to release air.
Roll it into an 8x12-inch rectangle. Tightly roll from the short end into a log. Pinch the seam and tuck the ends under.
Second rise: Place the log into a greased 9x5-inch loaf pan, seam side down.
Cover and let rise until the dough crowns about 1 inch above the rim, 45–60 minutes.
Preheat and bake: Preheat the oven to 350°F (175°C). Bake for 28–35 minutes until the top is deep golden and the loaf sounds hollow when tapped. An instant-read thermometer should read about 190–195°F in the center.
Finish and cool: Brush the hot loaf with melted butter for a soft, shiny crust.
Cool in the pan for 10 minutes, then transfer to a wire rack to cool completely before slicing.