Scheduled, unattended Claude Code CLI jobs — runs on your Claude subscription via the local CLI, no ANTHROPIC_API_KEY.
# Add to your Claude Code skills
git clone https://github.com/vinhnguyenthanhdn/claude-jobsGuides for using cli tools skills like claude-jobs.
claude-jobs is an open-source cli tools skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by vinhnguyenthanhdn. Scheduled, unattended Claude Code CLI jobs — runs on your Claude subscription via the local CLI, no ANTHROPIC_API_KEY. It has 50 GitHub stars.
claude-jobs's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/vinhnguyenthanhdn/claude-jobs" and add it to your Claude Code skills directory (see the Installation section above).
claude-jobs is primarily written in JavaScript. It is open-source under vinhnguyenthanhdn on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other CLI Tools skills you can browse and compare side by side. Open the CLI Tools category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh claude-jobs against similar tools.
No comments yet. Be the first to share your thoughts!
Top skills in this category by stars
Unlocks once the catalog security scan passes (runs nightly).
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
Scheduled, unattended Claude Code runs — driven by the CLI you already have logged in, so no ANTHROPIC_API_KEY is involved.
One command scaffolds the whole thing: a prompt, a hardened runner script, and a real scheduler entry (launchd, systemd or cron).
npx claude-jobs init morning-report \
--skill ./playbooks/morning-report.md \
--at 09:30 \
--notify 'echo "$CLAUDE_JOB_MESSAGE" | mail -s "morning report" me@example.com'
npx claude-jobs run morning-report --dry-run # see exactly what will happen
npx claude-jobs install morning-report # hand it to the OS scheduler
If you have ever written the same claude -p wrapper script for the third time — the one with the explicit PATH, the random start delay, the summary file, the notifier — this is that script, generalized and tested.
Claude Code is a real product with a real login. On the machine where you are already signed in, claude -p is a legitimate, non-interactive way to run work on your subscription. What that leaves you missing is everything around the call: schedulers start with an empty environment, unattended agents must never stop to ask a question, and a run nobody watches needs to report its own outcome.
claude-jobs is the boring wrapper that gets those details right, so the interesting part stays in your prompt.
Non-goals: this does not proxy, resell or wrap your subscription as an API for other tools. It runs the official CLI, as you, on your own machine. See docs/policy.md.
Claude Code also schedules work by itself now, in three different places. Read Do you need this? before installing — for a good share of daily jobs the built-in answer is the better one.
npm install -g claude-jobs # or just use npx claude-jobs
claude-jobs doctor # safe-to-paste checks + a direct bug-report form link
Requires Node 18.17+, Claude Code installed and logged in (claude auth login) as the same user that will run the jobs.
Upgrading the package does not touch jobs you already created. run.sh is generated once, at init, and every job keeps the copy it was born with — so a fix that lands in the runner reaches new jobs only, until you say otherwise.
install regenerates it:
npm install -g claude-jobs@latest
claude-jobs list # the names you have
claude-jobs install <name> # rewrites run.sh from the current template
That is the whole upgrade path, and it is safe to repeat — install is what you already run to register a job, and re-running it rewrites the runner and the scheduler unit from your existing job.json. Your prompt is not touched.
What it does not do is migrate job.json. A field added after your job was created is simply absent, and the runner falls back to that field's default. Concretely, for the one field where that is visible today: a job created before 0.1.6 has no recorded --log-max-bytes, so re-running install gives it the 5 MiB default and its log starts rotating. Keep the old append-forever behaviour with --log-max-bytes 0 at init, or by editing LOG_MAX_BYTES in the job's run.sh.
| Command | What it does |
|---|---|
init <name> |
Scaffold prompt + runner + scheduler unit |
list |
Every job and whether it is actually scheduled |
run <name> [--now|--dry-run] |
Run by hand — --dry-run prints the plan and the prompt |
install / uninstall <name> |
Register / unregister with launchd, systemd or cron |
logs <name> [--lines N] |
Tail the job log |
status <name> |
Schedule, paths, what the last run did, and the last summary the agent wrote with the time it was written |
doctor |
Safe-to-paste binary, login, API-key leakage and scheduler checks; account email is redacted and the last line opens the structured bug-report form |
Useful init flags: --skill, --task, --prompt-file, --at HH:MM, --jitter, --workdir, --scheduler, --model, --precheck, --notify, --permission-mode. Run claude-jobs help for the full list.
A job earns its place when the work repeats, needs judgement rather than just a command, and produces something short enough to read over coffee. The five that pay off fastest:
claude-jobs init dep-triage --skill ~/playbooks/deps.md --at 02:30 \
--workdir ~/src/api \
--precheck 'git -C ~/src/api fetch --quiet' \
--notify 'gh issue comment 42 --body "$CLAUDE_JOB_MESSAGE"'
More ideas — release notes, issue triage, cost anomalies, backup verification, competitor watch — plus the jobs that are a bad fit and why: docs/use-case-ideas.md.
~/.claude-jobs/
├── jobs/<name>/job.json # the declaration
├── jobs/<name>/prompt.md # what the agent is told — edit this freely
├── jobs/<name>/run.sh # generated runner, yours to modify
├── logs/<name>.log # stream-json, every step as it happens
└── state/<name>-summary.md # the agent's own report, written last
Nothing is hidden in a database. Delete the directory and the job is gone.
These are the parts that are easy to get wrong once and then debug for a week:
PATH, HOME and the absolute path to claude are written into the script.--permission-mode bypassPermissions. A headless run cannot approve anything. Override with --permission-mode if you want a stricter mode.--output-format stream-json --verbose. Steps land in the log as they happen instead of buffering until the end.--precheck runs a cheap command first; if it fails, the run is skipped and reported rather than started into a broken environment.--notify. No summary means the run is reported as failed, with the exit code.Details and the reasoning behind each one: docs/design.md.
The same "subscription instead of API key" idea shows up in a few officially supported places — GitHub Actions with claude_code_oauth_token, the Agent SDK authenticating as your account, and chat gateways that execute turns through the local CLI. Where each one fits, and where the line is: docs/use-cases.md.
A scheduled job and a chat bot are the same substrate with a different trigger. OpenClaw is a self-hosted gateway that connects Zalo, Telegram, Slack and friends to an agent, and it can run every turn through your logged-in CLI — no API key in the config at all:
{
"agents": {
"defaults": {
"model": { "primary": "claude-cli/claude-sonnet-5" },
"cliBackends": { "claude-cli": { "command": "/opt/homebrew/bin/claude" } },
"agentRuntime": { "id": "claude-cli" }
}
}
}
A ready-to-run script that merges this into an existing gateway config, with a backup and a dry run, is in examples/openclaw/:
node examples/openclaw/apply-claude-cli-backend.mjs # show the diff
node examples/openclaw/apply-claude-cli-backend.mjs --write # apply it
The full walkthrough — how a turn executes, why the model list must not contain a direct-API model, and what a long-running gateway does differently from a one-shot job — is in docs/openclaw.md.
Run both and you cover the two halves: the gateway answers when someone asks, claude-jobs acts when nobody does.
Often not. Claude Code ships three ways to schedule work, and they cover most of what people reach for a wrapper script to do. Checked against the docs on 2026-08-18:
| Option | Runs on | Needs | Reach for it when |
|---|---|---|---|
| Routines | Anthropic's cloud | Nothing of yours running | The work must happen whether or not your machine is on, or a GitHub event / API call is the trigger |
| Desktop scheduled tasks | Your machine | Claude Code Desktop open, computer a |