Skip to main content

Portland’s Top 50 (Currently Open) Food Carts



As we head into another PDX summer, we know that 2020 is going to look a little different. One thing that won’t change? Portland’s love of food carts! In all corners of the metro, inventive chefs are crafting delicious bites in very small spaces, all for us to enjoy!

This year we’re doing our list a little bit different. For this edition, we’ve based our results only on reviews from the past year, allowing for some exciting new inclusions. And because we know this list is going to make you hungry, we’ve also omitted any carts not currently serving the public. #FOMO is real and we don’t want to be the cause…

As things are always changing, be sure to double-check the hours of operation before visiting. Want a more portable list? Click here for a Yelp bookmark collection, sortable by distance so that you’ll always be near a delicious new place to try!

50 – Bella’s Cravings (King) – How do you know you’re in Portland? When you find a food cart specializing in organic Armenian and Swedish fusion! Heavy on saffron, sumac, and tumeric, the menu has surprising twists on dishes such as chicken kebab and fish & barberry rice.  

49 – Tacos Pa’Ella ( Alberta Arts District)

48 – A Taste of Greek (Downtown)

47 – J Vein Caffé (Rose City Park)

46 – Bark City BBQ (Rose City Park)

45 – Gyro Grill (Boring)

44 – Bing Mi Food Truck (Alphabet District)

43 – Flourish Plant-Based Kitchen (St Johns) – There’s plenty of options at the St John’s Beer Porch, but to our knowledge only one offers a chickpea parm sandwich. The cashew mozzarella is made in-cart, and the whole thing comes on a gluten-free bun, making this a meal that truly everyone can enjoy.

42 – Tacos El Patron (Beaverton)

41 – Flew the Coop (Rose City Park)

Bella’s Cravings

40 – Ramen Ippo (Alphabet District) – It takes seven hours of boiling chicken and vegetables to make the broth for their namesake ippo ramen, but one taste and you’ll know it’s worth the effort. For those feeling less soupy, meal boxes offer everything from karaage to fried oysters to shrimp cutlets.

39 – Ditto! Grilled Cheese Made Vegan (Parkrose Heights)

38 – Bluebird Thai (Multnomah Village)

37 – PDX Dönerländ (King)

36 – Dinner Bell BBQ (North Tabor)

35 – Kazumi Sushi (St. Johns)

34 – La Arepa (Mt Scott- Arleta) – Venezuelan flatbread may be packed with flavor on its own, but it’s even better as vessel for fillings like pabellón (shredded beef and black beans), reina pepiada (chopped chicken salad with avocado), or perico (scrambled eggs with sweet peppers and tomato). 

33 – El Pilón (Downtown)

32 – Noah Halal (Downtown)

31 – Pepe Chile Taqueria & Catering (Eliot)

Ramen Ippo

30 – La Real Taqueria (Tigard)

29 – Rocket Breakfast (Rose City Park) – If you consider food carts more of a lunchtime affair, the team at Rocket Breakfast want to change your mind. Lemon ricotta pancakes with fresh strawberry syrup will satisfy your sweet tooth. Those that start the day more savory might prefer the open-faced egg sandwich.

28 – Holy Trinity BBQ (Crestin-Kenilworth)

27 – Demarco’s Sandwiches (Richmond)

26 – Long Do Thai (Arbor Lodge)

25 – Hapa Howie’s (King)

24 – The French Toast Connection (Downtown)

23 – Kee’s Loaded Kitchen (King)

22 – 6Tusks Asian Fusion (Brentwood-Darlington) Pork belly buns (both steamed and fried) are a Yelper favorite at this Laotian food cart. Round out your meal with fish sauce wings or the coconut crepe roll, then treat yourself to desert with an elephant ear!

21 – Jojo (Crestin-Kenilworth)

6Tusk Asian Fusion

20 –  Supernova Vegan (Sellwood)

19 – The Meddling Lime (Sellwood)

18 – Ingrid’s GoodStreetFood & Paleo Grill (Vancouver) – The only cart on our list that’s north of the Columbia, this cart makes it easy to eat like a caveman! The addition of beets makes for a unique twist on hummus, and the (not-quite-paleo) gyro comes with a whopping half pound of lamb!

17 – Chicagoland Deep Dish Pizza (Damascus) 

16 – Matt’s BBQ Tacos (Sunnyside)

15 – Kasoy & Co (Gresham)

14 – Botto’s BBQ (Northwest) 

