Heat oil in a large skillet over medium-high heat. Add chicken and cook until browned on all sides. Remove and set aside.
In the same pan, melt the butter. Add onion and cook until soft, about 3–4 minutes.
Stir in garlic and ginger. Cook for 1 minute until fragrant.
Add all the spices: garam masala, cumin, turmeric, paprika, cayenne (if using), salt, and pepper. Stir for 30 seconds.
Pour in the tomato puree and bring to a simmer. Cook for 10 minutes, stirring occasionally.
Add the cream and yogurt. Stir until smooth and simmer for another 5 minutes.
Return the chicken to the pan. Let everything bubble gently together for 5–7 minutes until chicken is cooked through and tender.
Serve hot with rice or naan. Sprinkle with fresh cilantro if you’re feeling fancy.