Put Claude on autopilot. Schedule code reviews, security audits, and anything else - Claude Code runs them automatically, even while you sleep.
> /plugin marketplace add jshchnz/claude-code-scheduler> /plugin install scheduler@claude-scheduler
Repo: jshchnz/claude-code-scheduler
What's inside
Put Claude on autopilot. Schedule code reviews, security audits, and anything else - Claude Code runs them automatically, even while you sleep.
/plugin marketplace add jshchnz/claude-code-scheduler
/plugin install scheduler@claude-code-scheduler
Requires Claude Code v1.0.33+ Β· Works on macOS, Linux, Windows
Schedule a code review every weekday at 9am to check for bugs,
security issues, and missing tests
That's it. Claude creates the task, runs automatically at 9am, logs the results, and waits for you when you arrive.
Schedule something onceβit runs and cleans itself up:
Automate your workflowβruns reliably even when Claude Code isn't open:
For tasks that need to make changes (edit files, run commands, make commits), Claude will ask:
You: Every Friday at 5pm, clean up unused imports and commit the changes
Claude: Does this task need to run autonomously (edit files, run commands)?
β Yes, run fully autonomous
β No, read-only analysis only
You: Yes
Claude: β Task created with autonomous execution enabled
This adds --dangerously-skip-permissions to the scheduled command, allowing Claude to run without permission prompts.
For tasks that make changes, you can run them in isolated git worktrees. Changes are committed to a new branch and pushed for reviewβyour main branch stays clean.
You: Every night at 2am, refactor deprecated API calls and push for review
Claude: Should this run in an isolated git worktree?
β Yes, create branch and push changes
β No, run in main working directory
You: Yes
Claude: β Task created with worktree isolation
Branch prefix: claude-task/
Remote: origin
How it works:
What happens:
branchPrefix: "claude-task/" β branches named like claude-task/task-abc123-1234567890remoteName: "origin" β pushes to your default remoteIf push fails (no remote, auth issues), the worktree is kept at ~/.worktrees/ for manual review.
These slash commands are available for direct access, but you can also just ask Claude naturally.
| Command | Description |
|---|---|
/scheduler:schedule-add | Create a new scheduled task |
/scheduler:schedule-list | View all scheduled tasks |
/scheduler:schedule-remove <id> | Remove a scheduled task |
/scheduler:schedule-status | Check scheduler health |
/scheduler:schedule-run <id> | Run a task immediately |
/scheduler:schedule-logs [id] | View execution history |
Just tell Claude what you want:
Schedule a code review every weekday at 9am. Review commits from the last 24 hours, check for bugs, security issues, error handling gaps, and code that needs comments. Summarize with file:line references.
Every Monday at 10am, do a security audit: check for outdated dependencies with known CVEs, scan for hardcoded secrets or API keys, and flag unsafe patterns.
Every Friday at 2pm find all TODO, FIXME, HACK, and XXX comments. List by file with line numbers and identify the 3 highest priority items.
Every Thursday at 10am check for outdated dependencies. List packages with available updates, flag breaking changes, and recommend safe updates.
Every Wednesday at 3pm find dead code: unused functions, unreachable branches, commented-out code, and unused imports. List by file with line numbers.
See what your scheduled tasks have done:
/scheduler:schedule-logs
| Time | Task | Status | Duration |
|-------------------|-------------------|--------|----------|
| Jan 5 9:00 AM | Daily Code Review | OK | 45s |
| Jan 5 6:00 PM | Backup Reminder | OK | 12s |
| Jan 4 9:00 AM | Daily Code Review | OK | 38s |
Select any row to see the full output from that execution. You can also view a specific task directly:
/scheduler:schedule-logs daily-review --full
Logs are stored at ~/.claude/logs/<task-id>.log.
Tasks are stored in JSON files:
.claude/schedules.json~/.claude/schedules.jsonExample task structure:
{
"id": "daily-review",
"name": "Daily Code Review",
"enabled": true,
"trigger": {
"type": "cron",
"expression": "0 9 * * 1-5",
"timezone": "local"
},
"execution": {
"command": "Review yesterday's commits",
"workingDirectory": ".",
"timeout": 300,
"skipPermissions": true,
"worktree": {
"enabled": false,
"branchPrefix": "claude-task/",
"remoteName": "origin"
}
},
"tags": ["code-quality", "daily"]
}
| Option | Default | Description |
|---|---|---|
enabled | false | Run task in isolated git worktree |
branchPrefix | "claude-task/" | Prefix for created branches |
remoteName | "origin" | Git remote to push to |
basePath | (auto) | Custom path for worktrees |
claude -p "your command" (with --dangerously-skip-permissions for autonomous tasks)~/.claude/logs/<task-id>.logTask not running?
/scheduler:schedule-status/scheduler:schedule-list/scheduler:schedule-logs <task-id>Common issues:
| Problem | Solution |
|---|---|
| Task never runs | Ensure claude CLI is in PATH |
| Directory not found | Use absolute paths |
| Permission denied | Check file permissions |
Platform debugging:
# macOS
launchctl list | grep com.claude.schedule
# Linux
crontab -l | grep claude
# Windows
schtasks /query /tn "ClaudeSchedule*"
Issues and PRs welcome! Open an issue
MIT
.claude-plugin/
marketplace.json
plugin.json
.github/
ISSUE_TEMPLATE/
bug_report.yml
feature_request.yml
.gitignore
claude-code-scheduler-icon.png
commands/
schedule-add.md
schedule-history.md
schedule-list.md
schedule-logs.md
schedule-remove.md
schedule-run.md
schedule-status.md
dist/
__tests__/
cron/
humanizer.test.d.ts
humanizer.test.d.ts.map
humanizer.test.js
humanizer.test.js.map
parser.test.d.ts
parser.test.d.ts.map
parser.test.js
parser.test.js.map
history/
index.test.d.ts
index.test.d.ts.map
index.test.js
index.test.js.map
types.test.d.ts
types.test.d.ts.map
types.test.js
types.test.js.map
config.d.ts
config.d.ts.map
config.js
config.js.map
cron/
humanizer.d.ts
humanizer.d.ts.map
humanizer.js
humanizer.js.map
parser.d.ts
parser.d.ts.map
parser.js
parser.js.map
history/
index.d.ts
index.d.ts.map
index.js
index.js.map
index.d.ts
index.d.ts.map
index.js
index.js.map
logs/
index.d.ts
index.d.ts.map
index.js
index.js.map
schedulers/
base.d.ts
base.d.ts.map
base.js
base.js.map
darwin.d.ts
darwin.d.ts.map
darwin.js
darwin.js.map
index.d.ts
index.d.ts.map
index.js
index.js.map
linux.d.ts
linux.d.ts.map
linux.js
linux.js.map
windows.d.ts
windows.d.ts.map
windows.js
windows.js.map
types.d.ts
types.d.ts.map
types.js
types.js.map
examples/
daily-review.json
weekly-audit.json
LICENSE
node_modules/
.bin/
cronstrue
node-which
tsc
tsserver
.package-lock.json
@sec-ant/
readable-stream/
dist/
core/
asyncIterablePrototype.d.ts
asyncIterator.d.ts
fromAnyIterable.d.ts
index/
asyncIterator.d.ts
asyncIterator.js
fromAnyIterable.d.ts
fromAnyIterable.js
index.d.ts
index.js
polyfill/
asyncIterator.d.ts
asyncIterator.js
fromAnyIterable.d.ts
fromAnyIterable.js
index.d.ts
index.js
ponyfill/
asyncIterator.d.ts
asyncIterator.js
fromAnyIterable.d.ts
fromAnyIterable.js
index.d.ts
index.js
types/
async-iterator.d.ts
LICENSE
package.json
README.md
@sindresorhus/
merge-streams/
index.d.ts
index.js
license
package.json
readme.md
@types/
fs-extra/
esm.d.mts
index.d.ts
LICENSE
package.json
README.md
jsonfile/
index.d.ts
LICENSE
package.json
README.md
utils.d.ts
node/
assert/
assert.d.ts
strict.d.ts
async_hooks.d.ts
buffer.buffer.d.ts
buffer.d.ts
child_process.d.ts
cluster.d.ts
compatibility/
disposable.d.ts
index.d.ts
indexable.d.ts
iterators.d.ts
console.d.ts
constants.d.ts
crypto.d.ts
dgram.d.ts
diagnostics_channel.d.ts
dns/
dns.d.ts
promises.d.ts
domain.d.ts
events.d.ts
fs/
fs.d.ts
promises.d.ts
globals.d.ts
globals.typedarray.d.ts
http.d.ts
http2.d.ts
https.d.ts
index.d.ts
inspector.d.ts
inspector.generated.d.ts
LICENSE
module.d.ts
net.d.ts
os.d.ts
package.json
path.d.ts
perf_hooks.d.ts
process.d.ts
punycode.d.ts
querystring.d.ts
readline/
readline.d.ts
promises.d.ts
README.md
repl.d.ts
sea.d.ts
sqlite.d.ts
stream/
stream.d.ts
consumers.d.ts
promises.d.ts
web.d.ts
string_decoder.d.ts
test.d.ts
timers/
timers.d.ts
promises.d.ts
tls.d.ts
trace_events.d.ts
ts5.6/
buffer.buffer.d.ts
globals.typedarray.d.ts
index.d.ts
tty.d.ts
url.d.ts
util.d.ts
v8.d.ts
vm.d.ts
wasi.d.ts
web-globals/
abortcontroller.d.ts
domexception.d.ts
events.d.ts
fetch.d.ts
navigator.d.ts
storage.d.ts
worker_threads.d.ts
zlib.d.ts
croner/
dist/
croner.min.cjs
croner.min.js
croner.umd.min.js
LICENSE
package.json
README.md
types/
croner.d.cts
croner.d.ts
cronstrue/
bin/
cli.js
dist/
cronParser.d.ts
cronstrue-i18n.d.ts
cronstrue-i18n.js
cronstrue-i18n.min.js
cronstrue.d.ts
cronstrue.js
cronstrue.min.js
expressionDescriptor.d.ts
i18n/
allLocales.d.ts
allLocalesLoader.d.ts
enLocaleLoader.d.ts
locale.d.ts
localeLoader.d.ts
locales/
af.d.ts
ar.d.ts
be.d.ts
bg.d.ts
ca.d.ts
cs.d.ts
da.d.ts
de.d.ts
en.d.ts
es.d.ts
fa.d.ts
fi.d.ts
fr.d.ts
he.d.ts
hu.d.ts
id.d.ts
it.d.ts
ja.d.ts
ko.d.ts
my.d.ts
nb.d.ts
nl.d.ts
pl.d.ts
pt_BR.d.ts
pt_PT.d.ts
ro.d.ts
ru.d.ts
sk.d.ts
sl.d.ts
sv.d.ts
sw.d.ts
th.d.ts
tr.d.ts
uk.d.ts
vi.d.ts
zh_CN.d.ts
zh_TW.d.ts
options.d.ts
rangeValidator.d.ts
stringUtilities.d.ts
i18n.d.ts
i18n.js
LICENSE
locales/
af.js
af.min.js
ar.js
ar.min.js
be.js
be.min.js
bg.js
bg.min.js
ca.js
ca.min.js
cs.js
cs.min.js
da.js
da.min.js
de.js
de.min.js
en.js
en.min.js
es.js
es.min.js
fa.js
fa.min.js
fi.js
fi.min.js
fr.js
fr.min.js
he.js
he.min.js
hu.js
hu.min.js
id.js
id.min.js
it.js
it.min.js
ja.js
ja.min.js
ko.js
ko.min.js
my.js
my.min.js
nb.js
nb.min.js
nl.js
nl.min.js
pl.js
pl.min.js
pt_BR.js
pt_BR.min.js
pt_PT.js
pt_PT.min.js
ro.js
ro.min.js
ru.js
ru.min.js
sk.js
sk.min.js
sl.js
sl.min.js
sv.js
sv.min.js
sw.js
sw.min.js
th.js
th.min.js
tr.js
tr.min.js
uk.js
uk.min.js
vi.js
vi.min.js
zh_CN.js
zh_CN.min.js
zh_TW.js
zh_TW.min.js
package.json
README.md
cross-spawn/
index.js
lib/
enoent.js
parse.js
util/
escape.js
readShebang.js
resolveCommand.js
LICENSE
package.json
README.md
execa/
index.d.ts
... 1259 moreFAQ
scheduler is a Claude Code plugin with 1 hand-picked skill for automation work, indexed on Flowy. Install it with the command on its page. It includes scheduler. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.