# Ports, sockets and environment variables

> Every TCP port, Unix socket and environment variable used by the RosieOS services, the dev stack and the offline programming launcher, with defaults.

URL: https://advancedmetalresearch.com/docs/reference/ports-and-environment
Section: RosieOS docs / Reference
Last updated: 2026-10-10

This page lists the defaults from the code. Hosts are shown as they are bound. Replace `rosie.local` with your cell host where a remote address is meant.

## Unix sockets

| Socket | Default path | Owner | Public? |
|---|---|---|---|
| Native core IPC | `/run/rosie-rt-core/ipc.sock` (`rt-control --core-socket`, `rtctl run --socket`). Installed units use `/run/rosie-rt-core/native/ipc.sock`. | `rosie-rt-core` | **No.** Private between the core and `rt-control`. |
| Control API | `/run/rosie-rt-core/control.sock` (`rt-control --socket`, `rtctl --socket`). Installed units create it at `/run/rosie-rt-core/public/control.sock`, with a symlink at the default path. | `rt-control` | Yes. HTTP/JSON. |
| Jog lane | `jog.sock` in the same directory as `control.sock` | `rt-control` | Yes. 224-byte datagrams. |
| Dev-stack sockets | `$ROSIE_LOCAL_RT_DIR/{ipc,control,jog}.sock`, default `${XDG_RUNTIME_DIR:-${TMPDIR:-/tmp}}/rosie-dev-rt-$UID/` | `dev-stack.sh` | Local only |

Unix sockets must be on a Linux filesystem. Under WSL, `/mnt/c` does not work.

## TCP ports

| Port | Service | Default bind | Notes |
|---|---|---|---|
| 8443 | `rt-control` mutual-TLS listener | Off unless `--remote-listen` is set. Cell configs pin `127.0.0.1:8443`. | Remote HTTP API and WebSocket jog. Requires a CA, server certificate and key, and a CRL. |
| 8794 | OLP server | `127.0.0.1:8794` (`serve --listen`, launcher `OLP_LISTEN`) | API under `/api/offline-programming/v1/` |
| 5189 | OLP UI (Vite) | `127.0.0.1`, or `0.0.0.0` under dev-stack when a Tailscale address is found | App at `/offline-programming/v1/ui/`. It proxies `/api` to the OLP server. |
| 8796 | Weld planner motion server | **`0.0.0.0:8796`** (`--host`, `--port`) | Listens on all interfaces by default. Pass `--host 127.0.0.1` on an untrusted network. |
| 8797 | Dense trajectory daemon ingest | `127.0.0.1:8797` | Length-framed TCP, one request per connection |
| 51711 | Virtual pendant UI (Vite) | `127.0.0.1` | Page at `/steamdeck/virtual/v1/` |
| 51712 | Virtual pendant bridge | `127.0.0.1` (must be loopback) | `/healthz`, `/api/v1/*` |
| 14222, 18222 | NATS server (dev stack only) | `127.0.0.1` | Client and monitoring ports |
| 8787 | Program catalog and daemon state (optional) | — | Not part of this repository's public path. The dev-stack `catalog` service is skipped unless you supply its script. |

The Cartesian motion server listens for UDP intent packets only on the address you pass with `--udp-listen HOST:PORT`. It has no default port. Its status file defaults to `/run/robot-v4-cartesian/status.json`.

## Dev stack (`dev-stack.sh`)

