Skip to main content
A schedule starts an instance or a job for you later: once at a time you pick, or again and again on a repeating schedule in your timezone. Your nightly training run starts at 02:00 London time without anyone awake to launch it. Every schedule has a maximum runtime, so nothing it starts runs unbounded. Runcrate checks schedules every 2 minutes, so a run starts within about 2 minutes of its time.

How a schedule runs

1

Create

You describe what to start (the same settings as launching an instance or submitting a job), when to start it, and a maximum runtime. The settings are checked now, so a schedule that is accepted can launch.
2

Wait

The schedule shows its next run. You can pause, resume, change or delete it at any time.
3

Launch

At its time, Runcrate starts the instance or job as the person who set the schedule up (who created it, or last changed its spec or timing, or resumed it), through the same kind of sign-in or API key they used, in the environment it was created in. It is billed like any instance or job you start yourself.
4

Record

The schedule keeps the result of its last run (launched, failed or a skip), the id of what it started, and how many runs it has made.

Create a schedule

In the launch sheet, turn on Start later:
  1. Pick Once and a date and time, or Repeat and a preset: Daily, Weekdays, Weekly or Custom (a cron expression).
  2. Check the timezone. It starts as your browser’s.
  3. Set a maximum runtime. It is required while Start later is on.
  4. Click Schedule. Nothing launches now.
Your schedules are on the Schedules tab of the Instances page. Each row shows when it runs, its next run and its last result, with actions to pause, resume, run now and delete.

Once or repeating

A schedule is one or the other: send run_at to run once, or cron to repeat.
  • Once. Pick a real date and time in the future, at most 365 days ahead (2027-02-30 is refused). After it runs, the schedule stays in the list, paused, with no next run and its result.
  • Repeating. A standard 5-field cron expression, minute hour day-of-month month day-of-week, read in the schedule’s timezone. Runs must be at least 15 minutes apart. If runs were missed while Runcrate could not start them, the schedule runs once and moves on to its next time; it does not catch up on every missed run.
The dashboard presets are cron expressions you can also send yourself: Each field accepts *, a value, a range a-b, a step */n or a-b/n, and lists such as 1,15. Months take JAN to DEC, days of the week take SUN to SAT or 0 to 7 (both 0 and 7 are Sunday). When you restrict both the day of the month and the day of the week, a day that matches either one runs, as in standard cron.

Timezones and daylight saving

A schedule’s timezone is an IANA name such as Europe/London or America/New_York, and UTC if you leave it out. A repeating schedule keeps its wall-clock time across daylight saving changes: 0 2 * * * in London runs at 02:00 London time in winter and in summer. Twice a year a local time is missing or happens twice:
  • A time that does not exist that day (clocks go forward) runs at the same offset after the gap: a 02:30 run happens at 03:30.
  • A time that happens twice (clocks go back) runs once, the first time.
On a one-off, run_at is an exact instant and the timezone is used only to show it.

Maximum runtime

Every schedule needs a maximum runtime (spec.max_runtime_minutes), so a run nobody is watching stops on its own.
  • Jobs: 1 minute to 24 hours, counted from when the command starts, like any job.
  • Instances: 5 minutes to 7 days. The instance stops when it reaches it, as with auto stop on an instance you launch yourself.

When a run is skipped

A run that is skipped does not launch anything and is not retried. The schedule moves on to its next run.
  • Overlap. By default (overlap: "skip"), a repeating schedule skips a run while the instance or job from its previous run is still live, so a slow run never stacks up a second machine. Set overlap: "allow" to start every run regardless. The last result is skipped_overlap.
  • Budget. When the environment’s monthly budget is spent, the run is skipped. The last result is skipped_budget.

Who a run launches as

Anyone with access to the environment sees and manages every schedule in it, like instances. Each run launches as the schedule’s run_as person, through the credential they used (run_as_credential: user for a dashboard sign-in, api_key for an API key, agent for an MCP or CLI agent sign-in), and is billed to the workspace like anything they launch. run_as starts as the person who created the schedule (created_by, which never changes). It moves to whoever later changes its spec, its timing (run_at, cron or timezone) or its overlap, or resumes it. Pausing or renaming does not move it. Before each run, Runcrate checks that the credential still holds:
  • If the run_as person has left the workspace, the schedule is paused with the last result no_access.
  • If the API key behind it has been revoked or no longer belongs to this environment, or the agent’s sign-in has ended, the schedule is paused with the last result credential_revoked.
So revoking an API key or ending an agent’s sign-in stops the schedules it set up. To take one over, resume it: from then on it runs as you, through the credential you resumed it with. When many schedules are due at the same time, each workspace gets its turn, so one busy workspace does not hold up another.

What everyone in the environment can read

Everything in spec except environment variable values, including launch_script and startup_commands, is returned to everyone with access to the environment. env (jobs) and env_vars (instances) come back only as their names in env_keys, but their values are kept with the schedule and copied to each machine it starts. For tokens and passwords, use your environment’s secrets, set in the dashboard: every instance and job gets them when it starts, stored encrypted, so they never need to be in a schedule. Never put them in a script or command.

Notifications

When a scheduled launch fails, or a schedule is paused because its run_as person lost access or its credential was revoked, Runcrate emails the workspace’s owners and admins and sends a schedule_failed event to the workspace’s webhooks (set up under Workspace settings), like the budget and auto stop alerts. The webhook data carries schedule_id, schedule_name, environment_id, kind, status (failed, failing, no_access or credential_revoked), error and scheduled_for. A repeating schedule whose scheduled runs fail 5 times in a row is paused (status: failing, one notification instead of the fifth failed), so a schedule that can’t start stops alerting you every time. Run now failures don’t count, and a launch, a change or a resume starts the count again. Skipped runs do not notify: a budget skip follows the budget alert you already received, and an overlap skip means the previous run is still going.

Pause, resume and run now

  • Pause stops future runs (enabled: false). Nothing already running is stopped.
  • Resume (enabled: true) runs a repeating schedule at its next occurrence from now. A one-off resumes only if its time is still in the future; otherwise send a new run_at.
  • Run now launches the instance or job straight away as you, whether the schedule is paused or not. It does not move the next run, and its result becomes the last result (run_count counts runs that launched).
  • Delete removes the schedule. Instances and jobs it already started keep running.
Changing spec replaces it whole. Environment variable values are never returned (you get their names in env_keys), so send them again when you change the spec.

Last result

Limits

Errors

Workspaces and environments

Schedules belong to a workspace and an environment, like instances and jobs. An API key or agent session sees only the schedules in its own environment. Otherwise, pick one with the X-Environment header or the environment query parameter (MCP: the env parameter).