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

Harissa Sauce

5 Stars 4 Stars 3 Stars 2 Stars 1 Star

No reviews

const share_pin_buttons = document.getElementsByClassName( 'share-pin button' ); if ( share_pin_buttons ) { for ( let share_key = 0; share_key { e.stopPropagation(); window.open(e.target.dataset.href,'targetWindow','toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=500,height=500'); return false; } ); } }

Harissa is a spicy and flavorful North African chili paste that adds a kick to many dishes. You can use it as a marinade for meats, a topping for grilled vegetables, or a flavor boost for sauces and dressings.

  • Total Time: 30 minutes

Ingredients

Scale
  • 1012 chili peppers (such as Fresno or red jalapeños), stems removed
  • 3 cloves of garlic
  • 1 teaspoon of coriander (cilantro) seeds
  • 1 teaspoon of caraway seeds
  • 1 teaspoon of cumin seeds
  • 1/2 teaspoon of paprika
  • 1/2 teaspoon of salt
  • 2 tablespoons of tomato paste
  • 2 tablespoons of olive oil
  • 1 tablespoon of lemon juice

Instructions

  • Prepare chili peppers
    Place the dried red chili peppers in a bowl and cover them with hot water. Let them soak for about 30 minutes or until they become softened.
  • Temper spices
    In a dry skillet over medium heat, toast the coriander seeds, caraway seeds, and cumin seeds until fragrant. This should take about 1-2 minutes. Be careful not to burn them.
  • Blend
    Drain the soaked chili peppers and add them to a food processor or blender along with the toasted seeds, garlic, smoked paprika, salt, tomato paste, olive oil, and lemon juice. Blend the ingredients until you achieve a smooth and thick paste. If the mixture is too thick, you can add a bit more olive oil or water to reach your desired consistency.
  • Taste and adjust
    Taste the harissa and adjust the salt and spice level according to your preference. You can add more chili peppers for extra heat.
  • Store
    Once you are satisfied with the flavor and consistency, transfer the harissa to a clean jar or airtight container. Store the harissa in the refrigerator for up to a few weeks. The flavors will continue to develop over time.

Notes

Equipment

  • Food Processor
  • mixing bowl(s)
  • measuring spoons
  • skillet
  • Author: Queen of Tarts - Admin
  • Prep Time: 30
