Routines

Premium

Schedule any Skill to run automatically on a cron expression. Five presets, IANA timezones, full audit history per run, and a dashboard notification on every completion.

What is a Routine?

A Routine is a scheduled run of a Skill. It stores:

Skill

Which Skill to execute. The Skill defines the prompt template, provider, and model.

Schedule

A cron expression (e.g. 0 9 * * *) plus an IANA timezone (e.g. America/Chicago).

Input params

A JSON object passed to the Skill template on every fire — the same shape you'd use with Run now in the dashboard.

Enabled flag

Toggle a Routine off without deleting it. Paused Routines are skipped by the cron tick but keep their schedule.

Schedule Presets

Five built-in presets cover the most common schedules. Pick Custom to write your own cron expression.

PresetCronFires
Hourly0 * * * *Top of every hour
Daily0 9 * * *Every day at 09:00 in the chosen timezone
Weekly0 9 * * 1Mondays at 09:00
Monthly0 9 1 * *The 1st of every month at 09:00
Custom(any 5-field cron)e.g. */15 * * * * for every 15 minutes

The cron tick runs every minute, so the smallest practical schedule is once per minute. Cron expressions follow standard 5-field syntax (min hour dom month dow); seconds and macros like @hourly are not supported.

Timezones

Each Routine stores a timezone alongside its cron expression. The cron tick interprets the schedule in that timezone, so a Routine with 0 9 * * * and America/Chicago fires at 09:00 Central year-round, with daylight savings handled automatically.

Use any IANA timezone string (e.g. UTC, Europe/Madrid, Asia/Tokyo). The dashboard form defaults to your browser's detected zone.

Creating a Routine

Routines can be created from the dashboard or directly from Claude via the MCP. Both paths require at least one Skill in the project first.

From Dashboard

  1. 1. Open a project and click Routines in the header.
  2. 2. Click New Routine.
  3. 3. Pick the Skill to schedule.
  4. 4. Give the Routine a name.
  5. 5. Pick a preset (or Custom and write your own cron), confirm the timezone.
  6. 6. Provide an Input params JSON object — same shape as when you Run the Skill manually.
  7. 7. Click Create Routine. The first run fires at the next matching tick.

From Claude (MCP)

# Ask Claude to schedule a Skill

"Create a Routine called 'Daily LinkedIn post' that runs the 'Post draft' Skill every weekday at 8am Madrid time"

"Schedule the 'Weekly digest' Skill to fire on Mondays at 9am Chicago, with topic = 'last week'"

Claude will use the routines_create MCP tool with the preset that best matches your description.

Pause, Run Now, and Delete

Pause / Enable

On the Routine detail page, click ⏸ Pause to stop the cron from firing without losing the schedule. ▶ Enable reverses it. Paused Routines keep their next_run_at — when you re-enable, the next fire happens at that time.

Run Now

Fires the Skill immediately, ahead of schedule, using the Routine's saved input params. A new row appears in Execution history with trigger_type = scheduled. The Routine's next_run_at is unchanged — Run Now does not reschedule.

Delete

Danger zone on the Routine detail page permanently removes the schedule. Past execution history rows are kept so you don't lose your audit trail.

Notifications & Execution History

Every scheduled run is recorded in the same Execution history as manual Skill runs, with two extras:

  • The audit row is tagged with trigger_type = scheduled and the routine_id so you can filter per Routine.
  • A dashboard notification (the 🔔 bell) is sent to the Routine creator on every fire — green check on success, red X on failure. Click the notification to jump straight to the Routine detail page.

Failure modes that auto-pause a Routine: invalid cron expression, missing BYOK API key for the Skill's provider, or revoked project API key. You'll see a routine_failed notification with the reason.

MCP Tools

Seven Routine-related tools are exposed to Claude via the MCP client:

ToolPurpose
routines_listList all Routines for a project
routines_getRead a single Routine by id
routines_createCreate a Routine (preset or custom cron)
routines_updateRename, change schedule, change input params
routines_togglePause or enable a Routine
routines_run_nowFire a Routine immediately, outside its schedule
routines_deletePermanently remove a Routine

How it Runs

A Vercel Cron job hits /api/cron/trigger-routines every minute. That endpoint queries the database for any Routine where enabled = true and next_run_at <= now(), then for each due Routine:

  1. Updates next_run_at before firing — a slow run can't block the next tick.
  2. Calls the same skill-execute edge function the dashboard uses, passing trigger_type=scheduled and the Routine id.
  3. Writes the audit row, optionally saves the output to a knowledge space, and inserts the dashboard notification.

All execution costs are billed to your own Anthropic / OpenAI account via the project's BYOK keys, just like manual Skill runs. ContextForge does not bill per-Routine.