DocumentationSearch docs
  1. 01Getting started
  2. 02Next.js and Vercel
  3. 03Node servers and scripts
  4. More JavaScript platforms

    1. 04SvelteKit
    2. 05Nuxt and Nitro
    3. 06React Router and Remix
    4. 07NestJS
    5. 08Strapi
    6. 09Netlify
    7. 10Firebase
    8. 11Convex
    9. 12Trigger.dev
    10. 13Inngest
    11. 14Cloudflare Workers
    12. 15Supabase and pg_cron
  5. Ruby

    1. 16Ruby on Rails
    2. 17Ruby
  6. Python

    1. 18Django
    2. 19Celery
    3. 20Python
  7. PHP

    1. 21Laravel
    2. 22Symfony
    3. 23WordPress
    4. 24Drupal
    5. 25Craft CMS
    6. 26PHP
  8. Go

    1. 27Go
    2. 28Go schedulers
  9. Rust

    1. 29Rust
    2. 30Rust schedulers
  10. Elixir

    1. 31Elixir
    2. 32Elixir schedulers
  11. Java

    1. 33Java
    2. 34Java schedulers
  12. .NET

    1. 35.NET
    2. 36.NET schedulers
  13. Reference

    1. 37Schedules, grace and timeouts
    2. 38What it catches
    3. 39Alerts
    4. 40AI triage
    5. 41Stores
    6. 42Dashboard and API
    7. 43MCP server
    8. 44Agent skill
    9. 45TypeScript API reference
    10. 46Limits and design notes
    11. 47Environment variables
    12. 48Stability
    13. 49Deprecations

Deprecations

Deprecations

Every name that is deprecated today, in every language, with its replacement and the release it goes in. A deprecated name still works, and does what its replacement does, until then. How deprecation works is on the Stability page.

