Warm the pot: Heat the olive oil in a large soup pot over medium heat. When it shimmers, add onion, carrots, and celery.
Cook 6–8 minutes, stirring occasionally, until softened and lightly golden.
Build the flavor base: Stir in garlic and tomato paste. Cook 1–2 minutes until the paste darkens slightly and smells sweet. Add oregano, thyme, and red pepper flakes, and stir for 30 seconds.
Add beans and tomatoes: Pour in the cannellini beans and diced tomatoes with their juices.
Stir to coat everything in the aromatics.
Simmer: Add the vegetable broth, rosemary, and bay leaf. Bring to a boil, then reduce to a gentle simmer. Cook uncovered for 20–25 minutes to let the flavors meld.
Thicken slightly: For a creamier texture, use a potato masher to mash a few scoops of beans right in the pot, or blend 1–2 cups of soup with an immersion blender and return it.
Keep it rustic—don’t over-blend.
Add greens: Stir in the kale and simmer 5–7 minutes, until tender. If using spinach, add in the last 2–3 minutes.
Finish and season: Remove rosemary and bay leaf. Stir in lemon juice or vinegar.
Taste and season generously with salt and pepper. A drizzle of olive oil on top adds a lovely finish.
Serve: Ladle into bowls and top with parsley or vegan Parmesan if you like. Add crusty bread for dipping.