> ## Documentation Index
> Fetch the complete documentation index at: https://docs.livepeer.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Livepeer Studio Recent Announcements

> Latest videos, blog posts, and community activity for Livepeer Studio.

export const studioSocials = [{
  icon: 'globe',
  href: 'https://livepeer.studio/',
  label: 'Livepeer Studio'
}, {
  icon: 'file-code',
  href: 'https://livepeer.studio/docs',
  label: 'Studio Docs'
}, {
  icon: 'github',
  href: 'https://github.com/livepeer/studio',
  label: 'Studio GitHub'
}, {
  icon: 'youtube',
  href: 'https://www.youtube.com/@livepeerstudio5404',
  label: 'Studio YouTube'
}, {
  icon: 'x-twitter',
  href: 'https://x.com/livepeerstudio',
  label: 'Studio X'
}, {
  icon: 'discord',
  href: 'https://discord.gg/livepeer',
  label: 'Livepeer Discord'
}];

export const discordAnnouncementsData = [{
  id: "1486303511787602010",
  content: "📣 <strong>Monthly Updates & Retros Are Due!</strong> 📣<br /><br />Please post your February monthly update or retrospective as a reply under your original proposal.<br />For guidance, refer to <a href=\"https://roadmap.livepeer.org/help/articles/8273474-monthly-reports\" target=\"_blank\" rel=\"noopener noreferrer\">the Monthly Update Guide</a> and <a href=\"https://roadmap.livepeer.org/help/articles/8986190-retrospective\" target=\"_blank\" rel=\"noopener noreferrer\">Retro Guide</a>.<br /><br />The following teams have already shared theirs:<br /><ul><li><a href=\"https://forum.livepeer.org/t/transformation-spe-release-notes-closing-retro/3142/7?u=mehrdad\" target=\"_blank\" rel=\"noopener noreferrer\">Transformation SPE Retrospective </a></li><li><a href=\"https://forum.livepeer.org/t/proposal-protocol-r-d-special-purpose-entity/3160/11?u=drieddate_sidestream\" target=\"_blank\" rel=\"noopener noreferrer\">Protocol SPE February Update</a></li><li><a href=\"https://forum.livepeer.org/t/metrics-and-sla-foundations-for-naap/3189/9?u=mehrdad\" target=\"_blank\" rel=\"noopener noreferrer\">Cloud SPE February Update</a></li></ul>",
  author: "_alisonwonderland",
  timestamp: "2026-03-25T09:59:31.394Z",
  url: "https://discord.com/channels/1066890817425387581/1463391944746078319/1486303511787602010"
}, {
  id: "1486303464345702520",
  content: "📣 <strong><u>The CloudSPE proposal is live.</u></strong> 🗳️ 📣 <br /><br />The proposal funds Cloud SPE to build a focused MVP for standardized, publicly observable network performance, reliability, and demand metrics, making the network measurable and comparable while laying the groundwork for future SLA-aware routing and scaling.<br /><br />Vote Yes ✅ or No ❌ <a href=\"https://explorer.livepeer.org/treasury/47675980806842999962173227987422002121354040219792725319563843023665050472833\" target=\"_blank\" rel=\"noopener noreferrer\">here</a>",
  author: "_alisonwonderland",
  timestamp: "2026-03-25T09:59:20.083Z",
  url: "https://discord.com/channels/1066890817425387581/1463391944746078319/1486303464345702520"
}, {
  id: "1486303431873527941",
  content: "📣 <strong><u>Vote now on the Protocol R&D SPE</u></strong> 🗳️ 📣 <br /><br />All network value depends on protocol security. The proposal argues for a dedicated, continuously staffed function for protocol security, upgrades, and core improvements, replacing the current ad hoc model with a single accountable structure.<br /><br />Vote Yes ✅ or No ❌ <a href=\"https://explorer.livepeer.org/treasury/67253869199932483234551664403036205881217777786063955710174984983936506090761\" target=\"_blank\" rel=\"noopener noreferrer\">here</a>",
  author: "_alisonwonderland",
  timestamp: "2026-03-25T09:59:12.341Z",
  url: "https://discord.com/channels/1066890817425387581/1463391944746078319/1486303431873527941"
}, {
  id: "1486303296984453240",
  content: "🦃🦃🦃 <strong><u>November #2 Community Update</u></strong> 🦃🦃🦃<br /><br /><strong>Big Moments</strong><br /><br />📈  Network fees last week were <strong>\$15,826</strong> with a stable fee baseline in November. Participation rate is <br /><strong>51.7%</strong> - <u>a three year high</u>; the inflation rate is decreasing, currently at <strong>0.06835%</strong>.<br /><br /><:daydream:1435328189311488060> Daydream Scope, created by <@380038770520489986>, added LoRA Support in Scope v0.1.0a7. Read more <a href=\"https://github.com/daydreamlive/scope/releases/tag/v0.1.0a7\" target=\"_blank\" rel=\"noopener noreferrer\">here</a>.<br /><br />🔐 The new bot measures has again curbed spam in the server. <strong>Beware of a new tactic - Bots are adding links into their bio.</strong> We are exploring measures to remove these bots. <u>Never click links in the bio of unverified sources.</u><br /><br /><strong>Upcoming Events</strong><br /><br /><a href=\"https://discord.com/events/423160867534929930/1394387798232141996\" target=\"_blank\" rel=\"noopener noreferrer\">Livepeer Fireside</a> - <t:1764180000:R><br /><a href=\"https://discord.com/events/423160867534929930/1394387788568203274\" target=\"_blank\" rel=\"noopener noreferrer\">Watercooler Chat</a> - <t:1764619200:f><br /><br /><strong>Other Updates</strong><br /><br />🟣 <u>Muxion Labs</u><br /><br /><@&1303105760661606450>'s <@488172209823678474> created a new Daydream Comfy Custom Node with an updated interface. If you want to see it in action - watch this week's Watercooler Chat <a href=\"https://youtu.be/9rZh5d_wRlI?t=1753\" target=\"_blank\" rel=\"noopener noreferrer\">here</a>! The link goes directly to the demo timestamp. <br /><br />🏛️ <u>Livepeer Foundation</u><br /><br />Livepeer Foundation has been making progress towards the Transformation SPE goals:<br /><br /><ul><li><@781667568942841866> posted progress on updating our documentation <a href=\"https://forum.livepeer.org/t/rfp-documentation-restructure/3071/11?u=cult_leader_en\" target=\"_blank\" rel=\"noopener noreferrer\">here</a></li><li><@537817645140017153> digested the feedback from the Inflation Survey <a href=\"https://forum.livepeer.org/t/continuing-discussions-on-inflation/3139/4?u=cult_leader_en\" target=\"_blank\" rel=\"noopener noreferrer\">here</a></li><li>Guild has made improvements to the Explorer</li></ul><@&1433161182143053864> members & <@423592125406380042> were in Argentina for DevConnect - See <@543292258980593664> review of the conference <a href=\"https://discord.com/channels/423160867534929930/426106677650128898/1441545466323144734\" target=\"_blank\" rel=\"noopener noreferrer\">https://discord.com/channels/423160867534929930/426106677650128898/1441545466323144734</a><br /><br /><a:campfire:1372208400787832953> <u>Livepeer Fireside</u><br /><br />Watch the most recent Fireside <a href=\"https://www.youtube.com/watch?v=Uw7cdZLx7kA\" target=\"_blank\" rel=\"noopener noreferrer\">here</a>.<br /><br />Last Fireside's agenda:<br /><br /><ul><li><@515896144560128000> from Embody Network updating on progress</li><li><@389895972102209551> from Embody Network presenting Embody AI creator</li></ul>❌ <strong>Missed an event?</strong><br /><br />If you miss any events, check out our <a href=\"https://www.youtube.com/@LivepeerProject\" target=\"_blank\" rel=\"noopener noreferrer\">Youtube here</a>. <br /><br /><strong>Asking again: What do we want for Livepeer in 2026?</strong> Please drop your opinions in <#426106677650128898> 🦃🪞<div style=\"border-left:3px solid var(--accent);padding:8px 12px;margin-top:12px;border-radius:4px\"><a href=\"https://www.youtube.com/watch?v=9rZh5d_wRlI\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Watercooler Chat | November 24 2025</strong></a><p>Tune into our weekly Watercooler Chat to discuss pressing topics from community members.<br />---<br />Connect with Livepeer on Socials:<br />Twitter: <a href=\"https://twitter.com/Livepeer\" target=\"_blank\" rel=\"noopener noreferrer\">https://twitter.com/Livepeer</a><br />Discord: <a href=\"https://discord.gg/uaPhtyrWsF\" target=\"_blank\" rel=\"noopener noreferrer\">https://discord.gg/uaPhtyrWsF</a><br />Telegram: <a href=\"https://t.me/livepeerorg\" target=\"_blank\" rel=\"noopener noreferrer\">https://t.me/livepeerorg</a><br />Reddit: <a href=\"https://www.reddit.com/r/livepeer/\" target=\"_blank\" rel=\"noopener noreferrer\">https://www.reddit.com/r/livepeer/</a><br />Blog: <a href=\"https://medium.com/livepeer-blog\" target=\"_blank\" rel=\"noopener noreferrer\">https://medium.com/livepeer-blog</a><br />Forum: <a href=\"https://forum...\" target=\"_blank\" rel=\"noopener noreferrer\">https://forum...</a></p><img src=\"https://i.ytimg.com/vi/9rZh5d_wRlI/maxresdefault.jpg\" alt=\"Watercooler Chat | November 24 2025\" style=\"max-width:300px;border-radius:8px;margin-top:8px\" /></div><div style=\"border-left:3px solid var(--accent);padding:8px 12px;margin-top:12px;border-radius:4px\"><a href=\"https://forum.livepeer.org/t/rfp-documentation-restructure/3071/11?u=cult_leader_en\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>RFP - Documentation Restructure</strong></a><p>Hello all!  Thank you for welcoming me at today's Watercooler Chat [Slides here] where I provided a few key Documentation updates, which I'm also sharing below.     Sharing the latest structured update on the Livepeer Documentation Restructure, aligned with the RFP goals outlined here: RFP - Documentation Restructure - #10 by honestly_rich...</p><img src=\"https://canada1.discourse-cdn.com/flex030/uploads/livepeer/original/2X/9/9cdb46d131c2f53e22bfd13cbc572e215b2b636e.png\" alt=\"RFP - Documentation Restructure\" style=\"max-width:300px;border-radius:8px;margin-top:8px\" /></div><div style=\"border-left:3px solid var(--accent);padding:8px 12px;margin-top:12px;border-radius:4px\"><a href=\"https://forum.livepeer.org/t/continuing-discussions-on-inflation/3139/4?u=cult_leader_en\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Continuing discussions on Inflation</strong></a><p>Quick update on the survey:  We have a good number (25) of results now, so I'll be closing the survey at midnight UTC on Thursday. That means that the last day to fill out the form is Wednesday (in the morning if you're in Argentina).  I'll then synthesise the answers and share a summary here this Friday.   Edit: The survey is now closed. ...</p></div><div style=\"border-left:3px solid var(--accent);padding:8px 12px;margin-top:12px;border-radius:4px\"><a href=\"https://www.youtube.com/watch?v=Uw7cdZLx7kA\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Livepeer Fireside | November 12 2025</strong></a><p>Join our weekly Fireside where we discuss the most important happenings within our ecosystem. The heavy hitters of the community present their updates. Tap in!<br />---<br />Connect with Livepeer on Socials:<br />Twitter: <a href=\"https://twitter.com/Livepeer\" target=\"_blank\" rel=\"noopener noreferrer\">https://twitter.com/Livepeer</a><br />Discord: <a href=\"https://discord.gg/uaPhtyrWsF\" target=\"_blank\" rel=\"noopener noreferrer\">https://discord.gg/uaPhtyrWsF</a><br />Telegram: <a href=\"https://t.me/livepeerorg\" target=\"_blank\" rel=\"noopener noreferrer\">https://t.me/livepeerorg</a><br />Reddit: <a href=\"https://www.reddit.com/...\" target=\"_blank\" rel=\"noopener noreferrer\">https://www.reddit.com/...</a></p><img src=\"https://i.ytimg.com/vi/Uw7cdZLx7kA/maxresdefault.jpg\" alt=\"Livepeer Fireside | November 12 2025\" style=\"max-width:300px;border-radius:8px;margin-top:8px\" /></div>",
  author: "_alisonwonderland",
  timestamp: "2026-03-25T09:58:40.181Z",
  url: "https://discord.com/channels/1066890817425387581/1463391944746078319/1486303296984453240"
}, {
  id: "1483220726331740373",
  content: "Livepeer #🎙│announcements",
  author: "_alisonwonderland",
  timestamp: "2026-03-16T21:49:38.066Z",
  url: "https://discord.com/channels/1066890817425387581/1463391944746078319/1483220726331740373"
}, {
  id: "1473413137410560030",
  content: "Livepeer #🎙│announcements",
  author: "_alisonwonderland",
  timestamp: "2026-02-17T20:17:46.651Z",
  url: "https://discord.com/channels/1066890817425387581/1463391944746078319/1473413137410560030"
}, {
  id: "1463397885272920138",
  content: "📣 <strong><u>The CloudSPE proposal is live.</u></strong> 🗳️ 📣 <br /><br />The proposal funds Cloud SPE to build a focused MVP for standardized, publicly observable network performance, reliability, and demand metrics, making the network measurable and comparable while laying the groundwork for future SLA-aware routing and scaling.<br /><br />Vote Yes ✅ or No ❌ <a href=\"https://explorer.livepeer.org/treasury/47675980806842999962173227987422002121354040219792725319563843023665050472833\" target=\"_blank\" rel=\"noopener noreferrer\">here</a>",
  author: "_alisonwonderland",
  timestamp: "2026-01-21T05:00:44.467Z",
  url: "https://discord.com/channels/1066890817425387581/1463391944746078319/1463397885272920138"
}, {
  id: "1463397844890288351",
  content: "📣 <strong><u>Vote now on the Protocol R&D SPE</u></strong> 🗳️ 📣 <br /><br />All network value depends on protocol security. The proposal argues for a dedicated, continuously staffed function for protocol security, upgrades, and core improvements, replacing the current ad hoc model with a single accountable structure.<br /><br />Vote Yes ✅ or No ❌ <a href=\"https://explorer.livepeer.org/treasury/67253869199932483234551664403036205881217777786063955710174984983936506090761\" target=\"_blank\" rel=\"noopener noreferrer\">here</a>",
  author: "_alisonwonderland",
  timestamp: "2026-01-21T05:00:34.839Z",
  url: "https://discord.com/channels/1066890817425387581/1463391944746078319/1463397844890288351"
}, {
  id: "1463392024576266301",
  content: "Livepeer #🎙│announcements",
  author: "_alisonwonderland",
  timestamp: "2026-01-21T04:37:27.168Z",
  url: "https://discord.com/channels/1066890817425387581/1463391944746078319/1463392024576266301"
}];

