Warm the pot. In a large heavy pot, heat 2 to 3 tablespoons of olive oil over medium heat until shimmering.
Sauté the aromatics. Add diced onion, carrots, and celery with a pinch of salt.
Cook 6 to 8 minutes, stirring, until the vegetables soften and the onions turn translucent.
Add garlic and tomato paste. Stir in the minced garlic, tomato paste, and a pinch of red pepper flakes. Cook 1 to 2 minutes until fragrant and the paste darkens slightly.
Build the base. Add the cannellini beans, broth, parmesan rind, rosemary, thyme, and bay leaf. Bring to a gentle boil, then reduce heat to a simmer.
Simmer for flavor. Cook uncovered for 20 to 25 minutes to let the flavors meld.
Stir occasionally and keep the simmer gentle.
Blend for creaminess. Remove the bay leaf, herb stems, and rind. Using an immersion blender, blend the soup partially, just a few pulses, to thicken while keeping plenty of beans intact. If you don’t have an immersion blender, mash 1 to 2 cups of soup with a potato masher and stir back in.
Add greens. Stir in chopped kale or chard.
Simmer another 5 to 7 minutes until the greens are tender but still bright.
Finish and season. Squeeze in half a lemon, then taste. Add more lemon, salt, and black pepper as needed. Finish with a drizzle of olive oil for richness.
Serve. Ladle into bowls and top with grated Parmesan and extra pepper.
Serve with warm crusty bread.