This post may contain affiliate links. Please read our disclosure policy.
In this vegan twist on the Italian-American classic, hearty homemade meatballs seasoned with plenty of Italian herbs, garlic, and parsley are tossed in a rich, umami-packed tomato sauce and served over tender spaghetti! This vegan spaghetti and meatballs dish is as flavorful and comforting as the original!

Ah, spaghetti and meatballs, it’s one of those dishes that instantly takes you back to simpler days. My version may be 100% plant-based, but it’s loaded with the same dose of nostalgia: think hearty and meaty meatballs generously seasoned with Italian herbs, garlic, and parsley, all smothered in an umami-rich marinara sauce and served over tender spaghetti. Hearty, comforting, and familiar.
Plus, it’s an all-season winner! Grate some vegan cheese on top in winter or garnish with fresh chopped basil in the summer.
Now, how do they stack up against real meatballs? Compared to pork and beef ones, these vegan meatballs are a bit more tender. Their texture is actually closer to a hamburger steak, so do not expect them to be super firm. They are, however, very meaty, a bit chewy, and juicy!
⭐️ Here’s Why It’s So Good
The classic, completely plant-based.
If you have tried other spaghetti and meatballs recipes, chances are you have seen bases like quinoa, lentils, or chickpeas. Sure, those are tasty, but if you are chasing that chewy and meaty bite, those are not going to cut it.
I have created this recipe not necessarily to fool meat-eaters (though I wouldn’t mind tricking a few!), but to make a dish that both vegans and non-vegans can genuinely enjoy together. And I think I’ve successfully done that.
I started with my vegan meatballs recipe as a base and re-tested it multiple times, fine-tuning the texture and seasoning until it checked all the boxes. This means the meatballs are slightly chewy, hold together well enough to be pan-fried, and have a satisfying meaty bite. And while they do contain textured vegetable protein and vital wheat gluten, you cannot taste any of those!
🥫 Ingredient Details

TVP
I’m a huge fan of TVP and have used it in many recipes before, including these high-protein vegan burgers, vegan fish fillets, and even as a base to make vegan roast pork!
In this recipe, TVP brings chewiness and most of the meatiness.
Recommendation: Basically, any type of TVP will work. I have tried with three different ones – chunks, strips, and slices – and got great results each time! The one I used in the photos came from my local Asian store. I couldn’t find that exact brand online, but it looks very similar to this one. Those TVP chunks work well too!
Soy curls vs. TVP? Soy curls are made from whole soybeans while TVP is made from de-fatted soy flour, so they are a bit more processed, although the main technique to turn them into meaty strips remains mostly the same. Both types work here. Whatever you use, your meatballs will turn out great!
White beans
To add tenderness and create structure, I rely on cooked white beans. Don’t bother cooking them from scratch, beans from a small can are completely fine.
Oh, and since the beans are processed with a ton of aromatics, rest assured, there is no beany flavor here!
Substitute: Any other cooked bean will work – black beans, red kidney beans, or even black-eyed peas.
Herbs and aromatics
Next up, the herbs and spices that turn these little meatballs into total flavor bombs!
I went with a simple, but powerful combo of dried herbs such as thyme, bay leaf, and Italian seasoning for the base. Then comes smoked paprika, onion powder, and black pepper to add depth.
And finally, a handful of parsley for freshness. Speaking of parsley, I suggest using flat parsley for optimal texture. Curly parsley works, but can yield a slightly gritty texture.
Soy sauce
To boost the savoriness and add depth, I like to add a splash of soy sauce. You can also add a few drops of dark soy sauce to give the meatballs a darker color, but that is totally optional!
Vital wheat gluten
It’s the key ingredient that allows the mixture to bind (bye-bye crumbly meatballs!). Vital wheat gluten also plays a huge role in giving the meatballs their meaty and slightly chewy texture, so do not omit it!
Can I replace vital wheat gluten with all-purpose flour? I have tried doing that, and while the meatballs still hold together well, the texture is much denser and stickier. Definitely not something we enjoyed. Hence, I advise against substituting the vital wheat gluten.
Tomato sauce
To keep the recipe simple, I went with a jar of store-bought tomato sauce, but you can definitely use homemade if you prefer!
Which sauce to pick: Marinara sauce or basil tomato sauce are tasty options, and our go-to favorites. For a spicy version, pick Arrabbiata sauce!
Spaghetti
And finally, the spaghetti! Although any long noodle will work. Feel free to use fettuccine, linguine, or even tagliatelle.
🥣 How It’s Done
1. Make the meatballs
- Soak the TVP. Add the TVP chunks/curls to a large bowl and cover them with boiling water. Allow them to sit for about 20 minutes or until they are fully rehydrated.
- Drain them well. Drain them using a colander and rinse them under cold water a couple of times.
- Squeeze them. Next, using your hands, squeeze them as much as possible to remove the water they have absorbed. Transfer them to a cutting board lined with a few sheets of kitchen paper towels. Place a few more sheets of paper towels on top and press to remove more water. Set the TVP chunks/curls aside.
- Process the beans into a paste. To a food processor, add the cooked white beans, water, oil, nutritional yeast, soy sauce, dark soy sauce, sugar, onion powder, smoked paprika, Worcestershire sauce, garlic, parsley, dried herbs, and ground black pepper. Process for 10-15 seconds or until it forms a paste.
- Add the TVP. Add the rehydrated TVP to the food processor.
- Process. Next, process for 4-5 seconds or until the TVP is evenly chopped into 1/4-inch (0.5 cm) pieces. At this point, the texture should look like fine ground meat. Transfer to a mixing bowl.
- Combine with the vital wheat gluten. Add the vital wheat gluten and mix using a wooden spoon until fully combined. It will look like a thick and meaty paste.
- Form the meatballs. Scoop about 1.5 tablespoons of the mixture and roll it between your hands to make even meatballs. Transfer to a steamer lined with parchment paper and repeat with the remaining mixture.
- Steam. Next, steam the meatballs for about 50 minutes. Allow them to cool down completely before using. I recommend refrigerating them for at least 3 hours before pan-frying.
2. Combine
- Cook the pasta. Bring a large pot of salted water to a boil. Once boiling, add the spaghetti and cook according to the package instructions. In the meantime, prepare the meatballs and the sauce.
- Pan-fry the meatballs. Once the meatballs are cool, heat two tablespoons of oil in a non-stick skillet over medium heat. Once hot, add the meatballs and sauté for 5-7 minutes, stirring from time to time, until they are evenly golden brown. Remove them from the skillet and transfer them to a plate. Use a kitchen paper towel to quickly clean the skillet.

