Combine the lukewarm water and yeast in a small bowl and let sit for 5 minutes until foamy—this bloom activates the yeast and ensures reliable rising. While the yeast blooms, add the cake flour, sugar, salt, and cold milk to your stand mixer bowl. Once the yeast is ready, add it to the mixer along with the vanilla extract. Mix on medium speed for about 3-4 minutes until a shaggy dough forms, then increase speed slightly and knead for another 5 minutes until the dough becomes smooth and slightly elastic. The dough should feel soft but not sticky at this stage.
Transfer the dough from Step 1 to a lightly oiled bowl, cover with plastic wrap, and let it rise at room temperature for 1 hour until puffy. Then transfer the bowl to the refrigerator for 30 minutes to firm up the dough—this makes it easier to work with the butter lamination. The cold dough temperature is crucial because it will prevent the butter from melting into the dough during folding, which would ruin the flaky layers.
Remove the chilled dough from Step 2 and place it on a floured work surface. Roll it into a 9 by 15 inch rectangle, then let it rest for 5 minutes. While resting, place the cold butter between two sheets of parchment paper and flatten it into a 5 by 7 inch rectangle using a rolling pin. Position the butter rectangle in the center of the dough, fold the dough over it like a letter (folding one long side to the middle, then the other side over top), seal the edges by pressing gently with your rolling pin, and roll the enclosed dough into a 10 by 14 inch rectangle. Fold this rectangle into thirds (letter-fold again), then wrap tightly and refrigerate for 10 minutes.
Remove the dough from the refrigerator and repeat the rolling, folding, and chilling process 3 more times: roll into a rectangle, fold into thirds, wrap, and chill for 10 minutes between each turn. I find that keeping the dough cold between turns prevents the butter from softening and ensures you build distinct, separated layers. After the final turn is complete, wrap the dough tightly in plastic wrap and refrigerate for at least 24 hours (or up to 48 hours)—this resting period allows the gluten to fully relax and the layers to set properly.
Remove the dough from the refrigerator and divide it in half. Working with one half at a time, roll it into a 12 by 15 inch rectangle on a floured surface. Cut the rectangle into triangles (you can cut horizontally into 3-inch strips, then cut diagonally to form triangles). Starting at the wide base of each triangle, roll tightly toward the pointed tip and place seam-side down on parchment-lined baking sheets, curving the ends slightly into a crescent shape. Whisk together the egg and 1 tablespoon water to make an egg wash, then brush it generously over each croissant for a golden, glossy finish. Cover the baking sheets loosely with plastic wrap and let the croissants proof at room temperature for 2 hours until noticeably puffy and light. Repeat the shaping and proofing with the second half of dough, either proofing both batches simultaneously or staggering them so they're ready to bake at different times.
Preheat your oven to 400°F. Once fully proofed, place the croissants in the preheated oven and bake for 10-15 minutes, until the exterior is deep golden brown and crispy. The croissants should sound hollow when tapped on the bottom. Let them cool on the baking sheet for a few minutes before serving—they'll continue to crisp up slightly as they cool.