Heat olive oil in a large pot or Dutch oven over medium heat. Add onion and bell peppers and cook until softened, about 5-7 minutes.
Add garlic and cook for 1 minute more until fragrant.
Add ground beef and cook, breaking it up with a spoon, until browned. Drain off any excess grease.
Stir in chili powder, cumin, smoked paprika, oregano, cayenne pepper (if using), salt, and black pepper. Cook for 1 minute, stirring constantly, until fragrant.
Pour in crushed tomatoes, rinsed beans, and beef broth. Stir to combine.
Bring the chili to a simmer, then reduce heat to low, cover, and cook for at least 30 minutes, or up to 1 hour, stirring occasionally. The longer it simmers, the more the flavors will meld.
Taste and adjust seasonings as needed.
Serve hot with your favorite toppings.
Notes
For a vegetarian chili, omit the ground beef and add an extra can of beans or some diced sweet potato.
This chili freezes well. Let it cool completely, then store in airtight containers for up to 3 months.
You can customize the beans to your preference. Use any combination of kidney, black, pinto, or even cannellini beans.
If you enjoy a thicker chili, simmer uncovered for the last 15-20 minutes of cooking.