Version 0.14.2
October 15, 2026
Fixed
- Updated library fixes preserve imported run evaluation across transient storage failures and retry failed pg_cron imports within the source process.
Version 0.14.1
October 12, 2026
Fixed
- Updated library fixes prevent duplicate failure counts during recovery, bound oversized output lines, and reject malformed dashboard JSON without changing silence state.
Version 0.14.0
October 11, 2026
Changed
- The API refuses a token shorter than 24 characters (503), and the plugin settings say why.
- The dashboard answers only in the control panel, not through the site's action URLs.
- From the library: see the CronWatch changelog for this release's changes in every language.
Version 0.13.1
October 11, 2026
Changed
- Updated to the library's 0.13.1.
Version 0.13.0
October 10, 2026
Changed
- Secrets and settings from config/cronwatch.php are never shown in the form or copied into project config, and the webhook secret is no longer trimmed.
- From the library: see the CronWatch changelog for this release's changes in every language.
Version 0.12.5
October 10, 2026
Changed
- From the library: alert text, the dashboard, and messages use the serial (Oxford) comma in lists of three or more, and a recovery alert names what closed as a list ("succeeded after: missed, failed, and over budget"). A filter that matches alert text word for word may need updating.
- Settings, help, and permission text use the serial comma too.
Version 0.12.4
October 10, 2026
Changed
- From the library: the source moved to the CronWatch organisation on GitHub, github.com/cronwatchdev/cronwatch, and the links to it, the issue tracker and the changelog point there. The old addresses redirect.
Version 0.12.3
October 7, 2026
Added
- From the library: the dashboard's footer names the CronWatch version serving it, linked to the changelog. Nothing is fetched to check for a newer release.
Version 0.12.2
October 6, 2026
Changed
- From the library: on a job's page in the dashboard, Silence opens the choice of how long, and one click silences it; Forget is now Delete history, at the foot of the page, with a warning that it cannot be undone.
Version 0.12.1
October 3, 2026
Added
- The settings offer every alert channel, not only email, Slack and the webhook: Discord, email through Resend, Postmark, SendGrid, Mailgun or Amazon SES, text messages through Twilio, and Sentry, Honeybadger, Datadog, Rollbar, Bugsnag and New Relic. Each sends once its required fields are set (
discordWebhookUrl,resendApiKeyand the rest, each taking an environment variable), and a channel only partly filled in is refused beside the field it lacks. - "Send a test alert" on the settings page sends one alert to every channel the saved settings name and shows what each answered.
Version 0.12.0
October 1, 2026
Added
- Released with the library 0.12.0, which adds the
under_flooralert: a job that runs cleanly but reports a metric below itsfloor, or at 0 after runs that never were, sends one warning. Jobs take aflooroption besidebudget.
Version 0.11.1
October 1, 2026
Changed
- Released with the library 0.11.1, whose own dashboard gains a light and dark switch (Cmd+Shift+D); the dashboard in the control panel is unchanged and follows the system's setting.
Version 0.11.0
October 1, 2026
Added
- From the library:
GET /cronwatch/apianswers what is serving it: the library, its language and version, and the API's version (api: 1).
Changed
- Runs are recorded with the triggers
craft-queueandcraft-command, the integration's name as every other integration spells it; runs recorded before keepqueueandcommand. - From the library: the JSON API's silence and unsilence answer the job's summary,
{ ok: true, job }, instead of its stored state. - From the library: the webhook's body starts with
"schema": 1, the payload's version; its JSON Schema is at https://cronwatch.dev/schemas/webhook/1.json. - From the library: a blank
CRONWATCH_ENVorAPP_ENVcounts as unset. - From the library: a run id longer than 200 characters is refused, on every path.
Fixed
GET /cronwatch/api, with no path after it, reaches the JSON API instead of the site's 404 page, so the API's own answer at its root (the library and its version, from 1.0) is served.- From the library: a job's stored state keeps the fields a newer release wrote, so sites and apps on different 1.x releases can share one database.
- From the library: one malformed job, run or state row (a hand edit, a damaged database) affects only its own job instead of stopping every check or the whole dashboard, and a state row that is not JSON is replaced by the next write.
- From the library: the JSON API takes only a
BearerAuthorization header as its token, so a proxy's Basic auth in front of the site no longer locks it. - From the library: without ext-curl, an alert channel's request keeps its 10 second deadline and its 1 MiB cap while the server keeps sending.
- The dashboard in the Control Panel ignores an
Authorizationheader, so a user who may only view it can no longer run the check with a GET of/api/checkand any bearer token. Running the check there needs thecronwatch-managepermission, whatever the path. - A watched queue job that another plugin cancels before it runs (marking
EVENT_BEFORE_EXEChandled, after CronWatch's listener) is no run at all. Before, its run was left running, or recorded failed as interrupted when the worker's process for it ended. - A check through
/cronwatch/api/checkby GET with the token orCRON_SECRET(a platform cron), or by the dashboard's/api/checkor/check/in the Control Panel, declares the settings' jobs first, as a POST did. Before, such a check left a command taken out of the settings on its old schedule, and never declared a new one.
Version 0.10.0
September 30, 2026
Added
- Listed in the Craft Plugin Store.
- The plugin has its own icon, in Settings, Plugins and in the Control Panel's navigation.
Changed
- The settings page shows
config/cronwatch.phpandphp craft cronwatch/checkas code. - The plugin's documentation link goes to the Craft CMS page of the docs, not the docs' front page.
Fixed
- From the library: an alert is saved in the same write that records the failure, so a process killed before the alert went out no longer loses it; output is redacted before it is shortened; webhook URLs and keys are kept out of the stack traces of failed alert sends.
- A watched command run by another that catches its exception is recorded as failed, and its caller finishes, instead of both being left running and later reported stuck.
POST /cronwatch/api/checkdeclares the jobs only once the token is checked, so a caller without it gets 401, not the site's error page when the store is down.- An alert sent from a web request no longer takes its link's host from the request's
Hostheader where@webis not configured; it uses the primary site's URL, or goes without a link. - A
descriptiongiven to a command or queue job (inconfig/cronwatch.php, on theWatchCommandbehavior or in#[Cronwatch\Watch]) is now shown, instead of being replaced by the plugin's default.
Version 0.9.0
September 30, 2026
Fixed
- On Postgres, a run whose trigger or metric names hold a NUL character is stored without it, instead of being lost.
Version 0.8.0
September 29, 2026
Changed
- Updated to the library's 0.8.0.
Version 0.7.0
September 29, 2026
Changed
- A grace or other duration longer than 64 characters is refused rather than read.
Version 0.6.1
September 28, 2026
Changed
- On the dashboard, long job names wrap at their separators (such as
:and/) instead of running off the page.
Version 0.6.0
September 28, 2026
Added
- First release. Console commands the crontab runs and queue jobs you list in
config/cronwatch.php(or mark with theWatchCommandbehavior or#[Cronwatch\Watch]) are recorded in the site's own database. - Alerts when a run is missed, fails, gets stuck or runs much slower than usual, and again when it recovers, by email through Craft's mailer, Slack or a webhook, set under Settings, Plugins, CronWatch.
php craft cronwatch/check, the check that finds missed and stuck runs, to run from the crontab.- CronWatch in the Control Panel: the jobs' health, the last day as a timeline, each job's runs and output.
- The JSON API for
@cronwatch/mcp, off until a token is set.