Repository navigation
10.0.0-rc.1
Pre-releaseThis is the first release candidate for Checkly CLI 10. It is published on the next dist-tag, so checkly@latest stays on 9.x. To try it:
npm install --save-dev checkly@nextVersion 10 makes deploys safer. checkly deploy now shows you a plan of what will change before it writes anything, and it no longer runs your checks after every deploy. This release also removes APIs that were deprecated during 9.x. Read Breaking changes before you upgrade a project or a CI pipeline.
Breaking changes
checkly deploy plans every deploy
Before it writes anything, a deploy now asks Checkly what would change, and then applies exactly that plan. Resources that did not change are no longer written. If someone changes your Checkly account between the plan and the deploy, the deploy is refused. A forced run makes a new plan; a run pinned with --plan-token stops. See Deploy plans below for what the plan shows.
- Use
--no-planto deploy without a plan, as 9.x did: every resource is written. - The first planned deploy of a project has nothing earlier to compare against, so every existing resource is listed as an update and written once to set a baseline. The same happens on the first planned deploy after a
--no-plandeploy. Later deploys show only what changed. - A deploy with nothing to change no longer asks for confirmation, even in CI or agent mode without
--force. It printsNo changes., ends withProject "<name>" is up to date.and exits with code 0.
Checks are no longer scheduled after a deploy unless you ask
In 9.x, every deploy ran all checks right away. In 10.0 a deploy schedules no checks unless you pass --schedule-on-deploy. Even then it schedules only the checks the deploy created or updated.
| Flag | What it does |
|---|---|
--schedule-on-deploy |
Turns post-deploy scheduling on. It is off by default. |
--schedule-on-deploy-scope=changed|all |
changed (the default) schedules only the checks the deploy created or updated. all also schedules the unchanged ones, as 9.x did. |
--schedule-on-deploy-threshold=<n|auto> |
Schedules nothing if the deploy would schedule more than n checks. Heartbeat monitors don't count. auto lets Checkly choose (currently 500, and at most 2000). |
--schedule-on-deploy-min-frequency=<n|auto> |
Skips checks that run more often than every n minutes, because they will run again soon. 0 schedules every check. auto lets Checkly choose (currently 10). |
To get the closest match to the 9.x behaviour:
npx checkly deploy --schedule-on-deploy --schedule-on-deploy-scope=all --schedule-on-deploy-min-frequency=0Checkly applies the threshold to every CLI version, so a deploy of more than 500 checks also needs --schedule-on-deploy-threshold.
If you pass a --schedule-on-deploy-* option without --schedule-on-deploy, the deploy fails with an error. This makes scripts that tuned scheduling fail visibly instead of quietly scheduling nothing. After the deploy, the CLI tells you how many checks it did not schedule and why.
AgenticCheck is removed
Agentic Checks are being retired and stop running on December 1, 2026. CLI 10 no longer includes AgenticCheck, so a project that still defines one fails to load. Use a BrowserCheck or MultiStepCheck with aiAutoRepairEnabled: true instead. Removing an AgenticCheck from your code deletes that check on your next deploy. To keep managing Agentic Checks as code until they stop running, stay on 9.x.
doubleCheck is removed
doubleCheck is no longer accepted on checks, check groups or the checks defaults in checkly.config.ts. Use retryStrategy:
- Replace
doubleCheck: truewithRetryStrategyBuilder.singleRetry({ baseBackoffSeconds: 0, sameRegion: false }). This is one immediate retry from a different region. A baresingleRetry()is not the same: it waits 60 seconds and retries in the same region. - Replace
doubleCheck: falsewithRetryStrategyBuilder.noRetries().
groupId and groupName are removed
Use group instead:
// Before
new ApiCheck('api', { name: 'API', request, groupId: myGroup.ref() })
new PlaywrightCheck('e2e', { name: 'E2E', playwrightConfigPath, groupName: 'My Group' })
// After
new ApiCheck('api', { name: 'API', request, group: myGroup })
new PlaywrightCheck('e2e', { name: 'E2E', playwrightConfigPath, group: myGroup })groupName is also removed from playwrightChecks entries in checkly.config.ts. Pass group there as well, with a group declared in the config or CheckGroupV2.fromId().
shouldFail works only on ApiCheck, UrlMonitor and TcpMonitor
These are the types the Checkly web app supports it for. On any other type, shouldFail is now an error, even shouldFail: false, and so are checks.browserChecks.shouldFail and checks.multiStepChecks.shouldFail in checkly.config.ts. A project-wide checks.shouldFail default now applies only to these three types.
Note
Every other check that inherited shouldFail: true from checks.shouldFail is deployed with false after you upgrade, so its pass/fail result flips. This includes Browser, Multistep and Playwright checks, and all other monitor types. The deploy plan shows this change.
Other removals
These APIs were deprecated in 9.x and are now removed. A removed property that is still passed (from plain JavaScript or through a type cast) is reported as an error with a hint that names the replacement, so it is never dropped silently. A removed method, export or command fails as soon as it is used.
| Removed | Use instead |
|---|---|
ApiCheck localSetupScript / localTearDownScript |
setupScript: { content: '…' } / tearDownScript: { content: '…' }. Check groups keep these properties for now. |
caching in checkly.config.ts |
runner: { cache: { install: { version: '…' } } } in place of caching.dependencyCache.version. CLI versions before 9.1.0 ignore the new setting, so upgrade every environment that runs the CLI first. |
AssertionBuilder.responseTme() |
AssertionBuilder.responseTime() |
checkly rules command |
checkly skills. checkly rules now exits with code 127. |
HeartbeatCheck, TcpCheck (and their …Props types) |
HeartbeatMonitor, TcpMonitor |
Warning
HeartbeatCheck and TcpCheck were never marked as deprecated, so 9.x gave no warning about them. A check file that imports them fails to load.
Upgrade notes
- Maintenance window time zones: a maintenance window that has no
timezonein code is now deployed with UTC. The first deploy after upgrading resets any time zone that was set in the web app for a CLI-managed window. To keep it, declaretimezonein code. If the maintenance is active at that moment, the deploy fails until the maintenance ends. - Warning for checks without a location:
deployandvalidatenow warn about a check that has nolocationsand noprivateLocations, because Checkly would pick a location for it. Set them on the check or its group, or set a default withchecks.locationsorchecks.privateLocationsincheckly.config.ts. This is only a warning: the deploy still goes ahead. --timeoutmeasures run time: incheckly test,triggerandpw-test,--timeoutnow counts from when a check starts running. On large sessions, Checkly can delay the start of a check, and that wait no longer counts. A check that never starts is reported after--timeoutplus 900 seconds.
New features
Deploy plans
- See what changes, property by property. The plan starts with an overview row per changed resource:
+create,~update,-delete. Under it, each updated resource gets a coloured diff of its construct, in the same formcheckly importwrites. Changes to scripts and request bodies appear as text diffs. Secrets are named but never shown. - Review before you apply. An interactive deploy shows the plan and asks
Apply these changes?.--previewprints the plan without deploying and ends with acheckly deploy --plan-token …command that deploys exactly that plan later. The new--dry-runflag prints the plan as JSON for scripts and agents. - Write changes made in Checkly back into your code. If someone edited a resource in the web app, the prompt offers Update my code with the changes made in Checkly. This edits your construct files in place, keeping your file's style. It covers every resource type and writes helpers like
Frequency.EVERY_5M,RetryStrategyBuilderandAssertionBuilder. Then it stops without deploying, so you can review the changes withgit diff. Anything it cannot write safely, such as references, secrets and values built from variables, is listed for you to change by hand. --prune-relationsdeletes alert channel subscriptions and private location assignments that were added to your checks and groups outside the project. Without it they are kept and listed in the plan.- Code bundles and Playwright snapshots are uploaded only after you confirm the deploy. A preview, a dry run or a cancelled deploy uploads nothing.
Login that works anywhere, including for AI agents
checkly login now uses a device code. The CLI shows a URL and a short code, and you approve the login in any browser on any device. Login now works over SSH, in dev containers, in cloud coding sessions and in agent sandboxes. New users can sign up on the same page.
- AI agents get one JSON line with the URL and code to pass on to you. After you approve, the agent runs the command again to finish. If you have several accounts, the agent is asked to pick one with
--account-id. - Logging in from any command: at a terminal, a command that needs a login now logs you in first instead of failing. CI and other runs without a terminal still fail with an error that points to
CHECKLY_API_KEYandCHECKLY_ACCOUNT_ID. - Without a browser: pass
--no-browseror setCHECKLY_NO_BROWSER=1to print the login URL instead of opening a browser. checkly logoutno longer asks for a confirmation that nobody can give (AI agents, CI, scripts). Before, it exited without logging out.
Constructs
MaintenanceWindowhas new properties:timezone,pauseAllChecks,silenceAlertsTagsandsilenceAllAlerts.tagsis now optional, and a window that sets none of these four ortagsgets a warning, because it affects no checks.- gRPC monitors support FlatBuffers through
grpcConfig.encoding: 'FLATBUFFERS'and a base64-encoded compiled schema ingrpcConfig.bfbsContent. aiAutoRepairEnabledonBrowserCheckandMultiStepChecknow only acceptstrue,falseornull. Other values are reported as errors before the deploy.
Test results
checkly test, trigger and pw-test now show how many times a check was retried, as in ✔ My check (2 retries), and the GitHub reporter shows the count too. A check that passed only after retrying is also counted as flaky in the summary, and still counts as passed (1 passed, 1 flaky, 1 total). The exit code is unchanged.
Repository links
When no repository URL is configured, deploys and test runs now fall back to the GitHub Actions repository variables and then to the git origin remote. SSH remotes are converted to HTTPS, and credentials are removed. checkly init writes repoUrl into the config it generates.
Fixes
checkly test,triggerandpw-testno longer report a check twice, or end the run early, when its timeout coincides with its result arriving. The timeout also restarts with each retry, so a long series of retries is no longer cut off.checkly apikeeps binary responses byte for byte, so downloaded ZIP files are no longer corrupted.--jqnow gives a clear error for a response that is not JSON.checkly initnow works in an empty folder for AI agents and in CI: it creates apackage.jsoninstead of exiting without doing anything.checkly initnow installs the agent skill when the agent reports a versioned name, as recent Claude Code versions do.- Each construct is now attributed to the file that declares it, not to the first check file that imported it. This affects the source file shown in the deploy plan,
checkly test <file>filtering,--listgrouping, and relativeentrypointpaths for checks declared in shared modules, which are now also looked up next to that module. checkly importround-trips more resources correctly: empty alert settings, zero retry backoff, frequencies that no constant covers, groupconcurrency, and project-level defaults.
All pull requests
Show the 45 pull requests in this release
- fix(cli): install the agent skill when AI_AGENT carries a version suffix by @hlenke in #1485
- ci: run the test workflow on pull requests against any base branch [RED-980] [ship] by @sorccu in #1489
- feat(cli): derive the repo URL from the git remote [ship] by @martzoukos in #1500
- fix(cli): let agents and CI run init in an empty folder by @hlenke in #1483
- fix: preserve binary response bytes in api command by @sbezludny in #1502
- chore(deps): weekly CLI dependency update (2026-10-02) [RED-1005] [ship] by @sorccu in #1503
- fix(constructs): attribute a construct to the file that declares it [ship] by @sorccu in #1491
- feat(deploy): preview every deploy and show the property-level diff [ship] by @sorccu in #1486
- fix(codegen): correct default handling so import round-trips and the deploy preview renders every resource [RED-979] [ship] by @sorccu in #1488
- feat(deploy): print the preview as a plan with an overview, coloured diffs and totals [RED-981] [ship] by @sorccu in #1490
- feat(codegen): render Playwright check suites in the deploy preview [ship] by @sorccu in #1492
- feat(deploy): show the preview before asking to apply, and add --skip-plan [RED-984] [ship] by @sorccu in #1493
- feat(deploy): offer to write changes made in Checkly back into the code [RED-985] [ship] by @sorccu in #1494
- feat(deploy): write frequency, retry strategy, alert policy and assertions back into the code [ship] by @sorccu in #1495
- feat(write-back): write runtimeId and the request of every monitor type [RED-991] [ship] by @sorccu in #1496
- feat(write-back): hold the rule table to every construct prop at build time [RED-992] [ship] by @sorccu in #1497
- feat(write-back): update the code of every resource type, not only checks and groups [RED-997] [ship] by @sorccu in #1498
- feat(deploy): plan a deploy only under --plan [RED-1016] [ship] by @sorccu in #1501
- feat(grpc): support FlatBuffers monitor constructs [RED-800] [ship] by @danielpaulus in #1487
- feat(deploy): say what a first plan writes again, and why [RED-1055] [ship] by @sorccu in #1505
- fix(deploy): list the resources a first plan updates, and say why in one line [RED-1055] [ship] by @sorccu in #1506
- feat(cli): add timezone and pause/silence scope to maintenance windows [RED-1015] [ship] by @shiini2 in #1466
- ci(check-ai-context): comment only on a skills/ mismatch and keep one sticky comment [RED-1057] [ship] by @sorccu in #1507
- ci(check-ai-context): fail on untracked files in skills/ [RED-1061] [ship] by @sorccu in #1508
- feat(cli): add --schedule-on-deploy-threshold to deploy [RED-1080] [ship] by @sorccu in #1509
- feat(cli): device-flow login for agents, remote shells and inline auth [show] by @hlenke in #1484
- fix(constructs): validate automatic repair settings [ship] by @thebiglabasky in #1511
- feat(cli): add --schedule-on-deploy-min-frequency to deploy [RED-1082] [ship] by @sorccu in #1510
- ci(release): support release candidate versions [RED-1099] [ship] by @sorccu in #1512
- feat(deploy)!: plan every deploy by default, with --no-plan to opt out [RED-1100] [ship] by @sorccu in #1513
- feat(constructs)!: restrict shouldFail to ApiCheck, UrlMonitor and TcpMonitor [RED-1104] [ship] by @sorccu in #1514
- feat(constructs)!: remove the AgenticCheck construct [RED-1108] [ship] by @sorccu in #1517
- feat(constructs)!: remove the misspelled AssertionBuilder.responseTme() alias [RED-1113] [ship] by @sorccu in #1518
- feat(cli)!: remove the deprecated checkly rules command [RED-1115] [ship] by @sorccu in #1519
- feat(constructs)!: remove the HeartbeatCheck and TcpCheck aliases [RED-1116] [ship] by @sorccu in #1520
- feat(config)!: remove the caching.dependencyCache.version option [RED-1114] [ship] by @sorccu in #1521
- feat(constructs)!: remove the doubleCheck property [RED-1110] [ship] by @sorccu in #1523
- feat(constructs)!: remove the deprecated groupId and groupName props [RED-1111] [ship] by @sorccu in #1524
- feat(constructs): warn when a deployed check has no location [RED-1117] [ship] by @sorccu in #1525
- feat(constructs)!: remove ApiCheck localSetupScript and localTearDownScript [RED-1112] [ship] by @sorccu in #1522
- feat(deploy)!: schedule only the changed checks after a deploy [RED-1103] [ship] by @sorccu in #1515
- fix(cli): report a check once when its timeout races an in-flight result [RED-1119] [ship] by @hlenke in #1499
- feat(deploy)!: make --schedule-on-deploy opt-in [RED-1120] [ship] by @sorccu in #1526
- fix(cli): exclude server-side scheduling delay from the per-check timeout [RED-814] [ship] by @sorccu in #1421
- fix(cli): name a refused reference the way the construct spells it [RED-1121] [ship] by @sorccu in #1527
Full Changelog: 9.5.0...10.0.0-rc.1