Cut the tofu into cubes (or substitute protein of choice here).
Add 1 tablespoon vegetable oil to a large nonstick skillet and heat over medium heat. Add the tofu in a single layer. Cook for about 8-10 minutes until golden brown. Move the tofu to a bowl and place the pan back on the stove.
Add an additional 2 tablespoons oil to the pan and heat over medium-high heat. When hot, put in the cardamom, cumin seeds, cinnamon stick, and bay leaves. Stir for 1 minute to allow flavors to develop, then add the onions, garlic, and ginger. Reduce heat to medium and cook until onions start turning brown, about 10 minutes.
Add the tomatoes, salt, and cayenne. Reduce heat to medium-low, cover, and simmer for 20 minutes, stirring occasionally.
Remove cover and add garam masala, yogurt, and cream. Stir gently for about 5 minutes to reduce the liquid. Remove the cardamom pods, cinnamon stick, and bay leaves before serving. Serve with basmati rice or naan.