Prep the pan and oven. Preheat oven to 350°F (175°C). Grease a 9x13-inch baking dish or a deep 2-quart casserole with butter.
Cube the bread. Cut bread into 1-inch cubes.
If it’s very fresh, spread cubes on a sheet pan and toast in the oven for 8–10 minutes to dry slightly.
Warm the dairy. In a saucepan, heat milk and cream over medium-low until warm and steamy, not boiling. This helps the sugar dissolve and the custard blend smoothly.
Make the custard base. In a large bowl, whisk eggs, sugar, vanilla, cinnamon, nutmeg, and salt until smooth. Slowly whisk the warm milk mixture into the eggs, a little at a time, to avoid scrambling.
Combine with bread. Add bread cubes to the baking dish.
Sprinkle in raisins and zest if using. Pour the custard evenly over the bread, pressing down gently so every piece absorbs liquid.
Rest and soak. Let the mixture sit for 15–20 minutes. This soaking step gives you a creamy center and prevents dry patches.
Add butter and topping. Drizzle melted butter over the top.
If you like a light crunch, sprinkle with turbinado sugar.
Bake. Place the dish on the middle rack and bake for 40–50 minutes. The pudding is done when the edges are set and golden, and the center jiggles slightly but isn’t watery. A knife inserted near the center should come out mostly clean.
Rest before serving. Cool for 10–15 minutes.
Serve warm as is, or top with cream, ice cream, or a drizzle of caramel or maple syrup.