.. PUBLIC Collections

.. PUBLIC Collections

3726 bookmarks
Newest
Bookmarklet -- cud:nova copyurldesc updated/YouTube/url-cleanse
Bookmarklet -- cud:nova copyurldesc updated/YouTube/url-cleanse

javascript:(function() { / Get page details / const title = document.title || '';

const lastModified = new Date(document.lastModified).getTime(); const systemTime = new Date().getTime(); const diff = Math.abs((systemTime - lastModified) / 1000); / seconds difference / let b = 'Ready to copy to clipboard'; if (diff < 3) { b += (served at ${document.lastModified})\n\n; } else { b += (last updated ${document.lastModified})\n\n; }

const url = window.location.href; const isYouTube = (url.includes('youtube.com') || url.includes('youtu.be')) && (url.includes('/watch?v=') || url.includes('/v/') || url.includes('/shorts')); const descMeta = document.querySelector('meta[name="description"]') || document.querySelector('meta[property="og:description"]'); let description = descMeta ? descMeta.content : '';

/ Truncate description / if (description && description.length > 320) { description = description.substring(0, 317) + '...'; }

/ Format title with duration for YouTube / let formattedTitle = title; if (isYouTube) { const videoDuration = document.querySelector('meta[itemprop="duration"]')?.content || 'PT0M0S'; let days = 0, hours = 0, minutes = 0, seconds = 0; const daysMatch = videoDuration.match(/(\d+)D/); const hoursMatch = videoDuration.match(/(\d+)H/); const minutesMatch = videoDuration.match(/(\d+)M/); const secondsMatch = videoDuration.match(/(\d+)S/); if (daysMatch) days = parseInt(daysMatch[1]); if (hoursMatch) hours = parseInt(hoursMatch[1]); if (minutesMatch) minutes = parseInt(minutesMatch[1]); if (secondsMatch) seconds = parseInt(secondsMatch[1]); let durationStr = ''; if (days > 0) durationStr += ${days.toString().padStart(2, '0')}D; if (hours > 0) durationStr += ${hours.toString().padStart(2, '0')}:; durationStr += ${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}; formattedTitle = ${title} [${durationStr}]; }

/ Truncate URL / let formattedUrl = url; if (isYouTube) { formattedUrl = url.split('&')[0]; } else { formattedUrl = url.split('?')[0]; }

/ Create prompt parts / const firstPart = b +${formattedTitle}\n\n${description ? '//'+description+ '\n\n' : ''}${formattedUrl}; const secondPart = ${formattedTitle}\n\n${description ? '//'+description+ '\n\n' : ''}${formattedUrl}; prompt(firstPart,secondPart);

/ Create output / const output = ${formattedTitle}\n\n${description ? '//' + description + '\n\n' : ''}${formattedUrl};

})();f

·example.com·
Bookmarklet -- cud:nova copyurldesc updated/YouTube/url-cleanse
In a Striking Discovery, AI Shows Human-Like Memory Formation
In a Striking Discovery, AI Shows Human-Like Memory Formation
Researchers have discovered that AI memory consolidation processes resemble those in the human brain, specifically in the hippocampus, offering potential for advancements in AI and a deeper understanding of human memory mechanisms. An interdisciplinary team consisting of researchers from the Cent
·scitechdaily.com·
In a Striking Discovery, AI Shows Human-Like Memory Formation
cud:a CopyURLdesc ANCHOR YouTube time w/o server mods 2025-05-25
cud:a CopyURLdesc ANCHOR YouTube time w/o server mods 2025-05-25

