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

# Gateway Configuration Flags

> Reference: full list of configuration flags for Livepeer Gateways

export const gatewayConfigurationFlagSections = [{
  title: "Network & Addresses",
  rows: [{
    flag: "-network",
    type: "Both",
    tone: "both",
    description: "Network to connect to (offchain, arbitrum-one-mainnet, etc.)"
  }, {
    flag: "-rtmpAddr",
    type: "Video",
    tone: "video",
    description: "Address to bind for RTMP commands (video ingest)"
  }, {
    flag: "-cliAddr",
    type: "Both",
    tone: "both",
    description: "Address to bind for CLI commands"
  }, {
    flag: "-httpAddr",
    type: "Both",
    tone: "both",
    description: "Address to bind for HTTP commands"
  }, {
    flag: "-serviceAddr",
    type: "Both",
    tone: "both",
    description: "Orchestrator service URI for broadcasters to contact"
  }, {
    flag: "-gatewayHost",
    type: "Both",
    tone: "both",
    description: "External hostname where Gateway node is running"
  }]
}, {
  title: "Node Type",
  rows: [{
    flag: "-gateway",
    type: "Both",
    tone: "both",
    description: "Set to true to be a gateway (handles both video and AI)"
  }, {
    flag: "-orchestrator",
    type: "Both",
    tone: "both",
    description: "Set to true to be an orchestrator"
  }, {
    flag: "-transcoder",
    type: "Video",
    tone: "video",
    description: "Set to true to be a transcoder"
  }, {
    flag: "-aiWorker",
    type: "AI",
    tone: "ai",
    description: "Set to true to run an AI worker"
  }, {
    flag: "-broadcaster",
    type: "Video",
    tone: "video",
    description: "Set to true to be a broadcaster (deprecated, use -gateway)"
  }]
}, {
  title: "Video Transcoding",
  rows: [{
    flag: "-transcodingOptions",
    type: "Video",
    tone: "video",
    description: "Transcoding profiles for broadcast job"
  }, {
    flag: "-maxAttempts",
    type: "Video",
    tone: "video",
    description: "Maximum transcode attempts"
  }, {
    flag: "-maxSessions",
    type: "Both",
    tone: "both",
    description: "Max concurrent sessions (transcoding for orchestrator, RTMP streams for gateway)"
  }, {
    flag: "-nvidia",
    type: "Video",
    tone: "video",
    description: "Comma-separated list of Nvidia GPU device IDs"
  }, {
    flag: "-netint",
    type: "Video",
    tone: "video",
    description: "Comma-separated list of NetInt device GUIDs"
  }, {
    flag: "-hevcDecoding",
    type: "Video",
    tone: "video",
    description: "Enable or disable HEVC decoding"
  }, {
    flag: "-testTranscoder",
    type: "Video",
    tone: "video",
    description: "Test Nvidia GPU transcoding at startup"
  }, {
    flag: "-currentManifest",
    type: "Video",
    tone: "video",
    description: "Expose active ManifestID as \"/stream/current.m3u8\""
  }]
}, {
  title: "AI Processing",
  rows: [{
    flag: "-aiServiceRegistry",
    type: "AI",
    tone: "ai",
    description: "Use an AI ServiceRegistry contract address"
  }, {
    flag: "-aiModels",
    type: "AI",
    tone: "ai",
    description: "Models (pipeline:model_id) for AI worker to load"
  }, {
    flag: "-aiModelsDir",
    type: "AI",
    tone: "ai",
    description: "Directory where AI model weights are stored"
  }, {
    flag: "-aiRunnerImage",
    type: "AI",
    tone: "ai",
    description: "Docker image for the AI runner (deprecated use -aiRunnerImageOverrides)"
  }, {
    flag: "-aiRunnerImageOverrides",
    type: "AI",
    tone: "ai",
    description: "Docker image overrides for different pipelines"
  }, {
    flag: "-aiVerboseLogs",
    type: "AI",
    tone: "ai",
    description: "Enable verbose logs for AI runner containers"
  }, {
    flag: "-aiProcessingRetryTimeout",
    type: "AI",
    tone: "ai",
    description: "Timeout for retrying AI processing requests"
  }, {
    flag: "-aiRunnerContainersPerGPU",
    type: "AI",
    tone: "ai",
    description: "Number of AI runner containers per GPU"
  }]
}, {
  title: "Live AI Video",
  rows: [{
    flag: "-mediaMTXApiPassword",
    type: "AI",
    tone: "ai",
    description: "HTTP basic auth password for MediaMTX API"
  }, {
    flag: "-liveAITrickleHostForRunner",
    type: "AI",
    tone: "ai",
    description: "Trickle Host used by AI Runner"
  }, {
    flag: "-liveAIAuthApiKey",
    type: "AI",
    tone: "ai",
    description: "API key for Live AI authentication requests"
  }, {
    flag: "-liveAIAuthWebhookUrl",
    type: "AI",
    tone: "ai",
    description: "Live AI RTMP authentication webhook URL"
  }, {
    flag: "-livePaymentInterval",
    type: "AI",
    tone: "ai",
    description: "Interval for Gateway ↔ Orchestrator payments for Live AI"
  }]
}, {
  title: "Orchestrator Selection",
  rows: [{
    flag: "-orchAddr",
    type: "Video",
    tone: "video",
    description: "Comma-separated list of orchestrators to connect to"
  }, {
    flag: "-orchWebhookUrl",
    type: "Video",
    tone: "video",
    description: "Orchestrator discovery callback URL"
  }, {
    flag: "-orchBlocklist",
    type: "Video",
    tone: "video",
    description: "Comma-separated list of blocklisted orchestrators"
  }, {
    flag: "-orchMinLivepeerVersion",
    type: "Video",
    tone: "video",
    description: "Minimal go-livepeer version for orchestrators"
  }, {
    flag: "-selectRandFreq",
    type: "Video",
    tone: "video",
    description: "Weight of random factor in orchestrator selection"
  }, {
    flag: "-selectStakeWeight",
    type: "Video",
    tone: "video",
    description: "Weight of stake factor in orchestrator selection"
  }, {
    flag: "-selectPriceWeight",
    type: "Video",
    tone: "video",
    description: "Weight of price factor in orchestrator selection"
  }, {
    flag: "-selectPriceExpFactor",
    type: "Video",
    tone: "video",
    description: "Significance of small price changes in selection"
  }, {
    flag: "-orchPerfStatsUrl",
    type: "Video",
    tone: "video",
    description: "URL of Orchestrator Performance Stream Tester"
  }, {
    flag: "-region",
    type: "Video",
    tone: "video",
    description: "Region where broadcaster is deployed"
  }, {
    flag: "-minPerfScore",
    type: "Video",
    tone: "video",
    description: "Minimum orchestrator performance score to accept"
  }, {
    flag: "-discoveryTimeout",
    type: "Video",
    tone: "video",
    description: "Time to wait for orchestrator info for manifest"
  }]
}, {
  title: "Pricing & Payments",
  rows: [{
    flag: "-maxPricePerUnit",
    type: "Video",
    tone: "video",
    description: "Maximum transcoding price per pixelsPerUnit"
  }, {
    flag: "-maxPricePerCapability",
    type: "AI",
    tone: "ai",
    description: "JSON list of prices per AI capability/model"
  }, {
    flag: "-ignoreMaxPriceIfNeeded",
    type: "Both",
    tone: "both",
    description: "Allow exceeding max price if no orchestrator meets requirement"
  }, {
    flag: "-pricePerUnit",
    type: "Video",
    tone: "video",
    description: "Price per pixelsPerUnit amount for transcoding"
  }, {
    flag: "-pixelsPerUnit",
    type: "Both",
    tone: "both",
    description: "Amount of pixels per unit for pricing"
  }, {
    flag: "-priceFeedAddr",
    type: "Both",
    tone: "both",
    description: "ETH address of Chainlink price feed contract"
  }, {
    flag: "-autoAdjustPrice",
    type: "Video",
    tone: "video",
    description: "Enable automatic price adjustments"
  }, {
    flag: "-pricePerGateway",
    type: "Video",
    tone: "video",
    description: "JSON list of price per gateway"
  }, {
    flag: "-pricePerBroadcaster",
    type: "Video",
    tone: "video",
    description: "JSON list of price per broadcaster"
  }]
}, {
  title: "Blockchain / Ethereum",
  rows: [{
    flag: "-ethAcctAddr",
    type: "Both",
    tone: "both",
    description: "Existing ETH account address"
  }, {
    flag: "-ethPassword",
    type: "Both",
    tone: "both",
    description: "Password for ETH account or path to file"
  }, {
    flag: "-ethKeystorePath",
    type: "Both",
    tone: "both",
    description: "Path to ETH keystore directory or keyfile"
  }, {
    flag: "-ethOrchAddr",
    type: "Both",
    tone: "both",
    description: "ETH address of on-chain registered orchestrator"
  }, {
    flag: "-ethUrl",
    type: "Both",
    tone: "both",
    description: "Ethereum node JSON-RPC URL"
  }, {
    flag: "-ethController",
    type: "Both",
    tone: "both",
    description: "Protocol smart contract address"
  }, {
    flag: "-transactionTimeout",
    type: "Both",
    tone: "both",
    description: "Time to wait for ETH transaction confirmation"
  }, {
    flag: "-maxTransactionReplacements",
    type: "Both",
    tone: "both",
    description: "Number of times to replace pending ETH transactions"
  }, {
    flag: "-gasLimit",
    type: "Both",
    tone: "both",
    description: "Gas limit for ETH transactions"
  }, {
    flag: "-minGasPrice",
    type: "Both",
    tone: "both",
    description: "Minimum gas price for ETH transactions in wei"
  }, {
    flag: "-maxGasPrice",
    type: "Both",
    tone: "both",
    description: "Maximum gas price for ETH transactions in wei"
  }]
}, {
  title: "Ticket System",
  rows: [{
    flag: "-ticketEV",
    type: "Both",
    tone: "both",
    description: "Expected value for PM tickets"
  }, {
    flag: "-maxFaceValue",
    type: "Both",
    tone: "both",
    description: "Max ticket face value in WEI"
  }, {
    flag: "-maxTicketEV",
    type: "Both",
    tone: "both",
    description: "Maximum acceptable expected value for one PM ticket"
  }, {
    flag: "-maxTotalEV",
    type: "Both",
    tone: "both",
    description: "Maximum acceptable expected value for one PM payment"
  }, {
    flag: "-depositMultiplier",
    type: "Both",
    tone: "both",
    description: "Deposit multiplier for max acceptable ticket faceValue"
  }]
}, {
  title: "Services",
  rows: [{
    flag: "-redeemer",
    type: "Both",
    tone: "both",
    description: "Run a ticket redemption service"
  }, {
    flag: "-redeemerAddr",
    type: "Both",
    tone: "both",
    description: "URL of ticket redemption service to use"
  }, {
    flag: "-reward",
    type: "Both",
    tone: "both",
    description: "Run a reward service"
  }, {
    flag: "-initializeRound",
    type: "Both",
    tone: "both",
    description: "Transcoder should automatically initialize new rounds"
  }, {
    flag: "-initializeRoundMaxDelay",
    type: "Both",
    tone: "both",
    description: "Maximum delay before initializing a round"
  }]
}, {
  title: "Monitoring & Metrics",
  rows: [{
    flag: "-monitor",
    type: "Both",
    tone: "both",
    description: "Send performance metrics"
  }, {
    flag: "-metricsPerStream",
    type: "Both",
    tone: "both",
    description: "Group performance metrics per stream"
  }, {
    flag: "-metricsClientIP",
    type: "Both",
    tone: "both",
    description: "Expose client's IP in metrics"
  }, {
    flag: "-metadataQueueUri",
    type: "Both",
    tone: "both",
    description: "URI for message broker to send operation metadata"
  }, {
    flag: "-metadataAmqpExchange",
    type: "Both",
    tone: "both",
    description: "Name of AMQP exchange for operation metadata"
  }, {
    flag: "-metadataPublishTimeout",
    type: "Both",
    tone: "both",
    description: "Max time to wait for publishing metadata events"
  }]
}, {
  title: "Storage",
  rows: [{
    flag: "-dataDir",
    type: "Both",
    tone: "both",
    description: "Directory that data is stored in"
  }, {
    flag: "-objectStore",
    type: "Both",
    tone: "both",
    description: "URL of primary object store"
  }, {
    flag: "-recordStore",
    type: "Both",
    tone: "both",
    description: "URL of object store for recordings"
  }]
}];

