Routines
PremiumSchedule 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.
| Preset | Cron | Fires |
|---|---|---|
| Hourly | 0 * * * * | Top of every hour |
| Daily | 0 9 * * * | Every day at 09:00 in the chosen timezone |
| Weekly | 0 9 * * 1 | Mondays at 09:00 |
| Monthly | 0 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. Open a project and click Routines in the header.
- 2. Click New Routine.
- 3. Pick the Skill to schedule.
- 4. Give the Routine a name.
- 5. Pick a preset (or Custom and write your own cron), confirm the timezone.
- 6. Provide an Input params JSON object — same shape as when you Run the Skill manually.
- 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 = scheduledand theroutine_idso 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:
| Tool | Purpose |
|---|---|
| routines_list | List all Routines for a project |
| routines_get | Read a single Routine by id |
| routines_create | Create a Routine (preset or custom cron) |
| routines_update | Rename, change schedule, change input params |
| routines_toggle | Pause or enable a Routine |
| routines_run_now | Fire a Routine immediately, outside its schedule |
| routines_delete | Permanently 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:
- Updates
next_run_atbefore firing — a slow run can't block the next tick. - Calls the same
skill-executeedge function the dashboard uses, passingtrigger_type=scheduledand the Routine id. - 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.