Skip to main content
This tutorial walks through a complete end-to-end test of the Livepeer Gateway + Orchestrator pipeline using BYOC (Bring Your Own Container) with a CPU-only Docker container. No GPU is required. By the end you will have:
  • A go-livepeer Orchestrator running locally accepting BYOC jobs
  • A go-livepeer Gateway running in off-chain mode pointed at a community remote signer
  • A simple CPU Docker container registered as a BYOC pipeline
  • A verified end-to-end job sent from your Gateway through your Orchestrator and back
  • A clear path to taking this setup to production on-chain
This tutorial uses the off-chain Gateway mode (remote signer) for simplicity. Off-chain mode was introduced in Q4 2025 via PRs #3791 and #3822. It is the recommended starting point for all new AI and BYOC Gateway deployments.
BYOC vs LV2V: BYOC uses a different job flow from LV2V (live-video-to-video). BYOC does not use gRPC to fetch OrchestratorInfo - discovery is done by HTTP capability query. The Gateway’s start-stream request can explicitly set an allow-list or block-list of Orchestrators. This makes BYOC well-suited to browser and CPU-only deployments where gRPC dependencies are undesirable.

Prerequisites

Docker

Docker Engine 24+ installed and running. Verify with docker --version.

go-livepeer binary

Latest tagged release from github.com/livepeer/go-livepeer/releases. Linux amd64 recommended.

Python 3.10+

Required if you want to use the Python Gateway SDK for sending test jobs. Optional for the go-livepeer-only path.

Free ports

The following ports must be free on your machine: 7935 (Orchestrator HTTP), 8935 (Gateway AI API), 9090 (Orchestrator metrics - optional).
You do not need:
  • A GPU
  • An Ethereum wallet or ETH
  • An Arbitrum RPC endpoint
  • On-chain registration
The community remote signer at https://signer.eliteencoder.net/ handles all Ethereum operations for you during testing.

Architecture overview

The Gateway handles no Ethereum operations itself. All payment signing is delegated to the community remote signer. The Orchestrator is registered locally only - no on-chain registration needed for this smoke test.

Part 1: Build the CPU BYOC container

We will use a minimal Python image that echoes video frames back - a CPU-only passthrough pipeline useful for testing the full job flow without any GPU or model inference.
1

Create the pipeline directory

2

Write the pipeline code

Create pipeline.py:
3

Write the entrypoint

Create main.py:
4

Write the Dockerfile

Create Dockerfile:
5

Build the Docker image

Expected output ends with:
Verify:

Part 2: Run the Orchestrator

The Orchestrator accepts jobs from the Gateway and routes them to the BYOC container.
1

Download the go-livepeer binary

2

Start the BYOC container

Start your pipeline container before the Orchestrator so it is ready when the Orchestrator registers capabilities:
Verify the container is running:
3

Start the orchestrator

Run the Orchestrator in -orchestrator mode, advertising the BYOC capability and pointing at the running Docker container:
Flag explanation:
  • -orchestrator - run in Orchestrator mode
  • -serviceAddr - the address the Gateway will connect to
  • -cliAddr - local CLI management port
  • -byoc - enable BYOC mode
  • -byocContainerURL - URL of the running BYOC Docker container
  • -byocModelID - must match the name in your pipeline’s PipelineSpec
  • -pricePerUnit 1 - set a nominal price (1 wei equivalent) for testing
  • -network offchain - no Ethereum dependency, local registration only
  • -datadir - separate data directory from the Gateway
Successful startup logs include:

Part 3: Run the Gateway (off-chain mode)

1

Start the gateway with remote signer

In a new terminal, run the Gateway in off-chain mode pointed at the community remote signer and your local Orchestrator:
Flag explanation:
  • -gateway - run in Gateway mode
  • -cliAddr - separate CLI port from the Orchestrator (must differ)
  • -httpAddr - AI API port that your applications will call
  • -orchAddr - point directly at your local Orchestrator
  • -remoteSignerAddr - the community-hosted remote signer (provides free ETH for testing)
  • -network offchain - no Arbitrum RPC required
  • -datadir - separate data directory
Successful startup logs include:
The remote signer at signer.eliteencoder.net is a community-hosted service maintained by John (Elite Encoder). It provides free ETH for testing off-chain Gateway setups. Confirm availability in #local-Gateways on Discord if you encounter connection errors.
2

Verify both processes are running

Check the Gateway API is responding:
Check the Orchestrator is reachable from the Gateway:

Part 4: Send a test job

1

Install the Python gateway SDK (optional but recommended)