export const DynamicTable = ({tableTitle = null, headerList = [], itemsList = [], monospaceColumns = [], columnWidths = {}, contentFitColumns = [], showSeparators = false, margin, className = "", style = {}, ...rest}) => {
  if (!headerList.length) {
    return <div>No headers provided</div>;
  }
  const safeContentFitColumns = Array.isArray(contentFitColumns) ? contentFitColumns : [];
  const usesContentFitColumns = safeContentFitColumns.length > 0;
  const isContentFitColumn = header => safeContentFitColumns.includes(header);
  const getColumnStyle = header => {
    const widthStyle = columnWidths[header] ? {
      width: columnWidths[header],
      minWidth: columnWidths[header],
      maxWidth: columnWidths[header]
    } : {};
    const contentFitStyle = !columnWidths[header] && isContentFitColumn(header) ? {
      width: "1%",
      whiteSpace: "nowrap"
    } : {};
    return {
      ...contentFitStyle,
      ...widthStyle
    };
  };
  return <div className={className} style={style} {...rest}>
      {tableTitle && <div style={{
    fontStyle: "italic",
    margin: 0
  }}>
          <strong>{tableTitle}</strong>
        </div>}
      <div style={{
    overflowX: "auto",
    ...margin != null && ({
      margin
    })
  }} role="region" tabIndex={0} aria-label={tableTitle ? `Scrollable table: ${tableTitle}` : "Scrollable table"}>
        <table data-docs-dynamic-table style={{
    width: "100%",
    tableLayout: usesContentFitColumns ? "auto" : "fixed",
    borderCollapse: "collapse",
    fontSize: "0.9rem",
    marginTop: 0
  }}>
          <thead>
            <tr style={{
    backgroundColor: "var(--lp-color-accent)",
    color: "var(--lp-color-on-accent)",
    borderBottom: "1px solid var(--lp-color-border-default)"
  }}>
              {headerList.map((header, index) => <th key={index} style={{
    padding: "10px 8px",
    textAlign: "left",
    fontWeight: "600",
    color: "var(--lp-color-on-accent)",
    ...getColumnStyle(header)
  }}>
                  {header}
                </th>)}
            </tr>
          </thead>
          <tbody>
            {itemsList.filter(item => showSeparators || !item?.__separator).map((item, rowIndex) => item?.__separator ? <tr key={rowIndex} style={{
    backgroundColor: "var(--lp-color-accent)",
    color: "var(--lp-color-on-accent)",
    borderBottom: "1px solid var(--lp-color-accent)"
  }}>
                  <td colSpan={headerList.length} style={{
    padding: "6px 8px",
    fontWeight: "700",
    color: "var(--lp-color-on-accent)",
    letterSpacing: "0.01em"
  }}>
                    {(item[headerList[0]] ?? item.Category) ?? "Category"}
                  </td>
                </tr> : <tr key={rowIndex} style={{
    borderBottom: "1px solid var(--lp-color-border-default)"
  }}>
                  {headerList.map((header, colIndex) => {
    const value = (item[header] ?? item[header.toLowerCase()]) ?? "-";
    const isMonospace = monospaceColumns.includes(colIndex);
    return <td key={colIndex} style={{
      padding: "8px 8px",
      fontFamily: isMonospace ? "monospace" : "inherit",
      wordWrap: "break-word",
      overflowWrap: "break-word",
      ...getColumnStyle(header)
    }}>
                        {isMonospace ? <code>{value}</code> : value}
                      </td>;
  })}
                </tr>)}
          </tbody>
        </table>
      </div>
    </div>;
};

export const gatewayConfigurationFlagRows = gatewayConfigurationFlagSections.flatMap(({title, rows}) => [{
  Flag: title,
  __separator: true
}, ...rows.map(row => ({
  Flag: row.flag,
  Type: row.type,
  Description: row.description
}))]);

<Note>
  This reference is manually maintained. For the most current flags, see the
  [go-livepeer source](https://github.com/livepeer/go-livepeer).
</Note>

## Gateway Configuration Flags

<Info>
  **Flag types:** <Badge color="blue">Video</Badge> video ingest and transcoding,{' '}
  <Badge color="purple">AI</Badge> AI-only services, and{' '}
  <Badge color="green">Both</Badge> shared gateway and orchestrator settings.
</Info>

<DynamicTable tableTitle="Gateway configuration flags" headerList={['Flag', 'Type', 'Description']} itemsList={gatewayConfigurationFlagRows} monospaceColumns={[0]} />
