Prep the base: Heat the oil in a large skillet or Dutch oven over medium heat. Add the chopped onion and a pinch of salt. Cook, stirring often, until soft and lightly golden, about 8–10 minutes.
Bloom aromatics: Add the garlic and ginger.
Cook for 1 minute until fragrant, being careful not to let them burn.
Toast the spices: Sprinkle in cumin, coriander, turmeric, and chili powder. Stir for 30–45 seconds. This wakes up the spices and builds flavor right away.
Tomato depth: Add the tomato paste and cook for 1–2 minutes, stirring to caramelize it slightly.
If using crushed tomatoes, simmer them for 3–4 minutes to reduce a bit.
Brown the chicken: Add the chicken pieces with a pinch of salt and pepper. Stir to coat in the spice mixture and cook for 3–4 minutes until the outside loses its raw color.
Build the sauce: Pour in 1 cup broth and bring to a gentle simmer. Reduce heat to medium-low, cover partly, and cook for 12–15 minutes, stirring occasionally.
Add more broth if it looks dry.
Finish creamy: Stir in the cream or coconut milk and the garam masala. Simmer uncovered for another 3–5 minutes until the sauce thickens and the chicken is tender. Taste and adjust with salt, pepper, and a pinch of sugar if it needs balance.
Garnish and serve: Turn off the heat, rest for 2 minutes, then garnish with chopped cilantro.
Serve hot with rice or naan.