Skip to main content
skill CX Codex

encore-cron — Claude Code skill: what it does, how to install

Guides agents in setting up periodic background tasks in Encore.ts with CronJob. Useful for nightly cleanup, scheduled reports, and batch jobs.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add encoredev/skills --skill encore-cron -a claude-code
npx skills add encoredev/skills --skill cron -a claude-code
Open on GitHub

What encore-cron does

This skill guides the agent when configuring recurring background jobs in Encore.ts. It wires a package-level CronJob declaration from encore.dev/cron to an existing internal endpoint. The schedule definition must live at module scope rather than inside a function body.

Two scheduling formats are supported. The every parameter accepts simple intervals like "30m" or "2h", which must divide 24 hours evenly. A value like "7h" is invalid. Alternatively, schedule accepts standard five-field cron expressions. All schedule times run in UTC. Target endpoints are marked with { expose: false } so external HTTP clients cannot trigger them directly.

Local development with encore run will never execute scheduled jobs. Timers fire only after deployment. Endpoint operations need to remain idempotent, because redeploy windows can cause occasional retries or delayed execution.

What it helps with

  • schedule batch aggregations at specific UTC times
  • declare recurring cleanup jobs using fixed time intervals
  • connect background CronJob declarations to internal API endpoints
  • protect scheduled endpoints from public access with { expose: false }

Example prompts for the agent

  • Create an Encore.ts CronJob to aggregate daily orders at 02:00 UTC
  • Set up a recurring cleanup task that runs every 30 minutes in Encore
  • Configure a weekly batch report running on Sunday at midnight UTC

How to install encore-cron

1Skills CLI (Vercel)

npx skills add encoredev/skills --skill encore-cron -a claude-code
npx skills add encoredev/skills --skill cron -a claude-code

2Manually: put the files in place

~/.claude/skills/cron/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/cron/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about encore-cron

How do I install encore-cron in Claude Code?

Run npx skills add encoredev/skills --skill encore-cron -a claude-code.

What does the encore-cron skill do?

It gives coding agents exact guidelines for defining package-level CronJob instances and internal endpoints in Encore.ts.

Do Encore cron jobs execute during local development?

No. Tasks run via encore run do not fire timers. Schedules only execute inside deployed environments.

Source text

SKILL.md · Apache-2.0
---
name: encore-cron
description: >-
  Schedule periodic / recurring work in Encore.ts using `CronJob` from `encore.dev/cron`. Covers `every: "1h"` interval syntax and `schedule: "0 9 * * 1"` cron expressions.
when_to_use: >-
  User wants to run a job on a schedule — anything with the words schedule, scheduled, daily, hourly, weekly, periodic, recurring, every N minutes/hours, "at HH:MM UTC", midnight, batch job, aggregation job, nightly, cleanup job, or background work that runs on a timer rather than in response to a request. Trigger phrases: "every day at 02:00 UTC", "daily aggregation", "run hourly", "scheduled task", "cron", "nightly cleanup", "on a schedule".
---

# Encore Cron Jobs

## Instructions

A `CronJob` declaration in Encore.ts ties a schedule to an existing `api(...)` endpoint. The endpoint runs at the chosen cadence. Declare the `CronJob` at package level — not inside a function.

```typescript
import { CronJob } from "encore.dev/cron";
import { api } from "encore.dev/api";

// 1. The endpoint to call (typically internal: expose: false)
export const aggregateDailyOrders = api(
  { expose: false },
  async (): Promise<void> => {
    // Aggregation logic
  }
);

// 2. Package-level cron declaration
const _ = new CronJob("aggregate-daily-orders", {
  title: "Aggregate orders for the previous day",
  schedule: "0 2 * * *",  // 02:00 UTC every day
  endpoint: aggregateDailyOrders,
});
```

## Schedule Formats

| Field | Example | Description |
|---|---|---|
| `every` | `"1h"`, `"30m"`, `"6h"` | Simple interval. **Must divide 24h evenly** — `"7h"` is invalid. |
| `schedule` | `"0 9 * * 1"` | Standard cron expression (5 fields, UTC). |

### Common cron expressions

| Cron | Meaning |
|---|---|
| `"0 * * * *"` | Every hour, on the hour |
| `"0 2 * * *"` | Daily at 02:00 UTC |
| `"0 0 * * 0"` | Weekly on Sunday at midnight UTC |
| `"0 4 15 * *"` | 04:00 UTC on the 15th of each month |

## Important behaviour

- **Cron jobs do not execute when running locally with `encore run`.** Only deployed environments fire crons.
- The cron endpoint should be `expose: false` so it can't be triggered externally — only the cron scheduler should call it.
- All times in `schedule` are UTC. Convert from local time when designing the schedule.
- The endpoint must already exist at module load — declare it before the `CronJob`.

## Guidelines

- Use `every` for "run on a regular interval" (must divide 24h).
- Use `schedule` for specific times of day or days of week.
- Keep endpoint logic idempotent: a cron may fire late or be retried in a redeploy window.
- For event-driven background work (not time-driven), use the `encore-pubsub` skill instead.

© encoredev · Apache-2.0 · encoredev/skills

Similar skills

All skills for Backend and APIs →

From the same set26

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor