{"id":29279335,"url":"https://github.com/arach/dials","last_synced_at":"2026-05-09T16:04:58.853Z","repository":{"id":301778324,"uuid":"1010284761","full_name":"arach/dials","owner":"arach","description":"MacOS utility dials","archived":false,"fork":false,"pushed_at":"2025-09-05T01:20:02.000Z","size":871,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-05T03:19:16.995Z","etag":null,"topics":["automation","macos","raycast","shortcuts","swift","utilities"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arach.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-06-28T18:37:54.000Z","updated_at":"2025-09-05T01:20:06.000Z","dependencies_parsed_at":null,"dependency_job_id":"caa966ff-48a7-4c4d-af62-2373af3611c1","html_url":"https://github.com/arach/dials","commit_stats":null,"previous_names":["arach/dials"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/arach/dials","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arach%2Fdials","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arach%2Fdials/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arach%2Fdials/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arach%2Fdials/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arach","download_url":"https://codeload.github.com/arach/dials/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arach%2Fdials/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279281235,"owners_count":26139402,"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-10-17T02:00:07.504Z","response_time":56,"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":["automation","macos","raycast","shortcuts","swift","utilities"],"created_at":"2025-07-05T14:00:45.377Z","updated_at":"2025-10-17T04:05:42.568Z","avatar_url":"https://github.com/arach.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Dials\n\n**Version 0.2.1** - A cockpit-style controller for macOS system settings.\n\nDials provides intuitive control over macOS media I/O with both a powerful menu bar app and command-line interface. Control audio balance, manage displays, fix AirPlay issues, and more - all from your menu bar or terminal.\n\n## Features\n\n### 🎵 Audio Control\n- **Precise Balance Control** - Pan audio left, right, or center with visual feedback\n- **Device Management** - List and inspect all audio output devices\n- **Real-time Updates** - Instant changes with notification feedback\n\n### 📱 Multiple Interfaces\n- **Menu Bar App** - Always-available status bar icon with quick controls\n- **Command Center** - Beautiful SwiftUI interface with system commands\n- **CLI Tool** - Full terminal interface for scripting and power users\n- **App Intents** - Siri and Shortcuts integration\n\n### 🚀 Quick Access\n- **Global Hotkey** - Hyper+D (Shift+Option+Control+Command+D) for instant access\n- **Launcher Integration** - Works with Raycast, Alfred, Hyper-D, and more\n- **Menu Bar Quick Actions** - Balance controls right from the status bar\n\n### 🛠 System Utilities\n- **AirPlay Fixes** - Reset stuck mirroring and force-stop AirPlay processes\n- **Display Management** - List displays and control external monitors\n- **Smart Notifications** - Contextual feedback with auto-dismiss\n\n---\n\n## Installation\n\n### Quick Install (Recommended)\n```bash\n# Clone the repository\ngit clone https://github.com/arach/dials.git\ncd dials\n\n# Build and install the app to /Applications\nmake install-app\n\n# Optionally install CLI to /usr/local/bin\nmake install\n```\n\n### Manual Build\n```bash\n# Build app bundle\nmake app\n\n# Or use Swift directly\nswift build -c release\n```\n\n---\n\n## Usage\n\n### Menu Bar App\n1. Launch Dials from Applications or run `open /Applications/Dials.app`\n2. Look for the \"◉\" icon in your menu bar\n3. Click for quick controls or use **Hyper+D** for the Command Center\n\n### Command Line\n```bash\n# Audio balance controls\ndials balance --left        # Pan to left speaker\ndials balance --center      # Center balance\ndials balance --right       # Pan to right speaker\ndials balance               # Show current balance dial\n\n# Device information\ndials output list           # List all audio devices\ndials output info           # Default device details\n\n# Display management\ndials display list          # List connected displays\ndials display off 0x1       # Turn off specific display\n\n# System fixes\ndials fixes reset-airplay   # Reset AirPlay mirroring\ndials fixes force-stop      # Force stop AirPlay processes\n\n# Launcher integration\ndials show                  # Show Command Center window\n```\n\n### Siri \u0026 Shortcuts\nAfter installing the app, you can use:\n- \"Hey Siri, balance audio with Dials\"\n- \"Hey Siri, balance left with Dials\"\n- \"Hey Siri, set audio balance to 75 percent with Dials\"\n\n---\n\n## Launcher Integration\n\n### Raycast\n1. Create a Script Command with: `dials show`\n2. Set keyword to \"dials\"\n3. Or use the provided script in `raycast/set-audio-balance.sh`\n\n### Alfred\n1. Create a Workflow with keyword trigger\n2. Connect to Run Script action: `/usr/local/bin/dials show`\n\n### Hyper-D\nAdd `dials show` to your Hyper-D configuration.\n\n---\n\n## Development\n\n### Build System\nThe comprehensive Makefile provides all development commands:\n\n```bash\n# Development\nmake build          # Debug build (default)\nmake dev           # Auto-rebuilding file watcher\nmake watch         # Watch files for changes\n\n# Distribution\nmake app           # Create app bundle\nmake dmg           # Create DMG installer\nmake install-app   # Install to /Applications\nmake install       # Install CLI to /usr/local/bin\n\n# Quick commands (with auto-build, silent execution)\nmake command-center    # Launch menu bar app\nmake balance-left      # Pan audio left (no terminal window)\nmake balance-center    # Center audio balance (silent)\nmake balance-right     # Pan audio right (silent)\nmake list-outputs      # Show audio devices (silent)\nmake help             # Show all commands\n```\n\n### Requirements\n- **macOS 13+** (for modern CoreAudio constants)\n- **Swift 5.10+** (Xcode 15.3+)\n- **Swift Package Manager** (included with Xcode)\n\n### Architecture\n\nDials uses a clean, modular architecture:\n\n```\nDials/\n├── Sources/\n│   ├── main.swift                  ← CLI entry point\n│   ├── Commands/                   ← CLI commands\n│   │   ├── Balance.swift           ← Audio balance control\n│   │   ├── CommandCenter.swift     ← Menu bar app\n│   │   ├── Show.swift              ← Launcher integration\n│   │   └── ...\n│   ├── Services/                   ← Core functionality\n│   │   ├── Dials.swift             ← Main SDK\n│   │   ├── AudioService.swift      ← Audio control\n│   │   ├── DisplayService.swift    ← Display management\n│   │   └── ...\n│   ├── Intents/                    ← App Intents (Siri)\n│   └── Views/                      ← SwiftUI components\n├── scripts/                        ← Build and distribution\n└── Documentation/\n    ├── APP_INTENTS.md              ← Siri integration guide\n    ├── LAUNCHER_SETUP.md           ← Launcher configuration\n    └── CLAUDE.md                   ← Development guide\n```\n\n**Key Design Principles:**\n- **SDK-Centric** - All functionality accessed through `Dials` SDK\n- **Dual Interface** - Same features available in CLI and GUI\n- **Modular Commands** - Each feature is an independent `ParsableCommand`\n- **Service Layer** - Clean separation of system interactions\n\n---\n\n## Technical Details\n\n### Audio Control\n- Uses modern CoreAudio APIs with `kAudioObjectPropertyElementMain`\n- Precise stereo pan control (0.0 = left, 0.5 = center, 1.0 = right)\n- Device enumeration and detailed property inspection\n- Real-time balance reading with visual dial display\n\n### Menu Bar App\n- Background process with no dock icon (`LSUIElement`)\n- Global hotkey monitoring with proper cleanup\n- Dynamic activation policy for window presentation\n- Custom notification system with auto-dismiss\n\n### App Intents Integration\n- Native iOS/macOS shortcuts support\n- Parameterized intents for custom balance values\n- Voice control through Siri\n- Spotlight integration\n\n---\n\n## Changelog\n\n### v0.2.1 (Latest)\n- 🔇 **Terminal Improvements** - Makefile quick commands now execute silently without leaving empty terminal windows\n- 🖥️ **DMG Installer Enhancement** - Removed confirmation prompt from CLI installer for seamless installation\n- 🛠️ **Build System** - Enhanced output suppression for better developer experience\n\n### v0.2.0\n- 🎵 Complete audio balance control implementation\n- 📱 Full-featured menu bar app with Command Center UI\n- 🚀 Global hotkey support (Hyper+D)\n- 🗣️ Siri and Shortcuts integration via App Intents\n- 📦 DMG distribution with drag-and-drop installation\n\n---\n\n## Roadmap\n\n### Current (v0.2.1)\n- ✅ Menu bar app with Command Center UI\n- ✅ App Intents for Siri/Shortcuts\n- ✅ Global hotkey (Hyper+D)\n- ✅ Launcher integration\n- ✅ System fixes for AirPlay issues\n- ✅ Visual balance dial display\n- ✅ DMG distribution\n- ✅ Silent terminal execution for quick commands\n- ✅ Seamless DMG installer (no prompts)\n\n### Next Release (v0.3.0)\n- [ ] Audio device switching and routing\n- [ ] Preset profiles and quick-switch\n- [ ] Display brightness and color temperature\n- [ ] Enhanced AirPlay management\n- [ ] Notification customization\n\n### Future\n- [ ] Plugin system for third-party dials\n- [ ] Touch Bar integration\n- [ ] Stream Deck support\n- [ ] Web interface for remote control\n\n---\n\n## Contributing\n\nContributions welcome! The modular architecture makes it easy to add new features:\n\n1. **New Commands** - Add `ParsableCommand` in `Sources/Commands/`\n2. **Services** - Extend functionality in `Sources/Services/`\n3. **UI Components** - Add SwiftUI views in `Sources/Views/`\n4. **Documentation** - Update relevant `.md` files\n\nSee [CLAUDE.md](CLAUDE.md) for detailed development guidance.\n\n---\n\n## License\n\nMIT License - see LICENSE file for details.\n\n## Support\n\n- **Issues**: [GitHub Issues](https://github.com/arach/dials/issues)\n- **Documentation**: See `APP_INTENTS.md` and `LAUNCHER_SETUP.md`\n- **Development**: See `CLAUDE.md` for comprehensive development guide","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farach%2Fdials","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farach%2Fdials","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farach%2Fdials/lists"}