Prep the vegetables: Dice the onion, carrot, and celery.
Mince the garlic. Strip the kale leaves from their stems and chop into bite-size pieces. Rinse the beans.
Sauté the aromatics: Warm 2 tablespoons olive oil in a large pot over medium heat.
Add onion, carrot, and celery with a pinch of salt. Cook, stirring, until softened and lightly golden, about 6–8 minutes.
Add garlic and tomato paste: Stir in the garlic, tomato paste, thyme, oregano, and red pepper flakes (if using). Cook 1–2 minutes until fragrant and the paste darkens slightly.
Build the broth: Pour in the broth.
Add the bay leaf and Parmesan rind if you’re using it. Bring to a gentle boil.
Add the beans: Stir in the cannellini beans. Reduce heat to a simmer and cook 10 minutes so the flavors meld.
Thicken a little (optional but great): Use a ladle to scoop about 1 cup of soup (mostly beans and broth) into a bowl and mash with a fork, or use an immersion blender for a few quick pulses directly in the pot.
This gives the soup a creamy body without dairy.
Add the kale: Stir in the chopped kale. Simmer 8–10 minutes until tender but still bright. Fish out the bay leaf and Parmesan rind.
Finish and season: Add the zest of half a lemon and juice to taste (start with 1 tablespoon).
Stir in parsley. Taste and adjust salt and pepper. If it needs more richness, add a drizzle of olive oil.
Serve: Ladle into bowls.
Top with grated Parmesan, black pepper, and a squeeze of lemon if you like. Serve with crusty bread.