cron-job.org chronos daemon (self-hosted)
- Free allowance
- Open-source scheduler software published on GitHub under the GNU General Public License version 2: chronos, cron-job.org's cron job execution daemon, with the repository's MySQL schema, PHP API and web frontend, which the Docker Compose example starts together on a machine the user runs
- Verdict
- self-hosted, last resortverdict qualifies-with-caveat: usable, with a named limit or an unprobed read path. Self-hosted options are listed last, because this site is for users who have no hardware.
- Cost
- not stated
- Identity
- anonymousno card, no phone
- Binding limit
- request-ratechronos checks the MySQL database every minute to collect the jobs to execute; 2 threads per scheduling unit and 2048 parallel requests per thread by default (num_threads, parallel_requests)
- Evidence
- documented34 sources; a first-party page was read and the sentence quoted
- Freshness
- stale on 2026-12-02checked 2026-11-01 (live); stale on 2026-12-02
| Free tier | Open-source scheduler software published on GitHub under the GNU General Public License version 2: chronos, cron-job.org's cron job execution daemon, with the repository's MySQL schema, PHP API and web frontend, which the Docker Compose example starts together on a machine the user runs unit none; metered on none; The hosted cron-job.org service (dev-services/cron-job-org) runs this daemon and comes first, with the other hosted HTTP cron scheduler dev-services/easycron. |
|---|---|
| Price | none stated |
| Limits |
A request times out after 30 seconds (request_timeout), and a job is disabled automatically after 15 subsequent failures by default (max_failures); the daemon needs a raised open-file limit (ulimit -n 65536 or similar). |
| Binding | request-rate The daemon collects jobs from the database once a minute, which sets the schedule step; the machine and the 2048 parallel requests per thread bound how many run at once. |
| Identity | anonymous No account with cron-job.org is needed: the example environment is set up with the user's own secrets in .env and runs its own MySQL databases, and it needs an SMTP server that relays for the machine's address to send its outgoing emails. |
| Egress | not set by the software: chronos fetches the jobs' URLs from the machine the user runs it on, so the network terms of that host apply; the sample configuration blocks 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16, 100.64.0.0/10 and 127.0.0.0/8 as job and webhook targets |
| Per-object cap | a job's request body is at most 8192 bytes by default (request_max_size in the sample chronos.cfg) |
| Retention | job results are stored in per-user, per-day SQLite databases (joblog-%m-%d.db), and old entries are removed by deleting the corresponding day's databases, so retention is whatever the user keeps |
| Interface | rest the PHP API in the repository registers REST routes (GET and PUT /jobs, PATCH and DELETE /jobs/{jobId}) that take an API key as a bearer token; it also serves the web console and the status page UI, and needs a web server (cron-job.org uses nginx with php-fpm) |
| Tooling | the user installs and runs the chronos daemon on a rented or free machine: build chronos from source (a C++14 compiler, cmake and the development files that the README lists), import the MySQL schema from the database folder, edit chronos.cfg and run ./chronos; or start the repository's Docker Compose example, which runs chronos with MySQL, Redis, the PHP API and the web frontend; the web console and the PHP REST API. |
| Composes with | Last resort after the hosted HTTP cron schedulers (the hosted cron-job.org service in dev-services/cron-job-org, which runs this daemon, and dev-services/easycron): chronos calls an HTTP endpoint every minute from a machine that the user installs and keeps running. |
| Reliability | The Docker environment in the repository is an example and development environment that is not tailored for production usage, especially with regard to security; chronos is optimized for performance rather than data integrity, so the job history is most likely lost when the server crashes or loses power. |
| Notes | Self-hosted software and the last resort: the hosted offers come first (the hosted service dev-services/cron-job-org, which runs this daemon, and dev-services/easycron). This record is no duplicate of dev-services/cron-job-org: it is the open-source chronos daemon and its console stack that the user installs and runs. |
| Evidence note | documented Structure, build and run steps, sample defaults and the REST routes are read in the repository's README, sample configuration and PHP API source; the daemon and the stack were not built or run. |
Evidence 34
| date | source | what it proved |
|---|---|---|
| 2026-11-01 | github.com/pschlan/cron-job.org | chronos is cron-job.org's execution daemon, which fetches the jobs |
| 2026-11-01 | github.com/pschlan/cron-job.org | the text of Limits, above |
| 2026-11-01 | github.com/pschlan/cron-job.org | the repository holds the MySQL database structure |
| 2026-11-01 | github.com/pschlan/cron-job.org | the repository holds the web interface |
| 2026-11-01 | github.com/pschlan/cron-job.org | building chronos needs development files of several libraries, which the README lists |
| 2026-11-01 | github.com/pschlan/cron-job.org | running chronos needs the MySQL schema imported from the database folder |
| 2026-11-01 | github.com/pschlan/cron-job.org | chronos is started as ./chronos with a configuration file |
| 2026-11-01 | github.com/pschlan/cron-job.org | building chronos needs a C++14 compiler and cmake |
| 2026-11-01 | github.com/pschlan/cron-job.org | a Docker Compose example starts most of the cron-job.org system |
| 2026-11-01 | github.com/pschlan/cron-job.org | the Docker environment is an example and development environment, not tailored for production |
| 2026-11-01 | github.com/pschlan/cron-job.org | the example runs a master MySQL database |
| 2026-11-01 | github.com/pschlan/cron-job.org | the example runs Redis as a cache for rate limiting |
| 2026-11-01 | github.com/pschlan/cron-job.org | the example runs the PHP API backend with php-fpm |
| 2026-11-01 | github.com/pschlan/cron-job.org | the example runs chronos in a combined master and node service mode |
| 2026-11-01 | github.com/pschlan/cron-job.org | the example needs secrets in .env and an SMTP server |
| 2026-11-01 | github.com/pschlan/cron-job.org | the SMTP session is unauthenticated, so the server must relay for the machine's address |
| 2026-11-01 | github.com/pschlan/cron-job.org | the API is PHP behind a web server and serves the console and the status page UI |
| 2026-11-01 | github.com/pschlan/cron-job.org | job results are kept in per-user per-day SQLite databases that are cleaned up by deleting a day's databases |
| 2026-11-01 | github.com/pschlan/cron-job.org | the software favours performance over data integrity, so job history is most likely lost on a crash or power outage |
| 2026-11-01 | github.com/pschlan/cron-job.org | the open-file limit must be raised before chronos runs |
| 2026-11-01 | raw.githubusercontent.com/pschlan/cron-job.org/master/chrono | the sample configuration sets 2 threads per scheduling unit |
| 2026-11-01 | raw.githubusercontent.com/pschlan/cron-job.org/master/chrono | the sample configuration sets 2048 parallel requests per thread |
| 2026-11-01 | raw.githubusercontent.com/pschlan/cron-job.org/master/chrono | the sample configuration times a request out after 30 seconds |
| 2026-11-01 | raw.githubusercontent.com/pschlan/cron-job.org/master/chrono | the sample configuration caps the request body at 8192 bytes |
| 2026-11-01 | raw.githubusercontent.com/pschlan/cron-job.org/master/chrono | the sample configuration disables a job after 15 subsequent failures |
| 2026-11-01 | raw.githubusercontent.com/pschlan/cron-job.org/master/chrono | the sample configuration blocks private, loopback and link-local ranges as job and webhook targets |
| 2026-11-01 | raw.githubusercontent.com/pschlan/cron-job.org/master/chrono | job logs are written to per-day SQLite files named joblog-%m-%d.db |
| 2026-11-01 | raw.githubusercontent.com/pschlan/cron-job.org/master/.env.e | the SMTP server of the example environment sends the stack's outgoing emails |
| 2026-11-01 | raw.githubusercontent.com/pschlan/cron-job.org/master/LICENS | the repository is licensed under the GNU General Public License version 2 |
| 2026-11-01 | raw.githubusercontent.com/pschlan/cron-job.org/master/api/in | the PHP API registers GET /jobs |
| 2026-11-01 | raw.githubusercontent.com/pschlan/cron-job.org/master/api/in | the PHP API registers PUT /jobs to create a job |
| 2026-11-01 | raw.githubusercontent.com/pschlan/cron-job.org/master/api/in | the PHP API registers PATCH /jobs/{jobId} to update a job |
| 2026-11-01 | raw.githubusercontent.com/pschlan/cron-job.org/master/api/in | the PHP API registers DELETE /jobs/{jobId} to delete a job |
| 2026-11-01 | raw.githubusercontent.com/pschlan/cron-job.org/master/api/li | the REST dispatcher takes the API key from a bearer Authorization header |