Open source · MIT licence

See, create and edit every launchd job on your Mac

Plus processes, logs and system load, in one tool. mac-dash is open source. Run it as a native desktop app or as a local web server you open in your browser.

22-second demo, no audio. Fictional data.

Install

Desktop app

Homebrew cask, native macOS app

brew install --cask talhaorak/tap/macdash

Web server

Quickest way to try it, via npx

npx macdash

Web server

Global npm install

npm install -g @talhaorak/mac-dash
macdash

Current version v1.2.0 · see the changelog.

Everything mac-dash does

Job editor

A form for every documented launchd.plist key, with an Expert mode when you need the raw XML.

  • A field for every documented launchd.plist key: command, script, app or Shortcut to run, run-at-load and keep-alive conditions, interval and calendar schedules, watch paths, environment, output files, user and resource limits.
  • Expert mode shows the raw XML with syntax colours, four editor themes, parse errors with line numbers, and find and replace.
  • Checks run before you save: missing executables, a tilde in a path, keys that only apply to daemons, and schedules launchd would ignore.
  • Templates, duplicate, delete to the Trash with a backup, and show in Finder.
  • Revisions keep the newest 20 backups per job, with revert.
  • Drafts save your unsaved edits and survive closing the editor.
  • Undo and redo cover the whole editor, plus a one-click "Discard changes."
Job editor form with run kind, triggers and checks Job editor in Expert mode, showing the plist as XML with syntax colours

Monitor

mac-dash watches the five launchd folders all the time, on both the server and the desktop app.

  • Keeps a change history when any app adds, changes or removes a job.
  • Notices when a job's exit status changes to a failure, and notifies you.
  • Notifications support prefix excludes and an on/off switch.
  • A click on a browser notification opens the job. A click on the desktop notification cannot yet — macOS only reports clicks to signed apps.
Change history of the launchd folders

Know what runs

Every job's executable, and everything else that starts automatically on your Mac, in one place.

  • Verified code signature: checked against Apple's root (anchor apple, anchor apple generic). Displayed certificate names are never trusted blindly.
  • Background items: the macOS Background Task Management database, as a searchable list. Reset asks you to type RESET, then for an administrator password.
  • Login items from System Settings, listed and deletable with a two-step confirm.
  • Privileged helper tools in /Library/PrivilegedHelperTools, listed and deletable with a two-step confirm and an administrator prompt.
  • The user's crontab, listed alongside legacy StartupItems.
  • A quarantine warning on a job, cleared on save.
Job details panel showing the verified code signature

Organise

Find any job fast, and keep notes on why it exists.

  • Smart folders: saved rules over status, scope, owner, tags, triggers, schedule, exit status, or any launchd key.
  • Tags with a filter, and notes on every job, including read-only ones.
  • A custom icon per job: an emoji, or a pasted or dropped image.
  • Four ways to browse: groups with counts, a sortable list, a grid with three tile sizes, and a timeline of upcoming runs.
  • Cmd+K opens a quick switcher to jump to any job.
  • Deep links: every view, filter, job and editor has its own URL. Browser tabs and reloads restore their state; the desktop app opens new windows with Cmd+N.
Services grouped by scope, with smart folders and filters Job list view with sortable columns and tag filters Timeline view of upcoming scheduled job runs

Power tools

For the jobs that need more than a user agent.

  • Jobs for you, for all users, or as root. Saving to /Library or acting in the system domain asks for one macOS administrator password; there is no persistent helper.
  • View and set the Mac's repeating wake, start-up, sleep and shut-down schedule (pmset repeat); setting it asks for an administrator password.
  • Wrap a script in an app, so macOS can grant it privacy permissions.
  • Pick a Shortcut to run, from the same list as shortcuts list.
  • A folder browser for every path field, in the browser and in the desktop app.

Dashboard, processes and logs

mac-dash is also a general system monitor, not only a launchd editor.

  • Real-time CPU, memory and disk gauges with sparkline history.
  • Process explorer: sort by CPU or memory, see full command arguments, kill a process.
  • Log viewer: stream the macOS unified log over WebSocket, filter by level or process name. Every job also has its own Log tab with a time span, level and text filter.
Dashboard showing CPU, memory and disk gauges with sparkline charts Process explorer sorted by CPU usage Log viewer streaming the unified log with level filters

Plugins

Extend mac-dash with custom plugins: new pages, API endpoints and dashboard widgets.

  • A plugin is a folder with a manifest.json, an optional server.ts for backend routes, and an optional client.tsx for the UI.
  • Plugins need the web server's HTTP API; the desktop app shows a message instead, since it has no HTTP server.

Appearance and language

  • Light, dark and system appearance.
  • English and Turkish, with a language switch in the interface.
