Processing server on Linux and macOS
Install a remote processing server directly on the host system.
Who this is for
Use this path when you want to move heavier work away from the origin server or Home Assistant.
The processing server runs distributed pipelines and responds to the origin through an HTTP API.
For system, architecture, and GPU support, see Compatibility.
Prerequisites
- Linux or macOS.
- Python 3.12 recommended.
uv.- TCP access between the origin and the processing server. The default port is
49321.
Install uv if you do not have it yet:
curl -LsSf https://astral.sh/uv/install.sh | sh
Installation
Create a directory for the processing server:
mkdir -p ~/toposync-processing
cd ~/toposync-processing
Create the virtual environment:
uv python install 3.12
uv venv .venv --python 3.12
source .venv/bin/activate
Install the default CPU bundle:
uv pip install --upgrade --refresh toposync
If you need to reproduce a specific version:
uv pip install --upgrade --refresh "toposync==0.7.2"
Optional GPU and streaming
For Linux with NVIDIA CUDA:
uv pip install --upgrade --refresh toposync-vision-cuda
For CPU streaming:
uv pip install --upgrade --refresh toposync-streaming
For CUDA + streaming on the same processing server:
uv pip install --upgrade --refresh toposync-vision-cuda toposync-ext-streaming
Streaming may require FFmpeg to be available on the system.
How to run
Without authentication, only for trusted networks:
toposync processing-serve --host 0.0.0.0 --port 49321 --data-dir ./toposync-processing-data
With Basic Auth:
TOPOSYNC_PROCESSING_USERNAME=toposync \
TOPOSYNC_PROCESSING_PASSWORD='<strong-password>' \
toposync processing-serve --host 0.0.0.0 --port 49321 --data-dir ./toposync-processing-data
How to access
The origin must be able to reach:
http://<processing-server-ip>:49321
The processing server does not serve the main UI. It serves processing endpoints for the origin.
How to verify
Without Basic Auth:
curl http://127.0.0.1:49321/api/processing/status
With Basic Auth:
curl -u toposync:'<strong-password>' http://127.0.0.1:49321/api/processing/status
Expected result: a JSON status response. active: false is normal until the origin sends a pipeline configuration.
Register on the origin
On the origin server, register the processing server:
curl -X PUT http://127.0.0.1:8000/api/processing-servers/remote_gpu \
-H 'content-type: application/json' \
-d '{
"id": "remote_gpu",
"name": "Remote GPU",
"kind": "http",
"url": "http://<processing-server-ip>:49321",
"username": "toposync",
"password": "<strong-password>"
}'
Then test through the origin:
curl http://127.0.0.1:8000/api/processing-servers/remote_gpu/status
In pipelines, set processing_server_id to the registered id, for example remote_gpu.
How to update
With the virtual environment active:
uv pip install --upgrade --refresh toposync
If you installed upgrades, update only the packages you use:
uv pip install --upgrade --refresh toposync-vision-cuda
uv pip install --upgrade --refresh toposync-streaming
uv pip install --upgrade --refresh toposync-ext-streaming
Then restart the toposync processing-serve process.
How to uninstall
Stop the process and remove the directory:
deactivate 2>/dev/null || true
rm -rf ~/toposync-processing
Also remove the registered processing server from the origin.
Troubleshooting
401 Unauthorized
The username or password configured on the origin does not match TOPOSYNC_PROCESSING_USERNAME and TOPOSYNC_PROCESSING_PASSWORD.
Connection refused
Confirm that the processing server is running with --host 0.0.0.0 and that port 49321 is allowed by the firewall.
Processing server is always idle
The pipeline is still using processing_server_id: "local". Change the pipeline to the remote server id.
Vision does not use the GPU
Confirm that toposync-vision-cuda is installed and check the providers returned by /api/processing/status.