> ## 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.

# Easy Install [DevOps & Community Projects]

> Community CICD Pipelines to make installation accessible & easy

export const GotoLink = ({label, relativePath, text = '', icon = 'arrow-turn-down-right', className = '', style = {}, ...rest}) => {
  return <span className={className} style={{
    display: 'inline-flex',
    alignItems: 'center',
    ...style
  }} {...rest}>
      <span style={{
    marginRight: 8
  }}>{text}</span>
      <Icon icon={icon} aria-hidden="true" />
      <a href={relativePath} style={{
    marginLeft: 6
  }}>
        {label}
      </a>
    </span>;
};

export const GotoCard = ({label, relativePath, icon, text, cta = '', className = '', style = {}, ...props}) => {
  icon = icon ? icon : 'arrow-turn-down-right';
  return <Card title={label} icon={icon} href={relativePath} cta={cta} className={className} style={style} {...props}>
      {text}
    </Card>;
};

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>;
};

<Danger>
  Page Not Finalised

  **Notes:**

  * Gateway hub will be an automated addition pipeline with human in the loop. <br />

  **TODO:**

  * Verify all content
  * Add a verified link for community submissions
  * Not happy with contribution layout
</Danger>

# Gateway HUB

A collection of community projects that make running a Livepeer Gateway easy.

**Quick Links**

<Columns cols={2}>
  <Card title="GWID (Gateway Wizard)" icon="hat-wizard" href="#gwid-gateway-wizard">
    Fully Managed DevOps Platform for Livepeer
  </Card>

  <Card title="Coming Soon" icon="bridge" href="#coming-soon">
    Coming Soon
  </Card>
</Columns>

Have a Guide or Project to Contribute?

<Card title="Contribute to the Gateway Hub" href="https://github.com/livepeer/docs/issues/new?assignees=&labels=type%3A+documentation&template=documentation.yml&title=" arrow horizontal icon="arrow-right-from-bracket" />

## GWID (Gateway Wizard)

<Warning>
  {' '}

  This is a community contributed project. Please contact the team for help & support.{' '}
</Warning>

GWID is a fully managed DevOps platform for Livepeer. It provides a simple and easy way to deploy and manage Livepeer Gateways. It also provides easy integration with other services to test the Gateway.

<YouTubeVideo embedUrl="https://www.youtube.com/embed/csJjzoIw_pM" caption="GWID Demo of Livepeer Gateway Single Click Deployment with Playback Stream Test" />

<br />

<Card href="https://github.com/videoDAC/livepeer-gateway/blob/master/README.md" title="GWID Github (VideoDAC)" icon="github" arrow horizontal>
  View the GWID repository on GitHub
</Card>

### GWID RFP & Updates

* [GWID SPE Proposal: Gateway Wizard Phase 1](https://forum.livepeer.org/t/gwid-spe-pre-proposal-gateway-wizard-phase-1/2868)
* [Get to know GWID - A Fully Managed DevOp Platform for Livepeer](https://forum.livepeer.org/t/get-to-know-gwid-and-the-team-a-fully-managed-devop-platform-for-livepeer/2851)

### GWID Documentation

Below is the current README from the GWID repository.

<Note>
  The embedded GWID README is unavailable in this docs branch.
  Use the GitHub repository link above to review the current installation and deployment instructions.
</Note>
