Schedule
TinyAGI/tinyagi
Create, list, and delete scheduled tasks (recurring or one-time) that send messages to agents.
Schedules work in Convex: cron jobs in convex/crons.ts, one off scheduled functions with runAfter and runAt, batching large jobs, and cancelling or inspecting the queue.
$ npx skills add waynesutton/builder-skills --skill convex-cron-jobs -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install waynesutton/builder-skills convex-cron-jobs --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/waynesutton/builder-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/convex-cron-jobs .claude/skills/convex-cron-jobs && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "convex-cron-jobs" agent skill from https://github.com/waynesutton/builder-skills/tree/main/skills/convex-cron-jobs into .claude/skills/convex-cron-jobs/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "convex-cron-jobs", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/waynesutton/builder-skills/tree/main/skills/convex-cron-jobsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add waynesutton/builder-skills --skill convex-cron-jobs -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install waynesutton/builder-skills convex-cron-jobs --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/waynesutton/builder-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/convex-cron-jobs .agents/skills/convex-cron-jobs && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "convex-cron-jobs" agent skill from https://github.com/waynesutton/builder-skills/tree/main/skills/convex-cron-jobs into .agents/skills/convex-cron-jobs/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "convex-cron-jobs", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add waynesutton/builder-skills --skill convex-cron-jobs -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install waynesutton/builder-skills convex-cron-jobs --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/waynesutton/builder-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/convex-cron-jobs .cursor/skills/convex-cron-jobs && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "convex-cron-jobs" agent skill from https://github.com/waynesutton/builder-skills/tree/main/skills/convex-cron-jobs into .cursor/skills/convex-cron-jobs/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "convex-cron-jobs", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/waynesutton/builder-skills.git --path skills/convex-cron-jobs--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add waynesutton/builder-skills --skill convex-cron-jobs -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install waynesutton/builder-skills convex-cron-jobs --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/waynesutton/builder-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/convex-cron-jobs .gemini/skills/convex-cron-jobs && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "convex-cron-jobs" agent skill from https://github.com/waynesutton/builder-skills/tree/main/skills/convex-cron-jobs into .gemini/skills/convex-cron-jobs/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "convex-cron-jobs", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install waynesutton/builder-skills convex-cron-jobsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add waynesutton/builder-skills --skill convex-cron-jobs -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/waynesutton/builder-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/convex-cron-jobs .github/skills/convex-cron-jobs && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "convex-cron-jobs" agent skill from https://github.com/waynesutton/builder-skills/tree/main/skills/convex-cron-jobs into .github/skills/convex-cron-jobs/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "convex-cron-jobs", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add waynesutton/builder-skills --skill convex-cron-jobs -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install waynesutton/builder-skills convex-cron-jobs --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/waynesutton/builder-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/convex-cron-jobs .opencode/skills/convex-cron-jobs && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "convex-cron-jobs" agent skill from https://github.com/waynesutton/builder-skills/tree/main/skills/convex-cron-jobs into .opencode/skills/convex-cron-jobs/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "convex-cron-jobs", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
convex-cron-jobsSchedules work in Convex: cron jobs in convex/crons.ts, one off scheduled functions with runAfter and runAt, batching large jobs, and cancelling or inspecting the queue.
Convex Cron Jobs is an agent skill from waynesutton/builder-skills. Schedules work in Convex: cron jobs in convex/crons.ts, one off scheduled functions with runAfter and runAt, batching large jobs, and cancelling or inspecting the queue. Use when something needs to run on a timer, later, or in the background, or when a cron is not firing.
Its SKILL.md is about 2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including reference files and assets (for example `agents/openai.yaml`, `references/cron-recipes.md` and `references/scheduling-patterns.md`).
It sits in Productivity & Automation, covering Scheduled and recurring tasks. The repository describes itself as: Builder skills for Convex apps. Convex patterns plus a PRD, task.md, changelog, and files.md workflow for Claude Code, Codex, Cursor, and OpenCode. The licence is Apache-2.0.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 82d1ce2. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npxFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
docs.convex.devFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Convex Cron Jobs loads about 2k tokens when it runs, and up to ~6.4k if it reads all its reference files. Until then it costs about 72 tokens; SKILL.md has 821 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from waynesutton/builder-skills at commit 82d1ce2, republished under its Apache-2.0 licence (© waynesutton). 821 words, ~1,959 tokens.
.claude/skills/convex-cron-jobs/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.Recurring work lives in convex/crons.ts. One off work is scheduled from inside a function with ctx.scheduler. Both must target internal.* functions, never api.*.
Deeper material lives in two reference files:
_scheduled_functions, debouncing, or local time zones.One file, one default export. crons.interval for "every N", crons.cron for calendar times. crons.daily, crons.hourly, and crons.weekly are deprecated helpers. Do not use them.
// convex/crons.ts
import { cronJobs } from "convex/server";
import { internal } from "./_generated/api";
const crons = cronJobs();
// Every hour
crons.interval(
"expire sessions",
{ hours: 1 },
internal.sessions.expireBatch,
{},
);
// Every day at 09:00 UTC. Cron expressions are always UTC.
crons.cron("daily digest", "0 9 * * *", internal.digest.send, {});
export default crons;Rules for every entry:
internal from ./_generated/api, even when the target is defined in crons.ts.args validator.{ seconds }, { minutes }, or { hours }.Cron expression quick reference (minute hour day-of-month month day-of-week):
| Expression | Runs |
|---|---|
*/15 * * * * | every 15 minutes |
0 * * * * | every hour at :00 |
0 0 * * * | daily at 00:00 UTC |
0 8 * * 1 | Mondays at 08:00 UTC |
0 0 1 * * | first of each month |
0 9-17 * * 1-5 | hourly, 09:00 to 17:00 UTC, weekdays |
Public functions expect a client, an auth identity, and untrusted input. Cron and scheduler calls have none of that. A public target skips the auth checks you wrote and exposes the job to anyone who can reach the deployment. Register targets with internalMutation, internalAction, or internalQuery.
A mutation is one transaction with read and write limits. Deleting fifty thousand rows in a loop hits them. Take a fixed slice, reschedule yourself with runAfter(0, ...), and let the chain finish on its own.
// convex/sessions.ts
import { internalMutation } from "./_generated/server";
import { internal } from "./_generated/api";
import { v } from "convex/values";
const BATCH = 100;
export const expireBatch = internalMutation({
args: {},
returns: v.null(),
handler: async (ctx) => {
// Date.now() is fine in a mutation. Never call it in a query.
const now = Date.now();
const expired = await ctx.db
.query("sessions")
.withIndex("by_expiresAt", (q) => q.lt("expiresAt", now))
.take(BATCH);
await Promise.all(expired.map((s) => ctx.db.delete(s._id)));
// A full batch means more may remain. Chain the next one.
if (expired.length === BATCH) {
await ctx.scheduler.runAfter(0, internal.sessions.expireBatch, {});
}
return null;
},
});This shape works because each delete removes the row from the index range. If the job updates rows without moving them out of the range, use a pagination cursor instead. See the reference file.
// Relative: 5 minutes from now
const jobId = await ctx.scheduler.runAfter(
5 * 60 * 1000,
internal.reminders.send,
{ taskId: args.taskId },
);
// Absolute: a timestamp you already store (ms since epoch or a Date)
await ctx.scheduler.runAt(trial.endsAt, internal.billing.endTrial, {
userId: trial.userId,
});| Method | Use for |
|---|---|
runAfter(delayMs, fn, args) | retries, follow ups, "in ten minutes" |
runAt(timestamp, fn, args) | trial ends, send dates, anything with a stored time |
Both return an Id<"_scheduled_functions">. Store it on a document if you may need to cancel.
Two behaviors to remember:
crons.ts, with last run and next run.runAfter and runAt jobs.npx convex logs streams the same log lines.ctx.db.system.get(jobId) returns the job document with state.kind set to pending, inProgress, success, failed, or canceled.convex/crons.ts and ends with export default crons.npx convex dev is running and the last push succeeded. Cron changes only apply on push.internal.* and the args match its validator. A mismatch fails at push time.| Mistake | Why it breaks | Do instead |
|---|---|---|
crons.daily(...) | deprecated helper | crons.cron("...", "0 0 * * *", ...) |
Target is api.tasks.cleanup | skips auth, publicly callable | register as internalMutation, use internal.tasks.cleanup |
.collect() then loop over thousands | hits transaction limits | take(BATCH) and reschedule |
.withIndex("by_x").filter(...) | filter scans the whole index | put the range in withIndex |
Date.now() in an internalQuery | breaks caching and reactivity | pass now as an arg from the caller |
Cron at "0 9 * * *" for 9am Pacific | runs at 9am UTC | use UTC, or run hourly and check local hour |
Missing await on runAfter | job may not be scheduled | always await ctx.scheduler.* |
| Two crons with the same name | push fails | unique names per file |
convex/crons.ts uses only crons.interval and crons.cron, ends with export default cronsinternal.*args and returns validatorsrunAfter(0, ...)withIndex, not .filterDate.now() inside queriesctx.scheduler.* call is awaitednpx convex dev and saw the job listed under Schedules© waynesutton, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (references, assets) in skills/convex-cron-jobs of waynesutton/builder-skills.
Open the folder on GitHubat commit 82d1ce2
Convex Cron Jobs next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Convex Cron Jobs this skillwaynesutton/builder-skills | 406 | — | ~2k | Automated safety check: Pass | Apache-2.0 | |
| ScheduleTinyAGI/tinyagi | 3.6k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Send User MessageTinyAGI/tinyagi | 3.6k | — | ~829 | Automated safety check: Pass | MIT | |
| Cron Opsczl9707/build-your-own-openclaw | 1.9k | — | ~593 | Automated safety check: Pass | MIT | |
| X Bookmarkssharbelxyz/x-bookmarks | 289 | — | ~2k | Automated safety check: Notes | None | |
| Wp Wpcli And OpsAutomattic/agent-skills | 211 | 2 repos | ~988 | Automated safety check: Pass | None |
TinyAGI/tinyagi
Create, list, and delete scheduled tasks (recurring or one-time) that send messages to agents.
TinyAGI/tinyagi
Send a proactive message to a paired user via their channel (Discord, Telegram, or WhatsApp).
czl9707/build-your-own-openclaw
Create, list, and delete scheduled cron jobs. An agent skill from czl9707/build-your-own-openclaw.
sharbelxyz/x-bookmarks
Fetch, summarize, and manage X/Twitter bookmarks via bird CLI or X API v2.
Automattic/agent-skills
A skill your agent uses when working with WP-CLI (wp) for WordPress operations: safe search-replace, db export/import, plugin/theme/user/content management, cron, cache flushing, multisite, and…
ohdearapp/ohdear-cli
Manage Oh Dear website monitoring using the ohdear CLI. An agent skill from ohdearapp/ohdear-cli.
waynesutton/builder-skills
Builds AI agents on the Convex agent component: threads, messages, tools that call queries and mutations, streaming, RAG with vector search, and workflows for multi step jobs.
waynesutton/builder-skills
Production patterns for Convex apps and the rules the @convex-dev/eslint-plugin enforces: validators, indexes, idempotent mutations, avoiding OCC conflicts, thin function wrappers, error handling.
waynesutton/builder-skills
Creates reusable Convex components with defineComponent, a clean client wrapper, their own schema, and an npm publish setup.
waynesutton/builder-skills
Adds HTTP endpoints in convex/http.ts: webhook receivers with signature checks, REST style routes, CORS, auth headers, streaming responses, and file uploads over HTTP.
waynesutton/builder-skills
Changes a live Convex schema without downtime: make a field optional, backfill in batches, flip the validator, then clean up.
waynesutton/builder-skills
Deep security review of a Convex app: authorization model, data access paths per table, HTTP action exposure, rate limiting, file storage access, scheduled function trust, and a written findings…
Categories
Schedules work in Convex: cron jobs in convex/crons.ts, one off scheduled functions with runAfter and runAt, batching large jobs, and cancelling or inspecting the queue. Convex Cron Jobs is an agent skill from waynesutton/builder-skills.ts, one off scheduled functions with runAfter and runAt, batching large jobs, and cancelling or inspecting the queue.
Convex Cron Jobs fits situations like: something needs to run on a timer; in the background; A cron is not firing.
Run `npx skills add waynesutton/builder-skills --skill convex-cron-jobs -a claude-code`. Or copy the skill folder (skills/convex-cron-jobs in waynesutton/builder-skills) into .claude/skills/convex-cron-jobs in your project. Claude Code loads it when a task matches its description.
Run `npx skills add waynesutton/builder-skills --skill convex-cron-jobs -a codex`. Or copy the skill folder (skills/convex-cron-jobs in waynesutton/builder-skills) into .agents/skills/convex-cron-jobs in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add waynesutton/builder-skills --skill convex-cron-jobs -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/convex-cron-jobs, .gemini/skills/convex-cron-jobs, .github/skills/convex-cron-jobs and .opencode/skills/convex-cron-jobs in your project.
Going by SKILL.md and its folder, Convex Cron Jobs needs the command-line tools its instructions call (npx). Our summary lists: Node.js.
SKILL.md names 1 domain. As links in the text: docs.convex.dev. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Convex Cron Jobs is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2k tokens (SKILL.md is roughly 7.8k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 4.5k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Convex Cron Jobs: Schedule (TinyAGI/tinyagi, 3.6k stars), Send User Message (TinyAGI/tinyagi, 3.6k stars), Cron Ops (czl9707/build-your-own-openclaw, 1.9k stars) and X Bookmarks (sharbelxyz/x-bookmarks, 289 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
waynesutton (a GitHub user) maintains it in waynesutton/builder-skills, which has 406 GitHub stars. The repository holds 17 skills in this directory. The repository was last updated on September 28, 2026.
Source: waynesutton/builder-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.