Scheduling Tasks logo

Scheduling Tasks

OrganizationPopular
letta-ai
scheduling-tasks

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.

Overview

Publisherletta-ai
Repositoryletta-code
Skill namescheduling-tasks
Stars
3.4K
Forks
411
Bundled files
Instructions only
LicenseApache-2.0
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by letta-ai on GitHub. Read the source before you install it.

Installation

Install the Scheduling Tasks AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/letta-ai/letta-code.git /tmp/letta-code
mkdir -p .claude/skills
cp -r /tmp/letta-code/src/skills/builtin/scheduling-tasks .claude/skills/scheduling-tasks
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Scheduling Tasks in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Scheduling Tasks on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Scheduling Tasks is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Scheduling Tasks

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.

When to Use This Skill

  • User asks to be reminded of something ("remind me to X at Y")
  • User wants a recurring check-in ("every morning ask me about X")
  • User wants a one-shot delayed message ("in 30 minutes, check on X")
  • User wants to see or cancel existing scheduled tasks

Where Schedules Run — Omit the Flags

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 computers 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.

Fast Follow-ups vs Recurring Jobs

Two patterns cover most schedules:

  • Fast follow-ups ("check on the PR in 5m"): the default is right — same computer as the active conversation. If the session dies before it fires, the follow-up usually died with the task anyway.
  • Recurring jobs ("every Monday 11am, start the lunch order"): prefer durability. If the CLI warned that a recurring schedule is local, that's usually wrong for the user's intent — recreate it with --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.

CLI Usage

All commands go through letta cron via the Bash tool. Output is JSON.

Creating a Task

bash
letta cron add --name <short-name> --description <text> --prompt <text> <schedule>

Required flags:

FlagDescription
--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):

FlagTypeExample
--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:

FlagDescription
--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
--onceMark --at as one-shot (already the default for --at)

Listing Tasks

bash
letta cron list

Optional filters: --agent <id>, --conversation <id>, --runner local|cloud

Getting a Single Task

get accepts an ID or name:

bash
letta cron get <id-or-name> [--runner local|cloud] [--agent <id>]

Reading Run History

bash
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.

Binding a Task to the Right Conversation

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:

bash
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 self

Then verify the binding explicitly:

bash
letta cron list --agent "$LETTA_AGENT_ID" --conversation self

Deleting or Replacing Tasks

delete accepts an ID or name; remove is an alias.

bash
# 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.

Timezones — Convert Before Writing --cron

Cloud-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.

Examples

"Remind me every morning at 9am to walk the dog" (user in UTC−7)

bash
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.

"Check on the deploy in 30 minutes"

bash
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 self

"Every weekday at 5pm, remind me to submit my timesheet" (user in UTC−7)

bash
letta 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.

"What reminders do I have?"

bash
letta cron list

If you need to confirm the exact conversation a task is bound to, list with explicit filters instead:

bash
letta cron list --agent "$AGENT_ID" --conversation "$CONVERSATION_ID"

"Cancel the dog walk reminder"

bash
letta cron delete dog-walk-reminder

Writing Good Prompts

The --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:

  • Good: "The user asked to be reminded to review the PR for the auth refactor. Check if it's still open and nudge them."
  • Bad: "reminder"

Include context about what the user originally asked for, so you can give a helpful response when the prompt arrives.

Important Notes

  • Minimum granularity: 1 minute. Intervals under 60 seconds are rounded up.
  • Recurring tasks: No longer auto-expire. They remain active until explicitly cancelled.
  • One-shot cleanup (local runner): One-shot local tasks are garbage-collected 24 hours after firing.
  • Default binding: 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.
  • Local scheduler requirement: Local schedules only fire while a Letta session is running on their computer; fires while no session runs are marked as missed. Cloud schedules fire from the cloud regardless.
  • --at for specific times: --at "3:00pm" schedules a one-shot. If the time has already passed today, it schedules for tomorrow.
  • Cloud schedule creation failures are loud: if creating a cloud schedule fails, no schedule is created — a failed create never silently becomes a local schedule. (The local placement for computers the cloud scheduler can't reach is decided before creation and reported in the output.)

Cron Expression Reference

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 minutes
  • 0 */2 * * * — every 2 hours
  • 0 9 * * * — daily at 9:00 UTC
  • 0 9 * * 1-5 — weekdays at 9:00 UTC
  • 30 8 1 * * — 8:30 UTC on the 1st of each month

Frequently asked questions

What does the Scheduling Tasks AI skill do?

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.

Why use Scheduling Tasks on TypingMind?

Because you install it once and use it with any model. Scheduling Tasks is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Scheduling Tasks in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/letta-ai/letta-code/tree/main/src/skills/builtin/scheduling-tasks. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Scheduling Tasks?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Scheduling Tasks?

As many as you like. As long as a model supports skills, you can use Scheduling Tasks with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Scheduling Tasks AI skill free?

Yes. It is published on GitHub by letta-ai under the Apache-2.0 license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