Skip to content

10.0.0-rc.1

Pre-release
Pre-release

Choose a tag to compare

@sorccu sorccu released this 09 Oct 21:51
· 24 commits to main since this release
b6d3542

This 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@next

Version 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-plan to 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-plan deploy. 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 prints No changes., ends with Project "<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=0

Checkly 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: true with RetryStrategyBuilder.singleRetry({ baseBackoffSeconds: 0, sameRegion: false }). This is one immediate retry from a different region. A bare singleRetry() is not the same: it waits 60 seconds and retries in the same region.
  • Replace doubleCheck: false with RetryStrategyBuilder.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 timezone in 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, declare timezone in code. If the maintenance is active at that moment, the deploy fails until the maintenance ends.
  • Warning for checks without a location: deploy and validate now warn about a check that has no locations and no privateLocations, because Checkly would pick a location for it. Set them on the check or its group, or set a default with checks.locations or checks.privateLocations in checkly.config.ts. This is only a warning: the deploy still goes ahead.
  • --timeout measures run time: in checkly test, trigger and pw-test, --timeout now 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 --timeout plus 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 form checkly import writes. 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?. --preview prints the plan without deploying and ends with a checkly deploy --plan-token … command that deploys exactly that plan later. The new --dry-run flag 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, RetryStrategyBuilder and AssertionBuilder. Then it stops without deploying, so you can review the changes with git diff. Anything it cannot write safely, such as references, secrets and values built from variables, is listed for you to change by hand.
  • --prune-relations deletes 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_KEY and CHECKLY_ACCOUNT_ID.
  • Without a browser: pass --no-browser or set CHECKLY_NO_BROWSER=1 to print the login URL instead of opening a browser.
  • checkly logout no longer asks for a confirmation that nobody can give (AI agents, CI, scripts). Before, it exited without logging out.

Constructs

  • MaintenanceWindow has new properties: timezone, pauseAllChecks, silenceAlertsTags and silenceAllAlerts. tags is now optional, and a window that sets none of these four or tags gets a warning, because it affects no checks.
  • gRPC monitors support FlatBuffers through grpcConfig.encoding: 'FLATBUFFERS' and a base64-encoded compiled schema in grpcConfig.bfbsContent.
  • aiAutoRepairEnabled on BrowserCheck and MultiStepCheck now only accepts true, false or null. 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, trigger and pw-test no 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 api keeps binary responses byte for byte, so downloaded ZIP files are no longer corrupted. --jq now gives a clear error for a response that is not JSON.
  • checkly init now works in an empty folder for AI agents and in CI: it creates a package.json instead of exiting without doing anything.
  • checkly init now 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, --list grouping, and relative entrypoint paths for checks declared in shared modules, which are now also looked up next to that module.
  • checkly import round-trips more resources correctly: empty alert settings, zero retry backoff, frequencies that no constant covers, group concurrency, 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