Quick Recipe Version (TL;DR)
Quick Ingredients
- 1 lb (454 g) white fish fillets (cod, haddock, or pollock), patted dry
- 2 tbsp (28 g) unsalted butter, divided
- 1 tbsp (15 ml) olive oil
- 3 cloves garlic, minced
- 10 oz (283 g) baby spinach
- 1 tsp kosher salt, divided, plus more to taste
- 1/2 tsp black pepper, divided
- 1 1/2 tbsp (12 g) all-purpose flour
- 1 1/4 cups (300 ml) whole milk
- 1/4 cup (60 ml) heavy cream
- 1 tsp Dijon mustard
- 1/4 tsp ground nutmeg
- 1 tsp lemon zest + 1 tbsp (15 ml) lemon juice
- 1/2 cup (50 g) finely grated Parmesan, divided
- 1/3 cup (35 g) panko breadcrumbs
- 1 tbsp (15 ml) olive oil (for topping)
- 2 tbsp (8 g) chopped fresh parsley (optional garnish)
Do This
- 1) Heat oven to 425°F (220°C). Butter a 9 x 13-inch (23 x 33 cm) baking dish.
- 2) Sauté garlic in butter + olive oil, add spinach, wilt, season; spread in dish.
- 3) Make quick béchamel: melt butter, whisk in flour, whisk in milk + cream; season with Dijon, nutmeg, lemon, Parmesan.
- 4) Nestle fish on spinach; season fish with salt and pepper; spoon sauce over.
- 5) Mix panko + Parmesan + olive oil; sprinkle on top.
- 6) Bake 18–22 minutes until bubbling and fish is 145°F (63°C) in the thickest part.
- 7) Broil 1–2 minutes for extra browning; rest 5 minutes, garnish with parsley, serve.
Why You’ll Love This Recipe
- Comforting but not heavy: a light cream-béchamel keeps it silky, not stodgy.
- One-pan baked finish: spinach, fish, sauce, and crunchy topping bake together.
- Weeknight-friendly: straightforward steps and a reliable bake time.
- Golden, crunchy top: Parmesan-panko crust adds the perfect contrast to tender fish.
Grocery List
- Produce: baby spinach (10 oz/283 g), garlic (3 cloves), lemon (1), fresh parsley (optional)
- Dairy: unsalted butter, whole milk, heavy cream, Parmesan cheese
- Pantry: olive oil, all-purpose flour, panko breadcrumbs, Dijon mustard, kosher salt, black pepper, ground nutmeg
Full Ingredients
For the garlicky spinach layer
- 1 tbsp (15 ml) olive oil
- 1 tbsp (14 g) unsalted butter
- 3 cloves garlic, minced
- 10 oz (283 g) baby spinach
- 1/2 tsp kosher salt
- 1/4 tsp black pepper
For the fish
- 1 lb (454 g) white fish fillets (cod, haddock, or pollock), about 1-inch thick
- 1/2 tsp kosher salt
- 1/4 tsp black pepper
- 1 tsp finely grated lemon zest
- 1 tbsp (15 ml) lemon juice
For the light cream béchamel sauce
- 1 tbsp (14 g) unsalted butter
- 1 1/2 tbsp (12 g) all-purpose flour
- 1 1/4 cups (300 ml) whole milk
- 1/4 cup (60 ml) heavy cream
- 1 tsp Dijon mustard
- 1/4 tsp ground nutmeg
- 1/4 tsp kosher salt (plus more to taste)
- 1/4 tsp black pepper
- 1/3 cup (35 g) finely grated Parmesan (for melting into the sauce)
For the Parmesan-breadcrumb crust
- 1/3 cup (35 g) panko breadcrumbs
- 3 tbsp (15 g) finely grated Parmesan
- 1 tbsp (15 ml) olive oil
Optional garnish
- 2 tbsp (8 g) chopped fresh parsley
- Extra lemon wedges for serving

