Inspired by the flavors of takeout-style orange chicken but lighter and fresher (and, of course, 100% plant-based), this Sticky Orange Tofu & Broccoli Stir Fry is the grownup solution to your Panda Express cravings.

The sauce features freshly-squeezed navel oranges for bright, sunshiney sweetness, balanced by savory Asian pantry staples like soy sauce and Shaoxing wine. 

It thickens and coats tender-crisp broccoli florets and crunchy, golden-crusted tofu nuggets in sticky goodness for a wow-worthy stir fry that’ll outmatch anything you can DoorDash!

tofu and broccoli stir fry on a bed of rice in a bowl.

Ingredient notes

  • Extra-firm tofu: Once again, we’re relying on the GOAT of tofu—but unlike many of my other recipes starring extra-firm tofu, this one requires NO pressing or any other prep like freezing or boiling! 🥳
  • Navel oranges: You’ll use both the zest and the juice. The juice adds sunshiney sweetness to the stir fry sauce and the zest, added at the very end of the stir fry, elevates the whole dish with a floral citrus sweet sparkle.
  • A classic stir-fry sauce trio: Soy sauce (for salty savoriness) + rice vinegar (for mild acidity) + brown sugar (for sticky sweetness) = the solid flavor balance every stir fry needs. 
  • Shaoxing wine: This fermented rice wine is commonly used in Chinese stir fries and imbues the orange sauce with a nutty, salty je ne sais quoi that elevates this dish (and my saucy tofu stir fry) to restaurant-quality. You can buy it online, but it’s cheaper at East Asian grocery stores. 
  • Fresh ginger: Freshly-grated ginger gives the orange sauce an edgy dimension with its spicy-sweet sharpness. I tested a batch without it and wow, did I miss it.
  • Cornstarch: This MVP ingredient does double duty to create two contrasting textures: (1) it batters the tofu pieces, helping them form a truly crunchy shell as they pan-fry (despite no pressing or other prep); (2) it thickens the orange sauce, helping it cling to the stir-fried broccoli. 

Substitution and Tips

  • ✅ Pick smooth-skinned, firm oranges that feel heavy for their size (a good indication of juiciness!).
  • ✅ To make this gluten-free: Sub tamari for the soy sauce (or use certified GF soy sauce). 
  • ✅ If you can’t find Shaoxing wine: While Shaoxing wine really makes this stir-fry special, you can substitute it with mirin, a Japanese cooking wine. It is sweeter than Shaoxing wine, so you’ll need to reduce the brown sugar in the orange sauce to 2 tablespoons. We did try this with dry sherry as a substitute, and it left the stir-fry feeling flat, so I wouldn’t recommend that. 
  • ❌ DON’T sub arrowroot powder for the cornstarch in the tofu batter. In our tests, pan-frying tofu coated in arrowroot powder gets gummy :/ 
digital drawing of an orange.

Step-by-step instructions

person slicing tofu into thin slabs on a wooden cutting board.
  1. Prep the tofu: Stand the tofu block on its side and slice downward to create three thin slabs or sheets.
person slicing the tofu block vertically on a wooden cutting board.
  1. Lay each sheet flat and slice lengthwise, vertically, into 1”-wide (2.5 cm) planks. 
person slicing the tofu slabs crosswise on a wooden cutting board.
  1. Slice the planks crosswise in thirds, to make three 1 ½” (~4 cm) batons per plank. 
person pressing down on tofu with a dish towel.
  1. Gently press down on the tofu with a clean dish towel several times to remove some moisture.
broccoli florets in bowl before being steamed.
  1. Steam the broccoli: Add 3 TBSP water to a large bowl, followed by the broccoli florets/stems. Cover and microwave on high for 2 minutes, then toss well, bringing the bottom pieces to the top. Microwave for 1½ minutes, or until the broccoli is 70% – 80% cooked.
steamed broccoli on a dish towel.
  1. Spread the broccoli on a dish towel to dry.
Person combining all orange sauce ingredients in a glass measuring cup.
  1. Make the orange sauce:. Zest the orange; set aside. Juice over a measuring cup, then add the grated ginger, rice vinegar, brown sugar, soy sauce, Shaoxing wine, salt, and cornstarch.
Person whisking orange sauce in a glass measuring cup.
  1. Whisk thoroughly until the cornstarch has dissolved, then set aside.