export const youtubeDataStatic = [{
  title: 'Livepeer — Building Disruptive Web3 Streaming Apps with Livepeer Studio',
  href: 'https://www.youtube.com/watch?v=Q4xIbubnqRI',
  author: 'By EthGlobal',
  content: '...',
  publishedDate: 'Mar 24, 2023'
}, {
  title: 'How to Upload a Video to Livepeer Studio',
  href: 'https://www.youtube.com/watch?v=Y0bWTVOVAKo',
  author: 'By Livepeer Studio',
  content: '...',
  publishedDate: 'Mar 17, 2023'
}, {
  title: 'Livepeer — Unleash Web3 Video Experiences with Livepeer Studio — Yondon Fu',
  href: 'https://www.youtube.com/watch?v=XLY5S1V8EjA',
  author: 'By EthGlobal',
  content: '...',
  publishedDate: 'Mar 10, 2023'
}, {
  title: 'Power of Video for Web3 Creator Apps with Livepeer and Bonfire',
  href: 'https://www.youtube.com/watch?v=k1Dtms2qVbs',
  author: 'By Livepeer Studio',
  content: '...',
  publishedDate: 'Dec 18, 2023'
}];

export const youtubeData = [{
  title: 'Watercooler Chat | March 23 2026',
  href: 'https://www.youtube.com/watch?v=9CohiDl-qSc',
  author: 'By Livepeer',
  content: '...',
  publishedDate: 'Mar 24, 2026',
  duration: 'PT1H22M16S',
  thumbnailUrl: 'https://i.ytimg.com/vi/9CohiDl-qSc/hqdefault.jpg'
}, {
  title: 'Watercooler Chat | March 16 2026',
  href: 'https://www.youtube.com/watch?v=4LzWGumv47g',
  author: 'By Livepeer',
  content: '...',
  publishedDate: 'Mar 17, 2026',
  duration: 'PT1H37M46S',
  thumbnailUrl: 'https://i.ytimg.com/vi/4LzWGumv47g/hqdefault.jpg'
}, {
  title: 'Watercooler Chat | March 9 2026',
  href: 'https://www.youtube.com/watch?v=XVTnq-Z9YrY',
  author: 'By Livepeer',
  content: '...',
  publishedDate: 'Mar 10, 2026',
  duration: 'PT1H57M27S',
  thumbnailUrl: 'https://i.ytimg.com/vi/XVTnq-Z9YrY/hqdefault.jpg'
}, {
  title: 'Livepeer Fireside (11)',
  href: 'https://www.youtube.com/watch?v=Kf2V6d90oqk',
  author: 'By Livepeer',
  content: '--- Connect with Livepeer on Socials: Twitter: https://twitter.com/Livepeer Discord: https://discord.gg/uaPhtyrWsF Telegram: https://t.me/livepeerorg Reddit: https://www.reddit.com/r/livepeer/ Blog: https://medium.com/livepeer-blog Forum: https://forum.livepeer.org/...',
  publishedDate: 'Dec 18, 2025',
  duration: 'PT51M23S',
  thumbnailUrl: 'https://i.ytimg.com/vi/Kf2V6d90oqk/hqdefault.jpg'
}, {
  title: 'Livepeer Fireside',
  href: 'https://www.youtube.com/watch?v=NYczXgZ_oLg',
  author: 'By Livepeer',
  content: '--- Connect with Livepeer on Socials: Twitter: https://twitter.com/Livepeer Discord: https://discord.gg/uaPhtyrWsF Telegram: https://t.me/livepeerorg Reddit: https://www.reddit.com/r/livepeer/ Blog: https://medium.com/livepeer-blog Forum: https://forum.livepeer.org/...',
  publishedDate: 'Dec 4, 2025',
  duration: 'PT15M55S',
  thumbnailUrl: 'https://i.ytimg.com/vi/NYczXgZ_oLg/hqdefault.jpg'
}, {
  title: 'Livepeer Fireside 📱',
  href: 'https://www.youtube.com/watch?v=CnuyKyms6qg',
  author: 'By Livepeer',
  content: '--- Connect with Livepeer on Socials: Twitter: https://twitter.com/Livepeer Discord: https://discord.gg/uaPhtyrWsF Telegram: https://t.me/livepeerorg Reddit: https://www.reddit.com/r/livepeer/ Blog: https://medium.com/livepeer-blog Forum: https://forum.livepeer.org/...',
  publishedDate: 'Dec 4, 2025',
  duration: 'PT15M53S',
  thumbnailUrl: 'https://i.ytimg.com/vi/CnuyKyms6qg/hqdefault.jpg'
}, {
  title: 'Watercooler Chat | December 1 2025',
  href: 'https://www.youtube.com/watch?v=LmZNEaOOb9I',
  author: 'By Livepeer',
  content: 'Tune into our weekly Watercooler Chat to discuss pressing topics from community members. --- Connect with Livepeer on Socials: Twitter: https://twitter.com/Livepeer Discord: https://discord.gg/uaPhtyrWsF Telegram: https://t.me/livepeerorg Reddit: https://www.reddit.com/r/livepeer/ Blog: https://medium.com/livepeer-blog Forum: https://forum.livepeer.org/...',
  publishedDate: 'Dec 2, 2025',
  duration: 'PT40M4S',
  thumbnailUrl: 'https://i.ytimg.com/vi/LmZNEaOOb9I/hqdefault.jpg'
}, {
  title: 'Livepeer Fireside | November 26 2025',
  href: 'https://www.youtube.com/watch?v=GNC__DEpxOY',
  author: 'By Livepeer',
  content: 'Join our weekly Fireside where we discuss the most important happenings within our ecosystem. The heavy hitters of the community present their updates. Tap in! --- Connect with Livepeer on Socials: Twitter: https://twitter.com/Livepeer Discord: https://discord.gg/uaPhtyrWsF Telegram: https://t.me/livepeerorg Reddit: https://www.reddit.com/r/livepeer/ Blog: https://medium.com/livepeer-blog Forum: https://forum.livepeer.org/...',
  publishedDate: 'Nov 27, 2025',
  duration: 'PT53M21S',
  thumbnailUrl: 'https://i.ytimg.com/vi/GNC__DEpxOY/hqdefault.jpg'
}, {
  title: 'Watercooler Chat | November 24 2025',
  href: 'https://www.youtube.com/watch?v=9rZh5d_wRlI',
  author: 'By Livepeer',
  content: 'Tune into our weekly Watercooler Chat to discuss pressing topics from community members. --- Connect with Livepeer on Socials: Twitter: https://twitter.com/Livepeer Discord: https://discord.gg/uaPhtyrWsF Telegram: https://t.me/livepeerorg Reddit: https://www.reddit.com/r/livepeer/ Blog: https://medium.com/livepeer-blog Forum: https://forum.livepeer.org/...',
  publishedDate: 'Nov 25, 2025',
  duration: 'PT1H5M38S',
  thumbnailUrl: 'https://i.ytimg.com/vi/9rZh5d_wRlI/hqdefault.jpg'
}, {
  title: 'Watercooler Chat | November 17 2025',
  href: 'https://www.youtube.com/watch?v=X0z2o3b5LEo',
  author: 'By Livepeer',
  content: 'Tune into our weekly Watercooler Chat to discuss pressing topics from community members. --- Connect with Livepeer on Socials: Twitter: https://twitter.com/Livepeer Discord: https://discord.gg/uaPhtyrWsF Telegram: https://t.me/livepeerorg Reddit: https://www.reddit.com/r/livepeer/ Blog: https://medium.com/livepeer-blog Forum: https://forum.livepeer.org/...',
  publishedDate: 'Nov 19, 2025',
  duration: 'PT1H36M3S',
  thumbnailUrl: 'https://i.ytimg.com/vi/X0z2o3b5LEo/hqdefault.jpg'
}, {
  title: 'Livepeer Fireside | November 12 2025',
  href: 'https://www.youtube.com/watch?v=Uw7cdZLx7kA',
  author: 'By Livepeer',
  content: 'Join our weekly Fireside where we discuss the most important happenings within our ecosystem. The heavy hitters of the community present their updates. Tap in! --- Connect with Livepeer on Socials: Twitter: https://twitter.com/Livepeer Discord: https://discord.gg/uaPhtyrWsF Telegram: https://t.me/livepeerorg Reddit: https://www.reddit.com/r/livepeer/ Blog: https://medium.com/livepeer-blog Forum: https://forum.livepeer.org/...',
  publishedDate: 'Nov 13, 2025',
  duration: 'PT42M2S',
  thumbnailUrl: 'https://i.ytimg.com/vi/Uw7cdZLx7kA/hqdefault.jpg'
}, {
  title: 'Eric Tang | Live in Lisbon Summit 2025 by Livepeer',
  href: 'https://www.youtube.com/watch?v=-iO7HsR3KE4',
  author: 'By Livepeer',
  content: 'A deep dive into Daydream, the real-time video Ai gateway for the Livepeer network. --- Connect with Livepeer on Socials: Website: https://www.livepeer.org/ Twitter: https://twitter.com/Livepeer Discord: https://discord.gg/uaPhtyrWsF Telegram: https://t.me/livepeerorg Blog: https://medium.com/livepeer-blog Forum: https://forum.livepeer.org/...',
  publishedDate: 'Nov 11, 2025',
  duration: 'PT22M10S',
  thumbnailUrl: 'https://i.ytimg.com/vi/-iO7HsR3KE4/hqdefault.jpg'
}, {
  title: 'Watercooler Chat | November 10 2025',
  href: 'https://www.youtube.com/watch?v=WIhKrNWr8ZM',
  author: 'By Livepeer',
  content: 'Tune into our weekly Watercooler chat to discuss pressing topics from community members. --- Connect with Livepeer on Socials: Twitter: https://twitter.com/Livepeer Discord: https://discord.gg/uaPhtyrWsF Telegram: https://t.me/livepeerorg Reddit: https://www.reddit.com/r/livepeer/ Blog: https://medium.com/livepeer-blog Forum: https://forum.livepeer.org/...',
  publishedDate: 'Nov 11, 2025',
  duration: 'PT30M41S',
  thumbnailUrl: 'https://i.ytimg.com/vi/WIhKrNWr8ZM/hqdefault.jpg'
}, {
  title: 'Define & Dane | Live in Lisbon Summit 2025',
  href: 'https://www.youtube.com/watch?v=s1dhZTofuCM',
  author: 'By Livepeer',
  content: 'The embody network --- Connect with Livepeer on Socials: Website: https://www.livepeer.org/ Twitter:   / livepeer   Discord:   / discord   Telegram: https://t.me/livepeerorg Blog:   / livepeer   Forum: https://forum.livepeer.org/...',
  publishedDate: 'Nov 10, 2025',
  duration: 'PT15M54S',
  thumbnailUrl: 'https://i.ytimg.com/vi/s1dhZTofuCM/hqdefault.jpg'
}];

