Grease an 8x8-inch baking dish with butter or nonstick spray.
Zest and juice a lemon if using lemon zest and fresh lemon juice
If croissants are very fresh/soft, leave them out 20–30 minutes to dry slightly (day-old is ideal).
Tear croissants into large, golf ball–size chunks and scatter evenly in the pan.
Make the custard: whisk eggs, milk, heavy cream, granulated sugar, vanilla, salt, and lemon zest (if using) until smooth and mostly dissolved.
Pour custard evenly over croissants. Gently press down with a spoon or your hands. Rest 5–10 minutes so they soak.
Cover and refrigerate at least 30 minutes to 1 hour (overnight is great). Pull the pan out while the oven preheats.
Preheat oven to 350°F. Remove plastic wrap. If using foil, you can cover for the first part of baking to prevent over-browning.
Bake 20–30 minutes, until puffed, lightly golden, and set in the center (a slight jiggle is fine, but it shouldn’t look liquid). Tent with foil for the last 10–15 minutes if browning too fast.