Quick Recipe Version (TL;DR)
Quick Ingredients
- 1.75 lb (800 g) ground pork, 20–30% fat
- 6 oz (170 g) silken tofu, crumbled
- 1 large egg; 3 tbsp cornstarch; 1/4 cup ice water
- Ginger (2 tbsp minced + 6 slices), 3 scallions
- Light soy sauce (3.5 tbsp total), dark soy sauce (2 tsp)
- Shaoxing wine (4 tbsp total), sesame oil (2 tsp)
- Brown sugar (2 tbsp), white pepper, kosher salt
- 2 tbsp neutral oil
- 1 medium head napa cabbage (about 2 lb)
- 3 cups low-sodium chicken stock
- 1 star anise (optional); 2 garlic cloves
- 1 tbsp cornstarch + 1 tbsp cold water (slurry)
Do This
- 1. Mix pork with tofu, egg, 3 tbsp cornstarch, 1.5 tbsp light soy, 1 tbsp Shaoxing, 1 tsp sugar, 1 tsp sesame oil, 1/2 tsp white pepper, 1/2 tsp kosher salt, 2 tbsp minced ginger, minced scallion whites; beat in 1/4 cup ice water until sticky.
- 2. Form 6 oversized meatballs (about 4.5–5 oz each); chill 10–15 minutes.
- 3. Sear in 2 tbsp oil over medium-high until lightly browned, 2–3 minutes per side; remove.
- 4. Layer half the napa in a Dutch oven; add 3 cups stock, 2 tbsp light soy, 1 tsp dark soy, 3 tbsp Shaoxing, 6 ginger slices, 2 smashed garlic cloves, star anise (optional).
- 5. Nestle meatballs over cabbage, top with remaining cabbage; bring to a simmer, cover, and cook gently 30–35 minutes until centers reach 160°F.
- 6. Strain 1 cup braising liquid into a skillet; add 1 tbsp light soy, 1 tsp dark soy, 1 tbsp brown sugar; boil, whisk in slurry, simmer to a syrupy glaze; finish with 1 tsp sesame oil.
- 7. Toss meatballs in glaze 1–2 minutes; serve over braised napa with extra broth and scallion greens.
Why You’ll Love This Recipe
- Pillowy, oversized meatballs that stay incredibly tender thanks to gentle simmering and a tofu-enriched mixture.
- Deep, savory broth layered with soy, Shaoxing wine, and ginger—finished with a glossy, savory-sweet glaze.
- Weeknight-friendly technique with restaurant-level results and minimal specialty equipment.
- Balanced, comforting one-pot meal with braised napa cabbage built right in.
Grocery List
- Produce: Napa cabbage, fresh ginger, scallions, garlic
- Dairy: Eggs (1 large)
- Pantry: Ground pork, silken tofu, light soy sauce, dark soy sauce, Shaoxing wine, sesame oil, cornstarch, brown sugar, white pepper, kosher salt, neutral oil, low-sodium chicken stock, star anise (optional)
Full Ingredients
For the Meatballs
- 1.75 lb (800 g) ground pork, 20–30% fat
- 6 oz (170 g) silken tofu, drained and crumbled
- 1 large egg
- 3 tbsp cornstarch
- 1.5 tbsp light soy sauce
- 1 tbsp Shaoxing wine
- 1 tsp granulated sugar
- 1 tsp toasted sesame oil
- 1/2 tsp ground white pepper
- 1/2 tsp kosher salt (use 1/4 tsp if using Morton’s)
- 2 tbsp very finely minced fresh ginger
- 3 scallions, whites and light greens finely minced (reserve dark greens for garnish)
- 1/4 cup ice-cold water
For the Broth & Braise
- 1 medium head napa cabbage (about 2 lb/900 g), cored and cut into 2-inch pieces
- 3 cups low-sodium chicken stock
- 2 tbsp light soy sauce
- 1 tsp dark soy sauce
- 3 tbsp Shaoxing wine
- 6 slices fresh ginger
- 2 garlic cloves, smashed
- 1 small star anise (optional)
- 2 tbsp neutral oil (for searing)
For the Glaze & Finish
- 1 cup strained braising liquid
- 1 tbsp light soy sauce
- 1 tsp dark soy sauce
- 1 tbsp brown sugar
- 1 tbsp cornstarch mixed with 1 tbsp cold water (slurry)
- 1 tsp toasted sesame oil
- 1 tsp Chinkiang black vinegar (optional, for balance)
- Reserved dark green scallion tops, thinly sliced (garnish)
For Serving
- Steamed jasmine rice (optional)