Air-fry/bake instead of pan-frying!
Not into pan-frying? Feel free to either air-fry or bake the meatballs before adding them to the sauce. To do so:
- Preheat your air fryer or oven to 350°F (175°C).
- Generously brush each meatball with oil.
- Add them to the preheated air fryer or oven and air-fry/bake for 10-12 minutes, flipping them halfway through.
- Reheat the sauce. Add the marinara sauce to the skillet and reheat for 4-5 minutes.
- Combine with the meatballs. Next, add the meatballs back to the skillet, toss with the sauce, and cook for one more minute.
- Serve! Drain the cooked spaghetti and divide it between serving plates. Top with 3-4 meatballs and a few tablespoons of the tomato sauce before tossing. Garnish with chopped basil and enjoy!

📔 Tips
Make the meatballs one day ahead.
If you have time, I highly suggest preparing the meatballs at least one day before. Refrigerating them overnight allows them to firm up and develop an even meatier texture!
Don’t leave the TVP too chunky.
It’s important to process the TVP until it has a thin texture (less than 1/4-inch / 0.5 cm), otherwise, your balls will be crumbly.
Do not simmer the meatballs too long.
Simmer the meatballs in the tomato sauce for just 2-3 minutes, enough time for them to start soaking up the sauce without getting mushy.
Thin the sauce if needed.
Depending on the type or brand of tomato sauce you use, you might have to add a splash of water (or pasta water) to thin it out if it feels too thick. Remember to add a pinch of salt too, since the water will dilute the saltiness.
🌶️ Variations
Want more texture in the sauce? Incorporate extra vegetables like chopped sun-dried tomatoes, olives, corn, or even chopped marinated artichoke hearts. The options are endless!
Play with the seasonings: Nothing is set in stone when it comes to the seasonings. I love Italian seasoning, but you can replace it with your favorite blend of dried herbs or process the beans with a handful of basil leaves for a ton of freshness.
🍃 Serving Suggestions
Our favorite way to serve this during the warmer days is to garnish it with plenty of chopped fresh basil. BUT, as I mentioned earlier, this is an all-season dish, meaning that you can make it even heartier by topping it off with grated vegan mozzarella or parmesan! You can even add a pinch of red pepper flakes for a spicy kick.

❄️ Storing and Freezing
- To store: You can store the meatballs with the sauce in the refrigerator for up to 4 days.
- To freeze: You have two options. Either freeze the meatballs already in the sauce, or freeze the meatballs on their own and keep the jar of tomato sauce in your pantry. The meatballs will stay good for up to 2 months in the freezer. Thaw overnight in the refrigerator before using.
- To reheat: Reheat in a non-stick skillet or pot over medium heat for 5-7 minutes or until the meatballs are hot.
💬 FAQ
This recipe is not designed to be gluten-free, so I’m afraid I cannot provide any suggestions to make it without the TVP or the vital wheat gluten.
I have tried baking the meatballs instead of steaming, but I didn’t like the result. They turned out too hard on the outside.
You can steam the meatballs and store them in the fridge for up to 4 days. When you are ready to serve, just shallow-fry them and toss them in the sauce!



