Soups & Stews
This creamy fish soup recipe transforms simple ingredients into a velvety, restaurant-quality bowl that balances richness with delicate seafood flavor. The secret lies in a silky roux base that prevents curdling while creating a luxurious texture—no heavy cream required.
I developed this version after years of testing, ensuring every spoonful delivers that perfect harmony of tender fish and smooth broth.
What sets this recipe apart is the two-stage cooking process: first building a flavorful fish stock from bones and aromatics, then thickening it with a light dairy blend that stays silky without breaking.
The result is a soup where flaky white fish like cod or haddock melts in your mouth against a velvety backdrop, not a heavy, cloying sauce. This method works equally well with traditional French techniques or modern twists like coconut milk for a lighter profile.
The key to success is timing—adding the fish at the last moment preserves its delicate texture while allowing it to absorb the broth's flavors. You'll end up with a bowl that's creamy yet light, rich without being greasy, and packed with that unmistakable ocean freshness.
Perfect for chilly evenings or as a comforting starter, this soup proves homemade can rival any restaurant version.
Whether you prefer classic seafood flavors or global influences, this recipe adapts beautifully. Pair it with crusty bread to soak up every drop or serve as a light main course with a crisp green salad.
The instructions walk you through every step to ensure foolproof results—no curdling, no fishy aftertaste, just pure comfort in a bowl.
Ingredients for creamy fish soup
Fifteen ingredients crafting restaurant-quality fish soup with velvety texture and delicate seafood flavor.
| Ingredient | Amount | Notes |
|---|---|---|
| White Fish Fillets 🐟 | 1 ½ lb | Cod or haddock, skinless, boneless |
| Fish Stock 💧 | 4 cups | Homemade or high-quality store-bought |
| Unsalted Butter 🧈 | ½ cup | European-style preferred for flavor |
| All-Purpose Flour 🌾 | ¼ cup | For silky roux base |
| Whole Milk 🥛 | 1 cup | Full-fat for creaminess |
| Heavy Cream 🥛 | ½ cup | 36% fat for richness |
| Yellow Onion 🧅 | 1 whole | Medium, finely diced |
| Garlic Cloves 🧄 | 4 cloves | Peeled, minced |
| Fresh Parsley 🌿 | ¼ cup | Chopped, for garnish |
| Fresh Dill 🌿 | ¼ cup | Chopped, optional |
| Lemon Juice 🍋 | 2 tbsp | Freshly squeezed |
| Diamond Crystal Kosher Salt 🧂 | 1 ½ tsp | Adjust to taste |
| Freshly Ground Black Pepper 🌶️ | ½ tsp | Coarsely ground |
| Bay Leaves 🍃 | 2 whole | For stock infusion |
| Celery Stalk 🥕 | 1 whole | Cut into 2-inch pieces |
The fish stock forms the soul of this soup. For optimal flavor, use homemade stock made from fish bones, vegetables, and aromatics—Whole Foods Market or Trader Joe's sell high-quality pre-made options if you're short on time. The European-style butter (like Plugrá or Kerrygold) adds depth that regular butter can't match. If using frozen fish, thaw it in the fridge overnight for even cooking. The yellow onion should be sweet and firm, not bitter or sprouting. For the roux, use a heavy-bottomed pot to prevent burning—this is where the magic happens.
Substitutions should preserve the soup's delicate balance. No heavy cream? Coconut milk works for a lighter profile, though texture will differ slightly. Fresh herbs missing? Dried parsley or dill at one-third the amount suffices, but fresh is ideal. The fish fillets can be swapped for halibut or tilapia, but cod or haddock remain the classic choices. For a dairy-free version, replace the milk and cream with unsweetened almond milk and aquafaba, though the roux will need extra attention to avoid curdling. The bay leaves can be omitted if you dislike their flavor, but they enhance the broth's depth.
This soup reheats beautifully—simmer gently on the stove or microwave in short bursts to avoid breaking the emulsion. Store in an airtight container for up to 3 days in the refrigerator. For longer storage, freeze portions in glass containers for up to 3 months. The fish should be added last to maintain its delicate texture. Garnish with fresh herbs and a drizzle of extra-virgin olive oil just before serving to elevate presentation. Leftovers can be repurposed into fish cakes or fritters for a quick meal.
Why You'll Love This Recipe
- Foolproof Simplicity: I swear by this—just melt butter, toss in flour, and pour in stock. The fish fillets slide in last, and boom, you’re done. No fancy techniques, no stress.
- Velvet-Smooth Magic: That milk-butter roux? It turns the stock into something luxuriously creamy without tasting heavy. The fish stays tender while the broth gets this rich, almost velvety depth—like a hug in a bowl.
- Weeknight to Dinner Party: Same recipe, different vibes. Serve it with crusty bread for a lazy Sunday or add a squeeze of lemon for a restaurant-worthy starter. Even my picky partner doesn’t skip seconds.
- Leftovers That Don’t Suck: Honestly, it tastes better the next day. The flavors meld into this cozy, comforting thing—perfect for lunchboxes or reheating when you’re too tired to cook. (Yes, even on a Tuesday night.)
Step-by-step instructions for creamy fish soup with flaky white fish
Master the velvety texture and delicate fish flakes with these precise techniques.
Build the Silky Roux Base
Melt the 0.5 cup unsalted butter in a heavy-bottomed pot over medium heat. Once fully melted and foaming subsides, whisk in the 0.25 cup all-purpose flour to form a smooth paste. Cook this roux for exactly 2 minutes, stirring constantly with a wooden spoon - it should transform from pale to a rich, nutty blond color. This step creates the velvety foundation for your soup's creaminess.
Watch closely as the roux develops - if it darkens too quickly, reduce heat immediately to prevent bitterness. The proper roux should coat the back of a spoon without being grainy. This is where the soup's luxurious texture begins to take shape.
Develop the Flavor Foundation
Gradually whisk in the 4 cups fish stock while maintaining medium heat, allowing the liquid to absorb completely before adding more. Once fully incorporated, add the 1 whole yellow onion, 1 whole celery stalk cut into 2-inch pieces, 4 cloves garlic cloves, 2 whole bay leaves, 1.5 tsp diamond crystal kosher salt, and 0.5 tsp freshly ground black pepper.
Bring the mixture to a gentle simmer and cook uncovered for 15 minutes, allowing the aromatics to infuse their flavors into the broth. The onion should soften completely while maintaining its integrity - this ensures proper seasoning without muddying the soup. Skim off any foam that rises to the surface during this time for a cleaner final product.
Create the Creamy Texture
Reduce heat to low and slowly whisk in the 1 cup whole milk and 0.5 cup heavy cream. The soup should thicken slightly as it warms through. Add the 2 tbsp lemon juice and bring to a bare simmer, then remove from heat. The acidity from the lemon juice brightens the flavors while preventing the cream from curdling.
Taste and adjust seasoning - you may need an additional pinch of salt or pepper. The soup should be rich but not overly heavy at this stage. Here's the thing - the creaminess will develop further as the fish cooks and releases its natural oils into the broth.
Add Fish for Perfect Flakiness
Gently add the 1.5 lb white fish fillets to the simmering soup. They should be completely submerged in the liquid. Cook for exactly 4-5 minutes, until the fish becomes opaque and flakes easily with a fork. Overcooking will turn the delicate fish into rubbery chunks - this is where precision matters most.
You'll know the fish is perfect when it separates cleanly at the touch of a fork, with no resistance. The soup should have a delicate sheen from the fish's natural oils, indicating proper integration of flavors. Remove the fish with a slotted spoon and set aside, keeping the soup warm.
Finish and Garnish Professionally
Strain the soup through a fine-mesh sieve to remove all solids, pressing gently with a wooden spoon to extract maximum flavor. Return the strained soup to the pot and stir in the 0.25 cup fresh parsley and 0.25 cup fresh dill. The herbs should be finely chopped to distribute evenly throughout the soup.
Gently fold in the cooked fish fillets, cutting them into bite-sized pieces as you incorporate them. The final soup should have a luxurious creaminess with delicate fish flakes suspended throughout. Serve immediately in warmed bowls, garnished with additional fresh herbs if desired.
Pro Tips For Making Creamy Fish Soup
- Bloom the Flour: Toss that flour into cold butter first—no, really, let it sit for 30 seconds before adding liquid. I used to rush this, and my soup would turn into a gluey mess instead of a velvety sauce. That quick pause lets the starch absorb the butter’s fat, so the roux actually thickens instead of fighting you.
- Poach, Don’t Boil: Fish stock should shimmer, not roar—keep it at a gentle simmer (95°F/35°C) when adding the fillets. I learned this the hard way: boiling fish turns it rubbery, and no amount of cream can fix that. A thermometer helps, but even a visual check (tiny bubbles breaking the surface) works.
- Temper the Milk: Warm the milk to room temp before adding it to the roux—yes, even if you’re in a hurry. Cold milk shocks the butter and makes the sauce split like a bad joke. Just heat it in a separate pot until it’s lukewarm (about 100°F/38°C), and your cream will behave.
- Season in Layers: Salt the stock first, then the milk, then the fish—don’t dump it all in at once. Fish absorbs salt like a sponge, so if you season last, you’ll end up with bland fillets and a salty broth. Taste as you go; adjust the milk’s salt to match the stock’s intensity.
Regional styles of this dish
French Bisque Tradition
In France, this soup evolves into bisque, where shellfish like lobster or crab replaces white fish. The classic technique involves reducing seafood shells into a velvety stock, then blending with a light roux and crème fraîche.
I love adding a touch of Cognac (just 1 tbsp) when building the roux for depth. The French version often finishes with a herb butter swirl—mix 2 tbsp softened butter with 1 tbsp chopped tarragon and swirl it into each bowl before serving. 🍷
Italian Fisherman's Style
Italian coastal regions transform this into zuppa di pesce, where the broth is built from tomato passata and white wine instead of a roux. The secret? Simmering ½ cup dry white wine with the fish stock and adding 1 crushed red pepper flake for subtle heat.
I often see versions with anchovies (just 2 fillets dissolved in the broth) for umami depth. The Italians finish with lemon zest and parsley, creating a bright, acidic contrast to the richness. 🌿
Japanese Miso Cream Twist
For a modern fusion, replace the dairy with a miso-cream base—whisk 1 tbsp white miso paste into the roux before adding liquids. The miso adds fermented complexity while preventing curdling. I use ½ cup coconut milk instead of heavy cream for a lighter texture.
Garnish with toasted sesame seeds and scallions for a dish that bridges comfort and sophistication. The miso version reheats beautifully, making it perfect for meal prep. 🌱
Spanish Seafood Fusion
Spain's sopa de pescado often includes saffron-infused broth (just ¼ tsp saffron threads steeped in 2 tbsp warm water). The Spanish version frequently features potatoes (peeled and diced) simmered in the broth for heartiness. I like adding ½ cup frozen peas at the end for color and sweetness.
A splash of sherry vinegar (just 1 tsp) brightens the flavors before serving. The Spanish approach proves this soup can be both creamy and substantial. 🍷
Nordic Light Approach
Scandinavian versions prioritize clarity and freshness, often using dill as the primary herb and omitting heavy cream. Instead, they thicken with a cornstarch slurry (mix 1 tbsp cornstarch with 2 tbsp cold water).
The broth is built from dill stems (tied in a bundle) and fennel for anise notes. Serve with crisp rye bread and a side of pickled herring for a true Nordic experience. The lightness makes this version perfect for summer. 🌊
Caribbean Coconut Adaptation
In the Caribbean, this soup becomes creamy with coconut milk and thai basil for a tropical twist. Replace the fish stock with light coconut milk (just 1 can) and add 1 stalk lemongrass (bruised and tied) to the broth.
Finish with lime juice and cilantro instead of parsley. The result is a lighter, brighter version that pairs perfectly with grilled jerk chicken or plantain chips. This adaptation proves how versatile the base concept truly is. 🌴
Nutrition facts
Frequently asked questions
Can I make this soup without dairy?
Replace the milk and cream with ½ cup coconut milk and ½ cup unsweetened almond milk for a lighter version. For thickness, whisk 1 tbsp cornstarch with 2 tbsp cold water and stir it into the simmering broth. The key is adding the fish last to prevent curdling. This dairy-free version works beautifully with a miso paste for depth.
What's the best fish to use for maximum flakiness?
For restaurant-quality flakes, choose cod, haddock, or halibut—these fish have delicate textures that melt perfectly. Avoid firm white fish like mahi-mahi or snapper, which can become rubbery. If using frozen fish, thaw it overnight in the fridge and pat dry before cooking to ensure even heat distribution.
Why did my soup turn out too thick?
This usually happens when the roux cooks too long or the broth reduces too much. To fix it, whisk in 2-3 tbsp warm water or fish stock while stirring constantly. For future batches, remove the pot from heat slightly earlier when adding the cream. The soup should coat the back of a spoon but still flow freely—think "paint-like" consistency, not glue.
Can I prep this soup ahead of time?
Yes! Make the roux and broth base up to 2 days ahead and store it in an airtight container in the fridge. When ready to serve, reheat gently, then add the fish and cream just before serving. For the full soup (without fish), it keeps for 3 days refrigerated. The fish should always be added last to maintain its delicate texture.
How do I prevent the fish from getting rubbery?
Cook the fish for exactly 4-5 minutes in the simmering broth—no longer! Use a timer and test with a fork: it should flake easily. Also, ensure your fish is fresh (or properly thawed) and cut into even-sized pieces. The broth temperature should be a gentle simmer, not a rolling boil, to preserve tenderness.
