Scheduler
The Scheduler runs a command on a recurring schedule - a Django management command, a cleanup, a nightly report - with no queue or worker involved. Find it under an app's Processes → Scheduler.
Each job becomes a cron entry on your server, run in the app's environment (its virtualenv, project directory and environment variables), exactly like a background process or a deploy command. Every run's output is captured to the system journal so you can read it back per job.
Adding a scheduled job
- Processes → Scheduler → Add scheduled job.
- Give it a name and the command. Bare tool names resolve in the app's virtualenv and the working directory is your project folder, so it reads the same as it would over SSH:
python manage.py clearsessions
- Set the schedule, two ways:
- Wizard - pick a frequency (every minute, hourly, daily, weekly, monthly) and a time. Weekly adds a day-of-week, monthly a day-of-month.
- Cron - write a raw 5-field cron expression, e.g.
0 3 * * *.
Either way a plain-English preview ("Every day at 03:00") confirms what you set before you save.
Watching it run
Each job row shows its last run - "ran 3 minutes ago", or "failed (exit 1)" when the command exits non-zero. Alongside each job:
- Run now fires the command immediately, off-schedule, so you can test it without waiting for the next tick.
- View output shows recent runs' output, read straight from the server's journal.
- The refresh button in the header re-checks status.
Scheduler or a background process?
- Scheduler - a command that runs, does its work and exits, on a schedule. Session cleanup, a nightly email, pruning old rows. Nothing to keep alive.
- Background processes - a command that stays running (a queue worker, a bot). If you run Celery with a
beatschedule declared in your code, that beat daemon is a background process, not a scheduled job.
Rule of thumb: if the command finishes on its own, schedule it here; if it's meant to stay up, it's a background process.
Managing jobs from your repo
Jobs can also live in your repo's pyvolt.toml under a
[schedule] section, versioned and deployed with your code:
[schedule]
cleanup = { command = "python manage.py clearsessions", cron = "0 3 * * *" }
When the section is present the file defines the complete set of jobs: this tab goes read-only (Run now and View output keep working), and the next deploy reconciles the server's cron entries to match the file exactly.
Any command works
There's no tool lock-in. A scheduled job is just a command run on a schedule - a management command, a shell one-liner, a script in your repo. What it does lives in the command, not a setting.
View this page as markdown - handy as context for your AI tools. Full index at /llms.txt.