Activate the yeast: In a bowl, combine warm milk and sugar. Sprinkle yeast over the top and let it stand 5–10 minutes, until foamy.
If it doesn’t foam, the yeast may be inactive or the milk too hot or cold.
Mix the dough: Stir in eggs, melted butter, vanilla, and salt. Add 3 cups of flour and mix until a shaggy dough forms. Gradually add the remaining flour until the dough is soft, slightly tacky, and pulling away from the bowl.
Knead: Knead by hand on a lightly floured surface for 6–8 minutes (or 5–6 minutes in a stand mixer) until smooth and elastic.
The dough should be supple and slightly springy, not dry.
First rise: Place dough in a lightly greased bowl, cover, and let it rise in a warm spot until doubled, about 1–1.5 hours. A slow, steady rise builds better flavor and texture.
Shape the donuts: Turn out the dough and roll to about 1/2 inch thick. Cut 3-inch rounds, then punch out 1-inch centers.
Gather scraps, rest them 5 minutes, then reroll and cut again. Transfer pieces to a parchment-lined sheet.
Second rise: Cover loosely and proof 30–45 minutes, until puffy and slightly jiggly when nudged. Do not over-proof; they should feel airy but still hold shape.
Heat the oil: In a heavy pot, heat 2–3 inches of oil to 350°F (175°C).
Keep a steady temperature; too hot burns the outside, too cool makes greasy donuts.
Fry the donuts: Carefully lower 2–3 donuts into the oil. Fry 60–90 seconds per side until golden. Holes take less time.
Transfer to a rack to drain. Let oil return to 350°F between batches.
Make the glaze: Whisk powdered sugar, 3 tbsp milk, vanilla, and a pinch of salt. The glaze should be smooth and pourable, like heavy cream.
Add the last tablespoon of milk only if needed.
Glaze while warm: Dip each warm donut top-side down into the glaze, then flip and coat completely if you like a full sheen. Let excess drip off, then set on the rack to dry 10–15 minutes.
Serve: Enjoy while slightly warm for the best texture. The glaze will set with a soft, glossy finish.