Launching the Wireframe server

Updated Jul 27, 2026
  • Build the sqlite variant with make APP=mxd-wireframe-server sqlite or the postgres variant with make APP=mxd-wireframe-server postgres. The targets reuse the shared CLI module, so both binaries honour the same flags, environment overrides, and .mxd.toml defaults.
  • Start the daemon with cargo run --bin mxd-wireframe-server -- --bind 0.0.0.0:6600 --database mxd.db. The binary prints mxd-wireframe-server listening on … after the Wireframe listener binds.
  • Administrative subcommands such as create-user remain available because the bootstrap calls mxd::server::run_command before starting the listener.
  • The Wireframe listener now decodes the Hotline 12-byte handshake preamble, uses the upstream preamble hooks to send the 8-byte reply (0 on success, 1 for invalid protocol, 2 for unsupported version, 3 for handshake timeout), drops idle sockets after the five-second handshake timeout before routing, and records the negotiated sub-protocol ID and sub-version in per-connection state. The metadata stays available for the lifetime of the connection, so compatibility shims can branch on client quirks, and it is cleared during teardown to avoid leaking between sessions. The transaction framing adapter keeps Hotline's native multi-fragment wire contract while configuring explicit inbound Wireframe budgets for one full logical request (20-byte header plus up to 1 MiB of payload). Fragmented requests above that cap are disconnected. If a client pauses a fragmented request for more than five seconds and then resumes it, the server closes the connection instead of routing the partial request. Valid fragmented requests that stay within the cap continue to route normally. Routing error replies preserve transaction IDs and types when a header is available, and routing failures are logged through the existing tracing infrastructure with transaction context.
  • The wireframe adapter automatically detects clients that XOR-encode text fields (for example, SynHX with the encode toggle enabled). Once detected, inbound payloads are decoded and outbound replies are encoded to match the client, without any additional configuration.
  • Login reply compatibility now depends on client metadata. SynHX is detected via handshake sub-version 2 and receives only the server version field (160). Hotline 1.8.5 and 1.9 clients are identified by the login request's version field (160) and receive the banner fields 161/162 in addition to the server version.
  • Compatibility behaviour is unchanged by roadmap item 1.5.4; that milestone adds bounded Kani verification for XOR round-trips and login sub-version/version gating invariants.
  • Presence parity is now available in the wireframe server. After a successful login, users whose account carries the NO_AGREEMENT privilege are immediately visible to peers. Users who must accept the server agreement first become visible only after sending the Agreed transaction (121) and the session reaches Online. Get User Name List (300) and Notify Change User (301) are emitted only once the session is Online. Once online, Notify Delete User (302), Get Client Info Text (303), and Set Client User Info (304) behave as before: disconnects remove the user, info lookup returns the visible name with blank info text, and session nickname/icon/options updates notify peers.
  • Internal release validation uses docs/internal-compatibility-matrix.md as the compatibility source of truth. Release-note QA sign-off must reference that matrix using the checklist in docs/release-notes-qa-sign-off.md.
  • WireframeRouter is the sole public routing entrypoint. It embeds a CompatibilityLayer that applies XOR decoding, login-version recording, and banner-field augmentation on every routed transaction. Compatibility hooks cannot be accidentally bypassed by new routes. No user-visible behaviour change.
  • Roadmap item 1.5.6 is complete: the guardrail routing entrypoint now wires AuthStrategy for login dispatch and LoginReplyAugmenter for login reply decoration. Default Hotline 1.8.5/1.9 and SynHX behaviour remains unchanged, so this is an internal architecture refactor rather than a user-visible protocol change.