Skip to content
Zaffaron

Khoresht-e Mahi (خورشت ماهی) — Persian Sour Fish Stew with Dried Lime

A bright Southern Iranian fish stew built on tomatoes, garlic, dried lime, and a sweet-sour balance of lemon juice and vinegar. Firm white fish gently poaches in the tangy sauce and is best served with saffron basmati rice.

By Zaffaron Kitchen· Published March 17, 2026 Verified Recipe
Dairy-Free Nut-Free Halal
Contains: gluten, fish
70 min total Prep 25m · Cook 45m 4 servings 320 cal ~$4.25/serving
↓ Jump to Recipe
Khoresht-e Mahi — Persian Sour Fish Stew with Dried Lime - authentic persian recipe

Printable Recipe Card

Servings: 4 · Total: 70 min · Difficulty: medium

Ingredients (quick list)

  • 600 g Firm white fish fillets (cod, haddock, halibut, or grouper), skinless (cut into 5 cm pieces; pat very dry)
  • 6 g Fine sea salt (divided)
  • 1 tsp Ground black pepper (divided)
  • 1 tsp Turmeric powder (for seasoning the fish and sauce)
  • 15 g All-purpose flour (optional, for lightly dusting fish to help it hold together)
  • 60 ml Olive oil (divided)
  • 250 g Yellow onion (finely chopped)
  • 18 g Garlic (about 6 cloves, minced)
  • 500 g Tomatoes (ripe, grated or finely crushed)
  • 30 g Tomato paste (for deeper color and body)
  • 1.5 tsp Dried thyme
  • 2 tsp Ground dried lime (limoo amani powder) (add more to taste at the end)

+ 4 more in the full ingredients section below.

Steps (summary)

  1. Prepare the fish: pat pieces very dry. Season with 3 g salt, 1/2 tsp black pepper, and 1/2 tsp turmeric. If using flour, dust l…
  2. Build the base: heat 45 ml olive oil in a wide pot over medium heat. Add onion and cook 10–12 minutes, stirring, until soft and…
  3. Cook the tomatoes: stir in grated tomatoes and tomato paste. Cook 8–10 minutes over medium-high, stirring often, until the mixt…
  4. Season sour and sweet: add ground dried lime, sugar, vinegar, lemon juice, remaining 3 g salt, and 360 ml water. Bring to a gen…
  5. Sear the fish (recommended): heat remaining 15 ml olive oil in a nonstick skillet over medium-high. Sear fish in a single layer…
  6. Poach gently: slide fish into the simmering sauce in one layer. Reduce heat to the lowest setting so the surface barely tremble…

+ 1 more steps in the full instructions section below.

Cultural Background

Sour fish stews are associated with Iran’s southern coastal cooking, where seafood and bright, acidic flavors are common. Dried limes are a hallmark ingredient in many Persian stews, valued for their distinctive tart, slightly earthy aroma. This dish is often served with rice to balance the lively sauce.

tangysavorylightly sweetumamitender flaky fishsilky saucecitrusy dried limegarlicthymetomato🌶 mild

Equipment

Wide heavy-bottomed pot with lid (3–4 L)Nonstick skillet (optional, for searing fish)Box grater or food mill (for tomatoes)Measuring spoons and cupsInstant-read thermometer (optional)

💡 Tips

  • Choose firm, low-fat white fish; very delicate fish can break during simmering.
  • Grating tomatoes creates a smooth sauce without needing a blender; canned crushed tomatoes can replace fresh when out of season.
  • Ground dried lime varies in intensity; add most early for depth, then fine-tune at the end for aroma.
  • Keep the stew at a bare simmer once fish is added; vigorous boiling makes fish tough and causes it to fall apart.
  • For a thicker sauce, simmer the tomato base a few minutes longer before adding water.

⚠️ Common Mistakes

  • ❌ Boiling the stew after adding the fish

    💡 Why: High heat makes fish tough and causes it to break apart in the sauce.

    ✅ Fix: Keep the pot at a bare simmer; cover and cook gently, moving the pot by shaking rather than stirring.

  • ❌ Adding all the dried lime at the end

    💡 Why: It can taste harsh and powdery without time to bloom and integrate.

    ✅ Fix: Add most during the simmer so it mellows, then adjust with a small amount at the end for aroma.

  • ❌ Using watery tomatoes and not reducing the base

    💡 Why: The stew can end up thin and flat rather than glossy and concentrated.

    ✅ Fix: Cook tomatoes and paste until the mixture darkens and oil separates, then add water and simmer to the desired thickness.

  • ❌ Skipping drying the fish

    💡 Why: Moisture prevents good searing and can dilute the sauce near the fish, making it more likely to fall apart.

    ✅ Fix: Pat fish thoroughly dry; if needed, rest uncovered in the fridge 20 minutes before cooking.

🧊 How to Store

Cool quickly and refrigerate in an airtight container for up to 2 days. Reheat gently over low heat until just hot; avoid boiling to prevent the fish from breaking and drying out. Freezing is not ideal because the fish can become grainy, but it can be frozen up to 1 month if necessary.

📅 Make Ahead

You can cook the sauce (without fish) up to 2 days ahead and refrigerate. Reheat to a gentle simmer, then add fish and poach fresh just before serving for the best texture.

🍽️ Pairs Well With

  • Saffron-infused basmati rice
  • Fresh herbs (mint
  • basil
  • cilantro) and radishes
  • Pickled vegetables or a simple cucumber salad

