All notable changes to Conductor will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Windows and Linux platform support for app detection
- Advanced trigger types (Chord, Sequence)
- Action macros and scripting
- Cloud sync (optional)
3.0.0 - 2025-11-21
Major Release: Conductor now supports game controllers (gamepads, joysticks, racing wheels, flight sticks, arcade controllers) alongside MIDI devices, enabling hybrid workflows with unified input management.
-
Game Controller (HID) Support: Full support for SDL2-compatible game controllers
- Gamepads: Xbox 360/One/Series, PlayStation DS4/DS5, Switch Pro Controller
- Joysticks: Flight sticks, arcade sticks with analog axes and buttons
- Racing Wheels: Logitech, Thrustmaster, and any SDL2-compatible wheel
- HOTAS: Hands On Throttle And Stick systems for simulation
- Custom Controllers: Any SDL2-compatible HID device
- Button mapping (0-255, indexes 128-255 reserved for HID)
- Axis support (LeftX, LeftY, RightX, RightY, LeftTrigger, RightTrigger)
- Digital D-Pad mapping (Up, Down, Left, Right)
-
Unified InputManager: Hybrid MIDI + HID input processing
- Three operating modes:
MidiOnly,GamepadOnly,Both - Unified event processing pipeline for MIDI and HID inputs
- Independent device connection management
- Graceful fallback when devices unavailable
- Thread-safe concurrent device access
- Three operating modes:
-
HID Trigger Types (4 new types)
GamepadButton: Button press/release with button index (0-255)GamepadAxis: Analog stick/trigger movement with threshold detectionGamepadDPad: Digital directional pad input (Up/Down/Left/Right)GamepadButtonCombo: Multiple simultaneous button presses (chord detection)
-
6 Official Gamepad Templates: Pre-configured mappings for popular controllers
xbox-360-gamepad.toml- Xbox 360 Controllerxbox-one-gamepad.toml- Xbox One/Series Controllerplaystation-ds4-gamepad.toml- PlayStation DualShock 4playstation-ds5-gamepad.toml- PlayStation DualSense (PS5)switch-pro-gamepad.toml- Nintendo Switch Pro Controllergeneric-gamepad.toml- Generic SDL2-compatible gamepad
-
Template Categories: Organized by device type
pad-controller- Pad-based MIDI controllersgamepad- Game controllers (Xbox, PlayStation, Switch, etc.)keyboard- MIDI keyboard controllersmixer-controller- DJ mixer-style controllers- More device types coming in future releases
-
Template Selector Enhancement (
config/templates/README.md, 850+ lines)- Device type filtering in template browser
- Gamepad category badge with controller icon
- Search and filter by device name, vendor, or category
- One-click template import with device type detection
- Visual device type indicators (MIDI vs HID)
-
DevicesView Split: Separate sections for MIDI and HID devices
- MIDI Controllers Section: Lists connected MIDI input/output devices
- HID Game Controllers Section: Lists connected game controllers with metadata
- Controller name and vendor information
- Button count and axis count display
- Connection status indicators
- Real-time connection/disconnection updates
-
MIDI Learn Integration: MIDI Learn mode now supports HID devices
- Capture gamepad button presses during MIDI Learn
- Capture axis movements with threshold detection
- Capture D-Pad directions
- Auto-generate HID trigger configurations
- Visual feedback during HID input capture
- Extended Status Command: IPC status now includes HID information
input_modefield: "midi-only", "gamepad-only", or "both"hid_devicesarray: List of connected game controllers- Device name, vendor, product ID
- Button count, axis count
- Connection timestamp
- Backward compatible with existing IPC clients
-
InputManager Modes: Three operating modes for flexible workflows
MidiOnly(default): MIDI devices only (v2.x behavior)GamepadOnly: HID game controllers only (no MIDI)Both: Hybrid MIDI + HID workflows (unified event processing)
-
ID Range Allocation: Clear separation of MIDI and HID identifiers
- 0-127: Reserved for MIDI notes and CC messages
- 128-255: Reserved for HID controller buttons and axes
- Prevents conflicts in hybrid configurations
-
Event Processing Pipeline: Unified handling of MIDI and HID events
- Common
ProcessedEventenum for both input types - Unified trigger matching in mapping engine
- Consistent velocity and timing detection across protocols
- Common
- Added:
gilrs v0.10- Cross-platform game controller library- Supports SDL2 game controller protocol
- Works with gamepads, joysticks, racing wheels, flight sticks
- Thread-safe device enumeration and event polling
- Hot-plug support for USB controllers
- Platform-specific backend (XInput on Windows, IOKit on macOS, evdev on Linux)
-
100% Backward Compatible: All existing MIDI configurations work unchanged
- Default mode is
MidiOnly(v2.x behavior) - No config changes required for MIDI-only workflows
- Opt-in to HID support by setting
input_mode = "both"orinput_mode = "gamepad-only"
- Default mode is
-
Migration Guide: See
docs/MIGRATION_v2_to_v3.mdfor complete guide- How to enable HID support
- Converting MIDI mappings to HID mappings
- Hybrid workflow examples
- ID range best practices
-
User Guides (2 new files, ~1,200 lines)
docs/guides/gamepad-integration.md- Complete game controller guide- Supported device types and vendors
- Button and axis mapping reference
- Configuration examples for common workflows
- Troubleshooting and device detection
docs/guides/hybrid-workflows.md- MIDI + HID hybrid setup- When to use hybrid mode
- Practical examples (DAW control, gaming macros, accessibility)
- Best practices for ID range allocation
-
Configuration References (1 new file, ~600 lines)
docs/configuration/hid-triggers.md- Complete TOML reference for HID triggers- GamepadButton, GamepadAxis, GamepadDPad, GamepadButtonCombo syntax
- Threshold configuration for analog axes
- Dead zone handling and sensitivity tuning
- Validation rules and performance notes
-
Template Documentation (
config/templates/README.md, updated)- All 6 official gamepad templates documented
- Device type categories explained
- Template discovery and import instructions
- Custom template creation guide
- HID Event Processing: <0.5ms latency (comparable to MIDI)
- Controller Polling: 120 Hz default (8.3ms interval)
- Memory Usage: 10-15MB (5MB increase for HID support)
- CPU Usage: <2% idle, <6% active (1-2% increase for gamepad polling)
- No impact on MIDI latency: Still <1ms for MIDI events
- 68 New Tests (100% pass rate)
- 15 InputManager tests (mode switching, device management)
- 20 HID trigger tests (button, axis, D-Pad, combo)
- 18 template loading tests (gamepad templates)
- 15 GUI integration tests (DevicesView, MIDI Learn with HID)
- Total Workspace Tests: 213 tests passing (100% pass rate)
- conductor-core: 60 tests (was 45)
- conductor-daemon: 89 tests (was 74)
- conductor-gui: 64 tests (was 26)
- HID Device Sandboxing: Controller access restricted to user-owned devices
- Input Validation: All button/axis values validated and clamped
- No System Hooks: Uses standard SDL2 APIs (no kernel extensions)
- Permission Model: Same Input Monitoring permission as MIDI (macOS)
- macOS: Full support with IOKit backend
- Linux: Full support with evdev backend (udev rules may be required)
- Windows: Full support with XInput backend (Xbox controllers) and DirectInput fallback
- Gamepad LED control not yet implemented (planned for v3.1)
- Haptic feedback (vibration) not yet supported (planned for v3.1)
- Gyroscope/accelerometer data not exposed (planned for v3.2)
- Touchpad input (DS4/DS5) not yet supported (planned for v3.2)
None - fully backward compatible with v2.7.0. All MIDI-only configurations work unchanged.
- v3.1: Gamepad LED control and haptic feedback
- v3.2: Advanced HID features (gyroscope, touchpad)
- v3.3: Custom HID device profiles (beyond SDL2 gamepad mapping)
2.7.0 - 2025-11-19
Phase 6 (Part 4): Comprehensive security layer for WASM plugins with cryptographic signing, resource limiting, filesystem sandboxing, and enterprise-grade safety guarantees.
-
Ed25519 Digital Signatures (486 lines) - Industry-standard cryptographic verification
- 32-byte public keys, 64-byte signatures
- SHA-256 binary integrity checking
- Deterministic signing (identical inputs → identical signatures)
- Embedded JSON metadata (signer name, email, timestamp, version)
- Protection against tampering and unauthorized modifications
-
Three-Tier Trust Model - Flexible security policies
- Unsigned: Development and testing (security warnings displayed)
- Self-Signed: Plugins signed with any valid key (authenticity verified)
- Trusted Keys: Only allow plugins signed with pre-approved keys (maximum security)
- Configurable per-plugin or system-wide
- Trust store in
~/.conductor/trusted_keys.json
-
CLI Signing Tool (
conductor-sign, 460 lines) - Complete key management and signing workflowgenerate-key- Generate Ed25519 keypair with PEM encodingsign- Sign WASM plugins with metadata embeddingverify- Verify plugin signatures and integritytrust add/remove/list- Manage trusted key store- Portable PEM format for easy distribution
- Integration with WASM plugin loader
-
Fuel Metering - CPU instruction counting to prevent runaway plugins
- Default: 100M instructions per execution
- Configurable per-plugin (10M to 1B instructions)
- Real-time tracking via wasmtime fuel API
- Automatic termination on limit exceeded
- Performance overhead: <1%
-
Memory Limits - Prevent memory exhaustion
- Default: 128 MB maximum memory per plugin
- Configurable per-plugin (16 MB to 512 MB)
- Linear memory growth constraints
- Table growth limits (1024 elements default)
- Protection against allocation attacks
- Directory Preopening (WASI) - Whitelist-based filesystem access
- Explicit directory grants (read-only or read-write)
- Path traversal prevention (no
../escapes) - Default: No filesystem access unless explicitly granted
- Per-plugin directory configuration
- WASI preview1 standard compliance
- 10 Plugin Signing Tests (436 lines, 100% pass rate, 0.53s execution)
test_sign_and_verify_workflow- End-to-end signing workflowtest_load_signed_plugin_with_self_signed_mode- Self-signed loadingtest_reject_unsigned_plugin_when_required- Signature enforcementtest_reject_tampered_plugin- Binary integrity detectiontest_reject_invalid_signature- Wrong key rejectiontest_signature_metadata_format- JSON metadata parsingtest_load_unsigned_plugin_when_not_required- Backward compatibilitytest_multiple_executions_with_signed_plugin- Runtime verificationtest_key_size_validation- Ed25519 key validation (32-byte enforcement)test_signature_deterministic- Reproducible signatures
-
mdBook WASM Plugin Documentation (6,715 lines across 4 new pages)
development/wasm-plugins.md- Overview, architecture, security featuresdevelopment/wasm-plugin-development.md- Complete development tutorialdevelopment/plugin-security.md- 4-layer security architecture guidedevelopment/plugin-examples.md- Real-world examples (Spotify, OBS, system utils)- Quick comparison tables (native vs WASM plugins)
- Security checklists and best practices
- Complete conductor-sign CLI reference
- Configuration examples with all security modes
-
Technical Documentation (648 lines)
docs/v2.7-plugin-signing-complete.md- Complete implementation report- Architecture diagrams with 4-layer security model
- Performance benchmarks and overhead analysis
- Integration guide for plugin developers
-
Production Code: ~1,400 lines across 3 new files
conductor-core/src/plugin/signing.rs(486 lines)conductor-daemon/src/bin/conductor-sign.rs(460 lines)conductor-core/tests/plugin_signing_test.rs(436 lines)
-
Dependencies Added:
ed25519-dalek v2.2- Ed25519 signaturespem v3.0- PEM encoding for keysbase64 v0.22- Base64 encoding for signatures
-
Test Coverage: 10 integration tests (100% passing)
-
Build Time: No measurable impact (still ~26s clean, ~4s incremental)
-
Runtime Overhead:
- Signature verification: <5ms on first load (one-time cost)
- Fuel metering: <1% per execution
- Memory tracking: Negligible
┌─────────────────────────────────────────────────┐
│ Security Layers │
│ │
│ Layer 1: Cryptographic Verification │
│ - Ed25519 digital signatures │
│ - SHA-256 integrity checking │
│ │
│ Layer 2: Resource Limiting │
│ - CPU fuel metering (100M instructions) │
│ - Memory limits (128 MB) │
│ │
│ Layer 3: Filesystem Sandboxing │
│ - Directory preopening (WASI) │
│ │
│ Layer 4: Capability System │
│ - Explicit permission model (from v2.3) │
└─────────────────────────────────────────────────┘
Generate Keypair:
conductor-sign generate-key ~/.conductor/my-key
# Creates: my-key.pem (private), my-key.pub.pem (public)Sign Plugin:
conductor-sign sign my_plugin.wasm ~/.conductor/my-key \
--name "Your Name" \
--email "you@example.com"
# Creates: my_plugin.wasm.sig (detached signature)Verify Signature:
conductor-sign verify my_plugin.wasm
# Output: Signature verified successfully (shows metadata)Manage Trust Store:
# Add trusted key
conductor-sign trust add ~/.conductor/my-key.pub.pem "My Plugin"
# List trusted keys
conductor-sign trust list
# Remove trusted key
conductor-sign trust remove <public-key-hex>Configuration (Trusted Keys Mode):
[[modes.mappings]]
trigger = { Note = { note = 60 } }
action = { WasmPlugin = {
path = "~/.conductor/wasm-plugins/my_plugin.wasm",
signature_policy = "trusted_keys_only", # Require pre-approved keys
max_fuel = 50000000, # 50M instructions
max_memory_mb = 64, # 64 MB limit
allowed_dirs = [
{ path = "~/.conductor/plugin-data", writable = true }
]
}}- Signature Verification: <5ms (one-time on load)
- Fuel Metering Overhead: <1% per execution
- Memory Tracking: Negligible overhead
- No impact on MIDI event processing latency: Still <1ms
None - fully backward compatible with v2.6.0. Unsigned plugins continue to work with security warnings.
- Pull latest code:
git pull origin main - Build release:
cargo build --release --workspace - Install CLI tool:
cargo install --path conductor-daemon --bin conductor-sign - (Optional) Generate signing keys:
conductor-sign generate-key ~/.conductor/my-key - (Optional) Sign existing plugins:
conductor-sign sign plugin.wasm ~/.conductor/my-key - (Optional) Configure trust store for maximum security
- Unsigned plugins: Display security warnings but execute (backward compatibility)
- Self-signed plugins: Verify signature authenticity, no pre-approval needed
- Trusted keys mode: Maximum security - only execute plugins from approved developers
- Resource limits: Prevent denial-of-service attacks from runaway plugins
- Filesystem sandboxing: Prevent unauthorized file access
- No network sandboxing yet: WASM plugins can make network requests if capability granted
None
- v2.8: Plugin marketplace with discovery and distribution
- v2.9: Network sandboxing for WASM plugins
- v3.0: Windows and Linux platform support for app detection
2.3.0 - 2025-01-18
Phase 6: Extensible plugin system allowing third-party developers to create custom actions through dynamically loaded shared libraries with capability-based security.
-
ActionPlugin Trait (335 lines) - Core plugin interface with 7 methods
name(),version(),description(),author(),license()- Metadata methodsexecute()- Main execution method with params and contextcapabilities()- Capability requirements declarationinitialize()/shutdown()- Optional lifecycle hooks
-
Plugin Loader (259 lines) - Dynamic library loading via libloading
- Platform-specific binary support (.dylib/.so/.dll)
- Symbol resolution for
_create_pluginC-ABI function - Version compatibility checking
- Safe trait object handling
-
Plugin Discovery (440 lines) - Manifest-based plugin registry
- Scans
~/.conductor/plugins/forplugin.tomlmanifests - TOML-based plugin metadata parsing
- Plugin registry with HashMap storage
- Duplicate detection and validation
- Scans
-
Capability System (172 lines) - Permission-based security model
- 6 Capability Types: Network, Filesystem, Audio, Midi, Subprocess, SystemControl
- 3 Risk Levels: Low (auto-grant), Medium, High (explicit approval)
- Auto-grant for safe capabilities (Network, Audio, Midi)
- Per-plugin capability tracking
-
PluginManager (645 lines) - Lifecycle and execution management
- Thread-safe with Arc<RwLock>> for concurrent access
- Plugin lifecycle: discover → load → initialize → execute → shutdown → unload
- SHA256 binary verification (optional)
- Execution statistics (call count, failures, latency)
- Error handling with comprehensive error types
-
Action::Plugin Integration - Seamless action execution
- New
Action::Plugin { plugin, params }variant - TriggerContext propagation (velocity, mode, timestamp)
- JSON parameter support via serde_json::Value
- Backward compatible with existing actions
- New
-
Plugin Management UI (850 lines) - Complete plugin control interface
- Plugin discovery and listing with metadata cards
- Load/unload controls for lifecycle management
- Enable/disable toggles for plugin availability
- Capability grant/revoke with risk level indicators
- Execution statistics display (calls, failures, latency)
- Search and filtering by name, type, capabilities
- Risk level badges (color-coded: green/yellow/red)
-
Tauri Backend Commands (274 lines) - 11 plugin management commands
plugin_discover- Scan for new pluginsplugin_list_available/plugin_list_loaded- List pluginsplugin_get_metadata- Fetch plugin detailsplugin_load/plugin_unload- Lifecycle controlplugin_enable/plugin_disable- Toggle availabilityplugin_grant_capability/plugin_revoke_capability- Permission managementplugin_get_stats- Get execution metrics
- HTTP Request Plugin (265 lines + 200 lines docs) - Reference implementation
- HTTP methods: GET, POST, PUT, DELETE
- Custom headers support
- JSON body with velocity substitution (
{velocity}placeholder) - Error handling and logging
- 5 unit tests covering all features
- Complete README with usage examples
-
Plugin Development Guide (850+ lines) - Comprehensive tutorial
- Quick start guide with step-by-step instructions
- Complete API reference
- Capability system explanation
- Testing strategies
- Distribution instructions
- Best practices and troubleshooting
-
mdbook Integration - Added to documentation site
/development/plugin-development.md- Developer guide- Integration with existing documentation structure
- Production Code: ~5,800 lines across 11 new files
- Test Coverage: 42 plugin-specific tests (100% passing)
- Dependencies Added: libloading, sha2
- Build Time: No measurable impact (still ~26s clean, ~4s incremental)
- Runtime Overhead: <0.1ms per plugin execution
- Capability-based permission system prevents unauthorized access
- Risk-level assessment (Low/Medium/High) with auto-grant logic
- SHA256 checksum verification for binary integrity
- Plugins run in same process (not sandboxed) - trust required
- GUI displays risk levels clearly with color-coded badges
- Plugin loading: ~10-50ms per plugin (one-time cost)
- Discovery: ~5ms for 10 plugins
- Execution overhead: <0.1ms per action
- No impact on existing action types
None - fully backward compatible with v2.2.0
- Pull latest code
- Run
cargo build --release - Create
~/.conductor/plugins/directory - Install plugins as needed
- Use GUI Plugin Manager to manage plugins
None
2.2.0 - 2025-11-18
Phase 5 (Part 2): Context-aware mappings and velocity-sensitive controls enabling dynamic workflows that adapt to time, application context, and input intensity.
-
10 Condition Types: Build complex conditional logic for context-aware actions
Always/Never- Testing and debugging conditionsTimeRange- Time-based workflows (HH:MM format, supports midnight crossing)DayOfWeek- Day-based workflows (1=Monday through 7=Sunday)AppRunning- Process detection (macOS, Linux viapgrep)AppFrontmost- Active window detection (macOS via NSWorkspace)ModeIs- Current mode matching for mode-aware actionsAnd/Or- Logical operators with short-circuit evaluationNot- Logical negation for inverted conditions
-
Conditional Action Type: Execute different actions based on runtime conditions
then_action- Action executed when conditions are trueelse_action- Action executed when conditions are false- Nested conditions support (unlimited depth)
- Real-time condition evaluation with <1ms latency
-
4 Velocity Mapping Types: Transform trigger velocity to action-specific values
Fixed- Constant velocity output (ignore input velocity)PassThrough- 1:1 direct mapping (velocity unchanged)Linear- Custom min/max range scaling with configurable boundsCurve- Non-linear transformations with intensity control:- Exponential:
output = input^(1-intensity)- Boost soft hits - Logarithmic:
log(1 + intensity × input) / log(1 + intensity)- Compress hard hits - S-Curve: Sigmoid function with intensity-controlled steepness
- Exponential:
-
Integration with SendMIDI: Velocity mapping applies to MIDI output messages
- Map trigger velocity → MIDI NoteOn velocity dynamically
- Real-time curve calculation with <0.1ms overhead
- Visual curve preview in GUI
- TriggerContext Enhancement: Actions now receive current mode information
current_mode: Option<usize>field added to TriggerContext- Enables
ModeIscondition evaluation - Backward compatible (optional field)
-
ConditionalActionEditor (596 lines)
- Visual condition builder for all 10 condition types
- Time picker for TimeRange conditions
- Day selector for DayOfWeek conditions
- App selector with process detection
- Logical operator composition (And/Or/Not)
- Nested condition support with tree view
- Real-time validation with error display
-
VelocityMappingSelector
- Curve type selector (Fixed/PassThrough/Linear/Curve)
- Real-time curve preview graph (SVG visualization)
- 64-point curve sampling for smooth preview
- Interactive parameter controls (min/max/intensity)
- Visual feedback for curve shape
-
User Guides (2 new files, ~1,000 lines)
docs-site/src/guides/velocity-curves.md- Complete velocity mapping guide- All 4 mapping types with mathematical formulas
- Practical use cases and examples
- GUI configuration instructions
- Tips and best practices
docs-site/src/guides/context-aware.md- Context-aware mappings guide- All 10 condition types documented
- Platform support notes (macOS/Linux/Windows)
- Real-world practical examples
- Nested condition patterns
-
Configuration References (2 new files, ~800 lines)
docs-site/src/configuration/curves.md- Complete TOML reference for velocity mappings- Parameter constraints and validation rules
- Intensity parameter guide
- Default behavior documentation
docs-site/src/configuration/conditionals.md- Complete TOML reference for conditions- All 10 condition types with syntax examples
- Nested conditions documentation
- Validation rules and performance notes
-
Tutorial (1 new file, ~500 lines)
docs-site/src/tutorials/dynamic-workflows.md- Step-by-step workflow tutorial- Beginner: Time-based app launcher
- Intermediate: Velocity-sensitive DAW control
- Advanced: Multi-condition smart assistant
- Best practices and debugging tips
-
Updated Files
docs-site/src/configuration/actions.md- Updated Conditional action referencedocs-site/src/SUMMARY.md- Added new guides and tutorial section
-
Condition Evaluation: <1ms for most conditions
- TimeRange/DayOfWeek: Very fast (system time lookup)
- ModeIs: Very fast (string comparison)
- AppFrontmost: Very fast (<1ms, native API)
- AppRunning: Moderate (~10ms, subprocess call)
- And/Or: Short-circuit evaluation for efficiency
-
Velocity Curve Calculation: <0.1ms
- No performance impact on MIDI event processing
- Memory usage: 5-10MB (no increase from v2.1)
- 145 Workspace Tests Passing (100% pass rate)
- conductor-core: 45 tests
- conductor-daemon: 74 tests
- conductor-gui: 26 tests (1 ignored)
- No regressions from v2.0 or v2.1
- Comprehensive condition evaluation test coverage
- Velocity curve calculation unit tests
TriggerContextstruct extended with optionalcurrent_modefield (backward compatible)ActionConfigenum extended withConditionalvariant- Condition evaluation system added to
conductor-daemon/src/conditions.rs(425 lines)
- Shell commands properly sanitized in conditional execution
- Safe system APIs for app detection (pgrep, NSWorkspace)
- Time parsing validated with error handling
- No user code execution in condition evaluation
2.1.0 - 2025-11-17
Phase 5 (Part 1): Full MIDI output support enabling DAW control, hardware synth integration, and MIDI routing capabilities.
- Platform-Specific Virtual Port Support
- macOS: CoreMIDI virtual sources via IAC Driver
- Linux: ALSA/JACK virtual port creation
- Windows: Physical port support (virtual requires loopMIDI driver)
- Auto-detection of virtual vs. physical ports
-
Core MIDI Output Engine (
conductor-core/src/midi_output.rs, 618 lines)- 11 public methods for port management
- Connection pooling for multiple output ports
- Thread-safe message queueing with
Arc<Mutex<VecDeque>> - Platform-conditional compilation for virtual port support
- Comprehensive error handling with
EngineError::MidiOutputvariants
-
Public API:
create_virtual_port(port_name: &str)- Create named virtual MIDI portlist_output_ports()- List all available MIDI output portsconnect_to_port(port_index: usize)- Connect to output port by indexsend_message(port_index: usize, message: &[u8])- Send raw MIDI bytesdisconnect_port(port_index: usize)- Close specific port connectiondisconnect_all()- Close all active connections
-
6 MIDI Message Types - Full MIDI 1.0 channel voice message support
NoteOn(0x90) - Trigger notes with velocity (0-127)NoteOff(0x80) - Release notesCC(Control Change, 0xB0) - Continuous controllers (CC 0-127, value 0-127)ProgramChange(0xC0) - Preset/patch selection (0-127)PitchBend(0xE0) - 14-bit pitch wheel control (-8192 to +8191)Aftertouch(0xD0) - Channel pressure (0-127)
-
Configuration Flexibility
- MIDI channel selection (0-15, displayed as 1-16 in UI)
- 19 message type aliases for readable configs (e.g., "note-on", "control-change")
- Sensible defaults (note=60/Middle C, velocity=100, channel=0)
- Comprehensive parameter validation with detailed error messages
-
MIDI Spec Compliance
- Status byte channel masking (0-15)
- Data byte masking (0-127, 7-bit values)
- 14-bit pitch bend encoding (LSB/MSB)
- Out-of-range value clamping
- Proper message framing per MIDI 1.0 specification
- MIDI Message Encoding (
conductor-daemon/src/action_executor.rs, ~280 lines)- Complete byte-level MIDI encoding for all 6 message types
- Channel byte manipulation (0x00-0x0F)
- Data byte validation and masking (0x7F)
- 14-bit pitch bend conversion (split into LSB/MSB bytes)
- Error handling for invalid parameters
- Integration with existing action execution pipeline
-
Tauri Commands (AMI-268, 224 lines)
list_midi_output_ports()- Lists all MIDI output ports with metadatatest_midi_output(port, note, velocity, duration)- Send test MIDI messagevalidate_send_midi_action(action_config)- Validate SendMIDI configurations- AppState integration with MidiOutputManager
-
MidiOutputSelector Component (AMI-269, 450 lines)
- Port selection dropdown with auto-refresh
- Virtual/physical port badges (🔷 blue for virtual, 🔌 green for physical)
- Platform badges (🍎 macOS, 🐧 Linux, 🪟 Windows)
- Test output button (sends Middle C for verification)
- Error/empty/loading state handling
- Dark theme matching existing Conductor GUI
-
SendMidiActionEditor Component (AMI-270, 800 lines)
- All 6 MIDI message type editors:
- Note On/Off: Note slider with musical note names (C4, D#5, etc.)
- Control Change: Common CC dropdown (Volume, Pan, Modulation, etc.)
- Program Change: Preset selector (0-127)
- Pitch Bend: Bidirectional indicator (-8192 to +8191)
- Aftertouch: Pressure control (0-127)
- MIDI channel selector (1-16 display)
- Dynamic parameter fields (change based on message type)
- Real-time validation with 300ms debounce
- Color-coded indicators (velocity bar, pitch bend direction)
- Integration with MidiOutputSelector
- Readonly mode for viewing existing configs
- All 6 MIDI message type editors:
-
Svelte Store Integration
midiOutputPortsStore- Centralized port state managementapi.midiOutput.*- API namespace for MIDI output operations- Real-time port refresh and validation
-
User Guide (
docs/send-midi-action-guide.md, ~580 lines)- Quick start tutorial (3 easy steps)
- All 6 message types with practical examples
- Platform-specific setup instructions:
- macOS: IAC Driver configuration
- Linux: ALSA/JACK virtual port creation
- Windows: loopMIDI driver installation
- Troubleshooting guide for common MIDI issues
- MIDI reference tables:
- Common CC numbers (Volume, Pan, Modulation, etc.)
- General MIDI drum map (kick=36, snare=38, etc.)
- MIDI note numbers with musical notation
-
Example Configurations (2 files, ~830 lines)
config/examples/daw-control-ableton.toml(~450 lines)- 3 modes: Instruments, Mixer, Effects
- 21+ real-world DAW control mappings
- MIDI panic sequence (all notes off)
- Arpeggio pattern examples
config/examples/hardware-synth-control.toml(~380 lines)- 4 modes: Performance, Sound Design, Presets, Multi-Synth Routing
- 27+ mappings for external hardware synths
- Chord stacking examples (power chords, triads)
- Multi-output routing for multiple synths
-
Technical Documentation (~4,500 lines across 7 files)
- Architecture design document
- Implementation completion report
- GUI integration reports (AMI-268, AMI-269, AMI-270)
- Final verification report
- Platform support matrix
- 47 New Tests (100% pass rate)
- 7 unit tests for MidiOutputManager
- 18 doctests for API documentation examples
- 10 integration tests for SendMIDI action (TOML parsing, validation, encoding)
- 12 unit tests for ActionExecutor MIDI encoding
- All edge cases covered (invalid channels, out-of-range values, etc.)
- MIDI message encoding: <0.1ms per message
- Port connection: <10ms
- Memory usage: 5-10MB (no significant increase)
- Zero latency overhead on MIDI event processing
- MIDI output restricted to configured ports only
- Data byte masking prevents buffer overruns
- Port index validation prevents out-of-bounds access
- Error messages do not expose system internals
2.0.0 - 2025-11-14
Phase 4 Complete: Full-featured visual configuration interface built with Tauri v2, providing an intuitive GUI for MIDI mapping management, MIDI Learn mode, per-app profiles, and real-time debugging.
-
Mode-Based Config Management: Create and manage modes with color coding
- Visual mode editor with inline editing
- Drag-and-drop mapping organization
- Real-time validation and preview
- Color-coded mode indicators
-
Mapping List UI: CRUD operations for MIDI mappings
- Add, edit, delete mappings
- Type-specific trigger and action selectors
- Live preview of trigger events
- Automatic validation and error highlighting
-
Trigger Selector: Visual selector with type-specific configuration
- Note, CC, VelocityRange, LongPress, DoubleTap, EncoderTurn, PitchBend, Aftertouch
- Context-aware form fields for each trigger type
- Real-time parameter validation
-
Action Selector: Visual selector with type-specific configuration
- Keystroke, Text, Launch, Shell, VolumeControl, ModeChange, Sequence, etc.
- Keystroke picker with live key capture
- Application launcher with file browser
- Shell command editor with syntax highlighting
- One-Click MIDI Learn: Auto-detect MIDI inputs with single click
- 10-second countdown timer with cancel option
- Auto-detection of trigger type (Note, CC, VelocityRange, etc.)
- Support for all trigger types
- Visual feedback during learning
- Automatic config generation from captured events
- Automatic Profile Switching: Context-aware mapping based on frontmost app
- macOS frontmost app detection via NSWorkspace
- Profile auto-switching when app focus changes
- Profile caching with SHA256-based validation
- Profile import/export (JSON and TOML formats)
- Profile discovery and auto-registration
- Profile manager UI with visual indicators
- 6 Built-in Controller Templates: Pre-configured mappings for popular devices
- Native Instruments Maschine Mikro MK3
- Novation Launchpad Mini MK3
- KORG nanoKONTROL2
- Akai APC Mini
- Arturia BeatStep
- Generic 25-Key MIDI Keyboard
- Auto-detection via MIDI device name pattern matching
- Category filtering (pad-controller, keyboard, mixer-controller)
- Template browser with search and filter
- One-click config generation from templates
- Real-time MIDI Event Monitoring: Debug MIDI inputs in real-time
- Color-coded event types (NoteOn=green, CC=blue, PitchBend=purple, etc.)
- Filter by event type and channel
- Pause/resume functionality
- Event count tracking
- Raw MIDI byte display (hex format)
- Note name display (C4, D#5, etc.)
- Timestamp with millisecond precision
- Application Preferences: Configure GUI behavior
- Auto-start on login (UI ready, OS integration TBD)
- Theme selection (Light/Dark/System, UI ready)
- MIDI Learn timeout adjustment (5-60 seconds)
- Event buffer size control (100-10,000 events)
- Log level configuration (Error/Warn/Info/Debug)
- About section with version and links
- Native System Tray: Platform-specific menu bar
- macOS: Native NSApplication menu bar
- Quick actions: Pause, Reload, Configure, Quit
- Status indicators: Running, Stopped, Error
- Minimize to tray functionality
-
Backend: Tauri v2.9.3 with Rust
- 40+ Tauri commands for IPC
- Thread-safe state with Arc<RwLock<>>
- JSON-based IPC protocol
- Event streaming for real-time updates
-
Frontend: Svelte 5.1.9 with Vite 6.4.1
- 14 custom UI components
- TypeScript for type safety
- Reactive state management
- Fast builds (~400ms)
- Daemon IPC: <1ms round-trip
- MIDI Learn start: <50ms
- Profile switching: <100ms
- Memory usage: ~60MB total
- Frontend build: <500ms
- macOS: Full support with native integration
- Linux: Basic support (app detection TBD)
- Windows: Basic support (app detection TBD)
Week 1-2: AMI-158-166 (Tauri Setup & Infrastructure) Week 3: AMI-171-174 (MIDI Learn Mode) Week 4: AMI-175-180 (Visual Config Editor) Week 5: AMI-181-184 (Per-App Profiles) Week 6: AMI-185-187 (Polish & Release)
- Documentation site not yet updated (deferred to Phase 5)
- Auto-start OS integration pending (UI complete)
- Theme switching implementation pending (UI complete)
- App detection macOS-only (Linux/Windows TBD)
- Drag-and-drop mapping reorder planned but not implemented
1.0.0 - 2025-01-13
Phase 3 Complete: Full daemon architecture with hot-reload, IPC control, and service integration. This is the first production-ready release with zero-downtime configuration updates.
- Background Daemon Service: Runs as persistent background service
- Unix domain socket IPC for inter-process communication
- Graceful shutdown with SIGTERM/SIGINT handling
- State persistence across restarts (
~/.local/state/conductor/daemon.state) - 8-state lifecycle machine (Initializing → Running → Reloading → Degraded → etc.)
- Atomic config swaps using Arc<RwLock<>> pattern
- Zero-Downtime Config Reload: Changes detected and applied in 0-10ms typical
- File system watcher with 500ms debounce window
- Automatic change detection on config file save
- Phase-by-phase timing (config load, mapping compile, atomic swap)
- Performance grading system:
- Grade A (<20ms): Excellent - Imperceptible
- Grade B (21-50ms): Good - Target performance
- Grade C (51-100ms): Acceptable
- Grade D (101-200ms): Poor - Investigate
- Grade F (>200ms): Unacceptable
- Running statistics (fastest, slowest, average reload times)
- Reload counter and performance history
- Command-Line Interface: Control daemon from terminal or scripts
status- Query daemon state, uptime, events processed, reload statsreload- Force immediate configuration reloadping- Test connectivity and measure IPC latencystop- Gracefully stop daemonvalidate [--config PATH]- Validate configuration files- Dual output modes:
- Human-readable: Colored terminal output with Unicode symbols
- JSON: Machine-readable for scripting (
--jsonflag)
- Verbose logging mode (
--verboseflag)
-
systemd Service Template (
conductor-daemon/systemd/conductor.service):- User-level service support
- Auto-restart on failure (5s throttle, max 5 bursts per 5 minutes)
- Security hardening (NoNewPrivileges, ProtectSystem=strict, ProtectHome=read-only)
- Resource limits (1024 file descriptors, 64 processes)
- Journal logging integration
- ExecReload support via conductorctl
-
macOS LaunchAgent (
conductor-daemon/launchd/com.amiable.conductor.plist):- Run at login with LaunchAgent plist
- Crash recovery with 5s throttled restart
- Process priority configuration (Nice -5 for low latency)
- Log file rotation to
~/Library/Logs/conductor.log - GUI session integration (LimitLoadToSessionType: Aqua)
-
Man Pages: Professional Unix manual pages
conductor(1)- Daemon manual (trigger types, action types, config format)conductorctl(1)- CLI tool reference (commands, options, examples)- Installation to
/usr/local/share/man/man1/
-
DEPLOYMENT.md: Comprehensive deployment guide (500+ lines)
- Quick start instructions
- Platform-specific installation (macOS LaunchAgent, Linux systemd)
- Service management commands
- Configuration management
- Monitoring and log analysis
- Troubleshooting guide with common issues
- Performance benchmarking guide
- Uninstallation procedures
-
Performance Metrics (
daemon/types.rs):- Config load timing (ms)
- Mapping compilation timing (ms)
- Atomic swap timing (ms)
- Total reload duration (ms)
- Performance grade calculation (A-F)
-
Daemon Statistics (
daemon/types.rs):- Events processed counter
- Actions executed counter
- Error tracking since start
- Config reload counter
- Uptime tracking (seconds)
- Reload performance history
-
Reload Benchmark Suite (
conductor-daemon/benches/reload_benchmark.rs):- Multiple config sizes (2-10 modes, 10-100 mappings)
- 10 iterations per test for statistical reliability
- Average, min, max timing measurements
- Performance grading validation
-
Daemon Integration Tests:
- IPC protocol tests (request/response cycle)
- Config reload tests (atomic swaps, no downtime)
- State machine transition tests
- Error handling tests
- 45 tests total, all passing (1 marked
#[ignore]for CI flakiness)
-
conductor-daemon structure:
- Added
src/daemon/module (7 files, ~2,000 lines)service.rs- Main daemon service loopengine_manager.rs- Engine lifecycle managementconfig_watcher.rs- File system watching with debouncingipc.rs- IPC server and clientstate.rs- State persistence and socket path logictypes.rs- IPC protocol types, metrics, statisticserror.rs- Daemon-specific error types
- Added
src/bin/conductorctl.rs- CLI control tool (360 lines) - Added
src/bin/conductor_menubar.rs- Menu bar foundation (262 lines, incomplete) - Added
benches/reload_benchmark.rs- Performance benchmarking (166 lines)
- Added
-
IPC Client API (
daemon/ipc.rs):- Added
IpcClient::new(socket_path)for custom socket paths - Added
IpcClient::send_command(command, args)for generic command sending - Existing methods (
ping,status,reload,stop) now use generic API
- Added
Config Reload Optimization: 5-6x faster than 50ms target
Benchmark results (Apple M1 MacBook Pro):
| Config Size | Reload Time | Grade | Improvement |
|---|---|---|---|
| 2 modes, 10 mappings | 0-2ms | A | 10-25x faster |
| 5 modes, 50 mappings | 2-5ms | A | 10-25x faster |
| 10 modes, 100 mappings | 5-8ms | A | 6-10x faster |
All configurations achieve Grade A performance (<20ms).
- notify-debouncer-full API: Updated to v0.4 API (deprecated
.watcher()and.cache()methods) - Config Format: Fixed Keystroke action format in benchmarks (string keys, not array)
- Import Warnings: Removed unused imports from daemon modules
- Test Reliability: Marked file watcher test as
#[ignore]for CI stability (file watching is inherently timing-sensitive)
-
Menu Bar UI: Foundation created but incomplete
- Send/Sync issues with
tray-iconcrate on macOS - Platform-specific threading model constraints
- Requires platform-specific implementations or Tauri framework
- Documented for future Phase 3 work
- Send/Sync issues with
-
Windows Support: Not yet implemented
- IPC requires named pipes implementation
- Service integration requires Windows Service framework
- Planned for future release
No breaking changes - All v0.2.0 configurations work identically.
New daemon features to adopt:
-
Install as Service (recommended):
# macOS launchctl load ~/Library/LaunchAgents/com.amiable.conductor.plist # Linux systemctl --user enable conductor systemctl --user start conductor
-
Use conductorctl for Control:
conductorctl status # Check daemon health conductorctl reload # Apply config changes conductorctl ping # Test connectivity
-
Enable Hot-Reload:
- Edit
~/.config/conductor/config.toml - Changes automatically detected and applied in <10ms
- No daemon restart needed
- Edit
Manual mode still supported:
conductor --config config.toml --log-level debugtokio(1.40) - Async runtime for daemon event loopinterprocess(2.2) - Cross-platform IPC (Unix sockets)notify(7.0) - File system change notificationsnotify-debouncer-full(0.4) - Debounced file eventstray-icon(0.19) - System tray integration (foundation)dirs(5.0) - Standard directory paths (XDG Base Directory)uuid(1.0) - Request ID generation for IPCsha2(0.10) - Config checksums for integrity verificationtracing(0.1) - Structured loggingtracing-subscriber(0.3) - Log formatting and filtering
- All workspace dependencies remain at v0.2.0 versions
Measured on Apple M1 MacBook Pro:
- MIDI Event Latency: <1ms (unchanged)
- Config Reload Time: 0-10ms typical (Grade A: <20ms)
- Startup Time: <500ms
- Memory Usage: 5-10MB (unchanged)
- CPU Usage: <1% idle, <5% active (unchanged)
- Binary Size: ~3-5MB (unchanged)
- Christopher Joseph (@christopherjoseph) - All v1.0.0 features
- conductor-v1.0.0-macos-arm64.tar.gz (Apple Silicon)
- conductor-v1.0.0-macos-x86_64.tar.gz (Intel)
- conductor-v1.0.0-linux-x86_64.tar.gz (Linux)
- checksums.txt (SHA256)
0.2.0 - 2025-11-12
Phase 2 Complete: Workspace architecture migration with zero breaking changes. Conductor now uses a modular 3-package workspace structure, enabling better code organization, faster builds, and preparing for future GUI integration.
100% Backward Compatible: All v0.1.0 configs, features, and workflows work identically in v0.2.0.
- conductor-core: Pure Rust engine library (zero UI dependencies)
- Public API for embedding in other applications
- Structured error types using
thiserror - Comprehensive rustdoc documentation
- 30+ public types exported
- conductor-daemon: CLI daemon + 6 diagnostic tools
- Main
conductorbinary midi_diagnostic,led_diagnostic,led_testerpad_mapper,test_midi,midi_simulator
- Main
- conductor (root): Backward compatibility layer
- Re-exports conductor-core types
- Maintains v0.1.0 import paths
- Zero breaking changes for existing tests
- 25 new integration tests (339 tests total, was 314)
- 8 API integration tests (public API surface)
- 7 backward compatibility tests
- 10 error handling tests (across crate boundaries)
- 100% feature validation: All 26 features tested and working
- Config compatibility tests: All v0.1.0 configs validated
- Build time: 11.92s clean build (was 15-20s) - 25-40% faster ✨
- Workspace parallelization across 3 packages
- Improved incremental compilation
- Test execution: 28.8s (was ~30s) - 4% faster
- Parallel test execution per package
- Binary size: Unchanged (869K main binary)
- Renamed
src/mappings.rs→conductor-core/src/mapping.rs - Renamed
src/device_profile.rs→conductor-core/src/device.rs - Added
conductor-core/src/error.rs(structured error types) - Split monolithic src/ into modular workspace packages
- Removed UI dependencies (colored, chrono) from core library
- CLAUDE.md: Updated with workspace architecture and Phase 2 status
- README.md: Updated installation and build commands
- mdbook: Updated architecture diagrams
- Rustdoc: Comprehensive API documentation in conductor-core
- Migration Guide: docs/MIGRATION_v0.1_to_v0.2.md
- Feature Parity: 26/26 features validated ✅
- Config Compatibility: 15 compatibility tests passing ✅
- Breaking Changes: 0 (zero) ✅
- Test Coverage: 339/339 tests passing (100%) ✅
For Users: No action required. All configs and workflows work identically.
For Developers: Update build commands:
# Old
cargo build --release
cargo test
# New
cargo build --release --workspace
cargo test --workspaceSee docs/MIGRATION_v0.1_to_v0.2.md for complete guide.
0.1.0-monolithic - 2025-11-11
Initial public release of Conductor, preserving the complete working monolithic implementation with all 26 features before migration to workspace structure. This release establishes the foundation for open source development and community contributions.
- Note Trigger: Basic note on/off detection with optional velocity range filtering
- VelocityRange Trigger: Different actions for soft (0-40), medium (41-80), and hard (81-127) velocity levels
- EncoderTurn Trigger: Encoder rotation detection with clockwise/counterclockwise direction
- CC (Control Change) Trigger: MIDI Control Change message handling
- LongPress Trigger: Configurable hold duration detection (default 2000ms)
- DoubleTap Trigger: Quick double-tap detection with configurable window (default 300ms)
- NoteChord Trigger: Multiple simultaneous note detection (default 100ms chord window)
- Aftertouch Trigger: Pressure sensitivity detection for supported devices
- PitchBend Trigger: Touch strip/pitch wheel detection with range support
- Keystroke Action: Keyboard shortcuts with full modifier support (Cmd, Ctrl, Alt, Shift)
- Text Action: Type text strings with automatic character conversion
- Launch Action: Open applications and files with system default handlers
- Shell Action: Execute shell commands and scripts with full environment access
- VolumeControl Action: System volume adjustment (Up, Down, Mute, Set to value)
- ModeChange Action: Switch between mapping modes with LED feedback
- Sequence Action: Chain multiple actions with timing control
- Delay Action: Add timing delays between actions (milliseconds)
- MouseClick Action: Simulate mouse button clicks (Left, Right, Middle)
- Repeat Action: Execute an action multiple times with optional delays
- Off: All LEDs disabled
- Static: Solid color display with configurable RGB values
- Breathing: Smooth pulsing fade in/out effect
- Pulse: Quick flash effect for event triggers
- Rainbow: Animated rainbow color cycle across pads
- Wave: Wave pattern sweeping across pad grid
- Sparkle: Random sparkle/twinkle effects
- Reactive: Velocity-sensitive color feedback (green=soft, yellow=medium, red=hard) with 1-second fade
- VU Meter: Audio level meter visualization
- Spiral: Spiral pattern animation from center outward
- Multi-Mode System: Support for multiple mapping modes (Default, Development, Media, etc.) with independent configurations
- Global Mappings: Mappings that work across all modes (e.g., emergency exit, encoder volume control)
- Device Profile Support: Load Native Instruments Controller Editor profiles (.ncmm3 XML format)
- Auto-Detect Pad Page: Automatically detect active pad page (A-H) from incoming MIDI events
- HID Shared Device Access: Concurrent access with Native Instruments Controller Editor using
hidapiwithmacos-shared-devicefeature - Graceful Shutdown: Clean MIDI connection closure and LED reset on exit (Ctrl+C handling)
- Debug Logging: Environment variable DEBUG=1 enables detailed event and processing logs
- midi_diagnostic: Visualize all incoming MIDI events with formatted display
- led_diagnostic: Test RGB LED functionality and HID connection
- led_tester: Interactive LED scheme testing utility
- pad_mapper: Utility for mapping physical pad positions to MIDI notes
- README.md with quick start guide and feature overview
- CLAUDE.md with comprehensive project instructions and architecture
- LED_FEEDBACK.md with LED system documentation
- CODE_OF_CONDUCT.md (Contributor Covenant v2.1)
- CONTRIBUTING.md with contribution guidelines
- GOVERNANCE.md defining project structure and decision-making
- MAINTAINERS.md listing current maintainers
- ROADMAP.md outlining project vision and development phases
- SECURITY.md with vulnerability reporting process
- Example config.toml with common mapping patterns
- GitHub Actions CI/CD pipeline (build, test, clippy, format checks)
- Issue templates (bug report, feature request, device support, documentation)
- Pull request template with comprehensive checklist
- SUPPORT.md documenting support channels
- Pre-commit hook setup for code quality
- VS Code configuration (.vscode/settings.json, launch.json, tasks.json)
- Build scripts (scripts/build.sh, test.sh, dev-setup.sh, clean.sh)
- .editorconfig for cross-editor consistency
- rust-toolchain.toml pinning Rust version
- MIT License with copyright notice
- Copyright headers in all source files
- NOTICE file with third-party attributions
- THIRD_PARTY_LICENSES.md documenting all dependency licenses
- Trademark disclaimer for Native Instruments references
- SPDX license identifier in Cargo.toml
- Response latency: <1ms typical for MIDI event processing
- Memory footprint: 5-10MB steady state
- CPU usage: <1% idle, <5% during active use
- Binary size: 3-5MB (release build with LTO and stripping)
- macOS 11+ (Big Sur and later)
- Apple Silicon (ARM64) and Intel (x86_64) architectures
- Requires Input Monitoring permission for HID device access
- Fully Supported: Native Instruments Maschine Mikro MK3 (RGB LEDs, HID access, profile support)
- MIDI-Only Support: Any USB MIDI controller with basic LED feedback via MIDI Note messages
- Profile Support: .ncmm3 files from Native Instruments Controller Editor
- macOS only (Linux and Windows support planned for Phase 4)
- Single device support (multi-device planned for Phase 4)
- No GUI for configuration (Tauri UI planned for Phase 3)
- Config changes require restart (hot reload planned for Phase 2)
- No virtual MIDI output (planned for Phase 4)
Major external crates:
- midir 0.9 - Cross-platform MIDI I/O
- enigo 0.2 - Keyboard/mouse input simulation
- hidapi 2.6 - HID device access with macOS shared device support
- serde 1.0 + toml 0.8 - Configuration parsing
- quick-xml 0.36 - XML profile parsing (.ncmm3 files)
- crossbeam-channel 0.5 - Lock-free event channels
- colored 2.1 - Terminal output formatting
- ctrlc 3.4 - Graceful shutdown handling
All dependencies use MIT, Apache-2.0, or BSD-compatible licenses.
This v0.1.0-monolithic release preserves the working single-binary implementation before architectural migration to workspace structure (Phase 2-4). Future versions will maintain backward compatibility with existing config.toml files.
- Christopher Joseph (@christopherjoseph) - Project Lead & Creator
- conductor-v0.1.0-macos-arm64.tar.gz (Apple Silicon)
- conductor-v0.1.0-macos-x86_64.tar.gz (Intel)
- checksums.txt (SHA256)
- v3.0.0 (2025-11-21): Multi-protocol input with game controller support 🎮
- v2.7.0 (2025-11-19): Plugin security & verification ✨
- v2.3.0 (2025-01-18): Plugin architecture
- v2.2.0 (2025-11-18): Velocity curves & conditionals
- v2.1.0 (2025-11-17): Virtual MIDI output
- v2.0.0 (2025-11-14): Tauri GUI & visual config
- v1.0.0 (2025-01-13): Production daemon with hot-reload
- v0.2.0 (2025-11-12): Workspace architecture migration
- v0.1.0-monolithic (2025-11-11): Initial public release with 26 features
- Unreleased: Next version in development
This changelog follows Keep a Changelog format:
- Added: New features
- Changed: Changes to existing functionality
- Deprecated: Soon-to-be-removed features
- Removed: Removed features
- Fixed: Bug fixes
- Security: Security vulnerability fixes
Version numbers follow Semantic Versioning:
- MAJOR: Breaking changes to config format or public API
- MINOR: New features, backward-compatible
- PATCH: Bug fixes, performance improvements