window.trCommon={"minRating":6,"ajaxurl":"https:\/\/www.sharedrecipes.club\/wp-admin\/admin-ajax.php","ratingNonce":"","postId":132798}; window.TastyRecipes = window.TastyRecipes || {}; window.TastyRecipes.smoothScroll = { init() { document.addEventListener( 'click', ( e ) => { let anchor = e.target; if ( anchor.tagName !== 'A' ) { anchor = anchor.closest( 'a.tasty-recipes-scrollto' ); } if ( ! anchor || ! anchor.classList.contains( 'tasty-recipes-scrollto' ) ) { return; } const elementHref = anchor.getAttribute( 'href' ); if ( ! elementHref ) { return; } e.preventDefault(); this.goToSelector( elementHref ); }); }, goToSelector( selector ) { const element = document.querySelector( selector ); if ( ! element ) { return; } element.scrollIntoView( { behavior: 'smooth' } ); } }; document.addEventListener( 'DOMContentLoaded', () => window.TastyRecipes.smoothScroll.init() ); (function(){ var bothEquals = function( d1, d2, D ) { var ret = 0; if (d1<=D) { ret++; } if (d2<=D) { ret++; } return ret === 2; }; var frac =function frac(x,D,mixed){var n1=Math.floor(x),d1=1;var n2=n1+1,d2=1;if(x!==n1){while(bothEquals(d1,d2,D)){var m=(n1+n2)/(d1+d2);if(x===m){if(d1+d2d2){d2=D+1;}else {d1=D+1;}break}else if(xD){d1=d2;n1=n2}if(!mixed){return[0,n1,d1];}var q=Math.floor(n1/d1);return[q,n1-q*d1,d1]};frac.cont=function cont(x,D,mixed){var sgn=x<0?-1:1;var B=x*sgn;var P_2=0,P_1=1,P=0;var Q_2=1,Q_1=0,Q=0;var A=Math.floor(B);while(Q_1<D){A=Math.floor(B);P=A*P_1+P_2;Q=A*Q_1+Q_2;if(B-AD){if(Q_1>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 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; const printLinks = document.querySelectorAll( '.tasty-recipes-print-link' ); printLinks.forEach( ( el ) => { el.href = newURL; }); const printButtons = document.querySelectorAll( '.tasty-recipes-print-button' ); 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 ) { 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(); }); }); }()); (function(){ document.querySelectorAll('[data-tr-ingredient-checkbox]').forEach(function(el) { var input = el.querySelector('.tr-ingredient-checkbox-container input[type="checkbox"]'); if ( ! input ) { return; } if (input.checked) { el.dataset.trIngredientCheckbox = 'checked'; } el.addEventListener('click', function(event) { if ( 'A' === event.target.nodeName || 'INPUT' === event.target.nodeName || 'LABEL' === event.target.nodeName ) { return; } input.click(); }); input.addEventListener('change', function() { el.dataset.trIngredientCheckbox = input.checked ? 'checked' : ''; }); }); }()); 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) { if (checkbox.checked) { this.lock(); } else { 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", () => { 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.staticTooltip = { element: null, tooltipElement: null, deleting: false, init( element ) { if ( this.deleting ) { return; } this.element = element; this.buildElements(); }, destroy() { if ( ! this.tooltipElement || this.deleting ) { return; } this.deleting = true; this.tooltipElement.classList.remove( 'opened' ); setTimeout( () => { this.tooltipElement.remove(); this.deleting = false; }, 500 ); }, buildElements() { const tooltipElement = document.createElement( 'div' ); tooltipElement.classList.add( 'tasty-recipes-static-tooltip'); tooltipElement.setAttribute( 'id', 'tasty-recipes-tooltip' ); const currentTooltipElement = document.getElementById( 'tasty-recipes-tooltip' ); if ( currentTooltipElement ) { document.body.replaceChild( tooltipElement, currentTooltipElement ); } else { document.body.appendChild( tooltipElement ); } this.tooltipElement = document.getElementById( 'tasty-recipes-tooltip' ); }, show() { if ( ! this.tooltipElement ) { return; } const tooltipTop = this.element.getBoundingClientRect().top + window.scrollY - 10 // 10px offset. - this.tooltipElement.getBoundingClientRect().height; const tooltipLeft = this.element.getBoundingClientRect().left - ( this.tooltipElement.getBoundingClientRect().width / 2 ) + ( this.element.getBoundingClientRect().width / 2 ) - 1; const posLeft = Math.max( 10, tooltipLeft ); this.maybeRemoveTail( posLeft !== tooltipLeft ); this.tooltipElement.setAttribute( 'style', 'top:' + tooltipTop + 'px;left:' + posLeft + 'px;' ); this.tooltipElement.classList.add( 'opened' ); }, maybeRemoveTail( removeTail ) { if ( removeTail ) { this.tooltipElement.classList.add( 'tr-hide-tail' ); } else { this.tooltipElement.classList.remove( 'tr-hide-tail' ); } }, changeMessage( message ) { if ( ! this.tooltipElement ) { return; } this.tooltipElement.innerHTML = message; } }; window.TastyRecipes.ajax = { sendPostRequest( url, data, success, failure ) { const xhr = new XMLHttpRequest(); xhr.open( 'POST', url, true ); xhr.send( this.preparePostData( data ) ); xhr.onreadystatechange = () => { if ( 4 !== xhr.readyState ) { return; } if ( xhr.status === 200 ) { success( JSON.parse( xhr.responseText ) ); return; } failure( xhr ); }; xhr.onerror = () => { failure( xhr ); }; }, preparePostData( data ) { const formData = new FormData(); for ( const key in data ) { formData.append( key, data[key] ); } return formData; }, }; window.TastyRecipes.ratings = { defaultRating: 0, currentRatingPercentage: 100, savingRating: false, init( minRating ) { this.minRating = minRating; this.formWatchRating(); this.closeTooltipWhenClickOutside(); this.addBodyClassBasedOnSelectedRating(); this.backwardCompFormRatingPosition(); }, formWatchRating() { const ratings = document.querySelectorAll('.tasty-recipes-no-ratings-buttons [data-rating]'); if ( ratings.length { event.preventDefault(); this.defaultRating = event.target.closest( '.checked' ).dataset.rating; this.setCheckedStar( event.target ); this.maybeSendRating( this.defaultRating, event.target ); this.setRatingInForm( this.defaultRating ); } ); } }, closeTooltipWhenClickOutside() { window.addEventListener( 'click', e => { // Bailout (don't remove the tooltip) when the clicked element is a rating star, or it's the tooltip itself. if ( e.target.closest( '.tasty-recipes-rating' ) || e.target.classList.contains( 'tasty-recipes-static-tooltip' ) ) { return; } window.TastyRecipes.staticTooltip.destroy(); } ); }, setRatingInForm( rating ) { const ratingInput = document.querySelector( '#respond .tasty-recipes-rating[value="' + rating + '"]' ); if ( ! ratingInput ) { return; } ratingInput.click(); }, addBodyClassBasedOnSelectedRating() { const ratingInputs = document.querySelectorAll( 'input.tasty-recipes-rating' ); if ( ! ratingInputs ) { return; } for ( const ratingInput of ratingInputs ) { ratingInput.addEventListener( 'click', currentEvent => { const selectedRating = currentEvent.target.getAttribute( 'value' ); this.handleBodyClassByRating( selectedRating ); this.toggleCommentTextareaRequired( selectedRating ); } ); } }, handleBodyClassByRating( rating ) { if ( rating < this.minRating ) { document.body.classList.remove( 'tasty-recipes-selected-minimum-rating' ); return; } document.body.classList.add( 'tasty-recipes-selected-minimum-rating' ); }, toggleCommentTextareaRequired( rating ) { const commentTextarea = document.getElementById( 'comment' ); if ( ! commentTextarea ) { return; } if ( rating { window.TastyRecipes.staticTooltip.changeMessage( response.data.message ); window.TastyRecipes.staticTooltip.show(); this.updateAverageText( response.data, recipeCardElement ); this.maybeFillCommentForm( response.data ); // Hide the tooltip after 5 seconds. setTimeout( () => { this.maybeResetTooltip( recipeCardElement, response.data, rating ); }, 5000 ); }, () => { this.resetTooltip( recipeCardElement ); } ); }, updateAverageText( data, recipeCardElement ) { if ( ! data.average ) { return; } this.setRatingPercent( data ); if ( ! data.count ) { return; } const quickLink = document.querySelector( '.tasty-recipes-rating-link' ); if ( quickLink ) { this.setTextInContainer( quickLink, data ); this.setPartialStar( quickLink ); } const cardStars = recipeCardElement.querySelector( '.tasty-recipes-ratings-buttons' ); cardStars.dataset.trDefaultRating = data.average; this.setTextInContainer( recipeCardElement.querySelector( '.tasty-recipes-rating' ), data ); }, setTextInContainer( container, data ) { if ( ! container ) { return; } if ( data.label ) { const ratingLabelElement = container.querySelector( '.rating-label' ); if ( ratingLabelElement ) { ratingLabelElement.innerHTML = data.label; } return; } const averageElement = container.querySelector( '.average' ); if ( averageElement ) { averageElement.textContent = data.average; } const countElement = container.querySelector( '.count' ); if ( countElement ) { countElement.textContent = data.count; } }, setPartialStar( container ) { const highestStar = container.querySelector( '[data-rating="' + Math.ceil( this.defaultRating ) + '"]' ); if ( highestStar ) { highestStar.dataset.trClip = this.currentRatingPercentage; } }, setRatingPercent( data ) { this.defaultRating = data.average.toFixed( 1 ); const parts = data.average.toFixed( 2 ).toString().split( '.' ); this.currentRatingPercentage = parts[1] ? parts[1] : 100; if ( this.currentRatingPercentage === '00' ) { this.currentRatingPercentage = 100; } }, setCheckedStar( target ) { const cardRatingContainer = target.closest( '.tasty-recipes-ratings-buttons' ); const selectedRatingElement = cardRatingContainer.querySelector( '[data-tr-checked]' ); if ( selectedRatingElement ) { delete selectedRatingElement.dataset.trChecked; } const thisStar = target.closest( '.tasty-recipes-rating' ); thisStar.dataset.trChecked = 1; thisStar.querySelector( '[data-tr-clip]' ).dataset.trClip = 100; }, maybeFillCommentForm( data ) { if ( ! data.comment || ! data.comment.content ) { return; } const commentForm = document.querySelector( '#commentform' ); if ( ! commentForm ) { return; } const commentBox = commentForm.querySelector( '[name=comment]' ); if ( ! commentBox || commentBox.value ) { return; } // Add comment details for editing. commentBox.innerHTML = data.comment.content; if ( data.comment.name ) { commentForm.querySelector( '[name=author]' ).value = data.comment.name; commentForm.querySelector( '[name=email]' ).value = data.comment.email; } }, maybeResetTooltip( recipeCardElement, data, rating ) { if ( this.savingRating === rating ) { this.resetTooltip( recipeCardElement, data ); } }, resetTooltip( recipeCardElement, data ) { window.TastyRecipes.staticTooltip.destroy(); this.savingRating = false; // Reset the default rating. const cardRatingContainer = recipeCardElement.querySelector( '.tasty-recipes-ratings-buttons' ); if ( cardRatingContainer ) { this.defaultRating = ( data && data.average ) ? data.average.toFixed(1) : cardRatingContainer.dataset.trDefaultRating; cardRatingContainer.dataset.trDefaultRating = this.defaultRating; this.resetSelectedStar( cardRatingContainer, data ); } }, resetSelectedStar( cardRatingContainer ) { const selectedRatingElement = cardRatingContainer.querySelector( '[data-rating="' + Math.ceil( this.defaultRating ) + '"]' ); if ( selectedRatingElement ) { selectedRatingElement.querySelector( '[data-tr-clip]' ).dataset.trClip = this.currentRatingPercentage; selectedRatingElement.parentNode.dataset.trChecked = 1; } const previousSelectedElement= cardRatingContainer.querySelector( '[data-tr-checked]' ); if ( previousSelectedElement ) { const currentSelectedRating = previousSelectedElement.querySelector('[data-rating]'); if ( currentSelectedRating !== selectedRatingElement ) { delete previousSelectedElement.dataset.trChecked; } } }, backwardCompFormRatingPosition() { const ratingsButtons = document.querySelector( '#respond .tasty-recipes-ratings-buttons, #tasty-recipes-comment-rating .tasty-recipes-ratings-buttons' ); if ( ! ratingsButtons ) { return; } const ratingsButtonsStyles = window.getComputedStyle(ratingsButtons); if ( ! ratingsButtonsStyles.display.includes( 'flex' ) ) { ratingsButtons.style.direction = 'rtl'; } if ( typeof tastyRecipesRating !== 'undefined' ) { // Select the rating that was previously selected in admin. ratingsButtons.querySelector( '.tasty-recipes-rating[value="' + tastyRecipesRating + '"]' ).checked = true; } const ratingSpans = ratingsButtons.querySelectorAll( '.tasty-recipes-rating' ); for (const ratingSpan of ratingSpans) { ratingSpan.addEventListener( 'click', event => { if ( ratingSpan === event.target ) { return; } ratingSpan.previousElementSibling.click(); } ); } } }; (function(callback) { if (document.readyState !== "loading") { callback(); } else { window.addEventListener( 'load', callback ); } })(() => { window.TastyRecipes.ratings.init( window.trCommon ? window.trCommon.minRating : 4 ); });

0 Comments

Submit a Comment