Heat the olive oil in a large, heavy-bottomed pot over medium heat. Add the diced onion first and stir it around for about 1 minute to start softening. Then add the minced garlic, stirring often so it doesn’t burn.
Cook together for 2–3 minutes until the onion looks translucent and the garlic smells fragrant. This step builds the flavor foundation for the entire soup.
Add the carrots, celery, zucchini, and red bell pepper to the pot. Stir to coat them in the oil and aromatics.
Let them cook for about 5 minutes, stirring every so often so they soften slightly but still hold their shape. You’ll notice the colors brighten and the vegetables start to release their natural sweetness.
Pour in the can of diced tomatoes (with all their juices) and the vegetable broth. Give everything a good stir to combine. Sprinkle in the dried oregano, dried basil, dried thyme, salt, and pepper.
Turn the heat up just enough to bring the soup to a gentle boil - this helps the dried herbs release their flavor into the broth.
Once boiling, reduce the heat to low so the soup is just simmering. Let it cook for 10 minutes without a lid, which allows the flavors to meld and the broth to become richer.
Stir once or twice during this time to keep everything cooking evenly.
Stir in the white beans and pasta. Keep the soup at a gentle simmer and cook for about 10 minutes more, or until the pasta is just al dente.
Stir occasionally to prevent the pasta from sticking together or settling at the bottom. If the soup starts to get too thick, you can add a splash of extra broth or water.
Once the pasta is cooked, add the spinach or kale. Stir gently and let the greens wilt for about 2 minutes. They should turn a vibrant green and become tender without overcooking.
Taste the soup and adjust the seasoning if needed by adding more salt or pepper. Ladle the soup into bowls while it’s piping hot.
Garnish each serving with fresh basil (or parsley) and a sprinkle of Parmesan cheese if desired. Serve right away for the best flavor.