Schedules reminders and recurring tasks via the letta cron CLI. Use when the user asks to be reminded of something, wants periodic work or check-ins, or needs to list, inspect, replace, or cancel scheduled tasks.
72
89%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
This skill lets you create, list, and manage scheduled tasks using the letta cron CLI. Scheduled tasks send a prompt to the agent on a timer — useful for reminders, periodic check-ins, and deferred follow-ups.
Default guidance: omit --runner and --computer. The CLI places the schedule so the work keeps running on the computer where it was created. Don't move scheduled work to a different computer than the active conversation without a reason: two computers working the same conversation can conflict.
Pass a flag only when you have a requirement the default can't infer:
--runner cloud — the schedule must fire no matter which computers are online; execute in the agent's cloud sandbox.--computer <deviceId> — the work needs a specific connected computer (its filesystem, services, or credentials). Get the deviceId from letta environments list. If that computer is offline at fire time, execution falls back to the cloud sandbox.--runner local — the work must only ever run on the current computer, even if that means missing fires while no session is running here.The CLI reports its placement in the command output. If it warns that the schedule is local (this happens when the cloud scheduler cannot reach the current computer), the schedule only fires while a Letta session is running here — read the warning and decide whether that's acceptable.
Two patterns cover most schedules:
--runner cloud, or --computer if the job needs a specific always-on computer. A fresh conversation per run is the default; pass a conversation explicitly when the job needs continuity in one thread.All commands go through letta cron via the Bash tool. Output is JSON.
letta cron add --name <short-name> --description <text> --prompt <text> <schedule>Required flags:
| Flag | Description |
|---|---|
--name <text> | Short identifier for the task (e.g. "dog-walk-reminder") |
--description <text> | Human-readable description of what the task does |
--prompt <text> | The message that will be sent to the agent when the task fires |
Schedule (pick one):
| Flag | Type | Example |
|---|---|---|
--every <interval> | Recurring (cron shorthand) | 5m, 2h, 1d |
--at <time> | One-shot | "3:00pm", "in 45m" |
--cron <expr> | Raw cron (recurring) | "0 9 * * 1-5" |
Optional flags:
| Flag | Description |
|---|---|
--agent <id> | Agent ID (defaults to LETTA_AGENT_ID from the current shell/session) |
--conversation <id> | Conversation target: omit or pass new for a fresh conversation per fire; pass self for the current conversation; pass default for the agent default; or pass a concrete ID |
--runner <runner> | cloud or local — normally omit; see "Where Schedules Run" above |
--computer <id> | Execute on a specific connected computer — normally omit |
--once | Mark --at as one-shot (already the default for --at) |
letta cron listOptional filters: --agent <id>, --conversation <id>, --runner local|cloud
get accepts an ID or name:
letta cron get <id-or-name> [--runner local|cloud] [--agent <id>]letta cron runs --id <task-id> [--limit <n>] [--runner local|cloud] [--agent <id>]For local run history, --run-id <id> selects one run. Cloud history ignores that flag.
If exact routing matters, pass both --agent and --conversation explicitly.
letta cron add falls back to LETTA_AGENT_ID for the agent. An omitted --conversation means "new", so every fire gets a fresh conversation. Pass --conversation self to capture the current LETTA_CONVERSATION_ID, --conversation default for the agent default, or a concrete conversation ID.
Safest pattern:
letta cron add \
--name "email-check" \
--description "Daily email summary in this conversation" \
--prompt "Check the user's email and post a summary here." \
--cron "0 10 * * *" \
--agent "$LETTA_AGENT_ID" \
--conversation selfThen verify the binding explicitly:
letta cron list --agent "$LETTA_AGENT_ID" --conversation selfdelete accepts an ID or name; remove is an alias.
# Delete a specific task
letta cron delete <id-or-name> [--runner local|cloud] [--agent <id>]
# Delete all tasks for one agent
letta cron delete --all --agent "$AGENT_ID"In-place editing is not available. To change a schedule, create and verify the replacement before deleting the old one.
--cronCloud-schedule recurring expressions (both --cron and the expression --every compiles to) are interpreted in UTC. Users say times in their local timezone, so convert before writing the expression: a user in PDT asking for "9am daily" needs --cron "0 16 * * *" (9am PDT = 16:00 UTC; 17:00 during PST). State the conversion in your reply so the user can catch a wrong assumption. Local-runner tasks use the computer's local timezone — no conversion. --at stores one absolute timestamp parsed in the current process timezone, so it needs no conversion either.
letta cron add \
--name "dog-walk-reminder" \
--description "Daily 9am (America/Los_Angeles) reminder to walk the dog" \
--prompt "Hey! It's 9am — time to walk the dog." \
--cron "0 16 * * *"Note: --every 1d fires daily at midnight (UTC on a Cloud schedule), so use --cron for a specific time of day, converting the user's local time to UTC first.
letta cron add \
--name "deploy-check" \
--description "One-time check on deployment status" \
--prompt "Check the deployment status and report the result here." \
--at "in 30m" \
--agent "$LETTA_AGENT_ID" \
--conversation selfletta cron add \
--name "timesheet-reminder" \
--description "Weekday 5pm (America/Los_Angeles) timesheet reminder" \
--prompt "Friendly reminder: don't forget to submit your timesheet before EOD!" \
--cron "0 0 * * 2-6"Note the day shift: 5pm UTC−7 is midnight UTC the next day, so weekdays Mon–Fri become 2-6. Always re-derive both the hour and the day fields after converting.
letta cron listIf you need to confirm the exact conversation a task is bound to, list with explicit filters instead:
letta cron list --agent "$AGENT_ID" --conversation "$CONVERSATION_ID"letta cron delete dog-walk-reminderThe --prompt value is what gets sent to you (the agent) when the task fires. Write it as a message that will make sense when you receive it later, with enough context to act on:
Include context about what the user originally asked for, so you can give a helpful response when the prompt arrives.
letta cron add uses --agent first, then LETTA_AGENT_ID. Omit --conversation for a fresh conversation per fire; use --conversation self to capture LETTA_CONVERSATION_ID explicitly.--at for specific times: --at "3:00pm" schedules a one-shot. If the time has already passed today, it schedules for tomorrow.For --cron, use numeric 5-field cron syntax (named days/months, seconds, ?, L, and # are not supported):
┌───────────── minute (0-59)
│ ┌───────────── hour (0-23)
│ │ ┌───────────── day of month (1-31)
│ │ │ ┌───────────── month (1-12)
│ │ │ │ ┌───────────── day of week (0-6, Sun=0)
│ │ │ │ │
* * * * *Common patterns (UTC on Cloud schedules):
*/5 * * * * — every 5 minutes0 */2 * * * — every 2 hours0 9 * * * — daily at 9:00 UTC0 9 * * 1-5 — weekdays at 9:00 UTC30 8 1 * * — 8:30 UTC on the 1st of each month051b47f
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.