Quick Recipe Version (TL;DR)
Quick Ingredients
- 1.5 lb firm white fish (snapper, cod, halibut), cut in 2-inch pieces
- 2 tbsp fresh lime juice, plus wedges
- 4 garlic cloves, minced (divided)
- 1.5 tsp kosher salt (divided), 1/2 tsp black pepper (divided)
- 1/4 cup chopped cilantro (stems for marinade, leaves for garnish)
- 1 tbsp olive oil (for sauté)
- 1 large yellow onion, thinly sliced
- 2 bell peppers (red and yellow), thinly sliced
- 2 medium ripe tomatoes, diced (or 1 can 14.5 oz diced, drained)
- 1 can (13.5 oz/400 ml) full-fat coconut milk
- 1/2 cup water or fish stock
- 2 tbsp red palm (dendê) oil, or use 2 additional tbsp olive oil
- Cooked white rice, for serving
- Optional: 1 small red chili or a few drops malagueta pepper sauce
Do This
- 1. Marinate fish 15 minutes with 2 tbsp lime juice, 2 cloves garlic, 1 tsp salt, 1/4 tsp pepper, and chopped cilantro stems.
- 2. Start rice: simmer 1.5 cups rice with 2.5 cups water and 1/2 tsp salt; cook 15 minutes, rest 5.
- 3. Sauté onion and peppers in 1 tbsp olive oil over medium heat 5–7 minutes; add remaining 2 cloves garlic 30 seconds.
- 4. Stir in tomatoes; cook 2 minutes. Pour in coconut milk and 1/2 cup water/stock; season with 1/2 tsp salt and 1/4 tsp pepper; simmer 3 minutes.
- 5. Nestle fish and marinade into the sauce. Keep a gentle simmer (no hard boil) until fish flakes, 8–10 minutes.
- 6. Swirl in 2 tbsp dendê oil (or olive oil), add cilantro leaves, and squeeze more lime to taste.
- 7. Serve over hot rice; garnish with lime wedges and optional chili.
Why You’ll Love This Recipe
- Balanced and bright: creamy coconut, sweet peppers, and tangy lime in every spoonful.
- Weeknight-friendly: one pot and under an hour, including the quick marinade.
- Flexible: use dendê oil for authentic Bahia flavor or olive oil if that’s what you have.
- Light yet satisfying: tender fish in a vibrant, gently spiced broth with plenty of veggies.
Grocery List
- Produce: Limes, garlic, cilantro, 1 large onion, 2 bell peppers (red and yellow), 2 tomatoes (or canned), optional red chili
- Dairy: None
- Pantry: Firm white fish, coconut milk (13.5 oz can), olive oil, red palm (dendê) oil or additional olive oil, long-grain white rice, kosher salt, black pepper, fish stock (optional)
Full Ingredients
Fish and Marinade
- 1.5 lb (680 g) firm white fish (snapper, cod, halibut, or sea bass), cut into 2-inch pieces
- 2 tbsp fresh lime juice
- 2 garlic cloves, minced
- 1 tsp kosher salt
- 1/4 tsp freshly ground black pepper
- 2 tbsp finely chopped cilantro stems (save leaves for garnish)
Aromatic Base and Sauce
- 1 tbsp olive oil (for sautéing)
- 1 large yellow onion, halved and thinly sliced
- 2 bell peppers (1 red, 1 yellow), thinly sliced
- 2 additional garlic cloves, minced
- 2 medium tomatoes, diced (about 12 oz) or 1 can (14.5 oz) diced tomatoes, drained
- 1 can (13.5 oz/400 ml) full-fat coconut milk
- 1/2 cup (120 ml) water or fish stock
- 2 tbsp red palm (dendê) oil for finishing (or use 2 additional tbsp olive oil if you cannot find dendê)
- 1/2 tsp kosher salt, plus more to taste
- 1/4 tsp freshly ground black pepper
- Optional heat: 1 small red chili, thinly sliced, or a few drops malagueta pepper sauce
- Optional: pinch of sugar (if tomatoes are very tart)
For Serving
- 1/4 cup loosely packed cilantro leaves, roughly chopped
- Lime wedges
Rice (to serve alongside)
- 1.5 cups long-grain white rice, rinsed
- 2.5 cups water
- 1/2 tsp kosher salt
- 1 tsp olive oil or butter (optional)

