DEV Community

Clusto
Clusto

Posted on Fully Autonomous

Zero-token cron jobs for the chores around your AI coding agents

Not every job you hand an AI coding agent needs the model. A lot of the daily chores around a project are plain scripts: pull some numbers, check that a site answers, run the test suite, write a summary. If you run those through an agent, you pay tokens for work a shell can do for free. If you run them through system cron, the output disappears into a mail spool nobody reads.

Disclosure: I am on the Clusto team, and this post shows how we run our own chores with Clusto's scheduled tasks. The general idea (script the boring part, save the model for judgment, put every result somewhere you will actually see it) works with any setup.

The pattern

  1. Write the chore as a script that exits 0 on success and non-zero on failure.
  2. Run it on a schedule on a machine that stays on.
  3. Have it post a short result to one feed you check from your phone.
  4. Call a model only for the steps that need judgment, such as "which topic should we write about next", and keep that call in the same schedule.

A real example: our daily marketing stats

Every morning at 08:30 Prague time, a task on one of our servers runs a Node script. It snapshots the reactions and comments on our posts through public APIs, checks follower counts, checks that the website and release manifests respond, and writes a markdown summary. Then the shell posts that summary to the Clusto Reports feed. No LLM is involved, so the run costs zero tokens.

The whole setup is one command:

clusto task new \
  --name marketing-daily-stats \
  --schedule "cron:0_30_6_*_*_*" \
  --dir /srv/project \
  --cmd 'node daily-stats.mjs --out /tmp/daily && clusto report post --title "Marketing stats $(date +%F)" --body-file /tmp/daily/body.md --level "$(cat /tmp/daily/level.txt)"'
Enter fullscreen mode Exit fullscreen mode

A few details that matter:

  • Cron expressions have six fields, seconds first, and are evaluated in UTC. 0 30 6 * * * is 06:30 UTC. On the command line, underscores stand in for spaces.
  • The command runs through sh -c on Linux and cmd /C on Windows, so pipes, && and $(...) work.
  • Inside a run, clusto report post links the report to the task and the run on its own. No IDs to pass around.

Where the results go

The Reports feed collects what scripts and agents post: a title, a level (Info, Success, Warning, Error), a markdown body, and optional attachments such as a chart or a CSV. It has an unread badge, search, filters, and grouping by project, task or day. In a cluster, the feed merges reports from every node, so you read one list instead of logging into each machine.

The part I like most: when a scheduled run fails or times out and no retry is left, the daemon posts an Error report by itself, with the exit code and the tail of the output. A broken automation shows up as a red card the next time you open the app on your phone, instead of a silent exit code in a log.

When you do want the model

A task is just a command line, so a headless agent run is a task too:

claude -p "Read today's report and suggest one topic we have not covered yet"
Enter fullscreen mode Exit fullscreen mode

Clusto does not treat that differently from ./backup.sh. You get the same schedule, history and reports. Split the work so the expensive call only does the thinking: the script gathers data for free, the model reads a short summary.

Other things the scheduler handles

  • History: each task keeps its last 50 runs with status, duration, exit code and a cleaned text snapshot of the output (last 64 KB).
  • Timeout, retries with a delay between attempts, and extra environment variables per task, set in the app's task dialog.
  • Optional notifications on success or failure.
  • In a cluster, you pick which node runs a task, and you can move a task with its history to another node later.

Limits to know

  • Scheduling lives inside the Clusto daemon, not system cron. The daemon must be running, and a missed slot runs once when it comes back, not once per missed slot.
  • The scheduler checks every 100 seconds, so a cron task can start up to about 100 seconds late. Use Run now when timing matters.
  • Tasks belong to one node and are not replicated across the cluster.
  • The command line is run as-is. Do not paste untrusted input into it.
  • Clusto needs a license. The Personal plan is free for one user on up to 3 devices.

Full reference: scheduled tasks and reports. Apps for Windows, Linux, Android and the web are on the download page.

Top comments (0)