13 – Dinger’s Deli (Sunnyside) – It may be 100% plant based, but vegan, vegetarian, or omnivore, this cart has a sandwich for everyone. The jackfruit cubano is so good you’d never know it’s not ham, and the vegball sub is packed with garlic and herbs like fennel and basil. If you just can’t get enough, they even sell bulk meatz to-go!

12 – Matt’s BBQ (Boise)

11 – Yoshi’s Sushi (Multnomah Village)

Dinger’s Deli

10 – South (Buckman) – After spending a year in the Hawthorne Asylum food pod, this Southern food destination moved digs to Base Camp Brewing. Spicy or regular, the fried chicken sandwich is something to behold and pairs perfectly with their hush puppies and fried okra.

9 – MF Tasty (N Williams) – After a brief hiatus to get their bearings, MF Tasty is back and feeling experimental. With a menu that is “Southwest inspired, Portland made,” their weekend dinners could be a mac and cheese wrap, could be a MF salad bar! Whatever it is, it’s gonna be good.

8 – Iolani’s Plate Lunch (Happy Valley) – Hawaii comes to Happy Valley! Sure they serve the standards like kalua pig and spam musubi, but Yelpers in the know say to try the guava chicken and pastele stew. The food is cooked to order and WILL sell out, so it’s smart to call ahead. 

7 – Grind Wit Tryz (Piedmont) – The owners moved from Oahu to PDX and are now serving both Filipino and Hawaiian-style plate lunches and overflowing poke bowls. Yelpers say the chunks of fresh ahi are huge and at just over $10, easy on the wallet. 

6 – Baby Blue Woodfired Pizza (Sunnyside) – Vegan woodfired pizzas that are guaranteed to satisfy even the staunchest of carnivores. After shrinking their hours to weekends only, they’re now open on Mondays with a special all gluten-free menu. Balance out the carbs with a vegan kale caesar salad that Yelpers say will leave you feeling fresh and healthy.  

5 – Bake on the Run (Buckman) – There’s not a lot of Guyanese food in Portland, but that doesn’t mean Bake on the Run is content with relying on novelty. The “bake” is a semi sweet handheld puff bread, stuffed to capacity with ingredients like Portuguese salted cod or chickpea potato curry.

4 – Hit the Spot! (Rose City Park) – Portland food carts are known to offer some serious culinary adventures, but sometimes a burger and fries just, you know, hits the spot? Serving “farm-to-table fast food”, this cart delivers on flavor without weighing you down with grease. And frugal foodies rejoice: their basic burgers start at only $5! 

3 – Fried Egg I’m in Love (Pioneer Courthouse Square) – Come for the punny names, and stay for some of Portland’s most iconic breakfast sandwiches. The Yolko Ono is a PDX classic, or you can kick it up a notch with the Sriracha Mix-a-Lot. Save your shirt and get it “commuter style” for a (far less messy) cooked-through yolk. 

2 – Thai Champa (Buckman) – Tucked away in the parking lot behind Union Jacks, Thai Champa is not easy to find and well worth the effort. The pad see ew is to die for, and if you didn’t get an order of crab puffs, did you even go in the first place? Warning: Order wisely, because spicy means spicy! 

1 – Mumbo Gumbo (Sellwood) – Mumbo Gumbo Serves up some of Portland’s very best cajun cuisine, and they pride themselves on having something for everybody. Both their gumbo and red beans can be customized for a vegan diet, but omnivores would be remiss to miss the shrimp and andouille sausage. Weekends are something special thanks to their Cajun crab boil. If you’re feeling sweet, finish your meal with the Brandon’s Nana Pudd’n, which features fresh caramel dredged bananas.

Mumbo Gumbo

Methodology: This is a list of 2020’s best food carts in the greater Portland area according to Yelp. We identified businesses in the food trucks category, then ranked those spots using a number of factors including the total volume and ratings of reviews between May 1, 2019 through May 26, 2020. This list looked at businesses in the counties of Multnomah, Clackamas, Washington and Clark. When available, all businesses on this list have a passing health score or a score greater than a B/80 as of May 27th, 2020.