The Python SDK makes it easy to send a structured BYOC job and observe payments:
2

Send a BYOC job via the SDK

Create test_job.py:
Run it:
Successful output:
3

Alternative: Test via curl (gateway HTTP API)

If you prefer not to install the SDK, you can test via the Gateway’s HTTP endpoint directly:
A non-error response confirms the pipeline is reachable and the session was established.
4

Inspect the logs

In the Gateway terminal, you should see payment-related log lines confirming the remote signer was used:
In the Orchestrator terminal:

Part 5: Troubleshooting

Confirm the community remote signer is online:
If this fails, post in #local-Gateways on Discord - the signer may be down or the URL may have changed. As a fallback, you can run your own remote signer from the go-livepeer source using the -remoteSigner flag with your own Ethereum key.
Check that your Docker container is running and reachable before starting the Orchestrator:
If the container is not reachable, the Orchestrator will start but will not advertise the BYOC capability to the Gateway.
If either port 7935, 7936, or 8935 is already in use:
Adjust the -serviceAddr, -cliAddr, and -httpAddr flags accordingly. Make sure -orchAddr on the Gateway matches the Orchestrator’s -serviceAddr.
Check that the Orchestrator’s -serviceAddr is reachable from the Gateway process:
If the Orchestrator is on a different interface, update -orchAddr to use the correct IP. For a same-machine setup, localhost or 127.0.0.1 should always work.
Check Docker logs:
Common causes: missing ai-runner base image (pull it first with docker pull livepeer/ai-runner:live-base), or a Python import error in your pipeline code.

Part 6: Graduate to on-chain production

Once your off-chain smoke test passes, follow this path to move to a production on-chain deployment.
1

Acquire ETH on Arbitrum One

On-chain Gateways require a PM deposit (approximately 0.065 ETH) and a PM reserve (approximately 0.03 ETH) on Arbitrum One.Options for acquiring Arbitrum ETH:
Confirm current ETH deposit requirements in #lounge on Discord or the on-chain requirements page before depositing - amounts can change as ETH/USD rates shift.
2

Create an Ethereum wallet for your gateway

Your production Gateway needs a dedicated Ethereum wallet. Do not reuse a personal wallet.
Note your wallet address. You will need it for the PM deposit and reserve transactions.
3

Set up an Arbitrum RPC endpoint

Your on-chain Gateway needs a reliable Arbitrum One RPC. Options:Test your RPC:
4

Deposit PM funds on-chain

Use livepeer_cli to make your PM deposit and reserve:
From the CLI menu, select:
  1. Deposit broadcasting funds (ETH) - deposit approximately 0.065 ETH
  2. Request unlock broadcasting funds is not needed yet; this is for withdrawal
After depositing, confirm your balance:
5

Register your orchestrator on-chain

Your production Orchestrator needs to activate and set pricing on-chain:
Then activate via the CLI:
6

Switch the gateway to on-chain mode

Remove -network offchain and -remoteSignerAddr, and add your Arbitrum RPC and on-chain flags:
The Gateway will now discover Orchestrators from the on-chain registry and sign PM tickets directly using your wallet’s signing key.
Once on-chain, you no longer need the community remote signer. Your Gateway holds the PM signing key and handles all Ethereum operations directly. This is the standard mode for video Gateways and is also supported for AI Gateways that prefer full on-chain custody.
7

Verify on-chain operation

Confirm your Gateway is visible on the network:
  1. Visit explorer.livepeer.org and search for your Gateway address
  2. Check that PM tickets are being sent via the Gateway logs: look for Ticket sent lines
  3. Monitor your ETH balance - it should decrease slowly as PM deposits fund tickets
  4. Use tools.Livepeer.cloud to check your Orchestrator’s visibility and performance

What next

Custom pipeline beyond passthrough

Build a custom CPU or GPU pipeline extending ai-runner. Add model loading, frame processing logic, and custom parameters.

Remote signers deep dive

Understand the full remote signer protocol, stateless design, and how to run your own signer for production security.

Payment clearinghouse

Build a Gateway-as-a-Service layer: JWT auth, user management, accounting on top of the remote signer model (NaaP reference implementation).

Monitoring and optimisation

Set up Prometheus metrics, Loki log queries, and ETH balance alerts for production Gateway operation.
BYOC and off-chain Gateway support is actively developed. For the latest status of BYOC payments, remote signer compatibility, and SDK updates, follow the #local-Gateways channel on Discord and the livepeer-python-Gateway PR queue.
Last modified on May 31, 2026