Preheat and prep: Set a large heavy pot or Dutch oven over medium-high heat.
Have all ingredients diced and ready.
Brown the beef: Add olive oil, then the ground beef. Break it up with a spoon and cook until well browned with crispy edges, about 6–8 minutes. Don’t rush browning—color equals flavor.
Drain if needed: If there’s excess fat, drain most of it, leaving about a tablespoon for flavor.
Sauté aromatics: Add onion, red bell pepper, and a pinch of salt. Cook 4–5 minutes until softened.
Stir in garlic and cook 30 seconds until fragrant.
Bloom the spices: Add chili powder, cumin, smoked paprika, coriander, oregano, and cocoa powder. Stir 30–60 seconds to toast the spices. This deepens the flavor.
Build the base: Stir in tomato paste, then add crushed tomatoes, diced tomatoes, and beef broth.
Add bay leaf if using. Bring to a gentle boil.
Simmer: Reduce heat to low and simmer uncovered 20–25 minutes, stirring occasionally. The chili should thicken and the flavors will meld.
Add beans: Stir in kidney and black beans.
Simmer another 10–15 minutes. If it’s too thick, add a splash of broth or water; if too thin, simmer a bit longer.
Season and finish: Taste and season with salt, black pepper, and cayenne or red pepper flakes if you want extra heat. Squeeze in half a lime for brightness, then adjust to taste.
Serve: Ladle into bowls and top with Greek yogurt or cheese, cilantro, green onions, and avocado if desired.