Skip to content

ADR Process

An ADR captures one decision that had real alternatives: the context, the options weighed, the choice, and its consequences — so future maintainers (including us, later) don’t re-litigate or accidentally reverse it blind.

  1. Copy 0000-template.md → NNNN-short-slug.md (next free number), status proposed.
  2. Discuss in the PR; land it proposed if implementation must wait for evidence (spikes), or accepted when decided.
  3. Accepted ADRs are immutable. Changing course = a new ADR with Supersedes: NNNN (and the old one gains Superseded-by).
  4. Small reversible choices don’t need an ADR. Anything expensive to reverse — protocol shapes, licenses, platform commitments — does.
ADRTitleStatus
0001WebRTC + GStreamer for media transportaccepted
0002Ubuntu 24.04 / GStreamer 1.24 baselinesuperseded by 0022
0003Polyglot monorepoaccepted
0004Rust for the signaling serveraccepted
0005TS core + React bindings + demo splitaccepted
0006Desktop backend selectionaccepted
0007webrtcbin+FrameHub vs webrtcsinkproposed (M1 spike)
0008DataChannel topology & reliability classesaccepted
0009Privilege separation on the robotproposed
0010Devcontainer + compose + Xvfb robot-simaccepted
0011AGPL-3.0 open core + commercial licensingaccepted
0012Agent in C++accepted
0013WebSocket signaling with a transport seamaccepted
0014Astro + Starlight for the websiteaccepted
0015Backend integration: unified contract, sidecar + managed twinaccepted
0016SWUpdate as the OTA foundationsuperseded by 0035
0017libsoup-3 for agent networkingaccepted
0018Stream channel class (lossy binary frames)accepted
0019Agent process model — one process, two restartable planesaccepted
0020Vendor camera support ships as separately packaged GStreamer pluginsaccepted (desktop sentence superseded by 0021)
0021Desktop backends are in-tree runtime modules in separate packagesaccepted
0022Baseline bump to Ubuntu 26.04 LTS / GStreamer 1.28accepted
0023The network tunnel is a virtual interface, not forwarded socketsaccepted
0024fjarr-connect — a native operator client, data channels onlyaccepted
0025Four encoder families behind one adapter, and what each owes CIaccepted
0026Multicast crosses the tunnel, on the strength of its source — the destination rule made ROS 2 impossibleaccepted
0027The tunnel MTU is one SCTP chunk (1184) — every full-size packet at 1280 fragmented, and that is #28accepted
0028The desktop is reached through a session helper that hands the agent descriptorsaccepted
0029Robot files as a drive, through a WebDAV bridge in fjarr-connectaccepted
0030Several operators on one robot’s tunnel, from a small pool of operator addressesaccepted
0031Distribution: apt and containers first, from one build, with a system profileaccepted
0032Ghost screens are forced connectors on free root connectors; virtual monitors stay per sessionaccepted
0033The desktop is tested on headless mutter in CI and on shared lab machines at night (fjarr-lab)accepted
0034An X11 kiosk’s sound reaches the agent through its session program, narrowed to the speakers as on GNOMEaccepted
0035Fjarr orchestrates releases; the OS-slot engine is a narrow adapter per recipe (supersedes 0016)accepted
0036A release is one signed version pinning every component; company-held keys, a Fjarr-managed easy startaccepted
0037Release content travels as resumable HTTPS chunks under a per-robot budget, not over WebRTCaccepted
0038The reference peripheral handlers are MIT, an exception to ADR-0011, so customers can fork themaccepted
0039The Ubuntu A/B image on x86 writes slots with systemd-sysupdate and boots through systemd-boot’s counting; RAUC with GRUB was the comparisonsuperseded by 0040
0040The Ubuntu A/B image on x86 writes slots with SWUpdate and boots through EFI Boot Guard, one engine with the Jetson recipeaccepted
0041Module E captures physical monitors as DMA-BUF and hands them to VA without a copy, shared memory as the fallback, because SHM streams freeze behind a directly scanned-out windowaccepted