sathergate/clocktower
Cron jobs for Next.js. Serverless-native.
Platform-specific configuration:
{
"mcpServers": {
"clocktower": {
"command": "npx",
"args": [
"-y",
"clocktower"
]
}
}
}Add the config above to .claude/settings.json under the mcpServers key.
Cron jobs for Next.js. Serverless-native.
Zero runtime dependencies. TypeScript-first. Works with Vercel Cron out of the box.
npm install croncall// lib/jobs.ts
import { createClockTower } from "croncall";
export const tower = createClockTower({
jobs: {
syncUsers: {
schedule: "0 * * * *", // every hour
handler: async () => {
await db.syncUsersFromExternalAPI();
},
description: "Sync users from external API",
retry: { maxAttempts: 3, backoff: "exponential" },
timeout: 30_000,
},
sendDigest: {
schedule: "0 9 * * 1", // Mondays at 9 AM UTC
handler: async () => {
await email.sendWeeklyDigest();
},
description: "Send weekly digest email",
},
cleanupSessions: {
schedule: "@daily",
handler: async () => {
await db.deleteExpiredSessions();
},
},
},
secret: process.env.CRON_SECRET,
});// app/api/cron/route.ts
import { createCronHandler } from "croncall/next";
import { tower } from "@/lib/jobs";
export const GET = createCronHandler(tower);Add cron schedules to vercel.json:
{
"crons": [
{ "path": "/api/cron?job=syncUsers", "schedule": "0 * * * *" },
{ "path": "/api/cron?job=sendDigest", "schedule": "0 9 * * 1" },
{ "path": "/api/cron?job=cleanupSessions", "schedule": "0 0 * * *" }
]
}Or generate it programmatically:
import { generateVercelCron } from "croncall/next";
import { tower } from "./lib/jobs";
console.log(JSON.stringify(generateVercelCron(tower, "/api/cron"), null, 2));Each job has:
| Field | Type | Required | Description | |---------------|--------------------------------|----------|--------------------------------------| | schedule | string
Loading reviews...