Prep the beef: Pat the steak cubes dry with paper towels. Season with salt and pepper.
Dry meat browns better and builds flavor.
Brown in batches: Heat a large Dutch oven over medium-high heat. Add 1 tablespoon oil and half the beef. Sear until deeply browned on two sides, 5–7 minutes.
Transfer to a plate and repeat with remaining beef and oil.
Sauté aromatics: Reduce heat to medium. Add onion, bell pepper, and jalapeño. Cook 4–5 minutes, stirring, until softened.
Add garlic and cook 30 seconds until fragrant.
Bloom spices: Stir in chili powder, cumin, smoked paprika, oregano, coriander, and cocoa powder. Cook 30–45 seconds to wake up the spices.
Deglaze and combine: Add tomato paste and cook 1 minute. Pour in beef broth, scraping up browned bits.
Stir in diced tomatoes, chipotle, and adobo sauce if using.
Return beef to the pot: Add seared steak and any juices, along with diced zucchini if using. Bring to a gentle simmer.
Simmer low and slow: Cover partially and simmer on low for 60–90 minutes, stirring occasionally, until the beef is tender. Add water or more broth if it gets too thick.
Finish and balance: Stir in apple cider vinegar and butter if using.
Taste and adjust salt, pepper, and heat. A little vinegar brightens the whole pot.
Serve: Ladle into bowls. Top with sour cream, shredded cheese, avocado, cilantro, and a squeeze of lime.
Keep toppings keto-friendly.