This easy plant based, gluten free recipe for Vegan Pho with Tofu is inspired by the food traditions of Vietnam. What is pho? The classic dish pho is a traditional Vietnamese noodle soup, which features a hot broth that tenderizes, noodles, protein, vegetables, and flavorings. This traditional homemade pho recipe is amazingly comforting—the warm fragrant broth combined with hearty protein options and veggie pairings, and vibrant tastes of basil and lime toppings are off the charts with taste and nutrition—all in one bowl.
I included this easy pho recipe in my first book, The Plant-Powered Diet. Living in LA for 30 years, our family has always celebrated traditional foods from Asian countries, including Vietnam. Though I am certainly not an expert in Vietnamese foods, I celebrate them in my home regularly! Please check out the work of one of my favorite food experts in Vietnamese food traditions, Lisa Mai, who is a vegan food blogger specializing in these foodways and cuisines. When I learned how to make this traditional vegan pho recipe in my own home, it became a family favorite. And my sons would always grown excited when they could smell the pho broth simmering away whenever I created it. My version is completely plant-based, featuring an amazing vegetable broth, tofu, noodles, oodles of veggies, herbs, and peanuts. It looks so complex, but it’s really not. Just get that amazing broth going, and while it’s simmering prepare your other ingredients.
The basic recipe for vegan or vegetarian pho in my book can be used to make many variations. While the original recipe calls for bok choy and seitan, you can substitute any leafy green for bok choy, and tofu for seitan. I always feature whatever green I have growing in my garden, but if you don’t have a garden try what is seasonal at your farmers market or grocery store. When it comes to pho, it’s all about the broth, and this broth is amazing—rich in spices, mushrooms, ginger, and herbs. The fun part of pho is that it’s interactive. Just prepare all of the toppings—greens, herbs, lime, peppers—on a platter, place it on the table, and let everyone build their own bowl of noodle soup just the way they like it. You start with big bowls filled with noodles and boiling broth and then add on your favorite toppings.
Since I first created this recipe, I have spent more time in Asia and have improved on my pho. I have learned that with rice noodles, the secret is to not overcook them. And you may want to simmer the broth with your tofu and veggies a few minutes, according to your preference, before adding the toppings. I also love adding peanuts and tiny little birds eye peppers as a topping. If you really want to get inspired to create an authentic pho, visit a local Asian market in your city and spy some authentic ingredients, such as Vietnamese rice noodles, Asian peppers, Thai basil, really good soy sauce, and star anise. You can also grow lots of these ingredients in your garden (depending on your growing region), such as peppers, greens, lime, basil, and cilantro. I have all of these growing in my garden right now! I hope you enjoy this recipe as much as we do!
Print clock clock iconcutlery cutlery iconflag flag iconfolder folder iconinstagram instagram iconpinterest pinterest iconfacebook facebook iconprint print iconsquares squares iconheart heart iconheart solid heart solid icon Pin Recipe
Description
This easy, completely plant-based, gluten-free, flavorful, nutritious Vegan Pho with Tofu recipe is based on the cultural food traditions of Vietnam.
Broth:
Noodles:
Toppings:
- 1 (15-ounce) package extra firm tofu, pressed, cubed
- 1 bunch greens (i.e., chard, spinach, bok choy, mustard greens), chopped
- 1/2 cup coarsely chopped cilantro
- 1/2 cup coarsely chopped basil (try to find Thai basil if possible)
- 1 small lime, cut into wedges
- 2–4 small chili peppers (i.e. bird’s eye, chili de arbol)
- 4 green onions, sliced
- 1/2 cup coarsely chopped peanuts
- To prepare the broth: Combine all the broth ingredients in a large pot, cover, and bring to a low boil. Reduce the heat and simmer for 30 minutes. Strain the broth, discarding the vegetables and seasonings. Return the strained broth to the pot, cover, and keep warm (broth should be bubbling right before serving time). While broth is cooking, prepare noodles and toppings.
- To prepare the noodles: Bring a pot of water to boil. Place noodles in a dish. Pour boiling water over noodles and allow to soften, until achieves desired texture (tender yet not sticky)—about 4-6 minutes. Rinse and drain noodles.
- Arrange cilantro, basil, lime, peppers, green onions, and peanuts on a platter for garnishing.
- To serve the soup, divide the noodles among 4 bowls. Top with tofu and leafy greens. Pour boiling broth over each portion and serve immediately. Garnish with toppings as desired.
Notes
Alternatively, in step 4, you can add the noodles, tofu, and leafy greens to the pot of boiling broth and cook for 1-2 minutes to achieve desired texture before dividing it among 4 bowls and garnishing as desired with toppings.
Try alternative toppings, such as bean sprouts, mushrooms, and seitan.
Recipe is adapted from The Plant-Powered Diet by Sharon Palmer, MSFS, RDN
- Prep Time: 15 minutes
- Cook Time: 30 minutes
- Category: Entree
- Cuisine: Asian, American
Nutrition
- Serving Size: 1 serving
- Calories: 589
- Sugar: 10 g
- Sodium: 1914 mg
- Fat: 25 g
- Saturated Fat: 3 g
- Carbohydrates: 83 g
- Fiber: 10 g
- Protein: 28 g
Keywords: vegan pho, vegan pho recipe, easy pho recipe, vegetarian pho recipe, homemade pho recipe, quick pho recipe
D){Q=Q_2;P=P_2}else{Q=Q_1;P=P_1}}if(!mixed)return[0,sgn*P,Q];var q=Math.floor(sgn*P/Q);return[q,sgn*P-q*Q,Q]}; window.tastyRecipesVulgarFractions = JSON.parse(decodeURIComponent(“%7B%22%C2%BC%22%3A%221%2F4%22%2C%22%C2%BD%22%3A%221%2F2%22%2C%22%C2%BE%22%3A%223%2F4%22%2C%22%E2%85%93%22%3A%221%2F3%22%2C%22%E2%85%94%22%3A%222%2F3%22%2C%22%E2%85%95%22%3A%221%2F5%22%2C%22%E2%85%96%22%3A%222%2F5%22%2C%22%E2%85%97%22%3A%223%2F5%22%2C%22%E2%85%98%22%3A%224%2F5%22%2C%22%E2%85%99%22%3A%221%2F6%22%2C%22%E2%85%9A%22%3A%225%2F6%22%2C%22%E2%85%9B%22%3A%221%2F8%22%2C%22%E2%85%9C%22%3A%223%2F8%22%2C%22%E2%85%9D%22%3A%225%2F8%22%2C%22%E2%85%9E%22%3A%227%2F8%22%7D”)); window.tastyRecipesFormatAmount = function(amount, el) { if ( parseFloat( amount ) === parseInt( amount ) ) { return amount; } var roundType = ‘frac’; if (typeof el.dataset.amountShouldRound !== ‘undefined’) { if (‘false’ != el.dataset.amountShouldRound) { if ( ‘number’ === el.dataset.amountShouldRound ) { roundType = ‘number’; } else if (‘frac’ === el.dataset.amountShouldRound) { roundType = ‘frac’ } else if (‘vulgar’ === el.dataset.amountShouldRound) { roundType = ‘vulgar’ } else { roundType = ‘integer’; } } } if (‘number’ === roundType) { amount = Number.parseFloat(amount).toPrecision(2); } else if (‘integer’ === roundType) { amount = Math.round(amount); } else if (‘frac’ === roundType || ‘vulgar’ === roundType) { var denom = 8; if (typeof el.dataset.unit !== ‘undefined’) { var unit = el.dataset.unit; if ([‘cups’,’cup’,’c’].includes(unit)) { denom = 4; if (0.125 === amount) { denom = 8; } if (“0.1667″ === Number.parseFloat( amount ).toPrecision(4)) { denom = 6; } } if ([‘tablespoons’,’tablespoon’,’tbsp’].includes(unit)) { denom = 2; } if ([‘teaspoons’,’teaspoon’,’tsp’].includes(unit)) { denom = 8; } } var amountArray = frac.cont( amount, denom, true ); var newAmount = ”; if ( amountArray[1] !== 0 ) { newAmount = amountArray[1] + ‘/’ + amountArray[2]; if (‘vulgar’ === roundType) { Object.keys(window.tastyRecipesVulgarFractions).forEach(function(vulgar) { if (newAmount === window.tastyRecipesVulgarFractions[vulgar]) { newAmount = vulgar; } }); } } if ( newAmount ) { newAmount = ‘ ‘ + newAmount; } if ( amountArray[0] ) { newAmount = amountArray[0] + newAmount; } amount = newAmount; } return amount; }; window.tastyRecipesUpdatePrintLink = () => { const printLinks = document.querySelectorAll( ‘.tasty-recipes-print-link’ ); const printButtons = document.querySelectorAll( ‘.tasty-recipes-print-button’ ); const printButton = document.querySelector( ‘.tasty-recipes-print-button’ ); if ( ! printButton ) { return; } const printURL = new URL( printButton.href ); const searchParams = new URLSearchParams( printURL.search ); const unitButton = document.querySelector( ‘.tasty-recipes-convert-button-active’ ); const scaleButton = document.querySelector( ‘.tasty-recipes-scale-button-active’ ); let unit = ”; let scale = ”; if ( unitButton ) { unit = unitButton.dataset.unitType; searchParams.delete(‘unit’); searchParams.set( ‘unit’, unit ); } if ( scaleButton ) { scale = scaleButton.dataset.amount; searchParams.set( ‘scale’, scale ); } const paramString = searchParams.toString(); const newURL = ” === paramString ? printURL.href : printURL.origin + printURL.pathname + ‘?’ + paramString; printLinks.forEach( ( el ) => { el.href = newURL; }); printButtons.forEach( ( el ) => { el.href = newURL; }); }; document.addEventListener( ‘DOMContentLoaded’, () => { if ( ! window.location.href.includes( ‘/print/’ ) ) { return; } const searchParams = new URLSearchParams( window.location.search ); const unit = searchParams.get( ‘unit’ ); const scale = searchParams.get( ‘scale’ ); if ( unit && ( ‘metric’ === unit || ‘usc’ === unit ) ) { document.querySelector( ‘.tasty-recipes-convert-button[data-unit-type=”‘ + unit + ‘”]’ ).click(); } if ( scale && Number(scale) > 0 ) { document.querySelector( ‘.tasty-recipes-scale-button[data-amount=”‘ + Number(scale) + ‘”]’ ).click(); } }); }()); (function(){ var buttonClass = ‘tasty-recipes-scale-button’, buttonActiveClass = ‘tasty-recipes-scale-button-active’, buttons = document.querySelectorAll(‘.tasty-recipes-scale-button’); if ( ! buttons ) { return; } buttons.forEach(function(button){ button.addEventListener(‘click’, function(event){ event.preventDefault(); var recipe = event.target.closest(‘.tasty-recipes’); if ( ! recipe ) { return; } var otherButtons = recipe.querySelectorAll(‘.’ + buttonClass); otherButtons.forEach(function(bt){ bt.classList.remove(buttonActiveClass); }); button.classList.add(buttonActiveClass); var scalables = recipe.querySelectorAll(‘span[data-amount]’); var buttonAmount = parseFloat( button.dataset.amount ); scalables.forEach(function(scalable){ if (typeof scalable.dataset.amountOriginalType === ‘undefined’ && typeof scalable.dataset.nfOriginal === ‘undefined’) { if (-1 !== scalable.innerText.indexOf(‘/’)) { scalable.dataset.amountOriginalType = ‘frac’; } if (-1 !== scalable.innerText.indexOf(‘.’)) { scalable.dataset.amountOriginalType = ‘number’; } Object.keys(window.tastyRecipesVulgarFractions).forEach(function(vulgar) { if (-1 !== scalable.innerText.indexOf(vulgar)) { scalable.dataset.amountOriginalType = ‘vulgar’; } }); if (typeof scalable.dataset.amountOriginalType !== ‘undefined’) { scalable.dataset.amountShouldRound = scalable.dataset.amountOriginalType; } } var amount = parseFloat( scalable.dataset.amount ) * buttonAmount; amount = window.tastyRecipesFormatAmount(amount, scalable); if ( typeof scalable.dataset.unit !== ‘undefined’ ) { if ( ! scalable.classList.contains(‘nutrifox-quantity’) ) { if ( ! scalable.classList.contains(‘nutrifox-second-quantity’) ) { amount += ‘ ‘ + scalable.dataset.unit; } } } scalable.innerText = amount; }); var nonNumerics = recipe.querySelectorAll(‘[data-has-non-numeric-amount]’); nonNumerics.forEach(function(nonNumeric){ var indicator = nonNumeric.querySelector(‘span[data-non-numeric-label]’); if ( indicator ) { nonNumeric.removeChild(indicator); } if ( 1 !== buttonAmount ) { var indicator = document.createElement(‘span’); indicator.setAttribute(‘data-non-numeric-label’, true); var text = document.createTextNode(‘ (x’ + buttonAmount + ‘)’); indicator.appendChild(text); nonNumeric.appendChild(indicator); } }); window.tastyRecipesUpdatePrintLink(); }); }); }()); window.TastyRecipes = window.TastyRecipes || {}; window.TastyRecipes.cookMode = { wakeLockApi: false, wakeLock: false, cookModeSelector: ‘.tasty-recipes-cook-mode’, init() { if (“wakeLock” in navigator && “request” in navigator.wakeLock) { this.wakeLockApi = navigator.wakeLock; } const cookModes = document.querySelectorAll(this.cookModeSelector); if (cookModes.length > 0) { for (const cookMode of cookModes) { if (this.wakeLockApi) { cookMode.querySelector(‘input[type=”checkbox”]’).addEventListener(“change”, event => { this.checkboxChange(event.target); }, false); } else { cookMode.style.display = “none”; } } } }, checkboxChange(checkbox) { checkbox.checked ? this.lock() : this.unlock(); }, setCheckboxesState(state) { const checkboxes = document.querySelectorAll(this.cookModeSelector + ‘ input[type=”checkbox”]’); for (const checkbox of checkboxes) { checkbox.checked = state; } }, async lock() { try { this.wakeLock = await this.wakeLockApi.request(“screen”); this.wakeLock.addEventListener(“release”, event => { this.wakeLock = false; this.setCheckboxesState(false); }); this.setCheckboxesState(true); } catch (error) { this.setCheckboxesState(false); } }, unlock() { if (this.wakeLock) { this.wakeLock.release(); this.wakeLock = false; } this.setCheckboxesState(false); } }; (function(callback) { if (document.readyState !== “loading”) { callback(); } else { document.addEventListener(“DOMContentLoaded”, callback); } })(() => { window.TastyRecipes.cookMode.init(); }); window.TastyRecipes = window.TastyRecipes || {}; window.TastyRecipes.ratings = { init( min_rating ) { this.min_rating = min_rating; this.recipeRatingReflectInRespondSection(); this.addBodyClassBasedOnSelectedRating(); this.backwardCompRespondRatingPosition(); }, recipeRatingReflectInRespondSection() { const ratings = document.querySelectorAll(‘.tasty-recipes-no-ratings-buttons [data-rating]’); if (ratings.length { this.fireRatingInRespond( event.target.dataset.rating ); } ); } }, fireRatingInRespond( rating ) { const ratingInput = document.querySelector(‘.tasty-recipes-rating[value=”‘ + rating + ‘”]’); if ( ! ratingInput ) { return; } ratingInput.click(); }, addBodyClassBasedOnSelectedRating() { const ratingInputs = document.querySelectorAll(‘input.tasty-recipes-rating’); if ( ratingInputs.length { let selectedRating = event.target.getAttribute( ‘value’ ); this.handleBodyClassByRating( selectedRating ); this._toggle_comment_textarea_required( selectedRating ); } ); } }, handleBodyClassByRating( rating ) { if ( rating = comment_textarea.length ) { return; } if ( rating < this.min_rating ) { comment_textarea.setAttribute( 'required', '' ); return; } comment_textarea.removeAttribute('required'); }, backwardCompRespondRatingPosition() { const ratings_buttons = document.querySelector( '#respond .tasty-recipes-ratings-buttons' ); if ( !ratings_buttons || ratings_buttons.length { if ( rating_span === event.target ) { return; } rating_span.previousElementSibling.click(); } ); } } }; (function(callback) { if (document.readyState !== "loading") { callback(); } else { document.addEventListener("DOMContentLoaded", callback); } })(() => { window.TastyRecipes.ratings.init( window.tasty_recipes_min_rating ); }); ]]>
For more Asian-inspired recipes, check out some of my favorites:
Thai Tempeh Noodle Skillet
Stir-Fried Thai Tofu Sorghum Bowl
Noodle Bowl with Thai Tofu and Vegetables
Snow Peas and Seitan Vegetable Stir Fry
Vegetable Stir Fry with Forbidden Rice
Easy Soba Noodles with Peanuts and Seitan
Curried Tofu Papaya Wraps
As an Amazon Influencer, I earn from qualifying purchases. For more information about affiliate links, click here.
More Tools for Eating and Living the Goodness