Want to Save This Recipe?
Enter your email below & we’ll send it straight to your inbox! Plus, you will receive new recipes every week!
I’d like to receive more tips & recipes from Full of Plants.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Vegan Spaghetti and Meatballs
Ingredients
- 1 ounce (28 g) TVP chunks (or TVP curls, soy curls, etc)
- 1/4 cup (52 g) cooked white beans
- 2 tbsp (30 ml) water
- 2 tbsp (30 ml) oil
- 1 tbsp (7 g) nutritional yeast
- 1 tbsp (15 ml) soy sauce
- 1/2 tsp (2 ml) dark soy sauce (optional, for color)
- 2 tsp (8 g) sugar
- 1 tsp onion powder
- 1/2 tsp smoked paprika
- 1/4 tsp (1 ml) vegan Worcestershire sauce
- 2 cloves of garlic minced
- 3 tbsp chopped fresh parsley
- 2 tsp Italian seasoning
- 1/2 tsp dried thyme
- 1/4 tsp ground black pepper
- 1/2 cup (70 g) vital wheat gluten
- 23 ounces (650 g) marinara sauce
- 9 ounces (250 g) uncooked spaghetti
Instructions
- Soak the TVP. Add the TVP chunks/curls to a large bowl and cover them with boiling water. Allow them to sit for about 20 minutes or until they are fully rehydrated.
- Drain them well. Drain them using a colander and rinse them under cold water a couple of times.
- Squeeze them. Next, using your hands, squeeze them as much as possible to remove the water they have absorbed. Transfer them to a cutting board lined with a few sheets of kitchen paper towels. Place a few more sheets of paper towels on top and press to remove more water. Set the TVP chunks/curls aside.
- Process the beans into a paste. To a food processor, add the cooked white beans, water, oil, nutritional yeast, soy sauce, dark soy sauce, sugar, onion powder, smoked paprika, Worcestershire sauce, garlic, parsley, dried herbs, and ground black pepper. Process for 10-15 seconds or until it forms a paste.
- Add the TVP. Add the rehydrated TVP to the food processor.
- Process. Next, process for 4-5 seconds or until the TVP is evenly chopped into 1/4-inch (0.5 cm) pieces. At this point, the texture should look like fine ground meat. Transfer to a mixing bowl.
- Combine with the vital wheat gluten. Add the vital wheat gluten and mix using a wooden spoon until fully combined. It will look like a thick and meaty paste.
- Prepare a steamer. Line a bamboo basket steamer with parchment paper, then bring a large pot of water (that the basket can sit over) to a boil.
- Form the meatballs. Scoop about 1.5 tablespoons of the mixture and roll it between your hands to make even meatballs. Transfer to the steamer and repeat with the remaining mixture.
- Steam. Next, place the lid on the bamboo steamer basket and set it over the pot of boiling water. Steam the meatballs for about 50 minutes, checking the water level halfway through and adding more if needed.Allow the meatballs to cool down completely before using. I recommend refrigerating them for at least 3 hours before pan-frying.
- Cook the pasta. Bring a large pot of salted water to a boil. Once boiling, add the spaghetti and cook according to the package instructions. In the meantime, prepare the meatballs and the sauce.
- Pan-fry the meatballs. Once the meatballs are cool, heat two tablespoons of oil in a non-stick skillet over medium heat. Once hot, add the meatballs and sauté for 5-7 minutes, stirring from time to time, until they are evenly golden brown. Remove them from the skillet and transfer them to a plate. Use a kitchen paper towel to quickly clean the skillet.
- Reheat the sauce. Add the marinara sauce to the skillet and reheat for 4-5 minutes.
- Combine with the meatballs. Next, add the meatballs back to the skillet, toss with the sauce, and cook for one more minute.
- Serve! Drain the cooked spaghetti and divide it between serving plates. Top with 3-4 meatballs and a few tablespoons of the tomato sauce before tossing. Garnish with chopped basil and enjoy!
- You can store the meatballs with the sauce in the refrigerator for up to 4 days.
Notes
Make the meatballs one day ahead.
If you have time, I highly suggest preparing the meatballs at least one day before. Refrigerating them overnight allows them to firm up and develop an even meatier texture!Don’t leave the TVP too chunky.
It’s important to process the TVP until it has a thin texture (less than 1/4-inch / 0.5 cm), otherwise, your balls will be crumbly.Do not simmer the meatballs too long.
Simmer the meatballs in the tomato sauce for just 2-3 minutes, enough time for them to start soaking up the sauce without getting mushy.Thin the sauce if needed.
Depending on the type or brand of tomato sauce you use, you might have to add a splash of water (or pasta water) to thin it out if it feels too thick. Remember to add a pinch of salt too, since the water will dilute the saltiness.
About the Author
Thomas Pagot is the founder, photographer, and recipe developer behind Full of Plants. He created the blog in 2016 as a personal cookbook for vegan recipes. Through years of recipe development, Thomas has successfully grown Full of Plants into a trusted resource for plant-based recipes.
Leave a Comment