To begin, wash the basmati rice thoroughly and soak it in water for 20-30 minutes. Bring a large pot of water to a boil, adding a pinch of salt, cardamom pods, cloves, cinnamon, and a bay leaf. Drain the soaked rice and add it to the boiling water. Cook the rice until its 70-80% done, still slightly firm, and then drain. Set aside.
In a large bowl, combine yogurt, ginger-garlic paste, turmeric, red chili powder, cumin powder, and salt. If using meat, add chicken or lamb, ensuring it's coated evenly in the marinade. For vegetables, use potatoes, carrots, and peas. Marinate for at least 30 minutes to let the flavours develop.
In a heavy-bottomed pan, heat 2 tablespoons of ghee or oil over medium heat. Add the sliced onions and sauté until golden brown and caramelized, about 10-12 minutes. Remove half of the onions and set them aside for garnish later.
To the remaining onions, add the chopped tomatoes and cook until soft and blended with the onions. Stir in the marinated meat or vegetables, cooking for 10-15 minutes until the meat is browned or the vegetables are tender.
Add garam masala to the mixture and stir well. If using saffron, soak it in warm milk for a few minutes and set aside. In a deep pot, start layering the rice and meat/vegetable mixture. Begin with a layer of rice, followed by the meat or vegetables, and continue layering. Pour the saffron milk over the top if using.
Cover the pot with a tight-fitting lid or seal it with aluminium foil. Reduce the heat to low and let the biryani cook on “dum” (slow steam) for 25-30 minutes. This method helps the flavours infuse into the rice and meat.
Once done, carefully remove the lid and check if the rice is tender and the meat is fully cooked. The saffron and spices should have infused the dish with vibrant colours and flavours.
Gently fluff the biryani with a fork, being careful not to break the rice grains. Garnish with the reserved fried onions, fresh cilantro, and mint leaves. Serve with raita (yogurt sauce) or a fresh salad for a complete meal.