What's New
- The checkmate.so website has been fully renewed, with a refreshed design and updated messaging across the board.
- The documentation at checkmate.so/docs has been overhauled to reflect v3.6.1, covering the new features, updated setup instructions, and corrected references throughout.
- Teams are now first-class citizens in Checkmate. You can group monitors by team, assign ownership, and scope notifications and access accordingly — making multi-team deployments and larger organizations much easier to manage.
- Data retention is now configurable. Older checks and related records can be pruned automatically based on your retention policy, keeping the database lean and predictable over long-running deployments.
- Two new notification channels have landed: Telegram and Twilio SMS. You can now deliver incident alerts via Telegram bots or send SMS messages through Twilio, alongside the existing email, Slack, Discord, webhook, Matrix, and Pushover channels.
- Pushover is also now supported as a notification channel, giving mobile-first teams another reliable way to receive alerts.
- The monitor status engine has been refactored end-to-end for atomicity and correctness. State transitions (up → down, down → up) are now evaluated more reliably, with tightened streak and heartbeat handling, fixes to "down" notifications that were not being dispatched, and a proper initial state so the first check after creation behaves predictably.
- Status pages now include an infrastructure section. Public status pages can surface CPU, memory, and disk health from infrastructure monitors alongside uptime, with the status page API refresh interval tightened to 10 seconds for near real-time updates.
- Status bar messages on public status pages have been rewritten to be clearer and more informative, and down monitors now correctly display a
"down"state instead of a misleading "active for…" label. - Bulk edit for monitor notifications is now available via a dedicated endpoint, so you can attach or detach notification channels across many monitors in a single call instead of editing them one at a time.
- Internationalization has been overhauled. All locale files have been restructured and translated, remaining zh-TW strings have been filled in, and the legacy PoEditor workflow has been disabled in favor of the new structure. Translation contribution guidance has also been refreshed.
- The Matrix notification channel has been fixed and is working again for teams that rely on it.
- DNS lookups now respect a configured cache TTL, preventing stale DNS results from silently breaking monitoring when upstream IPs change.
- The "breached" infrastructure status has been renamed to "threshold exceeded" across the UI for clarity.
- The login page no longer shows the register tip when registration isn't applicable, and users landing on a fresh instance with no super admin are now redirected to the setup flow automatically.
- The production Docker Compose setup and nginx configuration have been updated and unified, making deployments more consistent across environments. A Windows batch script (
build_images.bat) has also been added for building Docker images on Windows. - Test coverage has grown substantially: new service tests, integration tests, monitor status tests, heartbeat tests, initialization tests, and a dedicated
check-testsworkflow have all been added to catch regressions earlier. - Across the backend, controllers, services, middleware, validation, and migrations have been retyped and linted into a clean state — auth, diagnostic, incident, invite, log, maintenance window, monitor, notification, queue, settings, and snapshot controllers have all received typing and validation fixes, and the remaining ESLint errors have been resolved.
- Other fixes worth calling out: email templates are now copied to
distduring build (fixing empty notification emails), MJML templates are no longer ignored by TSC, the geocheck update logic has been corrected, the scheduler has been bumped and now consumes scheduler events, monitor stats are no longer mutated in memory, role types are enforced correctly, notification timeouts have been tightened, and the demo monitor import and demo user flows have been fixed. - Documentation has seen a round of polish: the README now includes a monitor lifecycle explanation and a Prerequisites section,
CLAUDE.mdhas been expanded with the backend architecture flow and repository pattern, broken docs links have been fixed, the Node.js version requirement has been updated to >=20, and several typos and outdated references (including the oldbluewave-uptimerepo name) have been corrected.
Thank you to our new contributors @tb102122, @ashu130698, @LeC-D, @mayssagl, @ad2ien, @SkyKingPX, @egeoztass, @ZeinebMegaadi, and @Smolcup for their first contributions in this release!
What's Changed
- fix: demo monitor import by @ajhollid in #3395
- add teams by @tb102122 in #3375
- feat: retention by @ajhollid in #3398
- fix: type authController correctly, update services accordingly by @ajhollid in #3399
- fix: set DNS cache TTL to prevent stale lookups by @gorkem-bwl in #3400
- fix: controller utils types by @ajhollid in #3404
- fix: properly type diagnosticController by @ajhollid in #3405
- fix: Incident Controller/Service typing by @ajhollid in #3406
- fix: empty email body due to TSC ignoring .mjml templates by @akashmannil in #3403
- fix: inviteController typing by @ajhollid in #3407
- fix: log controller by @ajhollid in #3408
- fix: type MWController by @ajhollid in #3409
- fix: validation in monitor controller by @ajhollid in #3410
- fix: rename "breached" status to "threshold exceeded" by @gorkem-bwl in #3401
- fix: implement NotificationController missing validation by @ajhollid in #3411
- fix: QueueController Types by @ajhollid in #3412
- fix: SettingsController correct types by @ajhollid in #3414
- fix: unset with explicit null by @ajhollid in #3415
- fix: properly type snapshot by @ajhollid in #3417
- fix: middleware typing by @ajhollid in #3418
- fix: modify heatmap response time conditional text by @akashmannil in #3416
- feat: status-page infrastructure section BE by @akashmannil in #3424
- feat: status-page infra section FE by @akashmannil in #3425
- fix: updating swagger - /PUT to /PATCH monitor/{monitorId} by @akashmannil in #3426
- fix: updating swagger for createMonitor and /monitor/teams by @akashmannil in #3427
- fix: modifying refreshInterval=10s for statusPage api by @akashmannil in #3428
- fix/monitor service lint by @ajhollid in #3429
- fix/services by @ajhollid in #3430
- fix: infra services by @ajhollid in #3431
- fix/controllers by @ajhollid in #3433
- fix: migration lint errors by @ajhollid in #3435
- fix: resolve remaining ESlint errors by @ajhollid in #3436
- feat: add bulk edit monitor notifications endpoint by @ashu130698 in #3376
- fix: add upper limit to notificationValidation by @ajhollid in #3437
- feat: timescaledb by @ajhollid in #3441
- feat(notifications): add Telegram notification channel (#2753) by @LeC-D in #3439
- Feat(DLQ): Add DLQ data layer -> types, model, and repository by @Br0wnHammer in #3447
- Fix outdated links and add Prerequisites section by @mayssagl in #3455
- fix geocheck update logic by @ajhollid in #3456
- feat: bump scheduler, consume scheduler events by @ajhollid in #3458
- fix: restructure and translate all i18n locale files by @gorkem-bwl in #3461
- feat: add remaining zh-tw strings by @ajhollid in #3471
- fix: disable poeditor workflow by @ajhollid in #3473
- fix: align server test suite with current source implementations by @gorkem-bwl in #3460
- Fix matrix notifications by @ad2ien in #3479
- feat/service tests by @ajhollid in #3492
- feat: integration tests by @ajhollid in #3494
- fix: initialize timeOfLastFailure by @ajhollid in #3498
- fix: remove in memory modification of monitor stats by @ajhollid in #3499
- fix: enforce correct role types by @ajhollid in #3500
- fix: notification timeouts by @ajhollid in #3501
- feat: add check-tests workflow by @ajhollid in #3502
- fix: add test for monitor status by @ajhollid in #3507
- fix: additional status service tests by @ajhollid in #3508
- fix: notification down not sent by @akashmannil in #3505
- feat/monitor status refactor by @ajhollid in #3510
- feat: add additional heartbeat tests by @ajhollid in #3522
- fix: monitor init by @ajhollid in #3523
- fix: tighten streak time coniditional by @ajhollid in #3524
- feat: initializaiton tests by @ajhollid in #3525
- fix: remove notifications from monitors before deleting notifications by @ajhollid in #3526
- fix: demo user by @ajhollid in #3527
- Add windows batch script for creating docker images automatically by @SkyKingPX in #3529
- docs: improve CLAUDE.md with architecture flow and repository pattern… by @mayssagl in #3531
- fix: copy email templates to dist during build by @mayssagl in #3532
- Improve status bar messages on public status pages by @SkyKingPX in #3512
- fix: monitor status atomicity by @ajhollid in #3533
- feat: add Pushover notification channel by @egeoztass in #3530
- Fix: added "down" display on down monitors instead of "Active for:..." by @ZeinebMegaadi in #3518
- fix: update production docker compose/nginx conf by @ajhollid in #3542
- docs: fix typo 'big' to 'bug' in PULLREQUESTS.md by @Smolcup in #3541
- docs: fix discussions link in Spanish README by @Smolcup in #3535
- fix/unified docker compose by @ajhollid in #3544
- fix: correct docs link URL (404 issue) by @ZeinebMegaadi in #3555
- docs: update i18n contribution guide by @Smolcup in #3553
- docs: update repo name bluewave-uptime to checkmate in CODE_OF_CONDUCT by @Smolcup in #3552
- Add build_images.bat for Docker image builds by @SkyKingPX in #3549
- docs: update Node.js version requirement to >=20 in contributing guide by @ZeinebMegaadi in #3545
- feat: add Twilio SMS notification channel by @egeoztass in #3534
- chore: remove timescale db by @ajhollid in #3558
- fix: hide register tip on login and redirect to setup when no super admin by @gorkem-bwl in #3557
- normalize line endings by @ajhollid in #3561
- docs: added monitor lifecycle explanation to README by @ZeinebMegaadi in #3520
- develop -> master by @ajhollid in #3563
New Contributors
- @tb102122 made their first contribution in #3375
- @ashu130698 made their first contribution in #3376
- @LeC-D made their first contribution in #3439
- @mayssagl made their first contribution in #3455
- @ad2ien made their first contribution in #3479
- @SkyKingPX made their first contribution in #3529
- @egeoztass made their first contribution in #3530
- @ZeinebMegaadi made their first contribution in #3518
- @Smolcup made their first contribution in #3541
Full Changelog: v3.5.1...v3.6.0