Observed since 20 Oct, 21:42 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
9to5
Automated agents for Claude Code
Automated agents for Claude Code.
Agents that run on your schedule, from a webhook, or on demand. They stay under budget and report back to your inbox.
Agents: for complete option references and scheduling examples, read
skills/9to5/SKILL.mdor install the skill withnpx skills add Michaelliv/9to5. You should run9to5 onboardto add instructions to~/.claude/CLAUDE.md.
The examples/ directory has ready-to-import agents:
9to5 agent import examples/morning-briefing.json
| Example | Schedule | What it does |
|---|---|---|
| Morning briefing | Daily 7am | Summarize last 24h of commits, PRs, issues, CI status |
| Security scan | Daily | Check recent commits for hardcoded secrets and vulnerability patterns |
| Test gap finder | Nightly | Find untested code in recent commits, suggest test skeletons |
| API contract watchdog | Every 2h | Hit API endpoints, compare responses to spec, flag drift |
| Project health check | Every 6h | Run tests, measure build times, track repo metrics over time |
| Ecosystem watch | Every 12h | Check for new releases of dependencies and breaking changes |
| Reddit trend scout | Every 4h | Scout trending posts and draft blog content |
| TODO tracker | Weekly | Inventory TODO/FIXME comments, track additions and removals |
| Stale branch archaeologist | Weekly | Assess old branches and recommend which are safe to delete |
| Dependency deep audit | Weekly | Analyze actual usage of deps, flag unmaintained or replaceable ones |
| Refactor spotter | Weekly | Find emerging code patterns worth extracting |
| License compliance | Weekly | Scan dependency tree for copyleft or problematic licenses |
| Drift detector | Daily | Compare IaC config against actual running state |
| Competitor comparison | Weekly | Research competitors and generate comparison docs via worktree PR |
Requires Claude Code installed and authenticated.
npm install -g 9to5
Or run without installing:
npx 9to5 <command>
# Create an agent that runs daily at 9am
9to5 agent add "morning-review" \
--prompt "Review yesterday's commits and summarize changes" \
--rrule "FREQ=DAILY;BYHOUR=9" \
--model sonnet \
--max-budget-usd 0.25
# Run it now to see what you get
9to5 agent run <id>
# Browse everything in the TUI
9to5 ui
claude -p?You could. 9to5 adds what you'd end up building yourself:
resume <run-id>9to5 agent)| Command | Description |
|---|---|
9to5 agent add <name> | Create a new agent |
9to5 agent edit <id> | Edit an existing agent |
9to5 agent list | List your agents |
9to5 agent run <id> | Run an agent now |
9to5 agent remove <id> | Remove an agent (--force to permanently delete) |
9to5 agent restore <id> | Restore a deleted agent |
9to5 agent hide <id> | Hide an agent from list and TUI views |
9to5 agent unhide <id> | Unhide a hidden agent |
9to5 agent list --deleted | List deleted agents |
9to5 agent export [id] | Export agent(s) as JSON |
9to5 agent import <file> | Import agent(s) from JSON |
| Command | Description |
|---|---|
9to5 runs [agent-id] | View run history |
9to5 resume <run-id> | Resume the Claude Code session from a previous run |
9to5 inbox | Check your inbox |
9to5 daemon)| Command | Description |
|---|---|
9to5 daemon start | Start the background daemon |
9to5 daemon stop | Stop the background daemon |
9to5 webhook)| Command | Description |
|---|---|
9to5 webhook info | Show webhook configuration and URLs |
9to5 webhook refresh | Regenerate the webhook secret |
9to5 webhook enable | Enable webhook triggers |
9to5 webhook disable | Disable webhook triggers |
9to5 webhook url <id> | Print trigger commands for an agent |
| Command | Description |
|---|---|
9to5 onboard | Add 9to5 instructions to ~/.claude/CLAUDE.md |
9to5 ui | Launch the interactive TUI dashboard |
Launch with 9to5 ui for a two-panel terminal dashboard:
r run, p pause/resume, dd delete (with u to undo), c copy output, ⏎ toggle read, q quitTrigger agents from GitHub Actions, CI, Zapier, or any script. Two trigger paths — local HTTP and remote via ntfy.sh — both secured with HMAC-SHA256 signing. No infrastructure, no dependencies, completely free.
Webhooks are enabled by default — the daemon auto-generates a secret on first start. Use webhook disable to turn them off.
# View webhook config and URLs
9to5 webhook info
# Get ready-to-use curl commands for an agent
9to5 webhook url <agent-id>
# Regenerate the secret (breaks existing integrations)
9to5 webhook refresh
Local trigger — POST to http://localhost:9505/trigger/<id> with a signed body and X-Signature header. Works for scripts on the same machine or in your local network.
Remote trigger — POST to the ntfy.sh URL shown by webhook info. The daemon subscribes via SSE. Works from anywhere — CI, GitHub Actions, other machines.
Both paths verify HMAC-SHA256 signatures and reject messages older than 5 minutes.
# Example: trigger from a script
SECRET='<your-webhook-secret>'
BODY='{"automation_id":"<id>","ts":'$(date +%s000)'}'
SIG=$(echo -n "$BODY" | openssl dgst -sha256 -hmac "$SECRET" | sed 's/^.* //')
# Local
curl -X POST http://localhost:9505/trigger/<id> \
-H "Content-Type: application/json" \
-H "X-Signature: $SIG" \
-d "$BODY"
# Remote (ntfy)
curl -X POST <ntfy-url> \
-H "Content-Type: application/json" \
-d '{"payload":"'"$BODY"'","sig":"'"$SIG"'"}'
All data is stored locally in ~/.9to5/ (SQLite database, daemon PID file, and webhook secret).
Landing page at michaelliv.github.io/9to5. For agent-friendly option references and scheduling examples, see skills/9to5/SKILL.md.
MIT
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
@biomejs/biomeEnvironment{
"local_name": "@biomejs/biome",
"alias": false,
"peer_metadata": null
} | ^1.9.0 | development |
@types/bunEnvironment{
"local_name": "@types/bun",
"alias": false,
"peer_metadata": null
} | ^1.1.0 | development |
@opentui/core-darwin-arm64Environment{
"local_name": "@opentui/core-darwin-arm64",
"alias": false,
"peer_metadata": null
} | 0.1.77 | optional |
@opentui/core-darwin-x64Environment{
"local_name": "@opentui/core-darwin-x64",
"alias": false,
"peer_metadata": null
} | 0.1.77 | optional |
@opentui/core-linux-x64Environment{
"local_name": "@opentui/core-linux-x64",
"alias": false,
"peer_metadata": null
} | 0.1.77 | optional |
@opentui/core-linux-arm64Environment{
"local_name": "@opentui/core-linux-arm64",
"alias": false,
"peer_metadata": null
} | 0.1.77 | optional |
@opentui/core-win32-x64Environment{
"local_name": "@opentui/core-win32-x64",
"alias": false,
"peer_metadata": null
} | 0.1.77 | optional |
@opentui/core-win32-arm64Environment{
"local_name": "@opentui/core-win32-arm64",
"alias": false,
"peer_metadata": null
} | 0.1.77 | optional |
Source distribution
{
"integrity": "sha512-xUdMNj1hrKJclKoJoRpRGTfP0OEEyID1I69Z6A8IAQplACGn8+w+vdLyKR/4Kph/p/B4LF7rZGIexuKYYupuuA==",
"shasum": "6fe6fc78d9576b87966c940f5c82635f1636cd29",
"tarball": "https://registry.npmjs.org/9to5/-/9to5-0.5.0.tgz",
"fileCount": 15,
"unpackedSize": 6165697,
"signatures": [
{
"keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U",
"sig": "MEYCIQCLthfo29xhsbzWWqbna/kUSXA/TBbVo5NK59CKpK9p5wIhAN2Cj7NEqYyTyJo4Q+JS57tbHlw5ScbyPwMfah0r4PW2"
}
]
}Observed since 20 Oct, 21:42 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:f1f9afa8c70058d682d5c1b478b90217aaa03390d3bc84fb1e0df5ba1811d9e1