Quick Links
- GitHub Repository: Devolutions/IronRDP
- Issue Tracker: GitHub Issues
- Matrix Chat: #IronRDP:matrix.org
- Crates.io: ironrdp
Development Workflow
1. Set Up Your Environment
cargo-nextest- Faster test runnertypos- Spell checkerwasm-pack- WebAssembly tooling- Other project-specific tools
2. Make Your Changes
Before starting work:- Check existing issues to see if your idea is already being worked on
- Open an issue for discussion if you’re planning a significant change
- Create a branch from
masterfor your work
3. Test Your Changes
Run the appropriate checks locally before submitting:The expectation is that if
cargo xtask ci passes locally, the CI will be green as well.4. Submit a Pull Request
- Commit your changes with clear, descriptive commit messages
- Push to your fork on GitHub
- Open a pull request against the
masterbranch - Fill out the PR template with details about your changes
- Wait for review from maintainers
Coding Standards
IronRDP follows strict coding standards documented in STYLE.md. Key conventions:Error Messages
- Lowercase, no trailing punctuation
- Short and concise
- Use
crate_name::Result(e.g.,anyhow::Result)
Log Messages
- Capitalize first letter, no trailing period
- Use structured tracing fields
Size Constants
Annotate each addend with an inline comment:Documentation Comments
Link to specification sections using reference-style links:Architecture Guidelines
Refer to ARCHITECTURE.md for detailed architecture information.Core Tier Invariants
When working on core tier crates (ironrdp-core, ironrdp-pdu, etc.):
- No I/O operations - Core tier must not interact with the outside world
no_stdcompatible - Must work without the standard library (opt-in viastdfeature)- No platform-dependent code - No
#[cfg(windows)]or similar - Minimal dependencies - Avoid unnecessary dependencies
- No proc-macros - Keep compile times low
- Must be fuzzed - All core tier crates require fuzz targets
Testing Requirements
- Test at the boundaries - Focus on testing public APIs
- No external dependencies - Tests must be perfectly reproducible
- Use
expect-test- For snapshot testing of structured data - Use
rstest- For fixture-based testing - Use
proptest- For property-based testing
Project Structure
Key directories:crates/- Main Rust workspace cratesxtask/- Project automation (equivalent tomake)fuzz/- Fuzz targets for robustness testingffi/- Native library + .NET bindingsweb-client/- Browser/WebAssembly clientbenches/- Performance benchmarks
Common Tasks
Adding a New Crate
- Create the crate in
crates/ - Add it to the workspace in root
Cargo.toml - Document it in
ARCHITECTURE.md - Add tests to appropriate testsuite crate
- Add fuzz target if it’s a core tier crate
Adding a New Virtual Channel
- Create crate in
crates/ironrdp-{channel-name}/ - Implement
SvcProcessortrait (for SVC) orDvcProcessor(for DVC) - Define PDU types in
pdumodule - Add backend trait if OS-specific operations needed
- Document with MS-RDP specification links
- Add integration tests
- Update architecture documentation
Fixing a Bug
- Write a failing test that reproduces the bug
- Fix the bug with minimal changes
- Verify the test passes
- Run full test suite to ensure no regressions
- Update documentation if behavior changed
Dependency Policy
Review Process
For Contributors
- Respond to reviewer feedback promptly
- Make requested changes or explain why you disagree
- Keep discussions focused and constructive
- Be patient - maintainers review PRs in their spare time
For Reviewers
From STYLE.md:Our approach to “clean code” is two-fold:Small cleanup PRs are encouraged and very welcomed!It is explicitly OK for a reviewer to flag only some nits in the PR, and then send a follow-up cleanup PR for things which are easier to explain by example.
- we avoid blocking PRs on style changes, but
- at the same time, the codebase is constantly refactored.
Specialized Contributions
WebAssembly
Fuzzing
FFI / .NET Bindings
Getting Help
Report Bugs
Open an issue on GitHub Issues with:- Clear description of the problem
- Steps to reproduce
- Expected vs actual behavior
- Environment details (OS, Rust version, etc.)
- Relevant logs or error messages
Ask Questions
Join the Matrix chat room to:- Ask questions about the codebase
- Discuss potential features
- Get help with contributions
- Chat with other contributors
Community Guidelines
- Be respectful and professional
- Focus on technical merits of ideas
- Welcome newcomers and help them get started
- Keep discussions on-topic
- Follow the Rust Code of Conduct
License
By contributing to IronRDP, you agree that your contributions will be licensed under the same license as the project. See the LICENSE file for details.Recognition
Contributors are recognized in:- Git commit history
- GitHub contributor graphs
- Release notes for significant contributions
CHANGELOG.mdfor user-visible changes

