Quick Recipe Version (TL;DR)
Quick Ingredients
- 200 g dried salted fish (cod or mackerel), soaked
- 800 g fresh firm white fish, cut in 5 cm pieces
- 2 Tbsp lemon juice; 1¼ tsp kosher salt; ½ tsp black pepper
- 3 Tbsp red palm oil (or extra-virgin olive oil)
- 1 large onion (250 g), diced; 4 garlic cloves, minced
- 1 red bell pepper, diced; 2 Tbsp tomato paste
- 4 medium tomatoes (600 g), chopped
- 1 large sweet potato (400 g), 2 cm chunks
- 1 medium eggplant (350 g), 2 cm cubes
- 300 g okra, sliced 1 cm
- 3 cups (720 ml) fish stock or water; 2 bay leaves
- 1–2 fresh chilies or 1 tsp chili flakes
- 2 Tbsp dried shrimp (optional)
- ¼ cup chopped cilantro or parsley; lemon wedges
- Funge: 2 cups (250 g) cassava flour, 5 cups (1.2 L) water, ¾ tsp salt
Do This
- 1. Rinse dried fish; soak 1 hour in cold water, changing once. Flake into bite-size pieces.
- 2. Toss fresh fish with lemon juice, ¼ tsp salt, and pepper; rest 15 minutes.
- 3. In a wide pot, heat palm oil over medium. Sauté onion, garlic, and bell pepper 5 minutes. Stir in tomato paste 1 minute, then tomatoes 8–10 minutes until jammy.
- 4. Add sweet potato, eggplant, bay leaves, chili, dried shrimp (if using), and stock. Simmer gently (185–195°F/85–90°C) 10 minutes.
- 5. Stir in dried fish; simmer 10 minutes. Add okra; cook 8–10 minutes until just tender.
- 6. Nestle fresh fish on top; spoon sauce over. Cover and simmer gently 8–10 minutes until opaque.
- 7. Make funge: Boil 4 cups water. Whisk 1 cup cool water with cassava flour; pour into boiling water while whisking. Beat 5–7 minutes until smooth and elastic. Salt, rest 2 minutes. Serve stew with mounds of funge and herbs.
Why You’ll Love This Recipe
- Authentic Angolan comfort food: a rich, tomato-and-palm-oil stew built on both dried and fresh fish.
- Naturally gluten-free and dairy-free (butter in the funge is optional).
- Balanced and hearty: silky eggplant, tender okra, and sweet potato in a bright, savory sauce.
- Perfect for gatherings: the funge is a crowd-pleasing, creamy partner to the saucy calulu.
Grocery List
- Produce: Onion, garlic, red bell pepper, tomatoes, sweet potato, eggplant, okra, fresh chilies, lemons, cilantro or parsley.
- Dairy: Optional unsalted butter for finishing funge.
- Pantry: Dried salted fish (cod or mackerel), fresh white fish, cassava flour, red palm oil (or extra-virgin olive oil), tomato paste, bay leaves, chili flakes, dried shrimp (optional), fish stock or bouillon, kosher salt, black pepper.
Full Ingredients
Calulu de Peixe (Fish and Vegetable Stew)
- 200 g dried salted fish (such as bacalhau/cod or mackerel), rinsed and soaked
- 800 g fresh firm white fish (tilapia, snapper, grouper, or catfish), cut into 5 cm pieces
- 2 Tbsp fresh lemon juice (plus wedges for serving)
- 1¼ tsp kosher salt, divided (adjust to taste; dried fish adds salt)
- ½ tsp freshly ground black pepper
- 3 Tbsp red palm oil (authentic) or extra-virgin olive oil
- 1 large yellow onion (about 250 g), small dice
- 4 garlic cloves, minced
- 1 red bell pepper, small dice
- 2 Tbsp tomato paste
- 4 medium ripe tomatoes (about 600 g), chopped
- 1 large sweet potato (about 400 g), peeled and cut into 2 cm chunks
- 1 medium eggplant (about 350 g), cut into 2 cm cubes
- 300 g okra, trimmed and sliced 1 cm thick
- 3 cups (720 ml) fish stock or water
- 2 bay leaves
- 1–2 fresh bird’s-eye chilies, sliced, or 1 tsp red pepper flakes
- 2 Tbsp dried shrimp or prawns (optional, for umami)
- ¼ cup chopped fresh cilantro or parsley, plus extra for garnish
Creamy Cassava Funge
- 2 cups (250 g) fine cassava flour (farinha de mandioca)
- 5 cups (1.2 L) water, divided (4 cups boiling + 1 cup cool for slurry)
- ¾ tsp kosher salt
- 1 Tbsp unsalted butter (optional)
To Finish & Serve
- Lemon wedges
- Extra chopped herbs