export const BorderedBox = ({children, variant = "default", padding = "var(--lp-spacing-4)", borderRadius = "var(--lp-spacing-px-8)", margin = "", accentBar = "", style = {}, className = "", ...rest}) => {
  const variants = {
    default: {
      border: "1px solid var(--lp-color-border-default)",
      backgroundColor: "var(--lp-color-bg-card)"
    },
    accent: {
      border: "1px solid var(--lp-color-accent)",
      backgroundColor: "var(--lp-color-bg-card)"
    },
    muted: {
      border: "1px solid var(--lp-color-border-default)",
      backgroundColor: "transparent"
    }
  };
  const accentBarColors = {
    accent: "var(--lp-color-accent)",
    positive: "var(--green-9)"
  };
  return <div data-docs-bordered-box="" data-accent-bar={accentBarColors[accentBar] ? "" : undefined} className={className} style={{
    ...variants[variant],
    padding: padding,
    borderRadius: borderRadius,
    ...margin ? {
      margin
    } : {},
    ...accentBarColors[accentBar] ? {
      position: "relative",
      '--accent-bar-color': accentBarColors[accentBar]
    } : {},
    ...style
  }} {...rest}>
      {children}
    </div>;
};

export const CenteredContainer = ({children, maxWidth = "800px", padding = "0", preset = "default", width = "", minWidth = "", marginRight = "", marginBottom = "", textAlign = "", style = {}, className = "", ...rest}) => {
  const presets = {
    default: {},
    fitContent: {
      width: "fit-content",
      minWidth: "fit-content"
    },
    readable70: {
      width: "70%",
      minWidth: "fit-content"
    },
    readable80: {
      width: "80%",
      minWidth: "fit-content"
    },
    readable90: {
      width: "90%"
    },
    wide900: {
      maxWidth: "900px"
    }
  };
  const presetStyle = presets[preset] || presets.default;
  return <div className={className} style={{
    maxWidth: presetStyle.maxWidth || maxWidth,
    margin: "0 auto",
    padding: padding,
    ...presetStyle.width ? {
      width: presetStyle.width
    } : {},
    ...presetStyle.minWidth ? {
      minWidth: presetStyle.minWidth
    } : {},
    ...width ? {
      width
    } : {},
    ...minWidth ? {
      minWidth
    } : {},
    ...marginRight ? {
      marginRight
    } : {},
    ...marginBottom ? {
      marginBottom
    } : {},
    ...textAlign ? {
      textAlign
    } : {},
    ...style
  }} {...rest}>
      {children}
    </div>;
};

