In a large bowl, combine the flour, yeast, sugar, and salt.
Add warm milk and melted butter to the dry ingredients and mix until a dough forms.
Knead the dough on a lightly floured surface for about 8 minutes until smooth and elastic.
Cover the dough and let it rise at room temperature for 1 hour or until doubled in size.
Roll the cold butter into a thin rectangle between parchment paper and chill.
Roll out the dough into a large rectangle, place the butter on top, and fold the dough over butter like an envelope.
Perform three turns by rolling out the dough and folding it into thirds, chilling 20 minutes between each turn.
Roll the dough out to desired thickness and cut into triangles for shaping croissants.
Roll the triangles from base to tip and place on a baking sheet.
Let the croissants proof until doubled in size, about 1-2 hours.
Preheat oven to 375°F and bake croissants for 18-20 minutes or until golden brown.
Cool on wire rack before serving.
Notes
For best results, use high-quality unsalted butter and allow enough time for proper proofing. These croissants freeze well and can be reheated in the oven.