fshy

Home / Developer services

cron-job.org chronos daemon (self-hosted)

github.com/pschlan/cron-job.orgSelf hosted HTTP cron scheduler (open source chronos daemon and its console stack)dev-services/cron-job-org-chronosJSONcomparereport an errorprovider JSON

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 tierOpen-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.
Pricenone stated
Limits
  • request-rate (binding) chronos checks the MySQL database every minute to collect the jobs to execute source
  • request-rate (binding) 2 threads per scheduling unit and 2048 parallel requests per thread by default (num_threads, parallel_requests) source
  • per-object-cap 8192 bytes of request body by default (request_max_size) source
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).
Bindingrequest-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.
Identityanonymous 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.
Egressnot 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 capa job's request body is at most 8192 bytes by default (request_max_size in the sample chronos.cfg)
Retentionjob 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
Interfacerest 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)
Toolingthe 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 withLast 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.
ReliabilityThe 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.
NotesSelf-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 notedocumented 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
datesourcewhat it proved
2026-11-01github.com/pschlan/cron-job.orgchronos is cron-job.org's execution daemon, which fetches the jobs
2026-11-01github.com/pschlan/cron-job.orgthe text of Limits, above
2026-11-01github.com/pschlan/cron-job.orgthe repository holds the MySQL database structure
2026-11-01github.com/pschlan/cron-job.orgthe repository holds the web interface
2026-11-01github.com/pschlan/cron-job.orgbuilding chronos needs development files of several libraries, which the README lists
2026-11-01github.com/pschlan/cron-job.orgrunning chronos needs the MySQL schema imported from the database folder
2026-11-01github.com/pschlan/cron-job.orgchronos is started as ./chronos with a configuration file
2026-11-01github.com/pschlan/cron-job.orgbuilding chronos needs a C++14 compiler and cmake
2026-11-01github.com/pschlan/cron-job.orga Docker Compose example starts most of the cron-job.org system
2026-11-01github.com/pschlan/cron-job.orgthe Docker environment is an example and development environment, not tailored for production
2026-11-01github.com/pschlan/cron-job.orgthe example runs a master MySQL database
2026-11-01github.com/pschlan/cron-job.orgthe example runs Redis as a cache for rate limiting
2026-11-01github.com/pschlan/cron-job.orgthe example runs the PHP API backend with php-fpm
2026-11-01github.com/pschlan/cron-job.orgthe example runs chronos in a combined master and node service mode
2026-11-01github.com/pschlan/cron-job.orgthe example needs secrets in .env and an SMTP server
2026-11-01github.com/pschlan/cron-job.orgthe SMTP session is unauthenticated, so the server must relay for the machine's address
2026-11-01github.com/pschlan/cron-job.orgthe API is PHP behind a web server and serves the console and the status page UI
2026-11-01github.com/pschlan/cron-job.orgjob results are kept in per-user per-day SQLite databases that are cleaned up by deleting a day's databases
2026-11-01github.com/pschlan/cron-job.orgthe software favours performance over data integrity, so job history is most likely lost on a crash or power outage
2026-11-01github.com/pschlan/cron-job.orgthe open-file limit must be raised before chronos runs
2026-11-01raw.githubusercontent.com/pschlan/cron-job.org/master/chronothe sample configuration sets 2 threads per scheduling unit
2026-11-01raw.githubusercontent.com/pschlan/cron-job.org/master/chronothe sample configuration sets 2048 parallel requests per thread
2026-11-01raw.githubusercontent.com/pschlan/cron-job.org/master/chronothe sample configuration times a request out after 30 seconds
2026-11-01raw.githubusercontent.com/pschlan/cron-job.org/master/chronothe sample configuration caps the request body at 8192 bytes
2026-11-01raw.githubusercontent.com/pschlan/cron-job.org/master/chronothe sample configuration disables a job after 15 subsequent failures
2026-11-01raw.githubusercontent.com/pschlan/cron-job.org/master/chronothe sample configuration blocks private, loopback and link-local ranges as job and webhook targets
2026-11-01raw.githubusercontent.com/pschlan/cron-job.org/master/chronojob logs are written to per-day SQLite files named joblog-%m-%d.db
2026-11-01raw.githubusercontent.com/pschlan/cron-job.org/master/.env.ethe SMTP server of the example environment sends the stack's outgoing emails
2026-11-01raw.githubusercontent.com/pschlan/cron-job.org/master/LICENSthe repository is licensed under the GNU General Public License version 2
2026-11-01raw.githubusercontent.com/pschlan/cron-job.org/master/api/inthe PHP API registers GET /jobs
2026-11-01raw.githubusercontent.com/pschlan/cron-job.org/master/api/inthe PHP API registers PUT /jobs to create a job
2026-11-01raw.githubusercontent.com/pschlan/cron-job.org/master/api/inthe PHP API registers PATCH /jobs/{jobId} to update a job
2026-11-01raw.githubusercontent.com/pschlan/cron-job.org/master/api/inthe PHP API registers DELETE /jobs/{jobId} to delete a job
2026-11-01raw.githubusercontent.com/pschlan/cron-job.org/master/api/lithe REST dispatcher takes the API key from a bearer Authorization header