export const LazyLoad = ({children, height = "200px", offset = "200px", fadeDuration = 400, className = "", style = {}, ...rest}) => {
  const ref = useRef(null);
  const [visible, setVisible] = useState(false);
  const [ready, setReady] = useState(false);
  useEffect(() => {
    const el = ref.current;
    if (!el) return;
    const observer = new IntersectionObserver(([entry]) => {
      if (entry.isIntersecting) {
        setVisible(true);
        observer.disconnect();
      }
    }, {
      rootMargin: offset
    });
    observer.observe(el);
    return () => observer.disconnect();
  }, []);
  useEffect(() => {
    if (!visible) return;
    const frameId = requestAnimationFrame(() => {
      setReady(true);
    });
    return () => cancelAnimationFrame(frameId);
  }, [visible]);
  const placeholder = <div ref={ref} className={className} style={{
    minHeight: height,
    ...style
  }} {...rest} />;
  if (!visible) return placeholder;
  return <div ref={ref} className={className} style={{
    opacity: ready ? 1 : 0,
    transition: `opacity ${fadeDuration}ms ease-in`,
    ...style
  }} {...rest}>
      {children}
    </div>;
};

export const ScrollBox = ({children, maxHeight = 300, showHint = true, ariaLabel = "Scrollable content", style = {}, className = "", ...rest}) => {
  const contentRef = useRef(null);
  const [isOverflowing, setIsOverflowing] = useState(false);
  useEffect(() => {
    const checkOverflow = () => {
      if (contentRef.current) {
        const maxHeightPx = typeof maxHeight === "number" ? maxHeight : parseInt(maxHeight, 10) || 300;
        setIsOverflowing(contentRef.current.scrollHeight > maxHeightPx);
      }
    };
    checkOverflow();
    window.addEventListener("resize", checkOverflow);
    return () => window.removeEventListener("resize", checkOverflow);
  }, [maxHeight, children]);
  return <div className={className} style={{
    position: "relative",
    ...style
  }} {...rest}>
      <div ref={contentRef} role="region" tabIndex={0} aria-label={ariaLabel} style={{
    maxHeight: typeof maxHeight === "number" ? `${maxHeight}px` : maxHeight,
    overflowY: "auto",
    paddingRight: 4
  }} onScroll={e => {
    const el = e.target;
    const atBottom = el.scrollHeight - el.scrollTop <= el.clientHeight + 10;
    const hint = el.parentNode.querySelector("[data-scroll-hint]");
    if (hint) hint.style.opacity = atBottom ? "0" : "1";
  }}>
        {children}
      </div>
      {showHint && isOverflowing && <div data-scroll-hint style={{
    fontSize: 11,
    color: "var(--lp-color-text-muted)",
    textAlign: "center",
    marginTop: 8,
    transition: "opacity 0.2s"
  }}>
          Scroll for more ↓
        </div>}
    </div>;
};

