Heat oil and butter in a small frying pan or wok over medium high heat. Add onion and stir fry until browned, 10 to 15 minutes. (Note: This is an important step; if onion is not cooked well, sauce will taste funny.)
Add ginger and garlic to onion and cook for an additional 2 minutes. Blend onion, ginger and garlic in food processor until smooth. Do not rinse food processor.
Place onion mixture in a large saucepan. Stir in the cinnamon, black pepper, coriander, cumin, turmeric and cayenne pepper, and cook over low heat until mixture is thick and has the consistency of a paste.
Purée tomatoes, chillies and coriander in food processor until smooth. Add to onion mixture and stir well over low heat, until most of the liquid has evaporated. Gradually add yoghurt, stirring constantly to avoid curdling.
Purée the mixture in the food processor for a velvety smooth sauce. Return to saucepan, add water and increase heat to high; bring sauce to a gentle boil. Cover saucepan and boil for 3 to 5 minutes. Reduce heat and simmer until desired consistency is reached.
This sauce can be served with meat, vegetables or a combination of both. To serve with meat, add pre-cooked meat of your choice and simmer for 5 to 10 minutes in the sauce before serving over basmati rice or with naan bread.
To serve with vegetables, steam raw veggies first for 4 to 5 minutes, then simmer for 5 to 10 minutes in the sauce before serving.