Wash the fish and pat very dry. Cut the fish into 2-inch pieces.
Heat a medium saucepan over medium heat and swirl in the oil. When the oil is heated, add the onion, ginger and garlic. Turn the heat to medium-low and let the aromatics cook slowly. Saute until very fragrant, about 5 minutes. Take care not to let it burn!
Add the tomato and saute for another 3 minutes, stirring frequently. Use your spatula and smash the tomatoes a bit, to break them up.
Add the garam masala, chili powder, salt and pepper. Stir to combine and cook for 2 minutes. This is the masala (spice base).
Turn the heat to medium-high. Pour in the coconut milk and the water. Add in the chili pepper if using. When the mixture comes to a good boil, add in the fish and cook for 4 minutes or so, until the fish is cooked through.