Two kinds of name are deprecated while preparing 1.0, and they go at different times:

  • Renames of documented API (a class, method or option the docs showed, renamed so the names agree across languages) keep their old name as a deprecated alias through every 1.x release, and go in 2.0. So 1.0 breaks nothing the docs showed.
  • Names that were public by accident (helpers, constants, the JSON and pg_cron helpers, the store test kits' internals) are deprecated now, still work, and go in 1.0 itself, as the changelog will list.

Two Rust names go in 1.0 for a reason of their own: Routes::into_router() and ReqwestTransport::with_client hand out types of axum and reqwest, both below 1.0, which no 1.x promise could hold. A few internals were made internal outright, with no deprecation; they are listed at the end.

TypeScript

Marked @deprecated, so an editor strikes the name through. See the API reference.

Deprecated Use instead Goes in
CronWatch, CronWatchOptions Cronwatch, CronwatchOptions 2.0
createRoutes(cw, options) cw.routes(options) 2.0
cw.start(every) cw.startChecking(every) 2.0
hmacSha256Hex(secret, body) from /webhook signature(secret, body) 1.0
MAX_SEGMENTS, MAX_BODY, smsSegments, smsBody from /twilio; parseDsn from /sentry; DESCRIPTION_MAX, embedDescription, codeBlockSafe, escapeMarkdown from /discord; PG_CRON_HOLD_MS, pgCronSchedule, pgCronJobName, pgCronRun from /pg-cron nothing: internal to their entry points 1.0

@cronwatch/mcp has nothing deprecated.

Ruby

Each warns in Ruby’s deprecation category, shown under ruby -w, -W:deprecated or Warning[:deprecated] = true, naming the line that called it. See Ruby.

Deprecated Use instead Goes in
Cronwatch::Web.new(client, **options) client.routes(**options) 2.0
client.start(every) client.start_checking(every) 2.0
client.run(id) without a block client.get_run(id) 2.0
client.silence(name, "2h") client.silence(name, for: "2h") 2.0

Python

Each warns with a DeprecationWarning. See Python.

Deprecated Use instead Goes in
cw.start(every), AsyncCronwatch.start(every) start_checking(every) 2.0
cronwatch.web.Web(client, ...) cw.routes(...) 2.0
AnthropicTriage from cronwatch.triage.anthropic Anthropic 2.0
Slack(url), Discord(url) with the URL given positionally Slack(webhook_url=url), Discord(webhook_url=url) 2.0
hmac_sha256_hex(secret, body) from cronwatch.alerts.webhook signature(secret, body) 1.0
the modules that only implement the client under their old names (cronwatch.client, duration, stats, output, schedule, evaluate, format, serialize, job, run_handle, handler, alerts.email, alerts.sigv4), and the helpers and constants of the public modules (cronwatch.types.camel, cronwatch.alerts.twilio.sms_segments and the like) the documented API: each module’s __all__ lists what it promises 1.0

PHP

Marked @deprecated in their docblocks; Laravel’s renamed settings keys also raise an E_USER_DEPRECATED notice, once per process. See PHP and Laravel.

Deprecated Use instead Goes in
cronSecret: false, token: false, handler($fn, secret: false) null, which turns them off as in every language 2.0
$job->wrap($fn) $job->monitor($fn) 2.0
Laravel’s store.prefix, store.create_tables, schedule.check, schedule.check_cron table_prefix, create_tables, check.schedule, check.frequency 2.0
Cronwatch\Alerts\Webhook::hmacSha256Hex($secret, $body) Webhook::signature($secret, $body) 1.0
Twilio::MAX_SEGMENTS, MAX_BODY, smsSegments, smsBody, fits, segmentBudget, maskNumber; Sentry::parseDsn; Discord::DESCRIPTION_MAX, embedDescription, codeBlockSafe, escapeMarkdown; Sources\PgCron::HOLD_MS, BACKFILL, PAGE, MAX_PAGES, the *_SQL constants, schedule, jobName, run, epochMs, adapter nothing: internal to their channel or source 1.0

The Symfony, WordPress, Drupal and Craft CMS integrations have nothing deprecated.

Go

Marked Deprecated: in their doc comments, which editors and staticcheck point at. See Go.

Deprecated Use instead Goes in
cw.Start(every) cw.StartChecking(every) 2.0
robfigcron.Watch(cw, o), cwgocron.Watch(cw, o) robfigcron.New(cw, o).Option(), cwgocron.New(cw, o).Option() 2.0
cwgocron.Converted robfigcron.Converted 1.0
cwgocron.Panic cwgocron.PanicError 1.0
JSValue() on Alert, CheckResult, Definition, JobState, JobSummary, Metrics and Run MarshalJSON, or encoding/json 1.0
cronwatch.Stderr, cronwatch.Stdout WithErrorHandler, and a channel of your own in place of Console 1.0
cronwatch.MaxBody, cronwatch.ReservedRunIDPrefix nothing: internal 1.0
pgcron.Hold, pgcron.Schedule, pgcron.JobName, pgcron.RunOf nothing: internal 1.0
triage.System nothing: internal 1.0

Rust

Marked #[deprecated], so the compiler names the replacement. See Rust.

Deprecated Use instead Goes in
Client::start(every), blocking::Client::start(every) start_checking(every) 2.0
Routes::into_router() Router::new().nest_service("/cronwatch", routes) 1.0
ReqwestTransport::with_client(client) the default transport, or a Transport of your own 1.0
describe_job(name, &options) nothing: documented before 1.0, so it stays through 1.x 2.0
run_duration, state_version, js::ParseError, alerts::MAX_SEGMENTS, alerts::post::{TIMEOUT, MAX_BODY, origin}, triage::{SYSTEM, REQUEST_TIMEOUT, FALLBACK_BETA}, cronwatch_sqlx::pgcron::{HOLD, schedule, job_name, run_of} nothing: internal (JsonError for ParseError) 1.0
everything in storetest but run storetest::run 1.0

Elixir

start/0, the StoreCase helpers and the channels', pg_cron’s and triage’s helpers are marked @deprecated, so the compiler warns; a keyword list given to start/1 warns when it is called. See Elixir.

Deprecated Use instead Goes in
Cronwatch.start(), Cronwatch.start(every: d) Cronwatch.start_checking(every: d) 2.0
Cronwatch.StoreCase.contract/1, replay_fixture/2, make/1, scenarios/0, new_run/4, canonical/1 use Cronwatch.StoreCase, store: ..., fixture: ... 1.0
Alerts.Twilio.max_segments/0, sms_segments/1, sms_body/3; Alerts.Discord.embed_description/1; Alerts.Email.escape_html/1; Alerts.Webhook.body/1; Sources.PgCron.hold_ms/0, schedule/1, job_name/1, run_of/4; Triage.Anthropic.default_model/0, system/0 nothing: internal 1.0

Java

Marked @Deprecated(since = "1.0", forRemoval = true), so the compiler warns where each is used. See Java.

Deprecated Use instead Goes in
cw.start(), start(Duration), start(String) cw.startChecking(), with the same overloads 2.0
dev.cronwatch.jdbc.SqlStore dev.cronwatch.store.SqlStore 2.0
dev.cronwatch.bridge.Bridge dev.cronwatch.bridge.SchedulerBridge 2.0
Routes.of(cw, options) cw.routes(options) 2.0

.NET

Marked [Obsolete], so the compiler points at the replacement. See .NET.

Deprecated Use instead Goes in
cw.Start(every) cw.StartChecking(every) 2.0
Cronwatch.Web.WebRequest, WebResponse CronwatchRequest, CronwatchResponse 2.0
Cronwatch.Web.WebAdapters Adapters 2.0
Cronwatch.Hosting.CronwatchServiceCollectionExtensions, Cronwatch.AspNetCore.CronwatchAspNetCore the same extension methods, in Microsoft.Extensions.DependencyInjection and Microsoft.AspNetCore.Builder 2.0
Slack.Webhook(url), Discord.Webhook(url) SlackChannel.Webhook(url), DiscordChannel.Webhook(url) 2.0
Json.Quote, Json.Kind, Json.Copy, Json.TryNumber, Json.MaxDepth Json.Parse, Json.ParseObject, Json.Stringify 1.0
StoreContract.NewRun, ForeignRows StoreContract.RunAsync, StoreReplay, FinishOnce 1.0
IConditionalRunStore, IStateCasStore, IRunDeletingStore IUpdateRunIfStore, ICompareAndSetStateStore, IDeleteRunIfStore 2.0

The Hangfire and Quartz.NET packages have nothing deprecated.

Hidden in 1.0 without a deprecation

A few internals that were public before 1.0 became internal in the same change, with no deprecated name left behind, because nothing documented used them:

  • Ruby: the constants the docs do not name are private_constant, and the internal modules are marked @api private. See Ruby.
  • Java: Json.quote, Json.kind, Json.copy, Json.MAX_DEPTH; PgCron.schedule, PgCron.jobName, PgCron.run, PgCron.HOLD_MS and PgCronRow; Twilio.MAX_SEGMENTS; and in dev.cronwatch.storetest everything but StoreContract.run.
  • Elixir: the port’s machinery, which the package itself calls from module to module (Cronwatch.JS, JSRE, Cron, Zone, Duration, Schedule, Output, Serialize, Alerts.Post, Store.SQL, and helpers such as Alerts.Email.compose/2, Transport.check/2 and JobState.sending/2), is hidden from HexDocs. It still works, since the package needs it public, but may change in any release.
  • PHP: the classes and methods marked @internal (Evaluate, Schedule, Format, Serialize, Output, Duration and the client’s execution methods among them). They still work, since the package’s own classes call them, but may change in any release.