IronRDP

A meta crate bundling Rust implementations of the Microsoft Remote Desktop Protocol for building RDP clients and servers.

Library
Cargo
v0.17.0
3,124stars
Apache License 2.0

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum.How we score it →
85/100Excellent
Development Activity100
Maintenance72
Community68
Maturity60
Momentum40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation.How we score it →
81/100Excellent
Architecture90
Code Quality84
Innovation80
Learning Curve70

IronRDP is a from-scratch Rust implementation of the Microsoft Remote Desktop Protocol (RDP), organized as a workspace of small, focused crates (PDU parsing, connection sequencing, session handling, graphics decoding, clipboard/device redirection, and more). The ironrdp crate itself is a meta/facade crate that re-exports the individual sub-crates behind feature flags, so consumers can pull in exactly the protocol surface they need without depending on a dozen separate crate names.

The project targets security-sensitive environments and is used in production by Devolutions and Teleport to power browser- and native-based RDP clients and gateways. It emphasizes #![no_std]-friendly core crates, fuzzing on protocol decoders, and a strict layered architecture (core primitives, protocol PDUs, connector/session state machines, and I/O adapters) documented in an explicit ARCHITECTURE.md.

What You Get

  • A meta crate (ironrdp) that re-exports feature-gated sub-crates (core, pdu, connector, session, acceptor, client, server, cliprdr, graphics, input, and more) so you opt into only what you need.
  • PDU parsing/serialization for the RDP wire protocol built as #[no_std]-compatible, fuzzed core crates with strict no-I/O architectural invariants.
  • Both client and server building blocks: a connector/acceptor state machine, an async or blocking session driver, and an ironrdp-server crate for building your own RDP host.
  • Virtual channel extensions out of the box: clipboard redirection (cliprdr), device redirection (rdpdr), sound (rdpsnd), dynamic virtual channels (dvc), and display control.
  • Working example binaries (screenshot, server) and a full ironrdp-viewer/ironrdp-client reference implementation showing how the crates compose into a real client.

Common Use Cases

  • Embedding an RDP client into a Rust application (desktop, web-via-WASM, or headless automation) without shelling out to FreeRDP.
  • Building a custom RDP gateway or server that terminates RDP sessions and forwards graphics/input over another transport.
  • Automating remote-desktop screenshots or input injection for testing, monitoring, or bot-driven workflows.
  • Adding remote-desktop connectivity to a remote-access product, similar to how Devolutions and Teleport use it in their own gateways.

Under The Hood

Architecture: IronRDP is organized as a Cargo workspace of dozens of crates under crates/, layered into a “Core Tier” (no-I/O, #[no_std]-friendly, fuzzed primitives like ironrdp-core and ironrdp-pdu), a connector/session tier (ironrdp-connector, ironrdp-acceptor, ironrdp-session) implementing the RDP handshake and session state machines, and an I/O tier (ironrdp-async, ironrdp-blocking, ironrdp-futures) that adapts the state machines to real sockets. The ironrdp crate at crates/ironrdp/src/lib.rs is a pure re-export facade: each optional Cargo feature (core, pdu, connector, session, cliprdr, server, etc.) gates a pub use of the corresponding sub-crate, so the public API surface is effectively the union of the sub-crates a consumer opts into. This is documented explicitly in ARCHITECTURE.md, which enumerates “Architectural Invariants” per tier (e.g., core crates may not perform I/O, must be fuzzed, must avoid non-essential dependencies).

Tech Stack: Rust 2024 edition, MSRV 1.89 pinned via rust-toolchain.toml. The workspace depends on tokio/futures for async I/O adapters, rustls or native-tls as pluggable TLS backends (mutually exclusive features), sspi for NTLM/Kerberos network authentication, and image for the example screenshot output. A web-client directory and TypeScript/Svelte crates (iron-remote-desktop) provide a WASM-based browser client built on the same Rust core, and ffi/ exposes a C-compatible surface for non-Rust consumers.

Code Quality: Sub-crates like ironrdp-pdu carry dense tests.rs modules alongside their protocol structures (session_info, server_license, vc, bitmap, fast_path, surface_commands), and a dedicated fuzz/ directory defines over a dozen fuzz targets (PDU round-trip, bulk compression variants, cliprdr format handling, egfx round-trip) reflecting the project’s stated invariant that core/protocol crates must be fuzzed. release-plz.toml and per-crate CHANGELOG.md files indicate an automated, changelog-driven release process; clippy.toml/rustfmt.toml/typos.toml enforce consistent style workspace-wide.

API Design: The meta-crate pattern (ironrdp::core, ironrdp::connector, ironrdp::session, etc. behind features) keeps the default dependency footprint small (default = ["core", "pdu"]) while letting consumers scale up to a full client or server by enabling more features, avoiding the need to depend on internal crate names directly. This trades a small amount of indirection (features must be discovered) for a single, stable top-level crate name and semver surface, and the two runnable examples (screenshot, server) demonstrate the minimum feature combination needed for common client and server scenarios.

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers

Search