Documentation
Ethernet Interface Design Description (IDD)
Source:
docs/ethernet_idd.md
This document is the project-wide registry for default IP ports used by OpenRoadCode software, development utilities, and directly managed companion services.
The registry covers ports that OpenRoadCode assigns, binds, connects to, or explicitly configures. Generic outbound Internet traffic such as HTTPS requests to Spotify, YouTube, Open-Meteo, package repositories, and other third-party services is outside this IDD because those remote ports are not owned by OpenRoadCode.
Unless a row explicitly says otherwise, the values below are defaults and may be overridden by runtime configuration, environment variables, command-line arguments, or external-service configuration.
Interface names and roles describe the capability exposed on the network. Application or module paths may appear in implementation notes and tests when they identify the current owner or composition point, but those implementation locations are not part of the interface contract unless explicitly stated.
Port registry
| Port | Default address / endpoint | Owner | Role | Transport | Application protocol | Unit test(s) | Scope / notes |
|---|---|---|---|---|---|---|---|
| 2947 | 127.0.0.1:2947 |
gpsd |
GNSS data service consumed by navigation and weather location providers | TCP | gpsd JSON protocol | No direct unit test located | Current Linux/Raspberry Pi runtime default. Configured by services.navigation.inputs.gps in config/runtime.toml. |
| 4532 | 127.0.0.1:4532 |
SDR++ Rigctl Server | Radio tuning/control endpoint consumed by OpenRoadCode radio controllers | TCP | Hamlib rigctl text protocol | No direct unit test located | Current runtime default in config/runtime.toml; SDR++ is the server. |
| 4533 | 127.0.0.1:4533 |
OpenRoadCode SDR++ remote-control module | Higher-level SDR++ UI/application control | TCP | OpenRoadCode line-oriented UTF-8 command/response protocol | No direct unit test located | Dedicated SDR++ remote-control endpoint. |
| 4534 | 127.0.0.1:4534 |
OpenRoadCode SDR++ telemetry module | Read-only signal/SNR, VFO, FFT and display telemetry | TCP | OpenRoadCode SDR++ telemetry protocol | No direct listener unit test located | Client default in protocols/sdrpp_telemetry/client.py; optional telemetry does not own tuning/control. |
| 5000 | 0.0.0.0:5000 |
apps/webUi |
Main OpenRoadCode web frontend | TCP | HTTP (Flask) | No direct unit test located | Current apps/webUi/main.py default; override with OPENROADCODE_WEB_HOST / OPENROADCODE_WEB_PORT. |
| 5556 | tcp://0.0.0.0:5556 broker bind; clients normally use tcp://127.0.0.1:5556 |
OpenRoadCode ZeroMQ broker | Broker ingress for application/service publishers | TCP | ZeroMQ XSUB | No direct unit test located | Current message-bus publisher endpoint. The broker owns the listening socket; producers connect. |
| 5557 | tcp://0.0.0.0:5557 broker bind; clients normally use tcp://127.0.0.1:5557 |
OpenRoadCode ZeroMQ broker | Broker egress for subscribers | TCP | ZeroMQ XPUB | No direct unit test located | Current message-bus subscriber endpoint. The broker owns the listening socket; applications and the map renderer connect. |
| 5560 | tcp://127.0.0.1:5560 |
Navigation producer service | Acknowledged navigation command endpoint | TCP | ZeroMQ request/reply, JSON | command transport | Current services.navigation.command_endpoint default; includes route start/cancel and local simulation. Wire semantics: Navigation command IDD. |
| 5902 | *:5902 for default display :2 |
VNC server launched by scripts/runtime/start_vnc_server.sh |
Remote graphical desktop | TCP | RFB / VNC | No direct unit test located | Optional development/runtime utility. Port is 5900 + DISPLAY_NUM; the script defaults to display 2 and explicitly permits non-localhost connections. |
| 8002 | http://127.0.0.1:8002 |
Valhalla service | Offline route-planning API | TCP | HTTP / Valhalla JSON API | No direct unit test located | Current navigation route-planning default in config/runtime.toml. |
| 8081 | 127.0.0.1:8081 |
tar1090 presentation server | ADS-B aircraft web presentation | TCP | HTTP | No direct unit test located | Termux/runit default. TAR1090_PORT can override it. |
| 8501 | 127.0.0.1:8501 client URL |
Weather dashboard / Streamlit | Weather dashboard web application | TCP | Streamlit HTTP/WebSocket | No direct unit test located | Default in WeatherDashLauncher / StreamlitLauncher. Streamlit owns the server process. |
| 8765 | 127.0.0.1:8765 |
Browser position development source | Browser-provided geographic position ingress for development and component testing | TCP | HTTP + JSON | browser position source; position source factory | Navigation service composition uses OPENROADCODE_BROWSER_POSITION_HOST / OPENROADCODE_BROWSER_POSITION_PORT; legacy CarUi composition also supports CARUI_BROWSER_POSITION_HOST / CARUI_BROWSER_POSITION_PORT. Enable one owner per endpoint. |
| 8766 | http://127.0.0.1:8766 for same-device Termux; Android device LAN address when remote sensor access is enabled |
OpenRoadCode Android sensor bridge | Android location/IMU sensor data plane consumed by an OpenRoadCode navigation runtime | TCP | HTTP + JSON/NDJSON (/health, /imu, /location, /stream/imu) |
No direct unit test located | The Android device owns the listener. Same-device Termux uses loopback. A paired remote Linux runtime may consume the Android device on port 8766 when Navigation selects the Android Bridge profile. |
| 8767 | 127.0.0.1:8767 |
Navigation BrowserMotionSource |
Browser DeviceMotion development input | TCP | HTTP + JSON | No direct unit test located | Dedicated browser-motion development/component port. |
| 8770 | 127.0.0.1:8770 |
ORC music-video player | Music-video player UI | TCP | HTTP | — | Reserved for music video; do not use for Android host actions. |
| 8771 | 127.0.0.1:8771 |
Spotify web player | Local Spotify player UI | TCP | HTTP | — | Reserved for the Spotify web player. |
| 8772 | 127.0.0.1:8772 |
Android Bridge host actions | Launch POI apps and open websites | TCP | HTTP, form-encoded POST | apps/launchers/unit_test/test_android_host_action_client.py |
Same-device Termux uses /health, /launch/package, and /open/uri. Requires the bridge host-actions branch with port 8772. |
| 8768 | 127.0.0.1:8768 |
YouTubeMusicVideo local player server |
Serves the temporary local YouTube player page and close callback | TCP | HTTP | No direct unit test located | Dedicated transient music-video player port; listener exists only while playback is active. |
| 8769 | 0.0.0.0:8769 on remotely managed Linux runtimes |
OpenRoadCode service manager | Authenticated runtime control plane for pairing, service status/lifecycle, and runtime-profile configuration | TCP | HTTP + JSON | systemd service-manager HTTP | Android Bridge is a management client. Remote binding requires the service-manager bootstrap token; paired clients receive their own bearer credential. This is control/configuration traffic, not sensor telemetry. |
| 8888 | 127.0.0.1:8888/callback |
OpenRoadCode OAuth redirect server | Local browser OAuth callback, including Spotify authentication | TCP | HTTP / OAuth 2.0 loopback redirect | No direct unit test located | Transient authentication listener rather than a long-lived service. |
| 35000 | 127.0.0.1:35000 |
OpenRoadCode Android Bluetooth SPP bridge | Raw ELM327 stream consumed by the Termux automotive service | TCP | Raw TCP carrying ELM327 ASCII command/response data | No direct unit test located | Current Termux automotive default. Android owns the Bluetooth SPP connection; OpenRoadCode consumes the proxied stream. |
No direct unit test located means the repository audit did not identify a unit test that directly exercises that listener or port. It does not mean the owning subsystem has no unit, integration, or component-test coverage. Links in this column deliberately point only to unit tests that directly cover the documented interface rather than merely testing nearby code.
Weather tile listener and route playback
RadarTileService binds 127.0.0.1 with port 0: the operating system assigns an
available ephemeral TCP port. It serves HTTP PNG tiles for observed radar, HRRR
forecast radar, and HRRR temperature/wind fields through URLs supplied in map
commands. There is no fixed weather tile port to reserve or expose on the LAN.
The owning weather composition closes the listener during cleanup. Coverage:
radar tile service tests.
Route simulation introduces no listener or bridge endpoint. Clients use the existing navigation command service on 5560; ORC switches delivered positions inside the navigation service while Android’s 8766 listener continues reporting real GPS. Weather provider HTTPS requests remain outbound third-party traffic, outside this port registry. Radar, model fields, route forecasts, and city weather have independent visibility controls.
Port ownership rules
A fixed port is part of an interface contract even when it is bound only to loopback. New cross-process listeners and fixed remote endpoints should therefore be added to this registry in the same change that introduces them.
The process that binds a listening socket is the port owner. Clients should consume the owning subsystem’s configured endpoint rather than quietly inventing a second default. When a third-party process is the server, such as gpsd, Valhalla, SDR++, Streamlit, or VNC, the Owner column names that process while the notes identify the OpenRoadCode configuration that depends on it.
Loopback-only defaults should remain loopback-only unless remote access is an intentional, reviewed part of the design. 0.0.0.0 / wildcard listeners deserve particular care because they can be reachable from the vehicle LAN or another connected network depending on host firewall and routing policy.
Local application port allocation
The adjacent 8765-8769 range is intentionally allocated by function so independently enabled components do not compete for a socket:
8765- browser position development source;8766- Android sensor bridge;8767- navigation browser motion source; and8768- YouTube music-video local player; and8769- OpenRoadCode service-manager control plane.
These defaults may still be overridden where the owning component exposes configuration, but a new component must not reuse one of these defaults simply because it happens not to be running during development. That particular form of optimism is how the original collision arrived.
Source-of-truth locations
The principal code/configuration locations behind this registry are:
config/runtime.tomlconfig/runtime.termux.tomlmessaging/zeromq/endpoints.pyservices/navigation/endpoints.pyservices/navigation/navigation_service_cli.pyservices/navigation/browser_motion_source.pyapps/carUi/runtime/browser_position_source.pyapps/webUi/main.pyapps/launchers/weather_dash_launcher.pyapps/launchers/streamlit_launcher.pydevelopment/termux/setup_tar1090.shscripts/runit/openroadcode-adsb/runscripts/runtime/start_vnc_server.shprotocols/rigctl/protocols/oauth/hardware_io/android/hardware_io/automotive/elm327/elm327_tcp_device.pycontrollers/video/youtube_music_video.pyprotocols/sdrpp_remote_control/client.pyprotocols/sdrpp_telemetry/client.pycontrollers/weather/radar_tile_service.py
When code and this document disagree, treat the mismatch as a documentation defect or an undocumented interface change and reconcile both in the same pull request.