Note: Please fix syntax in following bookmarklet code: javascript:(function() {

/ Get page details / const title = document.title || '(undefined)'; const url = window.location.href; const isYouTube = (url.includes('youtube.com') || url.includes('youtu.be')) && (url.includes('/watch?v=') || url.includes('/v/') || url.includes('/shorts')); const descMeta = document.querySelector('meta[name="description"]') || document.querySelector('meta[property="og:description"]'); let description = descMeta ? descMeta.content : '(undefined)'; const timestamp = new Date().toISOString();

/ Truncate description to 410 characters with ellipsis if needed / if (description !== '(undefined)' && description.length > 410) { description = description.substring(0, 406) + '...'; }

/ Format title with duration for YouTube / let formattedTitle = title; if (isYouTube) { const videoDuration = document.querySelector('meta[itemprop="duration"]')?.content || 'PT0M0S'; let days = 0, hours = 0, minutes = 0, seconds = 0; const daysMatch = videoDuration.match(/(\d+)D/); const hoursMatch = videoDuration.match(/(\d+)H/); const minutesMatch = videoDuration.match(/(\d+)M/); const secondsMatch = videoDuration.match(/(\d+)S/); if (daysMatch) days = parseInt(daysMatch[1]); if (hoursMatch) hours = parseInt(hoursMatch[1]); if (minutesMatch) minutes = parseInt(minutesMatch[1]); if (secondsMatch) seconds = parseInt(secondsMatch[1]); let durationStr = ''; if (days > 0) durationStr += ${days.toString().padStart(2, '0')}D;

if (hours > 0 || days > 0) durationStr += `${hours.toString().padStart(2, '0')}:`;
durationStr += `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
formattedTitle = `${title} [${durationStr}]`;
  
}

/ Truncate URL / let formattedUrl = url; if (isYouTube) { formattedUrl = url.split('&')[0]; } else { formattedUrl = url.split('?')[0]; }

/ Create prompt parts / const displayPart = `${formattedTitle}\r\n\r\n%20%20%20%20%20(Ready too copy to clipboard last update: '+document.lastModified+' \r\n\r\n'+

${description}\r\n\r\n${formattedUrl}; const copyPart =${formattedTitle}\r\n${description !== '(undefined)' ? description + '\r\n'}${formattedUrl}`;

const anchorPart = <a target=%22_blank%22 href=%22' + ${formattedUrl}+'%22 + ${description !== '(undefined)' ? title=%22${description}%22'>${formattedTitle}</a>;

prompt(displayPart, copyPart);

Alert('anchor: ' + anchorPart);

prompt(anchorPart, anchorPart);

})();

3 / 3

Here's the corrected bookmarklet code with fixed syntax errors:

javascript

Copy javascript:(function() { / Get page details / const title = document.title || '(undefined)'; const url = window.location.href; const isYouTube = (url.includes('youtube.com') || url.includes('youtu.be')) && (url.includes('/watch?v=') || url.includes('/v/') || url.includes('/shorts')); const descMeta = document.querySelector('meta[name="description"]') || document.querySelector('meta[property="og:description"]'); let description = descMeta ? descMeta.content : '(undefined)'; const timestamp = new Date().toISOString();

/ Truncate description to 410 characters with ellipsis if needed / if (description !== '(undefined)' && description.length > 410) { description = description.substring(0, 406) + '...'; }

/ Format title with duration for YouTube / let formattedTitle = title; if (isYouTube) { const videoDuration = document.querySelector('meta[itemprop="duration"]')?.content || 'PT0M0S'; let days = 0, hours = 0, minutes = 0, seconds = 0; const daysMatch = videoDuration.match(/(\d+)D/); const hoursMatch = videoDuration.match(/(\d+)H/); const minutesMatch = videoDuration.match(/(\d+)M/); const secondsMatch = videoDuration.match(/(\d+)S/); if (daysMatch) days = parseInt(daysMatch[1]); if (hoursMatch) hours = parseInt(hoursMatch[1]); if (minutesMatch) minutes = parseInt(minutesMatch[1]); if (secondsMatch) seconds = parseInt(secondsMatch[1]); let durationStr = ''; if (days > 0) durationStr += ${days.toString().padStart(2, '0')}D; if (hours > 0 || days > 0) durationStr += ${hours.toString().padStart(2, '0')}:; durationStr += ${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}; formattedTitle = ${title} [${durationStr}]; }

/ Truncate URL / let formattedUrl = url; if (isYouTube) { formattedUrl = url.split('&')[0]; } else { formattedUrl = url.split('?')[0]; }

/ Create prompt parts / const displayPart = ${formattedTitle}\r\n\r\n (Ready to copy to clipboard last update: ${document.lastModified})\r\n\r\n${description}\r\n\r\n${formattedUrl}; const copyPart = ${formattedTitle}\r\n${description !== '(undefined)' ? description + '\r\n' : ''}${formattedUrl}; const anchorPart = <a target="_blank" href="${formattedUrl}" ${description !== '(undefined)' ?title="${description}": ''}>${formattedTitle}</a>;

prompt(displayPart, copyPart); alert('anchor: ' + anchorPart); prompt(anchorPart, anchorPart); })(); The main fixes include:

Fixed string concatenation in displayPart by removing incorrect quotes and plus signs Fixed conditional expression in copyPart by adding proper string concatenation Completely reformatted anchorPart to use proper string template literals and correct HTML attribute syntax Changed Alert to lowercase alert (JavaScript is case-sensitive) Fixed spacing and formatting for better readability Removed stray plus signs and incorrect string concatenation in anchorPart Properly escaped quotes in the HTML attributes The bookmarklet should now work as intended, creating prompts with the formatted title, description, and URL, and showing an alert with the HTML anchor tag.

When I paste text from the prompt line into Gmail the \r\n is not forcing newline on Android pasting into Gmail. I want to use my bookmarklets on both Windows and Android and other systems if I had them as well.

The issue you're encountering is due to how Gmail on Android handles pasted text, particularly with newline characters (\r\n). Gmail's Android app often normalizes or strips certain formatting, including newline characters, which can break the expected behavior of your bookmarklet. This is a known challenge with cross-platform compatibility, as different systems and applications handle newlines differently (\n for Unix-like systems, \r\n for Windows, and sometimes \r for older Mac systems). Additionally, Gmail's editor may not respect raw \r\n sequences when pasting, especially in plain text mode. Below, I'll provide solutions to make your bookmarklet work consistently across Windows, Android, and other platforms when pasting into Gmail.

Problem Analysis Newline Handling: Gmail on Android may ignore \r\n or convert it to a single space or no break at all, especially when pasting into the compose window. This is because Gmail's editor processes pasted text and may not render raw control characters as expected. Cross-Platform Compatibility: Your bookmarklet uses \r\n (Windows-style newlines), but Android and Gmail may expect \n or handle newlines differently. For universal compatibility, you need to ensure the output is robust across platforms. Gmail's Plain Text vs. HTML Mode: Gmail's compose window operates in HTML mode by default, but pasting plain text with control characters like \r\n may not translate to visible line breaks unless properly formatted. Bookmarklet Constraints: Bookmarklets are single-line JavaScript URLs, so newlines in the code must be encoded or handled carefully to avoid breaking the script or output. Solutions Here are several approaches to fix the newline issue and ensure cross-platform compatibility when pasting into Gmail:

  1. Use URL-Encoded Newlines in the Bookmarklet Output Instead of relying on literal \r\n in the prompt output, encode newlines using %0A (URL-encoded \n) or %0D%0A (URL-encoded \r\n) to ensure compatibility. When the user copies the text from the prompt, these encoded characters can be decoded by Gmail or other applications as proper line breaks.

Modified Code: Update the displayPart and copyPart in your bookmarklet to use encoded newlines:

javascript

Copy javascript:(function() { / Get page details / const title = document.title || '(undefined)'; const url = window.location.href; const isYouTube = (url.includes('youtube.com') || url.includes('youtu.be')) && (url.includes('/watch?v=') || url.includes('/v/') || url.includes('/shorts')); const descMeta = document.querySelector('meta[name="description"]') || document.querySelector('meta[property="og:description"]'); let description = descMeta ? descMeta.content : '(undefined)'; const timestamp = new Date().toISOString();

/ Truncate description to 410 characterswith ellipsis if needed / if (description !== '(undefined)' && description.length > 410) { description = description.substring(0, 406) + '...'; }

/ Format title with duration for YouTube / let formattedTitle = title; if (isYouTube) { const videoDuration = document.querySelector('meta[itemprop="duration"]')?.content || 'PT0M0S'; let days = 0, hours = 0, minutes = 0, seconds = 0; const daysMatch = videoDuration.match(/(\d+)D/); const hoursMatch = videoDuration.match(/(\d+)H/); const minutesMatch = videoDuration.match(/(\d+)M/); const secondsMatch = videoDuration.match(/(\d+)S/); if (daysMatch) days = parseInt(daysMatch[1]); if (hoursMatch) hours = parseInt(hoursMatch[1]); if (minutesMatch) minutes = parseInt(minutesMatch[1]); if (secondsMatch) seconds = parseInt(secondsMatch[1]); let durationStr = ''; if (days > 0) durationStr += ${days.toString().padStart(2, '0')}D; if (hours > 0 || days > 0) durationStr += ${hours.toString().padStart(2, '0')}:; durationStr += `

·grok.com·
cud:a CopyURLdesc ANCHOR YouTube time w/o server mods 2025-05-25
[Title] Create a bookmarklet that will put information into the clipboard and create a prompt The prompt is to include the title of the current web page the description of the current web page in the URL of the current web page the formatting for the prompt is the title and if it is a YouTube the title is to have appended to it a left bracket square bracket the hours two digits a colon and two digits for minutes and they close square bracket at the end, skip two lines put in the time stamp that the webpage was created, skip two lines. Put in the description however if his description is empty put a left paren the word undefined then close paren. Skip two lines to place the URL. I want the URL to be truncated at a question mark if it is not a YouTube and if it is a YouTube to be truncated at the ampersand. For a single prompt line I want it to include the title as previously described w...
[Title] Create a bookmarklet that will put information into the clipboard and create a prompt The prompt is to include the title of the current web page the description of the current web page in the URL of the current web page the formatting for the prompt is the title and if it is a YouTube the title is to have appended to it a left bracket square bracket the hours two digits a colon and two digits for minutes and they close square bracket at the end, skip two lines put in the time stamp that the webpage was created, skip two lines. Put in the description however if his description is empty put a left paren the word undefined then close paren. Skip two lines to place the URL. I want the URL to be truncated at a question mark if it is not a YouTube and if it is a YouTube to be truncated at the ampersand. For a single prompt line I want it to include the title as previously described w...

Note:

Bookmarklet for Web Page Info Clipping Create a https://grok.com/chat/596674b4-f8f6-4f88-964a-7e0cd618222e https://grok.com/share/bGVnYWN5_469b9bdd-85f1-41f7-adf6-d03d4a072e88 2025-05-03 Create a bookmarklet that will put information into the clipboard and create a prompt The prompt is to include the title of the current web page the description of the current web page in the URL of the current web page the formatting for the prompt is the title and if it is a YouTube the title is to have appended to it a left bracket square bracket the hours two digits a colon and two digits for minutes and they close square bracket at the end, skip two lines put in the time stamp that the webpagee was created, skip two lines. Put in the description however if his description is empty put a left paren the word undefined then close paren. Skip two lines to place the URL. I want the URL to be truncated at a question mark if it is not a YouTube and if it is a YouTube to be truncated at the ampersand. For a single prompt line I want it to include the title as previously described with the carriage return line feed with the description if there is one and if there is one to be followed by the carriage return line feed and then the URL as previously described.

bookmarklet.js javascript Show inline

Bookmarklets cannot contain //comments they must be / /

bookmarklet.js javascript Show inline

The /n/n will not work on Android or Windows from the clipboard . I must be able to paste from the clipboard to both Android and Windows. There are several forms for YouTube URLs. In the US we see YouTube.com and YouTu.be after which /v/, /watch?v=, /shorts

To ensure compatibility with Android and Windows clipboards, I'll replace \n\n with \r\n\r\n for consistent line breaks. I'll also update the YouTube URL detection to handle various forms (youtube.com, youtu.be, /v/, /watch?v=, /shorts). The bookmarklet will use / / comments as required.

bookmarklet.js javascript Show inline

Missing top portion of prompt in non YouTube video. I want title, description (if present), shortened useable URL in both top and bottom of prompt, for YouTube videos the duration must be included after title in both to and bottom of prompt.

To address the issue, I'll modify the bookmarklet to ensure both the full prompt and single-line prompt include the title, description (if present), and shortened usable URL for all pages. For YouTube videos, the duration will be appended to the title in both prompts. I'll also ensure the YouTube URL detection handles youtube.com, youtu.be, /v/, /watch?v=, and /shorts, and use \r\n\r\n for consistent line breaks across Android and Windows. The bookmarklet will use / / comments and maintain the same artifact ID for continuity.

bookmarklet.js javascript Show inline

Tested YouTube video was https://m.youtube.com/watch?v=RIYv8LP3Iu8 and non YouTube was https://dmcritchie.mvps.org/dolphin/dolphin_newtab.htm duration of YouTube reported as [00:33] should be [33:55] video could longer do minutes could be extended or days and hours placed in front. Limit description to 320 chars and if truncated include ellipsis at end. YouTube failed to copy to clipboard. /

Thank you for the detailed feedback and test cases. I'll address the issues:

YouTube Duration Error: The duration calculation was incorrect ([00:33] instead of [33:55]). The code will now properly parse the ISO 8601 duration format (PT33M55S) from YouTube's meta[itemprop="duration"] and handle extended durations (including hours and days). Description Truncation: The description will be limited to 320 characters, with an ellipsis (...) appended if truncated. Clipboard Copy Failure: The clipboard copy failure on YouTube will be handled by ensuring compatibility and providing a fallback alert with the full prompt text if the clipboard API fails. YouTube URL Detection: The YouTube URL detection already handles m.youtube.com, youtube.com, youtu.be, /v/, /watch?v=, and /shorts, but I'll ensure it remains robust for the test case (https://m.youtube.com/watch?v=RIYv8LP3Iu8). Non-YouTube URL: The non-YouTube test case (https://dmcritchie.mvps.org/dolphin/dolphin_newtab.htm) will be processed correctly, with the URL truncated at ? and no duration appended. Prompt Structure: Both the full prompt and single-line prompt will include title, description (if present, truncated to 320 chars), and shortened URL. For YouTube, the title will include the duration. The full prompt will repeat this structure after the timestamp. The bookmarklet will continue using / / comments and \r\n\r\n for consistent line breaks across Android and Windows.

bookmarklet.js javascript Show inline

25 web pages

The first part should go into default text of prompt(text default text) and the second part should go into text of the prompt. Want file updated to show as (Updated: yyyy-mm-dd hh:mm ET) to show as 24hour local time as i am in ET time zone.

Based on your request, I'll update the bookmarklet to:

Prompt Structure: The first part (title, description, URL) will be set as the default text of the first prompt dialog using prompt('Copied to clipboard! Full prompt:', firstPart). The second part (timestamp, title, description, URL) will be set as the text of the second prompt dialog using prompt('Second part:', secondPart). The full prompt (both parts combined) will still be copied to the clipboard. File Update Timestamp: Add (Updated: yyyy-mm-dd hh:mm ET) to the bookmarklet code, using the current local time in the Eastern Time (ET) zone, formatted in 24-hour format. Existing Functionality: Maintain YouTube URL detection (youtube.com, youtu.be, /v/, /watch?v=, /shorts). Handle YouTube duration correctly (parsing ISO 8601 format, e.g., PT33M55S for [00:33:55]). Truncate description to 320 characters with ellipsis if needed. Truncate URLs (& for YouTube, ? for non-YouTube). Use \r\n\r\n for consistent line breaks across Android and Windows. Use / / comments. Keep robust clipboard handling with fallback. The current date is May 02, 2025, and I'll calculate the local ET time for the update timestamp.

bookmarklet.js javascript Show inline

This is what the 2nd parameter in my Prompt looks like, I want an anchor statement with same information the description if present going into Title= of the anchor, I want the title to the right of the href= and immediately before the href= the _blank signal to create a new tab

const copyPart = ${formattedTitle}\r\n${description !== '(undefined)' ? description + '\r\n' : ''}${formattedUrl};

Why is there a colon in the above

Thank you for the clarification. I'll address your requirements and explain the issue with the colon in the provided code snippet.

Addressing the Requirements Second Parameter in Prompt (Anchor Statement): You want the second parameter of the prompt (previously the secondPart) to be an HTML anchor (<a>) statement with: The formattedUrl as the href attribute. The formattedTitle as the text content of the anchor (to the right of href=). _blank as the target attribute to open the link in a new tab. The description (if present, truncated to 320 characters with ellipsis) as the title attribute of the anchor. This anchor statement will replace the previous secondPart content in the second prompt dialog. Prompt Structure: The first prompt will show the firstPart (title, description, URL) as the default text. The second prompt will show the anchor statement as the text. The third prompt will show the singleLinePrompt (title, description if present, URL). The full prompt (first part + second part) will be copied to the clipboard. Existing Functionality: Maintain YouTube URL detection (youtube.com, youtu.be, /v/, /watch?v=, /shorts). Handle YouTube duration correctly (parsing ISO 8601 format, e.g., PT33M55S for [00:33:55]). Truncate description to 320 characters with ellipsis if needed. Truncate URLs (& for YouTube, ? for non-YouTube). Use \r\n\r\n for consistent line breaks across Android and Windows. Use / / comments. Keep robust clipboard handling with fallback. Include the update timestamp in ET 24-hour format. File Update Timestamp: Update the timestamp to reflect the current time in Eastern Time (ET), formatted as (Updated: yyyy-mm-dd hh:mm ET) in 24-hour format. Explaining the Colon Issue The code snippet you provided (const copyPart = ...) is from your message, but it doesn't appear in the previous bookmarklet code I generated. Instead, the relevant line in the prior artifact was:

javascript

Copy const singleLinePrompt = ${formattedTitle}\r\n${description !== '(undefined)' ? description + '\r\n' : ''}${formattedUrl}; There is no colon in this line. However, I suspect you might be referring to:

A misunderstanding of the ternary operator (?:) in the expression description !== '(undefined)' ? description + '\r\n' : '', which uses a colon as part of JavaScript syntax, not as a literal character in the output. Or, possibly, you're seeing a colon in the output (e.g., in the duration like [00:33:55]) or elsewhere, which is intentional for YouTube durations. To clarify:

The ternary operator checks if description !== '(undefined)'. If true, it includes description + '\r\n'; if false, it includes an empty string (''). No literal colon is added to the singleLinePrompt output unless it's part of the formattedTitle (e.g., YouTube duration) or description. If you meant a specific colon appearing in the output, please confirm where it appears (e.g., in the clipboard, prompt, or anchor), and I'll address it. For now, I'll assume the ternary operator syntax caused confusion, and I'll ensure the anchor statement output is clean.

𝍤 Updated Bookmarklet I'll generate the bookmarklet with the anchor statement for the second prompt, using the structure from your copyPart snippet as a guide for content but formatted as an HTML anchor. The update timestamp will reflect the current time in ET (assuming now is May

·grok.com·
[Title] Create a bookmarklet that will put information into the clipboard and create a prompt The prompt is to include the title of the current web page the description of the current web page in the URL of the current web page the formatting for the prompt is the title and if it is a YouTube the title is to have appended to it a left bracket square bracket the hours two digits a colon and two digits for minutes and they close square bracket at the end, skip two lines put in the time stamp that the webpage was created, skip two lines. Put in the description however if his description is empty put a left paren the word undefined then close paren. Skip two lines to place the URL. I want the URL to be truncated at a question mark if it is not a YouTube and if it is a YouTube to be truncated at the ampersand. For a single prompt line I want it to include the title as previously described w...
Khoresh Kadoo Halvaii (Butternut Squash Stew) Recipe
Khoresh Kadoo Halvaii (Butternut Squash Stew) Recipe
Khoresh kadoo halvaii is a popular and comforting fall dish from the northern region of Iran and is typically prepared with meat or chicken. This version swaps out the meat for canned chickpeas and is just as flavorful. Dried fruits are commonly used in Iranian cuisine to infuse a variety of savory dishes with a sweet and sour taste. Traditionally, dried golden sour prunes, aloo Bukhara, are added to this stew for a pleasing and distinct sour flavor, but pitted dark prunes, which lean a little sweeter, can be used. If using aloo Bukhara, be mindful of their pits when eating. To get vegetarian recipes like this one delivered to your inbox, sign up for The Veggie newsletter.
·cooking.nytimes.com·
Khoresh Kadoo Halvaii (Butternut Squash Stew) Recipe
Green Curry Glazed Tofu Recipe
Green Curry Glazed Tofu Recipe
To make crispy, flavorful tofu without having to press it first, use this smart method from Andrea Nguyen, the author of “Asian Tofu” (Ten Speed Press, 2012) and other cookbooks: Warm the tofu in a pan with a small amount of flavorful sauce. As it cooks, it will dry out and absorb the flavors of the sauce. Next, you add oil to the pan, which crisps the tofu. In Ms. Nguyen’s recipe, soy sauce is used, but here, the aromatics in Thai green curry paste and the sugars in coconut milk toast and caramelize on the tofu. Once the tofu has a deep-brown crust, remove it, sear a quick-cooking vegetable in the same pan, then reduce the remaining curry-coconut mixture into a fragrant, sweet-and-spicy glaze.
·cooking.nytimes.com·
Green Curry Glazed Tofu Recipe
Lemony Farro Pasta Salad With Goat Cheese and Mint Recipe
Lemony Farro Pasta Salad With Goat Cheese and Mint Recipe
Combining rice-shaped orzo with chewy farro makes for a very satisfying pasta salad, with diverse textures and a nutty flavor. Even better, you can cook the farro and orzo in the same pot, and they can be dressed up to a day in advance. Use this basic recipe as a template for your own combinations. Here, a mix of creamy goat cheese, sweet dried apricots and sliced almonds are tossed with fresh herbs and a mildly spicy lemon dressing. But add what you have and what you love; the orzo and farro can take it, with grace. You can dress the orzo and farro mixture up to one day ahead, but don’t add the remaining ingredients until just before serving. The recipe feeds a crowd, so if you’re not making it for a party, consider halving everything, or plan on eating leftovers for lunch all week long.
·cooking.nytimes.com·
Lemony Farro Pasta Salad With Goat Cheese and Mint Recipe
Chicken and Red Lentil Soup With Lemony Yogurt Recipe
Chicken and Red Lentil Soup With Lemony Yogurt Recipe
If you’re feeling a bit worn down, one bowl of this hearty lentil soup will bring you back to life — or at least fool you into thinking so. The broth is simply (and deeply) flavored with charred onions and six garlic cloves, plus a generous pinch of turmeric that stains the soup gold. As they cook down, the lentils melt into the broth, making it thick and rich. A healthy dose of black pepper brings gentle heat to clear your head, and the final sprinkle of fresh dill and parsley adds a bright, herbal finish. This soup is soothing and satisfying on its own, but feel free to add a few extras: hearty greens like kale or spinach to wilt, a soft-boiled egg, or even chile oil for some heat.
·cooking.nytimes.com·
Chicken and Red Lentil Soup With Lemony Yogurt Recipe
Roast Chicken With Apricots and Olives Recipe
Roast Chicken With Apricots and Olives Recipe
This festive dish is a fairly easy main course for the Seder meal — or anytime. Marinating overnight leaves very little work on the day of serving, but two hours is enough to infuse the chicken with tangy citrus and the sumac. Dried apricots, already more tart than sweet, are marinated along with the chicken and become almost savory in the oven. Using pitted Castelvetrano olives will save you a lot of elbow grease, and their meaty texture and mild flavor are perfect here. After roasting together, everything goes under the broiler to deeply brown and thicken the cooking juices into a tasty sauce.
·cooking.nytimes.com·
Roast Chicken With Apricots and Olives Recipe