A safe harbor for your local services.
Moy is a macOS menu bar app for registering and managing command-line services as LaunchAgents / LaunchDaemons. Manage your services from the menu bar or the bundled moy CLI.
- macOS 26 or later (Apple Silicon only).
- Xcode 27 / Swift 6.4
- mise
Run these commands to build and launch the app.
mise install
mise run generate
mise run build
open build/Build/Products/Debug/Moy.app-
Add, edit, enable, disable, and restart services.
-
Check service status and open stdout/stderr logs from the menu bar.
-
Share service definitions between the GUI and CLI, with JSON output for scripts.
-
Automatic log rotation.
-
Manage LaunchAgents / LaunchDaemons registered through Moy.
-
Keep services managed by
launchdafter quitting Moy.
Open Moy.app and use the menu bar to manage services.
- Choose Manage Services… and add a service.
- Choose the service kind, enter a unique identifier and the absolute executable path, then configure arguments and environment variables.
- Save the definition, then enable it from the service details when needed.
Service actions work as follows.
| Action | Behavior |
|---|---|
| Enable | Create the service plist and load it into launchd. |
| Disable | Stop and unload the service, then remove its plist. Keep the definition and logs. |
| Restart | Start a waiting service or restart a running one. Requires an enabled, loaded service. |
| Remove | Disable the service and delete its definition. Keep logs. |
- Enabled LaunchAgents are loaded again at login; LaunchDaemons are loaded at system startup.
- Automatic startup depends on
RunAtLoadandKeepAlive.
LaunchDaemon changes require administrator authentication in the GUI or sudo in the CLI.
Moy supports the following launchd settings.
| Setting | Purpose |
|---|---|
Label |
Generated as com.sputnik-apps.moy.<Identifier>. Identifier is immutable after creation. |
ProgramArguments |
Absolute executable path followed by ordered arguments. |
WorkingDirectory |
Optional working directory. |
EnvironmentVariables |
Environment variables passed to the process. |
RunAtLoad |
Start when the service is loaded. Off by default. |
KeepAlive |
Start and keep the service running. Off by default. |
ThrottleInterval |
Minimum interval between launches, in seconds. Uses the OS default if omitted. |
StandardOutPath / StandardErrorPath |
Log paths. Use Moy’s log directory if omitted. |
- Identifiers use 1–64 lowercase ASCII letters, digits, hyphens, or underscores, starting and ending with a letter or digit.
- Use an absolute executable path.
- Shell configuration is not loaded. Set required environment variables explicitly, including
PATHwhen needed. - Each GUI argument row is one literal argument. Quotes and
$VARIABLEare passed unchanged. - For shell logic, pass a script as an argument to an executable such as
/bin/zsh. ThrottleIntervallimits launch frequency; it does not schedule jobs.
- Open Settings… → Command Line Tool to create or remove the bundled CLI’s symbolic link at
/usr/local/bin/moy. - macOS asks for administrator authentication only when needed.
- Existing files and unrelated links are never overwritten.
- Uninstalling removes only the link. Services, settings, and logs remain.
This example registers a web server, checks its status, and restarts it.
moy --help
# Save a service definition, then enable it.
moy add --identifier web-server \
--name "Local web server" \
--program /usr/bin/python3 \
--arg -m --arg http.server --arg 8080 \
--working-directory "$PWD" \
--run-at-load
moy enable web-server
moy status web-server
moy restart web-server
moy logs web-server
moy disable web-serverThe following subcommands are available.
| Command | Behavior |
|---|---|
list |
List registered services. |
show |
Show a service definition. |
add |
Add a service definition. |
edit |
Update service settings. |
import |
Import a service from a JSON file. |
export |
Export a service to a JSON file. |
remove |
Disable the service and delete its definition. |
enable |
Create the plist and enable the service. |
disable |
Stop and unload the service, then remove its plist. |
restart |
Start a waiting service or restart a running one. |
status |
Show service status. |
logs |
Show stdout and stderr log file paths. |
- Use identifiers to specify services.
add --enablesaves and enables in one step.statusshows all services when the identifier is omitted.list,show,status, andlogssupport--jsonoutput.- See
moy <command> --helpfor each command’s options.
MIT © 2026 Yoshihiro Kato
