Marinate the chicken. In a bowl, combine yogurt, lemon juice, garlic, ginger, garam masala, cumin, coriander, paprika, chili powder, and salt. Add chicken and coat well. Let it sit at least 20–30 minutes (or up to overnight in the fridge).
Sear the chicken. Heat oil in a large skillet over medium-high.
Shake off excess marinade and add chicken in a single layer. Sear 3–4 minutes per side until lightly browned. Don’t crowd the pan—work in batches if needed.
Transfer to a plate; it doesn’t need to be fully cooked yet.
Build the sauce base. Lower heat to medium. Add butter to the same pan. Stir in onion with a pinch of salt and cook 5–7 minutes until soft and golden, scraping up browned bits.
Add tomatoes and simmer. Pour in tomato puree and a splash of water if it’s very thick.
Simmer 8–10 minutes, stirring occasionally, until slightly reduced and the raw tomato smell mellows.
Balance and spice. Taste the sauce. Add honey or sugar to round out acidity. Adjust salt.
If you want more heat, add a pinch more chili powder.
Finish cooking the chicken. Return the seared chicken (and juices) to the pan. Simmer 6–8 minutes, stirring occasionally, until the chicken is cooked through and tender.
Make it buttery and silky. Stir in cream and an extra pat of butter if you like. Simmer 1–2 minutes more.
The sauce should be smooth, rich, and lightly thickened.
Garnish and serve. Top with chopped cilantro. Serve hot with basmati rice or naan. For extra shine, add a small swirl of cream on top.