Step-by-Step Instructions
Step 1: Desalt and prep the dried fish
Rinse the dried fish under cold running water to remove surface salt. Soak in a bowl of cold water for 60 minutes, changing the water halfway through. Drain, then flake or cut into bite-size pieces, removing any bones and skin. If it still tastes very salty, rinse once more. Set aside.
Step 2: Season the fresh fish
Pat the fresh fish dry. Toss gently with 2 Tbsp lemon juice, ¼ tsp of the salt, and the black pepper. Let stand 15 minutes while you start the stew. This quick cure seasons the fish and helps it stay firm.
Step 3: Build the tomato-onion base
In a wide, heavy pot or Dutch oven, heat 3 Tbsp palm oil over medium heat until shimmering. Add onion, garlic, and red bell pepper. Cook, stirring, for 5–6 minutes until the onion is translucent. Stir in tomato paste and cook 60 seconds to caramelize. Add chopped tomatoes and the remaining 1 tsp salt. Cook 8–10 minutes, stirring occasionally, until thick, glossy, and jammy.
Step 4: Add hearty vegetables and simmer
Stir in sweet potato, eggplant, bay leaves, chili, dried shrimp (if using), and the stock. Bring to a steady simmer, then lower heat to maintain a gentle bubble at about 185–195°F (85–90°C). Cover partially and cook for 10 minutes to soften the vegetables.
Step 5: Fold in okra and dried fish
Add the soaked dried fish and sliced okra. Stir gently, cover, and simmer 8–10 minutes more until the okra is tender and the sweet potato is nearly soft. Taste and adjust salt. If the stew is very thick, splash in 60–120 ml hot water; if thin, simmer uncovered a few minutes to reduce.
Step 6: Gently cook the fresh fish
Nestle the marinated fresh fish pieces across the surface of the stew. Spoon some sauce over the top. Cover and simmer gently for 8–10 minutes, without stirring, until the fish turns opaque and flakes easily. Turn off the heat and fold in the chopped herbs. Squeeze in a little extra lemon if you like brightness.
Step 7: Make the creamy cassava funge
Bring 4 cups (960 ml) water to a rolling boil (212°F/100°C) in a medium pot. In a bowl, whisk cassava flour with the remaining 1 cup (240 ml) cool water to make a smooth slurry. Reduce the heat to low and steadily pour the slurry into the boiling water while whisking vigorously. Switch to a sturdy wooden spoon and beat constantly for 5–7 minutes until thick, smooth, and elastic. Stir in salt (and butter, if using). Cover and let rest 2 minutes. For serving, scoop with a wet spoon to form mounds.
Pro Tips
- Keep the simmer gentle (185–195°F/85–90°C) so the fresh fish stays intact and tender.
- Okra thickens naturally; a squeeze of lemon at the end balances the texture and adds brightness.
- For cleaner chunks, sear the fresh fish 1–2 minutes per side in a little oil before Step 6, then finish in the sauce.
- To avoid lumpy funge, whisk a cool-water slurry first, then beat vigorously once it hits the boiling water.
- If using olive oil instead of palm oil, add 1 tsp ground annatto or sweet paprika for a warm red hue.
Variations
- Smoky calulu: Add 100 g smoked fish or 2 tsp smoked paprika for depth.
- Leafy greens: Stir in 2 cups chopped spinach or kale during the last 5 minutes.
- Peanut accent: Add 2 Tbsp ground roasted peanuts with the tomatoes for a nutty background note.
Storage & Make-Ahead
Calulu keeps well: refrigerate the stew up to 3–4 days or freeze up to 2 months. Reheat gently, adding a splash of water to loosen. Funge is best fresh; to revive, beat in hot water over low heat until smooth. Soak the dried fish the day before; you can also chop vegetables 1 day ahead and refrigerate tightly covered.
Nutrition (per serving)
Approximate values using palm oil: 575 kcal; Protein 43 g; Carbohydrates 58 g; Fat 20 g; Fiber 9 g; Sodium ~950 mg (varies with desalting). Calculated values are estimates.