export const CustomDivider = ({color = "var(--lp-color-border-default)", middleText = "", spacing = "default", style = {}, className = "", ...rest}) => {
  const spacingPresets = {
    default: {
      margin: "24px 0"
    },
    overlap: {
      margin: "-1rem 0 -1rem 0"
    },
    tight: {
      margin: "0 0 -1rem 0"
    },
    section: {
      margin: "0 0 -2rem 0"
    },
    sectionOverlap: {
      margin: "-1rem 0 -2rem 0"
    },
    deepOverlap: {
      margin: "-1rem 0 -1.5rem 0"
    }
  };
  const spacingStyle = spacingPresets[spacing] || spacingPresets.default;
  return <div role="separator" aria-orientation="horizontal" className={className} style={{
    display: "flex",
    alignItems: "center",
    ...spacingStyle,
    fontSize: style?.fontSize || "16px",
    height: "fit-content",
    ...style
  }} {...rest}>
      <span style={{
    marginRight: "var(--lp-spacing-px-8)",
    opacity: 0.2
  }}>
        <Icon icon="/snippets/assets/logos/Livepeer-Logo-Symbol-Theme.svg" />
      </span>
      <div style={{
    flex: 1,
    height: "1px",
    background: "var(--lp-color-border-default)",
    opacity: 0.4
  }}></div>
      {middleText && <>
          <Icon icon="circle" size={2} />
          <span style={{
    margin: "0 8px",
    fontWeight: "bold",
    color: color,
    opacity: 0.7
  }}>
            {middleText}
          </span>
          <Icon icon="circle" size={2} />
        </>}
      <div style={{
    flex: 1,
    height: "1px",
    background: "var(--lp-color-border-default)",
    opacity: 0.4
  }}></div>
      <span style={{
    marginLeft: "var(--lp-spacing-px-8)",
    opacity: 0.2
  }}>
        <span style={{
    display: "inline-block",
    transform: "scaleX(-1)"
  }}>
          <Icon icon="/snippets/assets/logos/Livepeer-Logo-Symbol-Theme.svg" />
        </span>
      </span>
    </div>;
};

