See, diagnose, and control macOS launchd jobs without memorizing launchctl.
Rendered from the current Slint interface with real, non-sensitive user LaunchAgents on macOS. The home path is abbreviated.
- A native Rust GUI over
launchctldiscovery, status, diagnostics, and job actions. - A layered architecture that separates filesystem and process adapters from domain rules, services, and UI state.
- Explicit safety gates for privileged and destructive operations, including read-only system daemons and two-step deletion.
Rust + Slint · 66 passing tests · explicit capability checks before actions
macOS background jobs are powerful, but their state is split across plist files, launchctl commands, unified logs, permissions, and multiple scopes. The result is a workflow that is easy to inspect incorrectly and risky to edit casually.
LaunchPad brings those surfaces into one reviewable workspace:
| Outcome | Current implementation |
|---|---|
| Find jobs | Scans user agents, global agents, and system daemons with search, scope, status, and attribute filters |
| Diagnose failures | Combines fast launchctl list status with on-demand launchctl print details and recent unified logs |
| Control safely | Starts, stops, kickstarts, loads, unloads, enables, and disables only when scope and permissions allow |
| Edit with review | Builds plist XML from a standard editor, runs diagnostics, and requires confirmation before destructive changes |
LaunchPad does not treat every discovered job as equally mutable.
flowchart LR
A[Discover job] --> B{Scope and permission check}
B -->|System daemon| C[Read-only inspection]
B -->|Controllable agent| D[Enable safe actions]
D --> E{Destructive action?}
E -->|No| F[Execute through launchctl adapter]
E -->|Yes| G[Review target and confirm]
G --> F
The same capability model is used by the UI and service layer, so disabled controls are backed by domain rules rather than presentation alone.
LaunchPad is a source prototype, not a signed or notarized macOS release yet.
- Job discovery across
~/Library/LaunchAgents,/Library/LaunchAgents, and/Library/LaunchDaemons. - Search, scope, status, starred-only, and plist-attribute filters.
- Bulk status plus on-demand runtime details.
- Guarded trigger actions and two-step deletion.
- Persistent starred jobs and copyable diagnostics.
- Standard plist creation and editing with XML preview and rule-based diagnostics.
- History and short live-capture log views.
- A command palette over the same service actions.
- AI-assisted plist suggestions and provider adapters.
- QuickLaunch snapshot, helper, and menu-bar integrations.
- Advanced or undocumented plist keys represented as expert entries.
- A signed, notarized, downloadable app bundle.
- Automated end-to-end tests against real macOS
launchctlstate. - A fully general editor for arbitrary nested plist structures.
See the macOS manual test plan for the current main-path checklist.
Slint UI
│
Application controller
│
Service layer job · action · delete · plist · logs · AI · QuickLaunch
│
Domain rules status · capabilities · filters · plist model
│
Adapters launchctl · filesystem · unified logs · clipboard · providers
Two choices keep the system responsive and testable:
- Refresh uses one bulk
launchctl listquery; deeperlaunchctl printwork happens only for the selected job. - Process execution and filesystem access sit behind traits, allowing service behavior to be tested with mocks.
Read the full architecture overview.
- macOS with a GUI session.
- Rust stable. The current dependency graph is validated with Rust 1.94 or newer.
git clone https://github.com/Jacky040124/launchd-gui.git
cd launchd-gui
cargo run --bin launchpadLaunchPad reads the normal user and system launchd locations. Test write actions on a disposable user LaunchAgent first.
cargo fmt --all -- --check
cargo clippy --all-targets --all-features -- -D warnings
cargo test --all-targetsThe repository includes 66 passing unit and integration tests across domain logic, adapters, job actions, deletion, starring, and QuickLaunch behavior. Real system behavior still requires the macOS manual test plan.
