
Security News
TC39 Advances Temporal to Stage 4 Alongside Several ECMAScript Proposals
TC39’s March 2026 meeting advanced eight ECMAScript proposals, including Temporal reaching Stage 4 and securing its place in the ECMAScript 2026 specification.
opencode-scheduler
Advanced tools
OpenCode plugin for scheduling recurring jobs using launchd (Mac) or systemd (Linux)
Run AI agents on a schedule. Set up recurring tasks that execute autonomously—even when you're away.
Schedule a daily job at 9am to search Facebook Marketplace for posters under $100 and send the top 5 deals to my Telegram
This is an OpenCode plugin that uses your OS's native scheduler (launchd on macOS, systemd on Linux, Task Scheduler on Windows) to run prompts reliably.
As of v1.2.0, jobs are scoped by workdir (so different projects don't collide), and scheduled runs are supervised (no overlap + optional timeout).
Add to your opencode.json:
{
"plugin": ["opencode-scheduler"]
}
Daily deal hunting:
Schedule a daily job at 9am to search for standing desks under $300
Weekly reports:
Schedule a job every Monday at 8am to summarize my GitHub notifications
Recurring reminders:
Schedule a job every 6 hours to check if my website is up and alert me on Slack if it's down
| Command | Example |
|---|---|
| Schedule a job | Schedule a daily job at 9am to... |
| List jobs | Show my scheduled jobs |
| Get version | Show scheduler version |
| Install skill template | Install the scheduled job best practices skill |
| Get job | Show details for standing-desk |
| Update job | Update standing-desk to run at 10am |
| Run immediately | Run the standing-desk job now |
| View logs | Show logs for standing-desk |
| Delete | Delete the standing-desk job |
| Global cleanup (dry run) | Run scheduler global cleanup |
workdir) and installs a timer in your OS schedulerYou can also trigger a job immediately via run_job—it runs fire-and-forget and appends to the same log file.
Jobs run from the working directory where you created them, picking up your opencode.json and MCP configurations.
OPENCODE_PERMISSION to deny "question" prompts, so jobs don't hang waiting for approvals.timeoutSeconds to hard-stop long runs (SIGTERM, then SIGKILL).| Platform | Scheduler backend | Notes |
|---|---|---|
| macOS | launchd | Full support (supervised scheduled runs) |
| Linux | systemd --user | Full support (supervised scheduled runs) |
| Windows | schtasks (Task Scheduler) | Supported with cron subset mapping (see limits below) |
Windows Task Scheduler limits:
\\OpenCode\\opencode-job-....Jobs use standard 5-field cron expressions:
┌───────────── minute (0-59)
│ ┌───────────── hour (0-23)
│ │ ┌───────────── day of month (1-31)
│ │ │ ┌───────────── month (1-12)
│ │ │ │ ┌───────────── day of week (0-6, Sunday=0)
│ │ │ │ │
* * * * *
| Expression | Meaning |
|---|---|
0 9 * * * | Daily at 9:00 AM |
0 */6 * * * | Every 6 hours |
30 8 * * 1 | Mondays at 8:30 AM |
0 9,17 * * * | At 9 AM and 5 PM daily |
| Tool | Description |
|---|---|
schedule_job | Create a new scheduled job |
list_jobs | List all scheduled jobs |
get_version | Show scheduler and opencode versions |
get_skill | Get built-in skill templates (best practices) |
install_skill | Install a built-in skill into your repo |
get_job | Fetch job details and metadata |
update_job | Update an existing job |
delete_job | Remove a scheduled job |
cleanup_global | Remove scheduler artifacts across all scopes (dry-run by default) |
run_job | Execute a job immediately (fire-and-forget) |
job_logs | View the latest logs from a job |
schedule_job and update_job accept an optional timeoutSeconds (integer seconds). Use 0 (or omit) to disable.
Tools accept an optional format: "json" argument to return structured output with success, output, shouldContinue, and data.
Use cleanup_global to clean scheduler artifacts across all scopes. It always starts in dry-run mode unless you pass confirm: true.
{ "confirm": false }
{ "confirm": true }
{ "confirm": true, "includeHistory": true }
The tool reports exactly how many artifacts were removed, grouped by location (jobs, locks, logs, runs, launchd/systemd units).
| What | Where |
|---|---|
| Job configs (scoped) | ~/.config/opencode/scheduler/scopes/<scopeId>/jobs/*.json |
| Run records (scoped) | ~/.config/opencode/scheduler/scopes/<scopeId>/runs/*.jsonl |
| Locks (scoped) | ~/.config/opencode/scheduler/scopes/<scopeId>/locks/*.json |
| Logs (scoped) | ~/.config/opencode/logs/scheduler/<scopeId>/*.log |
| Supervisor script | ~/.config/opencode/scheduler/supervisor.pl |
| launchd plists (Mac) | ~/Library/LaunchAgents/com.opencode.job.<scopeId>.*.plist |
| systemd units (Linux) | ~/.config/systemd/user/opencode-job-<scopeId>-*.{service,timer} |
| Task Scheduler entries (Windows) | \\OpenCode\\opencode-job-<scopeId>-* |
Legacy note: older versions stored jobs in ~/.config/opencode/jobs/*.json and used unscoped unit names. delete_job removes both scoped and legacy artifacts.
Jobs run from a specific directory to pick up MCP configs:
Schedule a daily job at 9am from /path/to/project to run my-task
By default, jobs use the directory where you created them.
Scopes are derived from the job's workdir (normalized absolute path). This isolates job storage, logs, and OS scheduler unit names per project.
list_jobs defaults to the current scope (your current working directory).allScopes: true to list jobs across all scopes.includeLegacy: true to include pre-v1.2.0 jobs stored in ~/.config/opencode/jobs.If you have an OpenCode backend running via opencode serve or opencode web, you can set attachUrl on a job so runs use that backend:
Update the standing-desk job to use attachUrl http://localhost:4096
opencode run via launchd (Mac) or systemd (Linux).~/.config/opencode/logs/*.log.PRD-resilient-execution.md.To install the built-in skill into your project (no copy/paste), open OpenCode in your repo and run:
Install the scheduled job best practices skill
This calls the plugin’s install_skill tool and writes .opencode/skill/scheduled-job-best-practices/SKILL.md.
(If you prefer, you can also say: Get skill from opencode-scheduler and add it to my skills.)
Then add @scheduled-job-best-practices at the top of scheduled job prompts.
(Manual option: use get_skill to fetch scheduled-job-best-practices and copy it into .opencode/skill/scheduled-job-best-practices/SKILL.md.)
Jobs not running?
Check if installed:
launchctl list | grep opencodesystemctl --user list-timers | grep opencodeschtasks /Query /TN "\\OpenCode\\opencode-job-*"Check logs: Show logs for my-job
Verify the working directory has the right opencode.json with MCP configs
MCP tools not available?
Make sure the job's working directory contains an opencode.json with your MCP server configurations.
MIT
FAQs
OpenCode plugin for scheduling recurring jobs using launchd (Mac) or systemd (Linux)
The npm package opencode-scheduler receives a total of 2,806 weekly downloads. As such, opencode-scheduler popularity was classified as popular.
We found that opencode-scheduler demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
TC39’s March 2026 meeting advanced eight ECMAScript proposals, including Temporal reaching Stage 4 and securing its place in the ECMAScript 2026 specification.

Research
/Security News
Since January 31, 2026, we identified at least 72 additional malicious Open VSX extensions, including transitive GlassWorm loader extensions targeting developers.

Research
Six malicious Packagist packages posing as OphimCMS themes contain trojanized jQuery that exfiltrates URLs, injects ads, and loads FUNNULL-linked redirects.