Ingredients
Equipment
Method
Make the meatballs
- Preheat oven to 400°F (200°C) and line a rimmed baking sheet with parchment paper.
- In a small bowl, combine the breadcrumbs and milk and let sit for 2 minutes — the breadcrumbs should be fully moistened. This Italian panade is what keeps the meatballs tender.
- In a large mixing bowl, combine the ground beef, ground pork, soaked breadcrumbs, grated Parmesan, beaten egg, minced garlic, parsley, Italian seasoning, salt, pepper, and nutmeg. Mix with a fork — not your hands — just until the ingredients are evenly distributed, about 20 seconds. Overmixing makes the meatballs dense.
- Roll the mixture into marble-sized meatballs, about 1 teaspoon each — you should get 50 to 60 small meatballs. Place them on the prepared sheet with a little space between each. Bake for 10 to 12 minutes, until lightly browned and just cooked through. Set aside.
Build the soup
- While the meatballs bake, warm the olive oil in a large Dutch oven or soup pot over medium heat. Add the diced onion, carrot, and celery, and cook for 6 to 7 minutes, stirring occasionally, until the vegetables are soft and the onion is translucent.
- Stir in the minced garlic and cook for 30 seconds, until fragrant. Pour in the chicken broth, bring to a simmer, and let cook gently for 5 minutes to marry the flavours.
- Add the acini di pepe and the baked meatballs. Simmer for 8 to 10 minutes, or until the pasta is al dente. Stir occasionally to keep the pasta from sticking to the bottom of the pot.
Finish the bowl
- Reduce the heat so the broth is at the gentlest simmer (not a rolling boil). In a slow, steady stream, pour the beaten eggs into the broth while stirring slowly in one direction with a fork. The eggs will set into delicate ribbons within 30 seconds.
- Cut the heat. Stir in the baby spinach, ½ cup of grated Parmesan, the lemon zest, and lemon juice. The residual heat will wilt the spinach in under a minute. If using escarole, stir it in 2 minutes earlier so it tenderises.
- Taste and adjust salt and pepper. Ladle into warm bowls, top with extra grated Parmesan and a scatter of fresh parsley, and serve immediately with crusty Italian bread.
Nutrition
Notes
Net carbs: 21g per serving (23g total carbs minus 2g fibre).
Keep the meatballs small: Marble-sized — about 1 teaspoon each. A pound of meat should give you 50 to 60 meatballs, not 20. Small meatballs cook fast, stay tender, and fit on a spoon next to the pasta.
Soak the breadcrumbs: The Italian panade technique — breadcrumbs soaked in milk before mixing — is the single most important step for tender meatballs. Don't skip it.
Mix gently: Twenty seconds with a fork is enough. Compacted meatballs turn rubbery in the broth.
Egg ribbons: Keep the broth at a gentle simmer, not a hard boil. Pour the beaten eggs in a thin stream while stirring slowly in one direction. A rolling boil will scramble them into clumps instead of ribbons.
Add the spinach off the heat: Residual heat wilts baby spinach in under a minute and keeps the colour bright. If using escarole, stir it in 2 minutes earlier and let it tenderise.
Pasta substitutions: Acini di pepe is classic. Pastina, ditalini, orzo, and small stelline all work. Anything small enough to fit on a spoon next to a meatball.
Refrigerator storage: Up to 4 days in an airtight container. The pasta will continue absorbing broth as it sits, so leftovers will be thicker on day two. To keep leftovers brothy, cook the pasta separately and combine portions on the plate.
Freezer storage: Freeze the meatball-broth-vegetable base (without the pasta and without the egg ribbon) for up to 3 months. Cook fresh pasta and stream in beaten eggs when reheating.
Reheating: Stovetop over gentle heat with the lid on, just until the meatballs are warmed through. Microwave at 60% power in 90-second bursts, stirring between each.
