Files
nexus/sreweekly/articles/417/05-onboarding-roulette-deleting-our-employee-accounts-daily.html
2026-09-12 17:23:01 +08:00

28 lines
159 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html 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="">Onboarding roulette: deleting our employee accounts daily</title><meta name="description" content="I’m a strong believer in automated tests - and a moderately disciplined author of them. Software engineering is exceptionally hard to get functionally correct, and even harder to avoid regressing later. As my wise teammate Dave says, “Legacy code is any code that doesn’t have a test.”" 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="Onboarding roulette: deleting our employee accounts daily" data-next-head=""/><meta name="twitter:description" content="I’m a strong believer in automated tests - and a moderately disciplined author of them. Software engineering is exceptionally hard to get functionally correct, and even harder to avoid regressing later. As my wise teammate Dave says, “Legacy code is any code that doesn’t have a test.”" data-next-head=""/><meta name="twitter:image" content="https://www.datocms-assets.com/85246/1710457281-frame-10123339.png?fm=jpg&amp;q=75&amp;w=1200&amp;h=630&amp;fit=crop" data-next-head=""/><meta property="og:title" content="Onboarding roulette: deleting our employee accounts daily" data-next-head=""/><meta property="og:description" content="I’m a strong believer in automated tests - and a moderately disciplined author of them. Software engineering is exceptionally hard to get functionally correct, and even harder to avoid regressing later. As my wise teammate Dave says, “Legacy code is any code that doesn’t have a test.”" 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/onboarding-roulette" data-next-head=""/><meta property="og:image" content="https://www.datocms-assets.com/85246/1710457281-frame-10123339.png?fm=jpg&amp;q=75&amp;w=1200&amp;h=630&amp;fit=crop" data-next-head=""/><meta property="og:image:alt" content="Onboarding roulette: deleting our employee accounts daily" 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/onboarding-roulette" 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 [&amp;_svg:not([class*=&#x27;text-&#x27;])]:text-muted-foreground flex-col gap-1 p-2 [&amp;_svg:not([class*=&#x27;size-&#x27;])]: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 [&amp;_svg:not([class*=&#x27;text-&#x27;])]:text-muted-foreground flex-col gap-1 p-2 [&amp;_svg:not([class*=&#x27;size-&#x27;])]: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 [&amp;_svg:not([class*=&#x27;text-&#x27;])]:text-muted-foreground flex-col gap-1 p-2 [&amp;_svg:not([class*=&#x27;size-&#x27;])]: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 [&amp;_svg:not([class*=&#x27;text-&#x27;])]:text-muted-foreground flex-col gap-1 p-2 [&amp;_svg:not([class*=&#x27;size-&#x27;])]: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 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_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 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_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:[&amp;&gt;svg]:size-4 [&amp;&gt;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">Onboarding roulette: deleting our employee accounts daily</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&amp;w=16&amp;q=75 16w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&amp;w=32&amp;q=75 32w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&amp;w=48&amp;q=75 48w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&amp;w=64&amp;q=75 64w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&amp;w=96&amp;q=75 96w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&amp;w=128&amp;q=75 128w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&amp;w=256&amp;q=75 256w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&amp;w=384&amp;q=75 384w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&amp;w=640&amp;q=75 640w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&amp;w=750&amp;q=75 750w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&amp;w=828&amp;q=75 828w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&amp;w=1080&amp;q=75 1080w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&amp;w=1200&amp;q=75 1200w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&amp;w=1920&amp;q=75 1920w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&amp;w=2048&amp;q=75 2048w, /_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&amp;w=3840&amp;q=75 3840w" src="/_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F85246%2F1677776207-greg.png&amp;w=3840&amp;q=75"/><p class="">Greg Foster</p></div><p class="tabular-nums [word-spacing:-0.25em]">Mar 13, 2024</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)">To test or not to test?</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)">Getting creative</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)">The onboarding struggle</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)">Spinning the wheel</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)">Current limitations</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)">Feeding the future</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="#to-test-or-not-to-test" tabindex="-1" class="body-base block text-inherit text-balance hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">To test or not to test?</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="#getting-creative" tabindex="-1" class="body-base block text-inherit text-balance hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Getting creative</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="#the-onboarding-struggle" tabindex="-1" class="body-base block text-inherit text-balance hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">The onboarding struggle</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="#spinning-the-wheel" tabindex="-1" class="body-base block text-inherit text-balance hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Spinning the wheel</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="#current-limitations" tabindex="-1" class="body-base block text-inherit text-balance hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Current limitations</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="#feeding-the-future" tabindex="-1" class="body-base block text-inherit text-balance hover:text-primary/70 transition-colors duration-300 ease-(--ease-glide)">Feeding the future</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:[&amp;_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>I’m a strong believer in automated tests - and a moderately disciplined author of them. Software engineering is exceptionally hard to get functionally correct, and even harder to avoid regressing later. As author Michael Feathers says, “Legacy code is any code that doesn’t have a test.”</p><p>Some things, such as server endpoints, database schemas, and UI library components, are straightforward to test.</p><p>Other things are hard to test, such as endpoints that call third-party APIs, react web pages with complex states, and async jobs that require detailed DB records. At Airbnb, I found testing password reset emails hard because of the outsourced email sending that takes place.</p><p>Such functionality still deserves tests - for two reasons. One, it still matters that they don’t regress - and their complexity makes them all the more likely to. Secondly, testing complex features often forces engineers to architect the feature in such a way that it <em>can</em> be tested. The early establishment of tests can motivate narrower interfaces and less coupling, leading to a better long-term codebase.</p><h2 id="to-test-or-not-to-test">To test or not to test?</h2><p>The world’s not perfect - sometimes you have time to write a feature, but not time to establish automated tests on that feature. Why does this happen? Like a reverse P=NP problem, many features are much easier to create than they are to test. Consider a react to-do list app with swipe-to-delete. It can take 30 minutes to create, but might take hours or days to establish automated UI tests that verify “swipe-to-delete”. These imbalances, along with business-driven urgency, lead teams to code features and skip adding expensive tests.</p><p>Is that bad? Not necessarily if you’re pragmatic - there are cases where it’s worthwhile taking on debt by creating functionality without tests. The benefit of the untested feature may be high, the cost of testing high, and your resources low. Maybe you’re on a short-staffed team or an evening side project. If you force yourself to add automated unit tests to your to-do list app, you might never launch it to 10 early adopters. (However, if you still don’t test swipe-to-delete after a million users, you might be asking for an incident.)</p><p>Delaying automated tests is a slippery slope, but product creation requires the art of strategically taking on debt. The “loan” allows teams to validate quickly, and discovered value can later be spent paying down the tech debt (with interest). This is true for startups raising venture, and it’s true for teams building MVPs. Spend too much time building expensive tests up front, and you may run out of time to ship, learn and pivot.</p><div class="relative block my-5 [&amp;&gt;picture]:my-0 [&amp;&gt;picture&gt;*]:object-contain [&amp;&gt;picture&gt;*]:rounded-xs [&amp;&gt;img]:my-0" style="overflow:hidden;position:relative;width:100%;max-width:755px"><img style="display:block;width:100%" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI3NTUiIGhlaWdodD0iNjE0Ij48L3N2Zz4=" aria-hidden="true" alt=""/><img aria-hidden="true" alt="" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgFCgoFBQwFBQUFBREJCgUMFxMZGBYTFhUaHysjGh0oHRUWJDUlKC0vMjIyGSI4PTcwPCsxMi8BCgsLBQUFEAUFEC8cFhwvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIABQAGAMBIgACEQEDEQH/xAAVAAEBAAAAAAAAAAAAAAAAAAAAB//EABQQAQAAAAAAAAAAAAAAAAAAAAD/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAv/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AKwApIAAAAAD/9k=" 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/1710456379-untitled-51.png?dpr=0.25&amp;fm=webp 188w,https://www.datocms-assets.com/85246/1710456379-untitled-51.png?dpr=0.5&amp;fm=webp 377w,https://www.datocms-assets.com/85246/1710456379-untitled-51.png?dpr=0.75&amp;fm=webp 566w,https://www.datocms-assets.com/85246/1710456379-untitled-51.png?fm=webp 755w" sizes="(max-width: 755px) 100vw, 755px" type="image/webp"/><source srcSet="https://www.datocms-assets.com/85246/1710456379-untitled-51.png?dpr=0.25 188w,https://www.datocms-assets.com/85246/1710456379-untitled-51.png?dpr=0.5 377w,https://www.datocms-assets.com/85246/1710456379-untitled-51.png?dpr=0.75 566w,https://www.datocms-assets.com/85246/1710456379-untitled-51.png 755w" sizes="(max-width: 755px) 100vw, 755px"/><img src="https://www.datocms-assets.com/85246/1710456379-untitled-51.png" alt="xkcd comic explains testing" style="position:absolute;left:0;top:0;width:100%;height:100%;max-width:none;max-height:none" loading="lazy"/></picture></noscript></div><p><a href="https://xkcd.com/2730/">https://xkcd.com/2730/</a></p><h2 id="getting-creative">Getting creative</h2><p>Keep in mind that “no automated tests” doesn’t mean “no testing at all.” By default, not having tests means you’re quietly forcing users to find bugs for you. Production traffic and thorough alerting can serve as a weak replacement for automated testing, but you better have rapid rollbacks or flags in place with your finger on the trigger. Frustrated users won’t stick around for long.</p><p>Better than production traffic is a subset of production traffic - you often don’t need all your users to hit a bug to find a regression, just a few. This is where <a href="https://cloud.google.com/deploy/docs/deployment-strategies/canary">canary rollouts</a> and beta cohorts can become useful. But there’s still the issue of real users hitting real regressions, and it requires good monitoring to know when users are having a bad time.</p><p>Better than beta cohorts is <a href="https://codesubmit.io/blog/is-dogfooding-right-for-your-team/">dogfooding</a>. Send real users through the feature that you don’t want to test automatically, but have those users be you. You can’t rage quit your own product, and your eyeballs make for a great dynamic alerting service (just remember to close them for eight hours every night).</p><h2 id="the-onboarding-struggle">The onboarding struggle</h2><p>There you have it—automated tests, canary releases, beta cohorts, and dogfooding—a spectrum of ways to test features. Graphite’s engineering team uses all these techniques, yet there remain blind spots in our functionality.</p><p>One of the hardest blind spots for us to test is product onboarding. It’s a doozie involving an OAuth loop with GitHub, async loading of repository metadata, queries against our own databases, and custom UI elements not reused elsewhere in the app. Despite these challenges onboarding is critical, and we need to test it somehow.</p><p>Classic synthetic tests are rendered flakier than normal due to GitHub login bot detection. Canary traffic testing doesn’t help much here, because production users who fail to onboard rarely report it - and can sometimes appear in logs as indecisive rather than blocked. Beta cohorts rarely catch anything because they only onboard once - the same is true for traditional dogfooding.</p><h2 id="spinning-the-wheel">Spinning the wheel</h2><p>Our solution at Graphite has been to run a roulette script, randomly deleting one of our engineers&#x27; Graphite accounts every day at 9 a.m. We don’t just reset onboarding—we delete their account, tokens, configured filters, uploaded gifs, and more.</p><div class="relative block my-5 [&amp;&gt;picture]:my-0 [&amp;&gt;picture&gt;*]:object-contain [&amp;&gt;picture&gt;*]:rounded-xs [&amp;&gt;img]:my-0" style="overflow:hidden;position:relative;width:100%;max-width:1218px"><img style="display:block;width:100%" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjE4IiBoZWlnaHQ9IjE5NCI+PC9zdmc+" aria-hidden="true" alt=""/><img aria-hidden="true" alt="" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoOCAgFChYRDhIVFRkNBREVEhUYGhQdGBYTFiEaKysjHR0oHRUWJDUlKC0vMjIyGSI4PTcwPCsxMi8BCgsLDg4OHBANHC8cFhwvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIAAQAGAMBIgACEQEDEQH/xAAYAAEAAwEAAAAAAAAAAAAAAAAAAgQGAf/EACEQAAEDAQkAAAAAAAAAAAAAAAABAgRxAwURExQhJJTh/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQD/xAAYEQEBAAMAAAAAAAAAAAAAAAABAAIDEf/aAAwDAQACEQMRAD8AwOua6yXhXOlIXpSdbseq4xbtSkU6BzrWHKOaxqbR4PXAAEpf/9k=" 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/1710474729-untitled-52.png?dpr=0.25&amp;fm=webp 304w,https://www.datocms-assets.com/85246/1710474729-untitled-52.png?dpr=0.5&amp;fm=webp 609w,https://www.datocms-assets.com/85246/1710474729-untitled-52.png?dpr=0.75&amp;fm=webp 913w,https://www.datocms-assets.com/85246/1710474729-untitled-52.png?fm=webp 1218w" sizes="(max-width: 1218px) 100vw, 1218px" type="image/webp"/><source srcSet="https://www.datocms-assets.com/85246/1710474729-untitled-52.png?dpr=0.25 304w,https://www.datocms-assets.com/85246/1710474729-untitled-52.png?dpr=0.5 609w,https://www.datocms-assets.com/85246/1710474729-untitled-52.png?dpr=0.75 913w,https://www.datocms-assets.com/85246/1710474729-untitled-52.png 1218w" sizes="(max-width: 1218px) 100vw, 1218px"/><img src="https://www.datocms-assets.com/85246/1710474729-untitled-52.png" alt="screenshot of roulette bot deleting someone&#x27;s account" style="position:absolute;left:0;top:0;width:100%;height:100%;max-width:none;max-height:none" loading="lazy"/></picture></noscript></div><p>Isn’t that frustrating? Sure. Folks on our team come to work to code new features, not to find themselves logged out and forced to recreate their accounts from scratch. We were cautious when first trying the technique, but the benefits became clear immediately. <em>Note: this is only their Graphite product account - they still have access to GitHub and all other company accounts.</em></p><div class="relative block my-5 [&amp;&gt;picture]:my-0 [&amp;&gt;picture&gt;*]:object-contain [&amp;&gt;picture&gt;*]:rounded-xs [&amp;&gt;img]:my-0" style="overflow:hidden;position:relative;width:100%;max-width:1238px"><img style="display:block;width:100%" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjM4IiBoZWlnaHQ9IjE0MzAiPjwvc3ZnPg==" aria-hidden="true" alt=""/><img aria-hidden="true" alt="" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBg0OFA0SDQoLDQ8HDg0KCxENDREYFxoZGBYVFhUaHysjGh0oHRUiJDUlKC0vMjIyGSI4PTcwPCsxMi8BCgsLBQUFEAUFEC8cFhwvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIABkAFQMBIgACEQEDEQH/xAAZAAADAQEBAAAAAAAAAAAAAAADBAUABgH/xAAeEAACAgICAwAAAAAAAAAAAAAAAgEEAxIRMhMhMf/EABUBAQEAAAAAAAAAAAAAAAAAAAAC/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A46wzypNdn2G1uw8CeexG5SQmluTA2z+zAVGpeORLPXnYuWOxOsfQJbYuJPQz9jAf/9k=" 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/1710474769-untitled-53.png?dpr=0.25&amp;fm=webp 309w,https://www.datocms-assets.com/85246/1710474769-untitled-53.png?dpr=0.5&amp;fm=webp 619w,https://www.datocms-assets.com/85246/1710474769-untitled-53.png?dpr=0.75&amp;fm=webp 928w,https://www.datocms-assets.com/85246/1710474769-untitled-53.png?fm=webp 1238w" sizes="(max-width: 1238px) 100vw, 1238px" type="image/webp"/><source srcSet="https://www.datocms-assets.com/85246/1710474769-untitled-53.png?dpr=0.25 309w,https://www.datocms-assets.com/85246/1710474769-untitled-53.png?dpr=0.5 619w,https://www.datocms-assets.com/85246/1710474769-untitled-53.png?dpr=0.75 928w,https://www.datocms-assets.com/85246/1710474769-untitled-53.png 1238w" sizes="(max-width: 1238px) 100vw, 1238px"/><img src="https://www.datocms-assets.com/85246/1710474769-untitled-53.png" alt="slack bug report from onboarding test" style="position:absolute;left:0;top:0;width:100%;height:100%;max-width:none;max-height:none" loading="lazy"/></picture></noscript></div><p>Like most products, Graphite aims for fast, bug-free, and painless onboarding. The best way for us to ensure this is to suffer through onboarding once every day ourselves. Across our full Eng-product-design team, any individual only gets deleted once a month on average. But one teammate a day hitting a sharp edge has proven enough to find and motivate fixing issues.</p><p>Deleting employee accounts has created dogfooding on one of our most critical and hard to test surfaces. We’ve caught tens of bugs, and created user empathy in a traditional blindspot. I’d strongly recommend other product teams consider automatically deleting employee accounts for the same benefits.</p><h2 id="current-limitations">Current limitations</h2><p>Is it perfect? No. Deleted employees recreate accounts in the existing Graphite org. That means they still skip some aspects of onboarding that real users hit when they’re the first to set Graphite up in a new organization, such as long initial sync times. In the future, I’d like to explore deleting the entire Graphite company account once a month to increase the dogfooding - though I’m wary of the bigger obstruction to the team’s morning code changes.</p><p>Can every product afford to delete employee accounts as much as we do? Possibly not - some accounts accumulate not just configuration, but troves of meaningful user-created content. Instagram and Google Docs for example, might not be able to get away with such a heavy-handed approach. But many services, especially ones where user created data survives individual account deletion, serve to benefit. Products like Datadog, Vercel, Hex, and Superhuman however, could get away with deleting employee accounts once a month. Sure, those people will need to recreate personal dashboards and filters - but that’s the point.</p><h2 id="feeding-the-future">Feeding the future</h2><p>Will we keep deleting employee accounts forever at Graphite? I suspect so. Dogfooding onboarding is not better than automated testing however - we are continuously making expensive investments to establish real unit and e2e tests here. But dogfooding is sufficiently different than automated testing, and together they compound. Dogfooding catches unknown unknowns in a way that automated tests fail to. It builds user empathy among the creators - as well as deep product opinions that folks can incorporate into future updates. If it’s not easy to recreate your account, then is it easy enough for a new user to get started in the first place?</p></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 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_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 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_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:[&amp;&gt;svg]:size-4 [&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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 [&amp;&gt;svg]:size-3 sm:[&amp;&gt;svg]:size-4 [&amp;&gt;svg]:mr-0.5 sm:[&amp;&gt;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&amp;w=1080&amp;q=75&amp;dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fgraphite_logo_neon_sign.fd632602.webp&amp;w=2048&amp;q=75&amp;dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fgraphite_logo_neon_sign.fd632602.webp&amp;w=2048&amp;q=75&amp;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&amp;w=2048&amp;q=75&amp;dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fwhite%402x.6327aed5.webp&amp;w=3840&amp;q=75&amp;dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fwhite%402x.6327aed5.webp&amp;w=3840&amp;q=75&amp;dpl=dpl_ASodJGPkKjhm283buwgKNSKFRnkv"/></div></div></footer></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"data":{"id":"aZdZd-YgRD-RFRiFEXlfAg","slug":"onboarding-roulette","title":"Onboarding roulette: deleting our employee accounts daily","metatags":[{"title":"Onboarding roulette: deleting our employee accounts daily","description":"I’m a strong believer in automated tests - and a moderately disciplined author of them. Software engineering is exceptionally hard to get functionally correct, and even harder to avoid regressing later. As my wise teammate Dave says, “Legacy code is any code that doesn’t have a test.”","ogImage":{"url":"https://www.datocms-assets.com/85246/1710457281-frame-10123339.png"},"noIndex":false}],"date":"2024-03-14","image":{"blurUpThumb":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAQCAIAAACDRijCAAACoElEQVR42j2U27LjKAxFhRDgS5xM17z2//9fV/Wxg0DSbOd0j70rDyAvXdhEfhI1oj3T85WO41i3LYt4eFc9zwtP725GnKgUbqUVqZyyT+/v/vX7+gq6iJRI2gfUCjWRVu5AKcXdU4TXGXMmV+PglMq9W4qUG5Q8mXsd1mcQZYCOD2Vf6bkux7qs6yoFFYUKl0SVqGc2c3wMRK2t/l8Rc4kQP9uwAdCPlVqjx74+Hxu07TtAEdG1bJJPyb0XmwAxmqql1fIHpEXPzBvzdV5jDPn3AVB7HPvreDxB2vdSkSlUx1nLVUvvFaAEUAbmnlEGyEIXvYqcIlcrQ4f8ODaAjmN7PffX87E/9lpr0A26mpxVAJrTmPhurdytZb5Bo48bVDJAE6DntrRlee7r67H+c2wPgBpApKpL4UX4/RabligJKrrHXSXl8NA61swQcBOtLUuB1rVu0Nb2rdUFx0ijZmHKKSSnOeZfUEVrwhIWNWdJd0BhAgdnw9/K+BJqUpqklIhjOoxQLCwxUZCgJYHJkIADB07hls1wMiiRZCSX5HALzIJJeIbAQSUQRf6sGKZPWDOEwUFIk8g5nCk4gu8wOW24Z4m5+FxiFrIgg/2U/H3L3mEjJjlcF+ZpOgleJ3PrmHhMCMaVX+OtaGV0jL6Yso1pmSMNH8gBXaY6FdPFqVe4HWl5pkgI7EP76H3qnADpu+dE2mS88+gggsvM8Ng1+9foJzLpBwQH2KzZhFEcQMjQu+JS/gF5z++ki2gv2hn2wDA5jTnO8QEhdGh8m9vsA8LwCKBxY/6Cfg8yMfS1TF2nwhI+5Rt0gfURWsCdyAC5q7vwPXGYCwn07k4NIDXKRmp2y2+J3z4e3yu3Jn7xV4KKnFIQO/yK6//Z6vfuNLP/AD3rFAaXwuJ+AAAAAElFTkSuQmCC","url":"https://www.datocms-assets.com/85246/1710457281-frame-10123339.png","alt":"onboarding roulette wheel"},"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":"I’m a strong believer in automated tests - and a moderately disciplined author of them. Software engineering is exceptionally hard to get functionally correct, and even harder to avoid regressing later. As author Michael Feathers says, “Legacy code is any code that doesn’t have a test.”"}]},{"type":"paragraph","children":[{"type":"span","value":"Some things, such as server endpoints, database schemas, and UI library components, are straightforward to test."}]},{"type":"paragraph","children":[{"type":"span","value":"Other things are hard to test, such as endpoints that call third-party APIs, react web pages with complex states, and async jobs that require detailed DB records. At Airbnb, I found testing password reset emails hard because of the outsourced email sending that takes place."}]},{"type":"paragraph","children":[{"type":"span","value":"Such functionality still deserves tests - for two reasons. One, it still matters that they don’t regress - and their complexity makes them all the more likely to. Secondly, testing complex features often forces engineers to architect the feature in such a way that it "},{"type":"span","marks":["emphasis"],"value":"can"},{"type":"span","value":" be tested. The early establishment of tests can motivate narrower interfaces and less coupling, leading to a better long-term codebase."}]},{"type":"heading","level":2,"children":[{"type":"span","value":"To test or not to test?"}]},{"type":"paragraph","children":[{"type":"span","value":"The world’s not perfect - sometimes you have time to write a feature, but not time to establish automated tests on that feature. Why does this happen? Like a reverse P=NP problem, many features are much easier to create than they are to test. Consider a react to-do list app with swipe-to-delete. It can take 30 minutes to create, but might take hours or days to establish automated UI tests that verify “swipe-to-delete”. These imbalances, along with business-driven urgency, lead teams to code features and skip adding expensive tests."}]},{"type":"paragraph","children":[{"type":"span","value":"Is that bad? Not necessarily if you’re pragmatic - there are cases where it’s worthwhile taking on debt by creating functionality without tests. The benefit of the untested feature may be high, the cost of testing high, and your resources low. Maybe you’re on a short-staffed team or an evening side project. If you force yourself to add automated unit tests to your to-do list app, you might never launch it to 10 early adopters. (However, if you still don’t test swipe-to-delete after a million users, you might be asking for an incident.)"}]},{"type":"paragraph","children":[{"type":"span","value":"Delaying automated tests is a slippery slope, but product creation requires the art of strategically taking on debt. The “loan” allows teams to validate quickly, and discovered value can later be spent paying down the tech debt (with interest). This is true for startups raising venture, and it’s true for teams building MVPs. Spend too much time building expensive tests up front, and you may run out of time to ship, learn and pivot."}]},{"item":"EdmmtGxvQkGFCc_SIA_VRw","type":"block"},{"type":"paragraph","children":[{"url":"https://xkcd.com/2730/","type":"link","children":[{"type":"span","value":"https://xkcd.com/2730/"}]}]},{"type":"heading","level":2,"children":[{"type":"span","value":"Getting creative"}]},{"type":"paragraph","children":[{"type":"span","value":"Keep in mind that “no automated tests” doesn’t mean “no testing at all.” By default, not having tests means you’re quietly forcing users to find bugs for you. Production traffic and thorough alerting can serve as a weak replacement for automated testing, but you better have rapid rollbacks or flags in place with your finger on the trigger. Frustrated users won’t stick around for long."}]},{"type":"paragraph","children":[{"type":"span","value":"Better than production traffic is a subset of production traffic - you often don’t need all your users to hit a bug to find a regression, just a few. This is where "},{"url":"https://cloud.google.com/deploy/docs/deployment-strategies/canary","type":"link","children":[{"type":"span","value":"canary rollouts"}]},{"type":"span","value":" and beta cohorts can become useful. But there’s still the issue of real users hitting real regressions, and it requires good monitoring to know when users are having a bad time."}]},{"type":"paragraph","children":[{"type":"span","value":"Better than beta cohorts is "},{"url":"https://codesubmit.io/blog/is-dogfooding-right-for-your-team/","type":"link","children":[{"type":"span","value":"dogfooding"}]},{"type":"span","value":". Send real users through the feature that you don’t want to test automatically, but have those users be you. You can’t rage quit your own product, and your eyeballs make for a great dynamic alerting service (just remember to close them for eight hours every night)."}]},{"type":"heading","level":2,"children":[{"type":"span","value":"The onboarding struggle"}]},{"type":"paragraph","children":[{"type":"span","value":"There you have it—automated tests, canary releases, beta cohorts, and dogfooding—a spectrum of ways to test features. Graphite’s engineering team uses all these techniques, yet there remain blind spots in our functionality."}]},{"type":"paragraph","children":[{"type":"span","value":"One of the hardest blind spots for us to test is product onboarding. It’s a doozie involving an OAuth loop with GitHub, async loading of repository metadata, queries against our own databases, and custom UI elements not reused elsewhere in the app. Despite these challenges onboarding is critical, and we need to test it somehow."}]},{"type":"paragraph","children":[{"type":"span","value":"Classic synthetic tests are rendered flakier than normal due to GitHub login bot detection. Canary traffic testing doesn’t help much here, because production users who fail to onboard rarely report it - and can sometimes appear in logs as indecisive rather than blocked. Beta cohorts rarely catch anything because they only onboard once - the same is true for traditional dogfooding."}]},{"type":"heading","level":2,"children":[{"type":"span","value":"Spinning the wheel"}]},{"type":"paragraph","children":[{"type":"span","value":"Our solution at Graphite has been to run a roulette script, randomly deleting one of our engineers' Graphite accounts every day at 9 a.m. We don’t just reset onboarding—we delete their account, tokens, configured filters, uploaded gifs, and more."}]},{"item":"Wm4074U9Q4mTOLCfmYryVg","type":"block"},{"type":"paragraph","children":[{"type":"span","value":"Isn’t that frustrating? Sure. Folks on our team come to work to code new features, not to find themselves logged out and forced to recreate their accounts from scratch. We were cautious when first trying the technique, but the benefits became clear immediately. "},{"type":"span","marks":["emphasis"],"value":"Note: this is only their Graphite product account - they still have access to GitHub and all other company accounts."}]},{"item":"dlhv0zsWRqq0_krpLIiGqA","type":"block"},{"type":"paragraph","children":[{"type":"span","value":"Like most products, Graphite aims for fast, bug-free, and painless onboarding. The best way for us to ensure this is to suffer through onboarding once every day ourselves. Across our full Eng-product-design team, any individual only gets deleted once a month on average. But one teammate a day hitting a sharp edge has proven enough to find and motivate fixing issues."}]},{"type":"paragraph","children":[{"type":"span","value":"Deleting employee accounts has created dogfooding on one of our most critical and hard to test surfaces. We’ve caught tens of bugs, and created user empathy in a traditional blindspot. I’d strongly recommend other product teams consider automatically deleting employee accounts for the same benefits."}]},{"type":"heading","level":2,"children":[{"type":"span","value":"Current limitations"}]},{"type":"paragraph","children":[{"type":"span","value":"Is it perfect? No. Deleted employees recreate accounts in the existing Graphite org. That means they still skip some aspects of onboarding that real users hit when they’re the first to set Graphite up in a new organization, such as long initial sync times. In the future, I’d like to explore deleting the entire Graphite company account once a month to increase the dogfooding - though I’m wary of the bigger obstruction to the team’s morning code changes."}]},{"type":"paragraph","children":[{"type":"span","value":"Can every product afford to delete employee accounts as much as we do? Possibly not - some accounts accumulate not just configuration, but troves of meaningful user-created content. Instagram and Google Docs for example, might not be able to get away with such a heavy-handed approach. But many services, especially ones where user created data survives individual account deletion, serve to benefit. Products like Datadog, Vercel, Hex, and Superhuman however, could get away with deleting employee accounts once a month. Sure, those people will need to recreate personal dashboards and filters - but that’s the point."}]},{"type":"heading","level":2,"children":[{"type":"span","value":"Feeding the future"}]},{"type":"paragraph","children":[{"type":"span","value":"Will we keep deleting employee accounts forever at Graphite? I suspect so. Dogfooding onboarding is not better than automated testing however - we are continuously making expensive investments to establish real unit and e2e tests here. But dogfooding is sufficiently different than automated testing, and together they compound. Dogfooding catches unknown unknowns in a way that automated tests fail to. It builds user empathy among the creators - as well as deep product opinions that folks can incorporate into future updates. If it’s not easy to recreate your account, then is it easy enough for a new user to get started in the first place?"}]}]}},"blocks":[{"__typename":"ImageRecord","id":"EdmmtGxvQkGFCc_SIA_VRw","image":{"responsiveImage":{"srcSet":"https://www.datocms-assets.com/85246/1710456379-untitled-51.png?dpr=0.25 188w,https://www.datocms-assets.com/85246/1710456379-untitled-51.png?dpr=0.5 377w,https://www.datocms-assets.com/85246/1710456379-untitled-51.png?dpr=0.75 566w,https://www.datocms-assets.com/85246/1710456379-untitled-51.png 755w","webpSrcSet":"https://www.datocms-assets.com/85246/1710456379-untitled-51.png?dpr=0.25\u0026fm=webp 188w,https://www.datocms-assets.com/85246/1710456379-untitled-51.png?dpr=0.5\u0026fm=webp 377w,https://www.datocms-assets.com/85246/1710456379-untitled-51.png?dpr=0.75\u0026fm=webp 566w,https://www.datocms-assets.com/85246/1710456379-untitled-51.png?fm=webp 755w","sizes":"(max-width: 755px) 100vw, 755px","src":"https://www.datocms-assets.com/85246/1710456379-untitled-51.png","width":755,"height":614,"aspectRatio":1.229641693811075,"alt":"xkcd comic explains testing","title":null,"base64":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgFCgoFBQwFBQUFBREJCgUMFxMZGBYTFhUaHysjGh0oHRUWJDUlKC0vMjIyGSI4PTcwPCsxMi8BCgsLBQUFEAUFEC8cFhwvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIABQAGAMBIgACEQEDEQH/xAAVAAEBAAAAAAAAAAAAAAAAAAAAB//EABQQAQAAAAAAAAAAAAAAAAAAAAD/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAv/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AKwApIAAAAAD/9k="}}},{"__typename":"ImageRecord","id":"Wm4074U9Q4mTOLCfmYryVg","image":{"responsiveImage":{"srcSet":"https://www.datocms-assets.com/85246/1710474729-untitled-52.png?dpr=0.25 304w,https://www.datocms-assets.com/85246/1710474729-untitled-52.png?dpr=0.5 609w,https://www.datocms-assets.com/85246/1710474729-untitled-52.png?dpr=0.75 913w,https://www.datocms-assets.com/85246/1710474729-untitled-52.png 1218w","webpSrcSet":"https://www.datocms-assets.com/85246/1710474729-untitled-52.png?dpr=0.25\u0026fm=webp 304w,https://www.datocms-assets.com/85246/1710474729-untitled-52.png?dpr=0.5\u0026fm=webp 609w,https://www.datocms-assets.com/85246/1710474729-untitled-52.png?dpr=0.75\u0026fm=webp 913w,https://www.datocms-assets.com/85246/1710474729-untitled-52.png?fm=webp 1218w","sizes":"(max-width: 1218px) 100vw, 1218px","src":"https://www.datocms-assets.com/85246/1710474729-untitled-52.png","width":1218,"height":194,"aspectRatio":6.278350515463917,"alt":"screenshot of roulette bot deleting someone's account","title":null,"base64":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoOCAgFChYRDhIVFRkNBREVEhUYGhQdGBYTFiEaKysjHR0oHRUWJDUlKC0vMjIyGSI4PTcwPCsxMi8BCgsLDg4OHBANHC8cFhwvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIAAQAGAMBIgACEQEDEQH/xAAYAAEAAwEAAAAAAAAAAAAAAAAAAgQGAf/EACEQAAEDAQkAAAAAAAAAAAAAAAABAgRxAwURExQhJJTh/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQD/xAAYEQEBAAMAAAAAAAAAAAAAAAABAAIDEf/aAAwDAQACEQMRAD8AwOua6yXhXOlIXpSdbseq4xbtSkU6BzrWHKOaxqbR4PXAAEpf/9k="}}},{"__typename":"ImageRecord","id":"dlhv0zsWRqq0_krpLIiGqA","image":{"responsiveImage":{"srcSet":"https://www.datocms-assets.com/85246/1710474769-untitled-53.png?dpr=0.25 309w,https://www.datocms-assets.com/85246/1710474769-untitled-53.png?dpr=0.5 619w,https://www.datocms-assets.com/85246/1710474769-untitled-53.png?dpr=0.75 928w,https://www.datocms-assets.com/85246/1710474769-untitled-53.png 1238w","webpSrcSet":"https://www.datocms-assets.com/85246/1710474769-untitled-53.png?dpr=0.25\u0026fm=webp 309w,https://www.datocms-assets.com/85246/1710474769-untitled-53.png?dpr=0.5\u0026fm=webp 619w,https://www.datocms-assets.com/85246/1710474769-untitled-53.png?dpr=0.75\u0026fm=webp 928w,https://www.datocms-assets.com/85246/1710474769-untitled-53.png?fm=webp 1238w","sizes":"(max-width: 1238px) 100vw, 1238px","src":"https://www.datocms-assets.com/85246/1710474769-untitled-53.png","width":1238,"height":1430,"aspectRatio":0.8657342657342657,"alt":"slack bug report from onboarding test","title":null,"base64":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBg0OFA0SDQoLDQ8HDg0KCxENDREYFxoZGBYVFhUaHysjGh0oHRUiJDUlKC0vMjIyGSI4PTcwPCsxMi8BCgsLBQUFEAUFEC8cFhwvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL//AABEIABkAFQMBIgACEQEDEQH/xAAZAAADAQEBAAAAAAAAAAAAAAADBAUABgH/xAAeEAACAgICAwAAAAAAAAAAAAAAAgEEAxIRMhMhMf/EABUBAQEAAAAAAAAAAAAAAAAAAAAC/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A46wzypNdn2G1uw8CeexG5SQmluTA2z+zAVGpeORLPXnYuWOxOsfQJbYuJPQz9jAf/9k="}}}]}},"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":"onboarding-roulette"},"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>