Heat oil over medium heat and cook onions with 1 tsp salt until very soft and deep golden brown, about 20 minutes (don't rush this step, it's important for the flavour).
Add garlic, ginger and chillies and cook 1-2 minutes, until fragrant.
Add the Spices
Stir in garam masala, coriander, cayenne, cinnamon and cardamom pods and cook a minute more.
Add Wet Ingredients
Add tomato puree, almond butter and 1/2 cup of the water water plus remaining 1 tsp salt; cook until oil starts to bubble up and shimmer on top.
Cook the Chicken
Stir in chicken; cook, covered, about 10 minutes or until cooked through. Stir frequently and add a little more water if needed to prevent scorching. Note that the chicken will release moisture as it cooks so don't add more unless it really needs it.
Finish and Serve
Stir in the yogurt and cream. Simmer on low heat for a few minutes to meld the flavors. Taste and add more salt and/or garam masala if needed. Top with cilantro.
Video
Notes
For smooth sauce: For a smooth, creamy sauce, remove cooked chicken from the curry and transfer to a plate. Use an immersion blender to puree the sauce and then add the chicken back. For thicker sauce: Remove the chicken once cooked and simmer the sauce on low heat, stirring frequently, until reduced to your desired thickness.
Notethat commercially-frozen chicken breasts are often plumped up with salt water. This keeps them tender but also causes them to release more water.
For thinner sauce: Add a splash of water or cream until it reaches the consistency you like.
Variations
Dairy-Free Korma: Replace the heavy cream with coconut milk and the yogurt for coconut yogurt.
Spice Level: Add more chili peppers or cayenne pepper for an extra kick of heat or omit the cayenne for a mild version.