---
title: Scheduling a recipe
---

# Scheduling a recipe

## What it is

A recipe is a saved multi-step Claude workflow you would otherwise start by hand. **Scheduling** it
means Omniscio starts it for you on a repeating calendar — every couple of hours, every weekday
morning, on the first of the month — without you opening the app.

Because a recipe run starts real Claude work, **every fire costs money**. That is why the form
defaults to a sensible, conservative schedule rather than to "as often as possible", and why it is
worth reading the controls rather than accepting them.

## Where to find it

- **From the recipe editor** — the **Schedule Recipe** button in the Recipe Editor opens the
  **Schedule Recipe** dialog. On a recipe that already has a schedule, the same button reads
  **Edit Schedule** and reopens it.
- **The dialog itself** — a **Frequency** row of four buttons, then the controls that frequency
  needs, a **Next run** preview underneath, and **Cancel** / (**Schedule** or **Update**) at the
  foot. A **Remove** action sits alongside for deleting the schedule, and once a schedule exists
  the dialog header carries an **Active / Paused** toggle.

See [Use recipes](use-recipes.md) for what a recipe is and how to run one by hand.

## How it behaves

### Choosing a frequency

Four buttons: **Interval**, **Daily**, **Weekly**, **Monthly**. The choice changes which controls
appear below it.

- **Interval** — run every so many minutes or hours, with no fixed time of day. You get a row of
  **quick-select** buttons — **30m, 1h, 2h, 4h, 8h, 12h** — and a **Custom** box that takes a number
  of minutes. **Custom will not go below 15 minutes.** This is the frequency to use for "keep an eye
  on things", and the reason for the floor is straightforward: at anything faster the run costs more
  than the thing it is watching.
- **Daily** — once a day, at a **Time** you pick.
- **Weekly** — once a week at a **Time** you pick, on **the days you tick** — seven toggles, one per
  weekday, so "weekdays only" is Mon–Fri ticked and the weekend left off.
- **Monthly** — once a month at a **Time**, on the **day of the month** you pick. The picker offers
  **1 to 28 only**: the last days of the month vary in length, and clamping to 28 means a monthly
  schedule never silently skips a month because it was pointed at the 31st.

### Checking what you set

Below the frequency controls, a **Next run** line tells you exactly when this will next fire, so a
misread frequency shows up before you save rather than after. **Schedule** creates it;
**Update** saves a change to an existing one.

### Afterwards

- **The header toggle** pauses and resumes the schedule without deleting it — the right move when
  you want the recipe to stay configured but stop running, rather than losing the setup.
- **Remove** deletes the schedule. The recipe itself is untouched.
- **Because the run is a real Claude session, a scheduled recipe shows up in your inbox like any
  other run** — its approval gates still apply, and a step waiting on your approval still waits for
  it (see [Use recipes](use-recipes.md) for the approval-timeout behaviour).

The defaults a brand-new schedule is seeded with are deliberate, not arbitrary: **5pm local, every
2 hours, weekdays**. If you accept them and press Schedule, that is what you get.

### Recipe schedules and cron jobs

These are two different mechanisms, and it is easy to reach for the wrong one:

- A **recipe schedule** lives with the recipe. It is the simplest way to put one recipe on a
  calendar, and it is what this dialog creates.
- A **cron job** is the general scheduler — it can run a script, start a session, *or* run a recipe,
  and it carries the extra switches a job can have (approval before every run, self-healing,
  run-if-missed, per-job environment variables, and chaining after another job). Use a cron job when
  you want those; see [Cron jobs](cron-jobs.md).

## For agents

- The dialog is `src/renderer/src/features/recipes/RecipeScheduleDialog.tsx`. Constants worth knowing
  before reading or writing a schedule: `INTERVAL_PRESETS` (30m/1h/2h/4h/8h/12h),
  `INTERVAL_MIN_MINUTES = 15`, the monthly day picker built from `Array.from({ length: 28 })`, and
  the new-schedule seed of 5pm local / every 2 hours / weekdays.
- Pointing a **cron job** at a recipe instead is the `cron-recipe-executor` path; the recipe itself
  is then run by the cron engine, not by this schedule.

## Related

- [Use recipes](use-recipes.md) — what a recipe is, running one by hand, and the approval gates a
  scheduled run still goes through.
- [Cron jobs](cron-jobs.md) — the general scheduler, including running a recipe as a job type.
- [Create a cron job with AI](create-cron-job-with-ai.md) — describing a schedule in plain language
  and letting an AI create it.
- [Recipes via CLI](recipes-cli-authoring.md) — authoring and inspecting recipes from an outside AI.