[gravityform id="4" title="false" ajax="true"]
<script type="text/javascript">var gform;gform||(document.addEventListener("gform_main_scripts_loaded",function(){gform.scriptsLoaded=!0}),window.addEventListener("DOMContentLoaded",function(){gform.domLoaded=!0}),gform={domLoaded:!1,scriptsLoaded:!1,initializeOnLoaded:function(o){gform.domLoaded&&gform.scriptsLoaded?o():!gform.domLoaded&&gform.scriptsLoaded?window.addEventListener("DOMContentLoaded",o):document.addEventListener("gform_main_scripts_loaded",o)},hooks:{action:{},filter:{}},addAction:function(o,n,r,t){gform.addHook("action",o,n,r,t)},addFilter:function(o,n,r,t){gform.addHook("filter",o,n,r,t)},doAction:function(o){gform.doHook("action",o,arguments)},applyFilters:function(o){return gform.doHook("filter",o,arguments)},removeAction:function(o,n){gform.removeHook("action",o,n)},removeFilter:function(o,n,r){gform.removeHook("filter",o,n,r)},addHook:function(o,n,r,t,i){null==gform.hooks[o][n]&&(gform.hooks[o][n]=[]);var e=gform.hooks[o][n];null==i&&(i=n+"_"+e.length),gform.hooks[o][n].push({tag:i,callable:r,priority:t=null==t?10:t})},doHook:function(n,o,r){var t;if(r=Array.prototype.slice.call(r,1),null!=gform.hooks[n][o]&&((o=gform.hooks[n][o]).sort(function(o,n){return o.priority-n.priority}),o.forEach(function(o){"function"!=typeof(t=o.callable)&&(t=window[t]),"action"==n?t.apply(null,r):r[0]=t.apply(null,r)})),"filter"==n)return r[0]},removeHook:function(o,n,t,i){var r;null!=gform.hooks[o][n]&&(r=(r=gform.hooks[o][n]).filter(function(o,n,r){return!!(null!=i&&i!=o.tag||null!=t&&t!=o.priority)}),gform.hooks[o][n]=r)}});</script> <div class='gf_browser_unknown gform_wrapper gform_legacy_markup_wrapper' id='gform_wrapper_4' ><div id='gf_4' class='gform_anchor' tabindex='-1'></div> <div class='gform_heading'> <span class='gform_description'></span> </div><form data-form-name='Newsletter Signup Popup' method='post' enctype='multipart/form-data' target='gform_ajax_frame_4' id='gform_4' action='/community/portlands-top-50-currently-open-food-carts/#gf_4' novalidate> <div class='gform_body gform-body'><ul id='gform_fields_4' class='gform_fields top_label form_sublabel_below description_below'><li id="field_4_1" class="gfield field_sublabel_below field_description_below hidden_label gfield_visibility_visible gf-email" data-field-class="gf-email" data-js-reload="field_4_1"><label class='gfield_label screen-reader-text' for='input_4_1' >youremail@address.com</label><div class='ginput_container ginput_container_email'> <input name='input_1' id='input_4_1' type='email' value='' class='large' placeholder='youremail@address.com' aria-invalid="false" /> </div></li><li id="field_4_2" class="gfield gform_validation_container field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_4_2"><label class='gfield_label' for='input_4_2' >Comments</label><div class='ginput_container'><input name='input_2' id='input_4_2' type='text' value='' autocomplete='new-password'/></div><div class='gfield_description' id='gfield_description_4_2'>This field is for validation purposes and should be left unchanged.</div></li></ul></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_4' class='gform_button button' value='Submit' onclick='if(window["gf_submitting_4"]){return false;} if( !jQuery("#gform_4")[0].checkValidity || jQuery("#gform_4")[0].checkValidity()){window["gf_submitting_4"]=true;} ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_4"]){return false;} if( !jQuery("#gform_4")[0].checkValidity || jQuery("#gform_4")[0].checkValidity()){window["gf_submitting_4"]=true;} jQuery("#gform_4").trigger("submit",[true]); }' /> <input type='hidden' name='gform_ajax' value='form_id=4&amp;title=&amp;description=1&amp;tabindex=0' /> <input type='hidden' class='gform_hidden' name='is_submit_4' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='4' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_4' value='WyJbXSIsImE0YjFiMmUxY2IxMWVhYTljM2FhNzdkODk4NDUzZmY0Il0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_4' id='gform_target_page_number_4' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_4' id='gform_source_page_number_4' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> </form> </div> <iframe style='display:none;width:0px;height:0px;' src='about:blank' name='gform_ajax_frame_4' id='gform_ajax_frame_4' title='This iframe contains the logic required to handle Ajax powered Gravity Forms.'></iframe> <script> gform.initializeOnLoaded( function() {gformInitSpinner( 4, 'https://blog.yelp.com/wp-content/plugins/gravityforms/images/spinner.svg' );jQuery('#gform_ajax_frame_4').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_4');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_4').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_4').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_4').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_4').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */ jQuery(document).scrollTop(jQuery('#gform_wrapper_4').offset().top - mt); }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_4').val();gformInitSpinner( 4, 'https://blog.yelp.com/wp-content/plugins/gravityforms/images/spinner.svg' );jQuery(document).trigger('gform_page_loaded', [4, current_page]);window['gf_submitting_4'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}setTimeout(function(){jQuery('#gform_wrapper_4').replaceWith(confirmation_content);jQuery(document).scrollTop(jQuery('#gf_4').offset().top - mt);jQuery(document).trigger('gform_confirmation_loaded', [4]);window['gf_submitting_4'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_4').text());}, 50);}else{jQuery('#gform_4').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger('gform_post_render', [4, current_page]);} );} ); </script>
[gravityform id="4" title="false" ajax="true"]
<div class='gf_browser_unknown gform_wrapper gform_legacy_markup_wrapper' id='gform_wrapper_4' ><div id='gf_4' class='gform_anchor' tabindex='-1'></div> <div class='gform_heading'> <span class='gform_description'></span> </div><form data-form-name='Newsletter Signup Popup' method='post' enctype='multipart/form-data' target='gform_ajax_frame_4' id='gform_4' action='/community/portlands-top-50-currently-open-food-carts/#gf_4' novalidate> <div class='gform_body gform-body'><ul id='gform_fields_4' class='gform_fields top_label form_sublabel_below description_below'><li id="field_4_1" class="gfield field_sublabel_below field_description_below hidden_label gfield_visibility_visible gf-email" data-field-class="gf-email" data-js-reload="field_4_1"><label class='gfield_label screen-reader-text' for='input_4_1' >youremail@address.com</label><div class='ginput_container ginput_container_email'> <input name='input_1' id='input_4_1' type='email' value='' class='large' placeholder='youremail@address.com' aria-invalid="false" /> </div></li><li id="field_4_2" class="gfield gform_validation_container field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_4_2"><label class='gfield_label' for='input_4_2' >Name</label><div class='ginput_container'><input name='input_2' id='input_4_2' type='text' value='' autocomplete='new-password'/></div><div class='gfield_description' id='gfield_description_4_2'>This field is for validation purposes and should be left unchanged.</div></li></ul></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_4' class='gform_button button' value='Submit' onclick='if(window["gf_submitting_4"]){return false;} if( !jQuery("#gform_4")[0].checkValidity || jQuery("#gform_4")[0].checkValidity()){window["gf_submitting_4"]=true;} ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_4"]){return false;} if( !jQuery("#gform_4")[0].checkValidity || jQuery("#gform_4")[0].checkValidity()){window["gf_submitting_4"]=true;} jQuery("#gform_4").trigger("submit",[true]); }' /> <input type='hidden' name='gform_ajax' value='form_id=4&amp;title=&amp;description=1&amp;tabindex=0' /> <input type='hidden' class='gform_hidden' name='is_submit_4' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='4' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_4' value='WyJbXSIsImE0YjFiMmUxY2IxMWVhYTljM2FhNzdkODk4NDUzZmY0Il0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_4' id='gform_target_page_number_4' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_4' id='gform_source_page_number_4' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> </form> </div> <iframe style='display:none;width:0px;height:0px;' src='about:blank' name='gform_ajax_frame_4' id='gform_ajax_frame_4' title='This iframe contains the logic required to handle Ajax powered Gravity Forms.'></iframe> <script> gform.initializeOnLoaded( function() {gformInitSpinner( 4, 'https://blog.yelp.com/wp-content/plugins/gravityforms/images/spinner.svg' );jQuery('#gform_ajax_frame_4').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_4');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_4').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_4').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_4').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_4').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */ jQuery(document).scrollTop(jQuery('#gform_wrapper_4').offset().top - mt); }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_4').val();gformInitSpinner( 4, 'https://blog.yelp.com/wp-content/plugins/gravityforms/images/spinner.svg' );jQuery(document).trigger('gform_page_loaded', [4, current_page]);window['gf_submitting_4'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}setTimeout(function(){jQuery('#gform_wrapper_4').replaceWith(confirmation_content);jQuery(document).scrollTop(jQuery('#gf_4').offset().top - mt);jQuery(document).trigger('gform_confirmation_loaded', [4]);window['gf_submitting_4'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_4').text());}, 50);}else{jQuery('#gform_4').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger('gform_post_render', [4, current_page]);} );} ); </script>