Step-by-Step Instructions
Step 1: Marinate the fish
In a bowl, combine the fish pieces with lime juice, 2 minced garlic cloves, 1 tsp kosher salt, 1/4 tsp black pepper, and chopped cilantro stems. Toss gently to coat. Cover and refrigerate for 15 minutes while you prep the vegetables. This brief marinade seasons the fish and adds brightness without “cooking” it in acid.
Step 2: Start the rice
Rinse the rice under cold water until it runs mostly clear. Combine rice, water, and 1/2 tsp salt (plus 1 tsp oil or butter if using) in a small saucepan. Bring to a boil over medium-high heat, then cover, reduce heat to low, and cook for 15 minutes. Turn off heat and let stand, covered, 5 minutes. Fluff before serving.
Step 3: Sauté the aromatics
Heat 1 tbsp olive oil in a wide, heavy pot or braiser over medium heat. Add the sliced onion and bell peppers with a pinch of salt. Cook, stirring occasionally, until softened and lightly sweet, 5–7 minutes. Add the remaining 2 cloves minced garlic (and optional chili) and cook 30 seconds until fragrant.
Step 4: Build the coconut–tomato base
Stir in the diced tomatoes and cook 2 minutes to reduce some moisture. Pour in the coconut milk and 1/2 cup water or fish stock. Season with 1/2 tsp kosher salt and 1/4 tsp black pepper (and a pinch of sugar if tomatoes are very tart). Bring to a gentle simmer over medium heat, then reduce to medium-low. Let the sauce simmer 3 minutes to marry flavors.
Step 5: Add the fish and gently simmer
Nestle the marinated fish and any accumulated juices into the sauce in a single layer. Keep the heat at a bare simmer—occasional small bubbles, about 180°F/82°C. Do not stir vigorously; instead, spoon sauce over the fish once or twice. Cook until the fish is opaque and flakes easily, 8–10 minutes, or until it reaches an internal temperature of 130–135°F (54–57°C).
Step 6: Finish with dendê oil, lime, and herbs
Turn off the heat. Swirl in 2 tbsp red palm (dendê) oil for the signature reddish-gold sheen and subtle nuttiness. If you don’t have dendê, add 2 tbsp olive oil for richness. Add a squeeze of fresh lime to brighten (start with 1 tsp and adjust to taste) and fold in the cilantro leaves. Taste and adjust salt, pepper, and lime.
Step 7: Serve
Spoon hot rice into bowls and ladle the moqueca over the top, making sure each portion gets plenty of peppers, onions, and sauce. Garnish with extra cilantro and lime wedges. Add a few drops of malagueta pepper sauce if you like heat.
Pro Tips
- Marinate briefly: 15 minutes is ideal—longer can firm up delicate fish too much.
- Gentle heat is key: keep the stew just below a boil to prevent breaking the fish or curdling coconut milk.
- Don’t over-stir: spoon sauce over the fish instead of stirring to keep chunks intact.
- Dendê oil last: adding it off heat preserves its color and aroma. If substituting olive oil, still finish with a swirl for a glossy finish.
- Adjust thickness: for a looser broth add a splash more water/stock; for thicker, simmer uncovered a few extra minutes before adding fish.
Variations
- Shrimp moqueca: Swap fish for 1.5 lb large shrimp, peeled and deveined. Marinate 10 minutes and simmer just 3–4 minutes in Step 5.
- Vegan moqueca: Use 14 oz firm tofu (cubed) and 1 can hearts of palm (sliced). Add tofu at Step 5; simmer 6–8 minutes. Hearts of palm go in during Step 6.
- Capixaba-inspired: Skip coconut milk and dendê. Use 1.5 cups fish stock and 2 tbsp annatto (urucum) oil or olive oil; simmer to a light, tomato-forward broth.
Storage & Make-Ahead
Refrigerate leftover moqueca in an airtight container for up to 2 days. Reheat gently over low heat until just steaming—avoid boiling to keep the fish tender. Cooked rice keeps 3–4 days refrigerated; reheat with a splash of water. You can prep vegetables and marinate the fish up to 4 hours ahead (keep fish cold). Freezing is possible but not ideal for fish texture; if you must, freeze the sauce alone and add fresh-cooked fish when serving.
Nutrition (per serving)
Approximate for stew only: 550 calories; 35 g protein; 31 g fat; 17 g carbohydrates; 850 mg sodium. With 1 cup cooked white rice: about 750 calories and 38 g carbs. Actual values vary by fish type and oil used.


Leave a Reply