Step-by-Step Instructions
Step 1: Prep the oven and baking dish
Arrange a rack in the center of the oven and preheat to 425°F (220°C). Lightly butter a 9 x 13-inch (23 x 33 cm) baking dish (or a similarly sized gratin dish). This helps prevent sticking and makes serving easier.
Pat the fish fillets dry with paper towels and set them aside while you cook the spinach and sauce. Dry fish browns and bakes more cleanly (less watery sauce).
Step 2: Sauté the garlic and wilt the spinach
Warm 1 tbsp (15 ml) olive oil and 1 tbsp (14 g) butter in a large skillet over medium heat. Add the minced garlic and cook for 30–45 seconds, just until fragrant (don’t let it brown).
Add the baby spinach a few big handfuls at a time, tossing as it wilts. Season with 1/2 tsp kosher salt and 1/4 tsp black pepper. Cook for 2–4 minutes, until the spinach is fully wilted and any excess moisture has mostly cooked off.
Spread the spinach evenly in the bottom of the prepared baking dish to make a “bed” for the fish.
Step 3: Season the fish
Place the fish fillets on a plate and season both sides with 1/2 tsp kosher salt and 1/4 tsp black pepper. Sprinkle over 1 tsp lemon zest and drizzle with 1 tbsp (15 ml) lemon juice.
Nestle the seasoned fish fillets on top of the spinach in a single layer. If pieces are thick on one end, angle them so thickness is distributed evenly across the dish.
Step 4: Make the light cream béchamel
In a small saucepan over medium heat, melt 1 tbsp (14 g) butter. Whisk in 1 1/2 tbsp (12 g) flour and cook, whisking constantly, for 1 minute. This cooks off the raw flour taste without browning the roux.
Slowly whisk in the whole milk (a little at a time at first to keep it smooth), then whisk in the heavy cream. Keep whisking until the sauce thickens to a light, pourable consistency, 3–5 minutes.
Whisk in 1 tsp Dijon mustard, 1/4 tsp nutmeg, 1/4 tsp kosher salt, and 1/4 tsp black pepper. Turn off the heat and whisk in 1/3 cup (35 g) finely grated Parmesan until melted and silky.
Taste and adjust seasoning if needed (the Parmesan adds salt, so go gently).
Step 5: Sauce the fish and assemble the gratin
Spoon or pour the warm béchamel evenly over the fish and spinach. Use the back of a spoon to gently coat the fish without moving it around too much.
You want the fish mostly covered, with some edges peeking through so it bakes rather than “boils” in sauce.
Step 6: Add the Parmesan-breadcrumb crust
In a small bowl, mix 1/3 cup (35 g) panko, 3 tbsp (15 g) finely grated Parmesan, and 1 tbsp (15 ml) olive oil until the crumbs look evenly moistened.
Sprinkle the mixture evenly over the top of the gratin, covering the sauce in a thin, even layer for maximum crunch.
Step 7: Bake until bubbling and golden
Bake at 425°F (220°C) for 18–22 minutes, until the sauce is bubbling at the edges and the fish flakes easily. For best accuracy, check the fish with an instant-read thermometer; it should register 145°F (63°C) at the thickest part.
If you’d like a deeper golden crust, switch the oven to broil on high and broil for 1–2 minutes, watching closely so the topping doesn’t burn.
Let the gratin rest for 5 minutes before serving (the sauce settles slightly and servings lift out more neatly). Garnish with chopped parsley if you like, and serve with lemon wedges.
Pro Tips
- Dry out the spinach: If your spinach releases a lot of liquid, let it cook an extra minute or two so the gratin doesn’t turn watery.
- Grate Parmesan finely: Finely grated Parmesan melts smoother into the sauce and clings better to the breadcrumb topping.
- Choose similar-thickness fillets: Even thickness helps everything finish at the same time. If one piece is thin, tuck it toward the center of the dish.
- Keep béchamel pourable: The sauce will thicken more in the oven. If it seems too thick on the stovetop, whisk in 1–2 tbsp milk.
- Broil carefully: The difference between “golden” and “burnt” is fast with panko. Stay by the oven during broiling.
Variations
- Herby gratin: Add 1 tbsp chopped dill or 1 tbsp chopped chives to the béchamel and finish with extra herbs after baking.
- Cheese swap: Use Gruyère (1/3 cup / 35 g) in the sauce for a nutty flavor, and keep Parmesan for the topping.
- Add a starch: Layer 1 cup (150 g) cooked baby potatoes, sliced under the spinach for a heartier one-dish dinner (bake time may increase by 3–5 minutes).
Storage & Make-Ahead
Cool leftovers to room temperature for no more than 2 hours, then cover and refrigerate for up to 2 days. Reheat in a 350°F (175°C) oven for 15–20 minutes, until hot throughout; cover loosely with foil if the top is browning too quickly. This dish is best freshly baked, but you can prep components ahead: sauté the spinach and make the breadcrumb topping up to 1 day in advance (store spinach covered in the fridge; store crumbs airtight at room temperature). For best texture, make the béchamel right before baking.
Nutrition (per serving)
Approximate (based on 4 servings): Calories: 430; Protein: 38 g; Carbohydrates: 16 g; Fat: 24 g; Saturated Fat: 10 g; Fiber: 3 g; Sugars: 6 g; Sodium: 780 mg.