Person closing a ziplock bag filled with tofu, cornstarch, salt and black pepper.
  1. Batter the tofu: Add the tofu blocks to a gallon-sized Ziploc bag (or large bowl), along with the cornstarch, salt, and black pepper.
Person flipping ziploc bag with cornstarch tofu mixture.
  1. Seal the bag, then gently flip it end-over-end several times until the tofu is well-coated. If using a bowl, use a silicone spatula to gently toss the tofu blocks in the cornstarch mixture.
Tofu pieces in a frying pan before being cooked.
  1. Cook the tofu: Heat 3 TBSP oil in a large frying pan over medium-high for a few minutes until rippling, then add the tofu in a single layer. Cook, undisturbed, for 5 to 7 minutes, until a golden crust forms on the bottom. 
Tofu pieces in a frying pan after being cooked.
  1. Flip and cook on the second side for 4 to 5 minutes, until golden brown all over. Transfer to a wire rack, then wipe out the pan and let it cool for a few minutes.
Shallots and garlic in a frying pan with oil.
  1. Finish the stir fry: Return the pan to medium-high heat, re-oil, and add the shallots with a pinch of salt. Stir frequently for 1 minute, then add the garlic and stir for 30 seconds.
Broccoli and a pinch of salt added to the frying pan.
  1. Add the broccoli plus a pinch of salt and stir fry until crisp-tender, about 2 to 3 minutes.
Orange sauce and zest added to the frying pan.
  1. Add the orange sauce and reserved orange zest to the pan. 
Broccoli coated in the orange sauce mixture in the frying pan.
  1. Stir constantly for 1 to 2 minutes to allow the sauce to thicken and coat the veggies.
Orange sauce mixture combined with the tofu and broccoli in the frying pan.
  1. Turn off the heat, then add the tofu, tossing for just a few seconds to coat in the sauce.
Sesame seeds sprinkled atop the finished tofu and broccoli stir-fry.
  1. Sprinkle with sesame seeds and serve with cooked rice. 
Want to save this recipe?
Enter your email address and we’ll send it straight to your inbox. Plus, we’ll send you new posts and recipes!

Tips for an unbeatable stir fry

Parcooking the broccoli is not optional

Look, I’d love to live in a world where throwing raw broccoli into a hot pan would cook it to the perfect, tender-crisp texture we all crave in a stir fry. I’d also love a kitchen counter that wipes itself and a dish on my table that’s perpetually full of perfectly portioned pieces of dark chocolate. 🤷🏽‍♀️

Alas, you have to partially cook (parcook) the broccoli before you stir fry it unless you’re using very finely chopped broccoli. 

In a traditional Chinese stir-fry, you would either blanch the broccoli in a large pot of boiling water or steam it in a steamer. Both of those methods definitely work, but I wanted to limit the number of dishes in this recipe.

Luckily, the microwave method in this recipe is fool-proof and so simple.

Remember to toss the broccoli after the first 2 minutes in the microwave, taking care to bring the pieces on the bottom to the top and vice versa before microwaving it a second time, otherwise the broccoli will cook unevenly. 

To test if the broccoli is done: Bite a piece of a floret’s stalk—it should crunch but not squeak. If it squeaks, toss again, cover, and heat for another 30 seconds to 1 minute.

How to pan fry the tofu

  1. If you’re using a stainless steel pan, be sure to preheat it properly to prevent sticking: Preheat the pan dry over medium-high for a few minutes. To test if it’s hot enough, use the Leidenfrost effect (AKA the water bead test). Add a drop of water to the pan. If it glides effortlessly across the pan, the pan is ready to take the oil and then the tofu (see the instructions in this video). 
  1. Once you’ve added the battered tofu to the frying pan, don’t fuss with them, as this robs them of their uniform golden crust. Plus, if you’re using a stainless steel (or cast iron) pan, tossing them early on this process → the tofu will stick. 
  1. After the tofu has cooked, transfer it to a wire rack (it has air all around it, which preserves the crispiness). If you plop the tofu on a plate or in a bowl, it’ll create steam that will dampen the wonderful crunch. 
  1. To preserve the tofu’s crunchiness: turn off the heat on the stir fry, then add the tofu, and just give it a gentle toss to lightly coat some pieces in the sauce. 
tofu and broccoli stir fry in frying pan.

Frequently Asked Questions

Can I air-fry the tofu instead of pan-frying it?

