> ## Documentation Index
> Fetch the complete documentation index at: https://na-36-changelog-go-livepeer-2026-05-18.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Setup paths

> Four quickstart tracks for building on Livepeer: AI inference, real-time AI video, video transcoding, and OSS contribution.

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 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 TableCell = ({children, align = "left", header = false, style = {}, className = "", ...rest}) => {
  const Component = header ? "th" : "td";
  return <Component className={className} style={{
    padding: "0.75rem 1rem",
    textAlign: align,
    border: header ? "none" : "1px solid var(--lp-color-border-default)",
    ...style
  }} {...rest}>
      {children}
    </Component>;
};

export const TableRow = ({children, header = false, hover = false, style = {}, className = "", ...rest}) => {
  const rowId = `table-row-${Math.random().toString(36).substr(2, 9)}`;
  return <>
      {hover && <style>{`
          #${rowId}:hover {
            background-color: var(--lp-color-bg-card);
          }
        `}</style>}
      <tr id={rowId} className={className} style={{
    ...header && ({
      backgroundColor: "var(--lp-color-accent-strong)",
      color: "var(--lp-color-on-accent)",
      fontWeight: "bold"
    }),
    ...style
  }} {...rest}>
        {children}
      </tr>
    </>;
};

export const StyledTable = ({children, variant = "default", style = {}, className = "", ...rest}) => {
  const wrapperVariants = {
    default: {
      border: "1px solid var(--lp-color-border-default)",
      backgroundColor: "var(--lp-color-bg-card)",
      overflow: "hidden"
    },
    bordered: {
      border: "2px solid var(--lp-color-accent)",
      backgroundColor: "var(--lp-color-bg-page)",
      overflow: "hidden"
    },
    minimal: {
      border: "none",
      backgroundColor: "transparent",
      overflow: "visible"
    }
  };
  return <div data-docs-styled-table-shell className={className} style={{
    width: "100%",
    padding: 0,
    margin: 0,
    ...wrapperVariants[variant],
    ...style
  }} {...rest}>
      <table data-docs-styled-table style={{
    width: "100%",
    borderCollapse: "collapse",
    borderSpacing: 0,
    margin: 0,
    backgroundColor: "transparent"
  }}>
        {children}
      </table>
    </div>;
};

<CenteredContainer preset="readable90">
  <Tip>Each quickstart reaches a working first result. Pick the track that matches your goal -- they use different tools and do not overlap.</Tip>
</CenteredContainer>

***

Choose the quickstart for your build goal. If you are unsure which applies, use the <a href="/v2/developers/navigator">navigator</a> to compare paths first.

<CustomDivider middleText="Quickstart Tracks" />

## AI inference

**Goal:** Make a working API call to a Livepeer AI pipeline.

**Time:** 10 minutes.

**Prerequisites:** API key from [Livepeer Studio](https://livepeer.studio). No GPU. No local node.

**What you build:** A `POST /text-to-image` call that returns a generated image, using curl or an SDK of your choice.

**SDK options:** `livepeer` (npm v3.5.0 / PyPI), `@livepeer/ai` (alpha, AI-only).

<CardGroup cols={1}>
  <Card title="AI Quickstart" icon="bolt" href="/v2/developers/get-started/ai-quickstart" arrow>
    First API call, error handling, and next steps in under 10 minutes.
  </Card>
</CardGroup>

<CustomDivider middleText="Real-Time AI Video" />

## Real-time AI video

**Goal:** Apply a ComfyUI workflow to a live webcam or video stream.

**Time:** 30-60 minutes (includes environment setup).

**Prerequisites:**

* NVIDIA GPU (RTX 3090 or better recommended)
* ComfyUI installed and working
* Python 3.12, CUDA 12.5+, Miniconda

**What you build:** A ComfyStream server connected to the Livepeer network, with a live webcam feed processed through an SD1.5 workflow at real-time frame rates.

<CardGroup cols={1}>
  <Card title="ComfyStream Quickstart" icon="video" href="/v2/developers/get-started/comfystream-quickstart" arrow>
    ComfyStream install, SD1.5 workflow, and webcam-to-processed-stream in 30 minutes.
  </Card>
</CardGroup>

<CustomDivider middleText="Video Streaming" />

## Video transcoding and streaming

**Goal:** Create a livestream or transcode a video asset using the Studio API.

**Time:** 15 minutes.

**Prerequisites:** API key from [Livepeer Studio](https://livepeer.studio). SDK installed.

**What you build:** A stream with an RTMP ingest URL and an HLS playback URL, tested end-to-end.

**SDK install:**

```bash theme={null}
# TypeScript / JavaScript
npm install livepeer

# Python
pip install livepeer

# Go
go get github.com/livepeer/livepeer-go
```

<CardGroup cols={1}>
  <Card title="Transcoding Quickstart" icon="film" href="/v2/developers/get-started/transcoding-quickstart" arrow>
    Create a stream, get the ingest URL, test with OBS or ffmpeg.
  </Card>
</CardGroup>

<CustomDivider middleText="OSS Contribution" />

## OSS contribution

**Goal:** Get the Livepeer codebase running locally and make your first contribution.

**Time:** 1-2 hours (includes testnet setup).

**Prerequisites:** Go 1.21+ for go-livepeer; Python 3.12 for ai-runner or ComfyStream; Docker.

**What you build:** A local testnet with one orchestrator and one gateway running, capable of processing test jobs.

<CardGroup cols={1}>
  <Card title="Contributor Quickstart" icon="code" href="/v2/developers/get-started/contributor-quickstart" arrow>
    Clone go-livepeer, start a local testnet, and submit your first test job.
  </Card>
</CardGroup>

<CustomDivider middleText="Not Sure?" />

## Not sure which path fits?

<StyledTable variant="bordered">
  <thead>
    <TableRow header>
      <TableCell header>If you want to...</TableCell>
      <TableCell header>Use this track</TableCell>
    </TableRow>
  </thead>

  <tbody>
    <TableRow>
      <TableCell>Call AI inference from an app without a GPU</TableCell>
      <TableCell>AI inference</TableCell>
    </TableRow>

    <TableRow>
      <TableCell>Apply AI effects to a live camera feed in real time</TableCell>
      <TableCell>Real-time AI video (ComfyStream)</TableCell>
    </TableRow>

    <TableRow>
      <TableCell>Run your own custom model on the network</TableCell>
      <TableCell>BYOC -- see <a href="/v2/developers/build/byoc">BYOC Guide</a></TableCell>
    </TableRow>

    <TableRow>
      <TableCell>Transcode video or run a livestream</TableCell>
      <TableCell>Video transcoding</TableCell>
    </TableRow>

    <TableRow>
      <TableCell>Contribute to go-livepeer or ai-runner</TableCell>
      <TableCell>OSS contribution</TableCell>
    </TableRow>

    <TableRow>
      <TableCell>Run your own gateway node</TableCell>
      <TableCell>Gateways tab -- different from developer paths</TableCell>
    </TableRow>
  </tbody>
</StyledTable>

<CustomDivider />

## Related pages

<CardGroup cols={2}>
  <Card title="Navigator" icon="map" href="/v2/developers/navigator">
    Full path comparison with decision framework and per-path descriptions.
  </Card>

  <Card title="Workload Fit" icon="scale-balanced" href="/v2/developers/build/workload-fit">
    Studio API vs self-hosted gateway vs BYOC vs ComfyStream -- when to use each.
  </Card>
</CardGroup>
