28 lines
157 KiB
HTML
28 lines
157 KiB
HTML
<!DOCTYPE html><html class="has-data-[in-page-nav=true]:scroll-p-34 lg:has-data-[in-page-nav=true]:scroll-p-20 has-[ol]:scroll-smooth" lang="en"><head><style type="text/css" data-next-head="">
|
||
:root {
|
||
--font-matter: 'matterFont', 'matterFont Fallback';
|
||
--font-dm-mono: 'dmMono', 'dmMono Fallback';
|
||
--font-jet-brains-mono: 'JetBrains Mono', 'JetBrains Mono Fallback';
|
||
--font-inter: 'Inter', 'Inter Fallback';
|
||
}
|
||
</style><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, shrink-to-fit=no" data-next-head=""/><meta name="theme-color" content="#fffcf8" data-next-head=""/><link rel="apple-touch-icon" sizes="180x180" href="/favicon/apple-touch-icon.png" data-next-head=""/><link rel="icon" type="image/png" sizes="32x32" href="/favicon/favicon-32x32.png" data-next-head=""/><link rel="icon" type="image/png" sizes="16x16" href="/favicon/favicon-16x16.png" data-next-head=""/><link rel="manifest" href="/favicon/site.webmanifest" data-next-head=""/><link rel="mask-icon" href="/favicon/safari-pinned-tab.svg" color="#000000" data-next-head=""/><title data-next-head="">Post mortem: we took 124 seconds from you, here's 378 back</title><meta name="description" content="If you haven’t seen the global headlines yet: Graphite had an outage. In the interest of full transparency and accountability, I, Greg Foster, as the CTO and responding on-call engineer, want to give a full report of the incident, and reaffirm our commitment to our community and customers." data-next-head=""/><meta name="twitter:card" content="summary_large_image" data-next-head=""/><meta name="twitter:site" content="@graphite" data-next-head=""/><meta name="twitter:creator" content="@graphite" data-next-head=""/><meta name="twitter:title" content="Post mortem: we took 124 seconds from you, here's 378 back" data-next-head=""/><meta name="twitter:description" content="If you haven’t seen the global headlines yet: Graphite had an outage. In the interest of full transparency and accountability, I, Greg Foster, as the CTO and responding on-call engineer, want to give a full report of the incident, and reaffirm our commitment to our community and customers." data-next-head=""/><meta name="twitter:image" content="https://www.datocms-assets.com/85246/1701982310-fixed.png?fm=jpg&q=75&w=1200&h=630&fit=crop" data-next-head=""/><meta property="og:title" content="Post mortem: we took 124 seconds from you, here's 378 back" data-next-head=""/><meta property="og:description" content="If you haven’t seen the global headlines yet: Graphite had an outage. In the interest of full transparency and accountability, I, Greg Foster, as the CTO and responding on-call engineer, want to give a full report of the incident, and reaffirm our commitment to our community and customers." data-next-head=""/><meta property="og:site_name" content="Graphite" data-next-head=""/><meta property="og:url" content="https://staging-graphite-splash.vercel.app/blog/post-mortem-12-06-23" data-next-head=""/><meta property="og:image" content="https://www.datocms-assets.com/85246/1701982310-fixed.png?fm=jpg&q=75&w=1200&h=630&fit=crop" data-next-head=""/><meta property="og:image:alt" content="Post mortem: we took 124 seconds from you, here's 378 back" data-next-head=""/><meta property="og:image:width" content="1200" data-next-head=""/><meta property="og:image:height" content="630" data-next-head=""/><link rel="canonical" href="https://staging-graphite-splash.vercel.app/blog/post-mortem-12-06-23" data-next-head=""/><link rel="alternate" type="application/rss+xml" title="RSS Feed for petefreitag.com" href="/feed.xml"/><script>
|
||
(function() {
|
||
function getCookie(name) {
|
||
var cookies = document.cookie.split(';');
|
||
for (var i = 0; i < cookies.length; i++) {
|
||
var cookie = cookies[i].trim();
|
||
if (cookie.indexOf(name + '=') === 0) {
|
||
return cookie.substring(name.length + 1);
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
var cookie = getCookie("loggedIn");
|
||
if (window.location.pathname === "/" && cookie) {
|
||
var url = new URL("https://app.graphite.com");
|
||
url.search = window.location.search;
|
||
url.searchParams.set("redirected", "true");
|
||
window.location.href = url;
|
||
}
|
||
})();
|
||
</script><link rel="preload" href="/_next/static/media/MatterRegular-s.p.a1dc570b.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/MatterRegularItalic-s.p.7094561a.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/MatterMedium-s.p.9d516e3b.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/MatterMediumItalic-s.p.21558a2a.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/MatterSemiBold-s.p.8a088781.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/MatterSemiBoldItalic-s.p.d51d9f3c.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/DMMono_light-s.p.fdd3dd50.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/DMMono_light_italic-s.p.701be9e8.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/DMMono_regular-s.p.2e6dc724.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/DMMono_italic-s.p.4eee889a.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/DMMono_medium-s.p.fa7f462f.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/DMMono_medium_italic-s.p.30950d31.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/19087af2bdec32b5-s.p.ec718a33.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/83afe278b6a6bb3c-s.p.3a6ba036.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><script id="set-stage" data-nscript="beforeInteractive">window.STAGE = "undefined";</script><link rel="preload" href="/_next/static/chunks/d0e98280d773cdc7.css?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" as="style"/><link rel="stylesheet" href="/_next/static/chunks/d0e98280d773cdc7.css?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" data-n-g=""/><link rel="preload" href="/_next/static/chunks/143a91cba7c5a1c4.css?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" as="style"/><link rel="stylesheet" href="/_next/static/chunks/143a91cba7c5a1c4.css?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" data-n-g=""/><link rel="preload" href="/_next/static/chunks/1c0dd04c40bb88b9.css?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" as="style"/><link rel="stylesheet" href="/_next/static/chunks/1c0dd04c40bb88b9.css?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" data-n-p=""/><link rel="preload" href="/_next/static/chunks/4e87d6a824171741.css?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" as="style"/><link rel="stylesheet" href="/_next/static/chunks/4e87d6a824171741.css?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv"/><noscript data-n-css=""></noscript><script defer="" src="/_next/static/chunks/2d25b8a8ab069056.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv"></script><script defer="" src="/_next/static/chunks/fb0c3a5e6963d689.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv"></script><script src="/_next/static/chunks/884d29612cfe3bdb.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/chunks/24a66d6e4b525e14.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/chunks/6b8e8ea77ca1ffe5.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/chunks/e02bade43e3faae3.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/chunks/ceeaf640e4c16e66.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/chunks/278a7917e4346bce.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/chunks/84de96a25d47ea1d.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/chunks/b00e80b39eaccc22.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/chunks/turbopack-3d623e61d368e120.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/chunks/1cbfc46d207591d6.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/chunks/c4d6ac274e0c5520.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/chunks/318de0601bf93f2b.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/chunks/f2e32afd1ba9f9a6.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/chunks/114f5f9bb359a7a4.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/chunks/bef1cf00dff67378.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/chunks/d1dde5b51132732e.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/chunks/f9cd939ebd5bc405.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/chunks/turbopack-58bdd8120aeb4169.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/0Ku2uBfu23Pa9kZxkrE8D/_ssgManifest.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script><script src="/_next/static/0Ku2uBfu23Pa9kZxkrE8D/_buildManifest.js?dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv" defer=""></script></head><body><div id="__next"><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-WKH3LF8H" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}if(u)p(u);else try{let n=localStorage.getItem(i)||s,y=l&&n==="system"?c():n;p(y)}catch(n){}})("data-theme","theme","system","dark",["light","dark"],null,true,true)</script><a href="#main-content" class="absolute top-0 left-0 bg-white text-sm text-black p-2 z-50 opacity-0 pointer-events-none focus:opacity-100 focus:pointer-events-auto">Skip to content</a><a class="flex relative z-20 py-3 px-8 bg-popover sm:text-center text-balance items-center justify-center flex-nowrap gap-2 text-xs sm:text-sm font-medium transition-all duration-200 ease-out border-b-neutral-200 dark:border-neutral-800 border-b leading-tight group" role="region" aria-label="Announcement" href="/blog/cursor-cloud-agents"><div class="dots absolute inset-0 w-full h-full pointer-events-none opacity-25 dark:[--dot-color:white] [--dot-color:black]" aria-hidden="true" style="--dot-size:4px;--dot-inset:1.5;--dot-image:radial-gradient(var(--dot-color) 50%, transparent 50%)"></div><p class="font-semibold">Cursor Cloud Agents are now in Graphite. Create, review, and ship without leaving your PR.</p><div class="flex items-center gap-1.5 rounded-full transition-all duration-200 ease-out font-medium whitespace-nowrap text-foreground/50 group-hover:text-foreground">Read more<svg width="12" height="10" viewBox="0 0 12 10" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="group-hover:translate-x-0.25 transition-transform duration-200 ease-out size-3"><path d="M5.8965 1.208L8.9525 4.248H0.9205V5.432H8.9525L5.9125 8.488L6.6805 9.256L11.0805 4.84L6.6645 0.424L5.8965 1.208Z" fill="currentColor"></path></svg></div></a><header class="sticky top-0 z-40 container scheme-dark"><div aria-hidden="true" class="fixed top-0 left-0 w-full h-16 bg-background backdrop-blur-sm mask-(--gradient-ease-in-out-sine) pointer-events-none opacity-0 transition-opacity duration-300"></div><div class="py-2 lg:px-0 transition-[padding] flex justify-center duration-300"><div class="bg-transparent p-2 flex gap-2 w-full text-sm text-subtle rounded-xl items-center justify-between duration-300 transition-all relative"><div aria-hidden="true" class="absolute inset-0 pointer-events-none transition-opacity border rounded-xl border-transparent"><svg class="absolute -inset-px" width="100%" height="100%" preserveAspectRatio="none" aria-hidden="true"><mask id="header-mask"><rect class="size-full" fill="white" rx="12" ry="12"></rect></mask></svg><div class="absolute inset-0 h-[200%] rounded-xl box-decoration-clone mask-[url(#header-mask)] mask-subtract bg-linear-to-b from-background via-background/33 to-background/0 backdrop-blur-lg"></div></div><div class="relative"><a class="text-primary flex items-center gap-2 text-lg tracking-tighter pointer-events-auto sm:mask-wipe sm:hover:animate-mask-wipe ml-2 w-28 sm:w-32 sm:hover:[animation-duration:2s]" href="/"><svg viewBox="0 0 966 189" fill="none" aria-label="Graphite Logo"><path fill-rule="evenodd" clip-rule="evenodd" d="M662.11 153.252V22.178H680.724V72.1495H681.662C689.326 61.3067 697.774 57.6931 708.722 57.6931C731.084 57.6931 745.95 72.4646 745.95 96.9761V153.252H727.332V96.9775C727.364 94.0188 726.806 91.0842 725.692 88.3454C724.578 85.6066 722.93 83.1188 720.85 81.0261C718.762 78.9343 716.288 77.2796 713.558 76.1602C710.834 75.0408 707.914 74.4786 704.97 74.5061C691.05 74.5061 680.726 84.8773 680.726 96.9777V153.252L662.11 153.252Z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M820.817 133.595V76.3939H804.395V59.5792H820.817V39.1986L839.435 28.3811V59.5792H866.961V76.3939H839.435V130.767C839.435 134.538 841.311 136.423 845.061 136.423H866.961L857.125 153.253H841.311C828.013 153.253 820.817 145.695 820.817 133.595Z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M629.3 106.01C629.3 86.5236 617.258 74.1096 602.242 74.1096C587.384 74.1096 575.341 86.5236 575.341 106.01C575.341 125.497 587.384 137.756 602.242 137.756C617.258 137.756 629.3 125.497 629.3 106.01ZM556.729 188.672V59.571H573.464L575.341 73.6379H576.279C579.409 66.8807 587.073 57.2949 605.059 57.2949C629.461 57.2949 647.912 75.9969 647.912 106.01C647.912 136.023 629.457 154.725 605.059 154.725C587.227 154.725 579.095 145.296 576.279 138.382H575.341V188.671L556.729 188.672Z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M757.026 76.4245H773.446V153.252H792.056V59.5781H757.026V76.4245Z" fill="currentColor"></path><path d="M792.059 22.178H771.573V41.8209H792.059V22.178Z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M399.474 153.252V59.5781H415.272L417.148 71.2107H418.086C422.622 61.9387 427.158 59.5781 440.452 59.5781H450.4V76.4245H437.638C423.874 76.4245 418.086 81.7358 418.086 94.3072V153.252L399.474 153.252Z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M893.427 98.4669H948.323C946.289 83.5388 936.275 73.1662 921.259 73.1662C905.467 73.1662 896.237 83.5388 893.427 98.4669ZM946.015 126.378L961.157 135.16C953.157 145.718 939.979 154.725 921.267 154.725C894.361 154.725 874.817 135.082 874.817 106.01C874.817 76.9387 894.361 57.2949 921.267 57.2949C946.447 57.2949 965.999 76.9379 965.999 103.182C965.959 105.441 965.803 107.696 965.529 109.938L965.057 112.609H893.427C895.459 128.482 906.401 138.697 921.259 138.697C932.523 138.697 940.889 133.986 946.015 126.378Z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M516.027 112.967V109.195H493.817C479.585 109.195 473.327 115.638 473.327 124.124C473.327 132.61 478.801 138.11 490.063 138.11C506.955 138.11 516.027 128.837 516.027 112.967ZM533.075 153.252C520.093 153.252 517.591 143.799 516.965 139.244H516.027C510.395 150.558 498.353 154.645 488.185 154.645C467.701 154.645 454.559 142.544 454.559 125.572C454.559 106.87 466.761 94.6108 492.879 94.6108H516.027V92.883C516.027 80.6238 508.673 73.266 496.475 73.0819C492.141 73.0889 487.891 74.2948 484.193 76.5683C480.495 78.8408 477.491 82.093 475.511 85.9676L459.671 76.7931C466.061 65.1408 478.195 57.2146 496.479 57.2146C520.881 57.2146 534.797 71.0428 534.797 92.8868V132.9C534.797 133.834 535.167 134.73 535.825 135.392C536.483 136.052 537.375 136.423 538.303 136.423H545.747V153.252H533.075Z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M378.171 84.4829V153.253H362.371L360.501 132.884H359.557C350.491 147.183 335.787 154.726 318.579 154.726C284.327 154.726 256.175 127.541 256.175 87.3104C256.175 47.0793 284.327 19.8938 318.579 19.8938C346.287 19.8938 364.563 36.5553 374.225 54.8996L358.167 64.233C349.145 48.6895 335.475 38.5959 318.579 38.5959C294.177 38.5959 275.723 57.2979 275.723 87.3104C275.723 117.17 294.177 136.025 318.579 136.025C340.943 136.025 358.621 118.423 358.621 101.297V100.356H324.111L315.017 84.4827L378.171 84.4829Z" fill="currentColor"></path><path d="M111.052 0L23.468 23.5035L0 111.22L64.1158 175.433L151.7 151.93L175.168 64.2131L111.052 0ZM125.364 153.254H49.8032L12.0226 87.7166L49.8032 22.1794H125.364L163.145 87.7166L125.364 153.254Z" fill="currentColor"></path><path d="M131.431 43.8006L71.5321 27.7263L27.6829 71.6419L43.7329 131.632L103.632 147.706L147.481 103.79L131.431 43.8006Z" fill="currentColor"></path></svg></a></div><div class="justify-center lg:flex hidden dark"><nav aria-label="Main" data-orientation="horizontal" dir="ltr" data-slot="navigation-menu" data-viewport="false" class="group/navigation-menu relative flex max-w-max flex-1 items-center w-full justify-center"><div style="position:relative"><ul data-orientation="horizontal" data-slot="navigation-menu-list" class="group flex-1 list-none justify-center flex flex-row items-start" dir="ltr"><li data-slot="navigation-menu-item" class="relative group/trigger hover:bg-accent rounded-md transition-all"><button id="radix-:R1qak6:-trigger-radix-:R6dqak6:" data-state="closed" aria-expanded="false" aria-controls="radix-:R1qak6:-content-radix-:R6dqak6:" data-slot="navigation-menu-trigger" class="group group group inline-flex w-full h-9 items-center justify-center rounded-md bg-transparent px-4 py-2 text-sm font-medium text-accent-foreground/60 hover:text-accent-foreground dark:hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=open]:text-accent-foreground data-[state=open]:focus:bg-accent focus-visible:ring-ring/50 outline-none transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1" data-radix-collection-item=""><div class="w-fit gap-2 transition-all">Features</div><div aria-hidden="true" class="origin-bottom scale-0 opacity-0 group-data-[state=open]:opacity-100 group-data-[state=open]:scale-100 transition-opacity duration-300 group-data-[state=closed]:duration-0 z-10 pointer-events-none size-1.5 absolute top-full left-1/2 -translate-x-1/2 translate-y-1 bg-popover rotate-45 border-accent-foreground/10 border-t-1 border-r-0 border-b-0 border-l-1"></div> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down relative top-[1px] ml-1 size-5 lg:size-3 transition lg:group-data-[state=open]:-rotate-180 -rotate-90 lg:rotate-0" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li><li data-slot="navigation-menu-item" class="relative group/trigger hover:bg-accent rounded-md transition-all"><button id="radix-:R1qak6:-trigger-radix-:Radqak6:" data-state="closed" aria-expanded="false" aria-controls="radix-:R1qak6:-content-radix-:Radqak6:" data-slot="navigation-menu-trigger" class="group group group inline-flex w-full h-9 items-center justify-center rounded-md bg-transparent px-4 py-2 text-sm font-medium text-accent-foreground/60 hover:text-accent-foreground dark:hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=open]:text-accent-foreground data-[state=open]:focus:bg-accent focus-visible:ring-ring/50 outline-none transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1" data-radix-collection-item=""><div class="w-fit gap-2 transition-all">Resources</div><div aria-hidden="true" class="origin-bottom scale-0 opacity-0 group-data-[state=open]:opacity-100 group-data-[state=open]:scale-100 transition-opacity duration-300 group-data-[state=closed]:duration-0 z-10 pointer-events-none size-1.5 absolute top-full left-1/2 -translate-x-1/2 translate-y-1 bg-popover rotate-45 border-accent-foreground/10 border-t-1 border-r-0 border-b-0 border-l-1"></div> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down relative top-[1px] ml-1 size-5 lg:size-3 transition lg:group-data-[state=open]:-rotate-180 -rotate-90 lg:rotate-0" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></li><li data-slot="navigation-menu-item" class="relative group/trigger hover:bg-accent rounded-md transition-all"><a data-slot="navigation-menu-link" class="data-[active=true]:focus:bg-accent data-[active=true]:bg-accent/50 data-[active=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex-col gap-1 p-2 [&_svg:not([class*='size-'])]:size-4 group inline-flex w-full h-9 items-center justify-center rounded-md bg-transparent px-4 py-2 text-sm font-medium text-accent-foreground/60 hover:text-accent-foreground dark:hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=open]:text-accent-foreground data-[state=open]:focus:bg-accent focus-visible:ring-ring/50 outline-none transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1" href="/customers" data-radix-collection-item="">Customers</a></li><li data-slot="navigation-menu-item" class="relative group/trigger hover:bg-accent rounded-md transition-all"><a data-slot="navigation-menu-link" class="data-[active=true]:focus:bg-accent data-[active=true]:bg-accent/50 data-[active=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex-col gap-1 p-2 [&_svg:not([class*='size-'])]:size-4 group inline-flex w-full h-9 items-center justify-center rounded-md bg-transparent px-4 py-2 text-sm font-medium text-accent-foreground/60 hover:text-accent-foreground dark:hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=open]:text-accent-foreground data-[state=open]:focus:bg-accent focus-visible:ring-ring/50 outline-none transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1" href="/docs" data-radix-collection-item="">Docs</a></li><li data-slot="navigation-menu-item" class="relative group/trigger hover:bg-accent rounded-md transition-all"><a data-slot="navigation-menu-link" class="data-[active=true]:focus:bg-accent data-[active=true]:bg-accent/50 data-[active=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex-col gap-1 p-2 [&_svg:not([class*='size-'])]:size-4 group inline-flex w-full h-9 items-center justify-center rounded-md bg-transparent px-4 py-2 text-sm font-medium text-accent-foreground/60 hover:text-accent-foreground dark:hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=open]:text-accent-foreground data-[state=open]:focus:bg-accent focus-visible:ring-ring/50 outline-none transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1" href="/pricing" data-radix-collection-item="">Pricing</a></li><li data-slot="navigation-menu-item" class="relative group/trigger hover:bg-accent rounded-md transition-all"><a data-slot="navigation-menu-link" class="data-[active=true]:focus:bg-accent data-[active=true]:bg-accent/50 data-[active=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex-col gap-1 p-2 [&_svg:not([class*='size-'])]:size-4 group inline-flex w-full h-9 items-center justify-center rounded-md bg-transparent px-4 py-2 text-sm font-medium text-accent-foreground/60 hover:text-accent-foreground dark:hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=open]:text-accent-foreground data-[state=open]:focus:bg-accent focus-visible:ring-ring/50 outline-none transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1" target="_blank" href="https://cursor.com/contact-sales?product=graphite" data-radix-collection-item="">Contact</a></li></ul></div></nav></div><div class="pointer-events-auto flex flex-row gap-2 justify-end"><div class="flex flex-row gap-2 transition-opacity duration-300 opacity-0 pointer-events-none"><a class="md:pr-2 pr-4 pl-4 py-2 border border-secondary group w-full cursor-pointer inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80" aria-label="Log in" accessKey="g" href="https://app.graphite.com">Log in<span aria-hidden="true" class="hidden size-6 ml-2 md:flex items-center justify-center rounded-sm bg-primary/10 text-primary/60">G</span></a><div class="relative [--glow-strength:0]"><div class="absolute inset-0 size-full"><div class="blur-[calc(var(--glow-strength)*4px+12px)] absolute w-2/3 h-full top-0 bg-category-magenta/20 left-0" style="opacity:calc(0.2 * var(--glow-strength) + .8);transform:translate(calc(var(--glow-x) * 10%), calc(var(--glow-y) * -2%))"></div><div class="blur-[calc(var(--glow-strength)*4px+12px)] absolute w-2/3 h-full top-0 bg-category-orange/20 right-0" style="opacity:calc(0.2 * var(--glow-strength) + .8);transform:translate(calc(var(--glow-x) * -10%), calc(var(--glow-y) * -2%))"></div></div><a class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative bg-primary text-primary-foreground shadow hover:bg-primary/90 px-4 py-2 group transition-all w-full cursor-pointer h-full relative" href="https://app.graphite.com/signup">Sign up<div class="size-3 sm:size-4 overflow-hidden relative"><div class="group-hover:translate-x-0 transition-transform -translate-x-1/2 flex items-center duration-500 absolute fit h-full left-0 sm:[&>svg]:size-4 [&>svg]:size-3"><svg width="12" height="10" viewBox="0 0 12 10" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M5.8965 1.208L8.9525 4.248H0.9205V5.432H8.9525L5.9125 8.488L6.6805 9.256L11.0805 4.84L6.6645 0.424L5.8965 1.208Z" fill="currentColor"></path></svg><svg width="12" height="10" viewBox="0 0 12 10" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M5.8965 1.208L8.9525 4.248H0.9205V5.432H8.9525L5.9125 8.488L6.6805 9.256L11.0805 4.84L6.6645 0.424L5.8965 1.208Z" fill="currentColor"></path></svg></div></div><div class="rounded-[inherit] absolute inset-0 p-[var(--padding,1px)] pointer-events-none" style="mask:linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);mask-composite:exclude"><div class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 aspect-[1/1] min-h-full min-w-full scale-[1.2]"><div class="absolute size-full group-hover:rotate-[360deg] rotate-[0deg] bg-[conic-gradient(from_0deg,#3cb091,#1495c7,#6666c1,#efae0f,#3cb091)] dark:opacity-100 opacity-50 transition-transform duration-700"></div></div></div></a></div></div><div class="lg:hidden flex items-center justify-self-end w-fit"><button type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="radix-:Raaak6:" data-state="closed" class="flex gap-2 items-center p-2 data-[state=open]:opacity-0 data-[state=open]:pointer-events-none relative"><span class="sr-only">Menu</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-menu size-4" aria-hidden="true"><path d="M4 12h16"></path><path d="M4 18h16"></path><path d="M4 6h16"></path></svg></button></div></div></div></div></header><main id="main-content"><section id="hero" class="relative overflow-x-clip mb-2 z-20"><div class="grid-container z-10"><div class="size-0.5 bg-primary absolute bottom-0 left-2"></div><div class="size-0.5 bg-primary absolute bottom-0 right-2"></div><div class="w-full col-span-full flex flex-col space-y-4 body-base pt-18 lg:pt-24 lg:grid-container lg:px-0"><div class="flex lg:flex-col lg:col-span-3 lg:m-0"><a class="w-fit text-primary/50 hover:text-primary transition-colors duration-300" href="/blog">Blog</a><div class="flex lg:gap-1 items-baseline"><svg width="12" height="10" viewBox="0 0 12 10" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="lg:hidden mx-2 size-3 text-primary/30"><path d="M5.8965 1.208L8.9525 4.248H0.9205V5.432H8.9525L5.9125 8.488L6.6805 9.256L11.0805 4.84L6.6645 0.424L5.8965 1.208Z" fill="currentColor"></path></svg><div aria-hidden="true" class="max-lg:hidden aspect-[2/5] w-2 shrink-0 border-l border-b border-primary/30 rounded-bl-xs"></div><a class="text-primary/50 hover:text-primary transition-colors duration-300" href="/blog?category=engineering">Engineering</a></div></div><h1 class="heading-lg text-left text-balance lg:col-span-8 lg:col-start-5 lg:m-0">Post mortem: our outage took 124 seconds from you, here's 378 back</h1><div class="flex justify-between items-end mt-16 border-b pb-2 text-primary/50 gap-8 lg:col-span-full lg:mt-10"><div class="flex flex-col gap-1"><img alt="author" loading="lazy" width="32" height="32" decoding="async" data-nimg="1" class="rounded-xs aspect-[3/4] object-cover lg:w-10 bg-primary" style="color:transparent" sizes="(max-width: 767px) 10, (max-width: 1024px) 10, 10" srcSet="/_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&w=3840&q=75"/><p class="">Greg Foster</p></div><p class="tabular-nums [word-spacing:-0.25em]">Dec 6, 2023</p></div></div></div></section><section id="content"><div class="grid-container"><aside class="col-span-full max-lg:border-b border-border lg:col-span-3 max-h-[calc(100vh-4.5rem)] sticky top-0 lg:top-18 flex flex-col gap-8 justify-between max-lg:pt-18 max-lg:-mt-18 max-lg:top-0 max-lg:z-10 max-lg:bg-background max-lg:pb-2"><div class="lg:z-10 lg:pt-4 lg:sticky lg:top-18 lg:pb-24"><div data-open="false" data-in-page-nav="true" class="group/in-page-nav relative"><div class="relative z-10"><h2 class="body-base flex items-center gap-2 pointer-events-none z-20 relative w-fit"><div aria-hidden="true" class="absolute -z-10 -inset-x-3 -inset-y-1 rounded-lg group-has-hover/in-page-nav:bg-secondary/50 transition-colors duration-200 ease-(--ease-glide)"></div>In this article <div aria-hidden="true" class="pointer-events-none size-2 relative group-data-[open=true]/in-page-nav:rotate-90 transition-transform duration-600 ease-(--ease-glide)"><div class="w-full h-px bg-primary absolute top-1/2 left-1/2 -translate-1/2 group-data-[open=true]/in-page-nav:opacity-0 transition-opacity duration-300 ease-(--ease-glide)"></div><div class="w-px h-full bg-primary absolute top-1/2 left-1/2 -translate-1/2"></div></div></h2><div class="flex gap-1 items-baseline lg:absolute lg:top-full pointer-events-none"><div class="aspect-[2/5] z-20 w-2 shrink-0 border-l border-b border-primary/30 rounded-bl-xs group-data-[open=true]/in-page-nav:opacity-0 group-data-[open=true]/in-page-nav:rounded-none delay-100 group-data-[open=true]/in-page-nav:delay-0 transition-border-color duration-300 ease-(--ease-glide)"></div><ul class="grid w-full items-start overflow-hidden group-data-[open=true]/in-page-nav:opacity-0 group-data-[open=true]/in-page-nav:translate-y-1 group-data-[open=true]/in-page-nav:delay-0 delay-100 transition-all duration-300 ease-(--ease-glide)"><li class="col-1 row-1 w-full overflow-hidden body-base text-primary/50 opacity-0 data-[active=true]:delay-100 data-[active=true]:opacity-100 transition-opacity duration-0 data-[active=true]:duration-300 ease-(--ease-glide)" data-active="true" aria-hidden="false"><span class="body-base block marker:tabular-nums truncate text-primary/50 hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Incident Overview:</span></li><li class="col-1 row-1 w-full overflow-hidden body-base text-primary/50 opacity-0 data-[active=true]:delay-100 data-[active=true]:opacity-100 transition-opacity duration-0 data-[active=true]:duration-300 ease-(--ease-glide)" data-active="false" aria-hidden="true"><span class="body-base block marker:tabular-nums truncate text-primary/50 hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Affected surfaces:</span></li><li class="col-1 row-1 w-full overflow-hidden body-base text-primary/50 opacity-0 data-[active=true]:delay-100 data-[active=true]:opacity-100 transition-opacity duration-0 data-[active=true]:duration-300 ease-(--ease-glide)" data-active="false" aria-hidden="true"><span class="body-base block marker:tabular-nums truncate text-primary/50 hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Initial detection:</span></li><li class="col-1 row-1 w-full overflow-hidden body-base text-primary/50 opacity-0 data-[active=true]:delay-100 data-[active=true]:opacity-100 transition-opacity duration-0 data-[active=true]:duration-300 ease-(--ease-glide)" data-active="false" aria-hidden="true"><span class="body-base block marker:tabular-nums truncate text-primary/50 hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Detailed timeline:</span></li><li class="col-1 row-1 w-full overflow-hidden body-base text-primary/50 opacity-0 data-[active=true]:delay-100 data-[active=true]:opacity-100 transition-opacity duration-0 data-[active=true]:duration-300 ease-(--ease-glide)" data-active="false" aria-hidden="true"><span class="body-base block marker:tabular-nums truncate text-primary/50 hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Root cause analysis:</span></li><li class="col-1 row-1 w-full overflow-hidden body-base text-primary/50 opacity-0 data-[active=true]:delay-100 data-[active=true]:opacity-100 transition-opacity duration-0 data-[active=true]:duration-300 ease-(--ease-glide)" data-active="false" aria-hidden="true"><span class="body-base block marker:tabular-nums truncate text-primary/50 hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Immediate solution:</span></li><li class="col-1 row-1 w-full overflow-hidden body-base text-primary/50 opacity-0 data-[active=true]:delay-100 data-[active=true]:opacity-100 transition-opacity duration-0 data-[active=true]:duration-300 ease-(--ease-glide)" data-active="false" aria-hidden="true"><span class="body-base block marker:tabular-nums truncate text-primary/50 hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Future corrective actions:</span></li><li class="col-1 row-1 w-full overflow-hidden body-base text-primary/50 opacity-0 data-[active=true]:delay-100 data-[active=true]:opacity-100 transition-opacity duration-0 data-[active=true]:duration-300 ease-(--ease-glide)" data-active="false" aria-hidden="true"><span class="body-base block marker:tabular-nums truncate text-primary/50 hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Acknowledgments:</span></li></ul></div><button class="absolute -inset-x-3 -inset-y-1 z-10 cursor-pointer"><span class="sr-only">Open</span></button></div><div class="max-lg:absolute max-lg:mt-8 max-lg:pb-4 w-full bg-background top-0 left-0 group-data-[open=true]/in-page-nav:[grid-template-rows:1fr] grid [grid-template-rows:0fr] transition-all duration-300 lg:duration-600 ease-(--ease-glide)"><div class="overflow-hidden"><div class="max-h-[calc(100lvh-20rem)] overflow-scroll max-lg:scale-y-50 origin-top group-data-[open=true]/in-page-nav:scale-y-100 transition-all ease-(--ease-glide)"><div class="w-full h-4 bg-linear-to-b from-background to-transparent sticky top-0 left-0"></div><ol class="lg:mt-2 list-decimal marker:text-primary/50 marker:text-xs marker:font-medium flex flex-col gap-2 transition-all duration-600 ease-(--ease-glide)" style="padding-left:2.25ch"><li class="opacity-0 text-primary/50 data-[active=true]:text-primary group-data-[open=true]/in-page-nav:opacity-100 transition-all duration-300 ease-(--ease-glide)" data-active="true"><a href="#incident-overview" tabindex="-1" class="body-base block text-inherit text-balance hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Incident Overview:</a></li><li class="opacity-0 text-primary/50 data-[active=true]:text-primary group-data-[open=true]/in-page-nav:opacity-100 transition-all duration-300 ease-(--ease-glide)" data-active="false"><a href="#affected-surfaces" tabindex="-1" class="body-base block text-inherit text-balance hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Affected surfaces:</a></li><li class="opacity-0 text-primary/50 data-[active=true]:text-primary group-data-[open=true]/in-page-nav:opacity-100 transition-all duration-300 ease-(--ease-glide)" data-active="false"><a href="#initial-detection" tabindex="-1" class="body-base block text-inherit text-balance hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Initial detection:</a></li><li class="opacity-0 text-primary/50 data-[active=true]:text-primary group-data-[open=true]/in-page-nav:opacity-100 transition-all duration-300 ease-(--ease-glide)" data-active="false"><a href="#detailed-timeline" tabindex="-1" class="body-base block text-inherit text-balance hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Detailed timeline:</a></li><li class="opacity-0 text-primary/50 data-[active=true]:text-primary group-data-[open=true]/in-page-nav:opacity-100 transition-all duration-300 ease-(--ease-glide)" data-active="false"><a href="#root-cause-analysis" tabindex="-1" class="body-base block text-inherit text-balance hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Root cause analysis:</a></li><li class="opacity-0 text-primary/50 data-[active=true]:text-primary group-data-[open=true]/in-page-nav:opacity-100 transition-all duration-300 ease-(--ease-glide)" data-active="false"><a href="#immediate-solution" tabindex="-1" class="body-base block text-inherit text-balance hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Immediate solution:</a></li><li class="opacity-0 text-primary/50 data-[active=true]:text-primary group-data-[open=true]/in-page-nav:opacity-100 transition-all duration-300 ease-(--ease-glide)" data-active="false"><a href="#future-corrective-actions" tabindex="-1" class="body-base block text-inherit text-balance hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Future corrective actions:</a></li><li class="opacity-0 text-primary/50 data-[active=true]:text-primary group-data-[open=true]/in-page-nav:opacity-100 transition-all duration-300 ease-(--ease-glide)" data-active="false"><a href="#acknowledgments" tabindex="-1" class="body-base block text-inherit text-balance hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Acknowledgments:</a></li></ol><div class="w-full h-4 bg-linear-to-t from-background to-transparent sticky bottom-0 left-0"></div></div></div></div></div></div><div class="max-lg:fixed max-lg:bottom-0 max-lg:right-0 lg:mt-auto w-full flex max-lg:justify-center max-lg:py-4 z-10 max-lg:bg-linear-to-t max-lg:from-background max-lg:to-background/0"><button class="relative group select-none data-[copied=true]:pointer-events-none data-[error=true]:pointer-events-none p-1 cursor-pointer text-primary/50 hover:text-primary data-[error=true]:text-red-500/70 data-[error=true]:hover:text-red-500 transition-all max-lg:px-4 py-2 lg:py-4 lg:px-0 flex items-center gap-2 max-lg:bg-secondary rounded-lg max-lg:border max-lg:border-border" data-copied="false" data-error="false" aria-label="Copy code">Share<span class="sr-only" aria-hidden="false">Copy to clipboard</span><div class="relative"><div class="group-data-[copied=true]:opacity-0 group-data-[error=true]:opacity-0 py-0.5"><svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg" class="transition-colors size-5"><g clip-path="url(#clip0_224_6247)"><mask id="mask0_224_6247" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="50" height="50"><path d="M50 0H0V50H50V0Z" fill="currentColor"></path></mask><g><path d="M21.3812 35.3144L19.414 37.2816C16.7698 39.9258 12.4828 39.9258 9.83862 37.2816C7.19442 34.6374 7.19442 30.3504 9.83862 27.7062L17.2041 20.3406C19.8483 17.6964 24.1353 17.6964 26.7795 20.3406C27.8911 21.4522 28.5354 22.8543 28.7124 24.3025" stroke="currentColor" stroke-width="3.13" stroke-linecap="round" stroke-linejoin="round"></path><path d="M28.6203 14.8175L30.5875 12.8503C33.2317 10.2061 37.5187 10.2061 40.1629 12.8503C42.8071 15.4945 42.8071 19.7815 40.1629 22.4257L32.7974 29.7913C30.1532 32.4355 25.8662 32.4355 23.222 29.7913C22.1104 28.6797 21.4661 27.2776 21.2891 25.8294" stroke="currentColor" stroke-width="3.13" stroke-linecap="round" stroke-linejoin="round"></path></g></g><defs><clipPath id="clip0_224_6247"><rect width="50" height="50" fill="white"></rect></clipPath></defs></svg></div><span class="text-xs text-primary/50 absolute pointer-events-none top-1/2 -translate-y-1/3 -translate-x-1/2 left-1/2 opacity-0 group-data-[copied=true]:opacity-100 group-data-[copied=true]:-translate-y-1/2 group-data-[copied=true]:-translate-x-1/2 group-data-[copied=true]:delay-200 transition-all" aria-hidden="true"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path id="ICON_FILL" d="M14.7072 4.70712L6.00008 13.4142L1.29297 8.70712L2.70718 7.29291L6.00008 10.5858L13.293 3.29291L14.7072 4.70712Z" fill="currentColor"></path></svg></span><span class="text-xs text-red-500/70 absolute pointer-events-none top-0 right-0 opacity-0 group-data-[error=true]:opacity-100 group-data-[error=true]:delay-100 transition-opacity" aria-hidden="true">Failed</span></div></button><div aria-live="polite" aria-atomic="true" class="sr-only"></div></div></aside><article class="prose lg:prose-lg wrap-break-word prose-a:hover:text-primary prose-a:transition-colors prose-li:[&_p]:my-0 prose-li:mt-0 prose-ul:list-[square] prose-light mt-5 col-span-full md:col-span-4 md:col-start-2 lg:col-span-8 lg:col-start-5 max-w-none"><p>If you haven’t seen the global headlines yet: Graphite had an outage.</p><p>In the interest of full transparency and accountability, I, Greg Foster, as the CTO and responding on-call engineer, want to give a full report of the incident, and reaffirm our commitment to our community and customers.</p><p>While Graphite was down for ~2 minutes, and you'll never get those valuable moments of your life back, in this article I will provide you with ~6 minutes of content. This nets out to a GAIN of 4 minutes, putting you back on top. Let's dive in.</p><h2 id="incident-overview"><strong>Incident Overview:</strong></h2><ul><li><p><strong>Time and Duration:</strong> On December 6, 2023, at 2:13:26 PM EST, Graphite’s web application experienced an unexpected downtime lasting precisely 124 seconds.</p></li><li><p><strong>Impact:</strong> Nearly a dozen users encountered a 404 error page when attempting to load new pages, particularly affecting the pull request functionality. This interruption temporarily hindered user code reviews while encouraging premature coffee breaks.</p></li></ul><div class="relative block my-5 [&>picture]:my-0 [&>picture>*]:object-contain [&>picture>*]:rounded-xs [&>img]:my-0" style="overflow:hidden;position:relative;width:100%;max-width:1834px"><img style="display:block;width:100%" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxODM0IiBoZWlnaHQ9IjU4MyI+PC9zdmc+" aria-hidden="true" alt=""/><img aria-hidden="true" alt="" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgaDg0NDikhFhUaJR8lMCUrLiUmJCskJh0oHRUlJTUxLS0vMjIyGSI4PT0wPC0xMi8BCgsLDg0JFQUMHDsoFhwvLy8vLy87Oy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIAAgAGAMBIgACEQEDEQH/xAAWAAEBAQAAAAAAAAAAAAAAAAAABQf/xAAfEAABAwQDAQAAAAAAAAAAAAAAAQIEAwUGESExQRL/xAAVAQEBAAAAAAAAAAAAAAAAAAABAP/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AJ93yTLWzGNq9bNSxWZdJVopvktRV16AIWUryPnlibABJ//Z" style="transition:opacity 500ms;opacity:1;position:absolute;left:-5%;top:-5%;width:110%;height:110%;max-width:none;max-height:none"/><noscript><picture><source srcSet="https://www.datocms-assets.com/85246/1701986382-untitled-45.png?dpr=0.25&fm=webp 458w,https://www.datocms-assets.com/85246/1701986382-untitled-45.png?dpr=0.5&fm=webp 917w,https://www.datocms-assets.com/85246/1701986382-untitled-45.png?dpr=0.75&fm=webp 1375w,https://www.datocms-assets.com/85246/1701986382-untitled-45.png?fm=webp 1834w" sizes="(max-width: 1834px) 100vw, 1834px" type="image/webp"/><source srcSet="https://www.datocms-assets.com/85246/1701986382-untitled-45.png?dpr=0.25 458w,https://www.datocms-assets.com/85246/1701986382-untitled-45.png?dpr=0.5 917w,https://www.datocms-assets.com/85246/1701986382-untitled-45.png?dpr=0.75 1375w,https://www.datocms-assets.com/85246/1701986382-untitled-45.png 1834w" sizes="(max-width: 1834px) 100vw, 1834px"/><img src="https://www.datocms-assets.com/85246/1701986382-untitled-45.png" alt="screenshots comparing the desired state of the web application to the 404 page" style="position:absolute;left:0;top:0;width:100%;height:100%;max-width:none;max-height:none" loading="lazy"/></picture></noscript></div><h2 id="affected-surfaces"><strong>Affected surfaces:</strong></h2><p>Luckily, the issue was solely isolated to new page loads of the web application. Other key components of the Graphite ecosystem, such as asynchronous jobs, merge queues, the CLI tool, the VS Code extension, and the system tray application remained fully operational during this time. This maintained continuity in several backend and integrated services, thereby limiting the overall disruption to our users.</p><h2 id="initial-detection"><strong>Initial detection:</strong></h2><p>The problem was first identified thousands of milliseconds into the incident, at precisely 2:13:26 PM EST by myself, Greg Foster, following a user report in the Graphite Community Slack channel.</p><div class="relative block my-5 [&>picture]:my-0 [&>picture>*]:object-contain [&>picture>*]:rounded-xs [&>img]:my-0" style="overflow:hidden;position:relative;width:100%;max-width:782px"><img style="display:block;width:100%" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI3ODIiIGhlaWdodD0iNDM0Ij48L3N2Zz4=" aria-hidden="true" alt=""/><img aria-hidden="true" alt="" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0hFhEVIxUgLSsfLiEyKzcvLS41IhUtJTUsNC4yPjI1GjU4PT0wPTUxMjUBCgsLDg0OEBAQHS8cFhwvLy8vLy87Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIAA4AGAMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAFBgEDBAD/xAAiEAABAwMDBQAAAAAAAAAAAAABAgMFAAQRBgchEzFRcZH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAgD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwC2J24j5OI5cH2iDGzcULLl0ZpC09q+RtYRwBwkp4zmtlnuDKuWyklxWPdKRfUG1sbbWIU1cBKh2INdSpP6sknrMJ6qhk+aisX/2Q==" style="transition:opacity 500ms;opacity:1;position:absolute;left:-5%;top:-5%;width:110%;height:110%;max-width:none;max-height:none"/><noscript><picture><source srcSet="https://www.datocms-assets.com/85246/1701982438-untitled-40.png?dpr=0.25&fm=webp 195w,https://www.datocms-assets.com/85246/1701982438-untitled-40.png?dpr=0.5&fm=webp 391w,https://www.datocms-assets.com/85246/1701982438-untitled-40.png?dpr=0.75&fm=webp 586w,https://www.datocms-assets.com/85246/1701982438-untitled-40.png?fm=webp 782w" sizes="(max-width: 782px) 100vw, 782px" type="image/webp"/><source srcSet="https://www.datocms-assets.com/85246/1701982438-untitled-40.png?dpr=0.25 195w,https://www.datocms-assets.com/85246/1701982438-untitled-40.png?dpr=0.5 391w,https://www.datocms-assets.com/85246/1701982438-untitled-40.png?dpr=0.75 586w,https://www.datocms-assets.com/85246/1701982438-untitled-40.png 782w" sizes="(max-width: 782px) 100vw, 782px"/><img src="https://www.datocms-assets.com/85246/1701982438-untitled-40.png" alt="screenshot of slack message from a community member showing a 404 error message" style="position:absolute;left:0;top:0;width:100%;height:100%;max-width:none;max-height:none" loading="lazy"/></picture></noscript></div><div class="relative block my-5 [&>picture]:my-0 [&>picture>*]:object-contain [&>picture>*]:rounded-xs [&>img]:my-0" style="overflow:hidden;position:relative;width:100%;max-width:1556px"><img style="display:block;width:100%" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNTU2IiBoZWlnaHQ9IjgwMiI+PC9zdmc+" aria-hidden="true" alt=""/><img aria-hidden="true" alt="" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgLChALFRgQDQ0ODhsVFg0YFxUZGCIVFhUdHysjGh0oHRUWJDUlKC0vMjIyGSI4PTcwPCsxMi8BCgsLBQUFEAUFEC8cFhwvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIAA0AGAMBIgACEQEDEQH/xAAXAAADAQAAAAAAAAAAAAAAAAAABAYF/8QAHRAAAQQDAQEAAAAAAAAAAAAAAQACAwQFESEGEv/EABUBAQEAAAAAAAAAAAAAAAAAAAIA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AmcdFkJKBHyVn5GjajgJe0hV3n7Ln0+tCV9M/VQ6ASFDljhW6hORgPrnaFJ//2Q==" style="transition:opacity 500ms;opacity:1;position:absolute;left:-5%;top:-5%;width:110%;height:110%;max-width:none;max-height:none"/><noscript><picture><source srcSet="https://www.datocms-assets.com/85246/1701982491-untitled-43.png?dpr=0.25&fm=webp 389w,https://www.datocms-assets.com/85246/1701982491-untitled-43.png?dpr=0.5&fm=webp 778w,https://www.datocms-assets.com/85246/1701982491-untitled-43.png?dpr=0.75&fm=webp 1167w,https://www.datocms-assets.com/85246/1701982491-untitled-43.png?fm=webp 1556w" sizes="(max-width: 1556px) 100vw, 1556px" type="image/webp"/><source srcSet="https://www.datocms-assets.com/85246/1701982491-untitled-43.png?dpr=0.25 389w,https://www.datocms-assets.com/85246/1701982491-untitled-43.png?dpr=0.5 778w,https://www.datocms-assets.com/85246/1701982491-untitled-43.png?dpr=0.75 1167w,https://www.datocms-assets.com/85246/1701982491-untitled-43.png 1556w" sizes="(max-width: 1556px) 100vw, 1556px"/><img src="https://www.datocms-assets.com/85246/1701982491-untitled-43.png" alt="screenshot from internal slack announcing the announcement" style="position:absolute;left:0;top:0;width:100%;height:100%;max-width:none;max-height:none" loading="lazy"/></picture></noscript></div><h2 id="detailed-timeline"><strong>Detailed timeline:</strong></h2><ul><li><p><strong>2:13:35 PM: </strong>Adhering to my on-call duties, I promptly instructed Alyssa, another key software dev on our team, to update the Graphite status page to communicate the service disruption.</p></li><li><p><strong>2:13:37 PM:</strong> Concurrent with the status page update, belated PagerDuty alarms began firing, indicating a significant uptick in errors and triggering <a href="https://www.hubermanlab.com/episode/tools-for-managing-stress-and-anxiety">parasympathetic trauma responses</a> across the room. The office was literally “abuzz” with vibrating phones, and apple watches warning of imminent cardiac arrest (see above).</p></li><li><p><strong>2:13:40 PM:</strong> Brendan, another Graphite engineer, began an exploration in the AWS console to identify and address the underlying issue.</p></li><li><p><strong>2:13:45 PM:</strong> Suspecting an anomaly with the S3 bucket serving the web application, I started battling through multiple of AWS’s “best-in-industry" login flows to access the AWS console. After only 16 redirects through different authentication portals, I was in.</p></li><li><p><strong>2:13:50 PM:</strong> Graphite’s internal Slack channels experienced a surge in activity, with employees reporting the 404 error, and users clamoring for answers in the community Slack. The ➕ emoji reacts to error reports, and dumpster fire gifs were frantically rolling in. It was now clear that this was a... widespread issue.</p></li><li><p><strong>2:14:30 PM:</strong> In the meantime, as I was handling the slack meltdown, Brendan successfully identified a misconfiguration in the S3 bucket settings and proceeded to revert the changes, effectively restoring site functionality.</p></li><li><p><strong>2:14:40 PM:</strong> Following the resolution, site performance returned to normal, and blood pressure readings finally fell below the “fatal hypertension” level. Benchmarks across the board were looking good.</p></li><li><p><strong>2:14:50 PM:</strong> Brendan reminded me of what I said in our 1:1 this morning: “Wow, it’s been so long since we had any kind of outage!” Thank you Brendan.</p></li><li><p><strong>2:15:40 PM:</strong> I updated the community on Slack regarding the resolution and shared a brief explanation of the incident.</p></li></ul><h2 id="root-cause-analysis"><strong>Root cause analysis:</strong></h2><ul><li><p><strong>Precursor event:</strong> My presentation on the preceding day at 4:50 PM EST, highlighting the exceptional uptime in November, inadvertently angering the SRE gods and cursing the team with subsequent downtime.</p></li><li><p><strong>Immediate cause:</strong> The downtime was initiated by an unintended change to the S3 production bucket configuration at approximately 2:12:35 PM EST, causing CloudFront to serve 404 errors.</p></li></ul><h2 id="immediate-solution"><strong>Immediate solution:</strong></h2><p>The issue was promptly addressed by reverting the changes to the S3 bucket configuration.</p><h2 id="future-corrective-actions"><strong>Future corrective actions:</strong></h2><ul><li><p>Graphite will encourage a new internal policy requiring testing of configuration changes in a staging environment prior to production deployment.</p></li><li><p>Add linter warning to caution against making verbal jinxing statements about system reliability.</p></li></ul><h2 id="acknowledgments"><strong>Acknowledgments:</strong></h2><ul><li><p>First, I want to extend my sincere thanks to our engineering team for their rapid and effective response to this incident.</p></li><li><p>I also deeply appreciate our community members on Slack who quickly reported the issue and showed tremendous support throughout the incident.</p></li><li><p>And thank <strong>you,</strong> the reader, for making it to the end of the report, hopefully learning from our experience along the way.</p></li></ul></article></div><div class="container"><div class="mt-16 col-span-full relative lg:col-start-5 gap-8 lg:gap-2 flex flex-col lg:gap-x-12 max-lg:border-t border-border max-lg:pt-4"><h3 class="body-base mb-12 lg:mb-0">Related articles</h3><div class="max-lg:contents lg:grid lg:grid-cols-3 lg:gap-x-12 lg:relative lg:pt-8 lg:border-t lg:border-border"><div class="hidden lg:block absolute top-0 left-[calc(33.33%-0.5em)] h-full border-l border-border"></div><div class="hidden lg:block absolute top-0 left-[calc(66.66%+0.5em)] h-full border-l border-border"></div><a aria-label="Why AI will never replace human code review" class="body-base flex flex-col gap-2 border-b border-dashed border-border-default pb-8 group/card" href="/blog/ai-wont-replace-human-code-review"><h3 class="text-xl/6 font-semibold text-pretty text-primary group-hover:opacity-60 group-hover/card:opacity-100 transition-opacity">Why AI will never replace human code review</h3><div class="flex items-baseline gap-2.5"><p class="tabular-nums [word-spacing:-0.25em] text-primary/50 group-hover/card:text-primary/70 transition-colors">Mar 17, 2025</p><span aria-hidden="true" class="bg-primary/25 size-1 shrink-0 self-center"></span><p class="text-primary/50 group-hover/card:text-primary/70 transition-colors">Engineering</p></div></a><a aria-label="AI code generation will remain fragmented" class="body-base flex flex-col gap-2 border-b border-dashed border-border-default pb-8 group/card" href="/blog/ai-code-generation-will-remain-fragmented"><h3 class="text-xl/6 font-semibold text-pretty text-primary group-hover:opacity-60 group-hover/card:opacity-100 transition-opacity">AI code generation will remain fragmented</h3><div class="flex items-baseline gap-2.5"><p class="tabular-nums [word-spacing:-0.25em] text-primary/50 group-hover/card:text-primary/70 transition-colors">Nov 25, 2024</p><span aria-hidden="true" class="bg-primary/25 size-1 shrink-0 self-center"></span><p class="text-primary/50 group-hover/card:text-primary/70 transition-colors">Engineering</p></div></a><a aria-label="Introducing frozen branches: A safer way to build on your teammates’ work" class="body-base flex flex-col gap-2 border-b border-dashed border-border-default pb-8 group/card" href="/blog/introducing-frozen-branches"><h3 class="text-xl/6 font-semibold text-pretty text-primary group-hover:opacity-60 group-hover/card:opacity-100 transition-opacity">Introducing frozen branches: A safer way to build on your teammates’ work</h3><div class="flex items-baseline gap-2.5"><p class="tabular-nums [word-spacing:-0.25em] text-primary/50 group-hover/card:text-primary/70 transition-colors">Sep 17, 2025</p><span aria-hidden="true" class="bg-primary/25 size-1 shrink-0 self-center"></span><p class="text-primary/50 group-hover/card:text-primary/70 transition-colors">Engineering</p></div></a></div></div></div></section><section class="container"><div class="pb-8 pt-8 sm:pt-16"><h2 class="gsap-prefooter-split-text heading-lg text-balance text-primary text-center py-8 px-4 mx-auto max-w-2xl">Built for the world’s fastest engineering teams, now available for everyone.</h2><div class="gsap-prefooter-ctas flex gap-3 justify-center"><a class="inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80 h-10 rounded-md px-8 cursor-pointer relative border-neutral-700 border w-fit" href="https://cursor.com/contact-sales?product=graphite">Request a demo</a><div class="relative [--glow-strength:0]"><div class="absolute inset-0 size-full"><div class="blur-[calc(var(--glow-strength)*4px+12px)] absolute w-2/3 h-full top-0 bg-category-magenta/20 left-0" style="opacity:calc(0.2 * var(--glow-strength) + .8);transform:translate(calc(var(--glow-x) * 10%), calc(var(--glow-y) * -2%))"></div><div class="blur-[calc(var(--glow-strength)*4px+12px)] absolute w-2/3 h-full top-0 bg-category-orange/20 right-0" style="opacity:calc(0.2 * var(--glow-strength) + .8);transform:translate(calc(var(--glow-x) * -10%), calc(var(--glow-y) * -2%))"></div></div><a class="inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative bg-primary text-primary-foreground shadow hover:bg-primary/90 h-10 rounded-md px-8 group transition-all cursor-pointer w-fit relative" href="https://app.graphite.com/signup">Start free trial<div class="size-3 sm:size-4 overflow-hidden relative"><div class="group-hover:translate-x-0 transition-transform -translate-x-1/2 flex items-center duration-500 absolute fit h-full left-0 sm:[&>svg]:size-4 [&>svg]:size-3"><svg width="12" height="10" viewBox="0 0 12 10" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M5.8965 1.208L8.9525 4.248H0.9205V5.432H8.9525L5.9125 8.488L6.6805 9.256L11.0805 4.84L6.6645 0.424L5.8965 1.208Z" fill="currentColor"></path></svg><svg width="12" height="10" viewBox="0 0 12 10" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M5.8965 1.208L8.9525 4.248H0.9205V5.432H8.9525L5.9125 8.488L6.6805 9.256L11.0805 4.84L6.6645 0.424L5.8965 1.208Z" fill="currentColor"></path></svg></div></div><div class="rounded-[inherit] absolute inset-0 p-[var(--padding,1px)] pointer-events-none" style="mask:linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);mask-composite:exclude"><div class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 aspect-[1/1] min-h-full min-w-full scale-[1.2]"><div class="absolute size-full group-hover:rotate-[360deg] rotate-[0deg] bg-[conic-gradient(from_0deg,#3cb091,#1495c7,#6666c1,#efae0f,#3cb091)] dark:opacity-100 opacity-50 transition-transform duration-700"></div></div></div></a></div></div></div></section></main><div aria-hidden="true" class="fixed inset-0 size-full pointer-events-none z-10 mix-blend-difference contrast-0 reduced-motion:hidden overflow-hidden"><div class="w-full px-3 grid grid-cols-6 grid-rows-6 lg:grid-cols-12 lg:grid-rows-12"><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div><div class="relative h-0 pb-[100%]"><div class="opacity-0 size-0.5 bg-primary absolute top-0 left-0 gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute top-full gsap-decorative-dot"></div><div class="opacity-0 size-0.5 bg-primary absolute left-full top-full gsap-decorative-dot"></div></div></div></div><footer class="footer-module-scss-module__yUv0PG__footer relative overflow-hidden pt-20 text-xs sm:text-sm text-primary z-10 bg-neutral-950" data-datocms-noindex="true"><div class="!py-8 container"><div class="flex flex-col flex-wrap gap-12 md:grid md:grid-cols-3 md:gap-3 lg:grid-cols-6"><svg viewBox="0 0 33 33" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="size-8 sm:size-12 text-white"><path d="M14.0973 27.6738L24.8046 24.8048L27.6738 14.0974L19.8354 6.25904L9.128 9.128L6.25888 19.8354L14.0973 27.6738ZM12.3475 8.9664L21.5851 8.9664L26.2038 16.9664L21.5851 24.9664H12.3475L7.7288 16.9664L12.3475 8.9664Z"></path><path d="M11.6058 22.3271L18.9285 24.2893L24.2893 18.9285L22.3271 11.6058L15.0043 9.64354L9.64354 15.0043L11.6058 22.3271Z"></path></svg><nav class="grid grid-cols-2 gap-x-3 gap-y-8 sm:gap-y-12 hover-focus-parent whitespace-nowrap md:col-span-2 lg:col-start-3 lg:col-span-full lg:grid-cols-4"><section aria-labelledby="Features" class="flex flex-col gap-2 sm:gap-4 sm:flex-1 basis-1/2 body-sm"><h3 class="text-primary" id="Features">Features</h3><ul class="flex flex-col gap-1.5 sm:gap-2 group"><li><a aria-label="CLI" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="/features#cli">CLI</a></li><li><a aria-label="Merge queue" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="/features#merge-queue">Merge queue</a></li><li><a aria-label="Insights" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="/features#insights">Insights</a></li><li><a aria-label="PR inbox" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="/features#inbox">PR inbox</a></li><li><a aria-label="AI Reviews" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="/features/ai-reviews">AI Reviews</a></li><li><a aria-label="Agents" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="/features/agents">Agents<div class="font-bold bg-neutral-800 px-1.5 py-0.5 rounded-full uppercase empty:hidden text-xxs tabular-nums">New</div></a></li><li><a target="_blank" aria-label="Graphite Chat" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="/features/chat">Graphite Chat</a></li></ul></section><section aria-labelledby="Company" class="flex flex-col gap-2 sm:gap-4 sm:flex-1 basis-1/2 body-sm"><h3 class="text-primary" id="Company">Company</h3><ul class="flex flex-col gap-1.5 sm:gap-2 group"><li><a aria-label="Blog" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="/blog">Blog</a></li><li><a aria-label="Customers" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="/customers">Customers</a></li><li><a aria-label="Careers" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="/careers">Careers<div class="font-bold bg-neutral-800 px-1.5 py-0.5 rounded-full uppercase empty:hidden text-xxs tabular-nums">0</div></a></li><li><a aria-label="Privacy policy" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="/privacy">Privacy policy</a></li><li><a aria-label="Terms of service" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="/terms-of-service">Terms of service</a></li></ul></section><section aria-labelledby="Resources" class="flex flex-col gap-2 sm:gap-4 sm:flex-1 basis-1/2 body-sm"><h3 class="text-primary" id="Resources">Resources</h3><ul class="flex flex-col gap-1.5 sm:gap-2 group"><li><a aria-label="Docs" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="/docs">Docs</a></li><li><a aria-label="Pricing" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="/pricing">Pricing</a></li><li><a aria-label="Status" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="https://status.graphite.com">Status</a></li><li><a aria-label="Guides" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="/guides">Guides</a></li><li><a aria-label="Stacking workflow" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="/stacking">Stacking workflow</a></li></ul></section><section aria-labelledby="Connect" class="flex flex-col gap-2 sm:gap-4 sm:flex-1 basis-1/2 body-sm"><h3 class="text-primary" id="Connect">Connect</h3><ul class="flex flex-col gap-1.5 sm:gap-2 group"><li><a aria-label="Contact us" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="https://cursor.com/contact-sales?product=graphite"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-mail" aria-hidden="true"><path d="m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7"></path><rect x="2" y="4" width="20" height="16" rx="2"></rect></svg>Contact us</a></li><li><a aria-label="Community Slack" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="https://community.graphite.com"><svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.0494 6.16052C12.0494 5.34688 12.707 4.68927 13.5206 4.68927C14.3343 4.68927 14.9919 5.34688 14.9919 6.16052C14.9919 6.97417 14.3343 7.63177 13.5206 7.63177H12.0494V6.16052ZM11.3138 6.16052C11.3138 6.97417 10.6562 7.63177 9.84252 7.63177C9.02887 7.63177 8.37127 6.97417 8.37127 6.16052V2.47125C8.37127 1.6576 9.02887 1 9.84252 1C10.6562 1 11.3138 1.6576 11.3138 2.47125V6.16052ZM4.68341 2.47129C4.68341 3.28493 5.34102 3.94254 6.15466 3.94254H7.62591V2.47129C7.62591 1.65764 6.96831 1.00004 6.15466 1.00004C5.34102 1.00004 4.68341 1.65764 4.68341 2.47129ZM7.62591 6.16056C7.62591 5.34691 6.96831 4.68931 6.15466 4.68931H2.46539C1.65174 4.68931 0.994141 5.34691 0.994141 6.16056C0.994141 6.9742 1.65174 7.63181 2.46539 7.63181H6.15466C6.96831 7.63181 7.62591 6.9742 7.62591 6.16056ZM2.47468 11.3218C3.28833 11.3218 3.94593 10.6642 3.94593 9.85058V8.37933H2.47468C1.66103 8.37933 1.00343 9.03693 1.00343 9.85058C1.00343 10.6642 1.66103 11.3218 2.47468 11.3218ZM6.15281 8.37933C5.33916 8.37933 4.68156 9.03693 4.68156 9.85058V13.5287C4.68156 14.3423 5.33916 15 6.15281 15C6.96645 15 7.62406 14.3423 7.62406 13.5287V9.85058C7.62406 9.03693 6.96645 8.37933 6.15281 8.37933ZM11.3138 13.5287C11.3138 12.7151 10.6562 12.0575 9.84252 12.0575H8.37127V13.5287C8.37127 14.3423 9.02887 15 9.84252 15C10.6562 15 11.3138 14.3423 11.3138 13.5287ZM8.37127 9.85058C8.37127 10.6642 9.02887 11.3218 9.84252 11.3218H13.5318C14.3454 11.3218 15.003 10.6642 15.003 9.85058C15.003 9.03693 14.3454 8.37933 13.5318 8.37933H9.84252C9.02887 8.37933 8.37127 9.03693 8.37127 9.85058Z"></path></svg><span class="sm:inline hidden">Community</span> Slack</a></li><li><a aria-label="GitHub" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="https://github.com/withgraphite/"><svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M8 1C4.0625 1 1 4.0625 1 8C1 12.5938 5.15625 14.5625 5.8125 14.5625C6.25 14.5625 6.25 14.3438 6.25 14.125V13.0312C4.71875 13.4688 4.0625 12.5938 3.84375 11.9375C3.84375 11.9375 3.84375 11.7188 3.40625 11.2812C3.1875 11.0625 2.3125 10.625 3.1875 10.625C3.84375 10.625 4.28125 11.5 4.28125 11.5C4.9375 12.375 5.8125 12.1562 6.25 11.9375C6.25 11.5 6.6875 11.0625 6.6875 11.0625C4.9375 10.8438 3.625 10.1875 3.625 7.78125C3.625 6.90625 3.84375 6.25 4.28125 5.8125C4.28125 5.8125 3.84375 4.9375 4.28125 3.84375C4.28125 3.84375 5.375 3.84375 6.25 4.71875C6.90625 4.28125 9.09375 4.28125 9.75 4.71875C10.625 3.84375 11.7188 3.84375 11.7188 3.84375C12.1562 5.375 11.7188 5.8125 11.7188 5.8125C12.1562 6.25 12.375 6.90625 12.375 7.78125C12.375 10.1875 10.8438 10.8438 9.3125 11.0625C9.53125 11.2812 9.75 11.7188 9.75 12.375V14.125C9.75 14.3438 9.75 14.5625 10.1875 14.5625C10.8438 14.5625 15 12.5938 15 8C15 4.0625 11.9375 1 8 1Z"></path></svg>GitHub</a></li><li><a aria-label="X (Twitter)" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="https://x.com/graphite/"><svg width="24" height="24" viewBox="0 0 24 24"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" fill="currentColor"></path></svg>X <span class="sm:inline hidden">(Twitter)</span></a></li><li><a aria-label="LinkedIn" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="https://www.linkedin.com/company/withgraphite/"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" data-supported-dps="24x24" fill="currentColor" width="24" height="24" focusable="false"><path d="M20.5 2h-17A1.5 1.5 0 002 3.5v17A1.5 1.5 0 003.5 22h17a1.5 1.5 0 001.5-1.5v-17A1.5 1.5 0 0020.5 2zM8 19H5v-9h3zM6.5 8.25A1.75 1.75 0 118.3 6.5a1.78 1.78 0 01-1.8 1.75zM19 19h-3v-4.74c0-1.42-.6-1.93-1.38-1.93A1.74 1.74 0 0013 14.19a.66.66 0 000 .14V19h-3v-9h2.9v1.3a3.11 3.11 0 012.7-1.4c1.55 0 3.36.86 3.36 3.66z"></path></svg>LinkedIn</a></li><li><a aria-label="YouTube" class="flex items-center gap-1 [&>svg]:size-3 sm:[&>svg]:size-4 [&>svg]:mr-0.5 sm:[&>svg]:mr-1 transition-all hover-focus-child ease duration-500 text-neutral-400" href="https://www.youtube.com/@withgraphite"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-youtube" aria-hidden="true"><path d="M2.5 17a24.12 24.12 0 0 1 0-10 2 2 0 0 1 1.4-1.4 49.56 49.56 0 0 1 16.2 0A2 2 0 0 1 21.5 7a24.12 24.12 0 0 1 0 10 2 2 0 0 1-1.4 1.4 49.55 49.55 0 0 1-16.2 0A2 2 0 0 1 2.5 17"></path><path d="m10 15 5-3-5-3z"></path></svg>YouTube</a></li></ul></section></nav></div></div><div class="container border-t border-neutral-800 text-tertiary py-8"><div class="flex w-full justify-between text-xxs sm:text-xs"><a target="_blank" class="flex items-center flex-row whitespace-nowrap group text-yellow-500" href="https://status.graphite.com"><div class="size-4 rounded-full bg-current/25 flex items-center justify-center"><div class="size-2 relative"><div class="w-full h-full absolute inset-0 bg-current rounded-full blur-[1px] opacity-50 motion-reduce:animate-none"></div><div class="w-full h-full absolute inset-0 bg-current rounded-full "></div></div></div><div class="ml-2 mr-1">Loading</div><svg width="12" height="10" viewBox="0 0 12 10" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="-rotate-45 group-hover:opacity-100 opacity-0 transition-opacity"><path d="M5.8965 1.208L8.9525 4.248H0.9205V5.432H8.9525L5.9125 8.488L6.6805 9.256L11.0805 4.84L6.6645 0.424L5.8965 1.208Z" fill="currentColor"></path></svg></a><div class="flex">© Graphite <!-- -->2026</div></div><div class="footer-module-scss-module__yUv0PG__wordmark" style="--mask-size:75%" id="wordmark"><img alt="An image of the Graphite logo as a neon sign" loading="lazy" width="1024" height="341" decoding="async" data-nimg="1" class="footer-module-scss-module__yUv0PG__bg footer-module-scss-module__yUv0PG__bg--hidden" style="color:transparent" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fgraphite_logo_neon_sign.fd632602.webp&w=1080&q=75&dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fgraphite_logo_neon_sign.fd632602.webp&w=2048&q=75&dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fgraphite_logo_neon_sign.fd632602.webp&w=2048&q=75&dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv"/><div class="footer-module-scss-module__yUv0PG__aberrations"><div class="footer-module-scss-module__yUv0PG__aberration footer-module-scss-module__yUv0PG__bg" style="--offset:8px"><div class="footer-module-scss-module__yUv0PG__bg footer-module-scss-module__yUv0PG__aberration__inner" style="mask-image:image-set(url(/images/footer/wordmark/white.webp) 1x, url(/images/footer/wordmark/white@2x.webp) 2x);background-color:#ff6231"></div></div><div class="footer-module-scss-module__yUv0PG__aberration footer-module-scss-module__yUv0PG__bg" style="--offset:16px"><div class="footer-module-scss-module__yUv0PG__bg footer-module-scss-module__yUv0PG__aberration__inner" style="mask-image:image-set(url(/images/footer/wordmark/white.webp) 1x, url(/images/footer/wordmark/white@2x.webp) 2x);background-color:#ffb931"></div></div><div class="footer-module-scss-module__yUv0PG__aberration footer-module-scss-module__yUv0PG__bg" style="--offset:24px"><div class="footer-module-scss-module__yUv0PG__bg footer-module-scss-module__yUv0PG__aberration__inner" style="mask-image:image-set(url(/images/footer/wordmark/white.webp) 1x, url(/images/footer/wordmark/white@2x.webp) 2x);background-color:#14c7ff"></div></div><div class="footer-module-scss-module__yUv0PG__aberration footer-module-scss-module__yUv0PG__bg" style="--offset:32px"><div class="footer-module-scss-module__yUv0PG__bg footer-module-scss-module__yUv0PG__aberration__inner" style="mask-image:image-set(url(/images/footer/wordmark/white.webp) 1x, url(/images/footer/wordmark/white@2x.webp) 2x);background-color:#1061ff"></div></div></div><img alt="Graphite wordmark" loading="lazy" width="2048" height="683" decoding="async" data-nimg="1" class="footer-module-scss-module__yUv0PG__bg footer-module-scss-module__yUv0PG__bg--hidden" style="color:transparent" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fwhite%402x.6327aed5.webp&w=2048&q=75&dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fwhite%402x.6327aed5.webp&w=3840&q=75&dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fwhite%402x.6327aed5.webp&w=3840&q=75&dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv"/></div></div></footer></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"data":{"id":"JQO38aicQt2Po4qH1PD6Tg","slug":"post-mortem-12-06-23","title":"Post mortem: our outage took 124 seconds from you, here's 378 back","metatags":[{"title":"Post mortem: we took 124 seconds from you, here's 378 back","description":"If you haven’t seen the global headlines yet: Graphite had an outage. In the interest of full transparency and accountability, I, Greg Foster, as the CTO and responding on-call engineer, want to give a full report of the incident, and reaffirm our commitment to our community and customers.","ogImage":{"url":"https://www.datocms-assets.com/85246/1701982310-fixed.png"},"noIndex":false}],"date":"2023-12-07","image":{"blurUpThumb":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAYCAYAAADKx8xXAAAC0klEQVR42jVUCZIaMQyUZHkGatkjeWIekA/mTVuhdinAYx1pDYSqxoZx6+iWR//8+k0cQc3sgWkHcRP8N4LZowmZKs2l0+ydvCuFCOlwexDdASssRaTISCZxkjQmm/UlANOD+D0nSeBxEedkZHwBkSlCksi9CVv4mBQ3gBxnd+LZBkhBspc5P8Tma+1B1CKaSLPQOdNuFkbmz1L/2vYs1RAAxDnfQUbYaEGULqwzNWf2zdI/EYSqbz1TdRHVyVHCPrCeOJAynCMpLXk1Tp54AHxij4JBvDQi9Ev4/S6NTuJ5ZMmRmRaU6SzHyagV0YA3hPtCJaS3RdEJYkiekPnA2TqUsZRExhRjVlNZp8oL8GbKX1k9boelehSevAqnIhuz7KnCM9mZaWpr8LBb10N5uosTx7VEX6Rxg2+Mc9WCwTxDRkZGd9WE8ey9t9CnOLF2YhcJkCTrA1UYmqCGIiK/pTbP3gPIxOTspWaDOqUPxEekYESDByACRYT/2QQmY4gQgHC+zigewmwgyzVsAqYGckV9gQgF0FQJbMBknC+K5jaRwZO3GQAVqGBwbM9YSqFvLp1kVnFlsObtXuIYbVvQGEn3wbxtsNvQA0KLgNJBLZ1pw32hKlf5uhM3HDYZw0GUIjKIqA+8xtQ9m8dkzzvXWBSx30YRUeJ25/uYPEbDHrOGG1IN4nYEroejkQi+lgw78bjhJlgR7QLceRiICItxLclwqOYKI+JXAO02wpiQvnrdTCrtzux0wdqwYsiBGmEMzj7vQRdkRCQAq/4QfRC55tnPUKKxlC00H8QWKTpDOma00wMo9aeuILU9NJo/s9JCwZCyVUZBqZZ9uUdfb9kPhD1MLOJ6KM/gjqBcvqHUb4TAW0n9SWy5LNdcQFpXwv5hx2tFkGfGvde8YrdAsCwiogsOIxtIO54Z16Y1C8SK4Sh1m26YW65Az4xCrd4eGO7/QMZ/syVMR1xrJrgAAAAASUVORK5CYII=","url":"https://www.datocms-assets.com/85246/1701982310-fixed.png","alt":"screenshot of an apple watch showing a heart rate spike due to production outage"},"author":{"name":"Greg Foster","headshot":{"blurUpThumb":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgLFQoTFRgQFRMPFRINDw0NGhYZGBYfIiEmHysjJikoHRUiJDUlKC0vMjIyGSI4PTcwPCsxMi8BCgsLDg0OHA0NHC8cFhwvLy8vLy81Ly8vLy8vNS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIABgAGAMBIgACEQEDEQH/xAAYAAEBAQEBAAAAAAAAAAAAAAAAAwUGBP/EAB8QAAEEAgIDAAAAAAAAAAAAAAABAgMEESEFExIiMf/EABgBAAMBAQAAAAAAAAAAAAAAAAMEBQIA/8QAGBEAAwEBAAAAAAAAAAAAAAAAAQIRAAP/2gAMAwEAAhEDEQA/AI3HxPsYQrx7OuwjsGfLiG6nn8OgpWqioiayYdhd3NTNbuZJNhQeSSeNtr1AZSJlmU3LtGGexpCFbjkZaRM6AJzE3WOaibSdRibIiqAA6kzKuou//9k=","url":"https://www.datocms-assets.com/85246/1677776207-greg.png","alt":null},"shortBio":"Cofounder \u0026 CTO of Graphite"},"categories":[{"id":"99894518","title":"Engineering"}],"content":{"value":{"schema":"dast","document":{"type":"root","children":[{"type":"paragraph","children":[{"type":"span","value":"If you haven’t seen the global headlines yet: Graphite had an outage."}]},{"type":"paragraph","children":[{"type":"span","value":"In the interest of full transparency and accountability, I, Greg Foster, as the CTO and responding on-call engineer, want to give a full report of the incident, and reaffirm our commitment to our community and customers."}]},{"type":"paragraph","children":[{"type":"span","value":"While Graphite was down for ~2 minutes, and you'll never get those valuable moments of your life back, in this article I will provide you with ~6 minutes of content. This nets out to a GAIN of 4 minutes, putting you back on top. Let's dive in."}]},{"type":"heading","level":2,"children":[{"type":"span","marks":["strong"],"value":"Incident Overview:"}]},{"type":"list","style":"bulleted","children":[{"type":"listItem","children":[{"type":"paragraph","children":[{"type":"span","marks":["strong"],"value":"Time and Duration:"},{"type":"span","value":" On December 6, 2023, at 2:13:26 PM EST, Graphite’s web application experienced an unexpected downtime lasting precisely 124 seconds."}]}]},{"type":"listItem","children":[{"type":"paragraph","children":[{"type":"span","marks":["strong"],"value":"Impact:"},{"type":"span","value":" Nearly a dozen users encountered a 404 error page when attempting to load new pages, particularly affecting the pull request functionality. This interruption temporarily hindered user code reviews while encouraging premature coffee breaks."}]}]}]},{"item":"dZSUG6ucTVilf4sRxo5Pgw","type":"block"},{"type":"heading","level":2,"children":[{"type":"span","marks":["strong"],"value":"Affected surfaces:"}]},{"type":"paragraph","children":[{"type":"span","value":"Luckily, the issue was solely isolated to new page loads of the web application. Other key components of the Graphite ecosystem, such as asynchronous jobs, merge queues, the CLI tool, the VS Code extension, and the system tray application remained fully operational during this time. This maintained continuity in several backend and integrated services, thereby limiting the overall disruption to our users."}]},{"type":"heading","level":2,"children":[{"type":"span","marks":["strong"],"value":"Initial detection:"}]},{"type":"paragraph","children":[{"type":"span","value":"The problem was first identified thousands of milliseconds into the incident, at precisely 2:13:26 PM EST by myself, Greg Foster, following a user report in the Graphite Community Slack channel."}]},{"item":"UvAKSPSHSqS5k-3ROy0S9w","type":"block"},{"item":"a9FIN3BGTxCNwcqw4l7hDQ","type":"block"},{"type":"heading","level":2,"children":[{"type":"span","marks":["strong"],"value":"Detailed timeline:"}]},{"type":"list","style":"bulleted","children":[{"type":"listItem","children":[{"type":"paragraph","children":[{"type":"span","marks":["strong"],"value":"2:13:35 PM: "},{"type":"span","value":"Adhering to my on-call duties, I promptly instructed Alyssa, another key software dev on our team, to update the Graphite status page to communicate the service disruption."}]}]},{"type":"listItem","children":[{"type":"paragraph","children":[{"type":"span","marks":["strong"],"value":"2:13:37 PM:"},{"type":"span","value":" Concurrent with the status page update, belated PagerDuty alarms began firing, indicating a significant uptick in errors and triggering "},{"url":"https://www.hubermanlab.com/episode/tools-for-managing-stress-and-anxiety","type":"link","children":[{"type":"span","value":"parasympathetic trauma responses"}]},{"type":"span","value":" across the room. The office was literally “abuzz” with vibrating phones, and apple watches warning of imminent cardiac arrest (see above)."}]}]},{"type":"listItem","children":[{"type":"paragraph","children":[{"type":"span","marks":["strong"],"value":"2:13:40 PM:"},{"type":"span","value":" Brendan, another Graphite engineer, began an exploration in the AWS console to identify and address the underlying issue."}]}]},{"type":"listItem","children":[{"type":"paragraph","children":[{"type":"span","marks":["strong"],"value":"2:13:45 PM:"},{"type":"span","value":" Suspecting an anomaly with the S3 bucket serving the web application, I started battling through multiple of AWS’s “best-in-industry\" login flows to access the AWS console. After only 16 redirects through different authentication portals, I was in."}]}]},{"type":"listItem","children":[{"type":"paragraph","children":[{"type":"span","marks":["strong"],"value":"2:13:50 PM:"},{"type":"span","value":" Graphite’s internal Slack channels experienced a surge in activity, with employees reporting the 404 error, and users clamoring for answers in the community Slack. The ➕ emoji reacts to error reports, and dumpster fire gifs were frantically rolling in. It was now clear that this was a... widespread issue."}]}]},{"type":"listItem","children":[{"type":"paragraph","children":[{"type":"span","marks":["strong"],"value":"2:14:30 PM:"},{"type":"span","value":" In the meantime, as I was handling the slack meltdown, Brendan successfully identified a misconfiguration in the S3 bucket settings and proceeded to revert the changes, effectively restoring site functionality."}]}]},{"type":"listItem","children":[{"type":"paragraph","children":[{"type":"span","marks":["strong"],"value":"2:14:40 PM:"},{"type":"span","value":" Following the resolution, site performance returned to normal, and blood pressure readings finally fell below the “fatal hypertension” level. Benchmarks across the board were looking good."}]}]},{"type":"listItem","children":[{"type":"paragraph","children":[{"type":"span","marks":["strong"],"value":"2:14:50 PM:"},{"type":"span","value":" Brendan reminded me of what I said in our 1:1 this morning: “Wow, it’s been so long since we had any kind of outage!” Thank you Brendan."}]}]},{"type":"listItem","children":[{"type":"paragraph","children":[{"type":"span","marks":["strong"],"value":"2:15:40 PM:"},{"type":"span","value":" I updated the community on Slack regarding the resolution and shared a brief explanation of the incident."}]}]}]},{"type":"heading","level":2,"children":[{"type":"span","marks":["strong"],"value":"Root cause analysis:"}]},{"type":"list","style":"bulleted","children":[{"type":"listItem","children":[{"type":"paragraph","children":[{"type":"span","marks":["strong"],"value":"Precursor event:"},{"type":"span","value":" My presentation on the preceding day at 4:50 PM EST, highlighting the exceptional uptime in November, inadvertently angering the SRE gods and cursing the team with subsequent downtime."}]}]},{"type":"listItem","children":[{"type":"paragraph","children":[{"type":"span","marks":["strong"],"value":"Immediate cause:"},{"type":"span","value":" The downtime was initiated by an unintended change to the S3 production bucket configuration at approximately 2:12:35 PM EST, causing CloudFront to serve 404 errors."}]}]}]},{"type":"heading","level":2,"children":[{"type":"span","marks":["strong"],"value":"Immediate solution:"}]},{"type":"paragraph","children":[{"type":"span","value":"The issue was promptly addressed by reverting the changes to the S3 bucket configuration."}]},{"type":"heading","level":2,"children":[{"type":"span","marks":["strong"],"value":"Future corrective actions:"}]},{"type":"list","style":"bulleted","children":[{"type":"listItem","children":[{"type":"paragraph","children":[{"type":"span","value":"Graphite will encourage a new internal policy requiring testing of configuration changes in a staging environment prior to production deployment."}]}]},{"type":"listItem","children":[{"type":"paragraph","children":[{"type":"span","value":"Add linter warning to caution against making verbal jinxing statements about system reliability."}]}]}]},{"type":"heading","level":2,"children":[{"type":"span","marks":["strong"],"value":"Acknowledgments:"}]},{"type":"list","style":"bulleted","children":[{"type":"listItem","children":[{"type":"paragraph","children":[{"type":"span","value":"First, I want to extend my sincere thanks to our engineering team for their rapid and effective response to this incident."}]}]},{"type":"listItem","children":[{"type":"paragraph","children":[{"type":"span","value":"I also deeply appreciate our community members on Slack who quickly reported the issue and showed tremendous support throughout the incident."}]}]},{"type":"listItem","children":[{"type":"paragraph","children":[{"type":"span","value":"And thank "},{"type":"span","marks":["strong"],"value":"you,"},{"type":"span","value":" the reader, for making it to the end of the report, hopefully learning from our experience along the way."}]}]}]}]}},"blocks":[{"__typename":"ImageRecord","id":"dZSUG6ucTVilf4sRxo5Pgw","image":{"responsiveImage":{"srcSet":"https://www.datocms-assets.com/85246/1701986382-untitled-45.png?dpr=0.25 458w,https://www.datocms-assets.com/85246/1701986382-untitled-45.png?dpr=0.5 917w,https://www.datocms-assets.com/85246/1701986382-untitled-45.png?dpr=0.75 1375w,https://www.datocms-assets.com/85246/1701986382-untitled-45.png 1834w","webpSrcSet":"https://www.datocms-assets.com/85246/1701986382-untitled-45.png?dpr=0.25\u0026fm=webp 458w,https://www.datocms-assets.com/85246/1701986382-untitled-45.png?dpr=0.5\u0026fm=webp 917w,https://www.datocms-assets.com/85246/1701986382-untitled-45.png?dpr=0.75\u0026fm=webp 1375w,https://www.datocms-assets.com/85246/1701986382-untitled-45.png?fm=webp 1834w","sizes":"(max-width: 1834px) 100vw, 1834px","src":"https://www.datocms-assets.com/85246/1701986382-untitled-45.png","width":1834,"height":583,"aspectRatio":3.1457975986277873,"alt":"screenshots comparing the desired state of the web application to the 404 page","title":null,"base64":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgaDg0NDikhFhUaJR8lMCUrLiUmJCskJh0oHRUlJTUxLS0vMjIyGSI4PT0wPC0xMi8BCgsLDg0JFQUMHDsoFhwvLy8vLy87Oy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIAAgAGAMBIgACEQEDEQH/xAAWAAEBAQAAAAAAAAAAAAAAAAAABQf/xAAfEAABAwQDAQAAAAAAAAAAAAAAAQIEAwUGESExQRL/xAAVAQEBAAAAAAAAAAAAAAAAAAABAP/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AJ93yTLWzGNq9bNSxWZdJVopvktRV16AIWUryPnlibABJ//Z"}}},{"__typename":"ImageRecord","id":"UvAKSPSHSqS5k-3ROy0S9w","image":{"responsiveImage":{"srcSet":"https://www.datocms-assets.com/85246/1701982438-untitled-40.png?dpr=0.25 195w,https://www.datocms-assets.com/85246/1701982438-untitled-40.png?dpr=0.5 391w,https://www.datocms-assets.com/85246/1701982438-untitled-40.png?dpr=0.75 586w,https://www.datocms-assets.com/85246/1701982438-untitled-40.png 782w","webpSrcSet":"https://www.datocms-assets.com/85246/1701982438-untitled-40.png?dpr=0.25\u0026fm=webp 195w,https://www.datocms-assets.com/85246/1701982438-untitled-40.png?dpr=0.5\u0026fm=webp 391w,https://www.datocms-assets.com/85246/1701982438-untitled-40.png?dpr=0.75\u0026fm=webp 586w,https://www.datocms-assets.com/85246/1701982438-untitled-40.png?fm=webp 782w","sizes":"(max-width: 782px) 100vw, 782px","src":"https://www.datocms-assets.com/85246/1701982438-untitled-40.png","width":782,"height":434,"aspectRatio":1.8018433179723503,"alt":"screenshot of slack message from a community member showing a 404 error message","title":null,"base64":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0hFhEVIxUgLSsfLiEyKzcvLS41IhUtJTUsNC4yPjI1GjU4PT0wPTUxMjUBCgsLDg0OEBAQHS8cFhwvLy8vLy87Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIAA4AGAMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAFBgEDBAD/xAAiEAABAwMDBQAAAAAAAAAAAAABAgMFAAQRBgchEzFRcZH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAgD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwC2J24j5OI5cH2iDGzcULLl0ZpC09q+RtYRwBwkp4zmtlnuDKuWyklxWPdKRfUG1sbbWIU1cBKh2INdSpP6sknrMJ6qhk+aisX/2Q=="}}},{"__typename":"ImageRecord","id":"a9FIN3BGTxCNwcqw4l7hDQ","image":{"responsiveImage":{"srcSet":"https://www.datocms-assets.com/85246/1701982491-untitled-43.png?dpr=0.25 389w,https://www.datocms-assets.com/85246/1701982491-untitled-43.png?dpr=0.5 778w,https://www.datocms-assets.com/85246/1701982491-untitled-43.png?dpr=0.75 1167w,https://www.datocms-assets.com/85246/1701982491-untitled-43.png 1556w","webpSrcSet":"https://www.datocms-assets.com/85246/1701982491-untitled-43.png?dpr=0.25\u0026fm=webp 389w,https://www.datocms-assets.com/85246/1701982491-untitled-43.png?dpr=0.5\u0026fm=webp 778w,https://www.datocms-assets.com/85246/1701982491-untitled-43.png?dpr=0.75\u0026fm=webp 1167w,https://www.datocms-assets.com/85246/1701982491-untitled-43.png?fm=webp 1556w","sizes":"(max-width: 1556px) 100vw, 1556px","src":"https://www.datocms-assets.com/85246/1701982491-untitled-43.png","width":1556,"height":802,"aspectRatio":1.940149625935162,"alt":"screenshot from internal slack announcing the announcement","title":null,"base64":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgLChALFRgQDQ0ODhsVFg0YFxUZGCIVFhUdHysjGh0oHRUWJDUlKC0vMjIyGSI4PTcwPCsxMi8BCgsLBQUFEAUFEC8cFhwvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIAA0AGAMBIgACEQEDEQH/xAAXAAADAQAAAAAAAAAAAAAAAAAABAYF/8QAHRAAAQQDAQEAAAAAAAAAAAAAAQACAwQFESEGEv/EABUBAQEAAAAAAAAAAAAAAAAAAAIA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AmcdFkJKBHyVn5GjajgJe0hV3n7Ln0+tCV9M/VQ6ASFDljhW6hORgPrnaFJ//2Q=="}}}]}},"relatedPosts":[{"id":"GmOgXyJ9SombL0woLQdbiA","slug":"ai-wont-replace-human-code-review","title":"Why AI will never replace human code review","metatags":[{"title":"Why AI will never replace human code review","description":"It needs to be said: AI can’t fully replace human code review. Not now, and likely not ever. ","ogImage":{"url":"https://www.datocms-assets.com/85246/1742309871-ai_review_is_bad_share_image.png"},"noIndex":false}],"date":"2025-03-18","image":null,"author":{"name":"Greg Foster","headshot":{"blurUpThumb":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgLFQoTFRgQFRMPFRINDw0NGhYZGBYfIiEmHysjJikoHRUiJDUlKC0vMjIyGSI4PTcwPCsxMi8BCgsLDg0OHA0NHC8cFhwvLy8vLy81Ly8vLy8vNS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIABgAGAMBIgACEQEDEQH/xAAYAAEBAQEBAAAAAAAAAAAAAAAAAwUGBP/EAB8QAAEEAgIDAAAAAAAAAAAAAAABAgMEESEFExIiMf/EABgBAAMBAQAAAAAAAAAAAAAAAAMEBQIA/8QAGBEAAwEBAAAAAAAAAAAAAAAAAQIRAAP/2gAMAwEAAhEDEQA/AI3HxPsYQrx7OuwjsGfLiG6nn8OgpWqioiayYdhd3NTNbuZJNhQeSSeNtr1AZSJlmU3LtGGexpCFbjkZaRM6AJzE3WOaibSdRibIiqAA6kzKuou//9k=","url":"https://www.datocms-assets.com/85246/1677776207-greg.png","alt":null},"shortBio":"Cofounder \u0026 CTO of Graphite"},"categories":[{"id":"99894518","title":"Engineering"}]},{"id":"BtqSUmC1QnmUR8PdrdVGSA","slug":"ai-code-generation-will-remain-fragmented","title":"AI code generation will remain fragmented","metatags":[{"title":"AI code generation will remain fragmented","description":"Explore why no single code generation tool will dominate the market. Learn how fragmented context, open interfaces, and accessible LLMs prevent long-term competitive advantages in the code-gen space.","ogImage":null,"noIndex":false}],"date":"2024-11-26","image":null,"author":{"name":"Greg Foster","headshot":{"blurUpThumb":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgLFQoTFRgQFRMPFRINDw0NGhYZGBYfIiEmHysjJikoHRUiJDUlKC0vMjIyGSI4PTcwPCsxMi8BCgsLDg0OHA0NHC8cFhwvLy8vLy81Ly8vLy8vNS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIABgAGAMBIgACEQEDEQH/xAAYAAEBAQEBAAAAAAAAAAAAAAAAAwUGBP/EAB8QAAEEAgIDAAAAAAAAAAAAAAABAgMEESEFExIiMf/EABgBAAMBAQAAAAAAAAAAAAAAAAMEBQIA/8QAGBEAAwEBAAAAAAAAAAAAAAAAAQIRAAP/2gAMAwEAAhEDEQA/AI3HxPsYQrx7OuwjsGfLiG6nn8OgpWqioiayYdhd3NTNbuZJNhQeSSeNtr1AZSJlmU3LtGGexpCFbjkZaRM6AJzE3WOaibSdRibIiqAA6kzKuou//9k=","url":"https://www.datocms-assets.com/85246/1677776207-greg.png","alt":null},"shortBio":"Cofounder \u0026 CTO of Graphite"},"categories":[{"id":"99894518","title":"Engineering"}]},{"id":"CPUbjT_2QxOmaP1TpV5PAw","slug":"introducing-frozen-branches","title":"Introducing frozen branches: A safer way to build on your teammates’ work","metatags":[{"title":"Introducing frozen branches: A safer way to build on your teammates’ work","description":"Protect teammates’ work, prevent accidental edits, and confidently build on shared branches without breaking workflows","ogImage":{"url":"https://www.datocms-assets.com/85246/1758221610-guides-cli-image.png"},"noIndex":false}],"date":"2025-09-18","image":{"blurUpThumb":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgVDQ4XFQ8QDQ4NDRENFhEYFxUZGCITFhUaHysjGh0oHRUWJDUlKC0vMjIyGSI4PTcwPCsxMi8BCgsLDg0OFQ0QHC8oGCgvLy8vLy87Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIAA4AGAMBIgACEQEDEQH/xAAZAAABBQAAAAAAAAAAAAAAAAAEAAEDBQf/xAAbEAACAgMBAAAAAAAAAAAAAAAAAQIEBREhA//EABcBAAMBAAAAAAAAAAAAAAAAAAIDBAH/xAAXEQADAQAAAAAAAAAAAAAAAAAAAhIR/9oADAMBAAIRAxEAPwDMqWNlOA1nHOGw7H2GvJ8IbluW3wolROlbCpPYgrw9231CBlTT/9k=","url":"https://www.datocms-assets.com/85246/1758221610-guides-cli-image.png","alt":"pic of CLI"},"author":{"name":"David Bradford","headshot":{"blurUpThumb":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgLFQ8ODhMQDQ4NDh0PDREYFxolGBYVFiEdHysjHR0oHSEiJDUlKC0vMjIyGSI4PTcwPCsxMi8BCgsLAg0OHA0OHDscFhw7Ly8vLy8vNS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIABgAGAMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABQYDAf/EAB8QAAICAgIDAQAAAAAAAAAAAAECAAMEBRExBhIyIv/EABYBAQEBAAAAAAAAAAAAAAAAAAQDAf/EABsRAAEFAQEAAAAAAAAAAAAAAAUAAxESMQQC/9oADAMBAAIRAxEAPwBll6spUYqXG/fEsNt6V1HlhJtGqe76HcY4VJyjc40dVapq1sqBMI6qxg2OCrCclfJYlCM4NHWURu/Ib7F4DGTqbbJW0N7HuEIZ1oZOJfO6RrqpsPyLIGOAWMIQm+WhsYiOOkbav//Z","url":"https://www.datocms-assets.com/85246/1676042393-img_1141-1.png","alt":null},"shortBio":""},"categories":[{"id":"99894518","title":"Engineering"}]}]},"__N_SSG":true},"page":"/blog/[slug]","query":{"slug":"post-mortem-12-06-23"},"buildId":"0Ku2uBfu23Pa9kZxkrE8D","isFallback":false,"isExperimentalCompile":false,"dynamicIds":[52437],"gsp":true,"scriptLoader":[{"async":true,"src":"https://tag.clearbitscripts.com/v1/pk_09728d68daeca7c8a20727cad15914bc/tags.js","referrerPolicy":"strict-origin-when-cross-origin","strategy":"afterInteractive"}]}</script></body></html> |