Sure! I prefer the pan-fry method because it’s quicker, at least for my small air fryer, which requires me to cook the tofu in two batches. But I’ve included air fryer instructions for the tofu below. 

Please note the differing amounts of cornstarch and oil used from the recipe card. 

1. Add the tofu pieces to a bowl and drizzle with 1 ½ TBSP (21g) oil. Toss gently until every piece is glossy.

2. Add ¼ cup (30 g) of cornstarch, ½ teaspoon kosher salt, and pepper to taste. Toss again until it looks smooth and slightly pasty, not powdery.

3. Preheat the air fryer to 400°F (200°C) for 4 minutes. Spray the basket with cooking spray.

4. Arrange the tofu in a single layer without overlapping. If your basket is small, you’ll need to work in two batches.

5. Air fry at 400°F (200°C) for 8 minutes, then pull the basket and shake it hard, or turn the pieces with tongs or a spatula. The tofu should be pale gold and release easily at this point.

6. Air fry for 4 minutes, then shake the basket again. If any pieces are still light-colored, flip them.

7. Air fry for a final 4 minutes, or until the tofu pieces are deep golden, firm to a tap, and rattle against each other. Transfer to a wire rack to further crisp up.

How do I store leftovers?

While you’ll get the best texture and reserve the tofu crispiness when you serve this fresh, I can attest that we eat leftovers of this all the time. 

Store in an airtight container in the fridge for 3 to 4 days. For the best results, reheat in a frying pan instead of the microwave.

Can I add other veggies in addition to the broccoli?

While I’m partial to broccoli in this recipe, you can always head over to my classic tofu stir-fry recipe for additional veggie inspiration (there are cook times for 7 different vegetables!).

Introducing

Big Vegan Flavor

Techniques and 150 recipes to master vegan cooking.

Sticky Orange Tofu & Broccoli Stir Fry

Prep: 25 minutes
Cook: 25 minutes
Servings: 4
5 from 1 vote

Made it? Click the stars to leave a review!

This sticky orange tofu & broccoli stir fry gives takeout-style flavors a fresh and fun upgrade! Freshly-squeezed orange juice sings in this bold, sweet and savory stir fry sauce that coats tender-crisp broccoli and crunchy nuggets of golden tofu. Guaranteed to satisfy any takeout craving!
Save this recipe!
Get this sent to your inbox, plus get new recipes from us every week!

Ingredients

Tofu & Broccoli

  • 16 ounces (454g) extra-firm tofu
  • ⅓ cup (40g) cornstarch (see Note 1)
  • Kosher salt and freshly cracked black pepper (see Note 2)
  • Neutral-flavored oil such as avocado oil or canola oil
  • 14 to 16 oz (400 to 450g) broccoli, crowns cut into small-medium florets; stalks peeled & thinly sliced
  • 1 large (or 2 small) shallot, thinly sliced
  • 3 fat cloves garlic, sliced

Sticky Orange Sauce

  • 2 navel oranges (or 5 to 7 mandarins, see Note 3)
  • 1 tablespoon (7 to 8g) freshly grated ginger
  • 2 ½ tablespoons (38g) rice vinegar
  • 3 tablespoons (35g) brown sugar
  • 2 tablespoons (34g) soy sauce (see Note 4)
  • 1 ½ tablespoons (21g) Shaoxing wine (see Note 5)
  • 1 tablespoon (8g) cornstarch

For Serving

  • 1 to 2 tablespoons roasted sesame seeds
  • Cooked jasmine rice to serve 4 (or rice of choice)

