The first time I ate doi maach, it was Pohela Boishakh — Bengali New Year — at the home of a friend in Kolkata whose grandmother still supervised the kitchen from a stool by the door. The table held the full festive spread, but the dish everyone went quiet for was a pale, still-steaming bowl of fish in a gravy the colour of fresh cream. I had expected something sharp or fiery; instead it was gentle, faintly sweet, scented with cardamom, and so smooth I went back for a second steak before I had finished the first. This doi maach recipe is my attempt to honour that bowl: big fish steaks poached in a yogurt gravy that stays silk from the first spoonful to the last.
Doi means yogurt, maach means fish, and in this dish the yogurt is not a supporting player — it is the gravy itself. That sets doi maach apart from its festive cousins. Macher kalia is dark and swaggering, built on onions cooked down to mahogany; a weekday macher jhol is thin and brothy. Doi maach is the calm one: no turmeric-red oil slick, no heavy masala crust, just lightly fried fish finished in a pale, lightly spiced yogurt sauce with a whisper of ghee and garam masala at the end. It is the fish curry Bengali families serve at weddings and New Year lunches because it feels luxurious without shouting — a good doi maach recipe tastes like the cook was completely unhurried.
Why This Doi Maach Recipe Works
Everyone who has made a yogurt curry has one fear: the moment the yogurt hits hot liquid, it can split into grainy curds and whey. This doi maach recipe is built around five habits that make that disaster essentially impossible:
- The yogurt starts at room temperature, never fridge-cold. Cold yogurt meeting hot gravy is the single most common cause of splitting — the temperature shock seizes the proteins. Half an hour on the counter first closes most of that gap.
- It is whisked completely smooth, with a little salt and sugar, before it goes anywhere near the pan. A bowl of yogurt beaten until it pours like double cream has no lumps left to curdle unevenly, and the salt and sugar season it so the gravy tastes rounded rather than raw and tangy.
- The gravy is tempered like a custard. Instead of tipping cold yogurt into the pan, you stir a few spoonfuls of the warm onion-spice mixture into the bowl first, raising the yogurt’s temperature gradually. By the time it joins the pan, it has nothing left to be shocked by.
- The pan comes off the heat and the gravy never boils again. Once the yogurt is in, the curry stays at the barest simmer — lazy bubbles at the edges, nothing more. A rolling boil will break even well-tempered yogurt; a gentle poach keeps it glossy and unified, and it is all the heat the fish needs.
- The fish is marinated and lightly fried first, so it can take a gentle poach. A turmeric-and-salt rub and a quick fry give the steaks a delicate golden skin. That skin protects the flesh in the gravy, lends the sauce its faint colour, and means the fish needs only minutes to finish — no long boiling, no broken steaks.
Ingredients
The classic fish for this dish is rohu, the great river carp of Bengal, cut into thick steaks on the bone — the bone keeps each piece moist and flavours the gravy as it poaches. In the US, look for rohu or katla at South Asian fish counters; otherwise salmon, king fish (surmai) or thick halibut steaks all behave beautifully. The other non-negotiable is plain, full-fat yogurt — nothing flavoured, nothing low-fat, because lean yogurt splits more readily and gives a thin, sharp gravy. Everything else is a short, gentle list — a dish of restraint, with the spice count kept deliberately low so the fish and yogurt can be tasted.
Serves 4
For the fish:
- 1 1/2 pounds rohu steaks on the bone, about 1 inch thick (or salmon or king fish steaks)
- 1 teaspoon salt
- 1 teaspoon ground turmeric
- 2 tablespoons mustard oil (or neutral oil), for frying
For the yogurt gravy:
- 1 1/2 cups plain full-fat yogurt, at room temperature
- 1/2 teaspoon salt, plus more to taste
- 1 teaspoon sugar
- 2 tablespoons mustard oil (or neutral oil)
- 1 large yellow onion, blended to a completely smooth paste (about 1 cup)
- 1 tablespoon ginger paste
- 2 bay leaves
- 4 whole cloves
- 1 cinnamon stick (about 2 inches)
- 4 green cardamom pods, cracked lightly
- 1/2 teaspoon ground turmeric
- 4 whole green chillies, slit lengthwise
- 3/4 cup warm water, plus more as needed
- 1/2 teaspoon Kashmiri red chilli powder (for warmth, not fire)
For the finish:
- 1 tablespoon ghee
- 1/2 teaspoon Bengali garam masala (or a pinch each of ground cardamom, cinnamon and clove)
- 1 teaspoon lemon juice (optional)
How to Make This Doi Maach Recipe – Step by Step
Step 1: Season the fish and bring the yogurt out. Pat the fish steaks dry, rub them all over with the salt and turmeric, and set them aside for 15 minutes. At the same time, measure the yogurt into a bowl and leave it on the counter — this is the quiet head start the whole dish depends on. When you are ready to cook, whisk the yogurt with the 1/2 teaspoon salt and the sugar until it is completely smooth and pourable, with no lumps. If it is very thick, whisk in a spoonful of warm water.
Step 2: Fry the steaks lightly until just golden. Heat the 2 tablespoons of mustard oil in a wide pan over medium-high heat until it shimmers and its raw smell softens. Lay the steaks in a single layer and fry for about 2 minutes per side — you are looking for a pale golden skin, not a deep crust. This is not kalia; the fish should look gently coloured, with the flesh still translucent in the middle. Lift the steaks onto a plate and keep every drop of the frying oil in the pan.
Step 3: Build the onion-spice base. In the same pan, add the remaining 2 tablespoons of oil and drop in the bay leaves, cardamom, cinnamon and cloves; let them sizzle for 30 seconds until fragrant. Add the onion paste and cook over medium heat, stirring often, for 8 to 10 minutes — the paste will dry, deepen to a light gold, and start to smell sweet rather than raw. Stir in the ginger paste, turmeric and chilli powder and cook for 1 minute more. Pour in the warm water and stir it into a loose gravy, then simmer for 3 to 4 minutes, until the oil shines around the edges. Taste and adjust the salt.
Step 4: Temper the yogurt and marry it to the gravy. Take the pan off the heat entirely and let it sit for a full minute — this pause matters. Spoon 3 or 4 tablespoons of the warm gravy into the whisked yogurt, stirring as you go, until the bowl feels warm. Now pour the tempered yogurt into the pan in a slow stream, stirring the gravy constantly in one direction. Return the pan to the lowest possible heat and stir for 2 to 3 minutes while the sauce thickens slightly and turns glossy. From this moment the gravy must never boil: an occasional lazy bubble at the edge is the most you want to see.
Step 5: Poach the fish, rest it, and finish with ghee. Slide the fried steaks into the gravy along with the slit green chillies, spooning sauce over the tops. Cover and poach on the lowest heat for 6 to 8 minutes, until the fish flakes at the thickest part — turn the steaks once, gently, halfway through. Switch off the heat and rest the pan, covered, for 10 minutes; the fish drinks in the gravy as it sits and the sauce settles into silk. Just before serving, warm the ghee until it melts, stir in the garam masala, and drizzle the whole perfumed spoonful over the doi maach. A few drops of lemon juice at the table brighten it for those who want it.
Serving Suggestions
This doi maach recipe belongs over plain steamed white rice — nothing flavoured, nothing fried — because the pale gravy is the whole event and it needs a blank, steaming canvas. In Kolkata the fish is served from the pan it cooked in, the steaks arranged in a layer with plenty of sauce spooned over, and a bowl of gravy alongside for the rice-soakers. A simple cucumber and onion salad with lemon is the only accompaniment that feels right.
For a full Bengali festive spread, doi maach sits at the gentle end of a glorious spectrum. Set it beside my macher kalia and the contrast is the whole story of Bengali celebration cooking: kalia dark, onion-heavy and unapologetic, doi maach pale, soft-spoken and creamy, both starting from the same river fish. My ilish bhapa completes the trio — hilsa steamed in a sharp mustard bath — and a meal built around the three, with plain rice and a mishti doi to finish, is as close to a Kolkata wedding lunch as a home kitchen gets.
Storage and Reheating
Leftovers from this doi maach recipe keep in the fridge for up to 2 days, and like most yogurt curries it tastes rounder the next day, once the fish has spent a night in the sauce. Store it in a covered container with the steaks submerged in gravy so they do not dry out. I do not recommend freezing this one: yogurt sauces turn grainy and separate as they thaw, and the fish loses its delicate texture.
Reheating is where yogurt gravies go to die, so go slowly. Warm the curry in a pan over the lowest heat you have, stirring gently, and take it off the moment it is steaming — never let it reach a bubble. A splash of warm water loosens a sauce that has thickened overnight. Alternatively, set the covered dish in a larger pan of simmering water and let the gentle bath do the work. The microwave is a last resort: use half power, in short bursts, with a stir in between.
Frequently Asked Questions
My yogurt split anyway. Can the gravy be saved?
Yes, usually. Take the pan off the heat at once and whisk the sauce briskly for a minute — a slightly split gravy often comes back together as it cools slightly. For a badly curdled one, blend a teaspoon of cornstarch with two tablespoons of warm water, stir it in, and warm gently without boiling; the starch re-binds the sauce. The flavour is unaffected either way. Next time, check the three usual culprits: cold yogurt, untempered yogurt, or a gravy allowed to boil.
Can I use Greek yogurt for this doi maach recipe?
You can, and its thickness makes it quite split-resistant, but whisk it with 2 to 3 tablespoons of warm water first to bring it to a pouring consistency, and expect a slightly tangier result. What you should avoid is low-fat or fat-free yogurt of any kind — the leaner the yogurt, the more eagerly it curdles and the thinner the gravy tastes. Full-fat plain yogurt, dahi-style if you can find it, is the authentic and the safest choice.
Which fish works best if I cannot find rohu?
Any firm fish sold as steaks or thick fillets. Salmon steaks are the easiest US substitute and poach beautifully; king fish (surmai) is closer to the original in flavour and firmness, and halibut or cod steaks work well too. Whatever you choose, keep the pieces large and thick — thin fillets overcook in the poach and break apart. Boneless is fine, but steaks on the bone give the gravy more body.
Can I skip frying the fish and poach it raw?
You can, and some Bengali homes do exactly that for a lighter, weekday version. The raw fish goes straight into the tempered yogurt gravy and poaches for a few minutes longer. The result is softer and paler, and the gravy stays whiter — pleasant, but a different dish: you lose the faint golden skin, the steaks are more fragile, and the sauce misses the depth the frying oil carries. For guests and festivals, fry. For a quiet Tuesday, poaching raw is a respectable shortcut.
Recipe Summary
- Prep time: 20 minutes, plus 30 minutes bringing the yogurt to room temperature
- Cook time: 30 minutes
- Total time: About 50 minutes, plus resting
- Servings: 4
- Cuisine: Pakistani
- Course: Main Course
