[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"post-crystade-update-javascript-assertions-auto-incident-lifecycle-and-rich-incident-responses":3,"related-crystade-update-javascript-assertions-auto-incident-lifecycle-and-rich-incident-responses":32},{"id":4,"slug":5,"title":6,"excerpt":7,"content":8,"status":9,"tags":10,"coverMedia":14,"author":17,"createdAt":24,"updatedAt":25,"category":26},"d0d9d483-59d4-4f9b-9099-edbc50d81439","crystade-update-javascript-assertions-auto-incident-lifecycle-and-rich-incident-responses","Crystade Update: JavaScript Assertions, Auto-Incident Lifecycle, and Rich Incident Responses","Discover Crystade’s latest monitoring update: replace custom DSLs with JavaScript assertions, automate incident opening and closing with hysteresis, and collaborate faster with a WYSIWYG incident response editor.","\u003Cp>We’re excited to announce a major update to Crystade’s monitoring capabilities, released on August 20, 2026. This update focuses on making advanced monitoring checks easier to write, reducing alert fatigue through smarter incident automation, and improving team collaboration during incidents.\u003C\u002Fp>\u003Cp>Here’s what’s new:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>Monitor \u003Cstrong>assertions\u003C\u002Fstrong> now use JavaScript instead of a custom DSL\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>Assertions are team-scoped and linkable to multiple monitors\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>Custom incident titles, messages, and severity per assertion\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>Automatic incident opening and closing based on assertion health, with hysteresis to reduce false alarms\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>A WYSIWYG editor for incident responses, supporting rich formatting and cross-resource mentions\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>Let’s dive into each change and what it means for you.\u003C\u002Fp>\u003Chr>\u003Ch2>\u003Cstrong>Monitor Assertions with JavaScript\u003C\u002Fstrong>\u003C\u002Fh2>\u003Cp>Previously, Crystade used a custom scripting language called \u003Cstrong>Rice\u003C\u002Fstrong> for writing custom check logic. While powerful, Rice required learning a niche syntax, which slowed down adoption and made debugging harder.\u003C\u002Fp>\u003Cp>Today, we replace Rice with \u003Cstrong>standard JavaScript\u003C\u002Fstrong> for writing assertions. An assertion is a small program that evaluates a monitor’s check result and returns \u003Ccode>true\u003C\u002Fcode> (healthy), \u003Ccode>false\u003C\u002Fcode> or error message (failure).\u003C\u002Fp>\u003Cp>Here’s a simple assertion that fails if the round-trip time (RTT) exceeds 100 ms:\u003C\u002Fp>\u003Cpre>\u003Ccode>return context.error === null &amp;&amp; context.metadata.rttMs &gt; 100;\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Another assertion that returns an error message:\u003C\u002Fp>\u003Cpre>\u003Ccode>let tlsLayer = null;\nfor (const layer of context.metadata.layers) {\n  if (layer.name === \"tls\") {\n    tlsLayer = layer;\n    break;\n  }\n}\n\nif (tlsLayer === null) {\n  return \"no TLS layer found\";\n} else if (context.error !== null) {\n  return `error: ${context.error.message} (code: ${context.error.code})`;\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3>\u003Cstrong>Why JavaScript?\u003C\u002Fstrong>\u003C\u002Fh3>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>Huge developer pool\u003C\u002Fstrong> – JavaScript is one of the most widely known programming languages. Your team already knows it.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>AI-assisted development\u003C\u002Fstrong> – You can ask Claude, ChatGPT, Gemini, or any AI coding assistant to help write and debug assertions.\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cimg src=\"https:\u002F\u002Fcdn.crystade.com\u002Fgrowth-media\u002F2026\u002F08\u002F4d48499d-9039-4867-8e29-ad76050286ef-Screenshot_2026-08-20_183824.png\" alt=\"Screenshot 2026-08-20 183824.png\" data-size=\"lg\" class=\"block mx-auto border border-base-300 rounded-lg max-w-lg w-full\">\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>Easier onboarding\u003C\u002Fstrong> – New team members can start writing custom checks in minutes, not days.\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Ch3>\u003Cstrong>Team-Scoped and Reusable\u003C\u002Fstrong>\u003C\u002Fh3>\u003Cp>Assertions are now first-class, \u003Cstrong>team-scoped resources\u003C\u002Fstrong>. You can create an assertion once and link it to multiple monitors. No more duplicating script logic across checks.\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>Update an assertion, and all linked monitors pick up the change automatically (within a few minutes, consistent with monitor update propagation).\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cul>\u003Cli>\u003Cp>Manage assertions centrally from your team dashboard.\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cimg src=\"https:\u002F\u002Fcdn.crystade.com\u002Fgrowth-media\u002F2026\u002F08\u002Ff1b3ef0b-4152-46e0-8efe-596022220418-Screenshot_2026-08-20_183733.png\" alt=\"Screenshot 2026-08-20 183733.png\" data-size=\"lg\" class=\"block mx-auto border border-base-300 rounded-lg max-w-lg w-full\">\u003Ch3>\u003Cstrong>Plan Limits\u003C\u002Fstrong>\u003C\u002Fh3>\u003Cp>The number of assertions you can create depends on your subscription plan:\u003C\u002Fp>\u003Ctable style=\"min-width: 50px;\">\u003Ccolgroup>\u003Ccol style=\"min-width: 25px;\">\u003Ccol style=\"min-width: 25px;\">\u003C\u002Fcolgroup>\u003Ctbody>\u003Ctr>\u003Cth colspan=\"1\" rowspan=\"1\" style=\"text-align: left;\">\u003Cp>\u003Cstrong>Plan\u003C\u002Fstrong>\u003C\u002Fp>\u003C\u002Fth>\u003Cth colspan=\"1\" rowspan=\"1\" style=\"text-align: left;\">\u003Cp>\u003Cstrong>Maximum assertions\u003C\u002Fstrong>\u003C\u002Fp>\u003C\u002Fth>\u003C\u002Ftr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>Free\u003C\u002Fp>\u003C\u002Ftd>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>1\u003C\u002Fp>\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>Starter\u003C\u002Fp>\u003C\u002Ftd>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>3\u003C\u002Fp>\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>Standard\u003C\u002Fp>\u003C\u002Ftd>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>5\u003C\u002Fp>\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003Ch2>\u003Cstrong>Customized Incident Notifications\u003C\u002Fstrong>\u003C\u002Fh2>\u003Cp>When an assertion fails, Crystade automatically creates an incident. Now you can customize exactly how that incident appears to your team:\u003C\u002Fp>\u003Cimg src=\"https:\u002F\u002Fcdn.crystade.com\u002Fgrowth-media\u002F2026\u002F08\u002Fb4b5d612-17aa-4609-8826-67baebf5efba-Screenshot_2026-08-20_183922.png\" alt=\"Screenshot 2026-08-20 183922.png\" data-size=\"lg\" class=\"block mx-auto border border-base-300 rounded-lg max-w-lg w-full\">\u003Ch3>\u003Cstrong>Incident Title Template\u003C\u002Fstrong>\u003C\u002Fh3>\u003Cp>Define a title using placeholders like \u003Ccode>{{assertionName}}\u003C\u002Fcode> and \u003Ccode>{{monitorName}}\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>Example:\u003C\u002Fp>\u003Cpre>\u003Ccode>{{assertionName}} failed on {{monitorName}}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>This produces a clear, actionable title: \u003Cem>“High latency check failed on API Gateway”\u003C\u002Fem>.\u003C\u002Fp>\u003Ch3>\u003Cstrong>Incident Message Template\u003C\u002Fstrong>\u003C\u002Fh3>\u003Cp>Create a rich message body with HTML-like tags and mentions. Placeholders include \u003Ccode>{{assertionId}}\u003C\u002Fcode>, \u003Ccode>{{assertionName}}\u003C\u002Fcode>, \u003Ccode>{{monitorName}}\u003C\u002Fcode>, and \u003Ccode>{{location}}\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>Example:\u003C\u002Fp>\u003Cpre>\u003Ccode>&lt;mention kind=\"assertion\" id=\"{{assertionId}}\"&gt;@{{assertionName}}&lt;\u002Fmention&gt; failed on monitor\n&lt;mention kind=\"monitor\" id=\"{{assertionId}}\"&gt;@{{assertionName}}&lt;\u002Fmention&gt; (Location: {{location}})\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>These templates help your team instantly understand what broke, where, and which assertion triggered the alert.\u003C\u002Fp>\u003Ch3>\u003Cstrong>Incident Severity\u003C\u002Fstrong>\u003C\u002Fh3>\u003Cp>Assign a severity level (e.g., \u003Ccode>INFO\u003C\u002Fcode>, \u003Ccode>WARNING\u003C\u002Fcode>, \u003Ccode>CRITICAL\u003C\u002Fcode>) to each assertion. This ensures high-priority issues get immediate attention while low-priority anomalies are handled later.\u003C\u002Fp>\u003Chr>\u003Ch2>\u003Cstrong>Automatic Incident Lifecycle with Hysteresis\u003C\u002Fstrong>\u003C\u002Fh2>\u003Cp>Monitoring often produces noisy data – a single failed check may be a transient network blip, not a real outage. To avoid alert fatigue, Crystade now manages the full incident lifecycle automatically based on assertion health.\u003C\u002Fp>\u003Cp>Here’s how it works:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>When an assertion transitions from healthy to failure, Crystade opens an incident.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>When the assertion returns to healthy, Crystade closes the incident.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>To tolerate inaccuracies, we use a \u003Cstrong>K-out-of-N windowed hysteresis\u003C\u002Fstrong> algorithm.\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Ch3>\u003Cstrong>What is hysteresis?\u003C\u002Fstrong>\u003C\u002Fh3>\u003Cp>Hysteresis means the threshold to open an incident is different from the threshold to close it, preventing rapid open\u002Fclose cycles (flapping). The algorithm uses three configurable parameters:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Ccode>failure_count\u003C\u002Fcode> – number of failed checks required to open an incident\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ccode>recovery_streak\u003C\u002Fcode> – number of consecutive healthy checks required to close an incident\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ccode>window_size\u003C\u002Fcode> – total number of recent checks considered\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>Constraints: \u003Ccode>1 &lt;= failure_count &lt;= recovery_streak &lt;= window_size &lt;= 10\u003C\u002Fcode>\u003C\u002Fp>\u003Cp>By default:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>Trigger an incident after \u003Cstrong>3 failed checks out of 5\u003C\u002Fstrong> (\u003Ccode>failure_count=3\u003C\u002Fcode>, \u003Ccode>window_size=5\u003C\u002Fcode>)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>Resolve an incident after \u003Cstrong>5 consecutive successful checks\u003C\u002Fstrong> (\u003Ccode>recovery_streak=5\u003C\u002Fcode>)\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>This means a temporary glitch won’t page your team, but a sustained outage will. And recovery requires a bit more evidence than failure, reducing the chance of premature closure.\u003C\u002Fp>\u003Cimg src=\"https:\u002F\u002Fcdn.crystade.com\u002Fgrowth-media\u002F2026\u002F08\u002Fdedb69a4-8ad1-4bd5-a316-20fe4143017b-Screenshot_2026-08-20_184009.png\" alt=\"Screenshot 2026-08-20 184009.png\" data-size=\"lg\" class=\"block mx-auto border border-base-300 rounded-lg max-w-lg w-full\">\u003Ch3>\u003Cstrong>Benefits\u003C\u002Fstrong>\u003C\u002Fh3>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>Less manual toil\u003C\u002Fstrong> – no need to manually open or close incidents; Crystade handles it.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Fewer false positives\u003C\u002Fstrong> – the hysteresis algorithm filters out transient noise.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Clear incident state\u003C\u002Fstrong> – at most one incident is open per assertion-monitor pair, respecting hysteresis.\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Chr>\u003Ch2>\u003Cstrong>WYSIWYG Incident Response Editor\u003C\u002Fstrong>\u003C\u002Fh2>\u003Cp>Collaborating during an incident is now much easier. We’ve added a \u003Cstrong>WYSIWYG (What You See Is What You Get)\u003C\u002Fstrong> editor for incident responses. You can:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>Format text with headings, bold, italic, lists, and more\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>Mention team members, assertions, monitors, and incidents using \u003Ccode>@\u003C\u002Fcode> or the mention picker\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>This improves communication by keeping all context inside the incident timeline. Instead of copying IDs or explaining which monitor failed, you can directly reference the resources involved.\u003C\u002Fp>\u003Cimg src=\"https:\u002F\u002Fcdn.crystade.com\u002Fgrowth-media\u002F2026\u002F08\u002Fe3159dd0-035c-4037-989c-90b2d52b3622-HP3lNtRbMAAcGSk.gif\" alt=\"HP3lNtRbMAAcGSk.gif\" data-size=\"lg\" class=\"block mx-auto border border-base-300 rounded-lg max-w-lg w-full\">\u003Chr>\u003Ch2>\u003Cstrong>Summary\u003C\u002Fstrong>\u003C\u002Fh2>\u003Cp>This update makes Crystade’s monitoring more accessible, intelligent, and collaborative:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>JavaScript assertions\u003C\u002Fstrong> replace a niche DSL, lowering the barrier to custom checks.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Team-scoped assertions\u003C\u002Fstrong> reduce duplication and simplify management.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Custom incident templates and severity\u003C\u002Fstrong> give you full control over alerting.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Automatic incident lifecycle with hysteresis\u003C\u002Fstrong> reduces noise and manual work.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Rich incident responses\u003C\u002Fstrong> improve team coordination during outages.\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>Ready to try the new features? \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" class=\"link link-primary markdown-link\" href=\"https:\u002F\u002Fcrystade.com\u002F\">Sign in to Crystade\u003C\u002Fa> or create a free account to get started. If you have feedback or questions, reach out to our support team – we’d love to hear from you.\u003C\u002Fp>","published",[11,12,13],"monitor","assertion","incident",{"id":15,"url":16},"27784630-737f-4d3c-b3b7-37c78f7a1713","https:\u002F\u002Fcdn.crystade.com\u002Fgrowth-media\u002F2026\u002F08\u002F9c05e6b4-d404-4513-b25e-7ada898bd6ef-Change_art_style_202608201851.jpeg",{"id":18,"name":19,"bio":20,"avatar":21},"83c59046-756d-4aee-b49b-84a2cbd2491b","민준","Building pixels, logic, and a little happiness. Every line of code is another step toward something meaningful.",{"id":22,"url":23},"6bf343af-c883-4da7-a162-131f1e829094","https:\u002F\u002Fcdn.crystade.com\u002Fgrowth-media\u002F2026\u002F08\u002F5a23300b-ff16-4e43-9c10-fd82a8b3c2f5-Boy_avatar_different_angle_202608041410.jpeg","2026-08-20T11:52:10.710Z","2026-08-20T12:04:57.823Z",{"id":27,"name":28,"slug":29,"description":30,"sortOrder":31},"ba8d305a-5b1b-4c2c-bb4a-63b5078030c1","Release Radar","release-radar","Product announcements, changelogs, new features, and version breakdowns.",0,{"data":33,"meta":75},[34,40,61],{"id":4,"slug":5,"title":6,"excerpt":7,"status":9,"tags":35,"createdAt":24,"coverMedia":36,"author":37,"category":39},[11,12,13],{"id":15,"url":16},{"id":18,"name":19,"bio":20,"avatar":38},{"id":22,"url":23},{"id":27,"name":28,"slug":29,"description":30,"sortOrder":31},{"id":41,"slug":42,"title":43,"excerpt":44,"status":9,"tags":45,"createdAt":49,"coverMedia":50,"author":53,"category":60},"199123c1-65d9-4900-8baf-5bc230d6471f","fixing-paddle-payments-after-our-domain-split","Fixing Paddle Payments After Our Domain Split","We resolved our Paddle checkout issue after migrating our application to app.crystade.com. Learn how we cleared Cloudflare Worker blockers and restored seamless billing.",[11,46,47,48],"paddle","payment","cloudflare","2026-08-13T13:54:05.845Z",{"id":51,"url":52},"521b9646-f693-4645-b532-731007d8f344","https:\u002F\u002Fcdn.crystade.com\u002Fgrowth-media\u002F2026\u002F08\u002F06041a0d-b229-41ef-8d82-d88b4ad09808-Robot_at_store_cashier_202608132053.jpeg",{"id":54,"name":55,"bio":56,"avatar":57},"a9be23b5-5867-4dd9-a173-2c11307c4ded","Anh Huynh","Building stuffs",{"id":58,"url":59},"64bab758-67e7-4a67-9636-bf1318378571","https:\u002F\u002Fcdn.crystade.com\u002Fgrowth-media\u002F2026\u002F08\u002F3241ce71-aaa9-42a4-ac8d-552f8a465b6d-749022732_18368643070237484_2800348978445528529_n.jpg",{"id":27,"name":28,"slug":29,"description":30,"sortOrder":31},{"id":62,"slug":63,"title":64,"excerpt":65,"status":9,"tags":66,"createdAt":68,"coverMedia":69,"author":72,"category":74},"c8ee5668-9bb7-4358-afe3-b16491d9f642","upcoming-monitor-assertions-and-incident","Upcoming: Monitor assertions and Incident","Our next revamp to monitor and incident feature",[11,12,67,13],"checkscript","2026-08-05T13:27:06.951Z",{"id":70,"url":71},"77987a12-88e7-4be5-b8a4-48228a354d45","https:\u002F\u002Fcdn.crystade.com\u002Fgrowth-media\u002F2026\u002F08\u002Fe653f85a-1dd8-461c-8d17-92a821d1a307-Radar_pipeline_illustration_202608052109.jpeg",{"id":54,"name":55,"bio":56,"avatar":73},{"id":58,"url":59},{"id":27,"name":28,"slug":29,"description":30,"sortOrder":31},{"total":76,"page":77,"pageSize":78},3,1,4]