Melt the butter in a large pot over medium heat. Add the diced onion and cook for 3 minutes until it softens.
Stir in the minced garlic and grated ginger. Cook for 1 minute until fragrant.
Add the garam masala, cumin, turmeric, and chili powder. Stir for 30 seconds to toast the spices.
Add the chicken pieces and salt. Cook for 5 minutes, stirring occasionally, until the chicken is lightly browned on the outside.
Pour in the tomato sauce and chicken broth. Bring the mixture to a simmer.
Stir in the rinsed basmati rice. Reduce the heat to low, cover the pot, and cook for 18 minutes without lifting the lid.
Remove the pot from the heat. Stir in the heavy cream until the sauce turns smooth and creamy.
Let the dish rest covered for 5 minutes. Fluff the rice gently with a fork before serving with chopped cilantro on top.