Spicy Grilled Pork Salad
4
servings
Main
Course
Print Recipe
Ingredients
Directions
Ingredients
2 lb
well-marbled boneless pork shoulder
Jump
1 tbsp
packed grated palm sugar or granulated coconut sugar, or 2 teaspoons packed light brown sugar
Jump
1 tsp
salt
Jump
2 tbsp
Thai glutinous rice (see headnote)
Jump
½ c
chicken stock
Jump
2 tbsp
fish sauce
Jump
¼ c
very thinly sliced shallots
Jump
¼ c
fresh lime juice
Jump
Red pepper flakes, for seasoning
Jump
¼ c
roughly chopped fresh cilantro leaves and stems
Jump
½ c
loosely packed fresh mint leaves
Jump
3-4
dried red bird’s eye chiles, for garnish
Jump
2-3
wedges green cabbage, for serving
Jump
Cooked sticky rice or jasmine rice, for serving
Jump

Lightly marinated pork shoulder, grilled over hot coals just until smoky and charred on the outside and barely pink on the inside, is a good eat. But sliced up and doused with dressing—a beautiful interplay of fragrant herbs, funky fish sauce, vibrant lime juice, smoky dried chiles, and nutty ground toasted rice—it becomes the glorious nam tok mu, a beloved classic from northeastern Thailand.

This dish is cooked twice quickly—but twice nonetheless. So it’s important to use the right cut of pork: nothing too lean, like pork loin or tenderloin, or too fatty or too tough to eat (unless slow cooked), like pork belly. Well-marbled boneless pork shoulder is your Goldilocks. If you ask me, nothing else will do.

This grilled pork salad is served warm—neither piping hot nor at room temperature—traditionally with sticky rice.

Directions

  1. Cut the pork into large slices 1⁄2 inch thick. Prick each slice a few times with a fork. In a medium bowl, stir together the sugar and salt. Add the pork and rub the sugar mixture evenly into the strips. Cover and refrigerate for 3 to 4 hours.
  2. Meanwhile, in a dry small frying pan, toast the rice over medium-low heat, stirring almost constantly, until the grains are golden brown and have a nutty aroma, about 15 minutes. Immediately transfer the rice to a small heatproof bowl and let cool completely (do not leave it in the pan, as it will continue to toast). In a small food processor or a mortar, grind the rice to a coarse powder. Measure out 2 tablespoons for serving; discard the rest or keep it for a future use.
  3. Light a full chimney of charcoal. When the coals are ready, spread them out on the bottom of a kettle grill or hibachi for cooking over a high fire.
  4. When the coals are covered with white ash and the grate is hot, place the pork on the grate and cook (with the lid off if using a kettle grill), flipping often, until lightly but thoroughly charred on the outside yet still rare on the inside, 5 to 6 minutes. Transfer to a plate, cover, and let rest for 15 minutes.
  5. Cut the pork against the grain into bite-size slices about 1⁄4 inch thick. Transfer the slices along with any accumulated juices to a 2-quart saucepan (one that is wide and shallow works better than one that is narrow and deep). Add the stock, set it over medium-high heat, and heat, stirring often. When the liquid forms tiny bubbles around the edge of the pan, add the fish sauce and stir briskly to make sure every piece of pork is cooked—though ever so lightly. Immediately remove the pan from the heat and, while everything is still warm, stir in the shallots and lime juice. Taste and adjust the seasoning with more fish sauce and lime juice. Keep in mind that this is not a delicately seasoned salad—northeastern Thai dishes typically pack a punch! You want it predominantly sour, then salty, with a faint sweetness from the natural pork juice and what’s left of the sugar in the marinade. Also, don’t forget that you’re eating this with bland rice, so season accordingly.
  6. Once it tastes good to you, decide how spicy hot you want it and stir in as much pepper flakes as you like. Now, quickly stir in the cilantro and 1 tablespoon of the toasted rice and stir vigorously to wilt the herbs slightly and disperse the rice evenly.
  7. Arrange the salad on a platter. Sprinkle the remaining 1 tablespoon toasted rice on top, followed by the mint leaves. Garnish with the dried chiles, which you can crumble into the salad for extra heat. Serve immediately with the cabbage and enjoy with warm rice.

Reprinted with permission from Flavors of the Southeast Asian Grill: Classic Recipes for Seafood and Meats Cooked Over Charcoal by Leela Punyaratabandhu. Copyright© 2020 shesimmers.com. Photographs copyright ©2020 by David Loftus. Published by Ten Speed Press, an imprint of Penguin Random House.