Regional Variations

  • Bushehr and Persian Gulf coastOften kept boldly sour with extra citrus and served with plenty of fresh herbs; some cooks use very firm local fish and keep the sauce relatively thin for spooning over rice.
  • Hormozgan (Bandar-style)May lean more aromatic with additional dried herbs and a slightly sweeter balance to round the acidity, especially when tomatoes are very tart.
family dinner spring meals seafood night Nowruz table (regional)
#sweet-sour#tomato-based#coastal#one-pot#weeknight-friendly

Ingredients

  • 600 gFirm white fish fillets (cod, haddock, halibut, or grouper), skinless (cut into 5 cm pieces; pat very dry)
  • 6 gFine sea salt (divided)
  • 1 tspGround black pepper (divided)
  • 1 tspTurmeric powder (for seasoning the fish and sauce)
  • 15 gAll-purpose flour (optional, for lightly dusting fish to help it hold together)
  • 60 mlOlive oil (divided)
  • 250 gYellow onion (finely chopped)
  • 18 gGarlic (about 6 cloves, minced)
  • 500 gTomatoes (ripe, grated or finely crushed)
  • 30 gTomato paste (for deeper color and body)
  • 1.5 tspDried thyme
  • 2 tspGround dried lime (limoo amani powder) (add more to taste at the end)
  • 8 gGranulated sugar (balances acidity; adjust to taste)
  • 30 mlWhite vinegar
  • 45 mlFresh lemon juice (about 1–2 lemons, to taste)
  • 360 mlWater (plus a little more if needed)

🔄 Substitutions

  • Ground dried lime (limoo amani powder)→ Finely grated lime zest (1 tsp) + extra lemon juice (15–30 ml)
  • White vinegar→ Apple cider vinegar
  • Fresh tomatoes→ Canned crushed tomatoes (500 g)

Instructions

  1. 1

    Prepare the fish: pat pieces very dry. Season with 3 g salt, 1/2 tsp black pepper, and 1/2 tsp turmeric. If using flour, dust lightly with 15 g flour and shake off excess. Rest 10 minutes at room temperature while you start the stew base.

  2. 2

    Build the base: heat 45 ml olive oil in a wide pot over medium heat. Add onion and cook 10–12 minutes, stirring, until soft and light golden. Add garlic and cook 60–90 seconds until fragrant, keeping heat moderate so the garlic does not brown.

  3. 3

    Cook the tomatoes: stir in grated tomatoes and tomato paste. Cook 8–10 minutes over medium-high, stirring often, until the mixture darkens slightly and the oil begins to separate at the edges. Add dried thyme, remaining 1/2 tsp turmeric, and remaining 1/2 tsp black pepper; cook 30 seconds.

  4. 4

    Season sour and sweet: add ground dried lime, sugar, vinegar, lemon juice, remaining 3 g salt, and 360 ml water. Bring to a gentle boil, then reduce to low and simmer uncovered 15 minutes, stirring occasionally, until lightly thickened and glossy. Taste; it should be pleasantly tart but balanced.

  5. 5

    Sear the fish (recommended): heat remaining 15 ml olive oil in a nonstick skillet over medium-high. Sear fish in a single layer for 60–90 seconds per side, just until lightly golden (not cooked through). Transfer immediately to a plate; this helps the fish stay intact during simmering.

  6. 6

    Poach gently: slide fish into the simmering sauce in one layer. Reduce heat to the lowest setting so the surface barely trembles. Cover and cook 8–10 minutes, depending on thickness, until the fish flakes easily and reaches 63°C/145°F in the center. Avoid stirring; gently shake the pot instead.

  7. 7

    Finish and adjust: turn off heat and rest covered 5 minutes. Taste the sauce and adjust with up to 1 tsp more ground dried lime for deeper tang, 5–10 ml more lemon juice for brightness, or 2–4 g more sugar if overly sharp. Serve hot with saffron basmati rice.

🪪 Recipe Passport

Origin: Persian Cuisine
Researched by: Zaffaron Kitchen
Published: March 17, 2026

Cultural Background

Sour fish stews are associated with Iran’s southern coastal cooking, where seafood and bright, acidic flavors are common. Dried limes are a hallmark ingredient in many Persian stews, valued for their distinctive tart, slightly earthy aroma. This dish is often served with rice to balance the lively sauce.

Regional Variations

Bushehr and Persian Gulf coast: Often kept boldly sour with extra citrus and served with plenty of fresh herbs; some cooks use very firm local fish and keep the sauce relatively thin for spooning over rice.
Hormozgan (Bandar-style): May lean more aromatic with additional dried herbs and a slightly sweeter balance to round the acidity, especially when tomatoes are very tart.

Researched from multiple sources and validated by the Zaffaron editorial team. Every recipe is tested for accuracy, measurements, and cultural authenticity.

Share:

Nutrition per serving

320
Calories
34g
Protein
14g
Fat
16g
Carbs
3g
Fiber
720mg
Sodium

Pairs well with

If you enjoyed this recipe, here are a few related Zaffaron recipes to try next.

Does your family make this differently?

Every family has their own version. Maybe your grandmother adds a secret ingredient, or your aunt has a completely different technique. Preserve your family's version — with their name on it, forever.

You Might Also Like

Reviews

—
Rated 0.0 out of 5 stars
0 reviews

Cooked this recipe?

Tap the stars to rate it — that's all it takes. A few words are welcome but optional.

Please sign in to rate this recipe.
Rated 0.0 out of 5 stars

No ratings yet. Cooked this one? Be the first to rate it — it takes one tap.