Services page in light appearance

Desktop app or web server

  • The desktop app uses Tauri and native macOS APIs directly: no HTTP server, no Node.js, and minimal overhead.
  • The web server runs on Bun and Hono. Start it with npx, a global npm install, Homebrew, or from source, then open it in a browser.
  • Both back ends implement the same contract and cover the same launchd features, except that plugins with a UI need the web server.

Coming from Lingon?

mac-dash tracks feature parity with Lingon Pro 10.3, the commercial launchd editor for macOS. The full comparison, 67 capabilities in total, is in docs/lingon-parity.md on GitHub.

What matches

  • Scopes and listing: user and global agents, global and read-only system daemons, login items, background items, privileged helper tools, crontab, legacy StartupItems, unparseable and symlinked plists.
  • Create and edit: a field for every launchd key, Expert XML mode, validating checks, templates, revisions, drafts, undo and redo, discard changes.
  • Organise: smart folders over any launchd key, tags, per-job notes, custom icons, four browsing views, a quick switcher.
  • Inspect and monitor: launchctl print per job, live state from both launchd domains, a per-job log tab, a background-items dump with reset, the quarantine warning, and the background monitor.
  • Windows and appearance: deep links standing in for tabs, and the wake and sleep schedule.

What mac-dash adds

  • A change history of the launchd folders — Lingon only notifies.
  • Failed-job events.
  • A verified code signature for every job's executable.
  • Exit status explained in words, including signal names and EX_CONFIG hints.
  • Validation for more than 20 mistakes: a tilde in a path, an app bundle used as an executable, agent-only or daemon-only keys, and more.
  • Job templates.
  • Web access from the same Mac, plus processes, logs and system load in one tool.

What's still open

  • Creating a job by dropping a file works in the desktop app; a browser cannot read a dropped file's path.
  • A click on a desktop notification cannot open the job yet — macOS only reports clicks to signed apps. It works from a browser notification.
  • The toolbar is not reorderable yet; "View options" only shows and hides rows and cards.
  • The interface ships in English and Turkish. Lingon ships about 20 languages, and right-to-left layout is still open.

Security

  • The server listens on 127.0.0.1 only, not on every interface.
  • Requests need a matching Origin and Host. A foreign Origin or a non-loopback Host gets rejected with 403, for HTTP and for the WebSocket upgrade.
  • Opening the server to your network (HOST=0.0.0.0) turns on an access token: a login screen, with the token stored at ~/.macdash/token.
  • Jobs are addressed by label and scope. The API does not take a file path from the client.
  • Privileged saves write only to /Library or act in the system launchd domain, through one macOS administrator prompt. Root does not write into folders you control.

Read the full security policy on GitHub.

Frequently asked questions

Which macOS versions does mac-dash support?

The desktop app requires macOS 13 (Ventura) or later (packages/desktop/src-tauri/tauri.conf.json, minimumSystemVersion). The web server needs macOS and the Bun runtime.

Does mac-dash need root?

No, not for your own agents. mac-dash asks for one macOS administrator password only when you save a job to /Library or the system domain, set the wake and sleep schedule, or delete a background item or a privileged helper tool.

Where does mac-dash store its data?

In ~/.macdash: job revisions in ~/.macdash/backups, the change history in ~/.macdash/job-events.json, monitor settings in ~/.macdash/settings.json, and the access token in ~/.macdash/token when the server listens beyond loopback.

How do I uninstall mac-dash?

Remove it the way you installed it: brew uninstall --cask talhaorak/tap/macdash for the desktop app, npm uninstall -g @talhaorak/mac-dash for a global npm install, or brew uninstall talhaorak/tap/macdash for the Homebrew formula. Delete ~/.macdash afterwards to remove your job revisions, history and settings too.

Why does Gatekeeper warn when I open the desktop app?

The desktop app is not notarized yet, so macOS Gatekeeper warns before it opens. Download it only from the releases page on GitHub.

What's the difference between the desktop app and the web server?

The desktop app (Tauri) uses native macOS APIs directly: no HTTP server, no Node.js, and a smaller footprint. The web server (Bun and Hono) opens in your browser and is the only way to use plugins with a UI, since the desktop app has no HTTP server for plugin routes.

How do I run the self-test?

It is a development-only, end-to-end check of every backend operation, running one job through its whole life cycle. Web: run bun run dev, then open http://localhost:7228/?selftest=1. Desktop:

cd packages/desktop && cargo tauri dev --no-watch \
  --config '{"build":{"devUrl":"http://localhost:7228/?selftest=1","beforeDevCommand":""}}'

The desktop app starts, prints SELFTEST_REPORT, and exits with 0 on success.