Files
nexus/sreweekly/articles/513/05-the-on-call-problem-ai-can-actually-solve.html
2026-09-12 17:23:01 +08:00

193 lines
29 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}
gtag("consent","default",{ad_storage:"denied",analytics_storage:"denied",ad_user_data:"denied",ad_personalization:"denied",wait_for_update:500,region:["AT","BE","BG","HR","CY","CZ","DK","EE","FI","FR","DE","GR","HU","IE","IT","LV","LT","LU","MT","NL","PL","PT","RO","SK","SI","ES","SE","IS","LI","NO","GB"]});
gtag("consent","default",{ad_storage:"granted",analytics_storage:"granted",ad_user_data:"granted",ad_personalization:"granted"});
window._hsp=window._hsp||[];
window._hsp.push(["addPrivacyConsentListener",function(consent){var cat=consent&&consent.categories;var analytics=!!(cat&&cat.analytics);var ads=!!(cat&&cat.advertisement);gtag("consent","update",{analytics_storage:analytics?"granted":"denied",ad_storage:ads?"granted":"denied",ad_user_data:ads?"granted":"denied",ad_personalization:ads?"granted":"denied"});}]);</script><script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer',"GTM-TX44QHS2");</script><script>window.disableHubSpotCookieBanner=true;</script><!-- If you POST via Forms API, disable HubSpot “Collect data from website forms” (Settings → Marketing → Forms → Non-HubSpot Forms) or you’ll get duplicate submissions from tracking. --><script type="text/javascript" id="hs-script-loader" async defer src="https://js-na2.hs-scripts.com/243729089.js"></script><title>Closing the On-Call Knowledge Gap with AI | Herald Blog</title><meta name="description" content="SREcon EMEA Chair Heinrich Hartmann on why AI's highest-value SRE application isn't autonomous remediation — it's closing the on-call knowledge gap."><link rel="canonical" href="https://herald.dev/blog/the-on-call-problem-ai-can-actually-solve/"><!-- Open Graph --><meta property="og:type" content="website"><meta property="og:site_name" content="Herald"><meta property="og:title" content="Closing the On-Call Knowledge Gap with AI | Herald Blog"><meta property="og:description" content="SREcon EMEA Chair Heinrich Hartmann on why AI's highest-value SRE application isn't autonomous remediation — it's closing the on-call knowledge gap."><meta property="og:url" content="https://herald.dev/blog/the-on-call-problem-ai-can-actually-solve/"><meta property="og:image" content="https://herald.dev/og-default.png"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630"><!-- Twitter / X --><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Closing the On-Call Knowledge Gap with AI | Herald Blog"><meta name="twitter:description" content="SREcon EMEA Chair Heinrich Hartmann on why AI's highest-value SRE application isn't autonomous remediation — it's closing the on-call knowledge gap."><meta name="twitter:image" content="https://herald.dev/og-default.png"><link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"><link rel="icon" href="/favicon.svg" type="image/svg+xml" sizes="any"><link rel="icon" href="/favicon.ico"><link rel="apple-touch-icon" href="/apple-touch-icon.png"><link rel="manifest" href="/site.webmanifest"><meta name="theme-color" content="#F2F3F5" media="(prefers-color-scheme: light)"><meta name="theme-color" content="#0B0E1C" media="(prefers-color-scheme: dark)"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&#38;family=JetBrains+Mono:wght@400;500&#38;display=swap" rel="stylesheet"><link rel="stylesheet" href="/_astro/Footer.D35d5Zyb.css">
<style>.breadcrumb:where(.astro-mrlui5p2){display:flex;align-items:center;gap:var(--sp-2);font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-tertiary);margin-bottom:var(--sp-5)}.breadcrumb:where(.astro-mrlui5p2) a:where(.astro-mrlui5p2){color:var(--text-tertiary);transition:color var(--duration-fast) var(--ease-default)}.breadcrumb:where(.astro-mrlui5p2) a:where(.astro-mrlui5p2):hover{color:var(--text-secondary)}.breadcrumb-sep:where(.astro-mrlui5p2){color:var(--border-default)}
</style>
<link rel="stylesheet" href="/_astro/_slug_@_@astro.yKHTB8D6.css">
<style>#hs_show_banner_button,#hs-hud-cookie-settings,#hs-cookie-settings-link,#hs-banner-parent{display:none!important}.consent-banner:where(.astro-2effgw6e){position:fixed;z-index:3000;bottom:var(--sp-6);right:var(--sp-6);width:min(100% - var(--sp-8),22rem);pointer-events:none;opacity:0;transform:translateY(var(--sp-4));transition:opacity var(--duration-mid) var(--ease-default),transform var(--duration-mid) var(--ease-default)}.consent-banner:where(.astro-2effgw6e)[data-visible=true]{pointer-events:auto;opacity:1;transform:translateY(0)}.consent-banner-panel:where(.astro-2effgw6e){background:var(--surface-overlay);border:1px solid var(--border-default);border-radius:var(--radius-md);box-shadow:0 2px 8px #00000014;padding:var(--sp-5);display:flex;flex-direction:column;gap:var(--sp-3)}.consent-banner-eyebrow:where(.astro-2effgw6e){font-family:var(--font-mono);font-size:var(--text-xs);line-height:var(--lh-xs);letter-spacing:.12em;text-transform:uppercase;color:var(--text-secondary)}.consent-banner-title:where(.astro-2effgw6e){font-size:var(--text-sm);line-height:var(--lh-sm);font-weight:600;color:var(--text-primary)}.consent-banner-desc:where(.astro-2effgw6e){font-size:var(--text-sm);line-height:var(--lh-sm);color:var(--text-secondary)}.consent-banner-inline-link:where(.astro-2effgw6e){color:inherit;text-decoration:underline;text-decoration-color:var(--border-default);text-underline-offset:2px;transition:color var(--duration-fast) var(--ease-default)}.consent-banner-inline-link:where(.astro-2effgw6e):hover{color:var(--text-primary)}.consent-banner-actions:where(.astro-2effgw6e){display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-1)}.consent-banner-btn:where(.astro-2effgw6e){flex:1 1 auto;justify-content:center;min-width:6.5rem}.consent-banner-btn:where(.astro-2effgw6e):focus-visible{outline:3px solid var(--brand-cta-ring);outline-offset:2px}@media(max-width:768px){.consent-banner:where(.astro-2effgw6e){bottom:0;right:0;left:0;width:auto;transform:translateY(100%)}.consent-banner:where(.astro-2effgw6e)[data-visible=true]{transform:translateY(0)}.consent-banner-panel:where(.astro-2effgw6e){border-radius:var(--radius-md) var(--radius-md) 0 0;border-bottom:none;padding:var(--sp-4) var(--sp-5) var(--sp-5)}.consent-banner-actions:where(.astro-2effgw6e){flex-direction:column}.consent-banner-btn:where(.astro-2effgw6e){width:100%}}
</style><script type="module" src="/_astro/page.CIKwc7qe.js"></script></head> <body> <noscript> <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-TX44QHS2" height="0" width="0" style="display:none;visibility:hidden" title="Google Tag Manager"></iframe> </noscript> <header class="nav astro-dmqpwcec"> <div class="nav-inner container astro-dmqpwcec"> <a href="/" class="nav-logo astro-dmqpwcec" aria-label="Herald"> <picture class="astro-dmqpwcec"> <source srcset="/brand/Herald_Lockup_White.svg" media="(prefers-color-scheme: dark)" class="astro-dmqpwcec"> <img src="/brand/Herald_Lockup_Black.svg" alt="Herald" height="20" class="astro-dmqpwcec"> </picture> </a> <nav aria-label="Main navigation" class="astro-dmqpwcec"> <ul class="nav-links astro-dmqpwcec"> <li class="astro-dmqpwcec"> <a href="/product" class="nav-link astro-dmqpwcec">Product</a> </li><li class="astro-dmqpwcec"> <a href="/pricing" class="nav-link astro-dmqpwcec">Pricing</a> </li><li class="astro-dmqpwcec"> <a href="/about" class="nav-link astro-dmqpwcec">About</a> </li><li class="astro-dmqpwcec"> <a href="/platform" class="nav-link astro-dmqpwcec">Platform</a> </li><li class="astro-dmqpwcec"> <a href="/docs/" class="nav-link astro-dmqpwcec">Docs</a> </li> </ul> </nav> <div class="nav-ctas astro-dmqpwcec"> <a href="/contact" class="hero-text-link nav-secondary-cta astro-dmqpwcec" data-cta-location="nav_secondary"> Book a Demo </a> <a href="/try" class="btn btn-primary nav-cta astro-dmqpwcec" data-cta-location="nav"> Try for Free </a> </div> <button class="hamburger astro-dmqpwcec" aria-label="Toggle menu" aria-expanded="false" aria-controls="mobile-menu"> <span class="astro-dmqpwcec"></span> <span class="astro-dmqpwcec"></span> <span class="astro-dmqpwcec"></span> </button> </div> <div class="mobile-menu astro-dmqpwcec" id="mobile-menu" hidden> <ul class="mobile-links astro-dmqpwcec"> <li class="astro-dmqpwcec"> <a href="/product" class="mobile-link astro-dmqpwcec">Product</a> </li><li class="astro-dmqpwcec"> <a href="/pricing" class="mobile-link astro-dmqpwcec">Pricing</a> </li><li class="astro-dmqpwcec"> <a href="/about" class="mobile-link astro-dmqpwcec">About</a> </li><li class="astro-dmqpwcec"> <a href="/platform" class="mobile-link astro-dmqpwcec">Platform</a> </li><li class="astro-dmqpwcec"> <a href="/docs/" class="mobile-link astro-dmqpwcec">Docs</a> </li> </ul> <a href="/try" class="btn btn-primary mobile-cta astro-dmqpwcec" data-cta-location="nav_mobile"> Try for Free </a> <a href="/contact" class="hero-text-link mobile-secondary-cta astro-dmqpwcec" data-cta-location="nav_mobile_secondary"> Book a Demo </a> </div> </header> <script type="module">const e=document.querySelector(".hamburger"),i=document.getElementById("mobile-menu");e?.addEventListener("click",()=>{const t=e.getAttribute("aria-expanded")==="true";e.setAttribute("aria-expanded",String(!t)),e.classList.toggle("is-open",!t),t?i?.setAttribute("hidden",""):i?.removeAttribute("hidden")});</script> <main class="astro-4sn4zg3r"> <article class="astro-4sn4zg3r"> <!-- Post header --> <header class="post-header astro-4sn4zg3r"> <div class="post-header-inner container-narrow astro-4sn4zg3r"> <nav class="breadcrumb astro-mrlui5p2" aria-label="Breadcrumb"> <a href="/blog" class="astro-mrlui5p2">Blog</a> </nav> <h1 class="post-title astro-4sn4zg3r">The On-Call Problem AI Can Actually Solve</h1> <p class="post-excerpt astro-4sn4zg3r">Heinrich Hartmann argues AI’s most valuable role isn’t autonomous remediation. It’s ensuring on-call engineers have the context they need to fix incidents fast.</p> <div class="post-meta astro-4sn4zg3r"> <div class="meta-line meta-line--authors astro-4sn4zg3r"> <span class="meta-author astro-4sn4zg3r"> <img src="https://cdn.sanity.io/images/b3uvbvvc/production/9bcd3886060c22273870f55ed0342c5e6ac92fd2-700x467.jpg?rect=117,0,467,467&#38;w=56&#38;h=56&#38;fit=crop" alt="Peter Farago" class="author-avatar astro-4sn4zg3r" loading="lazy"> <span class="meta-author-text astro-4sn4zg3r"> <span class="author-name astro-4sn4zg3r">Peter Farago</span> <span class="meta-sep astro-4sn4zg3r">·</span> <span class="author-role astro-4sn4zg3r">VP Marketing</span> </span> </span> </div> <div class="meta-line astro-4sn4zg3r"> <time datetime="2026-03-10T07:22:00.000Z" class="meta-date astro-4sn4zg3r"> March 10, 2026 </time> </div> </div> </div> </header> <!-- Main image --> <div class="post-hero-shell astro-4sn4zg3r"> <div class="post-hero-image astro-4sn4zg3r"> <img src="https://cdn.sanity.io/images/b3uvbvvc/production/533defc62d44f44ade5efd1d17b3cbda7fe59fd3-781x781.jpg?rect=0,186,781,410&#38;w=1200&#38;h=630&#38;fit=crop" alt="The On-Call Problem AI Can Actually Solve" loading="eager" class="astro-4sn4zg3r"> </div> </div> <!-- Series banner --> <!-- Body --> <div class="post-body container-narrow astro-4sn4zg3r"> <div class="prose astro-4sn4zg3r"><p><strong>The 3 a.m. Problem Isn&#x27;t Technical.</strong></p><p><a href="https://www.linkedin.com/in/heinrich-hartmann-b524a076/" target="_blank" rel="noopener noreferrer">Heinrich Hartmann</a> thinks about on-call readiness the way most people think about sleep: you don&#x27;t notice it until it&#x27;s gone.</p><p>Ahead of an on-call shift, engineers worry about things like: &quot;What are all the services I&#x27;m supposed to be on call for? What are the typical failures, the drills I have to have down? What are the major risks? What&#x27;s the trickiest thing I could run into?&quot;</p><p>&quot;This will affect my sleep, actually,&quot; he says. &quot;If I don&#x27;t know those things, I could be setting myself up for a miserable late-night session with a system I barely understand. And that would be extremely bad.&quot;</p><p>The stakes are real. &quot;If there are millions of euros going down the drain while people wait on you to resolve an issue,&quot; he says. &quot;You don&#x27;t sleep well unless you have your drills down.&quot;</p><p>And remote work made it worse. &quot;When everyone&#x27;s remote, you&#x27;re no longer just picking things up from the people around you,&quot; Heinrich says. &quot;You can be at a company for three years without having touched the service that just went down. You haven’t committed a single line, and have no idea how it works.&quot;</p><p>Heinrich calls it &quot;a knowledge management issue&quot;: Experienced engineers hold enough context to be effective at debugging. Others are hoping it’s going to be quiet during their on-call, or that the right playbook will be available.Most conversations about AI in SRE start with the end state: self-managing systems, autonomous remediation, <em>the end of on-call</em> as we know it. Heinrich starts somewhere else: the engineer sitting alone with a pager, wondering whether they&#x27;ll know enough to respond when it goes off.</p><p><strong>Print the Code. Grab a Highlighter. Go to a Coffee Shop.</strong></p><p>Heinrich remembers how he used to get familiar with a new codebase.</p><p>&quot;Sometimes I would just print out the whole source code, like a big book,&quot; he says, &quot;and then I would go to a coffee shop with a highlighter, and start figuring out what&#x27;s in there.&quot;</p><p>Today, the printer sees a lot less action, and he usually just points an AI tool at a codebase and asks: &quot;What&#x27;s in there? Give me a rundown of the core components, which are the most important classes, how are they wired together?&quot;</p><p>&quot;I wasn&#x27;t able to ask these questions before,&quot; he says. Code exploration used to mean grep, find, and a lot of patience. &quot;Now it&#x27;s conversational, and onboarding is faster.&quot;</p><p>On-call readiness is a codebase comprehension problem as much as an operational one. An engineer who understands how services are wired together – what depends on what, where the fragile points are, what a deployment actually changed – resolves incidents faster. The 3 a.m. page becomes less terrifying when you&#x27;ve spent an afternoon walking through the codebase with AI assistance, and can quickly merge a PR to fix a nit.</p><p>But codebase comprehension is only half the picture. The other half is operational knowledge: what failed before, how it was fixed, which dashboards matter for which alerts? That knowledge often lives in Slack threads, post-mortems, and the heads of senior engineers who&#x27;ve been at the company long enough to have seen every failure mode at least once.</p><p>Heinrich sees both halves as the same problem. &quot;Maybe the task gets easier if you have a copilot,&quot; he says. &quot;But how do you absorb all that knowledge?&quot; The question isn&#x27;t whether AI can diagnose a production issue autonomously. It&#x27;s whether AI can help an engineer absorb enough context to be effective before the page fires.</p><p><strong>Curate Knowledge. Earn Sleep.</strong></p><p>Heinrich&#x27;s vision for AI in SRE starts with documents, not dashboards or anomaly detection.</p><p>&quot;I want a copilot that indexes company knowledge and gives me fast access,&quot; he says. &quot;Source code would be good, but definitely recent deployments and the playbooks.&quot; He also wants to &quot;auto-generate playbooks from past experiences, pair up with senior engineers, and co-create these documents.&quot;</p><p>The goal isn&#x27;t to replace engineers with automation. It&#x27;s to make the knowledge that senior engineers carry available to everyone, surfaced in context, at the moment it matters. &quot;We want the AI to know what&#x27;s relevant and surface it to engineers so they have the right context,&quot; he says. Engineers don&#x27;t need to memorize every playbook. They need the right one to appear when the pager fires at 3 a.m.”</p><p>Heinrich sees this as the most impactful work in the broader AI space right now as: &quot;Make sure you get the right model with the right context to the right people in the right situation.&quot; For operations this means the on-call engineer has a powerful AI model by his side, which knows all the relevant playbooks, the last incidents affecting that service, and the deployment diff from that afternoon.</p><p>It&#x27;s also the work many teams in the space are skipping. &quot;I haven&#x27;t seen many people jump on the knowledge management side,” he says. &quot;They all go to &#x27;let&#x27;s solve real production issues with telemetry data,&#x27; which is harder.&quot;</p><p>That&#x27;s the on-call problem AI can solve today. Not a system that tries to fix the incident autonomously — a system that makes sure the on-call engineer responding knows what this service does, what broke last time, and what steps actually resolved it. It closes the distance between the senior engineer who&#x27;s seen every failure mode and the mid-career engineer who&#x27;s been at the company for five years but never touched three of the services on the rotation. Curate the knowledge. Earn the sleep.</p><p>&lt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&lt;+&gt;&gt;</p><p><strong>Heinrich Hartmann is a Senior Principal SRE, host of the CASE Podcast, Chair of SREcon EMEA 2025, and organizer of</strong><a href="https://signalsconf.io/" target="_blank" rel="noopener noreferrer"> Signals Berlin 2026</a><strong>, a single-track conference on reliability in the age of AI (Berlin, September 2026). Read more at his </strong><a href="https://heinrichhartmann.com/" target="_blank" rel="noopener noreferrer">personal blog</a><strong>.</strong></p></div> </div> <!-- Author bio --> <footer class="post-footer container-narrow astro-4sn4zg3r"> <div class="author-bios astro-4sn4zg3r"> <div class="author-bio-card astro-4sn4zg3r"> <img src="https://cdn.sanity.io/images/b3uvbvvc/production/9bcd3886060c22273870f55ed0342c5e6ac92fd2-700x467.jpg?rect=117,0,467,467&#38;w=80&#38;h=80&#38;fit=crop" alt="Peter Farago" class="bio-avatar astro-4sn4zg3r"> <div class="bio-content astro-4sn4zg3r"> <div class="bio-header astro-4sn4zg3r"> <span class="bio-name astro-4sn4zg3r">Peter Farago</span> <span class="bio-role astro-4sn4zg3r">VP Marketing</span> <div class="bio-links astro-4sn4zg3r"> <a href="https://x.com/peter_farago" target="_blank" rel="noopener noreferrer" class="bio-link astro-4sn4zg3r">
X / Twitter
</a> <a href="https://www.linkedin.com/in/peterfarago/" target="_blank" rel="noopener noreferrer" class="bio-link astro-4sn4zg3r">
LinkedIn
</a> </div> </div> <p class="bio-text astro-4sn4zg3r">Peter has led marketing for several Silicon Valley startups. He co-founded Flurry Analytics, acquired by Yahoo, was CMO for Acompli, acquired by Microsoft. He was founding VP Marketing at HackerOne, led marketing for a global franchise at Electronic Arts and was VP of Growth &amp; Monetization for Yahoo. Peter earned an MBA from the Wharton School and a B.S. from UC Berkeley.</p> </div> </div> </div> <div class="back-link astro-4sn4zg3r"> <a href="/blog" class="astro-4sn4zg3r">← All posts</a> </div> </footer> </article> </main> <footer class="footer astro-sz7xmlte"> <div class="footer-main container astro-sz7xmlte"> <div class="footer-brand astro-sz7xmlte"> <a href="/" aria-label="Herald" class="astro-sz7xmlte"> <picture class="astro-sz7xmlte"> <source srcset="/brand/Herald_Lockup_White.svg" media="(prefers-color-scheme: dark)" class="astro-sz7xmlte"> <img src="/brand/Herald_Lockup_Black.svg" alt="Herald" height="24" class="astro-sz7xmlte"> </picture> </a> <p class="footer-tagline astro-sz7xmlte">Toil Less. Build More. Love Work.</p> <p class="footer-copy astro-sz7xmlte">© 2026 RunLLM, Inc. All rights reserved.</p> </div> <div class="footer-cols astro-sz7xmlte"> <div class="footer-col astro-sz7xmlte"> <span class="footer-col-label astro-sz7xmlte">Company</span> <ul class="astro-sz7xmlte"> <li class="astro-sz7xmlte"><a href="/product" class="footer-link astro-sz7xmlte">Product</a></li><li class="astro-sz7xmlte"><a href="/pricing" class="footer-link astro-sz7xmlte">Pricing</a></li><li class="astro-sz7xmlte"><a href="/about" class="footer-link astro-sz7xmlte">About</a></li><li class="astro-sz7xmlte"><a href="/platform" class="footer-link astro-sz7xmlte">Platform</a></li><li class="astro-sz7xmlte"><a href="/docs/" class="footer-link astro-sz7xmlte">Docs</a></li> <li class="astro-sz7xmlte"> <a href="https://trust.herald.dev" class="footer-link astro-sz7xmlte" target="_blank" rel="noopener noreferrer">
Trust
</a> </li> <li class="astro-sz7xmlte"><a href="/blog" class="footer-link astro-sz7xmlte">Blog</a></li> </ul> </div> <div class="footer-col astro-sz7xmlte"> <span class="footer-col-label astro-sz7xmlte">Contact</span> <ul class="astro-sz7xmlte"> <li class="astro-sz7xmlte"> <a href="mailto:sales@herald.dev" class="footer-link astro-sz7xmlte">sales@herald.dev</a> </li> <li class="astro-sz7xmlte"> <a href="https://app.herald.dev" class="footer-link footer-link-cta astro-sz7xmlte" target="_blank" rel="noopener noreferrer"> Try it now →
</a> </li> <li class="astro-sz7xmlte"> <a href="/contact" class="footer-link footer-link-cta astro-sz7xmlte" data-cta-location="footer"> Book a Demo →
</a> </li> </ul> </div> <div class="footer-col astro-sz7xmlte"> <span class="footer-col-label astro-sz7xmlte">Legal</span> <ul class="astro-sz7xmlte"> <li class="astro-sz7xmlte"><a href="/legal/privacy" class="footer-link astro-sz7xmlte">Privacy Policy</a></li> <li class="astro-sz7xmlte"><a href="/legal/terms" class="footer-link astro-sz7xmlte">Terms of Service</a></li> <li class="astro-sz7xmlte"> <button type="button" class="footer-link footer-consent-link astro-sz7xmlte" data-open-consent>
Cookie preferences
</button> </li> </ul> </div> </div> </div> </footer> <div id="herald-consent-banner" class="consent-banner astro-2effgw6e" role="dialog" aria-modal="true" aria-labelledby="consent-banner-title" aria-describedby="consent-banner-desc" aria-hidden="true" inert data-visible="false"> <div class="consent-banner-panel astro-2effgw6e"> <p class="consent-banner-eyebrow astro-2effgw6e">Privacy</p> <p id="consent-banner-title" class="consent-banner-title astro-2effgw6e">Cookie preferences</p> <p id="consent-banner-desc" class="consent-banner-desc astro-2effgw6e"> Herald uses cookies for analytics and marketing. You can accept or decline non-essential
cookies. See our <a href="/legal/privacy" class="consent-banner-inline-link astro-2effgw6e">Privacy Policy</a> for
details.
</p> <div class="consent-banner-actions astro-2effgw6e"> <button type="button" class="btn btn-primary consent-banner-btn astro-2effgw6e" data-consent-action="accept">
Accept
</button> <button type="button" class="btn btn-ghost consent-banner-btn astro-2effgw6e" data-consent-action="decline">
Decline
</button> </div> </div> </div> <script>(function(){
var STORAGE_KEY="herald-consent-v1";
var HUBSPOT_COOKIE_UI_SELECTORS=["#hs_show_banner_button","#hs-hud-cookie-settings","#hs-cookie-settings-link","#hs-banner-parent"];
function removeHubSpotCookieUi() {
HUBSPOT_COOKIE_UI_SELECTORS.forEach(function(sel) {
document.querySelectorAll(sel).forEach(function(el) {
el.remove();
});
});
}
function watchHubSpotCookieUi() {
removeHubSpotCookieUi();
if (!window.MutationObserver || !document.body) return;
var observer = new MutationObserver(removeHubSpotCookieUi);
observer.observe(document.body, { childList: true, subtree: true });
}
function updateGoogleConsent(analytics, advertisement) {
if (typeof gtag !== 'function') return;
var state = function(v) { return v ? 'granted' : 'denied'; };
gtag('consent', 'update', {
analytics_storage: state(analytics),
ad_storage: state(advertisement),
ad_user_data: state(advertisement),
ad_personalization: state(advertisement),
});
}
function updateHubSpotConsent(analytics, advertisement) {
window._hsp = window._hsp || [];
window._hsp.push(['setHubSpotConsent', {
analytics: !!analytics,
advertisement: !!advertisement,
functionality: true,
}]);
}
window.applySiteConsent = function(choices) {
var analytics = !!choices.analytics;
var advertisement = !!choices.advertisement;
try {
localStorage.setItem(STORAGE_KEY, JSON.stringify({
analytics: analytics,
advertisement: advertisement,
ts: Date.now(),
}));
} catch (e) {}
updateGoogleConsent(analytics, advertisement);
updateHubSpotConsent(analytics, advertisement);
document.dispatchEvent(new CustomEvent('herald:consent-update', {
detail: { analytics: analytics, advertisement: advertisement },
}));
};
window.openSiteConsentBanner = function() {
var banner = document.getElementById('herald-consent-banner');
if (!banner) return;
banner.removeAttribute('inert');
banner.setAttribute('aria-hidden', 'false');
banner.dataset.visible = 'true';
var acceptBtn = banner.querySelector('[data-consent-action="accept"]');
if (acceptBtn && typeof acceptBtn.focus === 'function') acceptBtn.focus();
};
window.closeSiteConsentBanner = function() {
var banner = document.getElementById('herald-consent-banner');
if (!banner) return;
banner.dataset.visible = 'false';
banner.setAttribute('aria-hidden', 'true');
banner.setAttribute('inert', '');
};
function readStoredConsent() {
try {
var raw = localStorage.getItem(STORAGE_KEY);
if (!raw) return null;
var parsed = JSON.parse(raw);
if (typeof parsed.analytics !== 'boolean') return null;
if (typeof parsed.advertisement !== 'boolean') return null;
return parsed;
} catch (e) {
return null;
}
}
function initConsent() {
var stored = readStoredConsent();
if (stored) {
window.applySiteConsent(stored);
return;
}
window.openSiteConsentBanner();
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function() {
watchHubSpotCookieUi();
initConsent();
});
} else {
watchHubSpotCookieUi();
initConsent();
}
document.addEventListener('click', function(e) {
var trigger = e.target && e.target.closest ? e.target.closest('[data-open-consent]') : null;
if (!trigger) return;
e.preventDefault();
window.openSiteConsentBanner();
});
})();</script> <script>
(function () {
var banner = document.getElementById('herald-consent-banner');
if (!banner) return;
banner.addEventListener('click', function (e) {
var btn = e.target && e.target.closest ? e.target.closest('[data-consent-action]') : null;
if (!btn) return;
var action = btn.getAttribute('data-consent-action');
if (action === 'accept') {
window.applySiteConsent({ analytics: true, advertisement: true });
} else if (action === 'decline') {
window.applySiteConsent({ analytics: false, advertisement: false });
} else {
return;
}
window.closeSiteConsentBanner();
});
})();
</script> <script>(function(){
window.dataLayer=window.dataLayer||[];
window.pushSiteAnalyticsEvent=window.pushSiteAnalyticsEvent||function(eventName,params){
window.dataLayer.push(Object.assign({event:eventName},params||{}));
};
document.addEventListener('click',function(e){
var link=e.target&&e.target.closest?e.target.closest('a[href^="mailto:"]'):null;
if(!link)return;
var href=(link.getAttribute('href')||'').replace(/^mailto:/i,'').split(/[?#]/)[0].trim().toLowerCase();
if(href!=="sales@herald.dev")return;
window.pushSiteAnalyticsEvent("sales_email_click",{
link_text:(link.textContent||'').trim(),
link_href:link.getAttribute('href')||'',
page_location:window.location.href,
page_path:window.location.pathname
});
},true);
document.addEventListener('click',function(e){
var link=e.target&&e.target.closest?e.target.closest('a[data-cta-location]'):null;
if(!link)return;
var ctaLocation=link.getAttribute('data-cta-location');
if(!ctaLocation)return;
var params={
cta_text:(link.textContent||'').replace(/\s+/g,' ').trim(),
cta_location:ctaLocation,
cta_destination:link.getAttribute('href')||'',
page_location:window.location.href,
page_path:window.location.pathname
};
var pricingTier=link.getAttribute('data-pricing-tier');
if(pricingTier)params.pricing_tier=pricingTier;
window.pushSiteAnalyticsEvent("cta_click",params);
},true);
})();</script></body></html>