- 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
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).- A GPU
- An Ethereum wallet or ETH
- An Arbitrum RPC endpoint
- On-chain registration
https://signer.eliteencoder.net/ handles all Ethereum operations for you during testing.
Architecture overview
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.Part 2: Run the orchestrator
The orchestrator accepts jobs from the gateway and routes them to the BYOC container.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:
Start the orchestrator
Run the orchestrator in Flag explanation:
-orchestrator mode, advertising the BYOC capability and pointing at the running Docker container:-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 thenamein your pipeline’sPipelineSpec-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
Part 3: Run the gateway (off-chain mode)
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
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.Part 4: Send a test job
Install the Python gateway SDK (optional but recommended)
The Python SDK makes it easy to send a structured BYOC job and observe payments:
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.
Part 5: Troubleshooting
Gateway cannot connect to remote signer
Gateway cannot connect to remote signer
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.Orchestrator not registering the BYOC capability
Orchestrator not registering the BYOC capability
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.
Port conflict errors
Port conflict errors
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.Gateway cannot find the orchestrator
Gateway cannot find the orchestrator
Check that the orchestrator’s If the orchestrator is on a different interface, update
-serviceAddr is reachable from the gateway process:-orchAddr to use the correct IP. For a same-machine setup, localhost or 127.0.0.1 should always work.BYOC container exits immediately
BYOC container exits immediately
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.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:
- Bridge from Ethereum mainnet via the official Arbitrum bridge
- Buy directly on Arbitrum via exchanges listed at the Arbitrum Exchanges reference
- Buy on a CEX (Coinbase, Binance) and withdraw directly to Arbitrum One
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.
Set up an Arbitrum RPC endpoint
Your on-chain gateway needs a reliable Arbitrum One RPC. Options:
- Infura —
https://arbitrum-mainnet.infura.io/v3/YOUR_KEY - Alchemy —
https://arb-mainnet.g.alchemy.com/v2/YOUR_KEY - Community Arbitrum RPC (see Arbitrum RPC reference)
Deposit PM funds on-chain
Use From the CLI menu, select:
livepeer_cli to make your PM deposit and reserve:- Deposit broadcasting funds (ETH) — deposit approximately 0.065 ETH
- Request unlock broadcasting funds is not needed yet; this is for withdrawal
Register your orchestrator on-chain
Your production orchestrator needs to activate and set pricing on-chain:Then activate via the CLI:
Switch the gateway to on-chain mode
Remove The gateway will now discover orchestrators from the on-chain registry and sign PM tickets directly using your wallet’s signing key.
-network offchain and -remoteSignerAddr, and add your Arbitrum RPC and on-chain flags: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.
Verify on-chain operation
Confirm your gateway is visible on the network:
- Visit explorer.livepeer.org and search for your gateway address
- Check that PM tickets are being sent via the gateway logs: look for
Ticket sentlines - Monitor your ETH balance — it should decrease slowly as PM deposits fund tickets
- 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.