Guides
Jobs
defineJob files under jobs/ run on a durable queue — hosted metadata Postgres, or reserved robodev_jobs tables in robodev dev.
Default-export defineJob from robodev/jobs/<name>.ts. The job name is the path after jobs/ without .ts. API, job, and Auth hook handlers enqueue with ctx.jobs.enqueue({ name, payload?, runAt?, delayMs? }). Optional cron is a 5-field UTC expression (minimum interval one minute), validated at deploy and at robodev dev activate. On each matching tick the runtime enqueues the job with payload null. Overlap piles up; missed ticks are not backfilled. Remove cron and save (or redeploy) to stop future ticks. The worker retries 5 times with backoff, then marks the run dead. Retry dead jobs from /projects/:id/jobs — that dashboard retry is hosted-only. Offline robodev dev uses reserved robodev_jobs tables on the local Postgres (not database.ts); a dead row stays dead until you enqueue again. Job context has db, email, llm, env, push, jobs, sockets, pdf, storage, and payload — no HTTP. See Storage (/docs/storage). llm, agent, and push throw offline (llm_not_configured / push_not_configured); sockets run locally; pdf hops to Starbase — see PDF (/docs/pdf); email prints to the terminal.