Heat oil in a 12-inch satué pan over medium. Add onion and 1 teaspoon salt; cook until softened and starting to brown, 8–10 minutes, stirring occasionally.
Reduce heat to medium-low and add garlic, serrano, and ginger; cook stirring frequently until onions are softened and golden brown, about 7 minutes. Stir in garam masala, cumin, and cardamom; cook 1 minute.
Add tomatoes with juices, crushing them with your hands as you add them (or use your kitchen shears to cut them in the can). Bring sauce to a boil, reduce heat, and simmer, stirring frequently and scraping up browned bits from bottom of pan, until thickened and deep in color, 15–20 minutes.
Add coconut milk and simmer until thickened, 5–7 minutes. Use as desired.