Skip to main content
Cron jobs run shell commands on a schedule inside your service’s container image. Declare them in floo.app.toml and they are synced on every deploy.

Declare in config

Add [cron.<name>] sections to floo.app.toml:

Fields

Deploy and verify

Push to GitHub or run floo redeploy. Cron jobs are synced on every deploy — new jobs are created, changed jobs are updated, removed jobs are deleted.
After deploy, verify your jobs:

Manually trigger a job

Test a job without waiting for its schedule:

Common schedule expressions

How it works

  1. You declare [cron.<name>] in floo.app.toml
  2. The CLI sends cron definitions to the API during deploy
  3. The API’s _sync_cron_jobs() creates, updates, or deletes CronJob records
  4. Jobs run inside the specified service’s container image with the same environment variables
Cron jobs have access to the same DATABASE_URL, REDIS_URL, and other env vars as the service they run in.

Failure handling

Cron jobs do not retry. Each scheduled run executes once; if the command exits non-zero or exceeds its timeout, that run is marked failed and the next recovery is simply the next scheduled run — there is no automatic retry or backoff. For runs where a miss matters, make the command idempotent and handle retries inside it, and alert on failure: floo logs --app my-app --cron <job> shows the cron output with [cron:<job>] attribution, and agent webhooks can route repeated failures to your agent or on-call.

Agent workflow

CLI Reference

See the exact floo cron list and floo cron run flags, JSON shape, and --dry-run behavior.