Heat the olive oil in a wide based pot or Dutch oven over medium heat. Add the onion, carrot, celery, garlic and chili flakes and cook 7-8 minutes, stirring occasionally, until partially softened. Season the vegetables with salt and pepper.
Add the tomato paste and cook another 1-2 minutes until darkened. Stir in the kale and cook until it starts to wilt, 3-4 minutes. Add the diced tomatoes, stock (or water), thyme, bay leaf and parmesan rind and raise the heat to bring to a simmer.
Meanwhile, pour a few tablespoons of the cannellini beans into a small bowl along with a little of the cooking liquid, and mash them together with a fork to form a paste. Pour the paste into the soup along with the remaining whole beans. Stir to combine. The mashed beans will help to thicken the soup as it cooks.
Simmer the soup with the lid slightly ajar, about 25 minutes until the vegetables are softened but still al dente. Stir in the bread and simmer another 4-5 minutes. The bread will start to dissolve into the soup and thicken it further. For a thicker porridge-like consistency, simmer the soup even longer until the bread breaks down almost completely.
Before serving, remove the thyme sprigs, bay leaf and parmesan rind. Adjust seasoning with salt and pepper. Spoon the ribollita into bowls and top with grated parmesan cheese and a drizzle of olive oil, if desired.