Skip to content

Renderd v0.8.0-viewer

Pre-release
Pre-release

Choose a tag to compare

@Ad1th Ad1th released this 05 Aug 21:29
· 239 commits to main since this release

All 8 milestones complete. Pre-release hardening and end-to-end integration in progress.
Note: renderd-host and renderd-viewer initialize their respective subsystems and run
loops successfully. End-to-end streaming between host and viewer is not yet integrated
— the components are implemented individually and tested in isolation. Full pipeline
integration is planned for v1.0.


Milestone 8 complete: Viewer Application (renderd-viewer).

  • Scaffolded renderd-viewer application with native winit event loop, borderless
    fullscreen window management, and Per-Monitor v2 DPI awareness on Windows. (#89)
  • Implemented DXGI Allow-Tearing feature check (check_tearing_support()) for safe swap
    chain creation. (#90)
  • Implemented D3D12 swap chain and renderer with YUV-to-RGB HLSL pixel shader and
    conditional DXGI_PRESENT_ALLOW_TEARING presentation. (#91)
  • Implemented ID3D12VideoDecoder hardware H.265/H.264 video decoder integration with
    GPU VRAM surface output. (#92)
  • Implemented QUIC datagram receiver and sliding-window ReassemblyWindow task forwarding
    completed frames to the decoder. (#93)
  • Implemented DWM vsync phase reporter querying DwmGetCompositionTimingInfo and
    transmitting VsyncReport over QUIC Stream 0. (#94)
  • Implemented dual-timescale ABR feedback exporter: ReactiveStats at 100 ms,
    PeriodicStats at 500 ms, and immediate KeyframeRequest on loss. (#95)
  • Implemented viewer pairing UI with SPAKE2+ prover handshake over QUIC Stream 0,
    storing derived PairToken in Windows Credential Manager on success. (#96)
  • Implemented reconnect watchdog with mDNS re-discovery filtering by stored host_uuid
    for automatic recovery on host IP change. (#97)
  • Implemented semi-transparent Reconnecting... status UI overlay during disconnect
    state without closing window. (#98)
  • Implemented Windows system tray icon via Shell_NotifyIcon with context menu:
    "Connect to Host...", "Settings", "Disconnect", "Exit". (#99)
  • Added Windows viewer release packaging CI workflow on windows-2025 runner
    (release-viewer.yml) producing standalone installer artifact. (#100)
  • Wired HostApp::run() with full subsystem initialization (capture, encode, clock,
    ABR, session, network, UI) and persistent SIGINT/SIGTERM signal handler loop
    replacing placeholder print-and-exit entrypoint. (#101)

Milestone 7 complete: Host Application (renderd-host).

  • Scaffolded renderd-host application crate with Info.plist, entitlements, and macOS
    app bundle layout. (#76)
  • Added macOS app bundle packaging script (tools/bundle-host/assemble.sh). (#77)
  • Implemented app startup, CLI argument parsing, Figment config loading, and structured
    panic hook via tracing-subscriber. (#78)
  • Implemented macOS login item auto-start using SMAppService.mainApp with enable,
    disable, and status query. (#79)
  • Implemented HostSession state machine (IDLE → PAIRING → CONNECTED → STREAMING)
    with typed SessionError transitions. (#80)
  • Implemented pairing handler with 6-digit PIN generation, SPAKE2+ verifier protocol,
    exponential failure lockout, and keychain storage. (#81)
  • Implemented DeviceRegistry for paired viewer listing and keychain revocation. (#82)
  • Implemented CapturePipeline and EncodePipeline wiring ScreenCaptureKit frames
    directly to VideoToolbox encoder via lock-free SPSC ring buffer. (#83)
  • Implemented datagram burst sender task fragmenting NAL units and sending non-yielding
    QUIC datagram bursts per frame. (#84)
  • Connected ClockController and AbrManager to host control loop processing
    VsyncReport, ReactiveStats, and PeriodicStats messages. (#85)
  • Implemented macOS menu bar UI with status icon, pairing PIN display, paired device
    list, and quit action via MenuBar. (#86)
  • Implemented NotificationManager posting macOS user notifications on session start
    and device pairing events. (#87)
  • Added host release packaging CI workflow (release-host.yml) with code signing,
    notarization, stapling, and DMG artifact creation. (#88)

Milestone 6 complete: Algorithm Layer (ABR & Clock Sync).

  • Scaffolded renderd-abr crate with pure RampPolicy step-up/step-down bitrate math
    clamped to [5 Mbps, 50 Mbps]. (#64)
  • Implemented BandwidthEstimator exponential moving average filter for receive bandwidth
    samples. (#65)
  • Implemented AbrEngine dual-timescale state machine: reactive (100 ms, loss-triggered)
    and proactive (500 ms, bandwidth-degradation) bitrate adjustment. (#66)
  • Added proptest property tests asserting AbrEngine bitrate decisions remain in
    configured bounds for arbitrary inputs. (#67)
  • Added Criterion benchmark for on_reactive and on_proactive ABR decision calls. (#68)
  • Scaffolded renderd-clock crate with ClockOffset::compute() for host/viewer clock
    domain translation using QUIC RTT. (#69)
  • Implemented JitterFilter median-window outlier rejection for vsync phase reports. (#70)
  • Implemented ClockSync state machine with 30-frame warmup, phase tracking, and
    capture pacing output. (#71)
  • Added proptest property tests asserting pacing interval is bounded in [8 ms, 33 ms]. (#72)
  • Added Criterion benchmark for on_vsync_report and next_capture_time. (#73)
  • Created tools/latency-bench CLI skeleton with --frames, --resolution, and
    --codec flag support. (#74)
  • Implemented pipeline microsecond stage telemetry with p50/p95/p99/max latency
    reporting across all pipeline stages. (#75)

Milestone 5 complete: Service Layer (Net, Keychain & Discovery).

  • Implemented ServerTlsConfig and ClientTlsConfig with strict mutual TLS 1.3 and
    pinned certificate verification in renderd-net. (#48)
  • Implemented QuicServer and QUIC connection listener in renderd-net. (#49)
  • Implemented QuicClient with QUIC connection initiation and TLS handshake in
    renderd-net. (#50)
  • Implemented 4-byte length-prefixed control stream framing (send_control /
    recv_control) in renderd-net. (#51)
  • Implemented non-yielding FragmentBurst::send_all() datagram burst sender in
    renderd-net. (#52)
  • Implemented RTT telemetry exporter via quinn::ConnectionStats in renderd-net. (#53)
  • Scaffolded renderd-keychain crate with KeychainStore trait and PairingEntry
    struct. (#54)
  • Implemented macOS Keychain Services backend (MacosKeychain) using
    kSecClassGenericPassword. (#55)
  • Implemented Windows Credential Manager backend (WindowsCredentialManager) using
    CredWrite / CredRead / CredDelete. (#56)
  • Implemented MockKeychain in-memory store for headless testing. (#57)
  • Scaffolded renderd-discovery crate with Advertiser and Browser traits and
    ServiceRecord struct. (#58)
  • Implemented macOS Bonjour discovery backend using dns_sd.h bindings. (#59)
  • Implemented Windows Win32 mDNS backend using DnsServiceRegister / DnsServiceBrowse. (#60)
  • Implemented ManualBrowser static IP fallback for corporate network environments. (#61)
  • Implemented DiscoveryError hierarchy (BindFailed, ServiceRegistrationFailed,
    BrowseFailed). (#62)
  • Implemented MockConnection in-memory transport for integration testing. (#63)

Milestone 4 complete: FFI Layer (VideoToolbox & ScreenCaptureKit shims).

  • Scaffolded renderd-vt-sys crate with build.rs linking VideoToolbox, CoreMedia, and
    CoreFoundation frameworks. (#36)
  • Implemented renderd_VTCompressionSessionCreate C bridge shim for Rust FFI callback
    compatibility. (#37)
  • Implemented CompressionSession safe Rust wrapper with H.265 real-time hardware encoder
    initialization and Drop cleanup. (#38)
  • Implemented dynamic bitrate control (set_bitrate) and force-keyframe trigger in
    CompressionSession. (#39)
  • Implemented IOSurface Rust wrapper with CFRetain/CFRelease lifetime management. (#40)
  • Implemented VtError OSStatus decoder with human-readable error messages. (#41)
  • Scaffolded renderd-sc-sys crate with ObjC2 ScreenCaptureKit framework imports. (#42)
  • Implemented ScreenRecordingPermission::check() TCC authorization query. (#43)
  • Implemented ContentFilter::main_display() display enumeration and selection. (#44)
  • Implemented ScreenStream wrapper with GPU-resident frame callback on
    QOS_CLASS_USER_INTERACTIVE GCD queue. (#45)
  • Implemented dynamic minimumFrameInterval vsync pacing controls on ScreenStream. (#46)
  • Implemented ScError hierarchy (PermissionDenied, NoDisplaysFound,
    StreamFailed). (#47)

Milestone 3 complete: Primitive Layer (Frame & Crypto).

  • Added 16-byte fixed binary fragment header codec (FragmentHeader) in renderd-frame
    crate per RFC-0002 §12.1. (#23)
  • Added type-safe fragment header bitfield flags (FragmentFlags) in renderd-frame
    crate. (#24)
  • Added Fragment and CompleteFrame types in renderd-frame crate. (#25)
  • Added sliding-window fragment reassembly buffer state machine (ReassemblyWindow) in
    renderd-frame crate per RFC-0002 §12.2. (#26)
  • Added dynamic fragment deadline computer (DeadlineComputer) in renderd-frame. (#27)
  • Added proptest property tests for reassembly window safety under arbitrary reordering. (#28)
  • Added Criterion benchmark for reassembly window throughput. (#29)
  • Scaffolded renderd-crypto crate with PairToken and SessionKey types with
    Zeroize on drop. (#30)
  • Added RFC 9382 SPAKE2+ test vectors as unit test suite. (#31)
  • Implemented SPAKE2+ Prover and Verifier state machines for P-256 pairing. (#32)
  • Implemented HKDF-SHA256 key derivation helpers (derive_pair_token,
    derive_session_key) with canonical info strings. (#33)
  • Implemented TLS certificate generator (generate_cert) using rcgen with pair token
    derived key material. (#34)
  • Added Criterion benchmarks for crypto operations (derive_pair_token,
    generate_cert). (#35)

Milestone 2 complete: Foundation Layer.

  • Added Protobuf protocol schema definition in proto/renderd.proto per RFC-0002 §11.
    (#13)
  • Added tools/proto-gen code generator and generated prost Rust types in
    renderd-proto crate. (#14)
  • Added protocol domain newtypes (FrameId, FragmentId, BitrateKbps,
    VsyncPeriodNs, ViewerId, HostId) in renderd-proto crate. (#15)
  • Added envelope dispatch helpers (MessageKind) and message validation logic for
    SessionHello and SessionConfig in renderd-proto crate. (#16)
  • Enabled proto freshness CI check step in .github/workflows/ci.yml. (#17)
  • Added configuration schema structs (RenderdConfig, HostConfig, ViewerConfig,
    NetworkConfig, CryptoConfig, AbrConfig) in renderd-config crate. (#18)
  • Added Figment-based layered config loader (ConfigBuilder) supporting defaults, TOML
    files, environment variables, and CLI overrides in renderd-config crate. (#19)
  • Added configuration validation rules (ValidateConfig trait) for RenderdConfig in
    renderd-config crate. (#20)
  • Added ConfigError enum hierarchy (FileNotFound, ParseError, ValidationError)
    and Display implementations in renderd-config crate. (#21)
  • Added canonical host and viewer default configuration templates
    (renderd-host.default.toml, renderd-viewer.default.toml) and template validation
    integration tests. (#22)

Milestone 1 complete: Repository Bootstrap & Infrastructure.

  • Initialized Cargo workspace root with resolver v2 and declared all 15 member crates
    across 5 DAG layers (crates/renderd-*, tools/latency-bench, tools/proto-gen)
    per REPO-0001. (#1)
  • Added rust-toolchain.toml pinning Rust stable channel (MSRV 1.80) with
    aarch64-apple-darwin, x86_64-pc-windows-msvc, and aarch64-pc-windows-msvc
    target support. (#1)
  • Configured workspace-level dependency versions, lint policies, and build profiles
    (dev, release, bench). (#1)
  • Configured workspace-level clippy.toml setting msrv = \"1.80\", disallowing
    std::process::exit and std::env::var, and restricting raw array pair-tokens.
    (#2)
  • Added per-crate lint overrides: unsafe_code = \"deny\" for non-FFI crates;
    unsafe_code = \"warn\" for FFI crates (renderd-vt-sys, renderd-sc-sys) per
    REPO-0001 §9. (#2)
  • Added root .rustfmt.toml workspace formatting configuration per REPO-0001 §10.
    (#3)
  • Configured cargo-deny policy in deny.toml for license checking, dependency bans,
    and security advisory checking per REPO-0001 §9. (#4)
  • Added test runner configuration in nextest.toml per REPO-0001 §14.7. (#5)
  • Added primary CI workflow in .github/workflows/ci.yml per REPO-0001 §18.1. (#6)
  • Added security audit workflow in .github/workflows/security.yml per
    REPO-0001 §18.2. (#7)
  • Added nightly benchmark workflow in .github/workflows/bench.yml per
    REPO-0001 §18.3. (#8)
  • Added code ownership rules in .github/CODEOWNERS per REPO-0001 §7.1. (#9)
  • Added PR template and GitHub Issue forms for bug reports, latency regressions, and
    feature requests. (#10)
  • Added spell-checking configuration in _typos.toml and
    .github/workflows/typos.yml. (#11)
  • Added documentation deployment workflow in .github/workflows/docs.yml per
    REPO-0001 §18.5. (#12)