Instructions 

  • Slice the tofu: Stand the block of tofu on its side, then slice downward into three even-sized sheets. Lay each sheet flat and slice lengthwise into 1” (2.5 cm) strips, about 4 strips per sheet. Finally, slice those strips crosswise so you end up with 1 ½” (~4 cm) batons, about 12 per sheet.
    Arrange on a cutting board and gently press down with a dry towel or paper towels several times to remove some excess water.
  • Steam the broccoli: Add 3 tablespoons (45 mL) water to a microwave-safe bowl followed by the broccoli florets and stems. Cover and microwave on high for 2 minutes. Remove and toss well with a spoon, bringing the top layer to the bottom.
  • Microwave for 1 ½ minutes, then uncover and check.
    The broccoli should be 70 to 80% cooked through. Bite a piece of a floret’s stalk—it should crunch but not squeak. If not ready, toss again, cover, and heat for another 30 seconds to 1 minute.
    Spread the broccoli out on a dish towel and pat dry.
  • Make the Orange Sauce. Zest the orange(s) to yield 1 tablespoon orange zest; set aside for the end.
    Working over a bowl or measuring cup, juice the oranges to yield ⅓ cup (80 mL) orange juice. Add in the grated ginger, rice vinegar, brown sugar, soy sauce, Shaoxing wine, 2 pinches of salt, and 1 tablespoon (8g) cornstarch. Whisk very well until the starch is dissolved. Set aside.
  • Batter the tofu: Add the tofu to a gallon-size Ziploc bag (or large bowl). Pour in ⅓ cup (40g) cornstarch, ½ teaspoon kosher salt, and pepper to taste. Seal and shake the bag gently up and down and back and forth until the tofu is well-coated (or gently toss in the bowl with a silicone spatula until well coated).
  • Cook the tofu (see Note 6 for air frying): Fit a wire rack over a sheet pan. Heat a large frying pan over medium-high heat with 3 tablespoons (42g) oil for 2 to 2 ½ minutes (see Note 7 if using stainless steel pan).
    Once the oil is rippling, add the battered tofu in a single layer (I like to add it in batches using a slotted spoon). Cook undisturbed for 5 to 7 minutes, or until golden and crisp on the bottom. Flip (many pieces will stick together, that’s fine) and cook the second side for 4 to 5 minutes, or until golden brown and crisp all over.
    Transfer tofu to the wire rack (to enhance crisping). Wipe out the pan and let it cool a bit (to prevent aromatics from burning).
  • Cook the broccoli: Return the pan to medium-high heat until hot. Add a healthy drizzle of oil (~ 1 ½ TBSP) or use leftover oil in the pan. Add the shallots and a pinch of salt.
    Stir frequently for 1 minute or until just starting to soften, then add the garlic and stir frequently for 30 seconds.
    Add the parcooked broccoli and toss to coat in the oil/shallots/garlic. Season with a pinch of salt and stir fry for 2 to 3 minutes or until crisp-tender.
  • Re-whisk the Orange Sauce, then add it to the pan along with the orange zest. Stir constantly for 1 to 2 minutes, or until the sauce thickens and coats the veggies.
  • Turn off the heat and add the tofu, tossing for just a few seconds to coat in the sauce. Sprinkle with the sesame seeds. Transfer to bowls with cooked rice.

Notes

  1. The cornstarch forms a crunchy shell around the tofu. I do not recommend substituting it with arrowroot powder, as it tends to get gummy and sticky in the pan.
  2. I use Diamond Crystal kosher salt. If using sea salt or table salt, use about half the amount of salt listed.
  3. Choose oranges that feel heavy for their size (indicates more juice) and that have smooth, tight skin. When you gently squeeze the orange, it should feel firm but with a springy bounce.
  4. Use tamari or gluten-free soy sauce to keep this recipe gluten free.
  5. Shaoxing wine is a fermented Chinese cooking wine that adds a special complexity to this stir fry sauce. Find it at East Asian grocers or online. The best substitute would be mirin, a Japanese cooking wine. It is sweeter, though, so start with 2 TBSP brown sugar and add more to taste.
  6. If you prefer to air fry the tofu, follow the instructions in the first FAQ.
  7. If using a stainless steel pan, to prevent sticking: preheat the pan dry over medium-high heat for a few minutes, or until a droplet of water effortlessly glides across the pan in a single bead. Video instructions here.

Nutrition

Calories: 401kcal | Carbohydrates: 36g | Protein: 17g | Fat: 21g | Saturated Fat: 3g | Polyunsaturated Fat: 6g | Monounsaturated Fat: 12g | Sodium: 754mg | Potassium: 641mg | Fiber: 6.5g | Sugar: 12.5g | Vitamin A: 618IU | Vitamin C: 96.6mg | Calcium: 262mg | Iron: 3mg

Nutrition information is automatically calculated, so should only be used as an approximation.

Love this? Leave a rating below!

Leave a Comment & Rating

If you enjoyed this recipe, please consider giving it a star rating along with your comment! It helps others discover my blog and recipes, and your comments always make my day :) Thank you for your support!

Your email address will not be published. Required fields are marked *

Rate this recipe