Step-by-Step Instructions
Step 1: Prep aromatics and cabbage
Trim and chop the napa cabbage into 2-inch pieces, separating thicker stem pieces from leafy tops. Slice 6 pieces of ginger for the braise and mince 2 tablespoons ginger for the meat mixture. Mince the scallion whites and light greens; thinly slice the dark greens for garnish. Smash the garlic cloves. Keep everything within reach.
Step 2: Make the meat mixture and develop bounciness
In a large bowl, combine the ground pork, crumbled silken tofu, egg, cornstarch, light soy, Shaoxing, sugar, sesame oil, white pepper, kosher salt, minced ginger, and minced scallions. Using chopsticks or your hand, stir vigorously in one direction (clockwise) for 2–3 minutes. Gradually beat in the 1/4 cup ice water until the mixture becomes sticky and cohesive—this develops myosin for that signature springy, tender texture.
Step 3: Form oversized meatballs and chill
With damp or lightly oiled hands, divide the mixture into 6 equal portions (about 4.5–5 oz each). Gently toss each portion hand-to-hand to firm and round, then shape into smooth spheres about 2 1/2 inches wide—do not compress too tightly. Set on a plate, cover, and chill 10–15 minutes to help them hold their shape.
Step 4: Sear for flavor
Heat 2 tbsp neutral oil in a Dutch oven over medium-high heat until shimmering. Add the meatballs in a single layer (work in two batches if needed) and sear, turning as needed, until lightly browned in spots, 2–3 minutes per side. Transfer to a plate. Do not cook through; just build flavor and structure.
Step 5: Build the soy–Shaoxing–ginger braise
Scatter half the napa cabbage stems and leaves in the Dutch oven to form a cushioned bed. Add the chicken stock, light soy, dark soy, Shaoxing wine, ginger slices, smashed garlic, and optional star anise. Nestle the meatballs on top, then cover with the remaining napa. Bring to a gentle simmer over medium heat. Reduce to low, cover, and maintain a bare simmer (small lazy bubbles) for 30–35 minutes, turning the meatballs once halfway, until the centers reach 160°F.
Step 6: Make the glossy glaze
Transfer the meatballs to a wide skillet. Strain 1 cup of the braising liquid into the skillet; add 1 tbsp light soy, 1 tsp dark soy, and 1 tbsp brown sugar. Bring to a boil over medium-high heat. Whisk in the cornstarch slurry and cook, stirring, 1–2 minutes until thick and syrupy. Off heat, stir in sesame oil and optional black vinegar. Return to medium heat, add the meatballs, and baste or gently roll to coat for 1–2 minutes until shiny.
Step 7: Serve
Ladle the tender napa cabbage and some broth into warm bowls or a large platter. Arrange the glazed meatballs on top and spoon over extra glaze. Garnish with thinly sliced scallion greens. Serve immediately with steamed rice.
Pro Tips
- Use pork with 20–30% fat for the softest, juiciest meatballs.
- Stir the meat in one direction and add ice water gradually—this creates a cohesive, bouncy texture without toughness.
- Keep the simmer gentle; a rolling boil can break the meatballs and toughen the proteins.
- Chilling the shaped meatballs for 10–15 minutes helps them hold together during searing and braising.
- Strain the braising liquid for a glassy, restaurant-quality glaze.
Variations
- Pale braise: Skip the sear. Add a few slices of fatty pork belly atop the meatballs for richness and braise as directed for a classic Shanghai-style pale version.
- Water chestnut crunch: Fold 1/3 cup finely diced water chestnuts into the meat mixture for subtle sweetness and texture.
- Lighter poultry: Use ground turkey or chicken thighs and add 1 tbsp neutral oil to the mix; braise gently and check doneness at 165°F.
Storage & Make-Ahead
Refrigerate leftovers (meatballs in broth) up to 4 days; rewarm gently, covered, over low heat until hot. Freeze cooked meatballs and some braising liquid up to 2 months; thaw overnight in the fridge and reheat gently. To make ahead, form and chill meatballs up to 24 hours in advance, or freeze raw on a sheet pan until solid, then bag (cook from thawed for best texture). If the glaze thickens too much when reheating, thin with a splash of hot stock.
Nutrition (per serving)
Approximate: 620 calories; 39 g protein; 41 g fat; 23 g carbohydrates; 1,650 mg sodium. Values will vary based on brands and exact fat content of pork.


Leave a Reply