Thank you for your interest in contributing to Conductor! We welcome contributions of all kinds - from bug reports and documentation improvements to new features and hardware support.
- Code of Conduct
- Ways to Contribute
- Development Setup
- Coding Standards
- Pull Request Process
- Testing Guidelines
- Communication
This project adheres to the Contributor Covenant Code of Conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to conduct@amiable.dev.
Found a bug? Please open a GitHub issue with:
- Clear description of the issue
- Steps to reproduce
- Expected vs actual behavior
- System information (OS, Rust version, MIDI device)
- Relevant log output (run with
DEBUG=1for verbose logs)
Have an idea? We'd love to hear it! Open a GitHub Discussion with:
- Clear description of the proposed feature
- Use cases and benefits
- Potential implementation approaches (optional)
- Alternatives considered (optional)
Documentation improvements are always welcome:
- Fix typos or clarify existing docs
- Add examples for common use cases
- Improve API documentation
- Write tutorials or guides
- Translate documentation
Ready to write code? Check out:
- Good First Issues
- Help Wanted
- Incomplete feature implementations
Help us support more MIDI controllers:
- Test Conductor with your device
- Create device profiles (.ncmm3 or config templates)
- Document device-specific quirks or features
- Implement LED feedback for new devices
Extend Conductor's functionality with sandboxed WASM plugins:
- Create plugins for media control (Spotify, iTunes, etc.)
- Build system utility plugins (screenshots, clipboard, etc.)
- Develop DAW integration plugins (Logic Pro, Ableton, etc.)
- Add home automation plugins (smart lights, etc.)
- See
plugins/README.mdfor details - Use
./scripts/new-plugin.shto get started
Plugin requirements:
- Must be useful and solve a real problem
- Request only necessary capabilities
- Include comprehensive tests
- Provide clear documentation
- Use MIT or compatible license
See the Plugin Development Guide for complete instructions.
- Rust 1.70+ (install via rustup)
- macOS 10.15+ (Linux/Windows support planned)
- MIDI Controller (optional for testing, required for LED feedback)
- Git for version control
-
Fork and Clone
git fork amiable-dev/conductor git clone https://github.com/YOUR_USERNAME/conductor.git cd conductor -
Build the Project
cargo build
-
Run Tests
cargo test -
Run Conductor
# List available MIDI ports cargo run --release # Connect to a specific port cargo run --release 2 # Enable debug logging DEBUG=1 cargo run --release 2
-
Create a Feature Branch
git checkout -b feature/your-feature-name
- Follow Rust API Guidelines
- Use
rustfmtfor formatting:cargo fmt - Use
clippyfor linting:cargo clippy - Maximum line length: 100 characters
- Use meaningful variable names
- Add comments for complex logic
src/
├── main.rs # Entry point, MIDI connection, event loop
├── config.rs # Configuration structures (TOML parsing)
├── event_processor.rs # MIDI event → Processed event
├── mappings.rs # Mapping engine
├── actions.rs # Action execution
├── feedback.rs # LED feedback trait
├── mikro_leds.rs # Maschine Mikro MK3 LED control
├── midi_feedback.rs # Generic MIDI LED fallback
└── device_profile.rs # NI profile parser
Follow Conventional Commits:
feat: add support for MIDI Learn mode
fix: resolve double-tap detection timing issue
docs: update configuration examples
test: add integration tests for velocity detection
refactor: extract LED control to trait
chore: update dependencies
- Add doc comments (
///) for public items - Include examples in doc comments where helpful
- Update
README.mdif adding user-facing features - Update configuration documentation for new trigger/action types
-
Ensure Tests Pass
cargo test -
Check Formatting
cargo fmt --check
-
Run Clippy
cargo clippy -- -D warnings
-
Update Documentation
- Update
README.mdfor user-facing changes - Add doc comments for new public APIs
- Update configuration examples if needed
- Update
-
Test Manually
- Test with a real MIDI device if possible
- Verify LED feedback works correctly
- Check configuration loading
-
Push to Your Fork
git push origin feature/your-feature-name
-
Open Pull Request
- Clear title following conventional commit format
- Description explaining what and why
- Link related issues
- Add screenshots/videos if applicable
- Check the box for "Allow edits from maintainers"
-
Respond to Review
- Address reviewer comments
- Push updates to the same branch
- Request re-review when ready
- ✅ All tests pass (CI will verify)
- ✅ Code follows style guidelines
- ✅ Commits follow conventional commit format
- ✅ Documentation updated
- ✅ No unrelated changes
- ✅ Squash commits if requested
- Aim for 85%+ test coverage
- Write unit tests for business logic
- Write integration tests for event processing
- Write E2E tests for critical workflows
// Unit tests in the same file
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_velocity_detection() {
// Test implementation
}
}# All tests
cargo test
# Specific test
cargo test test_velocity_detection
# With output
cargo test -- --nocapture
# Coverage report
cargo tarpaulin --workspace- Unit tests for new functions
- Integration tests for event flows
- Edge cases covered
- Error conditions tested
- Documentation examples tested
Use Discussions for:
- Questions about usage
- Feature ideas and proposals
- General community chat
- Show & tell (your configurations, videos, etc.)
Use Issues for:
- Bug reports
- Approved feature requests
- Documentation improvements
Real-time chat for:
- Development questions
- Collaboration
- Community support
- Security: security@amiable.dev
- Code of Conduct: conduct@amiable.dev
- General: hello@amiable.dev
New to open source? No problem! Here's how to get started:
- Look for Good First Issues: We label beginner-friendly issues with good-first-issue
- Read the Docs: Familiarize yourself with the project structure
- Set Up Development: Follow the development setup guide
- Ask Questions: Don't hesitate to ask in Discussions
- Start Small: Fix a typo, improve docs, or tackle a small bug
- Learn and Grow: Every contribution helps you learn
By contributing to Conductor, you agree that your contributions will be licensed under the MIT License.
Thank you for contributing to Conductor! 🎹