[email_signup id="3"]
<div class="email-subscribe exp-subscribe subscribe"> <div class="alert alert-success exp-success ga-etembed-success" style="display:none;"> Great! You've signed up successfully! </div> <div class="alert alert-danger exp-error" style="display:none;"> We are experiencing an error, please try again. </div> <form name="subscribe" id="email-signup" class="email-signup-form" action="https://www.tastecooking.com/wp-admin/admin-ajax.php" method="POST" target="_top" data-event-assigned="false"> <fieldset class="form-group form-inline email-submit-group"> <label for="email-address" class="sr-only">Email Address</label> <input id="email-newsletter" type="email" placeholder="your@email.com" class="email-newsletter text email form-control" name="email" value=""> <button type="submit" value="Subscribe" name="subscribe" class="btn btn-primary email-submit-btn ga-etembed-success"> <i class="fa fa-envelope"></i> Subscribe </button> </fieldset> <small class="exp-small terms" style=""> By clicking Subscribe, I acknowledge that I have read and agree to the Penguin Random House <a href="http://www.penguinrandomhouse.com/privacy/" target="_blank">Privacy Policy</a> and <a href="http://www.penguinrandomhouse.com/terms/" target="_blank">Terms of Use</a> and agree to receive news and updates from TASTE and Penguin Random House. </small> <fieldset class="field-group checkboxes" style="display:none"> <div class="checkbox"> <label> <input type="checkbox" name="programs[]" value="505,50501,1" class="exp-checkbox" checked="checked"> <span><strong>Tastebook General</strong></span> </label> </div> <div class="checkbox"> <label> <input type="checkbox" name="programs[]" value="505,50502,1" class="exp-checkbox" checked="checked"> <span><strong>Tastebook Promo</strong></span> </label> </div> </fieldset><!-- /.checkboxes --> <input type="hidden" name="data_acq_code" value="TASTE_POPUP_STATIC_ONGOING" /> <input type="hidden" name="data_programs" value="50501|505,50502|505" /> <input type="hidden" name="form_id" value="3" /> <input type="hidden" name="partner" value="" /> <input type="hidden" name="action" value="crown_email_signup_submit" /> <input type="hidden" name="ref_url" value="" /> </form> </div> <script> jQuery(document).ready(function () { var unassigned_forms; setInterval( function() { //Check for unassigned forms var forms = jQuery( '.email-signup-form' ); unassigned_forms = false; forms.each( function( index ) { if ( jQuery( this ).attr( 'data-event-assigned' ) === 'false' ) { unassigned_forms = true; } }); if ( unassigned_forms ) { forms.off( 'submit' ).on( 'submit', function ( e ) { forms.attr( 'data-event-assigned', 'true' ); e.preventDefault(); // Basic email validation var email = jQuery(e.target).find('.email-newsletter').val(), valid_email = false, groupEl = jQuery(e.target).closest('.email-subscribe'); if ( !!email && typeof(email) === "string" ) { var email_array = email.split('@'); if ( email_array.length === 2 ) { if ( email_array[1].split('.').length > 1 ) { valid_email = true; } } } if ( valid_email ) { jQuery('.alert-danger').hide(); // Show loading gif groupEl.find('.email-signup-form').hide(); groupEl.find('.email-submit-loading').show(); // Populate ref_url jQuery(this).find('input[name="ref_url"]').val(window.location.href); // Generate Payload var payload = jQuery(this).serializeArray(); jQuery.ajax({ url: jQuery(this).attr('action'), type: 'POST', data: payload, success: function (data) { // Hide loading spinner groupEl.find('.email-signup-form').show(); groupEl.find('.email-submit-loading').hide(); // Display success msg var target = jQuery(e.target); jQuery(e.target).hide(); jQuery(e.target).parent().find('.alert-success').show(); jQuery(e.target).parent().find('#downloadbtn').show(); }, fail: function (err) { // Hide loading spinner groupEl.find('.email-signup-form').show(); groupEl.find('.email-submit-loading').hide(); // Display failure msg var target = jQuery(e.target); jQuery(e.target).hide(); jQuery(e.target).parent().find('.alert-danger').show(); } }); } else { groupEl.find('.alert-danger').html('Please enter a valid email address.').show(); } }); forms.off( 'keypress' ).on( 'keypress', function ( e ) { if ( e.which === 13 ) { e.preventDefault(); jQuery( this ).submit(); } }); } }, 100); }); </script>
[email_signup id="3"]
<div class="email-subscribe exp-subscribe subscribe"> <div class="alert alert-success exp-success ga-etembed-success" style="display:none;"> Great! You've signed up successfully! </div> <div class="alert alert-danger exp-error" style="display:none;"> We are experiencing an error, please try again. </div> <form name="subscribe" id="email-signup" class="email-signup-form" action="https://www.tastecooking.com/wp-admin/admin-ajax.php" method="POST" target="_top" data-event-assigned="false"> <fieldset class="form-group form-inline email-submit-group"> <label for="email-address" class="sr-only">Email Address</label> <input id="email-newsletter" type="email" placeholder="your@email.com" class="email-newsletter text email form-control" name="email" value=""> <button type="submit" value="Subscribe" name="subscribe" class="btn btn-primary email-submit-btn ga-etembed-success"> <i class="fa fa-envelope"></i> Subscribe </button> </fieldset> <small class="exp-small terms" style=""> By clicking Subscribe, I acknowledge that I have read and agree to the Penguin Random House <a href="http://www.penguinrandomhouse.com/privacy/" target="_blank">Privacy Policy</a> and <a href="http://www.penguinrandomhouse.com/terms/" target="_blank">Terms of Use</a> and agree to receive news and updates from TASTE and Penguin Random House. </small> <fieldset class="field-group checkboxes" style="display:none"> <div class="checkbox"> <label> <input type="checkbox" name="programs[]" value="505,50501,1" class="exp-checkbox" checked="checked"> <span><strong>Tastebook General</strong></span> </label> </div> <div class="checkbox"> <label> <input type="checkbox" name="programs[]" value="505,50502,1" class="exp-checkbox" checked="checked"> <span><strong>Tastebook Promo</strong></span> </label> </div> </fieldset><!-- /.checkboxes --> <input type="hidden" name="data_acq_code" value="TASTE_POPUP_STATIC_ONGOING" /> <input type="hidden" name="data_programs" value="50501|505,50502|505" /> <input type="hidden" name="form_id" value="3" /> <input type="hidden" name="partner" value="" /> <input type="hidden" name="action" value="crown_email_signup_submit" /> <input type="hidden" name="ref_url" value="" /> </form> </div> <script> jQuery(document).ready(function () { var unassigned_forms; setInterval( function() { //Check for unassigned forms var forms = jQuery( '.email-signup-form' ); unassigned_forms = false; forms.each( function( index ) { if ( jQuery( this ).attr( 'data-event-assigned' ) === 'false' ) { unassigned_forms = true; } }); if ( unassigned_forms ) { forms.off( 'submit' ).on( 'submit', function ( e ) { forms.attr( 'data-event-assigned', 'true' ); e.preventDefault(); // Basic email validation var email = jQuery(e.target).find('.email-newsletter').val(), valid_email = false, groupEl = jQuery(e.target).closest('.email-subscribe'); if ( !!email && typeof(email) === "string" ) { var email_array = email.split('@'); if ( email_array.length === 2 ) { if ( email_array[1].split('.').length > 1 ) { valid_email = true; } } } if ( valid_email ) { jQuery('.alert-danger').hide(); // Show loading gif groupEl.find('.email-signup-form').hide(); groupEl.find('.email-submit-loading').show(); // Populate ref_url jQuery(this).find('input[name="ref_url"]').val(window.location.href); // Generate Payload var payload = jQuery(this).serializeArray(); jQuery.ajax({ url: jQuery(this).attr('action'), type: 'POST', data: payload, success: function (data) { // Hide loading spinner groupEl.find('.email-signup-form').show(); groupEl.find('.email-submit-loading').hide(); // Display success msg var target = jQuery(e.target); jQuery(e.target).hide(); jQuery(e.target).parent().find('.alert-success').show(); jQuery(e.target).parent().find('#downloadbtn').show(); }, fail: function (err) { // Hide loading spinner groupEl.find('.email-signup-form').show(); groupEl.find('.email-submit-loading').hide(); // Display failure msg var target = jQuery(e.target); jQuery(e.target).hide(); jQuery(e.target).parent().find('.alert-danger').show(); } }); } else { groupEl.find('.alert-danger').html('Please enter a valid email address.').show(); } }); forms.off( 'keypress' ).on( 'keypress', function ( e ) { if ( e.which === 13 ) { e.preventDefault(); jQuery( this ).submit(); } }); } }, 100); }); </script>