Frozen Coconut Parfait with Tapioca, Peanut, Corn, and Cherry
8
servings
Dessert
Course
Print Recipe
Ingredients
Directions
Frozen Coconut Parfait
1 ¾ c
coconut milk from a can (not reduced fat)
Jump
1 c
sweetened condensed milk
Jump
½ tsp
salt
Jump
1 tbsp
vanilla extract
Jump
4
egg whites from large eggs
Jump
c
granulated sugar
Jump
1 ½ c
heavy cream, whipped, kept cold
Jump
Salted Palm Sugar Caramel
2 tbsp
water
Jump
2 tbsp
lime juice
Jump
¼ c
palm sugar or granulated sugar
Jump
c
coconut milk
Jump
¾ tsp
salt
Jump
1 tbsp
vanilla extract
Jump
To Serve
¼ c
tapioca pearls
Jump
½ c
plus 1 tablespoon peanuts, toasted and roughly chopped
Jump
¼ c
corn kernels
Jump
½ c
cherries, halved and pitted
Jump

Pichet Ong grew up eating hand-spun coconut ice cream all over Southeast Asia. On the streets of Bangkok, vendors wheel around carts with a freezing canister that houses the fluffy treat, kept frozen with dry ice. They always offer a choice of toppings, which generally include sweet sticky rice, sweet corn kernels, sliced jackfruit, and peanuts. Since then, as a pastry chef in California, New York, and now Washington, DC, Ong has served a dessert inspired by that classic combination, always with the addition of locally available, seasonal fruit.

Here is a version with peanuts, tapioca, corn, cherries, and a salted caramel sauce. This recipe uses whipped cream and egg whites to give the custard base a creamy, fluffy texture without an ice cream machine, but you can also skip that step and use your favorite store-bought coconut ice cream if needed.

Note: Canned coconut milk can be purchased at nearly any grocery store. Look for brands that contain only coconut and filtered water.

Directions

Frozen Coconut Parfait
  1. In a 2-quart saucepan, cook the coconut milk, condensed milk, and salt over medium-high heat, stirring constantly until mixture comes to a boil. Scrape the bottom of the pot so mixture doesn't stick or burn, and cook until slightly thickened, about 3 minutes. Transfer to a bowl, stir in vanilla extract, and set aside to cool.
  2. Whip egg whites in a stand mixer or with a handheld mixer at medium speed until foamy. Increase speed to high, and add sugar about 1 tablespoon at a time. Whip until firm, glossy peaks form.
  3. To finish parfait, fold whipped cream into cooled coconut mixture, and then gently fold in the meringue.
  4. Spoon coconut parfait into 8 molds, glasses, or small bowls. Cover with plastic wrap, gently pressing plastic onto surface of parfait. Freeze parfaits until firm, at least 6 hours, or overnight. Parfaits can be kept in freezer, covered, up to 1 week.
Salted Palm Sugar Caramel
  1. In a small saucepan, bring water, lime juice, and sugar to a boil. Do not stir. Cook, swirling the pan occasionally, until mixture caramelizes and turns a deep brown.
  2. Turn off heat, and add coconut milk. Mixture may splatter; stir to combine. Return pan to heat, and bring mixture to a boil, whisking away lumps. Stir in vanilla. Set aside to cool, for at least one hour. Sauce can be kept covered at room temperature for up to 2 days.
To Serve
  1. In a 3-quart sauce pan, bring 1 quart of water to a boil. Add tapioca, and cook over medium high heat for about 12 minutes, or until pearls are translucent. Drain and stir in 2 tablespoons of the cooled caramel sauce. Cover, and set aside to cool at room temperature, at least 1 hour, and up to 8 hours.
  2. In a small bowl, mix toasted peanuts with corn kernels.
  3. Divide tapioca among 8 chilled serving bowls. Unmold the frozen parfaits on top of the tapioca. Top with peanut caramel and 4-5 cherry halves per serving. Serve immediately.

Daniela Galarza

Daniela Galarza is a writer and reporter who covers food, restaurants, cooking, and culture. She used to be a pastry chef. These days she puts her culinary degree to use by making birthday cakes for friends. She lives in New York with her dog Frito.

[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://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://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>