{"id":35004981,"url":"https://github.com/bernardopg/iaruba","last_synced_at":"2025-12-31T00:33:18.044Z","repository":{"id":329881275,"uuid":"1120867289","full_name":"bernardopg/iaruba","owner":"bernardopg","description":"🎚️ Functional audio mixer with hardware control for Linux","archived":false,"fork":false,"pushed_at":"2025-12-22T04:45:42.000Z","size":49,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-23T15:59:30.283Z","etag":null,"topics":["arduino","audio","functional-programming","gtk","haskell","linux","mixer","pulseaudio"],"latest_commit_sha":null,"homepage":null,"language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bernardopg.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-22T04:30:22.000Z","updated_at":"2025-12-22T04:45:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bernardopg/iaruba","commit_stats":null,"previous_names":["bernardopg/iaruba"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/bernardopg/iaruba","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bernardopg%2Fiaruba","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bernardopg%2Fiaruba/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bernardopg%2Fiaruba/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bernardopg%2Fiaruba/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bernardopg","download_url":"https://codeload.github.com/bernardopg/iaruba/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bernardopg%2Fiaruba/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28072321,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-27T02:00:05.897Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arduino","audio","functional-programming","gtk","haskell","linux","mixer","pulseaudio"],"created_at":"2025-12-27T04:34:39.044Z","updated_at":"2025-12-27T04:34:39.648Z","avatar_url":"https://github.com/bernardopg.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Iarubá - Functional Audio Mixer for Linux\n\n\u003cdiv align=\"center\"\u003e\n\n![License](https://img.shields.io/badge/license-MIT-blue.svg)\n![Haskell](https://img.shields.io/badge/language-Haskell-purple.svg)\n![Platform](https://img.shields.io/badge/platform-Linux-green.svg)\n\n**A modern, functional reimplementation of hardware-based audio control with a beautiful GUI**\n\n[Features](#features) • [Installation](#installation) • [Quick Start](#quick-start) • [Documentation](#documentation) • [Contributing](#contributing)\n\n\u003c/div\u003e\n\n---\n\n## Overview\n\n**Iarubá** is a Linux-native audio control system that bridges physical hardware (Arduino-based sliders) with your system's audio. Inspired by [deej](https://github.com/omriharel/deej), Iarubá is built from the ground up in Haskell with a focus on:\n\n- **Functional purity** - Predictable, testable, maintainable code\n- **Modern UI/UX** - Clean GTK-based interface with dark/light themes\n- **Linux-first** - Full PulseAudio and PipeWire support\n- **Extensibility** - Plugin system, profiles, and rich configuration\n\nControl individual application volumes, master output, microphone input, and more with physical sliders connected to an Arduino.\n\n## Features\n\n### Core Functionality\n- **Hardware Integration** - USB serial communication with Arduino-based sliders\n- **Granular Audio Control** - Per-application volume, master volume, mic input\n- **Real-time Visualization** - Live audio level meters with smooth animations\n- **Profile System** - Quick-switch between audio configurations (work, gaming, streaming)\n\n### Modern Interface\n- **GTK+ 3 GUI** - Native Linux look and feel\n- **Dark/Light Themes** - Automatic or manual theme switching\n- **System Tray Integration** - Minimize to tray, quick controls\n- **Keyboard Shortcuts** - Fully customizable hotkeys\n\n### Configuration Management\n- **YAML-based Config** - Human-readable, version-controllable\n- **Live Reload** - Changes apply immediately without restart\n- **Validation** - Detailed error messages for invalid configurations\n- **Auto-rollback** - Automatically reverts to last working config on errors\n\n### Productivity Features\n- **Integrated Task Manager** - Track TODOs with priority and categorization\n- **Desktop Notifications** - Reminders and audio event alerts\n- **Interactive Documentation** - Built-in tutorials and help system\n- **Calendar Integration** - Sync tasks with your calendar\n\n### Developer Experience\n- **Automatic Documentation** - Generated API docs and guides\n- **Comprehensive Testing** - Property-based and integration tests\n- **CI/CD Ready** - GitHub Actions workflows included\n- **Extensible Architecture** - Clean module boundaries for easy contributions\n\n## Installation\n\n### Prerequisites\n\n**System Dependencies:**\n```bash\n# Debian/Ubuntu\nsudo apt install libpulse-dev libgtk-3-dev libappindicator3-dev\n\n# Fedora\nsudo dnf install pulseaudio-libs-devel gtk3-devel libappindicator-gtk3-devel\n\n# Arch Linux\nsudo pacman -S libpulse gtk3 libappindicator-gtk3\n```\n\n**Haskell Stack:**\n```bash\ncurl -sSL https://get.haskellstack.org/ | sh\n```\n\n**Arduino Setup:**\n```bash\n# Add user to dialout group for serial access\nsudo usermod -a -G dialout $USER\n# Log out and back in for changes to take effect\n```\n\n### Build from Source\n\n```bash\n# Clone the repository\ngit clone https://github.com/yourusername/iaruba.git\ncd iaruba\n\n# Build\nstack build\n\n# Install to ~/.local/bin\nstack install\n\n# Run\niaruba\n```\n\n### Hardware Setup\n\n1. **Build the Arduino Circuit:**\n   - Connect 5 potentiometers to analog pins A0-A4\n   - See `docs/guides/hardware-setup.md` for detailed wiring diagrams\n\n2. **Upload Arduino Sketch:**\n   ```bash\n   cd arduino/iaruba-mixer\n   # Using Arduino IDE: Open and upload\n   # OR using PlatformIO:\n   pio run --target upload\n   ```\n\n3. **Configure Serial Port:**\n   - Edit `config/iaruba.yaml`\n   - Set `serial_port` to your Arduino device (e.g., `/dev/ttyUSB0`)\n\n## Quick Start\n\n### First Run\n\n1. **Launch Iarubá:**\n   ```bash\n   iaruba\n   ```\n\n2. **Configure Slider Mappings:**\n   - Click the settings icon or press `Ctrl+,`\n   - Map each slider to applications or system outputs\n   - Save configuration\n\n3. **Test Sliders:**\n   - Move physical sliders\n   - Watch volume levels change in the GUI\n   - Verify audio output adjusts accordingly\n\n### Example Configuration\n\n`config/iaruba.yaml`:\n```yaml\nserial:\n  port: /dev/ttyUSB0\n  baud_rate: 9600\n\nsliders:\n  - id: 0\n    name: \"Master Volume\"\n    targets:\n      - type: master\n\n  - id: 1\n    name: \"Music\"\n    targets:\n      - type: application\n        name: \"Spotify\"\n      - type: application\n        name: \"rhythmbox\"\n\n  - id: 2\n    name: \"Browser\"\n    targets:\n      - type: application\n        name: \"Firefox\"\n      - type: application\n        name: \"Chrome\"\n\n  - id: 3\n    name: \"Communications\"\n    targets:\n      - type: application\n        name: \"Discord\"\n      - type: application\n        name: \"Slack\"\n\n  - id: 4\n    name: \"Microphone\"\n    targets:\n      - type: source\n        name: \"default_microphone\"\n\naudio:\n  noise_reduction: default\n  smooth_transitions: true\n  transition_duration_ms: 50\n\ngui:\n  theme: dark\n  show_visualizers: true\n  tray_icon: true\n```\n\n## Documentation\n\n- **[User Guide](docs/guides/user-guide.md)** - Complete usage instructions\n- **[Hardware Setup](docs/guides/hardware-setup.md)** - Wiring diagrams and Arduino setup\n- **[Configuration Reference](docs/guides/configuration.md)** - All config options explained\n- **[API Documentation](docs/api/)** - Haddock-generated API docs\n- **[Architecture Overview](CLAUDE.md)** - For developers\n\n## Development\n\n### Project Structure\n\n```\niarubá/\n├── src/               # Haskell source code\n│   ├── Audio/        # PulseAudio/PipeWire integration\n│   ├── GUI/          # GTK interface components\n│   ├── Config/       # Configuration management\n│   ├── Hardware/     # Serial communication\n│   ├── Tasks/        # Task management system\n│   └── Utils/        # Shared utilities\n├── app/              # Main application entry point\n├── test/             # Test suites\n├── arduino/          # Arduino firmware\n├── docs/             # Documentation\n├── config/           # Example configurations\n└── assets/           # Icons, themes, resources\n```\n\n### Running Tests\n\n```bash\n# All tests\nstack test\n\n# Specific test suite\nstack test :iaruba-test\n\n# With coverage\nstack test --coverage\n\n# Watch mode (using ghcid)\nghcid --command \"stack ghci iaruba:lib iaruba:test:iaruba-test\" --test \"main\"\n```\n\n### Code Style\n\nWe use [Ormolu](https://github.com/tweag/ormolu) for formatting and [HLint](https://github.com/ndmitchell/hlint) for linting:\n\n```bash\n# Format all code\nfind src -name \"*.hs\" -exec ormolu -i {} \\;\n\n# Run linter\nstack exec -- hlint src/\n```\n\n## Contributing\n\nContributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n### Development Workflow\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature/my-feature`\n3. Make your changes\n4. Run tests: `stack test`\n5. Format code: `ormolu -i src/**/*.hs`\n6. Commit with descriptive message\n7. Push and create a Pull Request\n\n## Roadmap\n\n- [ ] Windows support via WASAPI\n- [ ] macOS support via CoreAudio\n- [ ] Plugin system for custom audio processors\n- [ ] Web interface for remote control\n- [ ] MIDI controller support\n- [ ] Equalizer presets per application\n- [ ] Cloud profile sync\n- [ ] Mobile app for remote control\n\n## Inspiration\n\nThis project is inspired by:\n- [deej](https://github.com/omriharel/deej) - The original hardware audio mixer\n- [PulseAudio](https://www.freedesktop.org/wiki/Software/PulseAudio/) - Linux audio server\n- [PipeWire](https://pipewire.org/) - Modern multimedia framework\n\n## License\n\nMIT License - see [LICENSE](LICENSE) for details.\n\n## Support\n\n- **Issues:** [GitHub Issues](https://github.com/yourusername/iaruba/issues)\n- **Discussions:** [GitHub Discussions](https://github.com/yourusername/iaruba/discussions)\n- **Documentation:** [Wiki](https://github.com/yourusername/iaruba/wiki)\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**Made with ❤️ using Haskell**\n\n[⬆ Back to Top](#iarubá---functional-audio-mixer-for-linux)\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbernardopg%2Fiaruba","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbernardopg%2Fiaruba","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbernardopg%2Fiaruba/lists"}