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.
npx skills add encoredev/skills --skill encore-cron -a claude-code
npx skills add encoredev/skills --skill cron -a claude-codeWhat 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
CronJobdeclarations 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-codenpx skills add encoredev/skills --skill cron -a claude-code2Manually: put the files in place
~/.claude/skills/cron/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/cron/
1Skills CLI (Vercel)
npx skills add encoredev/skills --skill cron -a codex2Manually: put the files in place
.agents/skills/cron/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add encoredev/skills --skill cron -a cursor2Manually: put the files in place
.cursor/skills/cron/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install encoredev/skills cron2Manually: put the files in place
.github/skills/cron/SKILL.md1Skills CLI (Vercel)
npx skills add encoredev/skills --skill cron -a gemini-cli2Platform CLI
gemini skills install https://github.com/encoredev/skills --path encore/cronManually: put the files in place
.devin/skills/cron/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add encoredev/skills --skill cron -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
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