Sauté the aromatics: In a large pot over medium heat, warm the olive oil and butter.
Add the diced onion with a pinch of salt. Cook 6–8 minutes until soft and translucent, stirring occasionally. Add the garlic and cook 30 seconds until fragrant.
Build tomato flavor: Stir in the tomato paste and cook 1–2 minutes to caramelize slightly.
This step deepens the tomato flavor.
Add tomatoes and stock: Pour in the crushed or whole peeled tomatoes (crush whole tomatoes with a spoon). Add 3 cups of stock to start. If using, toss in the Parmesan rind.
Season with 1 teaspoon salt, several grinds of pepper, and a pinch of red pepper flakes.
Simmer: Bring to a gentle simmer. Cook uncovered for 20–25 minutes, stirring occasionally. If the soup looks too thick, add more stock in small splashes.
Add basil and balance: Stir in the basil leaves.
Taste the soup. If it’s too acidic, add 1 teaspoon sugar. If it needs brightness, add a small splash of balsamic.
Adjust salt and pepper.
Blend until smooth: Remove the Parmesan rind if used. Use an immersion blender to puree in the pot until silky. Or carefully transfer to a blender in batches, venting the lid and covering with a towel to release steam.
Add cream: Return the soup to low heat.
Stir in heavy cream a little at a time until it’s as creamy as you like. Start with 1/2 cup; add more if you want richer texture. Warm gently—don’t boil after adding cream.
Finish and serve: Taste again and adjust seasoning.
Ladle into bowls and garnish with torn basil, a drizzle of olive oil, cracked pepper, or shaved Parmesan. Serve with grilled cheese, crusty bread, or a simple salad.