| Variable | Default | Effect |
|---|---|---|
| `ROSIE_DEV_STACK_DIR` | `$RUN_BASE/rosie-stack-$UID` | Pid files, logs and readiness files. `RUN_BASE` is `$XDG_RUNTIME_DIR`, else `$TMPDIR`, else `/tmp`. |
| `ROSIE_LOCAL_RT_DIR` | `$RUN_BASE/rosie-dev-rt-$UID` | Simulator and `rt-control` sockets |
| `ROSIE_LOCAL_RT_BUILD` | `rt-core/build/dev-stack` | Compiled config and consumer bindings |
| `DEV_STACK_BACKEND` | `rt_core` | The only accepted value. Anything else exits with `backend_retired`. |
| `DEV_STACK_MACHINE_CONFIG` | `rt-core/config/machines/simulation/simulation-program.json` | The simulated machine, read by `local-rt-core.sh prepare` |
| `DEV_STACK_UI_HOST` | `127.0.0.1`; `0.0.0.0` if Tailscale is up | UI bind host |
| `DEV_STACK_UI_MODE` | `dev`; `built` if Tailscale is up | `dev` (hot reload) or `built` (compressed bundle) |
| `DEV_STACK_FIREWALL` | `1` | `0` skips adding a `ufw` rule for remote UI access |
| `DEV_STACK_PENDANT_PORT` | `51712` | Virtual pendant bridge port |
| `DEV_STACK_DENSE_INGEST` | `127.0.0.1:8797` | Dense daemon listen address |
| `DEV_STACK_DENSE_NATS_URL` | `nats://127.0.0.1:14222` | Dense daemon NATS URL |
| `DEV_STACK_DENSE_BIN_DIR` | `make -C motion-server/joint-trajectory/v1 print-bin-dir` (`rt-core/build/dense`) | Where the dense daemon binary is |
| `DEV_STACK_NATS_BIN` | `~/.rosie/bin/nats-server` | NATS server binary |
| `DEV_STACK_OLP_CELLS` | unset | A cell catalogue file (`offline-programming.cell-catalogue.v1`). Its cells are added after the local simulation. |
| `DEV_STACK_OLP_REMOTE` | unset | A remote rt-core binding file for OLP. Its address must be `https://`. |
| `CATALOG_DAEMON_SCRIPT` | `~/.cache/rosieos-olp/catalog-daemon/start-catalog-daemon.sh` | Start script for the optional `catalog` service |
| `STACK_WAIT_SECS` | `300` | Health wait for `start` |

`local-rt-core.sh bind` writes `binding.env` into `ROSIE_LOCAL_RT_BUILD`. It exports these variables:

- `ROSIE_RT_CONTROL_SOCKET` and `ROSIE_RT_JOG_SOCKET`
- `ROSIE_RT_PAIR_ID` (`local-dev`) and `ROSIE_RT_PAIR_REVISION` (`1`)
- `ROSIE_RT_CONFIGURATION_SHA256`
- `ROSIE_RT_URDF` and `ROSIE_RT_URDF_SHA256`
- `OFFLINE_PROGRAMMING_RT_CORE_CONFIG`

## rt-control and installed units

| Variable or file | Used by | Meaning |
|---|---|---|
| `ROSIE_RT_COMPILED_CONFIG` | `rt-control` | Default for `--compiled-config`, the compiled digest directory containing `resources.json` |
| `/etc/rosie-rt-core/control.env` | `rosie-rt-core.service`, `rosie-rt-control.service` | Sets `ROSIE_RT_CONFIGURATION_SHA256`, `ROSIE_RT_PAIR_ID`, `ROSIE_RT_PAIR_REVISION`, `ROSIE_RT_REMOTE_ARGS` (extra `rt-control` flags) and `ROSIE_RT_CORE_ARGS` (core arguments) |
| `/etc/rosie-rt-core/natspublisher.env` | `rosie-rt-natspublisher.service` | NATS publisher settings |

