Getting Started
Install LaunchPad, discover your existing agents, and create your first scheduled job in under 60 seconds.
What is LaunchPad?
LaunchPad is a local macOS dashboard for managing launchd LaunchAgents -- the system-level scheduler that powers all background automation on macOS. Instead of hand-writing XML plist files and memorizing launchctl subcommands, LaunchPad provides a modern, visual interface for creating, monitoring, and controlling every scheduled and event-driven job on your Mac.
The application runs entirely on your machine. There are no cloud services, no accounts, no network exposure. All data stays on your Mac in a local SQLite database. The dashboard auto-starts on login and lives in your menubar for instant access.
Discover every LaunchAgent on your system. Create jobs through a visual form. Triple schedule input (visual, cron, natural language). Real-time log streaming. macOS native notifications on failure. Touch ID for destructive operations.
System Requirements
| Requirement | Minimum |
|---|---|
| Operating System | macOS 13 (Ventura) or later |
| Architecture | Apple Silicon (M1+) or Intel |
| Runtime | Node.js >= 20 (LTS) |
| Package Manager | pnpm >= 9 |
| Disk Space | ~150 MB (application + database) |
| Browser | Safari 16+, Chrome 110+, Firefox 110+ |
LaunchPad uses Touch ID via WebAuthn for confirming destructive operations. Machines without Touch ID fall back to password prompts via the macOS LocalAuthentication framework.
Installation
Option 1: Homebrew (recommended)
The fastest way to install LaunchPad. Homebrew handles Node.js dependencies and sets up the auto-start LaunchAgent automatically.
brew tap launchpad-app/tap
brew install launchpad
After installation, LaunchPad starts automatically and opens in your default browser at http://localhost:24680.
Option 2: Manual Installation
Clone the repository and install dependencies manually. This approach is ideal for development or customization.
# Clone the repository
git clone https://github.com/launchpad-app/launchpad.git
cd launchpad
# Install dependencies with pnpm
pnpm install
# Create the SQLite database and run migrations
pnpm db:push
# Build for production
pnpm build
# Start the server (port 24680)
pnpm start
# Optional: Install auto-start LaunchAgent
pnpm setup:autostart
LaunchPad is a 100% local application with zero external service dependencies at runtime. No .env file needed. Optionally set PORT=24680 to change the server port or DATABASE_PATH to change the SQLite file location.
First Launch
When you open LaunchPad for the first time, it performs an automatic discovery scan across your system.
What happens during discovery
- Scans
~/Library/LaunchAgents/-- finds all your user-level LaunchAgent plist files - Scans
/Library/LaunchAgents/-- finds system-wide agents (displayed as read-only) - Parses each plist -- extracts label, command, schedule, environment variables, log paths, and all configuration keys
- Cross-references
launchctl list-- determines whether each job is loaded or unloaded, running or idle, and captures the last exit code - Syncs to the database -- stores everything in the local SQLite database for fast querying
Jobs not created by LaunchPad are marked as "External" and are read-only. You can view their configuration and logs, but you cannot edit or delete them through the dashboard. This protects system agents from accidental modification.
The full discovery scan completes in under 3 seconds, even with 100+ plists.
Quick Start: Your First Agent
Let's create a simple LaunchAgent that runs a backup script every weekday at 9 AM.
Step 1: Open the Job Builder
Click the "New Job" button in the dashboard header, or press Cmd+N. The Job Builder form opens with sensible defaults pre-filled.
Step 2: Configure the basics
| Field | Value |
|---|---|
| Name | Daily Backup |
| Label | com.launchpad.daily-backup (auto-suggested) |
| Command | /Users/you/scripts/backup.sh |
| Arguments | -v --incremental |
| Working Directory | /Users/you/scripts |
Step 3: Set the schedule
LaunchPad provides three interchangeable schedule input methods. Use whichever feels natural:
Select Weekdays from the day picker, set the hour to 09 and the minute to 00. The 7-day timeline preview below the form instantly shows when the job will fire next.
Enter the cron expression in the text field. LaunchPad shows a human-readable preview and the next 5 scheduled runs below:
0 9 * * 1-5
Preview: "At 09:00 AM, Monday through Friday"
Type in plain English and LaunchPad parses it using chrono-node:
every weekday at 9am
LaunchPad shows the parsed interpretation for confirmation before applying it.
Step 4: Preview and save
Before saving, expand the plist preview pane to see the generated XML. This is the exact file LaunchPad will write to ~/Library/LaunchAgents/:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.launchpad.daily-backup</string>
<key>ProgramArguments</key>
<array>
<string>/Users/you/scripts/backup.sh</string>
<string>-v</string>
<string>--incremental</string>
</array>
<key>WorkingDirectory</key>
<string>/Users/you/scripts</string>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Hour</key><integer>9</integer>
<key>Minute</key><integer>0</integer>
<key>Weekday</key><integer>1</integer>
</dict>
<dict>
<key>Hour</key><integer>9</integer>
<key>Minute</key><integer>0</integer>
<key>Weekday</key><integer>2</integer>
</dict>
<!-- ... Wed, Thu, Fri -->
</array>
<key>StandardOutPath</key>
<string>/Users/you/Library/Logs/LaunchPad/com.launchpad.daily-backup.log</string>
<key>StandardErrorPath</key>
<string>/Users/you/Library/Logs/LaunchPad/com.launchpad.daily-backup.err</string>
<key>LaunchPadManaged</key>
<true/>
</dict>
</plist>
Click "Save & Activate". LaunchPad writes the plist file, validates it with plutil -lint, and registers it with launchctl bootstrap. Your job is now live.
Tech Stack
LaunchPad is built as a localhost monolith -- a single Next.js process serving both the UI and API routes, with SQLite as the sole persistence layer.
| Layer | Technology | Why |
|---|---|---|
| Frontend | Next.js 15 (App Router) + Tailwind CSS + shadcn/ui | Full-stack React with server components, zero CORS, hot reload |
| State | Zustand (client) + TanStack Query (server) | Minimal client state, rich server caching with 30s polling |
| Database | SQLite via better-sqlite3 + Drizzle ORM | Zero-config, file-based, sub-millisecond queries at this scale |
| macOS integration | child_process (launchctl, plutil, osascript) | Direct access to system utilities for job management |
| Menubar | Swift helper or menubar npm |
Lightweight tray icon with status polling |
| Auth | WebAuthn (Touch ID) | Browser-native biometric confirmation, no passwords |
Port 24680 was chosen to avoid conflicts with common development servers (3000, 5173, 8080). The server binds exclusively to 127.0.0.1, making it inaccessible from the network.
Project Structure
launchpad/
app/ # Next.js App Router pages and layouts
api/ # API route handlers (/api/jobs, /api/discover, etc.)
(dashboard)/ # Dashboard pages (job list, detail, create)
settings/ # Settings page
lib/ # Service layer
discovery.ts # Filesystem scanning and plist parsing
plist-engine.ts # Plist XML generation and validation
schedule-translator.ts # Visual/cron/NLP to launchd schedule conversion
launchctl.ts # Type-safe launchctl command wrapper
log-capture.ts # Background log polling and storage
notifications.ts # macOS Notification Center integration
db/ # Drizzle ORM schema and migrations
components/ # React UI components (shadcn/ui based)
menubar/ # Menubar tray process
~/.launchpad/
launchpad.db # SQLite database
~/Library/Logs/LaunchPad/
*.log, *.err # Job stdout/stderr log files
Next Steps
Now that you have LaunchPad installed and running, explore what it can do:
- Feature Guide -- Deep dive into agent discovery, the job builder, scheduling, event triggers, log viewer, and more
- API Reference -- Full endpoint documentation for integrating with LaunchPad programmatically
- Architecture -- Understand the system design, data flows, and security model
- Troubleshooting -- Common issues, error messages, and launchd-specific gotchas