Prepare the meatballs: start out by adding all the meatball ingredients into a medium bowl. Use clean hands to combine the ingredients until fully combined. Roll the meatball mixture into small balls (approximately 3/4 inch in size is ideal). You will likely get about 50-60 meatballs depending on the size you make them.: start out by adding all the meatball ingredients into a medium bowl. : The bowl should feel cool to the touch while you add the ground beef , parmesan cheese , breadcrumbs , Italian seasoning , crushed red pepper , the lightly beaten egg , fresh parsley , minced garlic , sea salt and cracked pepper . As the ingredients meet, you will notice the cheese and breadcrumbs begin to absorb moisture, the parsley gives little green flecks, and the egg acts like an invisible glue. Use clean hands and fold gently, the texture should become cohesive but not dense. If the mixture feels tacky yet holds its shape, you are on track. A common mistake is overmixing which compresses proteins and yields a firm, rubbery meatball. Stop as soon as the components are combined, the surface should be slightly glossy from the egg.
Cook the meatballs stovetop: heat a large skillet to medium-high heat. Add a drizzle of olive oil and when glistening, add the meatballs in batches to brown the outsides, turning once or twice for about 3-4 minutes. The meatballs do not have to be fully cooked as they can cook the rest of the way in the soup. Remove and set aside.: While you press and fold the mixture, feel for uniformity, the breadcrumbs should be integrated and no large pockets of egg or cheese should remain. The mixture will give slightly under pressure, and you should smell the garlic and herbs coming forward. If the aroma of raw garlic is sharp, let the mixture rest briefly in the fridge to mellow flavors and make shaping easier. A pitfall here is working too long which tightens the meat; keep your motions deliberate and minimal.
To broil: Line the meatballs on a parchment paper lined sheet pan. Broil on high for about 5-7 minutes or until the outside of the meatballs are browned, but not cooked through just yet. Remove from the oven and set aside.: As you roll, watch for consistent size which helps even cooking later in the soup. The meatballs should feel compact but not hard, with a smooth exterior and no crumbling edges. Place them on a tray lined with parchment to prevent sticking. If they are too sticky to roll, wet your hands slightly to smooth the surface. Rolling too large will increase cooking time and change the meatball to soup ratio.
Prepare the Soup: While the meatballs cook, add a drizzle of olive oil to a heated stock pot or dutch oven pot. Add carrots, onion and celery and sauté for about 3-4 minutes or until the onions become translucent.: Counting them as you go helps forecast how many will fit in your skillet and sheet pan. The sight of dozens of tiny meatballs is satisfying, and they will shrink slightly as they brown. If you end up with too many, freeze extras on a tray for another meal. A common oversight is assuming uniform shrinkage; remember size affects cooking time so adjust later steps if your batch size varies broadly.
Add the broth, tomatoes, Italian seasoning, garlic, salt and pepper and parmesan rind. Set heat to medium and simmer until the carrots have softened and the broth comes to a low boil. Adjust the heat as needed to medium or medium-high to keep a low boil.: heat a large skillet to medium-high heat. : The pan should be hot enough that a few drops of water sizzle and evaporate. Add a drizzle of olive oil and when it shimmers, the surface will look slick and slightly rippled. Add the meatballs in batches so they have room to brown. You should hear a steady sizzle as the exterior sears, creating browned bits that translate to deep flavor. Turn the meatballs once or twice for about 3 to 4 minutes to develop color on multiple sides. They will not be fully cooked through yet, which is intentional because they will finish in the soup. Crowding the pan lowers the temperature and causes steaming rather than browning, so work in batches for the best crisp, caramelized crust.
Add in the meatballs, spinach and ditalini pasta. Simmer for about 10 minutes or until the pasta is al dente. Remove from heat, stir in the tomato paste and allow to cool several minutes before serving. Remove the parmesan rind before serving.: When you remove them, they should be nicely browned but still slightly soft in the center. This partial cooking concentrates flavor on the exterior while keeping the interior tender. If you overcook them here, they risk drying out once simmered; undercooking is fine as the simmer will safely bring them up to temperature.
Remove and set aside.: Transfer the browned meatballs to a plate so the skillet remains available for making the soup base. The meatballs will continue to cool slightly and firm a touch, which makes handling easier when moving to a sheet pan or direct to the pot. Leaving them in the pan can lead to overcooking from residual heat, so clear them away promptly. Be careful not to leave browned bits burning in the pan, which can taste bitter in the final soup.
To broil: Line the meatballs on a parchment paper lined sheet pan. : If you choose the broil finish, space the meatballs evenly so hot air circulates. Place the pan under a hot broiler and watch as the exteriors take on deeper color in just a few minutes. The visual cue is a more uniform browning and occasionally small blistered spots. Broiling adds an extra texture layer and a slightly smoky aroma which I love. Keep a close eye because broilers work quickly and can go from browned to burnt in moments.
Broil on high for about 5-7 minutes or until the outside of the meatballs are browned, but not cooked through just yet.: You want a rich golden exterior without losing juiciness inside. The heat will caramelize proteins and fats, offering a roasted note. Rotate the pan if your broiler has hot spots to ensure even browning. A typical mistake is walking away and allowing the tops to char, creating an acrid flavor rather than a toasty one.
Remove from the oven and set aside.: Once broiled, let them rest briefly so juices redistribute and the exterior firms slightly. This rest time helps when transferring them into the soup as the meatballs will hold together better. If they seem very hot, allow an extra minute so you do not splash boiling fat when adding them to the pot.
Prepare the Soup: While the meatballs cook, add a drizzle of olive oil to a heated stock pot or dutch oven pot. : The oil should shimmer but not smoke, then add the chopped carrots , diced onion and chopped celery . As they hit the pan you will hear an initial sizzle, followed by a gentle softening and a sweet aroma from the onions. Sauté about 3 to 4 minutes until the onion becomes translucent and the vegetables begin to give. This step builds the aromatic base; undercooking here yields a flat broth, while overcooking toward deep brown will change the flavor toward caramelized notes.
Add the broth, tomatoes, Italian seasoning, garlic, salt and pepper and parmesan rind.: Pour in the broth and canned tomatoes , then stir in the additional Italian seasoning , minced garlic , sea salt , and pepper . Nestle the parmesan rind into the liquid. As the pot warms, steam will carry tomato fragrance and an herbal perfume from the seasoning. The rind will slowly release savory umami, enriching the liquid. A misstep is adding too much salt early; because flavors concentrate while simmering, season moderately and adjust later.
Set heat to medium and simmer until the carrots have softened and the broth comes to a low boil.: Maintain a gentle rolling simmer rather than a furious boil, this keeps the broth clear and allows flavors to meld. Watch for small bubbles breaking the surface and for the carrots to become tender when pierced with a fork. Adjust heat between medium and medium-high to maintain this low boil. Boiling too hard will make the broth cloudy and can break down delicate components prematurely.
Adjust the heat as needed to medium or medium-high to keep a low boil.: This is a balancing act where you control simmer intensity. The goal is a lively but controlled simmer that cooks the carrots through while coaxing flavor from the tomatoes and rind. If the pot threatens to foam or the meatballs jostle too violently, lower the heat to avoid agitation that could disintegrate the pasta later.
Add in the meatballs, spinach and ditalini pasta.: Gently slide the reserved browned meatballs into the pot, followed by the ditalini pasta and fresh baby spinach . The addition introduces savory, tender components and the pasta will soak up some of the broth as it cooks. The spinach will wilt quickly into deep green ribbons. Stir carefully to avoid breaking the meatballs, and keep the simmer gentle so the pasta cooks without becoming mushy.
Simmer for about 10 minutes or until the pasta is al dente.: During these minutes the soup becomes cohesive, with the broth tasting fuller as starch from the pasta leaches slightly. You will hear a low bubbling and see the pasta plump; when the pasta yields to a small bite but still has a slight chew, it is al dente. Overcooking here is the most common error, leading to broken-down pasta and a gummy texture. Pull the pot off heat a touch early if you expect residual cooking.
Remove from heat, stir in the tomato paste and allow to cool several minutes before serving.: Stirring in the tomato paste off heat deepens the tomato presence and slightly thickens the broth without needing extra cooking. The steam and residual warmth will meld the paste in a minute or two. Let the soup rest so flavors settle and the soup is safe to eat. A mistake is adding the paste at the start which can cause an overly concentrated, caramelized tomato flavor instead of a fresh finish.
Remove the parmesan rind before serving.: Fish out the rind with tongs or a spoon, it will have softened and imparted a rich savory note to the broth. Leaving the rind in the bowl is unpleasant texturally, so be sure to discard it. If you miss it, warn guests to watch for the chewy piece.