---
title: Schedules | Letta Docs
description: Schedule one-time or recurring prompts for Letta Code agents
---

Scheduled tasks allow you to automate messages to your agent on pre-determined schedule. For example, you can have your agent prepare a custom briefing for you every morning at 9am, or have your agent triage your unread emails once an hour.

Your agent can also schedule tasks via the bundled skill. Try asking your agent to create a schedule itself by chatting with it.

## Getting started

The easiest way to configure channels is via the [Letta Code app](/letta-code/desktop-app/index.md). Simply navigate to the “Schedules” tab in the sidebar, and follow the on-screen instructions to set up a new schedule.

You can configure schedules on [remote devices](/letta-code/remote/index.md) with the Letta Code app as well - simply swap the selected device in the schedules menu.

Scheduled tasks are bound to individual devices. They only execute while a remote environment is connected with `letta server`, or when your local Letta Code desktop app.

For local-only automation without Letta Cloud, use your system scheduler with [headless local mode](/letta-code/local-mode#run-local-mode-headlessly/index.md), for example `letta --backend local -p "..."`.

## Setting up schedules via the CLI

Start a remote environment:

```
letta server --env-name "work-laptop"
```

In another terminal, add a recurring task:

Terminal window

```
letta cron add \
  --agent agent-123 \
  --conversation default \
  --name "daily-review" \
  --description "Summarize recent code changes every morning" \
  --prompt "Review recent changes and summarize any issues." \
  --cron "0 9 * * *"
```

Use `--every 1d` for a once-daily task at local midnight. Use `--cron` when you need a fixed time of day like `9:00am`.

List tasks for the agent:

Terminal window

```
letta cron list --agent agent-123
```

If no listener is active when you add the task, Letta Code still creates it, but warns that it will only execute once `letta server` is connected.

## Command reference

Use `letta cron` to create, inspect, and remove scheduled tasks.

| Command                                                                                          | Description                                                                     |
| ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------- |
| `letta cron add --name <name> --description <text> --prompt <text> --every <interval> [options]` | Create a recurring task from a human-friendly interval like `5m`, `2h`, or `1d` |
| `letta cron add --name <name> --description <text> --prompt <text> --at <time> [options]`        | Create a one-time task for a time like `"3:00pm"` or `"in 45m"`                 |
| `letta cron add --name <name> --description <text> --prompt <text> --cron "<expr>" [options]`    | Create a recurring task from a raw 5-field cron expression                      |
| `letta cron list [--agent <id>] [--conversation <id>]`                                           | List tasks, optionally filtered by agent or conversation                        |
| `letta cron get <id>`                                                                            | Show details for one task                                                       |
| `letta cron delete <id>`                                                                         | Delete one task                                                                 |
| `letta cron delete --all --agent <id>`                                                           | Delete all tasks for an agent                                                   |

### Required fields for `add`

- `--name`: short label for the task
- `--description`: longer summary of what the task is for
- `--prompt`: the prompt that will be sent when the task fires
- One schedule selector: `--every`, `--at`, or `--cron`
- `--agent <id>` unless `LETTA_AGENT_ID` is already set in the environment

Conversation selection defaults to `LETTA_CONVERSATION_ID` when available, or `default` otherwise.

## Current behavior and limits

These constraints are important enough to know before you depend on the feature:

- Tasks only execute while `letta server` is connected.
- One-shot tasks that are more than 5 minutes late are marked as missed.
- Letta Code currently allows up to 50 active tasks per agent.
- Recurring tasks remain active until you delete them.
- `--every 1d` fires daily at local midnight. Use `--cron` for a fixed time of day.
- `--at` values are interpreted in your local timezone.
- Raw cron expressions are evaluated in the local timezone by default.
- All `letta cron` commands print JSON, so they work well in scripts and wrappers.

## Examples

### Daily review

Terminal window

```
letta cron add \
  --agent agent-123 \
  --name "daily-review" \
  --description "Review recent changes every morning" \
  --prompt "Review recent changes and summarize any issues." \
  --cron "0 9 * * 1-5"
```

### One-time reminder

Terminal window

```
letta cron add \
  --agent agent-123 \
  --conversation default \
  --name "deploy-reminder" \
  --description "Remind me to validate staging before deploy" \
  --prompt "Check staging health, review recent failures, and summarize anything blocking deploy." \
  --at "in 45m"
```

### Frequent recurring check

Terminal window

```
letta cron add \
  --agent agent-123 \
  --name "log-watch" \
  --description "Check logs every five minutes" \
  --prompt "Inspect the latest logs and flag anything unusual." \
  --every 5m
```

## Troubleshooting

- **My task never ran**

  - Make sure `letta server` was connected when the schedule should have fired.
  - Run `letta cron list --agent <id>` and confirm the task is still active.

- **My one-time task disappeared without running**

  - If the listener was down for long enough, the task may have been marked as missed.
