Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
326 commits
Select commit Hold shift + click to select a range
7426072
build(deps): bump clap from 4.5.52 to 4.5.53 in the patch group acros…
dependabot[bot] Nov 25, 2025
cca323a
ci: migrate iron crates to trusted publishing (#1042)
Sylfwood Nov 26, 2025
bca6d19
fix(ironrdp-async)!: use static dispatch for NetworkClient trait (#1043)
CBenoit Dec 3, 2025
b303ae3
build(deps): bump criterion from 0.7.0 to 0.8.0 (#1045)
dependabot[bot] Dec 3, 2025
cf97832
build(deps): bump the patch group across 1 directory with 6 updates (…
dependabot[bot] Dec 3, 2025
9243301
chore: enable `large_futures` clippy lint (#1046)
RRRadicalEdward Dec 3, 2025
a2af587
fix(cliprdr): prevent window class registration error on multiple ses…
thenextman Dec 4, 2025
da5db5b
chore(release): prepare for Devolutions.IronRdp v2025.12.4.0 (#1048)
thenextman Dec 4, 2025
632ad86
chore: bump iOS nuget package to net9.0 (#1049)
thenextman Dec 4, 2025
7123150
fix(ffi): preserve full error context across FFI boundary (#1050)
CBenoit Dec 5, 2025
f31af06
build(deps): bump rstest from 0.25.0 to 0.26.1 (#1052)
dependabot[bot] Dec 9, 2025
0903c9a
build(deps): bump the patch group across 1 directory with 4 updates (…
dependabot[bot] Dec 9, 2025
d587b0c
fix(cliprdr): allow servers to announce clipboard ownership (#1053)
glamberson Dec 11, 2025
113284a
build(deps): bump uuid from 1.18.1 to 1.19.0 (#1056)
dependabot[bot] Dec 16, 2025
b50b648
build(deps): bump the patch group across 1 directory with 3 updates (…
dependabot[bot] Dec 16, 2025
bd2aed7
feat(ironrdp-tls)!: return x509_cert::Certificate from upgrade() (#1054)
willwwarner Dec 18, 2025
87f8d07
chore(release): prepare for publishing (#1020)
devolutionsbot Dec 20, 2025
22bea60
build(deps): bump the patch group across 1 directory with 4 updates (…
dependabot[bot] Jan 7, 2026
35e8753
chore: clean up workflow config and remove unused npm dependencies (#…
CBenoit Jan 7, 2026
81e2465
refactor: temporarily restore public Error fields for crate publishin…
CBenoit Jan 13, 2026
72ed6f2
fix(server): enable reqwest feature for ironrdp-tokio dependency (#1063)
glamberson Jan 13, 2026
313e7d6
build(deps): bump sspi from 0.18.5 to 0.18.6 in the patch group acros…
dependabot[bot] Jan 13, 2026
71245d5
build(deps): bump cpal from 0.16.0 to 0.17.1 (#1071)
dependabot[bot] Jan 13, 2026
58c3df8
feat(cliprdr): add clipboard data locking methods (#1064)
glamberson Jan 13, 2026
e51ed23
fix(ironrdp-error): make fields of Error private (#1074)
CBenoit Jan 13, 2026
c30fc35
feat(cliprdr): add request_file_contents method (#1065)
glamberson Jan 13, 2026
25f8133
feat(cliprdr): add SendFileContentsResponse message variant (#1066)
glamberson Jan 13, 2026
d202d05
chore: set protect_breaking_commits = true in release-plz.toml (#1072)
CBenoit Jan 13, 2026
790669b
revert: set protect_breaking_commits = true in release-plz.toml (#1078)
CBenoit Jan 16, 2026
bedff7e
build(deps): bump sspi from 0.18.6 to 0.18.7 (#1079)
CBenoit Jan 19, 2026
5680b59
build(deps): bump the patch group across 1 directory with 6 updates (…
dependabot[bot] Jan 20, 2026
b099279
build(deps): bump whoami from 1.6.1 to 2.0.2 (#1081)
dependabot[bot] Jan 20, 2026
e92135d
build(deps): bump nix from 0.30.1 to 0.31.1 (#1085)
dependabot[bot] Jan 28, 2026
6afe86f
build(deps): bump time from 0.3.45 to 0.3.46 in the patch group acros…
dependabot[bot] Jan 28, 2026
50168c8
build(deps): bump uuid from 1.19.0 to 1.20.0 (#1087)
dependabot[bot] Feb 3, 2026
ebf5da5
feat(rdp): add bulk compression and wire negotiation
mamoreau-devolutions Feb 9, 2026
9c987bc
feat: Add DVC COM plugin loader for native Windows DVC client plugins
mamoreau-devolutions Feb 10, 2026
5a50f40
feat(pdu): add Initiate Multitransport Request/Response PDU types (#1…
glamberson Feb 12, 2026
4f5fdd3
feat(connector): advertise multitransport channel in GCC blocks (#1092)
glamberson Feb 12, 2026
300f9a3
feat(egfx): add MS-RDPEGFX Graphics Pipeline Extension (#1057)
glamberson Feb 12, 2026
a21378e
feat(svc): add SvcMessage::encode_unframed_pdu for headerless encodin…
glamberson Feb 12, 2026
a33d27f
feat(connector): add alternate_shell and work_dir configuration suppo…
cdelgehier Feb 12, 2026
3cf5707
feat(server): expose client display size to RdpServerDisplay (#1083)
zhaofengli Feb 12, 2026
5fa4964
feat(zgfx): add segment wrapping utilities (#1076)
glamberson Feb 13, 2026
7853e3c
feat(connector,session): dispatch multitransport PDUs on IO channel (…
glamberson Feb 13, 2026
4871548
feat(zgfx): add LZ77 compression support (#1097)
glamberson Feb 13, 2026
f7c545b
chore: add AGENTS.md with repository manual for AI coding agents (#1106)
mamoreau-devolutions Feb 17, 2026
1a6b420
Add pointer caching support to ironrdp-server
ramnes Feb 16, 2026
0cca23f
build(deps): bump the patch group across 2 directories with 13 update…
dependabot[bot] Feb 17, 2026
4ba696c
feat(server): add EGFX server integration with DVC bridge (#1099)
glamberson Feb 17, 2026
7586324
fix(session): fix pixel format handling in bitmap decoders (#1101)
ramnes Feb 17, 2026
b1b0289
perf(connector): reduce connection latency when Kerberos is disabled …
ramnes Feb 17, 2026
d437b7e
fix(server): make MultifragmentUpdate max_request_size configurable (…
glamberson Feb 18, 2026
6f6496a
feat: implement ECHO virtual channel (#1109)
mamoreau-devolutions Feb 18, 2026
482c5f5
ci: run apt-get update before installing devel packages (#1110)
glamberson Feb 18, 2026
e87fe30
chore(egfx): disable publishing for ironrdp-egfx crate (#1111)
CBenoit Feb 18, 2026
7ff2b13
refactor: remove echo feature flag and enable ECHO channel by default…
CBenoit Feb 18, 2026
39364db
test(echo): move echo tests to ironrdp-testsuite-core (#1114)
CBenoit Feb 18, 2026
4b6183d
refactor(dvc): use TypeId-keyed map for DVC channel ID lookup in Drdy…
CBenoit Feb 18, 2026
d0874d6
ci(coverage): install ALSA dev package on linux
mamoreau-devolutions Feb 18, 2026
2911124
feat(web): expose granular RDCleanPath error details (#1117)
gabrielbauman Feb 22, 2026
e406559
build(deps): bump uuid from 1.20.0 to 1.21.0 (#1119)
dependabot[bot] Feb 24, 2026
58ffb36
fix(glutin-renderer): upgrade openh264 0.4 to 0.6, switch to libloadi…
glamberson Feb 26, 2026
33410e0
feat(egfx): add ZGFX compression option to GraphicsPipelineServer (#1…
glamberson Feb 26, 2026
4262ae7
fix(session): handle row padding in uncompressed bitmap updates
glamberson Feb 26, 2026
d094cbe
fix(dvc): negotiate DVC version from server capabilities
glamberson Feb 26, 2026
485d6c2
fix(pdu): accept short Server Deactivate All PDU
glamberson Feb 26, 2026
db2f40b
fix(server): tile bitmaps that exceed `MultifragmentUpdate` limit (#1…
ramnes Mar 1, 2026
2b97a95
fix(session,server): skip bitmap updates that exceed bounds (#1146)
ramnes Mar 4, 2026
c4f87aa
fix(rdpdr): model CreateDisposition as enum instead of bitflags (#1145)
glamberson Mar 5, 2026
c2688f4
fix(pdu): correct ShareDataHeader uncompressedLength calculation (#1148)
glamberson Mar 5, 2026
353e30d
fix(pdu): replace all from_bits_truncate with from_bits_retain (#1144)
glamberson Mar 5, 2026
2b24e96
fix(connector,session): propagate negotiated share_id to all outgoing…
glamberson Mar 5, 2026
ff2b567
chore: bootstrap crate ironrdp-rdpeusb (#1151)
playbahn Mar 5, 2026
02b9f4e
fix(acceptor): send RDP_NEG_FAILURE on security protocol mismatch (#1…
glamberson Mar 6, 2026
79869f9
chore: upgrade toolchain to 1.89.0 and migrate to Rust edition 2024 (…
CBenoit Mar 9, 2026
c10e6ff
docs: establish the MSRV policy (current is 1.89) (#1157)
CBenoit Mar 9, 2026
eda32d8
feat(acceptor): expose received client credentials in AcceptorResult …
glamberson Mar 9, 2026
a67b1aa
feat: add ironrdp-str crate with typed wire-aware RDP string primitiv…
CBenoit Mar 10, 2026
9a1ac30
fix(web): disable clipboard polling loop on Firefox v127+ (#1162)
ymarcus93 Mar 11, 2026
28e8628
feat(dvc): add DvcChannelListener for multi-instance DVC support (#1142)
uchouT Mar 13, 2026
7fc3d8d
build(deps): bump the patch group across 1 directory with 11 updates …
dependabot[bot] Mar 13, 2026
2fe6fd0
fix(rdpsnd): handle AudioFormat renegotiation in Ready state (#1164)
Mota-Link Mar 16, 2026
6e5f08a
feat(pdu): add Auto-Detect Request and Response PDU types (#1168)
glamberson Mar 16, 2026
bf694c8
feat(egfx): add QoE statistics accumulation on GraphicsPipelineServer…
glamberson Mar 16, 2026
ed0c26c
build(deps): bump reqwest from 0.12.26 to 0.12.28 (#1171)
dependabot[bot] Mar 17, 2026
ecc0504
build(deps): bump the patch group across 1 directory with 3 updates (…
dependabot[bot] Mar 17, 2026
b6200c7
feat(egfx): add client-side EGFX with surface management and AVC420 d…
glamberson Mar 17, 2026
5e316bb
feat(egfx): add openh264 feature-gated H.264 decoder (#1104)
glamberson Mar 17, 2026
84015c9
fix(acceptor): skip credential check when server credentials are None…
glamberson Mar 17, 2026
306da0f
test(rdpsnd): add client state machine tests (#1169)
Mota-Link Mar 17, 2026
7f2f59a
fix(ffi): correct FfiClipbarodMessageProxy typo (#1173)
glamberson Mar 18, 2026
e5f2f36
feat(pdu)!: route auto-detect PDUs through ShareDataPdu dispatch (#1176)
glamberson Mar 18, 2026
c30d853
feat(server): make run_connection generic over stream type (#1181)
glamberson Mar 23, 2026
b588004
build(deps): bump the patch group across 1 directory with 2 updates (…
dependabot[bot] Mar 24, 2026
d92dd38
build(deps): bump criterion from 0.5.1 to 0.8.1 (#1184)
dependabot[bot] Mar 24, 2026
a6b4109
feat: complete pixel format support for bitmap updates (#1134)
glamberson Mar 25, 2026
9bb909e
docs: document iron-remote-desktop API design philosophy (#1192)
CBenoit Mar 31, 2026
2515470
feat(server): add auto-detect RTT measurement (#1177)
glamberson Mar 31, 2026
c70d38a
build: upgrade sspi to 0.19, picky to rc.22, fix NTLM fallback (#1188)
glamberson Mar 31, 2026
ea47bf8
feat(egfx): add send_uncompressed_frame for V8 clients (#1182)
glamberson Apr 1, 2026
4dcad09
feat(session): handle Auto-Detect Request PDUs from server (#1178)
glamberson Apr 1, 2026
f10625c
feat(server): IPv6 dual-stack and SO_REUSEADDR for run() (#1187)
glamberson Apr 1, 2026
49099f0
feat(pdu,graphics): add RemoteFX Progressive codec primitives (#1196)
glamberson Apr 2, 2026
e5ab222
feat(client): add --scale-desktop CLI option for display scaling fact…
manio Apr 2, 2026
1eaf333
build(deps): bump opus2 from 0.3.3 to 0.4.0 (#1204)
dependabot[bot] Apr 7, 2026
e60500d
ci: bump actions to node 24 compatible versions (#1206)
Sylfwood Apr 8, 2026
5c08c7f
feat(server): add ConnectionHandler trait for connection lifecycle ho…
glamberson Apr 8, 2026
9383380
feat(session): handle slow-path graphics and pointer updates (#1132)
glamberson Apr 9, 2026
c98a8fb
feat(cliprdr,web,ffi): implement clipboard file transfer support (#1166)
gabrielbauman Apr 9, 2026
1aa9af9
refactor(server): replace wildcard re-exports with explicit item list…
glamberson Apr 9, 2026
b50a934
build(deps): bump the patch group across 1 directory with 2 updates (…
dependabot[bot] Apr 9, 2026
6baf726
docs(dvc-com-plugin): add missing README.md to unblock crates.io publ…
gabrielbauman Apr 10, 2026
d3e673b
build(deps): bump tokio from 1.50.0 to 1.51.1 (#1219)
dependabot[bot] Apr 14, 2026
da4de97
build(deps): bump gloo-net from 0.6.0 to 0.7.0 (#1218)
dependabot[bot] Apr 14, 2026
53d814e
build(deps): bump gloo-timers from 0.3.0 to 0.4.0 (#1217)
dependabot[bot] Apr 14, 2026
d0e18e3
feat: improved RDP file support (#1220)
CBenoit Apr 15, 2026
9019707
build(deps): bump hyper from 1.8.1 to 1.9.0 (#1224)
dependabot[bot] Apr 21, 2026
8bf140f
build(deps): bump tokio from 1.51.1 to 1.52.1 (#1223)
dependabot[bot] Apr 21, 2026
3fe6d15
build(deps): bump the patch group across 1 directory with 2 updates (…
dependabot[bot] Apr 21, 2026
2fa7c64
fix(connector): advertise all colour depths per FreeRDP pattern (#1231)
CBenoit Apr 27, 2026
a5dab35
build(deps): bump rayon from 1.11.0 to 1.12.0 (#1235)
dependabot[bot] Apr 28, 2026
4282fb2
build(deps): bump the patch group across 1 directory with 3 updates (…
dependabot[bot] Apr 28, 2026
f6fa577
build(deps): bump tokio-tungstenite from 0.28.0 to 0.29.0 (#1234)
dependabot[bot] Apr 28, 2026
1a09dba
feat(rdpdr): Notify RdpdrBackend of 'User Logged On' Messages (#1211)
rhammonds-teleport Apr 29, 2026
78effb3
fix(connector): surface actual PDU type when an unexpected Share Cont…
GlassOnTin Apr 29, 2026
2d49804
feat(client): add --prevent-session-lock CLI option (#1207)
manio Apr 30, 2026
14b1cef
feat(rdpdr): add Web RDPDR virtual printer support (#1230)
matt020191 May 4, 2026
ba8b8b3
build(deps): bump the patch group across 1 directory with 2 updates (…
dependabot[bot] May 8, 2026
2e2b5ed
feat(error): capture core::panic::Location automatically in Error<Kin…
glamberson May 12, 2026
68b86f2
feat(error): add shared bail! and ensure! macros (#1263)
glamberson May 12, 2026
14c5502
refactor(pdu): hand-roll Display/Error impls and remove thiserror dep…
glamberson May 13, 2026
df0bf9c
fix(pdu)!: remove unused legacy error types (#1268)
CBenoit May 13, 2026
2e2699d
fix(error): box diagnostic metadata to shrink Error<Kind> size (#1269)
CBenoit May 14, 2026
af11df1
feat(pdu): add arbitrary feature for structure-aware fuzzing (#1272)
glamberson May 14, 2026
4c53018
fix(connector)!: remove `arbitrary` feature (#1273)
CBenoit May 14, 2026
a00f51d
build(deps): bump sspi from 0.19.2 to 0.20.0 (#1250)
dependabot[bot] May 14, 2026
d02d24a
refactor(async,blocking)!: make Framed::read_exact crate-private (#1247)
glamberson May 14, 2026
2f77687
feat(egfx)!: switch SolidFill/SurfaceToSurface/SurfaceToCache rectang…
glamberson May 14, 2026
72901cc
build(deps): bump the patch group across 1 directory with 2 updates (…
dependabot[bot] May 14, 2026
9cb5439
fix(connector): handle ServerDeactivateAll during CapabilitiesExchang…
totoshko88 May 14, 2026
0282d18
feat(egfx)!: switch WireToSurface1Pdu rectangles to exclusive bounds …
glamberson May 15, 2026
cb62472
feat(rdpeusb): initial PDU module (#1165)
playbahn May 18, 2026
fa78084
fix(str): import alloc::borrow::ToOwned in no_std + alloc builds (#1280)
glamberson May 18, 2026
18a430a
fix(bulk): gate alloc-dependent modules behind the alloc feature (#1279)
glamberson May 18, 2026
d18c511
ci: add `check features` matrix gate with dynamic CI fan-out (#1283)
glamberson May 19, 2026
ac7ad50
fix(error,session)!: remove Error::into_other_kind (#1278)
glamberson May 19, 2026
b8f732b
chore(skills): add release-prep skill for release-plz PRs (#1287)
CBenoit May 19, 2026
eedd61f
chore(deps): normalize version requirements to minimal form (#1288)
CBenoit May 19, 2026
2f92388
refactor(egfx)!: mark consumer-facing types as `#[non_exhaustive]` fo…
glamberson May 20, 2026
a8a813a
feat(fuzz): add bulk decompression fuzz targets (MPPC, NCRUSH, XCRUSH…
glamberson May 20, 2026
5663ce2
ci(fuzz): discover fuzz targets dynamically (#1290)
CBenoit May 20, 2026
a142799
feat(graphics,egfx): add progressive RFX decode and EGFX integration …
glamberson May 21, 2026
109d998
refactor(core): replace wildcard re-exports with explicit lists (#1270)
glamberson May 21, 2026
0dd7c94
fix(xcrush): off-by-one in forward match loop causes panic during com…
Copilot May 21, 2026
6e84797
fix(server): keep newest queued waves on per-batch overflow (#1276)
clintcan May 21, 2026
c56ea16
fix(remote-desktop): resolve Firefox stuck right-click via mouse stat…
kristahouse May 22, 2026
67f3c63
fix(egfx): tolerate unknown capability versions instead of failing de…
clintcan May 25, 2026
491b91f
fix(pdu)!: remove ironrdp-egfx duplicates from ironrdp-pdu (#1303)
glamberson May 25, 2026
0bbffcd
fix(web): include Meta keys in WebKit scancode dispatch (#1304)
eazelis May 25, 2026
8940074
refactor(rdpeusb): centralize SHARED_MSG_HEADER validation (#1294)
uchouT May 25, 2026
610cfd0
test(fuzz): add pdu_round_trip oracle and target (#1291)
glamberson May 25, 2026
6d43d26
feat(graphics,egfx): add progressive RFX server encode and mixed-code…
glamberson May 25, 2026
905a148
fix(rdpsnd-native): allocate Opus PCM buffer as Vec<i16> to avoid ali…
glamberson May 25, 2026
7e0bfd3
feat(cliprdr): always set FD_PROGRESSUI in FileDescriptor::encode (#1…
clintcan May 25, 2026
5375bbb
feat(cliprdr): advertise Preferred DropEffect alongside FileGroupDesc…
clintcan May 25, 2026
424590a
fix(server): drop raw user_data dump from McsMessage::SendDataRequest…
glamberson May 25, 2026
3dae1fb
test(fuzz): add egfx PDU decoders to pdu_decode oracle + fix two surf…
glamberson May 25, 2026
a4bc475
feat(cliprdr): add CliprdrBackend::on_format_list_response(ok) hook (…
clintcan May 25, 2026
91ea46b
fix(egfx)!: separate wire-level RawCapabilitySet from typed Capabilit…
CBenoit May 25, 2026
879ffed
feat(client): add --desktop-width and --desktop-height CLI options (#…
CBenoit May 25, 2026
9d12ada
build(deps): bump log from 0.4.29 to 0.4.30 in the patch group across…
dependabot[bot] May 26, 2026
196d18d
feat(dvc): close channel API for server and client (#1302)
uchouT May 26, 2026
1f39e35
chore(release): prepare web packages for publishing (#1312)
CBenoit May 26, 2026
361bdc2
feat: split ironrdp-client into a reusable library + ironrdp-viewer b…
Copilot May 26, 2026
f9abc9e
ci: setup Node.js 24 (#1318)
dion-gionet May 27, 2026
a71567e
fix(pdu): cover BitmapCacheV3 in CapabilitySet encoder (#1313)
glamberson May 27, 2026
5d10391
test(cliprdr): cover Preferred DropEffect advertise + inline DROPEFFE…
clintcan May 27, 2026
d5b3fa7
build(deps): bump sspi 0.21 / picky rc.23 for released RustCrypto (#1…
nob13 May 27, 2026
e45f68c
fix(web-client): add repository metadata to published package.json (#…
CBenoit May 27, 2026
aa7ff67
feat(server): handle SuppressOutput / RefreshRectangle and expose sta…
clintcan May 27, 2026
30a79a0
chore: remove code coverage pipeline (#1324)
CBenoit May 27, 2026
ad3a842
test(fuzz): add egfx_round_trip oracle and target (#1317)
glamberson May 27, 2026
059ca90
feat(pdu,graphics,egfx): add ClearCodec bitmap compression codec (#1174)
glamberson May 27, 2026
7dd4db0
chore(release): prepare for publishing (#1212)
devolutionsbot May 28, 2026
3905d17
build(web): pass extra optimization flags for WASM release build (#1342)
RRRadicalEdward May 29, 2026
e3dc0e7
chore(release): prepare ironrdp-egfx release (#1355)
CBenoit Jun 1, 2026
cf51bdd
feat(egfx)!: surface total_frames_decoded on the frame-ack callback (…
glamberson Jun 1, 2026
54af8f6
feat(nscodec): introduce ironrdp-nscodec crate + opt-in server integr…
clintcan Jun 1, 2026
4e11a17
fix(graphics): bound ZGFX compressor hash table size (#1344)
glamberson Jun 1, 2026
7894d9f
docs(rdpsnd): document RdpsndServerHandler::start wFormatNo contract …
clintcan Jun 1, 2026
8a9ee62
fix(server): emit RGB-channel QOI for opaque captures so ironrdp-sess…
clintcan Jun 1, 2026
479a13a
feat(egfx): cascade Arbitrary derives across ironrdp-egfx public PDU …
glamberson Jun 1, 2026
1534d1b
fix(egfx)!: make DecodedFrame fields private with getters to enforce …
glamberson Jun 1, 2026
ef20ea4
fix(session): decode RGBA QOI bitmaps instead of dropping the frame (…
clintcan Jun 1, 2026
f21470c
fix(dvc)!: add channel_id parameter to DvcChannelListener::create (#1…
uchouT Jun 2, 2026
8a3b126
feat(server): add CredentialValidator trait for server-side auth (#1172)
glamberson Jun 5, 2026
9046144
refactor(rdpeusb): split PDU and TS_URB enum wrapper (#1321)
uchouT Jun 8, 2026
8fe59c1
chore(release): prepare for publishing (#1340)
devolutionsbot Jun 17, 2026
985d353
feat(dvc): expose dynamic channel accessors (#1368)
uchouT Jun 23, 2026
5d534f1
fix(cliprdr): release outgoing locks before initiating a file copy (#…
ymarcus93 Jun 23, 2026
dca254d
docs(style): define log-level policy for library crates
CBenoit Jun 23, 2026
c36032f
fix: lower verbosity of routine logs in library crates
CBenoit Jun 23, 2026
356d06e
fix(web): recover file-upload state when a paste is interrupted or ne…
ymarcus93 Jun 23, 2026
f385542
fix(dvc-pipe-proxy): remove trailing punctuation from log messages (#…
Copilot Jun 23, 2026
f12bbce
feat(web): supersede a stuck upload and complete zero-byte files (#1381)
ymarcus93 Jun 23, 2026
af2706d
feat(web): add pluggable storage backends for RDP file downloads (#1221)
gabrielbauman Jun 23, 2026
a4fde9f
fix(connector): stay in CapabilitiesExchange when activation handles …
rdeangel Jun 23, 2026
efa5732
feat(acceptor): negotiate the MCS message channel (#1347)
glamberson Jun 24, 2026
37483eb
fix(rdpsnd-native)!: replace anyhow with typed RdpsndNativeError (#1277)
glamberson Jun 24, 2026
481ea5d
feat(server): expose NetworkAutoDetect RTT via a shared handle (#1346)
glamberson Jun 24, 2026
45ec1ef
refactor(pdu): make the CapabilitySet encoder exhaustive (#1328)
glamberson Jun 24, 2026
d3705af
perf(web): replace softbuffer with direct put_image_data canvas prese…
irvingoujAtDevolution Jun 25, 2026
8f76260
feat(tls): expose negotiated TLS version and cipher suite (#1384)
glamberson Jun 26, 2026
0a461b5
build(deps): align sspi and picky dependencies (#1385)
CBenoit Jun 26, 2026
3f96d00
fix(pdu): set COMPRESSION_USED on the FastPath update header when com…
glamberson Jun 26, 2026
9d206a3
build: add iOS arm64 simulator NuGet RID
mamoreau-devolutions Jun 26, 2026
f7e6106
feat(client): gate native backends behind Cargo features (#1338)
CBenoit Jun 29, 2026
8a8f8c8
refactor(client): drive RdpClient configuration from the PropertySet …
CBenoit Jun 29, 2026
66c9b5d
feat(rdpeusb): implement urbdrc client (#1365)
uchouT Jun 29, 2026
b6325f9
feat(cliprdr): dispatch initiate_file_copy via ClipboardMessage (#1388)
glamberson Jun 29, 2026
b407c6f
fix(client): correct binding and error macro in SendInitiateFileCopy …
glamberson Jun 30, 2026
7df0cf1
refactor(client): drive viewer config through ConfigBuilder (#1391)
CBenoit Jun 30, 2026
d6990d8
fix(error): propagate caller location through error constructor helpe…
CBenoit Jun 30, 2026
1b752d2
fix(propertyset): remove logging from PropertySet (#1393)
CBenoit Jun 30, 2026
2046639
feat(agent): introduce ironrdp-agent crate (#1339)
CBenoit Jun 30, 2026
2d3bdef
feat(rdpsnd)!: misuse-resistant format negotiation for RdpsndServerHa…
clintcan Jul 1, 2026
368fe8e
fix(graphics): don't require CONTEXT block on every progressive frame…
rdeangel Jul 1, 2026
38980fc
feat(rdpeusb): implement urbdrc server processors (#1394)
uchouT Jul 1, 2026
d767d99
feat(tls): make the rustls crypto provider selectable (#1387)
glamberson Jul 1, 2026
5ca84a5
feat(acceptor): expose the client's keyboard layout on AcceptorResult…
clintcan Jul 1, 2026
d471bd0
feat(acceptor): honor the client-requested desktop size (#1373)
clintcan Jul 2, 2026
18bf75c
feat(server): accept connections with TLS terminated at a lower layer…
glamberson Jul 2, 2026
a552246
feat(agent): add resize operation (#1401)
CBenoit Jul 2, 2026
1cc7570
feat(agent): add generic --prop KEY:TYPE:VALUE property overrides (#1…
CBenoit Jul 2, 2026
069786c
refactor(rdpeusb): seperate raw and validated `InternalIoControl` (#1…
uchouT Jul 2, 2026
32a8736
refactor(rdpeusb): eliminate repetition (#1407)
uchouT Jul 7, 2026
5c22f86
fix(session): reduce dependency on ironrdp-connector (#1419)
zmb3 Jul 8, 2026
9b4d01b
fix(pdu): decode MousePdu wheel rotation as two's complement, matchin…
antonmos Jul 8, 2026
c6a0286
fix(session)!: remove ironrdp-connector dependency (#1435)
CBenoit Jul 9, 2026
437660f
ci: publish CLI binary release assets (#1437)
mamoreau-devolutions Jul 10, 2026
8a1fd01
fix(pdu)!: send NetworkAutoDetect over the MCS message channel (#1348)
glamberson Jul 10, 2026
131d7d3
ci(xtask): add dependency-invariant guard for ironrdp-session (#1438)
CBenoit Jul 10, 2026
8544360
ci: friendly release asset names and drift-free install docs (#1439)
CBenoit Jul 10, 2026
11a0810
chore(release): prepare for publishing (#1364)
devolutionsbot Jul 10, 2026
c0a2981
chore(release): clean up (#1440)
devolutionsbot Jul 10, 2026
bdcc0ce
feat(core): add NonEmpty<T> (#1444)
CBenoit Jul 13, 2026
76ad145
test(rdpeusb): add client/server I/O sequence coverage (#1406)
uchouT Jul 13, 2026
079b484
fix(dvc-pipe-proxy): handle pre-connected Windows clients (#1447)
mamoreau-devolutions Jul 13, 2026
c27fce2
Merge remote-tracking branch 'upstream/master' into ship/upstream-syn…
lixmal Jul 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
20 changes: 20 additions & 0 deletions .github/actions/install-build-deps/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: Install build dependencies
description: Install the native build dependencies required to build IronRDP (Linux ALSA headers, Windows NASM).

runs:
using: composite
steps:
- name: Install devel packages
if: ${{ runner.os == 'Linux' }}
shell: bash
run: |
sudo apt-get update -qq
sudo apt-get -y install libasound2-dev

- name: Install NASM
if: ${{ runner.os == 'Windows' }}
shell: pwsh
run: |
choco install nasm
$Env:PATH += ";$Env:ProgramFiles\NASM"
echo "PATH=$Env:PATH" >> $Env:GITHUB_ENV
76 changes: 76 additions & 0 deletions .github/skills/release-prep/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
---
name: release-prep
description: Reviews and finalizes a release-plz "chore(release): prepare for publishing" PR for the IronRDP workspace. Use this skill whenever the user asks to review, fix, prepare, or finalize a release PR; mentions release-plz, version bumps, CHANGELOG cleanup, or "publishing crates"; or references a PR titled "chore(release): prepare for publishing". Invoke proactively any time work involves auditing or editing CHANGELOG.md / Cargo.toml version fields across multiple crates ahead of publishing to crates.io.
---

# IronRDP release-plz PR review & finalization

release-plz does most of the mechanical work (computing bumps, generating changelog entries from conventional commits, updating dependency version requirements, refreshing `Cargo.lock`). This skill covers the **human-in-the-loop pass** that release-plz cannot do automatically: verifying bumps against the public-dependency rule, rewriting per-crate changelog entries, and deduplicating commits that collapse into a single net change.

All fixes go on the **release-plz PR branch** directly. Do not rewrite history on `main` for cosmetic changelog reasons; if real source/doc changes are needed, land them on `main` first and let release-plz regenerate the PR.

## The public-dependency propagation rule

A dependency line in `Cargo.toml` annotated with `# public` means that the dependency's types appear in this crate's *public* API surface.

- **Breaking change in a `# public` dependency ⇒ breaking change in the depending crate** (minor bump pre-1.0, major bump post-1.0). The downstream changelog must reflect that it is breaking, even if the downstream's own code changes were trivial recompiles.
- A *patch-level* bump in a `# public` dependency does **not** force any bump in downstream crates: workspace `Cargo.toml` files use `"0.7"`-style major.minor requirements only, so Cargo's resolver picks the new patch up automatically.
- A dependency *without* the `# public` marker is internal. A breaking change in it is just a patch for the depending crate (assuming the public API is unchanged).

Enumerate public-dep edges with `grep -n '# public' crates/*/Cargo.toml`. The dep's bump kind is visible in the release-plz PR body's "New release" summary.

For each crate in the release, cross-check the proposed bump against (a) its own commits' conventional-commit signals (`feat!`, `BREAKING CHANGE` footer, etc.) and (b) the propagation rule above. When the bump is wrong, fix it on the PR branch: edit `version = "..."` in that crate's `Cargo.toml`, cascade to the version requirement in any consumer crate's `Cargo.toml`, and update the version-header line at the top of the corresponding `CHANGELOG.md` (`## [[X.Y.Z](...)] - YYYY-MM-DD`, including the `vOLD...vNEW` compare URL).

## Changelog quality pass

release-plz pulls each commit's subject + body into the changelog of *every* crate touched by that commit. Many IronRDP commits span multiple crates with very different semantics on each side — e.g. a breaking change in `ironrdp-pdu` that requires a mechanical call-site update in `ironrdp-connector`. The PDU-flavored description does not belong in the connector's changelog.

**For each duplicated entry:**

1. **Default:** rewrite to describe what *this* crate actually changed, inferred from the diff for this crate in the originating commit. Use `git show <sha> -- crates/<this-crate>/` to see only this crate's slice.
2. **Fallback:** if the change here is genuinely just "recompile against new dep" with nothing more specific to say, replace the entry with a short note such as `Update <dep> dependency`. There *is* a real code change (release-plz wouldn't have inserted an entry otherwise — at minimum the dep version requirement moved), so the changelog should still acknowledge it; just don't parrot the upstream description.
3. Preserve the conventional-commit category mapping (Features / Bug Fixes / Documentation / etc.) defined in `cliff.toml`, but recategorize if the rewritten entry fits a different bucket better.
4. If the rewrite changes a non-breaking entry into a breaking one (or vice versa) because of the public-dep rule, add or remove the `[**breaking**]` prefix accordingly, and revert the breaking bump which was wrongly applied (minor bump pre-1.0, major bump post-1.0).

### Deduplication across the release window

Multiple commits in the release window often collapse into a single net change. Spend real effort on this — a clean changelog is one of the highest-leverage outputs of this pass. Common patterns:

- **Revert before release:** both entries should be dropped (or, if the revert was partial, replaced with a single entry describing the final state).
- **Iteration on an unreleased feature:** initial commit introduces feature X, follow-ups tweak its API or behaviour, all within the same release window. Collapse into a single entry describing X *as it actually ships*.
- **Bug fix on an unreleased feature:** if the bug only ever existed in the unreleased code, fold the fix into the feature entry.
- **Mechanical follow-ups** (review feedback, clippy fixes on a feature PR): keep only the feature entry.

When merging entries, preserve every relevant `[#NNNN]`/commit-SHA link so the historical trail stays navigable. The headline text should describe the *final* outcome, not the journey.

### Format fidelity

`CHANGELOG.md` content is generated by git-cliff using the template in `cliff.toml`. When hand-editing, preserve the generated format exactly:

- **Section order** is controlled by `<!-- N -->` prefixes in `commit_parsers` (Security, Features, Improvements, Revert, Bug Fixes, Performance, Documentation, Build, Please Sort). Do not reorder sections, even if the result looks unbalanced.
- **Section headings** keep the `<!-- N -->` prefix verbatim (e.g. `### <!-- 1 -->Features`). Don't strip it.
- **Spacing** must match git-cliff's output: one blank line between version headers, sections, and entries; two-space hanging indent for entry bodies. Don't collapse or add blank lines.
- **Entry shape** is `- {breaking?}{Message} ({commit_link})` followed, when there's a body, by a blank line and the indented body. Keep `[**breaking**]` exactly as rendered.
- **Links** are reference-style URLs to issues/PRs (`[#1234](...)`) and commits (`[abcdef0123](...)`). When merging or rewriting entries, keep these links intact rather than rewriting them by hand.
- **Category placement** for rewritten entries should still match the `commit_parsers` mapping in `cliff.toml`. If a rewrite changes the appropriate category, move the entry into the correct existing section rather than inventing a new one.

## Scope of edits

Only these files should be touched on the release-plz PR branch:

- `crates/<crate>/CHANGELOG.md` — content rewrites, drops, breaking-tag fixes, version-header bumps.
- `crates/<crate>/Cargo.toml` — `version = "..."` corrections and cascading version-requirement updates in consumer crates.
- `Cargo.lock` — regenerated automatically by `cargo check` after any `Cargo.toml` version edit (see procedure step 6); never edited by hand.

Do **not** touch source code, READMEs, MSRV, `rust-toolchain.toml`, or CI files here. Those belong on `main`.

## Procedure

1. Inspect the PR's changes from the working tree: `git --no-pager diff origin/main -- '**/CHANGELOG.md' '**/Cargo.toml'` for the substantive deltas, and read the PR body for the "New release" bump table (use `gh pr view` only if the body isn't already provided in context).
2. Read the PR body's "New release" bump table.
3. Enumerate `# public` dep edges and cross-check every proposed bump against the propagation rule and the originating commits' conventional-commit signals. Note mismatches.
4. For each crate's `CHANGELOG.md` section in the diff, classify entries as *own change*, *public-dep ripple*, or *internal-dep ripple / unrelated*. Rewrite or replace per the rules above. Then deduplicate across the release window.
5. Apply any `Cargo.toml` version corrections from step 3, cascading to consumer crates' version requirements and the corresponding changelog version headers.
6. If you edited any `Cargo.toml` version, run `cargo check --workspace` (without `--locked`, so `Cargo.lock` can be regenerated) and commit the resulting lock delta. Then run `cargo xtask check locks -v`, which verifies no lock file is left uncommitted.
7. Push the fixups with conventional-commit-shaped messages (typically `chore(release): ...`) so they don't pollute the next release window.
8. Summarize the changes and any judgement calls — especially dropped entries and escalated bumps — for the human reviewer.
115 changes: 77 additions & 38 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ on:
branches:
- master
pull_request:
types: [ opened, synchronize, reopened ]
types: [opened, synchronize, reopened]
workflow_dispatch:

env:
Expand All @@ -30,7 +30,7 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Check formatting
run: cargo xtask check fmt -v
Expand All @@ -40,10 +40,10 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Binary cache
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ./.cargo/local_root/bin
key: ${{ runner.os }}-bin-${{ github.job }}-${{ hashFiles('xtask/src/bin_version.rs') }}
Expand All @@ -56,12 +56,12 @@ jobs:

checks:
name: Checks [${{ matrix.os }}]
needs: [formatting]
runs-on: ${{ matrix.runner }}
needs: formatting
strategy:
fail-fast: false
matrix:
os: [ windows, linux, macos ]
os: [windows, linux, macos]
include:
- os: windows
runner: windows-latest
Expand All @@ -72,26 +72,16 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v6

- name: Install devel packages
if: runner.os == 'Linux'
run: |
sudo apt-get -y install libasound2-dev

- name: Install NASM
if: runner.os == 'Windows'
shell: pwsh
run: |
choco install nasm
$Env:PATH += ";$Env:ProgramFiles\NASM"
echo "PATH=$Env:PATH" >> $Env:GITHUB_ENV
- name: Install build dependencies
uses: ./.github/actions/install-build-deps

- name: Rust cache
uses: Swatinem/rust-cache@v2.7.3

- name: Binary cache
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ./.cargo/local_root/bin
key: ${{ runner.os }}-bin-${{ github.job }}-${{ hashFiles('xtask/src/bin_version.rs') }}
Expand All @@ -107,6 +97,9 @@ jobs:
- name: Lints
run: cargo xtask check lints -v

- name: Dependencies
run: cargo xtask check dependencies -v

- name: WASM (prepare)
run: cargo xtask wasm install -v

Expand All @@ -118,19 +111,19 @@ jobs:

fuzz:
name: Fuzzing
needs: [formatting]
runs-on: ubuntu-latest
needs: formatting

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Rust cache
uses: Swatinem/rust-cache@v2.7.3
with:
workspaces: fuzz -> target

- name: Binary cache
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ./.cargo/local_root/bin
key: ${{ runner.os }}-bin-${{ github.job }}-${{ hashFiles('xtask/src/bin_version.rs') }}
Expand All @@ -147,17 +140,17 @@ jobs:

web:
name: Web Client
needs: [formatting]
runs-on: ubuntu-latest
needs: formatting

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Rust cache
uses: Swatinem/rust-cache@v2.7.3

- name: Binary cache
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ./.cargo/local_root/bin
key: ${{ runner.os }}-bin-${{ github.job }}-${{ hashFiles('xtask/src/bin_version.rs') }}
Expand All @@ -173,17 +166,17 @@ jobs:

ffi:
name: FFI
needs: [formatting]
runs-on: ubuntu-latest
needs: formatting

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Rust cache
uses: Swatinem/rust-cache@v2.7.3

- name: Binary cache
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ./.cargo/local_root/bin
key: ${{ runner.os }}-bin-${{ github.job }}-${{ hashFiles('xtask/src/bin_version.rs') }}
Expand All @@ -200,22 +193,68 @@ jobs:
- name: Build .NET projects
run: cd ./ffi/dotnet && dotnet build

feature-matrix-setup:
name: feature matrix setup
needs: [formatting]
runs-on: ubuntu-latest
outputs:
feature-matrix: ${{ steps.setup-matrix.outputs.feature-matrix }}

steps:
- uses: actions/checkout@v6

- name: Rust cache
uses: Swatinem/rust-cache@v2.7.3

- name: Setup matrix
id: setup-matrix
run: |
MATRIX="$(cargo xtask check features --list --format github-matrix)"
echo "feature-matrix=$MATRIX" >> "$GITHUB_OUTPUT"

feature-matrix:
name: feature matrix [${{ matrix.case }}]
needs: [formatting, feature-matrix-setup]
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include: ${{ fromJson(needs.feature-matrix-setup.outputs.feature-matrix) }}

steps:
- uses: actions/checkout@v6

- name: Install build dependencies
uses: ./.github/actions/install-build-deps

- name: Rust cache
uses: Swatinem/rust-cache@v2.7.3

- name: Binary cache
uses: actions/cache@v5
with:
path: ./.cargo/local_root/bin
key: ${{ runner.os }}-bin-${{ github.job }}-${{ hashFiles('xtask/src/bin_version.rs') }}

- name: Prepare
run: cargo xtask check install -v

- name: Run feature-matrix case
run: cargo xtask check features --case '${{ matrix.case }}' -v

- name: Lock files
run: cargo xtask check locks -v

success:
name: Success
runs-on: ubuntu-latest
if: ${{ always() }}
needs:
- formatting
- typos
- checks
- fuzz
- web
- ffi
needs: [formatting, typos, checks, fuzz, web, ffi, feature-matrix-setup, feature-matrix]
runs-on: ubuntu-latest

steps:
- name: Check success
shell: pwsh
run: |
$results = '${{ toJSON(needs.*.result) }}' | ConvertFrom-Json
$succeeded = $($results | Where { $_ -Ne "success" }).Count -Eq 0
exit $(if ($succeeded) { 0 } else { 1 })
shell: pwsh
50 changes: 0 additions & 50 deletions .github/workflows/coverage.yml

This file was deleted.

Loading
Loading