[{"data":1,"prerenderedAt":1764},["ShallowReactive",2],{"post-generating-an-rss-feed-with-nuxt-content":3,"i-lucide:info":1737,"i-lucide:notebook-text":1742,"i-ri:instagram-line":1744,"i-ri:bluesky-line":1746,"i-ri:github-line":1748,"i-lucide:rss":1750,"i-lucide:circle-alert":1752,"i-lucide:copy":1754,"i-catppuccin:nuxt":1756,"i-catppuccin:vue":1758,"i-catppuccin:typescript":1760,"i-simple-icons:npm":1762},{"id":4,"title":5,"alternate":6,"body":7,"category":1722,"created_at":1723,"description":1724,"extension":1725,"language":1726,"meta":1727,"navigation":88,"ogImage":1728,"path":1729,"seo":1730,"stem":1731,"tags":1732,"updated_at":1735,"__hash__":1736},"blog\u002Fblog\u002F2026\u002F2026-06-16-generating-an-rss-feed-with-nuxt-content.md","Generating an RSS feed with Nuxt Content","criando-um-feed-rss-com-nuxt-content",{"type":8,"value":9,"toc":1714},"minimark",[10,14,19,31,38,47,50,220,228,235,254,257,428,435,438,598,605,628,631,649,658,662,665,675,731,735,745,752,818,821,825,828,835,849,859,865,990,993,1110,1113,1230,1233,1236,1251,1263,1266,1302,1320,1326,1447,1453,1479,1482,1546,1549,1552,1683,1686,1690,1696,1703,1707,1710],[11,12,13],"p",{},"Providing an RSS feed when you’re using Nuxt Content isn’t really a hard task, but you may find some harsh obstacles on the way.",[15,16,18],"h2",{"id":17},"generating-the-feed","Generating the feed",[11,20,21,22,26,27,30],{},"We will first start by creating the server route which will serve the RSS. Usually it’s convenient to put the feed in the same post where you content is. For example, if your post list is at ",[23,24,25],"code",{},"\u002Fblog",", the path ",[23,28,29],{},"\u002Fblog\u002Ffeed.xml"," seems like a good place.",[11,32,33,34,37],{},"In Nuxt, we can create such a route by creating the file ",[23,35,36],{},"server\u002Froutes\u002Fblog\u002Ffeed.xml.get.ts",".",[39,40,41],"caution",{},[11,42,43,44,37],{},"This isn’t an API route, so it shouldn’t be placed at ",[23,45,46],{},"\u002Fserver\u002Fapi",[11,48,49],{},"The skeleton of the file is basically this:",[51,52,58],"pre",{"className":53,"code":54,"filename":55,"language":56,"meta":57,"style":57},"language-ts shiki shiki-themes github-light-default github-dark-default","import { queryCollection } from '@nuxt\u002Fcontent\u002Fserver';\n\nexport default defineEventHandler(async (event) => {\n  const posts = await queryCollection(event, 'blog')\n    .order('created_at', 'DESC')\n    .limit(10)\n    .all();\n\n  return posts;\n});\n","feed.xml.get.ts","ts","",[23,59,60,83,90,119,147,169,184,195,200,209],{"__ignoreMap":57},[61,62,65,69,73,76,80],"span",{"class":63,"line":64},"line",1,[61,66,68],{"class":67},"sjeE4","import",[61,70,72],{"class":71},"s4rv2"," { queryCollection } ",[61,74,75],{"class":67},"from",[61,77,79],{"class":78},"sSVrQ"," '@nuxt\u002Fcontent\u002Fserver'",[61,81,82],{"class":71},";\n",[61,84,86],{"class":63,"line":85},2,[61,87,89],{"emptyLinePlaceholder":88},true,"\n",[61,91,93,96,99,103,107,110,113,116],{"class":63,"line":92},3,[61,94,95],{"class":67},"export",[61,97,98],{"class":67}," default",[61,100,102],{"class":101},"sbjLL"," defineEventHandler",[61,104,106],{"class":105},"sTDnQ","(",[61,108,109],{"class":67},"async",[61,111,112],{"class":105}," (event) ",[61,114,115],{"class":67},"=>",[61,117,118],{"class":71}," {\n",[61,120,122,125,129,132,135,138,141,144],{"class":63,"line":121},4,[61,123,124],{"class":67},"  const",[61,126,128],{"class":127},"sHrmB"," posts",[61,130,131],{"class":67}," =",[61,133,134],{"class":67}," await",[61,136,137],{"class":101}," queryCollection",[61,139,140],{"class":71},"(event, ",[61,142,143],{"class":78},"'blog'",[61,145,146],{"class":71},")\n",[61,148,150,153,156,158,161,164,167],{"class":63,"line":149},5,[61,151,152],{"class":71},"    .",[61,154,155],{"class":101},"order",[61,157,106],{"class":71},[61,159,160],{"class":78},"'created_at'",[61,162,163],{"class":71},", ",[61,165,166],{"class":78},"'DESC'",[61,168,146],{"class":71},[61,170,172,174,177,179,182],{"class":63,"line":171},6,[61,173,152],{"class":71},[61,175,176],{"class":101},"limit",[61,178,106],{"class":71},[61,180,181],{"class":127},"10",[61,183,146],{"class":71},[61,185,187,189,192],{"class":63,"line":186},7,[61,188,152],{"class":71},[61,190,191],{"class":101},"all",[61,193,194],{"class":71},"();\n",[61,196,198],{"class":63,"line":197},8,[61,199,89],{"emptyLinePlaceholder":88},[61,201,203,206],{"class":63,"line":202},9,[61,204,205],{"class":67},"  return",[61,207,208],{"class":71}," posts;\n",[61,210,212,215,218],{"class":63,"line":211},10,[61,213,214],{"class":71},"}",[61,216,217],{"class":105},")",[61,219,82],{"class":71},[11,221,222,223,227],{},"What we want to do is manipulate the posts in such a way that the route actually returns a readable RSS feed. We can use the package ",[224,225],"npm-mention",{"pkg":226},"rss"," to help us, as it contains an RSS builder which will make things easier.",[11,229,230,231,234],{},"We will need to use the ",[23,232,233],{},"RSS"," class.",[51,236,238],{"className":53,"code":237,"filename":55,"language":56,"meta":57,"style":57},"import RSS from 'rss';\n",[23,239,240],{"__ignoreMap":57},[61,241,242,244,247,249,252],{"class":63,"line":64},[61,243,68],{"class":67},[61,245,246],{"class":71}," RSS ",[61,248,75],{"class":67},[61,250,251],{"class":78}," 'rss'",[61,253,82],{"class":71},[11,255,256],{},"To get started, we need to create the feed and provide some basic information.",[51,258,260],{"className":53,"code":259,"filename":55,"language":56,"meta":57,"style":57},"const url = 'https:\u002F\u002Fexample.org';\n\nconst feed = new RSS({\n  title: 'Example Blog',\n  description: 'Just a blog.',\n  site_url: url,\n  feed_url: `${url}\u002Fblog\u002Ffeed.xml`,\n  language: 'en-US',\n  custom_elements: [\n    { icon: `${url}\u002Fimg\u002Fapple-touch-icon.png` },\n  ],\n  custom_namespaces: {\n    content: 'http:\u002F\u002Fpurl.org\u002Frss\u002F1.0\u002Fmodules\u002Fcontent\u002F',\n    dc: 'http:\u002F\u002Fpurl.org\u002Fdc\u002Felements\u002F1.1\u002F',\n    sy: 'http:\u002F\u002Fpurl.org\u002Frss\u002F1.0\u002Fmodules\u002Fsyndication\u002F',\n  },\n});\n",[23,261,262,277,281,299,310,320,325,341,351,356,371,377,383,394,405,416,422],{"__ignoreMap":57},[61,263,264,267,270,272,275],{"class":63,"line":64},[61,265,266],{"class":67},"const",[61,268,269],{"class":127}," url",[61,271,131],{"class":67},[61,273,274],{"class":78}," 'https:\u002F\u002Fexample.org'",[61,276,82],{"class":71},[61,278,279],{"class":63,"line":85},[61,280,89],{"emptyLinePlaceholder":88},[61,282,283,285,288,290,293,296],{"class":63,"line":92},[61,284,266],{"class":67},[61,286,287],{"class":127}," feed",[61,289,131],{"class":67},[61,291,292],{"class":67}," new",[61,294,295],{"class":101}," RSS",[61,297,298],{"class":71},"({\n",[61,300,301,304,307],{"class":63,"line":121},[61,302,303],{"class":71},"  title: ",[61,305,306],{"class":78},"'Example Blog'",[61,308,309],{"class":71},",\n",[61,311,312,315,318],{"class":63,"line":149},[61,313,314],{"class":71},"  description: ",[61,316,317],{"class":78},"'Just a blog.'",[61,319,309],{"class":71},[61,321,322],{"class":63,"line":171},[61,323,324],{"class":71},"  site_url: url,\n",[61,326,327,330,333,336,339],{"class":63,"line":186},[61,328,329],{"class":71},"  feed_url: ",[61,331,332],{"class":78},"`${",[61,334,335],{"class":71},"url",[61,337,338],{"class":78},"}\u002Fblog\u002Ffeed.xml`",[61,340,309],{"class":71},[61,342,343,346,349],{"class":63,"line":197},[61,344,345],{"class":71},"  language: ",[61,347,348],{"class":78},"'en-US'",[61,350,309],{"class":71},[61,352,353],{"class":63,"line":202},[61,354,355],{"class":71},"  custom_elements: [\n",[61,357,358,361,363,365,368],{"class":63,"line":211},[61,359,360],{"class":71},"    { icon: ",[61,362,332],{"class":78},[61,364,335],{"class":71},[61,366,367],{"class":78},"}\u002Fimg\u002Fapple-touch-icon.png`",[61,369,370],{"class":71}," },\n",[61,372,374],{"class":63,"line":373},11,[61,375,376],{"class":71},"  ],\n",[61,378,380],{"class":63,"line":379},12,[61,381,382],{"class":71},"  custom_namespaces: {\n",[61,384,386,389,392],{"class":63,"line":385},13,[61,387,388],{"class":71},"    content: ",[61,390,391],{"class":78},"'http:\u002F\u002Fpurl.org\u002Frss\u002F1.0\u002Fmodules\u002Fcontent\u002F'",[61,393,309],{"class":71},[61,395,397,400,403],{"class":63,"line":396},14,[61,398,399],{"class":71},"    dc: ",[61,401,402],{"class":78},"'http:\u002F\u002Fpurl.org\u002Fdc\u002Felements\u002F1.1\u002F'",[61,404,309],{"class":71},[61,406,408,411,414],{"class":63,"line":407},15,[61,409,410],{"class":71},"    sy: ",[61,412,413],{"class":78},"'http:\u002F\u002Fpurl.org\u002Frss\u002F1.0\u002Fmodules\u002Fsyndication\u002F'",[61,415,309],{"class":71},[61,417,419],{"class":63,"line":418},16,[61,420,421],{"class":71},"  },\n",[61,423,425],{"class":63,"line":424},17,[61,426,427],{"class":71},"});\n",[11,429,430,431,434],{},"Some of the properties are pretty straightfoward. Other’s are just complements, such as ",[23,432,433],{},"custom_namespaces",", which allows the generated XML to have extra tags that are not in the RSS specification.",[11,436,437],{},"Since we have the array of posts, we can iterate over it to create each feed item.",[51,439,441],{"className":53,"code":440,"filename":55,"language":56,"meta":57,"style":57},"for (const post of posts) {\n  feed.item({\n    title: post.title,\n    guid: `${url}\u002Fpost\u002F${post.path}`,\n    url: `${url}\u002Fpost\u002F${post.path}`,\n    description: post.description,\n    date: new Date(post.created_at),\n    categories: post.category ? [post.category] : undefined,\n    custom_elements: [\n      { 'dc:creator': { _cdata: 'John Doe' } },\n    ],\n  });\n}\n",[23,442,443,462,472,477,502,523,528,542,561,566,583,588,593],{"__ignoreMap":57},[61,444,445,448,451,453,456,459],{"class":63,"line":64},[61,446,447],{"class":67},"for",[61,449,450],{"class":71}," (",[61,452,266],{"class":67},[61,454,455],{"class":127}," post",[61,457,458],{"class":67}," of",[61,460,461],{"class":71}," posts) {\n",[61,463,464,467,470],{"class":63,"line":85},[61,465,466],{"class":71},"  feed.",[61,468,469],{"class":101},"item",[61,471,298],{"class":71},[61,473,474],{"class":63,"line":92},[61,475,476],{"class":71},"    title: post.title,\n",[61,478,479,482,484,486,489,492,494,497,500],{"class":63,"line":121},[61,480,481],{"class":71},"    guid: ",[61,483,332],{"class":78},[61,485,335],{"class":71},[61,487,488],{"class":78},"}\u002Fpost\u002F${",[61,490,491],{"class":71},"post",[61,493,37],{"class":78},[61,495,496],{"class":71},"path",[61,498,499],{"class":78},"}`",[61,501,309],{"class":71},[61,503,504,507,509,511,513,515,517,519,521],{"class":63,"line":149},[61,505,506],{"class":71},"    url: ",[61,508,332],{"class":78},[61,510,335],{"class":71},[61,512,488],{"class":78},[61,514,491],{"class":71},[61,516,37],{"class":78},[61,518,496],{"class":71},[61,520,499],{"class":78},[61,522,309],{"class":71},[61,524,525],{"class":63,"line":171},[61,526,527],{"class":71},"    description: post.description,\n",[61,529,530,533,536,539],{"class":63,"line":186},[61,531,532],{"class":71},"    date: ",[61,534,535],{"class":67},"new",[61,537,538],{"class":101}," Date",[61,540,541],{"class":71},"(post.created_at),\n",[61,543,544,547,550,553,556,559],{"class":63,"line":197},[61,545,546],{"class":71},"    categories: post.category ",[61,548,549],{"class":67},"?",[61,551,552],{"class":71}," [post.category] ",[61,554,555],{"class":67},":",[61,557,558],{"class":127}," undefined",[61,560,309],{"class":71},[61,562,563],{"class":63,"line":202},[61,564,565],{"class":71},"    custom_elements: [\n",[61,567,568,571,574,577,580],{"class":63,"line":211},[61,569,570],{"class":71},"      { ",[61,572,573],{"class":78},"'dc:creator'",[61,575,576],{"class":71},": { _cdata: ",[61,578,579],{"class":78},"'John Doe'",[61,581,582],{"class":71}," } },\n",[61,584,585],{"class":63,"line":373},[61,586,587],{"class":71},"    ],\n",[61,589,590],{"class":63,"line":379},[61,591,592],{"class":71},"  });\n",[61,594,595],{"class":63,"line":385},[61,596,597],{"class":71},"}\n",[11,599,600,601,604],{},"Now that the feed is complete, we need to define the ",[23,602,603],{},"Content-Type"," header.",[51,606,608],{"className":53,"code":607,"filename":55,"language":56,"meta":57,"style":57},"setResponseHeader(event, 'Content-Type', 'text\u002Fxml');\n",[23,609,610],{"__ignoreMap":57},[61,611,612,615,617,620,622,625],{"class":63,"line":64},[61,613,614],{"class":101},"setResponseHeader",[61,616,140],{"class":71},[61,618,619],{"class":78},"'Content-Type'",[61,621,163],{"class":71},[61,623,624],{"class":78},"'text\u002Fxml'",[61,626,627],{"class":71},");\n",[11,629,630],{},"Then we can finally return the XML feed.",[51,632,634],{"className":53,"code":633,"filename":55,"language":56,"meta":57,"style":57},"return feed.xml();\n",[23,635,636],{"__ignoreMap":57},[61,637,638,641,644,647],{"class":63,"line":64},[61,639,640],{"class":67},"return",[61,642,643],{"class":71}," feed.",[61,645,646],{"class":101},"xml",[61,648,194],{"class":71},[11,650,651,652,657],{},"You can have a look at ",[653,654,656],"a",{"href":29,"target":655},"_blank","this site’s RSS"," for an example.",[15,659,661],{"id":660},"prerendering","Prerendering",[11,663,664],{},"If your site is deployed with an server, you’re done. But if it is deployed as an static site, such when you use GitHub Pages, you need one additional step.",[11,666,667,668,671,672,37],{},"We need to inform Nuxt to also prerender this server route during build. This can be done by editing the ",[23,669,670],{},"nitro"," property in ",[23,673,674],{},"nuxt.config.ts",[51,676,678],{"className":53,"code":677,"filename":674,"language":56,"meta":57,"style":57},"export default defineNuxtConfig({\n  nitro: {\n    prerender: {\n      routes: ['\u002Fblog\u002Ffeed.xml'],\n    },\n  },\n});\n",[23,679,680,691,696,701,712,717,724],{"__ignoreMap":57},[61,681,682,684,686,689],{"class":63,"line":64},[61,683,95],{"class":67},[61,685,98],{"class":67},[61,687,688],{"class":101}," defineNuxtConfig",[61,690,298],{"class":105},[61,692,693],{"class":63,"line":85},[61,694,695],{"class":71},"  nitro: {\n",[61,697,698],{"class":63,"line":92},[61,699,700],{"class":71},"    prerender: {\n",[61,702,703,706,709],{"class":63,"line":121},[61,704,705],{"class":71},"      routes: [",[61,707,708],{"class":78},"'\u002Fblog\u002Ffeed.xml'",[61,710,711],{"class":71},"],\n",[61,713,714],{"class":63,"line":149},[61,715,716],{"class":71},"    },\n",[61,718,719,722],{"class":63,"line":171},[61,720,721],{"class":71},"  }",[61,723,309],{"class":105},[61,725,726,729],{"class":63,"line":186},[61,727,728],{"class":105},"})",[61,730,82],{"class":71},[15,732,734],{"id":733},"informing-rss-readers-about-the-feed","Informing RSS readers about the feed",[11,736,737,738,741,742,37],{},"You can put a link to the RSS feed in your page, but this will only work for the reader to click and copy it in their RSS reader manually. You can make things easier a bit by providing a ",[23,739,740],{},"\u003Clink rel=\"alternate\">"," tag in your HTML ",[23,743,744],{},"\u003Chead>",[11,746,747,748,751],{},"With this, if the reader just paste your blog URL in the RSS reader, it can get the RSS link automatically. In Nuxt, this can be done with the ",[23,749,750],{},"useHead"," composable.",[51,753,756],{"className":53,"code":754,"filename":755,"language":56,"meta":57,"style":57},"useHead({\n  link: [{ \n    rel: 'alternate', \n    type: 'application\u002Frss+xml', \n    title: 'Feed (RSS)', \n    href: '\u002Fblog\u002Ffeed.xml',\n  }],\n});\n","blog.vue",[23,757,758,764,769,780,790,800,809,814],{"__ignoreMap":57},[61,759,760,762],{"class":63,"line":64},[61,761,750],{"class":101},[61,763,298],{"class":71},[61,765,766],{"class":63,"line":85},[61,767,768],{"class":71},"  link: [{ \n",[61,770,771,774,777],{"class":63,"line":92},[61,772,773],{"class":71},"    rel: ",[61,775,776],{"class":78},"'alternate'",[61,778,779],{"class":71},", \n",[61,781,782,785,788],{"class":63,"line":121},[61,783,784],{"class":71},"    type: ",[61,786,787],{"class":78},"'application\u002Frss+xml'",[61,789,779],{"class":71},[61,791,792,795,798],{"class":63,"line":149},[61,793,794],{"class":71},"    title: ",[61,796,797],{"class":78},"'Feed (RSS)'",[61,799,779],{"class":71},[61,801,802,805,807],{"class":63,"line":171},[61,803,804],{"class":71},"    href: ",[61,806,708],{"class":78},[61,808,309],{"class":71},[61,810,811],{"class":63,"line":186},[61,812,813],{"class":71},"  }],\n",[61,815,816],{"class":63,"line":197},[61,817,427],{"class":71},[11,819,820],{},"This is not mandatory, but it is considered a good practice.",[15,822,824],{"id":823},"providing-the-post-html","Providing the post HTML",[11,826,827],{},"The current feed will work fine for all readers, but we’re just providing the links, there’s no body for the posts. While most sites do just that, I think it’s nice to also provide the full post content, so the reader can read in their preferred environment.",[11,829,830,831,37],{},"This is the most tricky part to do with Nuxt Content. As in the moment of writing this article, Nuxt Content doesn’t seem to have a method to return your post rendered HTML in the server context. You need to do this ",[832,833,834],"strong",{},"manually",[11,836,837,838,841,842,845,846,37],{},"Nuxt Content uses ",[224,839],{"pkg":840},"@nuxtjs\u002Fmdc"," under the hoods, which then uses Unified’s ",[224,843],{"pkg":844},"remark"," and ",[224,847],{"pkg":848},"rehype",[11,850,851,852,855,856,858],{},"If you take a look into the ",[23,853,854],{},"post.body"," property, it is a Minimark AST. We could use the ",[224,857],{"pkg":8}," package to get the Markdown string, but I faced some converting issues when doing that. It is easier if you get the Markdown source file content directly instead.",[11,860,861,862,37],{},"To make things reusable, we will create a server util function ",[23,863,864],{},"markdownToHtml",[51,866,869],{"className":53,"code":867,"filename":868,"language":56,"meta":57,"style":57},"import { readFile } from 'node:fs\u002Fpromises';\nimport { join } from 'node:path';\n\nexport async function markdownToHtml(fileName: string) {\n  const filePath = join(process.cwd(), 'content', `${fileName}.md`);\n  const markdown = await readFile(filePath, 'utf-8');\n}\n","utils\u002Fmarkdown.ts",[23,870,871,885,899,903,929,964,986],{"__ignoreMap":57},[61,872,873,875,878,880,883],{"class":63,"line":64},[61,874,68],{"class":67},[61,876,877],{"class":71}," { readFile } ",[61,879,75],{"class":67},[61,881,882],{"class":78}," 'node:fs\u002Fpromises'",[61,884,82],{"class":71},[61,886,887,889,892,894,897],{"class":63,"line":85},[61,888,68],{"class":67},[61,890,891],{"class":71}," { join } ",[61,893,75],{"class":67},[61,895,896],{"class":78}," 'node:path'",[61,898,82],{"class":71},[61,900,901],{"class":63,"line":92},[61,902,89],{"emptyLinePlaceholder":88},[61,904,905,907,910,913,916,918,921,923,926],{"class":63,"line":121},[61,906,95],{"class":67},[61,908,909],{"class":67}," async",[61,911,912],{"class":67}," function",[61,914,915],{"class":101}," markdownToHtml",[61,917,106],{"class":71},[61,919,920],{"class":105},"fileName",[61,922,555],{"class":67},[61,924,925],{"class":127}," string",[61,927,928],{"class":71},") {\n",[61,930,931,933,936,938,941,944,947,950,953,955,957,959,962],{"class":63,"line":149},[61,932,124],{"class":67},[61,934,935],{"class":127}," filePath",[61,937,131],{"class":67},[61,939,940],{"class":101}," join",[61,942,943],{"class":71},"(process.",[61,945,946],{"class":101},"cwd",[61,948,949],{"class":71},"(), ",[61,951,952],{"class":78},"'content'",[61,954,163],{"class":71},[61,956,332],{"class":78},[61,958,920],{"class":71},[61,960,961],{"class":78},"}.md`",[61,963,627],{"class":71},[61,965,966,968,971,973,975,978,981,984],{"class":63,"line":171},[61,967,124],{"class":67},[61,969,970],{"class":127}," markdown",[61,972,131],{"class":67},[61,974,134],{"class":67},[61,976,977],{"class":101}," readFile",[61,979,980],{"class":71},"(filePath, ",[61,982,983],{"class":78},"'utf-8'",[61,985,627],{"class":71},[61,987,988],{"class":63,"line":186},[61,989,597],{"class":71},[11,991,992],{},"The tricky part is creating a Unified pipeline to do a similar conversion that Nuxt Content does. We can get started by importing the plugins.",[51,994,996],{"className":53,"code":995,"filename":868,"language":56,"meta":57,"style":57},"import rehypeSlug from 'rehype-slug';\nimport rehypeStringify from 'rehype-stringify';\nimport remarkFrontmatter from 'remark-frontmatter';\nimport remarkGfm from 'remark-gfm';\nimport remarkMdc from 'remark-mdc';\nimport remarkParse from 'remark-parse';\nimport remarkRehype from 'remark-rehype';\nimport { unified } from 'unified';\n",[23,997,998,1012,1026,1040,1054,1068,1082,1096],{"__ignoreMap":57},[61,999,1000,1002,1005,1007,1010],{"class":63,"line":64},[61,1001,68],{"class":67},[61,1003,1004],{"class":71}," rehypeSlug ",[61,1006,75],{"class":67},[61,1008,1009],{"class":78}," 'rehype-slug'",[61,1011,82],{"class":71},[61,1013,1014,1016,1019,1021,1024],{"class":63,"line":85},[61,1015,68],{"class":67},[61,1017,1018],{"class":71}," rehypeStringify ",[61,1020,75],{"class":67},[61,1022,1023],{"class":78}," 'rehype-stringify'",[61,1025,82],{"class":71},[61,1027,1028,1030,1033,1035,1038],{"class":63,"line":92},[61,1029,68],{"class":67},[61,1031,1032],{"class":71}," remarkFrontmatter ",[61,1034,75],{"class":67},[61,1036,1037],{"class":78}," 'remark-frontmatter'",[61,1039,82],{"class":71},[61,1041,1042,1044,1047,1049,1052],{"class":63,"line":121},[61,1043,68],{"class":67},[61,1045,1046],{"class":71}," remarkGfm ",[61,1048,75],{"class":67},[61,1050,1051],{"class":78}," 'remark-gfm'",[61,1053,82],{"class":71},[61,1055,1056,1058,1061,1063,1066],{"class":63,"line":149},[61,1057,68],{"class":67},[61,1059,1060],{"class":71}," remarkMdc ",[61,1062,75],{"class":67},[61,1064,1065],{"class":78}," 'remark-mdc'",[61,1067,82],{"class":71},[61,1069,1070,1072,1075,1077,1080],{"class":63,"line":171},[61,1071,68],{"class":67},[61,1073,1074],{"class":71}," remarkParse ",[61,1076,75],{"class":67},[61,1078,1079],{"class":78}," 'remark-parse'",[61,1081,82],{"class":71},[61,1083,1084,1086,1089,1091,1094],{"class":63,"line":186},[61,1085,68],{"class":67},[61,1087,1088],{"class":71}," remarkRehype ",[61,1090,75],{"class":67},[61,1092,1093],{"class":78}," 'remark-rehype'",[61,1095,82],{"class":71},[61,1097,1098,1100,1103,1105,1108],{"class":63,"line":197},[61,1099,68],{"class":67},[61,1101,1102],{"class":71}," { unified } ",[61,1104,75],{"class":67},[61,1106,1107],{"class":78}," 'unified'",[61,1109,82],{"class":71},[11,1111,1112],{},"And then doing the pipeline.",[51,1114,1116],{"className":53,"code":1115,"filename":868,"language":56,"meta":57,"style":57},"const result = await unified()\n  .use(remarkParse)\n  .use(remarkFrontmatter, ['yaml'])\n  .use(remarkGfm)\n  .use(remarkMdc)\n  .use(remarkRehype)\n  .use(rehypeSlug)\n  .use(rehypeStringify)\n  .process(markdown);\n\nreturn String(result);\n",[23,1117,1118,1135,1146,1161,1170,1179,1188,1197,1206,1216,1220],{"__ignoreMap":57},[61,1119,1120,1122,1125,1127,1129,1132],{"class":63,"line":64},[61,1121,266],{"class":67},[61,1123,1124],{"class":127}," result",[61,1126,131],{"class":67},[61,1128,134],{"class":67},[61,1130,1131],{"class":101}," unified",[61,1133,1134],{"class":71},"()\n",[61,1136,1137,1140,1143],{"class":63,"line":85},[61,1138,1139],{"class":71},"  .",[61,1141,1142],{"class":101},"use",[61,1144,1145],{"class":71},"(remarkParse)\n",[61,1147,1148,1150,1152,1155,1158],{"class":63,"line":92},[61,1149,1139],{"class":71},[61,1151,1142],{"class":101},[61,1153,1154],{"class":71},"(remarkFrontmatter, [",[61,1156,1157],{"class":78},"'yaml'",[61,1159,1160],{"class":71},"])\n",[61,1162,1163,1165,1167],{"class":63,"line":121},[61,1164,1139],{"class":71},[61,1166,1142],{"class":101},[61,1168,1169],{"class":71},"(remarkGfm)\n",[61,1171,1172,1174,1176],{"class":63,"line":149},[61,1173,1139],{"class":71},[61,1175,1142],{"class":101},[61,1177,1178],{"class":71},"(remarkMdc)\n",[61,1180,1181,1183,1185],{"class":63,"line":171},[61,1182,1139],{"class":71},[61,1184,1142],{"class":101},[61,1186,1187],{"class":71},"(remarkRehype)\n",[61,1189,1190,1192,1194],{"class":63,"line":186},[61,1191,1139],{"class":71},[61,1193,1142],{"class":101},[61,1195,1196],{"class":71},"(rehypeSlug)\n",[61,1198,1199,1201,1203],{"class":63,"line":197},[61,1200,1139],{"class":71},[61,1202,1142],{"class":101},[61,1204,1205],{"class":71},"(rehypeStringify)\n",[61,1207,1208,1210,1213],{"class":63,"line":202},[61,1209,1139],{"class":71},[61,1211,1212],{"class":101},"process",[61,1214,1215],{"class":71},"(markdown);\n",[61,1217,1218],{"class":63,"line":211},[61,1219,89],{"emptyLinePlaceholder":88},[61,1221,1222,1224,1227],{"class":63,"line":373},[61,1223,640],{"class":67},[61,1225,1226],{"class":101}," String",[61,1228,1229],{"class":71},"(result);\n",[11,1231,1232],{},"This will parse the Markdown, generate an AST, which will then be converted to HAST and processed until it is joined to a final HTML string.",[11,1234,1235],{},"For most cases, this may do the job, but MDC supports Vue components, which is a problem. The approach I choose was to convert the components I use into simpler and equivalent ones by using just HTML existing tags.",[11,1237,1238,1239,1242,1243,1246,1247,1250],{},"If you have any component into your Markdown, this existing pipeline will put it in the HTML as if it is a custom element. For example, ",[23,1240,1241],{},"Note.vue",", called by ",[23,1244,1245],{},"::note"," in your Markdown, will be outputted as ",[23,1248,1249],{},"\u003Cnote>\u003C\u002Fnote>",", which is not an existing HTML element.",[11,1252,1253,1254,1258,1259,1262],{},"We can circumvent this by using the ",[1255,1256],"npm",{"pkg":1257},"rehype-components"," plugin. We will also need to install the ",[224,1260],{"pkg":1261},"hastscript"," package.",[11,1264,1265],{},"What this plugin does is converting custom elements into other you specify. We can put in the pipeline with the following code.",[51,1267,1269],{"className":53,"code":1268,"filename":868,"language":56,"meta":57,"style":57},".use(rehypeComponents, {\n  components: {\n    'note': Note,\n  },\n})\n",[23,1270,1271,1280,1285,1293,1297],{"__ignoreMap":57},[61,1272,1273,1275,1277],{"class":63,"line":64},[61,1274,37],{"class":71},[61,1276,1142],{"class":101},[61,1278,1279],{"class":71},"(rehypeComponents, {\n",[61,1281,1282],{"class":63,"line":85},[61,1283,1284],{"class":71},"  components: {\n",[61,1286,1287,1290],{"class":63,"line":92},[61,1288,1289],{"class":78},"    'note'",[61,1291,1292],{"class":71},": Note,\n",[61,1294,1295],{"class":63,"line":121},[61,1296,421],{"class":71},[61,1298,1299],{"class":63,"line":149},[61,1300,1301],{"class":71},"})\n",[11,1303,1304,1305,1308,1309,1311,1312,1315,1316,1319],{},"And then we create the ",[23,1306,1307],{},"Note"," component replacement. In this case, the ",[23,1310,1307],{}," element is originally a callout. The approach I choosed was to transform it into a ",[23,1313,1314],{},"\u003Cdiv>"," with a ",[23,1317,1318],{},"\u003Cp>\u003Cstrong>Note:\u003C\u002Fstrong>\u003C\u002Fp>"," as the first child.",[11,1321,1322,1323,1325],{},"The ",[23,1324,1307],{}," component can be defined as so:",[51,1327,1329],{"className":53,"code":1328,"filename":868,"language":56,"meta":57,"style":57},"import { h } from 'hastscript';\nimport type { ComponentFunction } from 'rehype-components';\n\nconst Note: ComponentFunction = (_, children) => h('div', [\n  h('p', h('strong', 'Note:')),\n  ...children,\n]);\n",[23,1330,1331,1345,1362,1366,1406,1434,1442],{"__ignoreMap":57},[61,1332,1333,1335,1338,1340,1343],{"class":63,"line":64},[61,1334,68],{"class":67},[61,1336,1337],{"class":71}," { h } ",[61,1339,75],{"class":67},[61,1341,1342],{"class":78}," 'hastscript'",[61,1344,82],{"class":71},[61,1346,1347,1349,1352,1355,1357,1360],{"class":63,"line":85},[61,1348,68],{"class":67},[61,1350,1351],{"class":67}," type",[61,1353,1354],{"class":71}," { ComponentFunction } ",[61,1356,75],{"class":67},[61,1358,1359],{"class":78}," 'rehype-components'",[61,1361,82],{"class":71},[61,1363,1364],{"class":63,"line":92},[61,1365,89],{"emptyLinePlaceholder":88},[61,1367,1368,1370,1373,1375,1378,1380,1382,1385,1387,1390,1393,1395,1398,1400,1403],{"class":63,"line":121},[61,1369,266],{"class":67},[61,1371,1372],{"class":101}," Note",[61,1374,555],{"class":67},[61,1376,1377],{"class":105}," ComponentFunction",[61,1379,131],{"class":67},[61,1381,450],{"class":71},[61,1383,1384],{"class":105},"_",[61,1386,163],{"class":71},[61,1388,1389],{"class":105},"children",[61,1391,1392],{"class":71},") ",[61,1394,115],{"class":67},[61,1396,1397],{"class":101}," h",[61,1399,106],{"class":71},[61,1401,1402],{"class":78},"'div'",[61,1404,1405],{"class":71},", [\n",[61,1407,1408,1411,1413,1416,1418,1421,1423,1426,1428,1431],{"class":63,"line":149},[61,1409,1410],{"class":101},"  h",[61,1412,106],{"class":71},[61,1414,1415],{"class":78},"'p'",[61,1417,163],{"class":71},[61,1419,1420],{"class":101},"h",[61,1422,106],{"class":71},[61,1424,1425],{"class":78},"'strong'",[61,1427,163],{"class":71},[61,1429,1430],{"class":78},"'Note:'",[61,1432,1433],{"class":71},")),\n",[61,1435,1436,1439],{"class":63,"line":171},[61,1437,1438],{"class":67},"  ...",[61,1440,1441],{"class":71},"children,\n",[61,1443,1444],{"class":63,"line":186},[61,1445,1446],{"class":71},"]);\n",[11,1448,1449,1450,1452],{},"For example, the following ",[23,1451,1307],{}," block in Markdown",[51,1454,1458],{"className":1455,"code":1456,"language":1457,"meta":57,"style":57},"language-mdc shiki shiki-themes github-light-default github-dark-default","::note\nThis is a note\n::\n","mdc",[23,1459,1460,1469,1474],{"__ignoreMap":57},[61,1461,1462,1465],{"class":63,"line":64},[61,1463,1464],{"class":71},"::",[61,1466,1468],{"class":1467},"sjgCt","note\n",[61,1470,1471],{"class":63,"line":85},[61,1472,1473],{"class":71},"This is a note\n",[61,1475,1476],{"class":63,"line":92},[61,1477,1478],{"class":71},"::\n",[11,1480,1481],{},"Will be transformed into the following HTML:",[51,1483,1487],{"className":1484,"code":1485,"language":1486,"meta":57,"style":57},"language-html shiki shiki-themes github-light-default github-dark-default","\u003Cdiv>\n  \u003Cp>\u003Cstrong>Note:\u003C\u002Fstrong>\u003C\u002Fp>\n  \u003Cp>This is a note\u003C\u002Fp>\n\u003C\u002Fdiv>\n","html",[23,1488,1489,1500,1524,1537],{"__ignoreMap":57},[61,1490,1491,1494,1497],{"class":63,"line":64},[61,1492,1493],{"class":71},"\u003C",[61,1495,1496],{"class":1467},"div",[61,1498,1499],{"class":71},">\n",[61,1501,1502,1505,1507,1510,1512,1515,1517,1520,1522],{"class":63,"line":85},[61,1503,1504],{"class":71},"  \u003C",[61,1506,11],{"class":1467},[61,1508,1509],{"class":71},">\u003C",[61,1511,832],{"class":1467},[61,1513,1514],{"class":71},">Note:\u003C\u002F",[61,1516,832],{"class":1467},[61,1518,1519],{"class":71},">\u003C\u002F",[61,1521,11],{"class":1467},[61,1523,1499],{"class":71},[61,1525,1526,1528,1530,1533,1535],{"class":63,"line":92},[61,1527,1504],{"class":71},[61,1529,11],{"class":1467},[61,1531,1532],{"class":71},">This is a note\u003C\u002F",[61,1534,11],{"class":1467},[61,1536,1499],{"class":71},[61,1538,1539,1542,1544],{"class":63,"line":121},[61,1540,1541],{"class":71},"\u003C\u002F",[61,1543,1496],{"class":1467},[61,1545,1499],{"class":71},[11,1547,1548],{},"As you might have guessed, you will need to do that for each custom Vue component you use in your Markdown files.",[11,1550,1551],{},"With the function completed, we can put the result into each feed item:",[51,1553,1556],{"className":1554,"code":1555,"filename":55,"language":56,"meta":57,"style":57},"language-ts shiki shiki-themes github-light-default github-dark-default has-diff","feed.item({\n  title: post.title,\n  guid: `${url}\u002Fpost\u002F${slug}`,\n  url: `${url}\u002Fpost\u002F${slug}`,\n  description: post.description,\n  date: new Date(post.created_at),\n  categories: post.category ? [post.category] : undefined,\n  custom_elements: [\n    { 'dc:creator': { _cdata: 'John Doe' } },\n    { 'content:encoded': { _cdata: await markdownToHtml(post.path) } }, \u002F\u002F [!CODE ++]\n  ],\n});\n",[23,1557,1558,1567,1572,1590,1607,1612,1623,1638,1642,1655,1675,1679],{"__ignoreMap":57},[61,1559,1560,1563,1565],{"class":63,"line":64},[61,1561,1562],{"class":71},"feed.",[61,1564,469],{"class":101},[61,1566,298],{"class":71},[61,1568,1569],{"class":63,"line":85},[61,1570,1571],{"class":71},"  title: post.title,\n",[61,1573,1574,1577,1579,1581,1583,1586,1588],{"class":63,"line":92},[61,1575,1576],{"class":71},"  guid: ",[61,1578,332],{"class":78},[61,1580,335],{"class":71},[61,1582,488],{"class":78},[61,1584,1585],{"class":71},"slug",[61,1587,499],{"class":78},[61,1589,309],{"class":71},[61,1591,1592,1595,1597,1599,1601,1603,1605],{"class":63,"line":121},[61,1593,1594],{"class":71},"  url: ",[61,1596,332],{"class":78},[61,1598,335],{"class":71},[61,1600,488],{"class":78},[61,1602,1585],{"class":71},[61,1604,499],{"class":78},[61,1606,309],{"class":71},[61,1608,1609],{"class":63,"line":149},[61,1610,1611],{"class":71},"  description: post.description,\n",[61,1613,1614,1617,1619,1621],{"class":63,"line":171},[61,1615,1616],{"class":71},"  date: ",[61,1618,535],{"class":67},[61,1620,538],{"class":101},[61,1622,541],{"class":71},[61,1624,1625,1628,1630,1632,1634,1636],{"class":63,"line":186},[61,1626,1627],{"class":71},"  categories: post.category ",[61,1629,549],{"class":67},[61,1631,552],{"class":71},[61,1633,555],{"class":67},[61,1635,558],{"class":127},[61,1637,309],{"class":71},[61,1639,1640],{"class":63,"line":197},[61,1641,355],{"class":71},[61,1643,1644,1647,1649,1651,1653],{"class":63,"line":202},[61,1645,1646],{"class":71},"    { ",[61,1648,573],{"class":78},[61,1650,576],{"class":71},[61,1652,579],{"class":78},[61,1654,582],{"class":71},[61,1656,1660,1662,1665,1667,1670,1672],{"class":1657,"line":211},[63,1658,1659],"diff","add",[61,1661,1646],{"class":71},[61,1663,1664],{"class":78},"'content:encoded'",[61,1666,576],{"class":71},[61,1668,1669],{"class":67},"await",[61,1671,915],{"class":101},[61,1673,1674],{"class":71},"(post.path) } }, ",[61,1676,1677],{"class":63,"line":373},[61,1678,376],{"class":71},[61,1680,1681],{"class":63,"line":379},[61,1682,427],{"class":71},[11,1684,1685],{},"Now the RSS feed is fully complete with your posts’ content as well.",[15,1687,1689],{"id":1688},"other-approach-i-have-considered","Other approach I have considered",[11,1691,1692,1693,1695],{},"The alternative idea I had to solve this issue was using one of the Nuxt hooks after the build. You can write a custom script to parse the ",[23,1694,25],{}," generated HTML to get the links, and then parse the each post generated file to get the text part.",[11,1697,1698,1699,1702],{},"This will likely do the job, but depending on your custom components, you might get a dirty HTML than just parsing the Markdown. For example, some of the ",[23,1700,1701],{},"\u003Cpre>"," blocks I use here are customized to include a fancier window around it with the file name and also a button to copy the code content. If you don’t handle these edge cases, the RSS readers might not render the content in a desirable way.",[15,1704,1706],{"id":1705},"conclusion","Conclusion",[11,1708,1709],{},"Would be nice if the Nuxt team provides an easier way to do this, as RSS feeds are still very helpful and used by some people. Maybe with a potential rewrite of the module to use Comark they implement it? Who knows.",[1711,1712,1713],"style",{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}",{"title":57,"searchDepth":85,"depth":85,"links":1715},[1716,1717,1718,1719,1720,1721],{"id":17,"depth":85,"text":18},{"id":660,"depth":85,"text":661},{"id":733,"depth":85,"text":734},{"id":823,"depth":85,"text":824},{"id":1688,"depth":85,"text":1689},{"id":1705,"depth":85,"text":1706},"Programming","2026-06-16 00:00:00","A simple walk through on how to create a feed and also provide the posts HTML.","md","en-US",{},null,"\u002Fblog\u002F2026\u002F2026-06-16-generating-an-rss-feed-with-nuxt-content",{"title":5,"description":1724},"blog\u002F2026\u002F2026-06-16-generating-an-rss-feed-with-nuxt-content",[1733,1734,844,848,226],"nuxt","nuxt content","2026-06-19 18:36:00","dU2u7AxSAY99Ee8QZUf2HJ3NKDesogDTOqUnHbLzkGY",{"left":1738,"top":1738,"width":1739,"height":1739,"rotate":1738,"vFlip":1740,"hFlip":1740,"body":1741},0,24,false,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"M12 16v-4m0-4h.01\"\u002F>\u003C\u002Fg>",{"left":1738,"top":1738,"width":1739,"height":1739,"rotate":1738,"vFlip":1740,"hFlip":1740,"body":1743},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M2 6h4m-4 4h4m-4 4h4m-4 4h4\"\u002F>\u003Crect width=\"16\" height=\"20\" x=\"4\" y=\"2\" rx=\"2\"\u002F>\u003Cpath d=\"M9.5 8h5m-5 4H16m-6.5 4H14\"\u002F>\u003C\u002Fg>",{"left":1738,"top":1738,"width":1739,"height":1739,"rotate":1738,"vFlip":1740,"hFlip":1740,"body":1745},"\u003Cpath fill=\"currentColor\" d=\"M12.001 9a3 3 0 1 0 0 6a3 3 0 0 0 0-6m0-2a5 5 0 1 1 0 10a5 5 0 0 1 0-10m6.5-.25a1.25 1.25 0 0 1-2.5 0a1.25 1.25 0 0 1 2.5 0M12.001 4c-2.474 0-2.878.007-4.029.058c-.784.037-1.31.142-1.798.332a2.9 2.9 0 0 0-1.08.703a2.9 2.9 0 0 0-.704 1.08c-.19.49-.295 1.015-.331 1.798C4.007 9.075 4 9.461 4 12c0 2.475.007 2.878.058 4.029c.037.783.142 1.31.331 1.797c.17.435.37.748.702 1.08c.337.336.65.537 1.08.703c.494.191 1.02.297 1.8.333C9.075 19.994 9.461 20 12 20c2.475 0 2.878-.007 4.029-.058c.782-.037 1.308-.142 1.797-.331a2.9 2.9 0 0 0 1.08-.703c.337-.336.538-.649.704-1.08c.19-.492.296-1.018.332-1.8c.052-1.103.058-1.49.058-4.028c0-2.474-.007-2.878-.058-4.029c-.037-.782-.143-1.31-.332-1.798a2.9 2.9 0 0 0-.703-1.08a2.9 2.9 0 0 0-1.08-.704c-.49-.19-1.016-.295-1.798-.331C14.926 4.006 14.54 4 12 4m0-2c2.717 0 3.056.01 4.123.06c1.064.05 1.79.217 2.427.465c.66.254 1.216.598 1.772 1.153a4.9 4.9 0 0 1 1.153 1.772c.247.637.415 1.363.465 2.428c.047 1.066.06 1.405.06 4.122s-.01 3.056-.06 4.122s-.218 1.79-.465 2.428a4.9 4.9 0 0 1-1.153 1.772a4.9 4.9 0 0 1-1.772 1.153c-.637.247-1.363.415-2.427.465c-1.067.047-1.406.06-4.123.06s-3.056-.01-4.123-.06c-1.064-.05-1.789-.218-2.427-.465a4.9 4.9 0 0 1-1.772-1.153a4.9 4.9 0 0 1-1.153-1.772c-.248-.637-.415-1.363-.465-2.428C2.012 15.056 2 14.717 2 12s.01-3.056.06-4.122s.217-1.79.465-2.428a4.9 4.9 0 0 1 1.153-1.772A4.9 4.9 0 0 1 5.45 2.525c.637-.248 1.362-.415 2.427-.465C8.945 2.013 9.284 2 12.001 2\"\u002F>",{"left":1738,"top":1738,"width":1739,"height":1739,"rotate":1738,"vFlip":1740,"hFlip":1740,"body":1747},"\u003Cpath fill=\"currentColor\" d=\"M4.907 3.44c.709.12 1.533.501 2.576 1.247C9.28 5.97 10.769 7.739 12 9.564c1.231-1.825 2.72-3.593 4.517-4.877c1.043-.746 1.867-1.127 2.576-1.248c.767-.13 1.29.065 1.615.2C21.717 4.06 22 5.225 22 6.215c0 .201-.086 1.302-.185 2.36c-.052.546-.11 1.108-.166 1.577c-.053.428-.115.88-.19 1.133a4.33 4.33 0 0 1-1.951 2.517c.937.707 1.277 1.856.928 2.984c-.597 1.924-2.737 4.397-4.835 4.618c-1.773.186-2.935-1.325-3.601-2.76c-.666 1.435-1.828 2.946-3.6 2.76c-2.099-.22-4.24-2.694-4.836-4.618c-.35-1.128-.01-2.277.928-2.984a4.33 4.33 0 0 1-1.95-2.517c-.076-.253-.138-.705-.19-1.133a61 61 0 0 1-.167-1.577C2.085 7.517 2 6.416 2 6.215c0-.99.283-2.155 1.292-2.576c.326-.135.847-.33 1.615-.2M4.05 6.916c.064.818.18 2.108.288 2.992c.032.268.055.545.122.807c.397 1.34 1.929 2.082 3.686 1.887a1 1 0 0 1 .257 1.983c-.756.112-3.315.357-2.928 1.607c.357 1.151 1.848 3.087 3.134 3.222c.928.097 1.5-1.394 1.766-2.045c.275-.674.488-1.38.668-1.982a1 1 0 0 1 1.916 0c.18.602.393 1.308.668 1.982c.266.651.838 2.142 1.766 2.045c1.286-.135 2.777-2.07 3.134-3.222c.387-1.25-2.172-1.495-2.928-1.607a1 1 0 0 1 .257-1.983c1.757.195 3.289-.547 3.686-1.887c.069-.266.089-.536.122-.807a80 80 0 0 0 .288-2.992c.037-.468.247-1.637-.522-1.506c-.286.049-.823.241-1.749.903c-1.943 1.389-3.705 3.513-4.789 5.64a1 1 0 0 1-1.782 0c-1.084-2.127-2.846-4.251-4.789-5.64c-.926-.662-1.463-.854-1.749-.903c-.784-.134-.559 1.034-.522 1.506\"\u002F>",{"left":1738,"top":1738,"width":1739,"height":1739,"rotate":1738,"vFlip":1740,"hFlip":1740,"body":1749},"\u003Cpath fill=\"currentColor\" d=\"M5.884 18.653c-.3-.2-.558-.455-.86-.816a51 51 0 0 1-.466-.579c-.463-.575-.755-.841-1.056-.95a1 1 0 1 1 .675-1.882c.752.27 1.261.735 1.947 1.588c-.094-.117.34.427.433.539c.19.227.33.365.44.438c.204.137.588.196 1.15.14c.024-.382.094-.753.202-1.095c-2.968-.726-4.648-2.64-4.648-6.396c0-1.24.37-2.356 1.058-3.292c-.218-.894-.185-1.975.302-3.192a1 1 0 0 1 .63-.582c.081-.024.127-.035.208-.047c.803-.124 1.937.17 3.415 1.096a11.7 11.7 0 0 1 2.687-.308c.912 0 1.819.104 2.684.308c1.477-.933 2.614-1.227 3.422-1.096q.128.02.218.05a1 1 0 0 1 .616.58c.487 1.216.52 2.296.302 3.19c.691.936 1.058 2.045 1.058 3.293c0 3.757-1.674 5.665-4.642 6.392c.125.415.19.878.19 1.38c0 .665-.002 1.299-.007 2.01c0 .19-.002.394-.005.706a1 1 0 0 1-.018 1.958c-1.14.227-1.984-.532-1.984-1.525l.002-.447l.005-.705c.005-.707.008-1.337.008-1.997c0-.697-.184-1.152-.426-1.361c-.661-.57-.326-1.654.541-1.751c2.966-.333 4.336-1.482 4.336-4.66c0-.955-.312-1.744-.913-2.404A1 1 0 0 1 17.2 6.19c.166-.414.236-.957.095-1.614l-.01.003c-.491.139-1.11.44-1.858.949a1 1 0 0 1-.833.135a9.6 9.6 0 0 0-2.592-.349c-.89 0-1.772.118-2.592.35a1 1 0 0 1-.829-.134c-.753-.507-1.374-.807-1.87-.947c-.143.653-.072 1.194.093 1.607a1 1 0 0 1-.189 1.045c-.597.655-.913 1.458-.913 2.404c0 3.172 1.371 4.328 4.322 4.66c.865.097 1.202 1.177.545 1.748c-.193.168-.43.732-.43 1.364v3.15c0 .985-.834 1.725-1.96 1.528a1 1 0 0 1-.04-1.962v-.99c-.91.061-1.661-.088-2.254-.485\"\u002F>",{"left":1738,"top":1738,"width":1739,"height":1739,"rotate":1738,"vFlip":1740,"hFlip":1740,"body":1751},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M4 11a9 9 0 0 1 9 9M4 4a16 16 0 0 1 16 16\"\u002F>\u003Ccircle cx=\"5\" cy=\"19\" r=\"1\"\u002F>\u003C\u002Fg>",{"left":1738,"top":1738,"width":1739,"height":1739,"rotate":1738,"vFlip":1740,"hFlip":1740,"body":1753},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"M12 8v4m0 4h.01\"\u002F>\u003C\u002Fg>",{"left":1738,"top":1738,"width":1739,"height":1739,"rotate":1738,"vFlip":1740,"hFlip":1740,"body":1755},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fg>",{"left":1738,"top":1738,"width":418,"height":418,"rotate":1738,"vFlip":1740,"hFlip":1740,"body":1757},"\u003Cpath fill=\"none\" stroke=\"#a6da95\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9.5 12.5h6l-5-7L7.44 11c-.67.98-1.32 1.48-1.94 1.5h-5l5-9l3 5\"\u002F>",{"left":1738,"top":1738,"width":418,"height":418,"rotate":1738,"vFlip":1740,"hFlip":1740,"body":1759},"\u003Cg fill=\"none\" stroke=\"#a6da95\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\u003Cpath d=\"M1 1.5h5.44L8 4.56L9.56 1.5H15l-6.99 13z\"\u002F>\u003Cpath d=\"M12.05 1.73L8 9.28L3.95 1.73\"\u002F>\u003C\u002Fg>",{"left":1738,"top":1738,"width":418,"height":418,"rotate":1738,"vFlip":1740,"hFlip":1740,"body":1761},"\u003Cg fill=\"none\" stroke=\"#8aadf4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\u003Cpath d=\"M4 1.5h8A2.5 2.5 0 0 1 14.5 4v8a2.5 2.5 0 0 1-2.5 2.5H4A2.5 2.5 0 0 1 1.5 12V4A2.5 2.5 0 0 1 4 1.5\"\u002F>\u003Cpath d=\"M12.5 8.75c0-.69-.54-1.25-1.2-1.25h-.6c-.66 0-1.2.56-1.2 1.25S10.04 10 10.7 10h.6c.66 0 1.2.56 1.2 1.25s-.54 1.25-1.2 1.25h-.6c-.66 0-1.2-.56-1.2-1.25m-3-3.75v5M5 7.5h3\"\u002F>\u003C\u002Fg>",{"left":1738,"top":1738,"width":1739,"height":1739,"rotate":1738,"vFlip":1740,"hFlip":1740,"body":1763},"\u003Cpath fill=\"currentColor\" d=\"M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019l-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z\"\u002F>",1782656917119]