export const MarkdownEmbed = ({url, className = '', style = {}, ...rest}) => {
  const [html, setHtml] = useState('');
  useEffect(() => {
    fetch(url).then(res => res.text()).then(md => {
      const converted = md.replace(/```(\w*)\n([\s\S]*?)```/g, '<pre><code>$2</code></pre>').replace(/`([^`]+)`/g, '<code>$1</code>').replace(/!\[([^\]]*)\]\(([^)]+)\)/g, '<img alt="$1" src="$2" style="max-width:100%" />').replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>').replace(/^######\s+(.+?)(?:\s+#+)?$/gm, '<h6>$1</h6>').replace(/^#####\s+(.+?)(?:\s+#+)?$/gm, '<h5>$1</h5>').replace(/^####\s+(.+?)(?:\s+#+)?$/gm, '<h4>$1</h4>').replace(/^###\s+(.+?)(?:\s+#+)?$/gm, '<h3>$1</h3>').replace(/^##\s+(.+?)(?:\s+#+)?$/gm, '<h2>$1</h2>').replace(/^#\s+(.+?)(?:\s+#+)?$/gm, '<h1>$1</h1>').replace(/\*\*\*(.+?)\*\*\*/g, '<strong><em>$1</em></strong>').replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>').replace(/\*(.+?)\*/g, '<em>$1</em>').replace(/^---$/gm, '<hr />').replace(/^[-*]\s+(.+)$/gm, '<li>$1</li>').replace(/\n\n/g, '</p><p>').replace(/\n/g, '<br />');
      setHtml('<p>' + converted + '</p>');
    });
  }, [url]);
  if (!html) return <div className={className} style={style} {...rest}>
        <p style={{
    color: 'var(--text-secondary)'
  }}>Loading...</p>
      </div>;
  return <div className={className} {...rest} style={{
    maxWidth: '100%',
    overflowWrap: 'anywhere',
    wordBreak: 'break-word',
    ...style
  }} dangerouslySetInnerHTML={{
    __html: html
  }} />;
};

export const DiscordAnnouncements = ({serverName = 'Livepeer', items = [], limit, ScrollBox, scrollMaxHeight = 300, className = '', style = {}, ...rest}) => {
  const sanitiseHTML = html => {
    if (!html || typeof html !== 'string') return '';
    return html.replace(/<script[\s\S]*?<\/script>/gi, '').replace(/<iframe[\s\S]*?<\/iframe>/gi, '').replace(/<object[\s\S]*?<\/object>/gi, '').replace(/<embed[\s\S]*?>/gi, '').replace(/<form[\s\S]*?<\/form>/gi, '').replace(/<style[\s\S]*?<\/style>/gi, '').replace(/<link[\s\S]*?>/gi, '').replace(/\bon\w+\s*=\s*(['"])[^'"]*\1/gi, '').replace(/\bon\w+\s*=\s*[^\s>]*/gi, '').replace(/javascript\s*:/gi, '');
  };
  const displayItems = limit ? items.slice(0, limit) : items;
  if (!displayItems || displayItems.length === 0) {
    return <Note>
        <p style={{
      color: 'var(--text-secondary)',
      textAlign: 'center'
    }}>
          No announcements at this time.
        </p>
      </Note>;
  }
  const parseContent = content => {
    const withLinks = content.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank" rel="noopener noreferrer">$1 ↗</a>');
    return withLinks;
  };
  return <div className={className} style={{
    display: 'flex',
    flexDirection: 'column',
    gap: "var(--lp-spacing-4)",
    border: '1px solid var(--lp-color-accent)',
    borderRadius: "var(--lp-spacing-2)",
    padding: "var(--lp-spacing-4)",
    ...style
  }} {...rest}>
      {displayItems.map((announcement, index) => <div key={announcement.id} href={announcement.url} target="_blank" rel="noopener noreferrer">
          <div style={{
    display: 'flex',
    alignItems: 'center',
    gap: "var(--lp-spacing-2)",
    fontSize: '0.875rem',
    marginBottom: "var(--lp-spacing-3)",
    width: '100%'
  }}>
            <Icon icon="discord" color="var(--lp-color-brand-discord)" size={16} />
            <span style={{
    fontWeight: 600,
    color: 'var(--lp-color-accent)',
    fontSize: 'medium'
  }}>
              {serverName}
              {}
            </span>
            <span style={{
    color: 'var(--lp-color-text-secondary)'
  }}>•</span>
            <time dateTime={announcement.timestamp} style={{
    color: 'var(--lp-color-text-secondary)'
  }}>
              {new Date(announcement.timestamp).toLocaleDateString('en-US', {
    month: 'short',
    day: 'numeric',
    year: 'numeric'
  })}
            </time>
            <span style={{
    fontSize: '0.875rem',
    color: 'var(--lp-color-text-secondary)',
    marginLeft: 'auto'
  }}>
              View in Discord{' '}
              <Icon icon="arrow-up-right" size={12} color="var(--lp-color-accent)" />
            </span>
          </div>
          <ScrollBox maxHeight={scrollMaxHeight} ariaLabel={`Announcement from ${serverName}`}>
            <div style={{
    color: 'var(--lp-color-text-secondary)',
    fontSize: 'small'
  }} dangerouslySetInnerHTML={{
    __html: sanitiseHTML(parseContent(announcement.content))
  }} />
          </ScrollBox>
          {index < displayItems.length - 1 && <div style={{
    marginTop: "var(--lp-spacing-3)"
  }}>
              <hr style={{
    border: 'none',
    borderBottom: '1px solid var(--lp-color-border-default)',
    margin: '0'
  }} />
            </div>}
        </div>)}
    </div>;
};

export const RssBlogCardLayout = ({items = [], cols = 2, limit, className = '', style = {}, ...rest}) => {
  const displayItems = limit ? items.slice(0, limit) : items;
  if (!displayItems || displayItems.length === 0) {
    return <Note>
        <p style={{
      color: 'var(--text-secondary)',
      textAlign: 'center'
    }}>
          No blog posts at this time.
        </p>
      </Note>;
  }
  return <Columns cols={cols} className={className} style={style} {...rest}>
      {displayItems.map((props, idx) => <RssBlogCard key={props.href || idx} {...props} />)}
    </Columns>;
};

export const RssBlogCard = ({title, content, href, author = '', excerpt = '', datePosted = null, readingTime = null, img = null, icon = 'book-open', cta = 'Read More', className = '', style = {}, ...rest}) => {
  const sanitiseHTML = html => {
    if (!html || typeof html !== 'string') return '';
    return html.replace(/<script[\s\S]*?<\/script>/gi, '').replace(/<iframe[\s\S]*?<\/iframe>/gi, '').replace(/<object[\s\S]*?<\/object>/gi, '').replace(/<embed[\s\S]*?>/gi, '').replace(/<form[\s\S]*?<\/form>/gi, '').replace(/<style[\s\S]*?<\/style>/gi, '').replace(/<link[\s\S]*?>/gi, '').replace(/\bon\w+\s*=\s*(['"])[^'"]*\1/gi, '').replace(/\bon\w+\s*=\s*[^\s>]*/gi, '').replace(/javascript\s*:/gi, '');
  };
  const displayContent = content || excerpt;
  const showScrollHint = displayContent && displayContent.length > 500;
  return <Card className={className} style={style} title={<span style={{
    alignItems: 'center',
    color: 'var(--lp-color-accent)',
    fontSize: '1.25rem',
    marginLeft: '-2px',
    marginBottom: "var(--lp-spacing-2)",
    display: '-webkit-box',
    WebkitLineClamp: 2,
    WebkitBoxOrient: 'vertical',
    overflow: 'hidden',
    textOverflow: 'ellipsis'
  }}>
          <span style={{
    alignSelf: 'top'
  }}>
            <Icon icon={icon} size={20} color="var(--lp-color-accent)" />
          </span>
          <span style={{
    marginLeft: "var(--lp-spacing-2)"
  }}>{title}</span>
        </span>} href={href} cta={cta} img={img || undefined} arrow {...rest}>
      <div style={{
    flex: 1
  }}>
        {datePosted && <div style={{
    display: 'flex',
    alignItems: 'center',
    fontSize: 12,
    color: 'var(--lp-color-text-primary)',
    gap: 6
  }}>
            <span><Icon icon="calendar" size={14} /></span>
            <span>{datePosted}</span>
          </div>}
        {readingTime && <div style={{
    display: 'flex',
    marginTop: 0,
    alignItems: 'center',
    fontSize: 12,
    color: 'var(--lp-color-text-primary)',
    gap: 6
  }}>
            <span><Icon icon="clock" size={14} /></span>
            <span>Read Time: {readingTime} minutes</span>
          </div>}
      </div>
      <div style={{
    height: 1,
    backgroundColor: 'var(--lp-color-border-default)',
    margin: '12px 0'
  }} />
      <div style={{
    maxHeight: 200,
    overflowY: 'auto',
    fontSize: '0.875rem',
    color: 'var(--text-secondary)',
    lineHeight: '1.5'
  }} role="region" tabIndex={0} aria-label={title ? `Scrollable content for ${title}` : 'Scrollable content'} onScroll={e => {
    const el = e.target;
    const atBottom = el.scrollHeight - el.scrollTop <= el.clientHeight + 10;
    const hint = el.nextSibling;
    if (hint) hint.style.display = atBottom ? 'none' : 'block';
  }} dangerouslySetInnerHTML={{
    __html: sanitiseHTML(displayContent)
  }} />
      {showScrollHint && <div style={{
    fontSize: 11,
    color: 'var(--lp-color-text-muted)',
    textAlign: 'center',
    marginTop: 10,
    marginBottom: 0
  }}>
          Scroll for more ↓
        </div>}
    </Card>;
};

export const YouTubeVideoData = ({items = [], limit, cols = 2, className = "", style = {}, ...rest}) => {
  const displayItems = limit ? items.slice(0, limit) : items;
  if (!displayItems || displayItems.length === 0) {
    return <Note>
        <p style={{
      color: "var(--text-secondary)",
      textAlign: "center"
    }}>
          No videos at this time.
        </p>
      </Note>;
  }
  const getEmbedUrl = href => {
    if (!href) return "";
    const videoId = href.split("v=")[1]?.split("&")[0];
    return videoId ? `https://www.youtube.com/embed/${videoId}` : href;
  };
  return <Columns cols={cols} className={className} style={style} {...rest}>
      {displayItems.map((item, idx) => {
    if (!item || !item.href) return null;
    const needsSpacer = idx > 0 && idx % cols === 0;
    return <>
            {needsSpacer && <div key={`spacer-${idx}`} style={{
      height: "var(--lp-spacing-6)",
      width: "100%"
    }} />}
            {needsSpacer && <div key={`spacer2-${idx}`} style={{
      height: "var(--lp-spacing-6)",
      width: "100%"
    }} />}
            <YouTubeVideo key={item.href || idx} embedUrl={getEmbedUrl(item.href)} title={item.title || ""} caption={`${item.author || ""} • ${item.publishedDate || ""}`} />
          </>;
  })}
    </Columns>;
};

export const YouTubeVideo = ({embedUrl, url, title = "", author = "", hint = "", caption, className = "", style = {}, ...rest}) => {
  const toEmbedUrl = value => {
    if (!value || typeof value !== "string") return "";
    const source = value.trim();
    if (!source) return "";
    try {
      const parsed = new URL(source);
      const host = parsed.hostname.replace(/^www\./, "");
      if (host === "youtube.com" || host === "youtube-nocookie.com") {
        if (parsed.pathname.startsWith("/embed/")) return source;
        const videoId = parsed.pathname.startsWith("/shorts/") ? parsed.pathname.split("/").filter(Boolean)[1] : parsed.searchParams.get("v");
        if (!videoId) return "";
        const params = new URLSearchParams(parsed.search);
        params.delete("v");
        const query = params.toString();
        return `https://www.youtube.com/embed/${videoId}${query ? `?${query}` : ""}`;
      }
      if (host === "youtu.be") {
        const videoId = parsed.pathname.split("/").filter(Boolean)[0];
        if (!videoId) return "";
        const query = parsed.searchParams.toString();
        return `https://www.youtube.com/embed/${videoId}${query ? `?${query}` : ""}`;
      }
    } catch (_err) {
      return "";
    }
    return "";
  };
  const resolvedEmbedUrl = toEmbedUrl(embedUrl || url);
  if (!resolvedEmbedUrl) {
    return null;
  }
  const isValidYouTubeUrl = resolvedEmbedUrl.includes("youtube.com/embed/");
  if (!isValidYouTubeUrl) {
    console.warn("Invalid YouTube embed URL:", embedUrl || url);
    return null;
  }
  const buildCaption = () => {
    if (caption) return caption;
    if (!author && !title) return null;
    return <span style={{
      display: "flex",
      flexDirection: "column",
      alignItems: "center",
      textAlign: "center",
      lineHeight: 1.2
    }}>
        <span>
          {author && <>
              <Icon icon="microphone" size={16} /> <strong>{author}</strong>
            </>}
          {author && title ? `${" "} • ${title}` : title}
        </span>
      </span>;
  };
  const captionContent = buildCaption();
  return <Frame className={className} style={style} {...hint ? {
    hint
  } : {}} {...captionContent ? {
    caption: captionContent
  } : {}} {...rest}>
      <iframe className="w-full aspect-video rounded-xl" src={resolvedEmbedUrl} title={title || author || "YouTube Video"} allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowFullScreen />
    </Frame>;
};

export const LinkArrow = ({href, label, description, newline = true, borderColor, className = '', style = {}, ...rest}) => {
  const linkArrowStyle = {
    display: 'inline-flex',
    alignItems: 'center',
    justifyContent: 'center',
    gap: "var(--lp-spacing-1)",
    width: 'fit-content',
    ...borderColor && ({
      borderColor
    })
  };
  return <span className={className} style={style} {...rest}>
      {newline && <br />}
      <span style={linkArrowStyle}>
        <a href={href} target="_blank" rel="noopener noreferrer">
          {label}
        </a>
        <Icon icon="arrow-up-right" size={14} color="var(--lp-color-accent)" />
      </span>
      {description && description}
      {description && <div style={{
    height: "var(--lp-spacing-3)"
  }} />}
    </span>;
};

export const SocialLinks = ({links, size = 20, gap = "var(--lp-spacing-3)", justify = "center", iconColor, color, className = "", style = {}, ...rest}) => {
  const resolvedIconColor = iconColor || color;
  const linkStyle = {
    border: "none",
    borderBottom: "none",
    textDecoration: "none",
    display: "inline-flex"
  };
  const colors = {
    discord: resolvedIconColor || "var(--lp-color-brand-discord)",
    twitter: resolvedIconColor || "var(--lp-color-text-primary)",
    github: resolvedIconColor || "var(--lp-color-brand-github)",
    forum: resolvedIconColor || "var(--lp-color-brand-forum)",
    website: resolvedIconColor || "var(--lp-color-accent)",
    blog: resolvedIconColor || "var(--lp-color-accent)",
    globe: resolvedIconColor || "var(--lp-color-brand-globe)",
    twitch: resolvedIconColor || "var(--lp-color-brand-twitch)",
    youtube: resolvedIconColor || "var(--lp-color-brand-youtube)",
    instagram: resolvedIconColor || "var(--lp-color-brand-instagram)",
    linkedin: resolvedIconColor || "var(--lp-color-brand-linkedin)"
  };
  const iconColorMap = {
    discord: "discord",
    "x-twitter": "twitter",
    github: "github",
    "comment-pen": "forum",
    "pen-line": "blog",
    "pencil-line": "blog",
    globe: "globe",
    "book-open": "website",
    twitch: "twitch",
    youtube: "youtube",
    instagram: "instagram",
    linkedin: "linkedin"
  };
  const defaultLinks = [{
    icon: "discord",
    href: "https://discord.com/invite/livepeer",
    label: "Livepeer Discord"
  }, {
    icon: "globe",
    href: "https://livepeer.org",
    label: "Livepeer Website"
  }, {
    icon: "github",
    href: "https://github.com/livepeer",
    label: "Livepeer GitHub"
  }, {
    icon: "comment-pen",
    href: "https://forum.livepeer.org",
    label: "Livepeer Forum"
  }, {
    icon: "pen-line",
    href: "https://livepeer.org/blog",
    label: "Livepeer Blog"
  }, {
    icon: "x-twitter",
    href: "https://x.com/livepeer",
    label: "Livepeer X"
  }];
  const items = links || defaultLinks;
  return <div className={className} style={style} {...rest}>
      <style>{`
        .social-links a {
          border: none;
          border-bottom: none;
        }
      `}</style>
      <span className="social-links" style={{
    display: "flex",
    justifyContent: justify,
    gap: gap,
    marginTop: "var(--lp-spacing-2)"
  }}>
        {items.map((item, i) => <a key={i} href={item.href} target="_blank" rel="noopener noreferrer" aria-label={item.label} style={linkStyle}>
            <Tooltip headline={item.label}>
              <Icon icon={item.icon} size={size} color={colors[iconColorMap[item.icon] || "website"] || "var(--lp-color-accent)"} aria-hidden="true" />
            </Tooltip>
          </a>)}
      </span>
    </div>;
};

{/* DATA */}

<CenteredContainer maxWidth="fit-content">
  <BorderedBox variant="muted" padding="0.5rem 1rem 1rem 1rem">
    <SocialLinks iconColor="var(--hero-text)" links={studioSocials} />
  </BorderedBox>
</CenteredContainer>

<br />

<CenteredContainer width="80%" minWidth="fit-content">
  <Tip>
    This page is an automated workflow.
  </Tip>
</CenteredContainer>

## <Icon icon="camera-movie" size={24} /> Videos

Watch the latest on the <LinkArrow label="Livepeer YouTube Channel" href="https://www.youtube.com/@livepeer" newline={false} />

<LazyLoad height="400px">
  <YouTubeVideoData items={youtubeDataStatic} limit={4} />
</LazyLoad>

<CustomDivider style={{margin: "0.5rem 0 -2.5rem 0"}} />

## <Icon icon="discord" size={24} /> Discord Announcements

Latest from the <LinkArrow label="Livepeer Discord" href="https://discord.gg/livepeer" newline={false} />

<LazyLoad height="300px">
  <DiscordAnnouncements serverName="Livepeer" items={discordAnnouncementsData} limit={4} ScrollBox={ScrollBox} scrollMaxHeight={200} />
</LazyLoad>

<CustomDivider style={{margin: "0 0 -2.5rem 0"}} />

## Featured X Post <Icon icon="x-twitter" size={24} />

<br />

<LazyLoad height="650px">
  <iframe src="https://platform.twitter.com/embed/Tweet.html?id=1977819660897640875&theme=dark" className="lp-tweet-frame-large" title="Studio on X" />
</LazyLoad>

<CustomDivider style={{margin: "0 0 -2.5rem 0"}} />

## <Icon icon="github" size={24} /> GitHub

<LazyLoad height="600px">
  <BorderedBox>
    <ScrollBox maxHeight={600}>
      <BorderedBox variant="accent">
        Livepeer Studio Github

        <LinkArrow label="View livepeer/studio on GitHub" href="https://github.com/livepeer/studio" newline={true} />
      </BorderedBox>

      <MarkdownEmbed url="https://raw.githubusercontent.com/livepeer/studio/master/README.md" />
    </ScrollBox>
  </BorderedBox>
</LazyLoad>

<CustomDivider />

## Related Pages

<CardGroup cols={2}>
  <Card title="Livepeer Studio Overview" icon="book-open" href="/solutions/livepeer-studio/overview" />

  <Card title="Livepeer Studio Changelog" icon="clock" href="/solutions/livepeer-studio/changelog" />
</CardGroup>
