When the tomatoes begin to slump and release their juices, the whole pot starts smelling different: brighter, rounder, and ready for the coconut milk. That’s the moment this Moqueca Brazilian Fish Stew starts to come together. The fish gets a quick lime-and-garlic marinade first, then cooks gently in a broth built from tomatoes, peppers, and coconut milk. It’s a one-pot dinner for four, and the fish stays tender when you let the broth do the work instead of stirring it around.
I use firm white fish cut into generous pieces so it can nestle into the broth without falling apart. Cod, snapper, and halibut all work, and red palm oil gives the stew its distinctive Brazilian character; olive oil is a good alternative when palm oil isn’t available. The finished broth is savory, lightly tangy, and creamy without feeling heavy, with cilantro stirred in right at the end. Let the pot rest for five minutes before serving, and you’ll have a warm bowl with soft fish and a fragrant, tomato-rich broth.

Kitchen Note
Keep the fish in its lime marinade for 15 minutes, then add it to the pot. That short rest seasons the pieces without letting the acid start changing their texture.
Save this Moqueca Brazilian Fish Stew for a cozy one-pot dinner with tender fish and a creamy, tomato-rich broth.
Why Moqueca’s Broth Starts Before the Coconut Milk
It’s easy to think of coconut milk as the whole broth, but the tomatoes do important work before they ever meet it. As they soften, their juices mingle with the onion and pepper, giving the pot a savory, slightly tangy base. That early layer keeps the finished stew from tasting like coconut milk with fish dropped into it. It also means each spoonful carries the flavor of the vegetables, not just the richness of the coconut.
The order matters because coconut milk is best treated gently. Once it’s in the pot, bring everything only to a gentle simmer before adding the fish. A hard boil isn’t needed to build flavor, and it makes it harder to cook delicate fish evenly. Let the tomatoes soften first, then give the fish room to cook quietly in the liquid. The result is a loose, spoonable stew rather than a thick sauce, with the fish still in substantial pieces.
What Gives This Fish Stew Its Character

- Firm white fish — Choose cod, snapper, or halibut, cut into even 2-inch pieces. Firm flesh holds its shape better than a delicate fillet, so the pieces are less likely to break as you serve the stew. Freshness matters more than choosing the priciest variety.
- Red palm oil — This is the traditional choice and gives the base a distinctive character. Olive oil works when palm oil isn’t available, though the stew will have a milder, less traditional taste. Use either one to soften the vegetables.
- Fresh lime and garlic — Fresh lime juice brings a clear, tart note to the fish, while minced garlic adds savory depth to the marinade. Fresh garlic has a brighter bite than jarred minced garlic; if that’s what you have, it will still season the fish, though the aroma will be softer.
- Tomatoes — Ripe tomatoes soften quickly and release flavorful juices into the base. Choose tomatoes that yield slightly when pressed; pale, firm ones tend to contribute less sweetness and aroma. There isn’t a direct swap that gives quite the same fresh tomato texture here.
- Canned coconut milk — The can is important because canned coconut milk gives the broth a fuller body than a carton of coconut beverage, which is generally more diluted. Light canned coconut milk can work for a less rich stew, but expect a thinner broth.
- Jalapeño and cilantro — The seeded jalapeño adds a gentle warmth, while fresh cilantro brightens the pot at the finish. Cilantro is best added just before the resting time so its flavor stays fresh; dried cilantro won’t give the same lift.
Building the Broth Without Breaking Up the Fish
Season the Fish Briefly
Toss the 2-inch fish pieces with the lime juice, minced garlic, half of the kosher salt, and black pepper. Cover the bowl and refrigerate it for 15 minutes while you prepare the vegetables. Keep the pieces as intact as possible when tossing so the edges don’t get battered before cooking. Pour the marinade into the pot along with the fish later; it carries the lime and garlic flavor into the broth.
Soften the Vegetables in the Oil
Heat the red palm oil in a 5-quart Dutch oven over medium heat. Add the thinly sliced onion and red bell pepper along with the seeded, minced jalapeño, then cook for 5 minutes, stirring occasionally. The vegetables should soften and become fragrant, not brown at the edges. If the pan looks dry or the onion starts catching, lower the heat slightly rather than letting the vegetables scorch.
Let the Tomatoes Release Their Juices
Add the chopped tomatoes and the remaining kosher salt. Cook for 5 minutes, stirring occasionally, until the tomatoes begin to soften and their juices gather in the bottom of the pot. You’ll see the vegetables settle into a moist base instead of sitting in separate dry pieces. Stir in the coconut milk and bring the mixture to a gentle simmer before adding the fish.
Simmer Gently, Then Rest
Nestle the fish into the broth and pour in its marinade, then cover the Dutch oven. Simmer for 8 to 10 minutes, until the fish is opaque and the thickest piece reaches 145°F. Avoid stirring the pot while the fish cooks; moving the pieces around can break them apart before they’re set. Gently stir in the cilantro, take the pot off the heat, and let the stew rest for 5 minutes.
Simple Ways to Adjust This Moqueca
Use olive oil when palm oil isn’t available
Swap the red palm oil for olive oil in the same amount. The vegetables will still soften well, but the broth will have a gentler flavor and lose some of the distinctive character palm oil brings.
Make a milder pot by leaving out the jalapeño
Skip the seeded jalapeño for a gentler stew. You’ll lose its mild pepper warmth, but the tomato, onion, and cilantro still give the broth plenty of flavor.
Choose light coconut milk for a less rich broth
Use light canned coconut milk in place of regular canned coconut milk. The broth will be thinner and less creamy, but it still works with the fish and vegetables. Keep the heat gentle so the fish cooks without rough bubbling.
Reduce the added salt
For a lower-sodium version, leave out the added salt in both the fish marinade and the tomato base. The lime, garlic, and cilantro will still add plenty of brightness, though the stew will taste less seasoned.
Storage and Reheating
- Refrigerator: Cool and refrigerate leftovers within 2 hours in a shallow, airtight container. They keep for 3 to 4 days; the fish will soften a little as it sits.
- Freezer: Freeze in an airtight freezer-safe container for up to 2 months for best quality. Thaw overnight in the refrigerator; the coconut broth may separate slightly and the fish texture may be softer after thawing.
- Reheating: Warm gently in a saucepan over low heat, stirring carefully, until the leftovers reach 165°F. Avoid a hard boil, which can toughen the fish and make the broth less smooth.
Questions That Come Up When Making Moqueca

Moqueca Brazilian Fish Stew
Ingredients
Equipment
Method
- Toss the fish with the lime juice, garlic, 1/2 teaspoon of the salt, and the black pepper, then cover and refrigerate for 15 minutes.
- Heat the palm oil in a 5-quart Dutch oven over medium heat.
- Add the onion, bell pepper, and jalapeño and cook for 5 minutes, stirring occasionally, until softened.
- Add the tomatoes and remaining 1/2 teaspoon salt and cook for 5 minutes, stirring occasionally, until the tomatoes begin to soften and release their juices.
- Stir in the coconut milk and bring to a gentle simmer.
- Nestle in the fish and pour in its marinade, then cover and simmer for 8 to 10 minutes, until the fish is opaque and reaches 145°F in the thickest piece.
- Gently stir in the cilantro.
- Let the stew rest for 5 minutes before serving.


