Legacy profile and migration
Older Freedome apps (flutter_freedome 1.x / 3.x, react-native-freedome, razvivalka, churyavzrosliy, Manager v3 / v4)
speak older protocols. With [legacy] enabled = true (default in 1.x, off from 2.0) the server also serves:
- socket.io default namespace
/with the old event names (command→command_response,getState,setState,sendOsc,brightness,volume,rotation,dome-state,integration-event,clear-integration), and optionally the fixed port 3000 ([legacy] listen_3000); - legacy REST paths:
/api/dome/info,/api/dome/status,/api/system/*,/api/vendor/*,POST /api/command, the Manager v4/api/{status,play,pause,stop,brightness,volume,rotation,…}set, Manager WS/ws; - legacy OSC aliases (see OSC).
Each legacy message is translated to one native operation (same scopes). Legacy clients authenticate with a
pairing token (auth.token / ?token=) or fall into the guest policy ([auth] legacy_guest,
[legacy] guest_playback_control). Legacy 0..100 values are scaled to 0..1. Unknown message types answer
legacy-unsupported: <type> — nothing is silently ignored. Every legacy hit is counted in
freedome_mediaserver_legacy_requests_total{client,message} so you can see which old clients are still in use.
socket.io v2 clients are not supported.
Migration: move apps to the SDKs (freedome_client for Dart, @freedome/client for TypeScript), which use the
native API (/api/v1, socket.io /v1, WebSocket freedome.v1). Discovery: mDNS _freedome._tcp + GET /api/v1/info
instead of port scans. The contract repo has the full mapping table and replay fixtures (compat/legacy/).