`rt-control` flags are in [rt-control HTTP API](https://advancedmetalresearch.com/docs/apis/rt-control-http), and `rtctl` flags in [rtctl](https://advancedmetalresearch.com/docs/reference/rtctl).

## Offline programming server

| Variable | Flag it defaults | Meaning |
|---|---|---|
| `OFFLINE_PROGRAMMING_WELD_PLANNER_MOTION_ORIGIN` | `--weld-planner-motion-origin` | Weld planner origin, usually `http://127.0.0.1:8796`. It is used by the server only, to plan and to fetch `.rdt` files. |
| `OFFLINE_PROGRAMMING_EXECUTION_BACKEND` | `--execution-backend` | `rt_core`, the only backend |
| `OFFLINE_PROGRAMMING_JOG_BACKEND` | — | Must be `rt_core` |
| `OFFLINE_PROGRAMMING_RT_CORE_CONFIG` | `--rt-core-config` | JSON binding for the local rt-core: socket, pair, digests, axis mask |
| `OFFLINE_PROGRAMMING_CELLS` | — | Cell catalogue for the machine list |
| `OFFLINE_PROGRAMMING_PROGRAM_CATALOG_ORIGIN` | `--program-catalog-origin` | Optional program catalog origin |
| `OFFLINE_PROGRAMMING_DAEMON_STATE_URL` | `--daemon-state-url` | Optional daemon state URL |
| `OFFLINE_PROGRAMMING_EXECUTION_STATE_DIR` | `--execution-state-dir` | Directory for execution audit state |
| `OFFLINE_PROGRAMMING_JOG_BINARY` | — | Path to `robot-v4-cartesiand` |
| `OLP_CARTESIAN_RESOLVER`, `OLP_CARTESIAN_RESOLVER_REPO` | — | Override the Cartesian resolver binary and the repository it loads robots from |
| `SEAM_WORKER_PYTHON`, `SEAM_WORKER_SPARES` | — | Python for the seam worker subprocess, and how many spare workers to keep warm |
| `CADQUERY_TOPOLOGY_PYTHON` | — | Python for the CadQuery tessellation subprocess |
| `ROSIE_REPO` | — | Repository root, if the server cannot find it |
| `ROSIE_RT_CONTROL_SOCKET`, `ROSIE_RT_PAIR_ID`, `ROSIE_RT_PAIR_REVISION` | — | Local rt-control binding |

Launcher only (`start-offline-programming.sh`):

| Variable | Default | Meaning |
|---|---|---|
| `OLP_LISTEN` | `127.0.0.1:8794` | Server listen address |
| `OLP_UI_HOST`, `OLP_UI_PORT` | `127.0.0.1`, `5189` | The UI URL it prints |
| `OLP_SIM_WAIT_SECS` | `270` | Wait for the local simulator to become ready |
| `OLP_RESTART_SERVE` | unset | `1` restarts a server that is already running |
| `ROSIEOS_OLP_CACHE` | `~/.cache/rosieos-olp` | Build cache for the server and motion-server binaries |
| `OFFLINE_PROGRAMMING_RT_CORE_REMOTE` | unset | A remote rt-core binding file for dense execution |

OLP UI: `OFFLINE_PROGRAMMING_API_URL` sets where Vite proxies `/api`. It defaults to `http://127.0.0.1:8794`.

## Weld planner

| Variable or flag | Default | Meaning |
|---|---|---|
| `--host`, `--port` | `0.0.0.0`, `8796` | Listen address |
| `--dense-store-dir`, `WELD_PLANNER_DENSE_STORE_DIR` | `~/.cache/rosieos-olp/weld-planner-dense` | Where dense `.rdt` files are written for OLP to fetch |
| `AMR_WELD_PLANNER_SOURCE_REVISION` | Set by `pixi run -e motion motion-serve` to `git rev-parse HEAD` | Stamped into results so you can tell which code planned them |

## Virtual pendant

| Variable | Default | Meaning |
|---|---|---|
| `STEAMDECK_VIRTUAL_BRIDGE_URL` | `http://127.0.0.1:51712` | Where the UI's Vite server proxies `/healthz` and `/api/v1` |

## Sources

Written from these files in the RosieOS repository (https://github.com/advanced-metal-research/RosieOS):

- `rt-core/cmd/rt-control/main.go:24-38,56-57`
- `rt-core/tools/rtctl/control.go:103-106`
- `rt-core/tools/rtctl/run.go:17-21`
- `rt-core/host/rosie-rt-core.service:20-28`
- `rt-core/host/rosie-rt-control.service:19-23`
- `rt-core/host/rosie-rt-natspublisher.service:26-27`
- `rt-core/config/templates/cell.json (remote_listen)`
- `dev-stack.sh:23-80,269-297,299-310,442-450,555-575`
- `motion-server/v1/local-rt-core.sh:6-7,24,93-110`
- `motion-server/joint-trajectory/v1/Makefile:7,16-17`
- `motion-server/joint-trajectory/v1/config/joint_trajectory_daemon.config.json`
- `motion-server/v1/src/robot_v4_cartesian_daemon.cpp:53-55,1185`
- `motion-server/v1/src/robot_v4_cartesian_cli.hpp:236-339`
- `offline-programming/v1/main.go:257-320,379,714`
- `offline-programming/v1/cartesian_jog.go:21`
- `offline-programming/v1/internal/seam/worker.go:155-170`
- `offline-programming/v1/internal/cad/worker.go:194`
- `offline-programming/v1/internal/simulator/canonical_binary.go:35-50`
- `offline-programming/v1/start-offline-programming.sh:16-18,32,35-36,48-58,115-121`
- `offline-programming/v1/ui/vite.config.ts:3-14`
- `weld_planner/v1/python/weld_motion_planner/server/motion_planner_server.py:57,78,343-344,555-565`
- `weld_planner/v1/pixi.toml:156`
- `steamdeck/virtual/v1/ui/vite.config.ts:12,108-131`
- `steamdeck/virtual/bridge/cli.go:20-45`
- `steamdeck/virtual/bridge/server.go:731-739`
