Skip to content

The jobs record

Each connected repo has a file, .claude/jobs.json, that lists its jobs: title, prompt, schedule, time zone and status. The jobs script writes it at every change, then commits and pushes that file alone.

So git keeps every job, and the history of every change: who changed which schedule, and when.

.claude/jobs.json
{
"about": "Scheduled jobs on this repo, kept by the scheduled-jobs skill (https://github.com/mikedepo/paperclip-cloudcli): every change to a job is a commit of this file. Each job runs its prompt in this repo with Claude Code (the Runner agent), or with the agent its \"agent\" names (Codex: OpenAI's Codex), on its 5-field cron schedule in its time zone; paused jobs don't run. To recreate them on a new server: node ~/.claude/skills/scheduled-jobs/jobs.mjs restore",
"jobs": [
{
"title": "Weekday open issues digest",
"prompt": "Run the open-issues-digest skill.",
"cron": "0 8 * * 1-5",
"timezone": "America/Toronto",
"status": "active",
"paperclipId": "e8b29a5f-ff89-4f8f-bef3-119ee91af308"
},
{
"title": "Daily uptime check",
"prompt": "Run the uptime-check skill.",
"cron": "0 7 * * *",
"timezone": "America/Toronto",
"status": "paused",
"secrets": ["STATUS_WEBHOOK_URL"],
"paperclipId": "4c0d9b12-6a5e-4f3b-9d77-2b8e1f0a6c31"
}
]
}
Field Meaning
title The job’s name.
prompt What the run is told: the skill to run.
cron, timezone When it runs. A job with several schedules has a schedules list instead; a job with none has "cron": null.
status active or paused. Archived jobs leave the file.
agent Only when the job isn’t run by the Runner: "Codex".
secrets The names of the keys the job’s skill needs, never their values. See Secrets.
paperclipId The job’s ID in Paperclip, to follow a job renamed in the dashboard.

Each change is a commit of this file alone, with a message that says what changed:

Job "Weekday open issues digest" created: 0 8 * * 1-5 America/Toronto, active
Job "Weekday open issues digest" changed: schedule 0 9 * * 1-5 America/Toronto
Job "Weekday open issues digest" paused
Job "Daily uptime check" created: 0 7 * * * America/Toronto, active, needs STATUS_WEBHOOK_URL
Jobs recorded as they are in Paperclip

Look at the file’s history on GitHub, or ask Claude: “what changed in my jobs this month?”.

  • Change jobs through Claude, not by editing the file. The record follows Paperclip, not the reverse: an edit to the file isn’t applied to Paperclip. Only jobs missing from Paperclip are, by restore.
  • Only that file is committed. Other work in progress in the repo stays out of the commit.
  • It goes to the default branch. If the clone is on another branch, Claude says so; merge it to keep the record there.
  • Nothing is written at start, and nothing is restored on its own. A new server never empties your records, and never runs your jobs twice by surprise.

Jobs created before the record existed (before the 2026-11-02 update) are added at their next change. Or ask Claude to “record my jobs” to write them all at once.

Paperclip (w/ CloudCLI) is a Railway template by AvgSoft. Paperclip, CloudCLI, Claude Code, Codex and Railway belong to their makers. Template codeDeploy on Railway