Melt butter in oil in a 4.5 Dutch oven (or larger) over medium heat. Add onions and carrots and cook for 6 minutes. Add bell peppers, ginger, garlic and all spices/seasonings (up to tomatoes) and cook for 2 minutes.: The first breaths of the recipe are aromatic and comforting, with the gentle hiss as the butter and olive oil begin to warm. You should notice a soft shimmer on the oil surface and a rich, nutty aroma from the butter. This mixed fat base raises the smoke point while imparting richness, which helps the spices bloom without burning. Watch the pan carefully, because if it gets too hot the fats will brown and add a bitter note. If that happens, lower the heat and wipe the pan out gently before continuing to avoid those burnt flavors carrying forward.
Stir in all remaining ingredients up to 'add later.' Cover and bring to a boil. Once boiling, reduce to a gentle simmer over low. Cook, covered, for 15 minutes, stirring halfway through and recovering the pot. After 15 minutes, stir in sweet potatoes, cover and cook for an additional 15 minutes, stirring halfway through.: As the onion and carrots soften, they release a sweet, savory scent that becomes the backbone of the curry. You want the onion translucent and the carrots beginning to yield, not browned. The gentle softening allows the natural sugars to emerge, balancing the spices and tomatoes later. A common mistake is rushing this step with too-high heat, which can char the onion edges; keep it steady and stir occasionally so everything sweats evenly.
Add the cauliflower and simmer, UNCOVERED, for an additional 5-10 minutes, stirring occasionally, OR until the lentils and potatoes are tender and the curry is thick and creamy. If the curry is too thick, add some broth, if the curry is too thin, continue to simmer uncovered until thickened.: At this moment the pan becomes intensely aromatic, with sharpness from the freshly grated ginger and pungency from the minced garlic . The spices should sizzle softly as they bloom, releasing essential oils that deepen flavor. You will notice the fragrance intensify quickly, which signals that the spice flavors are activating. Avoid leaving them unattended, because burning the garlic or spices in these two minutes can make the whole pot taste acrid. Stir continuously and lower heat if the mixture starts to smoke.
Stir in the cilantro. Taste and season with additional salt, cayenne or sugar to taste (I like 1/4 tsp more salt and 1/2 tsp more sugar). Serve over basmati rice with a dollop of yogurt.: When you add the canned crushed tomatoes , fire roasted diced tomatoes , dried lentils , coconut milk , and broth , the pot will look dense and colorful, and a gentle simmer will form small bubbles around the edges as it approaches a boil. This stage is about marrying liquid and solids so the lentils start absorbing flavor. Bringing to a boil under a lid speeds the process, but watch so it does not boil over. If it begins to sputter aggressively, lift the lid to regulate and reduce boiling to a gentle bubble.
Once boiling, reduce to a gentle simmer over low.: The shift to a gentle simmer is where the texture begins to develop, with the surface showing occasional small bubbles and the pot emitting a deeper, more rounded aroma. This low heat lets the lentils cook evenly without breaking apart prematurely, so they thicken the sauce naturally. Maintain a low simmer to avoid violent bubbling, which can break apart the lentils and make the curry gluey. If you see vigorous movement, lower the heat and reposition the lid slightly to control evaporation.
Cook, covered, for 15 minutes, stirring halfway through and recovering the pot.: During this covered simmer the lentils will absorb much of the liquid and begin to swell, releasing a starchy quality that thickens the curry. The aroma will shift toward a rounded, melded scent. Stirring halfway prevents sticking to the bottom and ensures even cooking. A common oversight is skipping the stir, which can lead to unevenly cooked lentils or scorching on the pot bottom, so use a gentle hand and check the texture when you stir.
After 15 minutes, stir in sweet potatoes, cover and cook for an additional 15 minutes, stirring halfway through.: Adding the cubed sweet potatoes at this point ensures they cook through without disintegrating. The mixture will look thicker as the lentils have absorbed liquid, and the sweet potatoes will soften to a tender, creamy texture in the allotted time. You should hear a soft simmer and see glossy, plump lentils and potato edges turning translucent. If the sweet potatoes seem underdone after the time, continue simmering gently; if they break apart too much, you likely cut them too small.
Add the cauliflower and simmer, UNCOVERED, for an additional 5-10 minutes, stirring occasionally, OR until the lentils and potatoes are tender and the curry is thick and creamy.: Uncovering allows excess liquid to evaporate, concentrating flavor and encouraging the sauce to thicken. Adding the cauliflower late preserves its texture, giving tender florets that still hold shape. You should see the sauce reduce slightly, becoming glossy and coat the back of a spoon. If the curry is too thick, stir in small amounts of broth ; if too thin, continue simmering uncovered. Avoid covering too soon, or the curry may retain too much liquid and become soupy.
If the curry is too thick, add some broth, if the curry is too thin, continue to simmer uncovered until thickened.: The texture adjustments are about control and patience, not dramatic corrections. When you add broth in small splashes, the sauce loosens without losing depth, whereas continued uncovered simmering intensifies flavors and thickens gradually. Taste as you adjust because each addition of liquid dilutes seasoning; correct salt and sugar after textural changes. Overcorrecting by adding a lot of liquid will extend cooking time and can flatten flavors.
Stir in the cilantro.: Finely chopped cilantro added at the end brings a bright, herbaceous finish that lifts the warm spices. You'll notice a fresh, slightly citrusy scent that contrasts with the creamy base. Stir it in gently to preserve color and aroma. Adding cilantro too early causes it to wilt and lose its vibrant flavor, so reserve it for this final stage.
Taste and season with additional salt, cayenne or sugar to taste (I like 1/4 tsp more salt and 1/2 tsp more sugar).: Final seasoning is where the dish comes together. The curry should have a balanced interplay of heat, sweet, savory, and acidic notes. I recommend tasting a spoonful and adjusting incrementally, because small changes make big differences. Over-salting or over-sweetening is difficult to reverse, so add cautiously and allow a minute for flavors to meld before re-tasting.
Serve over basmati rice with a dollop of yogurt.: Serving the warm curry over fluffy basmati rice and topping with a spoonful of plain yogurt provides textural and temperature contrast, with the cooling tang of yogurt mellowing the spices. The rice soaks up the saucy curry and makes for a satisfying bite. If plating for guests, garnish with extra cilantro for color. A common plating mistake is serving while the curry is piping hot without allowing a moment for flavors to settle; letting it rest briefly improves the eating experience.