126 lines
69 KiB
HTML
126 lines
69 KiB
HTML
<!DOCTYPE html><html lang="en"><head><meta name="viewport" content="width=device-width, initial-scale=1.0"/><script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
|
|
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
|
|
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
|
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
|
|
})(window,document,'script','dataLayer','GTM-5B5TH8ZJ');</script><link rel="preload" href="/fonts/inter/Inter-Regular.woff2?__frsh_c=175287fadcf5d023f9ad4abd8ddf46c4a234946a" as="font" crossorigin="anonymous"/><link rel="preload" href="/fonts/inter/Inter-SemiBold.woff2?__frsh_c=175287fadcf5d023f9ad4abd8ddf46c4a234946a" as="font" crossorigin="anonymous"/><link rel="icon" href="/favicon.ico?__frsh_c=175287fadcf5d023f9ad4abd8ddf46c4a234946a" sizes="32x32"/><link rel="icon" href="/logo.svg?__frsh_c=175287fadcf5d023f9ad4abd8ddf46c4a234946a" type="image/svg+xml"/><link rel="stylesheet" href="/styles/inter.css?__frsh_c=175287fadcf5d023f9ad4abd8ddf46c4a234946a"/><link rel="manifest" href="/site.webmanifest?__frsh_c=175287fadcf5d023f9ad4abd8ddf46c4a234946a"/><link rel="stylesheet" href="/styles/app.css?__frsh_c=175287fadcf5d023f9ad4abd8ddf46c4a234946a"/><link rel="stylesheet" href="/gfm.css?__frsh_c=175287fadcf5d023f9ad4abd8ddf46c4a234946a"/><link rel="stylesheet" href="/styles/blog.css?__frsh_c=175287fadcf5d023f9ad4abd8ddf46c4a234946a" type="text/css"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:site" content="@deno_land"/><link rel="me" href="https://fosstodon.org/@deno_land"/><title>March 2 incident update | Deno</title><meta name="twitter:title" content="March 2 incident update | Deno"/><meta property="og:title" content="March 2 incident update | Deno"/><meta property="og:description" content="Post-mortem report for the 98 minute service outage on March 2, 2021."/><meta name="twitter:description" content="Post-mortem report for the 98 minute service outage on March 2, 2021."/><meta name="description" content="Post-mortem report for the 98 minute service outage on March 2, 2021."/><meta name="twitter:image" content="https://deno.com/og/image.jpg"/><meta name="twitter:image:alt" content="A logo of a sauropod in the rain and the word Deno"/><meta property="og:image" content="https://deno.com/og/image.jpg"/><meta property="og:image:alt" content="A logo of a sauropod in the rain and the word Deno"/><meta property="og:type" content="article"/><meta property="og:site_name" content="Deno"/><meta property="og:locale" content="en_US"/><meta name="keywords" content="deno, denoland, development, javascript, typescript, webassembly, wasm"/><meta name="robots" content="index, follow"/><script>!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="init capture register register_once register_for_session unregister unregister_for_session getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSessionId getSurveys getActiveMatchingSurveys renderSurvey canRenderSurvey getNextSurveyStep identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException loadToolbar get_property getSessionProperty createPersonProfile opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing clear_opt_in_out_capturing debug".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);posthog.init("phc_qYGDW7D6trrGbvJf4onJGDeCpI5cBlxC8SLKOKT5fB", {"api_host":"/i","ui_host":"https://us.posthog.com","persistence":"cookie","opt_out_capturing_by_default":false});</script><noscript><style>[data-component=heading-group].animate-in>*{opacity:1!important;}</style></noscript></head><body><div class="h-screen"><div class="min-h-screen grid grid-cols-1 " style="grid-template-rows:auto 1fr auto;"><!--frsh:island:SkipToMainLink:0:--><a class="absolute left-2 -top-full opacity-0 bg-white p-2 focus:top-2 focus:opacity-100 focus:z-[60] dark:bg-black dark:text-white)" href="#main">Skip to main content</a><!--/frsh:island--><!--frsh:island:HelloBar:1:--><div class="grid grid-cols-1 overflow-hidden transition-all duration-500" style="grid-template-rows:1fr;"><div class="text-left md:text-center overflow-hidden bg-runtime text-runtime-dark px-4 gap-2 flex items-center justify-between"><div class="font-bold my-4 flex flex-wrap justify-start md:justify-center gap-y-2 gap-x-4 items-center flex-grow"><div class="leading-tight">Introducing celld: self-hosted, distributed Durable Objects</div><a href="https://celld.dev" target="_blank" class="inline-block px-2 py-1 rounded-md border-2 border-runtime-dark transition-colors hover:text-runtime hover:bg-runtime-dark">Learn more<span aria-hidden="true">-></span></a></div><button type="button" disabled ><div class="sr-only">Dismiss</div><span aria-hidden="true"><svg class="h-6 w-6 " stroke="currentColor" fill="none" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path></svg></span></button></div></div><!--/frsh:island--><header class="z-50 dark:text-gray-50 sticky top-0 bg-white/90 dark:bg-black/90 shadow-sm dark:bg-gray-800" style="--header-accent:var(--color-deploy);"><div data-component="header-backdrop" class="absolute inset-0 h-[200%] -z-10 pointer-events-none"></div><style>header{--content-width: 100vw;}@media (min-width: 1080px){header{--content-width:1080px}}[data-component=main-nav]:has(#menuToggle:checked) [data-component=nav-entries] { display: flex; }</style><div class="section-x-inset-xl py-3 sm:py-6"><nav data-component="main-nav" class="grid grid-cols-1 justify-between items-center lg:flex lg:flex-row lg:gap-6 xl:gap-12 xl:text-lg"><input type="checkbox" id="menuToggle" class="hidden" autocomplete="off"><div class="flex flex-auto items-center justify-between lg:justify-start select-none w-full lg:w-auto gap-3 md:gap-6 lg:gap-8"><a href="/" class="flex items-center gap-4" aria-label="Landing Page" data-component="header-logo" data-ancestor="true" aria-current="true"><svg width="100%" height="100%" viewBox="0 0 1025 331" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlnsxlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;" class="h-12 w-auto" data-component="logo"><path id="background" d="M28.829,227.937c-8.871,-19.143 -13.822,-40.465 -13.822,-62.935c-0,-5.815 0.332,-11.554 0.977,-17.197c0.655,-5.703 1.626,-11.299 2.893,-16.773c7.12,-30.704 23.68,-57.808 46.452,-78.082c19.127,-17.006 42.558,-29.14 68.244,-34.64c10.137,-2.165 20.651,-3.304 31.43,-3.304c3.778,0.004 7.583,0.149 11.411,0.441c18.154,1.386 35.309,5.956 50.959,13.121c12.625,5.786 24.31,13.274 34.762,22.169c26.253,22.364 44.562,53.517 50.651,88.476c1.455,8.379 2.213,16.996 2.213,25.789c-0.003,3.784 -0.149,7.595 -0.442,11.429c-1.106,14.489 -4.241,28.342 -9.104,41.302c-6.788,18.051 -16.959,34.452 -29.738,48.428c-16.621,16.971 -37.743,24.523 -55.384,24.209c-12.828,-0.229 -25.379,-5.333 -34.052,-12.801c-12.39,-10.669 -17.394,-22.865 -19.11,-36.474c-0.426,-3.383 -0.176,-12.601 1.585,-18.984c1.312,-4.758 4.64,-13.946 9.507,-17.965c-5.693,-2.452 -13.021,-7.792 -15.331,-10.355c-0.568,-0.63 -0.494,-1.617 0.014,-2.296c0.509,-0.678 1.4,-0.946 2.199,-0.659c4.895,1.68 10.856,3.337 17.142,4.389c8.267,1.382 18.548,3.122 28.963,3.634c25.395,1.247 51.921,-10.151 60.154,-32.83c8.232,-22.679 5.038,-45.111 -24.496,-58.566c-29.535,-13.456 -43.178,-29.455 -67.041,-39.104c-15.587,-6.303 -32.935,-2.561 -50.746,7.282c-47.974,26.512 -90.955,110.279 -71.142,187.887c0.283,1.062 -0.195,2.18 -1.158,2.709c-0.903,0.495 -2.013,0.354 -2.761,-0.331c-5.766,-6.336 -10.998,-13.166 -15.623,-20.421c-3.578,-5.614 -6.79,-11.475 -9.606,-17.548Z" style="fill: #000;"></path><path id="outline" d="M172.67,0.181c90.968,4.232 161.386,81.521 157.155,172.489c-4.232,90.968 -81.522,161.385 -172.489,157.153c-90.968,-4.231 -161.386,-81.52 -157.155,-172.487c4.232,-90.968 81.521,-161.386 172.489,-157.155Zm38.578,198.678c-10.415,-0.512 -20.696,-2.252 -28.963,-3.634c-6.286,-1.052 -12.247,-2.709 -17.142,-4.389c-0.799,-0.287 -1.69,-0.019 -2.199,0.659c-0.508,0.679 -0.582,1.666 -0.014,2.296c2.31,2.563 9.638,7.903 15.331,10.355c-4.867,4.019 -8.195,13.207 -9.507,17.965c-1.761,6.383 -2.011,15.601 -1.585,18.984c1.716,13.609 6.72,25.805 19.11,36.474c8.673,7.468 21.224,12.572 34.052,12.801c17.702,0.315 38.909,-7.29 55.556,-24.385c21.765,-23.861 36.023,-54.887 38.67,-89.554c6.303,-82.546 -55.596,-154.681 -138.143,-160.984c-82.545,-6.303 -154.68,55.597 -160.983,138.143c-3.264,42.749 11.764,82.706 38.481,112.17c0.744,0.809 1.944,1.006 2.907,0.477c0.963,-0.529 1.441,-1.647 1.158,-2.709c-19.813,-77.608 23.168,-161.375 71.142,-187.887c17.811,-9.843 35.159,-13.585 50.746,-7.282c23.863,9.649 37.506,25.648 67.041,39.104c29.534,13.455 32.728,35.887 24.496,58.566c-8.233,22.679 -34.759,34.077 -60.154,32.83Z" style="fill: transparent;"></path><path id="logotype" d="M694.596,164.68c-0,4.838 -0,11.794 -0.909,14.213l-103.727,0c4.837,17.542 18.749,28.431 37.8,28.431c15.728,0.302 27.219,-6.654 35.383,-16.636l25.705,23.894c-12.7,16.028 -34.171,27.822 -63.809,27.822c-43.243,-0 -75.904,-30.242 -75.904,-76.513c-0,-44.756 31.148,-75.907 73.184,-75.907c43.243,-0 72.277,31.453 72.277,74.696Zm-71.07,-39.918c-16.025,-0 -28.729,8.771 -33.265,25.706l65.02,-0c-3.932,-15.422 -14.515,-25.706 -31.755,-25.706Zm175.096,-34.778c31.758,-0 53.829,16.938 53.829,62.298l0,87.703l-39.615,-0l0,-77.724c0,-28.124 -9.976,-36.892 -28.427,-36.892c-19.953,0 -33.564,13.908 -33.564,40.221l-0,74.395l-39.617,-0l0,-147.582l39.617,-0l-0,19.055l0.602,0c12.095,-14.213 29.037,-21.474 47.175,-21.474Zm146.977,152.42c-46.871,-0 -78.324,-32.058 -78.324,-76.21c-0,-44.153 31.453,-76.21 78.324,-76.21c45.971,-0 78.628,30.849 78.628,76.21c0,45.36 -32.657,76.21 -78.628,76.21Zm-0,-35.386c21.469,0 38.411,-16.934 38.411,-40.824c-0,-24.192 -16.332,-40.825 -38.411,-40.825c-22.986,0 -38.404,17.539 -38.404,40.825c0,22.984 16.028,40.824 38.404,40.824Zm-540.473,32.967l0,-150.001l54.227,-0c47.449,-0 77.952,30.845 77.952,75.212c-0,44.154 -28.597,74.789 -77.316,74.789l-54.863,-0Zm38.976,-35.705l13.133,-0c22.878,-0 37.917,-17.535 37.917,-39.084c-0,-22.395 -15.251,-39.507 -34.952,-39.507l-16.098,-0l0,78.591Z" style="fill: #000;"></path><path id="eye" d="M159.634,78.772c8.092,-0.634 15.152,6.272 16.369,15.457c1.624,12.235 -2.867,24.874 -17.633,25.165c-12.614,0.252 -16.436,-12.469 -15.6,-20.175c0.83,-7.706 7.182,-19.687 16.864,-20.447Z" style="fill: #000;"></path><style>
|
|
@keyframes blink {
|
|
0%, 100% {
|
|
transform: scaleY(1);
|
|
}
|
|
50% {
|
|
transform: scaleY(0.15);
|
|
}
|
|
}
|
|
[data-component="logo"]:hover,
|
|
a:focus [data-component="logo"] {
|
|
#eye {
|
|
transform-origin: 50% 30%;
|
|
animation: blink 0.15s cubic-bezier(0.5, 0, 0.5, 1);
|
|
}
|
|
}
|
|
</style></svg></a><label tabindex="0" class="cursor-pointer lg:hidden touch-manipulation" for="menuToggle" onkeydown="if (event.code === 'Space' || event.code === 'Enter') { this.click(); event.preventDefault(); }"><svg width="21" height="14" viewBox="0 0 21 14" fill="none" xmlns="http://www.w3.org/2000/svg"><line x1="0.25" y1="1.4" x2="20.25" y2="1.4" stroke="currentColor" stroke-width="1.2"></line><line x1="0.25" y1="7.4" x2="20.25" y2="7.4" stroke="currentColor" stroke-width="1.2"></line><line x1="0.25" y1="13.4" x2="10.25" y2="13.4" stroke="currentColor" stroke-width="1.2"></line></svg><svg class="h-6 w-6 hidden" stroke="currentColor" fill="none" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path></svg></label></div><div class="hidden flex-col w-full mt-5 gap-x-8 gap-y-4 lg:flex lg:flex-row lg:items-center lg:mx-0 lg:mt-0" data-component="nav-entries"><!--frsh:island:OramaSearch:2:--><div class="md:relative w-full lg:hidden"><div class="relative"><input type="search" placeholder="Search" id="orama-search-input" value="" class="w-full min-w-24 rounded-lg placeholder:text-sm text-base leading-normal p-1 pl-8 border transition-all duration-150
|
|
border-gray-600 dark:border-gray-100 focus:outline-offset-1 disabled:opacity-50"><svg class="absolute top-2 left-2 size-4.5 text-gray-600 pointer-events-none " width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_2006_89)"><path d="M13.3008 12.1951L10.3537 9.24807C11.0632 8.30353 11.4463 7.15382 11.445 5.97248C11.445 2.95497 8.98999 0.5 5.97248 0.5C2.95497 0.5 0.5 2.95497 0.5 5.97248C0.5 8.98999 2.95497 11.445 5.97248 11.445C7.15382 11.4463 8.30353 11.0632 9.24807 10.3537L12.1951 13.3008C12.3443 13.4341 12.5389 13.5053 12.7389 13.4997C12.9389 13.4941 13.1292 13.4121 13.2707 13.2707C13.4121 13.1292 13.4941 12.9389 13.4997 12.7389C13.5053 12.5389 13.4341 12.3443 13.3008 12.1951ZM2.06357 5.97248C2.06357 5.19937 2.29282 4.44362 2.72234 3.8008C3.15185 3.15799 3.76234 2.65697 4.4766 2.36111C5.19086 2.06526 5.97682 1.98785 6.73507 2.13867C7.49333 2.2895 8.18983 2.66179 8.7365 3.20846C9.28317 3.75513 9.65546 4.45163 9.80629 5.20989C9.95711 5.96814 9.8797 6.7541 9.58385 7.46836C9.28799 8.18262 8.78697 8.79311 8.14416 9.22262C7.50134 9.65214 6.74559 9.88139 5.97248 9.88139C4.93615 9.88015 3.94263 9.46792 3.20983 8.73513C2.47704 8.00233 2.06481 7.00881 2.06357 5.97248Z" fill="currentColor"></path></g><defs><clipPath id="clip0_2006_89"><rect width="14" height="14" fill="white"></rect></clipPath></defs></svg><kbd id="search-key" class="hidden xs:flex pointer-events-none absolute font-sans rounded-sm top-1 right-1 bottom-1 w-auto border-1 border-gray-500 dark:border-gray-800 border-b-2 border-r-2 bg-white text-gray-600 dark:text-gray-100 text-center text-xs font-bold p-2 items-center justify-center dark:bg-gray-800">⌘K</kbd><div id="orama-search-loading" class="absolute left-2 top-1/2 transform -translate-y-1/2 hidden bg-white dark:bg-black"><div class="animate-spin rounded-full h-4 w-4 border-2 border-transparent border-r-black dark:border-r-white bg-white dark:bg-black"></div></div><div class="sr-only" aria-live="polite" id="orama-results-announcer" ></div></div><div id="orama-search-results" class="absolute inset-2 left-2 right-2 h-[calc(100vh-10rem)] lg:h-[calc(100vh-8rem)] top-32 lg:top-10 md:top-full md:left-auto md:right-0 mt-2 bg-white dark:bg-black dark:text-white border border-gray-500 dark:border-gray-800 rounded-xl shadow-2xl z-50 md:max-h-128 overflow-hidden hidden md:min-w-160 max-w-2xl"><div id="orama-search-results-content" class="overflow-y-auto h-full"></div><div class="border-t border-gray-500 dark:border-gray-800 bg-gray-50 dark:bg-gray-900 px-4 py-2 sticky bottom-0"><div class="flex items-center gap-6 text-xs text-gray-500 dark:text-gray-500"><span><kbd class="px-1.5 py-0.5 text-xs font-semibold text-gray-600 bg-white border-r-2 border-b-2 border border-gray-500 dark:border-gray-800 rounded mr-1"><span aria-hidden="true">↑↓</span><span class="sr-only">Up or down to</span></kbd>navigate</span><span><kbd class="px-1.5 py-0.5 text-xs font-semibold text-gray-600 bg-white border-r-2 border-b-2 border border-gray-500 dark:border-gray-800 rounded mr-1"><span aria-hidden="true">↵</span><span class="sr-only">Enter to</span></kbd>select</span><span><kbd class="px-1.5 py-0.5 text-xs font-semibold text-gray-600 bg-white border-r-2 border-b-2 border border-gray-500 dark:border-gray-800 rounded mr-1"><span aria-hidden="true">ESC</span><span class="sr-only">Escape to</span></kbd>close</span><img src="/images/orama-dark.svg?__frsh_c=175287fadcf5d023f9ad4abd8ddf46c4a234946a" alt="Search powered by Orama" class="dark:hidden h-4 w-auto ml-auto"/><img src="/images/orama-light.svg?__frsh_c=175287fadcf5d023f9ad4abd8ddf46c4a234946a" alt="Search powered by Orama" class="hidden dark:inline h-4 w-auto ml-auto"/></div></div></div></div><!--/frsh:island--><div class="flex flex-col leading-loose divide-incl-y lg:flex-row lg:gap-x-4 lg:select-none lg:divide-incl-y-0"><style>.entry-children li:nth-child(1) a{ transition-delay: calc(var(--delay-increment) * 1); }.entry-children li:nth-child(2) a{ transition-delay: calc(var(--delay-increment) * 2); }.entry-children li:nth-child(3) a{ transition-delay: calc(var(--delay-increment) * 3); }.entry-children li:nth-child(4) a{ transition-delay: calc(var(--delay-increment) * 4); }.entry-children li:nth-child(5) a{ transition-delay: calc(var(--delay-increment) * 5); }.entry-children li:nth-child(6) a{ transition-delay: calc(var(--delay-increment) * 6); }.entry-children li:nth-child(7) a{ transition-delay: calc(var(--delay-increment) * 7); }.entry-children li:nth-child(8) a{ transition-delay: calc(var(--delay-increment) * 8); }.entry-children li:nth-child(9) a{ transition-delay: calc(var(--delay-increment) * 9); }</style><!--frsh:island:NavItemWithChildren:3:--><div class="z-10 dark:border-gray-800 grid grid-cols-1 transition-all duration-300 lg:block" style="grid-template-rows:max-content 0fr;" ><button type="button" id="Products" class="rounded-md flex items-center justify-between px-1 my-3 lg:px-2 lg:my-0 hover:bg-azure3 dark:hover:bg-gray-800 touch-manipulation" ><span>Products</span><div><svg class="transition-transform ml-2 duration-200 " width="14" height="14" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;fill:currentColor;"><g transform="matrix(6.12323e-17,-1,1,6.12323e-17,0,14)"><path d="M10.03,1.47C10.323,1.763 10.323,2.237 10.03,2.53L5.561,7L10.03,11.47C10.323,11.763 10.323,12.237 10.03,12.53C9.737,12.823 9.263,12.823 8.97,12.53L3.97,7.53C3.677,7.237 3.677,6.763 3.97,6.47L8.97,1.47C9.263,1.177 9.737,1.177 10.03,1.47Z"></path></g></svg></div></button><div class="lg:absolute z-10 lg:top-16 lg:pt-[5px] overflow-hidden lg:overflow-visible"><div class="lg:grid lg:grid-cols-2
|
|
|
|
lg:bg-neutral-50 lg:dark:bg-gray-900 lg:rounded-md lg:overflow-hidden lg:shadow-lg"><div data-component="entry-children" class="lg:hidden
|
|
|
|
entry-children w-full flex flex-col"><div id="category-Open Source" class="dark:text-runtime text-[0.625rem] uppercase font-bold lg:mx-5 lg:mt-3.5">Open Source</div><ul class="pb-2 pl-2 mb-3 lg:pl-0 lg:py-0 lg:-mt-px lg:mb-0 lg:space-y-0 space-y-1.5" aria-labelledby="category-Open Source"><li class="relative text-sm font-bold lg:top-1 lg:text-base lg:font-normal lg:flex hover:bg-azure3 dark:hover:bg-gray-800 focus-within:bg-azure3 dark:focus-within:bg-gray-800 lg:hover:bg-neutral-100 lg:dark:hover:bg-gray-800 lg:focus-within:bg-neutral-100 lg:dark:focus-within:bg-gray-900"><a aria-current="true" tabindex="-1" class="py-1.5 lg:py-3.5 leading-none flex flex-wrap w-full pl-1 lg:pr-5 lg:px-5" href="/" data-ancestor="true"><div class="w-full"><div class="w-max flex gap-4 items-center">Deno</div><div class="text-xs w-max max-w-full mt-1 font-normal text-gray-600 dark:text-gray-500">Modern runtime for JavaScript and TypeScript</div></div></a></li><li class="relative text-sm font-bold lg:top-1 lg:text-base lg:font-normal lg:flex hover:bg-azure3 dark:hover:bg-gray-800 focus-within:bg-azure3 dark:focus-within:bg-gray-800 lg:hover:bg-neutral-100 lg:dark:hover:bg-gray-800 lg:focus-within:bg-neutral-100 lg:dark:focus-within:bg-gray-900"><a aria-current="false" tabindex="-1" class="py-1.5 lg:py-3.5 leading-none flex flex-wrap w-full pl-1 lg:pr-5 lg:px-5" href="https://fresh.deno.dev"><div class="w-full"><div class="w-max flex gap-4 items-center">Fresh</div><div class="text-xs w-max max-w-full mt-1 font-normal text-gray-600 dark:text-gray-500">Web framework designed for the edge</div></div></a></li><li class="relative text-sm font-bold lg:top-1 lg:text-base lg:font-normal lg:flex hover:bg-azure3 dark:hover:bg-gray-800 focus-within:bg-azure3 dark:focus-within:bg-gray-800 lg:hover:bg-neutral-100 lg:dark:hover:bg-gray-800 lg:focus-within:bg-neutral-100 lg:dark:focus-within:bg-gray-900"><a aria-current="false" tabindex="-1" class="py-1.5 lg:py-3.5 leading-none flex flex-wrap w-full pl-1 lg:pr-5 lg:px-5" href="https://clawpatrol.dev"><div class="w-full"><div class="w-max flex gap-4 items-center">Claw Patrol</div><div class="text-xs w-max max-w-full mt-1 font-normal text-gray-600 dark:text-gray-500">Open-source security firewall for agents</div></div></a></li><li class="relative text-sm font-bold lg:top-1 lg:text-base lg:font-normal lg:flex hover:bg-azure3 dark:hover:bg-gray-800 focus-within:bg-azure3 dark:focus-within:bg-gray-800 lg:hover:bg-neutral-100 lg:dark:hover:bg-gray-800 lg:focus-within:bg-neutral-100 lg:dark:focus-within:bg-gray-900"><a aria-current="false" tabindex="-1" class="py-1.5 lg:py-3.5 leading-none flex flex-wrap w-full pl-1 lg:pr-5 lg:px-5" href="https://jsr.io"><div class="w-full"><div class="w-max flex gap-4 items-center">JSR</div><div class="text-xs w-max max-w-full mt-1 font-normal text-gray-600 dark:text-gray-500">TypeScript-first ESM package registry</div></div></a></li></ul></div><div data-component="entry-children" class="lg:hidden
|
|
lg:border-l lg:border-azure2 lg:dark:border-gray-800
|
|
entry-children w-full flex flex-col"><div id="category-Commercial" class="dark:text-deploy text-[0.625rem] uppercase font-bold lg:mx-5 lg:mt-3.5">Commercial</div><ul class="pb-2 pl-2 mb-3 lg:pl-0 lg:py-0 lg:-mt-px lg:mb-0 lg:space-y-0 space-y-0" aria-labelledby="category-Commercial"><li class="relative text-sm font-bold lg:top-1 lg:text-base lg:font-normal lg:flex hover:bg-azure3 dark:hover:bg-gray-800 focus-within:bg-azure3 dark:focus-within:bg-gray-800 lg:hover:bg-neutral-100 lg:dark:hover:bg-gray-800 lg:focus-within:bg-neutral-100 lg:dark:focus-within:bg-gray-900 nav-product-tree-parent"><a aria-current="false" tabindex="-1" class="py-1.5 lg:py-3.5 leading-none flex flex-wrap w-full pl-1 lg:pl-5 lg:px-5" href="/deploy"><div class="w-full"><div class="w-max flex gap-4 items-center">Deno Deploy</div><div class="text-xs w-max max-w-full mt-1 font-normal text-gray-600 dark:text-gray-500">Easy serverless hosting for your JavaScript projects</div></div></a></li><li class="relative text-sm font-bold lg:top-1 lg:text-base lg:font-normal lg:flex hover:bg-azure3 dark:hover:bg-gray-800 focus-within:bg-azure3 dark:focus-within:bg-gray-800 lg:hover:bg-neutral-100 lg:dark:hover:bg-gray-800 lg:focus-within:bg-neutral-100 lg:dark:focus-within:bg-gray-900 ml-1.5 lg:ml-5 nav-product-tree-nested nav-product-tree-nested-first"><a aria-current="false" tabindex="-1" class="py-1.5 lg:py-3.5 leading-none flex flex-wrap w-full pl-1 pl-3.5 lg:px-4" href="/deploy/sandbox"><div class="w-full"><div class="w-max flex gap-4 items-center">Deno Sandbox</div><div class="text-xs w-max max-w-full mt-1 font-normal text-gray-600 dark:text-gray-500">Run untrusted code in secure Linux VMs. Built for AI agents.</div></div></a></li><li class="relative text-sm font-bold lg:top-1 lg:text-base lg:font-normal lg:flex hover:bg-azure3 dark:hover:bg-gray-800 focus-within:bg-azure3 dark:focus-within:bg-gray-800 lg:hover:bg-neutral-100 lg:dark:hover:bg-gray-800 lg:focus-within:bg-neutral-100 lg:dark:focus-within:bg-gray-900 ml-1.5 lg:ml-5 nav-product-tree-nested nav-product-tree-nested-last"><a aria-current="false" tabindex="-1" class="py-1.5 lg:py-3.5 leading-none flex flex-wrap w-full pl-1 pl-3.5 lg:px-4" href="/subhosting"><div class="w-full"><div class="w-max flex gap-4 items-center">Subhosting</div><div class="text-xs w-max max-w-full mt-1 font-normal text-gray-600 dark:text-gray-500">Extend your platform using Deno Deploy's secure infrastructure</div></div></a></li><li class="relative text-sm font-bold lg:top-1 lg:text-base lg:font-normal lg:flex hover:bg-azure3 dark:hover:bg-gray-800 focus-within:bg-azure3 dark:focus-within:bg-gray-800 lg:hover:bg-neutral-100 lg:dark:hover:bg-gray-800 lg:focus-within:bg-neutral-100 lg:dark:focus-within:bg-gray-900"><a aria-current="false" tabindex="-1" class="py-1.5 lg:py-3.5 leading-none flex flex-wrap w-full pl-1 lg:pl-5 lg:px-5" href="/enterprise"><div class="w-full"><div class="w-max flex gap-4 items-center">Deno for Enterprise</div><div class="text-xs w-max max-w-full mt-1 font-normal text-gray-600 dark:text-gray-500">Enterprise support for runtime projects</div></div></a></li></ul></div></div></div></div><!--/frsh:island--><div class="dark:border-gray-800"><a class="block w-full px-1 my-3 lg:w-auto lg:m-0 lg:px-2 lg:rounded-md lg:hover:bg-azure3 lg:hover:dark:bg-gray-800 " href="https://docs.deno.com" aria-current="false">Docs</a></div><!--frsh:island:NavItemWithChildren:4:--><div class="z-10 dark:border-gray-800 grid grid-cols-1 transition-all duration-300 lg:block" style="grid-template-rows:max-content 0fr;" ><button type="button" id="Modules" class="rounded-md flex items-center justify-between px-1 my-3 lg:px-2 lg:my-0 hover:bg-azure3 dark:hover:bg-gray-800 touch-manipulation" ><span>Modules</span><div><svg class="transition-transform ml-2 duration-200 " width="14" height="14" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;fill:currentColor;"><g transform="matrix(6.12323e-17,-1,1,6.12323e-17,0,14)"><path d="M10.03,1.47C10.323,1.763 10.323,2.237 10.03,2.53L5.561,7L10.03,11.47C10.323,11.763 10.323,12.237 10.03,12.53C9.737,12.823 9.263,12.823 8.97,12.53L3.97,7.53C3.677,7.237 3.677,6.763 3.97,6.47L8.97,1.47C9.263,1.177 9.737,1.177 10.03,1.47Z"></path></g></svg></div></button><div class="lg:absolute z-10 lg:top-16 lg:pt-[5px] overflow-hidden lg:overflow-visible"><div class="
|
|
|
|
lg:bg-neutral-50 lg:dark:bg-gray-900 lg:rounded-md lg:overflow-hidden lg:shadow-lg"><div data-component="entry-children" class="lg:hidden
|
|
|
|
entry-children w-full flex flex-col"><ul class="pb-2 pl-2 mb-3 lg:pl-0 lg:py-0 lg:-mt-px lg:mb-0 lg:space-y-0 space-y-1.5"><li class="relative text-sm font-bold lg:top-1 lg:text-base lg:font-normal lg:flex hover:bg-azure3 dark:hover:bg-gray-800 focus-within:bg-azure3 dark:focus-within:bg-gray-800 lg:hover:bg-neutral-100 lg:dark:hover:bg-gray-800 lg:focus-within:bg-neutral-100 lg:dark:focus-within:bg-gray-900"><a aria-current="false" tabindex="-1" class="py-1.5 lg:py-3.5 leading-none flex flex-wrap w-full pl-1 lg:px-5" href="https://jsr.io/@std"><div class="w-full"><div class="w-max flex gap-4 items-center">Standard Library</div></div></a></li><li class="relative text-sm font-bold lg:top-1 lg:text-base lg:font-normal lg:flex hover:bg-azure3 dark:hover:bg-gray-800 focus-within:bg-azure3 dark:focus-within:bg-gray-800 lg:hover:bg-neutral-100 lg:dark:hover:bg-gray-800 lg:focus-within:bg-neutral-100 lg:dark:focus-within:bg-gray-900"><a aria-current="false" tabindex="-1" class="py-1.5 lg:py-3.5 leading-none flex flex-wrap w-full pl-1 lg:px-5" href="https://jsr.io"><div class="w-full"><div class="w-max flex gap-4 items-center">JSR</div></div></a></li><li class="relative text-sm font-bold lg:top-1 lg:text-base lg:font-normal lg:flex hover:bg-azure3 dark:hover:bg-gray-800 focus-within:bg-azure3 dark:focus-within:bg-gray-800 lg:hover:bg-neutral-100 lg:dark:hover:bg-gray-800 lg:focus-within:bg-neutral-100 lg:dark:focus-within:bg-gray-900"><a aria-current="false" tabindex="-1" class="py-1.5 lg:py-3.5 leading-none flex flex-wrap w-full pl-1 lg:px-5" href="/npm/"><div class="w-full"><div class="w-max flex gap-4 items-center">Node.js & npm</div></div></a></li></ul></div></div></div></div><!--/frsh:island--><!--frsh:island:NavItemWithChildren:5:--><div class="z-10 dark:border-gray-800 grid grid-cols-1 transition-all duration-300 lg:block" style="grid-template-rows:max-content 0fr;" ><button type="button" id="Community" class="rounded-md flex items-center justify-between px-1 my-3 lg:px-2 lg:my-0 hover:bg-azure3 dark:hover:bg-gray-800 touch-manipulation" ><span>Community</span><div><svg class="transition-transform ml-2 duration-200 " width="14" height="14" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;fill:currentColor;"><g transform="matrix(6.12323e-17,-1,1,6.12323e-17,0,14)"><path d="M10.03,1.47C10.323,1.763 10.323,2.237 10.03,2.53L5.561,7L10.03,11.47C10.323,11.763 10.323,12.237 10.03,12.53C9.737,12.823 9.263,12.823 8.97,12.53L3.97,7.53C3.677,7.237 3.677,6.763 3.97,6.47L8.97,1.47C9.263,1.177 9.737,1.177 10.03,1.47Z"></path></g></svg></div></button><div class="lg:absolute z-10 lg:top-16 lg:pt-[5px] overflow-hidden lg:overflow-visible"><div class="
|
|
|
|
lg:bg-neutral-50 lg:dark:bg-gray-900 lg:rounded-md lg:overflow-hidden lg:shadow-lg"><div data-component="entry-children" class="lg:hidden
|
|
|
|
entry-children w-full flex flex-col"><ul class="pb-2 pl-2 mb-3 lg:pl-0 lg:py-0 lg:-mt-px lg:mb-0 lg:space-y-0 space-y-1.5"><li class="relative text-sm font-bold lg:top-1 lg:text-base lg:font-normal lg:flex hover:bg-azure3 dark:hover:bg-gray-800 focus-within:bg-azure3 dark:focus-within:bg-gray-800 lg:hover:bg-neutral-100 lg:dark:hover:bg-gray-800 lg:focus-within:bg-neutral-100 lg:dark:focus-within:bg-gray-900"><a aria-current="false" tabindex="-1" class="py-1.5 lg:py-3.5 leading-none flex flex-wrap w-full pl-1 lg:px-5" href="https://discord.gg/deno"><div class="w-full"><div class="w-max flex gap-4 items-center"><div class="flex justify-center items-center w-6 opacity-50"><svg class="w-6 h-6" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" aria-label="Discord Logo"><g clip-path="url(#clip0_1993_195)"><path d="M11.8595 2.62936C10.9397 2.21264 9.96862 1.917 8.97117 1.75C8.83467 1.99146 8.71117 2.23988 8.60118 2.49424C7.5387 2.33581 6.45822 2.33581 5.39574 2.49424C5.28569 2.23991 5.16219 1.99149 5.02575 1.75C4.02766 1.91841 3.05598 2.21475 2.13524 2.63154C0.307332 5.30775 -0.188185 7.9175 0.0595735 10.4902C1.13004 11.2729 2.3282 11.8681 3.60197 12.25C3.88878 11.8683 4.14258 11.4633 4.36066 11.0394C3.94644 10.8863 3.54665 10.6974 3.16591 10.4749C3.26612 10.403 3.36412 10.3289 3.45882 10.257C4.56668 10.7726 5.77586 11.0399 7.00011 11.0399C8.22437 11.0399 9.43354 10.7726 10.5414 10.257C10.6372 10.3344 10.7352 10.4085 10.8343 10.4749C10.4528 10.6978 10.0523 10.887 9.63736 11.0405C9.85518 11.4642 10.109 11.8688 10.3961 12.25C11.6709 11.8696 12.87 11.2747 13.9406 10.4913C14.2314 7.50778 13.444 4.92201 11.8595 2.62936ZM4.67449 8.908C3.98407 8.908 3.41367 8.28798 3.41367 7.52522C3.41367 6.76245 3.96425 6.13699 4.67228 6.13699C5.38032 6.13699 5.94631 6.76245 5.9342 7.52522C5.92209 8.28798 5.37812 8.908 4.67449 8.908ZM9.32574 8.908C8.63422 8.908 8.06602 8.28798 8.06602 7.52522C8.06602 6.76245 8.6166 6.13699 9.32574 6.13699C10.0349 6.13699 10.5965 6.76245 10.5843 7.52522C10.5722 8.28798 10.0294 8.908 9.32574 8.908Z" fill="currentColor"></path></g><defs><clipPath id="clip0_1993_195"><rect width="14" height="14" fill="white"></rect></clipPath></defs></svg></div>Discord</div></div></a></li><li class="relative text-sm font-bold lg:top-1 lg:text-base lg:font-normal lg:flex hover:bg-azure3 dark:hover:bg-gray-800 focus-within:bg-azure3 dark:focus-within:bg-gray-800 lg:hover:bg-neutral-100 lg:dark:hover:bg-gray-800 lg:focus-within:bg-neutral-100 lg:dark:focus-within:bg-gray-900"><a aria-current="false" tabindex="-1" class="py-1.5 lg:py-3.5 leading-none flex flex-wrap w-full pl-1 lg:px-5" href="https://github.com/denoland"><div class="w-full"><div class="w-max flex gap-4 items-center"><div class="flex justify-center items-center w-6 opacity-50"><svg class="w-5 h-5" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" aria-label="GitHub Logo"><g clip-path="url(#clip0_1989_191)"><path d="M7.00001 0C3.13391 0 0 3.21295 0 7.17755C0 10.3482 2.0055 13.0388 4.7873 13.9875C5.1373 14.0534 5.26471 13.832 5.26471 13.6414C5.26471 13.4716 5.25912 13.0195 5.25561 12.4212C3.3082 12.8547 2.8973 11.4589 2.8973 11.4589C2.5795 10.6291 2.1203 10.4084 2.1203 10.4084C1.48471 9.96418 2.16861 9.97279 2.16861 9.97279C2.87071 10.0229 3.24032 10.7122 3.24032 10.7122C3.86472 11.8085 4.87903 11.4918 5.27732 11.3084C5.34171 10.8448 5.52232 10.5288 5.72251 10.3497C4.16851 10.1684 2.534 9.55218 2.534 6.80211C2.534 6.01893 2.807 5.37764 3.2543 4.87605C3.1822 4.69476 2.94211 3.96463 3.32289 2.97722C3.32289 2.97722 3.91089 2.78376 5.24789 3.71238C5.77305 3.55992 6.37629 3.47184 6.99948 3.4709C7.59448 3.47377 8.19351 3.5533 8.7528 3.71238C10.0891 2.78376 10.6757 2.97649 10.6757 2.97649C11.0579 3.9646 10.8171 4.69475 10.7457 4.87603C11.1937 5.3776 11.4653 6.0189 11.4653 6.80208C11.4653 9.55931 9.82799 10.1662 8.26908 10.3439C8.52037 10.5653 8.74368 11.0031 8.74368 11.6731C8.74368 12.6318 8.73529 13.4064 8.73529 13.6414C8.73529 13.8335 8.86129 14.057 9.21689 13.9868C12.0205 13.0032 14 10.3285 14 7.18046C14 7.17943 14 7.17841 14 7.17738C14 3.21278 10.8654 0 7.00001 0Z" fill="currentColor"></path></g><defs><clipPath id="clip0_1989_191"><rect width="14" height="14" fill="white"></rect></clipPath></defs></svg></div>GitHub</div></div></a></li><li class="relative text-sm font-bold lg:top-1 lg:text-base lg:font-normal lg:flex hover:bg-azure3 dark:hover:bg-gray-800 focus-within:bg-azure3 dark:focus-within:bg-gray-800 lg:hover:bg-neutral-100 lg:dark:hover:bg-gray-800 lg:focus-within:bg-neutral-100 lg:dark:focus-within:bg-gray-900"><a aria-current="false" tabindex="-1" class="py-1.5 lg:py-3.5 leading-none flex flex-wrap w-full pl-1 lg:px-5" href="https://bsky.app/profile/deno.land"><div class="w-full"><div class="w-max flex gap-4 items-center"><div class="flex justify-center items-center w-6 opacity-50"><svg class="w-6 h-6" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-label="BlueSky Logo"><path d="M12 10.8c-1.087-2.114-4.046-6.053-6.798-7.995C2.566.944 1.561 1.266.902 1.565.139 1.908 0 3.08 0 3.768c0 .69.378 5.65.624 6.479.815 2.736 3.713 3.66 6.383 3.364.136-.02.275-.039.415-.056-.138.022-.276.04-.415.056-3.912.58-7.387 2.005-2.83 7.078 5.013 5.19 6.87-1.113 7.823-4.308.953 3.195 2.05 9.271 7.733 4.308 4.267-4.308 1.172-6.498-2.74-7.078a8.741 8.741 0 0 1-.415-.056c.14.017.279.036.415.056 2.67.297 5.568-.628 6.383-3.364.246-.828.624-5.79.624-6.478 0-.69-.139-1.861-.902-2.206-.659-.298-1.664-.62-4.3 1.24C16.046 4.748 13.087 8.687 12 10.8Z" fill="currentColor"></path></svg></div>Bluesky</div></div></a></li><li class="relative text-sm font-bold lg:top-1 lg:text-base lg:font-normal lg:flex hover:bg-azure3 dark:hover:bg-gray-800 focus-within:bg-azure3 dark:focus-within:bg-gray-800 lg:hover:bg-neutral-100 lg:dark:hover:bg-gray-800 lg:focus-within:bg-neutral-100 lg:dark:focus-within:bg-gray-900"><a aria-current="false" tabindex="-1" class="py-1.5 lg:py-3.5 leading-none flex flex-wrap w-full pl-1 lg:px-5" href="https://twitter.com/deno_land"><div class="w-full"><div class="w-max flex gap-4 items-center"><div class="flex justify-center items-center w-6 opacity-50"><svg width="300" height="300.251" class="w-4.5 h-4.5" viewBox="0 0 300 300.251" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-label="X logo" fill="currentColor"><path d="M178.57 127.15 290.27 0h-26.46l-97.03 110.38L89.34 0H0l117.13 166.93L0 300.25h26.46l102.4-116.59 81.8 116.59h89.34M36.01 19.54H76.66l187.13 262.13h-40.66"></path></svg></div>X</div></div></a></li><li class="relative text-sm font-bold lg:top-1 lg:text-base lg:font-normal lg:flex hover:bg-azure3 dark:hover:bg-gray-800 focus-within:bg-azure3 dark:focus-within:bg-gray-800 lg:hover:bg-neutral-100 lg:dark:hover:bg-gray-800 lg:focus-within:bg-neutral-100 lg:dark:focus-within:bg-gray-900"><a aria-current="false" tabindex="-1" class="py-1.5 lg:py-3.5 leading-none flex flex-wrap w-full pl-1 lg:px-5" href="https://www.youtube.com/c/deno_land"><div class="w-full"><div class="w-max flex gap-4 items-center"><div class="flex justify-center items-center w-6 opacity-50"><svg class="w-6 h-6" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" aria-label="YouTube Logo"><path d="M7.03863 2.5H7.10538C7.72192 2.5024 10.8459 2.52643 11.6882 2.76826C11.9428 2.84207 12.1748 2.98593 12.3611 3.18548C12.5473 3.38502 12.6813 3.63326 12.7495 3.90537C12.8252 4.20967 12.8785 4.61247 12.9145 5.02807L12.922 5.11135L12.9385 5.31956L12.9445 5.40284C12.9932 6.13475 12.9992 6.82022 13 6.96997V7.03003C12.9992 7.18538 12.9925 7.9173 12.9385 8.67964L12.9325 8.76372L12.9257 8.84701C12.8882 9.30505 12.8327 9.7599 12.7495 10.0946C12.6815 10.3669 12.5476 10.6152 12.3613 10.8148C12.1751 11.0144 11.9429 11.1582 11.6882 11.2317C10.8181 11.4816 7.51116 11.4992 7.05288 11.5H6.94637C6.71461 11.5 5.75605 11.4952 4.75098 11.4584L4.62348 11.4536L4.55822 11.4504L4.42996 11.4447L4.30171 11.4391C3.46915 11.3999 2.67635 11.3366 2.31108 11.2309C2.05643 11.1574 1.82435 11.0138 1.63808 10.8143C1.45182 10.6149 1.3179 10.3667 1.24977 10.0946C1.16651 9.7607 1.11101 9.30505 1.0735 8.84701L1.0675 8.76292L1.0615 8.67964C1.02449 8.13703 1.00398 7.59328 1 7.04925L1 6.95075C1.0015 6.77858 1.0075 6.1836 1.048 5.52696L1.05325 5.44448L1.0555 5.40284L1.0615 5.31956L1.078 5.11135L1.08551 5.02807C1.12151 4.61247 1.17476 4.20887 1.25052 3.90537C1.31854 3.63315 1.4524 3.38479 1.63867 3.18522C1.82495 2.98564 2.05709 2.84185 2.31183 2.76826C2.6771 2.66416 3.4699 2.6001 4.30246 2.56006L4.42996 2.55445L4.55897 2.54965L4.62348 2.54725L4.75173 2.54164C5.46556 2.51712 6.17968 2.5035 6.89387 2.5008L7.03863 2.5ZM6 5.02807V9L9 7.03003L6 5.02807Z" fill="currentColor"></path></svg></div>YouTube</div></div></a></li><li class="relative text-sm font-bold lg:top-1 lg:text-base lg:font-normal lg:flex hover:bg-azure3 dark:hover:bg-gray-800 focus-within:bg-azure3 dark:focus-within:bg-gray-800 lg:hover:bg-neutral-100 lg:dark:hover:bg-gray-800 lg:focus-within:bg-neutral-100 lg:dark:focus-within:bg-gray-900"><a aria-current="false" tabindex="-1" class="py-1.5 lg:py-3.5 leading-none flex flex-wrap w-full pl-1 lg:px-5" href="https://fosstodon.org/@deno_land"><div class="w-full"><div class="w-max flex gap-4 items-center"><div class="flex justify-center items-center w-6 opacity-50"><svg class="w-6 h-6" width="14" height="14" viewBox="-10 -5 1034 1034" xmlns="http://www.w3.org/2000/svg" version="1.1"><path fill="currentColor" d="M499 112q-93 1 -166 11q-81 11 -128 33l-14 8q-16 10 -32 25q-22 21 -38 47q-21 33 -32 73q-14 47 -14 103v37q0 77 1 119q3 113 18 188q19 95 62 154q50 67 134 89q109 29 210 24q46 -3 88 -12q30 -7 55 -17l19 -8l-4 -75l-22 6q-28 6 -57 10q-41 6 -78 4q-53 -1 -80 -7
|
|
q-43 -8 -67 -30q-29 -25 -35 -72q-2 -14 -2 -29l25 6q31 6 65 10q48 7 93 9q42 2 92 -2q32 -2 88 -9t107 -30q49 -23 81.5 -54.5t38.5 -63.5q9 -45 13 -109q4 -46 5 -97v-41q0 -56 -14 -103q-11 -40 -32 -73q-16 -26 -38 -47q-15 -15 -32 -25q-12 -8 -14 -8
|
|
q-46 -22 -127 -33q-74 -10 -166 -11h-3zM367 267q73 0 109 56l24 39l24 -39q36 -56 109 -56q63 0 101 43t38 117v239h-95v-232q0 -74 -61 -74q-69 0 -69 88v127h-94v-127q0 -88 -69 -88q-61 0 -61 74v232h-95v-239q0 -74 38 -117t101 -43z"></path></svg></div>Mastodon</div></div></a></li></ul></div></div></div></div><!--/frsh:island--><div class="dark:border-gray-800"><a class="block w-full px-1 my-3 lg:w-auto lg:m-0 lg:px-2 lg:rounded-md lg:hover:bg-azure3 lg:hover:dark:bg-gray-800 font-bold" href="/blog" aria-current="true" data-ancestor="true">Blog</a></div></div><div class="flex flex-col lg:flex-row grow gap-4 lg:items-center lg:justify-end"><!--frsh:island:OramaSearch:6:--><div class="md:relative w-full hidden lg:block max-w-64"><div class="relative"><input type="search" placeholder="Search" id="orama-search-input" value="" class="w-full min-w-24 rounded-lg placeholder:text-sm text-base leading-normal p-1 pl-8 border transition-all duration-150
|
|
border-gray-600 dark:border-gray-100 focus:outline-offset-1 disabled:opacity-50"><svg class="absolute top-2 left-2 size-4.5 text-gray-600 pointer-events-none " width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_2006_89)"><path d="M13.3008 12.1951L10.3537 9.24807C11.0632 8.30353 11.4463 7.15382 11.445 5.97248C11.445 2.95497 8.98999 0.5 5.97248 0.5C2.95497 0.5 0.5 2.95497 0.5 5.97248C0.5 8.98999 2.95497 11.445 5.97248 11.445C7.15382 11.4463 8.30353 11.0632 9.24807 10.3537L12.1951 13.3008C12.3443 13.4341 12.5389 13.5053 12.7389 13.4997C12.9389 13.4941 13.1292 13.4121 13.2707 13.2707C13.4121 13.1292 13.4941 12.9389 13.4997 12.7389C13.5053 12.5389 13.4341 12.3443 13.3008 12.1951ZM2.06357 5.97248C2.06357 5.19937 2.29282 4.44362 2.72234 3.8008C3.15185 3.15799 3.76234 2.65697 4.4766 2.36111C5.19086 2.06526 5.97682 1.98785 6.73507 2.13867C7.49333 2.2895 8.18983 2.66179 8.7365 3.20846C9.28317 3.75513 9.65546 4.45163 9.80629 5.20989C9.95711 5.96814 9.8797 6.7541 9.58385 7.46836C9.28799 8.18262 8.78697 8.79311 8.14416 9.22262C7.50134 9.65214 6.74559 9.88139 5.97248 9.88139C4.93615 9.88015 3.94263 9.46792 3.20983 8.73513C2.47704 8.00233 2.06481 7.00881 2.06357 5.97248Z" fill="currentColor"></path></g><defs><clipPath id="clip0_2006_89"><rect width="14" height="14" fill="white"></rect></clipPath></defs></svg><kbd id="search-key" class="hidden xs:flex pointer-events-none absolute font-sans rounded-sm top-1 right-1 bottom-1 w-auto border-1 border-gray-500 dark:border-gray-800 border-b-2 border-r-2 bg-white text-gray-600 dark:text-gray-100 text-center text-xs font-bold p-2 items-center justify-center dark:bg-gray-800">⌘K</kbd><div id="orama-search-loading" class="absolute left-2 top-1/2 transform -translate-y-1/2 hidden bg-white dark:bg-black"><div class="animate-spin rounded-full h-4 w-4 border-2 border-transparent border-r-black dark:border-r-white bg-white dark:bg-black"></div></div><div class="sr-only" aria-live="polite" id="orama-results-announcer" ></div></div><div id="orama-search-results" class="absolute inset-2 left-2 right-2 h-[calc(100vh-10rem)] lg:h-[calc(100vh-8rem)] top-32 lg:top-10 md:top-full md:left-auto md:right-0 mt-2 bg-white dark:bg-black dark:text-white border border-gray-500 dark:border-gray-800 rounded-xl shadow-2xl z-50 md:max-h-128 overflow-hidden hidden md:min-w-160 max-w-2xl"><div id="orama-search-results-content" class="overflow-y-auto h-full"></div><div class="border-t border-gray-500 dark:border-gray-800 bg-gray-50 dark:bg-gray-900 px-4 py-2 sticky bottom-0"><div class="flex items-center gap-6 text-xs text-gray-500 dark:text-gray-500"><span><kbd class="px-1.5 py-0.5 text-xs font-semibold text-gray-600 bg-white border-r-2 border-b-2 border border-gray-500 dark:border-gray-800 rounded mr-1"><span aria-hidden="true">↑↓</span><span class="sr-only">Up or down to</span></kbd>navigate</span><span><kbd class="px-1.5 py-0.5 text-xs font-semibold text-gray-600 bg-white border-r-2 border-b-2 border border-gray-500 dark:border-gray-800 rounded mr-1"><span aria-hidden="true">↵</span><span class="sr-only">Enter to</span></kbd>select</span><span><kbd class="px-1.5 py-0.5 text-xs font-semibold text-gray-600 bg-white border-r-2 border-b-2 border border-gray-500 dark:border-gray-800 rounded mr-1"><span aria-hidden="true">ESC</span><span class="sr-only">Escape to</span></kbd>close</span><img src="/images/orama-dark.svg?__frsh_c=175287fadcf5d023f9ad4abd8ddf46c4a234946a" alt="Search powered by Orama" class="dark:hidden h-4 w-auto ml-auto"/><img src="/images/orama-light.svg?__frsh_c=175287fadcf5d023f9ad4abd8ddf46c4a234946a" alt="Search powered by Orama" class="hidden dark:inline h-4 w-auto ml-auto"/></div></div></div></div><!--/frsh:island--></div></div></nav></div></header><main tabindex="-1" id="main"><div class="mx-auto px-4 pb-16 pt-8 md:pt-16 max-w-screen-md"><article class=""><div class=""><h1 class="blog-header text-4xl font-bold text-gray-800 sm:text-6xl col-span-7">March 2 incident update</h1><div class="mt-8 text-lg text-gray-600 border-b border-b-gray-300 mb-8 pb-8"><p class="flex items-center gap-2"><time datetime="2021-03-04T15:00:00.000Z">March 4, 2021</time><a href="/feed" class="hover:text-gray-700" title="Atom Feed"><svg class="h-4 w-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor"><path d="M5 3a1 1 0 000 2c5.523 0 10 4.477 10 10a1 1 0 102 0C17 8.373 11.627 3 5 3z"></path><path d="M4 9a1 1 0 011-1 7 7 0 017 7 1 1 0 11-2 0 5 5 0 00-5-5 1 1 0 01-1-1zM3 15a2 2 0 114 0 2 2 0 01-4 0z"></path></svg></a></p><ul class="mt-4 flex flex-wrap gap-2 gap-x-4 text-sm"><li class="whitespace-nowrap"><a class="flex items-center gap-1 hover:underline" href="https://github.com/lucacasonato"><img src="https://github.com/lucacasonato.png" class="h-[1.75em] rounded-full"/><span>Luca Casonato</span></a></li></ul><div class="mt-8 flow-root text-base text-gray-600"><ul class="-m-1 flex flex-row flex-wrap gap-2"><li><a class="inline-block rounded-md border border-gray-300 px-3 py-1 hover:border-gray-500 hover:bg-gray-50 hover:text-gray-700" href="/blog?tag=product-update" data-ancestor="true" aria-current="true">Product Update</a></li></ul></div></div></div><div class="markdown-body pb-16"><p>On Tuesday at 02:01 AM UTC several services provided by the Deno organization
|
|
had a 98 minute service disruption. This impacted images and videos on the
|
|
deno.land website, serving of TypeScript files on deno.land/x and deno.land/std,
|
|
generation of documentation reports on doc.deno.land, and downloading of
|
|
registry metadata from cdn.deno.land. We have concluded that this outage was the
|
|
result of a rouge abuse prevention filter at an upstream service provider,
|
|
Cloudflare. This post details what exactly happened, how we recovered the
|
|
systems, and what we are doing to prevent this in the future.</p>
|
|
<p>All services are now operating normally again. The registry API at api.deno.land
|
|
was not impacted by this incident. No data was lost. We take outages like these
|
|
seriously and sincerely apologize for the disruption.</p>
|
|
<p>To understand what actually happened it is important to know that we released
|
|
Deno 1.8 and published the release notes in a blog post 1.5 hours before the
|
|
incident. This blog post ended up on Hacker News about 30 minutes before the
|
|
incident. At the time of incident we were receiving about 9x the regular traffic
|
|
to the site.</p>
|
|
<h2 id="timeline-of-events"><a class="anchor" aria-hidden="true" tabindex="-1" href="#timeline-of-events"><svg class="octicon octicon-link" viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>Timeline of events</h2>
|
|
<p>At 02:00 AM UTC we received an email from an automated system at Cloudflare
|
|
notifying us that all media on deno.land had been blocked due to a suspected
|
|
violation of section 2.8 or their TOS. This section of the TOS details that
|
|
Cloudflare may not be used to serve primarially media files. Upon receival of
|
|
this email we decided to remove the screen captures and images from the 1.8 blog
|
|
post as a temporary mitigation. This was done at 02:09 AM UTC. This did not
|
|
resolve the issue. At 02:22 AM UTC we opened a support ticket with Cloudflare.</p>
|
|
<p>At 03:00 AM UTC we decided we would move our infrastructure to an alternative
|
|
infrastructure provider (<a href="https://fly.io" rel="noopener noreferrer">https://fly.io</a>) to mitigate the outage. Huge thanks to
|
|
<a href="https://twitter.com/mrkurt" rel="noopener noreferrer">Kurt Mackey</a> from Fly.io for helping with this
|
|
effort and providing us with infrastructure right away. We switched over the DNS
|
|
records for the affected services at 03:24 AM UTC. This resolved the outage for
|
|
the majority of users worldwide at 03:41 AM UTC.</p>
|
|
<p>Cloudflare resolved the block they had put on our site at 18:40 PM UTC - 16.5
|
|
hours after the incident started, and 16 hours after we reached out. This was
|
|
the first non-standardized response we got from them after opening the ticket.</p>
|
|
<h2 id="root-cause"><a class="anchor" aria-hidden="true" tabindex="-1" href="#root-cause"><svg class="octicon octicon-link" viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>Root cause</h2>
|
|
<p>Our initial analysis of the incident concluded that Cloudflare had blocked all
|
|
media files for the deno.land zone - likely due to the steep increase of traffic
|
|
due to Hacker News. This alone should have not taken down deno.land/x or
|
|
deno.land/std as these do not serve media, but source code. This was caused by
|
|
Cloudflare seemingly interpreting all .ts files, regardless of content or
|
|
content-type header, as MPEG transport streams (which fall under the media
|
|
block). In our case this was not correct because .ts files can be both MPEG
|
|
transport streams, or TypeScript files (as is the case for us). All of our
|
|
typescript files are served with <code>application/typescript</code>.</p>
|
|
<h2 id="impact"><a class="anchor" aria-hidden="true" tabindex="-1" href="#impact"><svg class="octicon octicon-link" viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>Impact</h2>
|
|
<p>As you might know, Deno imports remote code using URLs. This means that if the
|
|
host of the module you want to import experiences an outage, you will not be
|
|
able to download this module from that host anymore. This is the same problem
|
|
all package managers have - for example when npmjs.org experiences an outage,
|
|
you can not <code>npm install</code> anymore.</p>
|
|
<p>Does this mean that you are not able to run your project when the module host
|
|
goes down? No. Deno caches all remote imports in a global cache directory on
|
|
your system. This means that when you import the a bit of code for the first
|
|
time it will be downloaded and cached, and then on subsequent runs you will be
|
|
able to use that code offline without needing network access - just like with
|
|
node_modules.</p>
|
|
<p>We expect the impact of this outage to be relatively minimal to most developers
|
|
who use Deno on active projects, as they would have likely had their
|
|
dependencies cached already. This outage overwhelmingly impacted new Deno users,
|
|
and CI pipelines.</p>
|
|
<p>It is also important to note that the Deno CLI does not depend on the deno.land
|
|
domain to be online to function. It is completely registry agnostic. If your
|
|
project is only made up of modules from other registries, like esm.sh,
|
|
skypack.dev, jspm.dev, or nest.land, you would have seen no impact from this
|
|
outage.</p>
|
|
<h2 id="whats-next"><a class="anchor" aria-hidden="true" tabindex="-1" href="#whats-next"><svg class="octicon octicon-link" viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>What’s next?</h2>
|
|
<p>Cloudflare reached out to us Tuesday evening to discuss what happened. After an
|
|
initital investigation they concluded that this was an error in their abuse
|
|
monitoring system. Cloudflare has assured us this issue will not occur again,
|
|
and that they will implement changes in their systems to make sure this will not
|
|
happen to any other Cloudflare customers.</p>
|
|
<p>Cloudflare has also assured us that a 16 hour gap between false detection and
|
|
remediation is not acceptable, and that this will be an area of immediate focus
|
|
for them.</p>
|
|
<p>This experience has solidified our belief that building the Deno runtime on
|
|
standardized, open web APIs like <code>fetch</code> was the right move. Because Cloudflare
|
|
Workers builds on these standard web APIs too, we were able to migrate our
|
|
primary Cloudflare Worker to a Deno script running on Fly.io in under 20
|
|
minutes. We only had to polyfill the “fetch” event to get our workers running.</p>
|
|
<p>If you are interested, this is the code we used to polyfill the “fetch” event:
|
|
<a href="https://gist.github.com/lucacasonato/1a30a4fa6ef6c053a93f271675ef93fc" rel="noopener noreferrer">https://gist.github.com/lucacasonato/1a30a4fa6ef6c053a93f271675ef93fc</a>. Try run
|
|
this example locally, then visit <a href="http://0.0.0.0:8080" rel="noopener noreferrer">http://0.0.0.0:8080</a>.</p>
|
|
<div class="highlight highlight-source-shell notranslate"><pre>$ deno run --allow-net https://gist.githubusercontent.com/lucacasonato/1a30a4fa6ef6c053a93f271675ef93fc/raw/efcdc8e798604e194831830fcb962b50261384b3/example-worker.js
|
|
Listening on http://0.0.0.0:8080</pre></div><p>As a result of this incident we have set up a public status page. This page
|
|
shows the current status of deno.land/x, deno.land/std, cdn.deno.land, and
|
|
api.deno.land. You can view it at <a href="https://status.deno.land/" rel="noopener noreferrer">https://status.deno.land/</a>.</p>
|
|
</div></article></div></main><footer class="border-t text-runtime text-sm flex justify-center bg-offblack border-gray-800"><div class="section-x-inset-xl py-8 lg:pt-16 w-full"><div class="flex flex-col items-start gap-16 md:flex-row md:gap-8 md:w-full md:justify-between max-w-4xl"><a href="/" class="flex items-center" data-ancestor="true" aria-current="true"><img src="/logos/dark-transparent.svg?__frsh_c=175287fadcf5d023f9ad4abd8ddf46c4a234946a" class="h-10 w-auto max-w-none block" alt="Deno logo"/></a><div><h2 class="leading-tight font-bold" id="FooterOpen-source">Open-source</h2><ul aria-labelledby="FooterOpen-source" class="text-gray-300 flex-col flex flex-wrap p-0 gap-3 m-0 mt-4"><li><a href="/" class="block hover:underline hover:text-gray-50 transition-colors" data-ancestor="true" aria-current="true">Deno</a></li><li><a href="https://fresh.deno.dev/" class="block hover:underline hover:text-gray-50 transition-colors">Fresh</a></li><li><a href="https://jsr.io/" class="block hover:underline hover:text-gray-50 transition-colors">JSR</a></li></ul></div><div><h2 class="leading-tight font-bold" id="FooterProducts">Products</h2><ul aria-labelledby="FooterProducts" class="text-gray-300 flex-col flex flex-wrap p-0 gap-3 m-0 mt-4"><li><a href="/deploy" class="block hover:underline hover:text-gray-50 transition-colors">Deno Deploy</a></li><li><a href="/deploy/sandbox" class="block hover:underline hover:text-gray-50 transition-colors">Deno Sandbox</a></li><li><a href="/deploy/subhosting" class="block hover:underline hover:text-gray-50 transition-colors">Subhosting</a></li><li><a href="/deploy/pricing" class="block hover:underline hover:text-gray-50 transition-colors">Pricing</a></li><li><a href="https://docs.deno.com/deploy/" class="block hover:underline hover:text-gray-50 transition-colors">Deno Deploy Docs</a></li></ul></div><div><h2 class="leading-tight font-bold" id="FooterDeno Resources">Deno Resources</h2><ul aria-labelledby="FooterDeno Resources" class="text-gray-300 flex-col flex flex-wrap p-0 gap-3 m-0 mt-4"><li><a href="/manual" class="block hover:underline hover:text-gray-50 transition-colors">Deno Docs</a></li><li><a href="https://docs.deno.com/api/deno/" class="block hover:underline hover:text-gray-50 transition-colors">Deno API Reference</a></li><li><a href="https://jsr.io/@std" class="block hover:underline hover:text-gray-50 transition-colors">Standard Library</a></li><li><a href="https://jsr.io/" class="block hover:underline hover:text-gray-50 transition-colors">Third-Party Modules</a></li><li><a href="https://examples.deno.land" class="block hover:underline hover:text-gray-50 transition-colors">Deno Examples</a></li></ul></div><div><h2 class="leading-tight font-bold" id="FooterCompany">Company</h2><ul aria-labelledby="FooterCompany" class="text-gray-300 flex-col flex flex-wrap p-0 gap-3 m-0 mt-4"><li><a href="/blog" class="block hover:underline hover:text-gray-50 transition-colors" data-ancestor="true" aria-current="true">Blog</a></li><li><a href="https://deno.news" class="block hover:underline hover:text-gray-50 transition-colors">News</a></li><li><a href="/brand" class="block hover:underline hover:text-gray-50 transition-colors">Branding</a></li><li><a href="https://docs.deno.com/deploy/privacy_policy/" class="block hover:underline hover:text-gray-50 transition-colors">Privacy Policy</a></li><li><a href="https://docs.deno.com/deploy/terms_and_conditions/" class="block hover:underline hover:text-gray-50 transition-colors">Terms and Conditions</a></li><li><a href="mailto:abuse@deno.com" class="block hover:underline hover:text-gray-50 transition-colors" target="_blank">Report abuse</a></li></ul></div></div><div class="w-full text-center flex flex-col md:flex-row flex-wrap justify-between items-center gap-4 pt-8 mt-8 border-t border-gray-800"><div class="flex items-center justify-center gap-3 text-gray-400"><a href="https://github.com/denoland" class="hover:text-gray-50 transition-colors"><span class="sr-only">GitHub</span><svg class="size-6" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" aria-label="GitHub Logo"><g clip-path="url(#clip0_1989_191)"><path d="M7.00001 0C3.13391 0 0 3.21295 0 7.17755C0 10.3482 2.0055 13.0388 4.7873 13.9875C5.1373 14.0534 5.26471 13.832 5.26471 13.6414C5.26471 13.4716 5.25912 13.0195 5.25561 12.4212C3.3082 12.8547 2.8973 11.4589 2.8973 11.4589C2.5795 10.6291 2.1203 10.4084 2.1203 10.4084C1.48471 9.96418 2.16861 9.97279 2.16861 9.97279C2.87071 10.0229 3.24032 10.7122 3.24032 10.7122C3.86472 11.8085 4.87903 11.4918 5.27732 11.3084C5.34171 10.8448 5.52232 10.5288 5.72251 10.3497C4.16851 10.1684 2.534 9.55218 2.534 6.80211C2.534 6.01893 2.807 5.37764 3.2543 4.87605C3.1822 4.69476 2.94211 3.96463 3.32289 2.97722C3.32289 2.97722 3.91089 2.78376 5.24789 3.71238C5.77305 3.55992 6.37629 3.47184 6.99948 3.4709C7.59448 3.47377 8.19351 3.5533 8.7528 3.71238C10.0891 2.78376 10.6757 2.97649 10.6757 2.97649C11.0579 3.9646 10.8171 4.69475 10.7457 4.87603C11.1937 5.3776 11.4653 6.0189 11.4653 6.80208C11.4653 9.55931 9.82799 10.1662 8.26908 10.3439C8.52037 10.5653 8.74368 11.0031 8.74368 11.6731C8.74368 12.6318 8.73529 13.4064 8.73529 13.6414C8.73529 13.8335 8.86129 14.057 9.21689 13.9868C12.0205 13.0032 14 10.3285 14 7.18046C14 7.17943 14 7.17841 14 7.17738C14 3.21278 10.8654 0 7.00001 0Z" fill="currentColor"></path></g><defs><clipPath id="clip0_1989_191"><rect width="14" height="14" fill="white"></rect></clipPath></defs></svg></a><a href="https://discord.gg/deno" class="hover:text-gray-50 transition-colors"><span class="sr-only">Discord</span><svg class="size-7" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" aria-label="Discord Logo"><g clip-path="url(#clip0_1993_195)"><path d="M11.8595 2.62936C10.9397 2.21264 9.96862 1.917 8.97117 1.75C8.83467 1.99146 8.71117 2.23988 8.60118 2.49424C7.5387 2.33581 6.45822 2.33581 5.39574 2.49424C5.28569 2.23991 5.16219 1.99149 5.02575 1.75C4.02766 1.91841 3.05598 2.21475 2.13524 2.63154C0.307332 5.30775 -0.188185 7.9175 0.0595735 10.4902C1.13004 11.2729 2.3282 11.8681 3.60197 12.25C3.88878 11.8683 4.14258 11.4633 4.36066 11.0394C3.94644 10.8863 3.54665 10.6974 3.16591 10.4749C3.26612 10.403 3.36412 10.3289 3.45882 10.257C4.56668 10.7726 5.77586 11.0399 7.00011 11.0399C8.22437 11.0399 9.43354 10.7726 10.5414 10.257C10.6372 10.3344 10.7352 10.4085 10.8343 10.4749C10.4528 10.6978 10.0523 10.887 9.63736 11.0405C9.85518 11.4642 10.109 11.8688 10.3961 12.25C11.6709 11.8696 12.87 11.2747 13.9406 10.4913C14.2314 7.50778 13.444 4.92201 11.8595 2.62936ZM4.67449 8.908C3.98407 8.908 3.41367 8.28798 3.41367 7.52522C3.41367 6.76245 3.96425 6.13699 4.67228 6.13699C5.38032 6.13699 5.94631 6.76245 5.9342 7.52522C5.92209 8.28798 5.37812 8.908 4.67449 8.908ZM9.32574 8.908C8.63422 8.908 8.06602 8.28798 8.06602 7.52522C8.06602 6.76245 8.6166 6.13699 9.32574 6.13699C10.0349 6.13699 10.5965 6.76245 10.5843 7.52522C10.5722 8.28798 10.0294 8.908 9.32574 8.908Z" fill="currentColor"></path></g><defs><clipPath id="clip0_1993_195"><rect width="14" height="14" fill="white"></rect></clipPath></defs></svg></a><a href="https://bsky.app/profile/deno.land" class="hover:text-gray-50 transition-colors"><span class="sr-only">Bluesky</span><svg class="size-6" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-label="BlueSky Logo"><path d="M12 10.8c-1.087-2.114-4.046-6.053-6.798-7.995C2.566.944 1.561 1.266.902 1.565.139 1.908 0 3.08 0 3.768c0 .69.378 5.65.624 6.479.815 2.736 3.713 3.66 6.383 3.364.136-.02.275-.039.415-.056-.138.022-.276.04-.415.056-3.912.58-7.387 2.005-2.83 7.078 5.013 5.19 6.87-1.113 7.823-4.308.953 3.195 2.05 9.271 7.733 4.308 4.267-4.308 1.172-6.498-2.74-7.078a8.741 8.741 0 0 1-.415-.056c.14.017.279.036.415.056 2.67.297 5.568-.628 6.383-3.364.246-.828.624-5.79.624-6.478 0-.69-.139-1.861-.902-2.206-.659-.298-1.664-.62-4.3 1.24C16.046 4.748 13.087 8.687 12 10.8Z" fill="currentColor"></path></svg></a><a href="https://fosstodon.org/@deno_land" class="hover:text-gray-50 transition-colors"><span class="sr-only">Mastodon</span><svg class="size-6" width="14" height="14" viewBox="-10 -5 1034 1034" xmlns="http://www.w3.org/2000/svg" version="1.1"><path fill="currentColor" d="M499 112q-93 1 -166 11q-81 11 -128 33l-14 8q-16 10 -32 25q-22 21 -38 47q-21 33 -32 73q-14 47 -14 103v37q0 77 1 119q3 113 18 188q19 95 62 154q50 67 134 89q109 29 210 24q46 -3 88 -12q30 -7 55 -17l19 -8l-4 -75l-22 6q-28 6 -57 10q-41 6 -78 4q-53 -1 -80 -7
|
|
q-43 -8 -67 -30q-29 -25 -35 -72q-2 -14 -2 -29l25 6q31 6 65 10q48 7 93 9q42 2 92 -2q32 -2 88 -9t107 -30q49 -23 81.5 -54.5t38.5 -63.5q9 -45 13 -109q4 -46 5 -97v-41q0 -56 -14 -103q-11 -40 -32 -73q-16 -26 -38 -47q-15 -15 -32 -25q-12 -8 -14 -8
|
|
q-46 -22 -127 -33q-74 -10 -166 -11h-3zM367 267q73 0 109 56l24 39l24 -39q36 -56 109 -56q63 0 101 43t38 117v239h-95v-232q0 -74 -61 -74q-69 0 -69 88v127h-94v-127q0 -88 -69 -88q-61 0 -61 74v232h-95v-239q0 -74 38 -117t101 -43z"></path></svg></a><a href="https://twitter.com/deno_land" class="hover:text-gray-50 transition-colors"><span class="sr-only">Twitter or X or whatever</span><svg width="300" height="300.251" class="size-5" viewBox="0 0 300 300.251" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-label="X logo" fill="currentColor"><path d="M178.57 127.15 290.27 0h-26.46l-97.03 110.38L89.34 0H0l117.13 166.93L0 300.25h26.46l102.4-116.59 81.8 116.59h89.34M36.01 19.54H76.66l187.13 262.13h-40.66"></path></svg></a><a href="https://youtube.com/@deno_land" class="hover:text-gray-50 transition-colors"><span class="sr-only">YouTube</span><svg class="size-7" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" aria-label="YouTube Logo"><path d="M7.03863 2.5H7.10538C7.72192 2.5024 10.8459 2.52643 11.6882 2.76826C11.9428 2.84207 12.1748 2.98593 12.3611 3.18548C12.5473 3.38502 12.6813 3.63326 12.7495 3.90537C12.8252 4.20967 12.8785 4.61247 12.9145 5.02807L12.922 5.11135L12.9385 5.31956L12.9445 5.40284C12.9932 6.13475 12.9992 6.82022 13 6.96997V7.03003C12.9992 7.18538 12.9925 7.9173 12.9385 8.67964L12.9325 8.76372L12.9257 8.84701C12.8882 9.30505 12.8327 9.7599 12.7495 10.0946C12.6815 10.3669 12.5476 10.6152 12.3613 10.8148C12.1751 11.0144 11.9429 11.1582 11.6882 11.2317C10.8181 11.4816 7.51116 11.4992 7.05288 11.5H6.94637C6.71461 11.5 5.75605 11.4952 4.75098 11.4584L4.62348 11.4536L4.55822 11.4504L4.42996 11.4447L4.30171 11.4391C3.46915 11.3999 2.67635 11.3366 2.31108 11.2309C2.05643 11.1574 1.82435 11.0138 1.63808 10.8143C1.45182 10.6149 1.3179 10.3667 1.24977 10.0946C1.16651 9.7607 1.11101 9.30505 1.0735 8.84701L1.0675 8.76292L1.0615 8.67964C1.02449 8.13703 1.00398 7.59328 1 7.04925L1 6.95075C1.0015 6.77858 1.0075 6.1836 1.048 5.52696L1.05325 5.44448L1.0555 5.40284L1.0615 5.31956L1.078 5.11135L1.08551 5.02807C1.12151 4.61247 1.17476 4.20887 1.25052 3.90537C1.31854 3.63315 1.4524 3.38479 1.63867 3.18522C1.82495 2.98564 2.05709 2.84185 2.31183 2.76826C2.6771 2.66416 3.4699 2.6001 4.30246 2.56006L4.42996 2.55445L4.55897 2.54965L4.62348 2.54725L4.75173 2.54164C5.46556 2.51712 6.17968 2.5035 6.89387 2.5008L7.03863 2.5ZM6 5.02807V9L9 7.03003L6 5.02807Z" fill="currentColor"></path></svg></a></div><span class="block text-xs text-gray-500 leading-tight">Copyright © 2026 Deno Land Inc. <span class="whitespace-nowrap">All rights reserved.</span> | <!--frsh:island:CookieOptOut:7:--><!--/frsh:island--></span><a href="https://denostatus.com/" class="transition-colors shadow-md px-4 py-2 rounded-lg font-bold inline-flex items-center gap-2 text-base bg-gray-800 border border-gray-800 hover:border-runtime text-gray-50"><div class="w-3 h-3 rounded-full bg-runtime"></div><span>All systems operational</span></a></div></div></footer></div></div><script type="module" nonce="3dfbbfd63d454a33b40dedc426119404">import { boot } from "/_fresh/js/175287fadcf5d023f9ad4abd8ddf46c4a234946a/fresh-runtime.js";import { SkipToMainLink } from "/_fresh/js/175287fadcf5d023f9ad4abd8ddf46c4a234946a/SkipToMainLink.js";import { HelloBar } from "/_fresh/js/175287fadcf5d023f9ad4abd8ddf46c4a234946a/HelloBar.js";import { OramaSearch } from "/_fresh/js/175287fadcf5d023f9ad4abd8ddf46c4a234946a/OramaSearch.js";import { NavItemWithChildren } from "/_fresh/js/175287fadcf5d023f9ad4abd8ddf46c4a234946a/NavItemWithChildren.js";import { CookieOptOut } from "/_fresh/js/175287fadcf5d023f9ad4abd8ddf46c4a234946a/AnalyticsOptOut.js";boot({SkipToMainLink,HelloBar,OramaSearch,NavItemWithChildren,CookieOptOut},"[[1,4,11,19,62,75,100,105],{\"slots\":2,\"props\":3},[],{},{\"slots\":5,\"props\":6},[],{\"id\":7,\"href\":8,\"ctaText\":9,\"text\":10},\"celld-2026-09\",\"https://celld.dev\",\"Learn more\",\"Introducing celld: self-hosted, distributed Durable Objects\",{\"slots\":12,\"props\":13},[],{\"projectId\":14,\"apiKey\":15,\"dataSourceIDs\":16,\"class\":18},\"af2a2800-bfac-4b67-a58e-51ada826e1c0\",\"c1_SHxojDzeso5ITKAGMDjvgpZk43Ff0pFiQhmdGfiLBtnUWKKJFnWGSNs_Zb7\",[17],\"ad8a33af-4669-444e-9bed-b0716b0a9e63\",\"lg:hidden\",{\"slots\":20,\"props\":21},[],{\"entry\":22,\"path\":60,\"activeNav\":61},{\"content\":23,\"children\":24},\"Products\",[25,30,34,38,42,47,52,56],{\"href\":26,\"content\":27,\"subhead\":28,\"category\":29},\"/\",\"Deno\",\"Modern runtime for JavaScript and TypeScript\",\"Open Source\",{\"href\":31,\"content\":32,\"subhead\":33,\"category\":29},\"https://fresh.deno.dev\",\"Fresh\",\"Web framework designed for the edge\",{\"href\":35,\"content\":36,\"subhead\":37,\"category\":29},\"https://clawpatrol.dev\",\"Claw Patrol\",\"Open-source security firewall for agents\",{\"href\":39,\"content\":40,\"subhead\":41,\"category\":29},\"https://jsr.io\",\"JSR\",\"TypeScript-first ESM package registry\",{\"href\":43,\"content\":44,\"subhead\":45,\"category\":46},\"/deploy\",\"Deno Deploy\",\"Easy serverless hosting for your JavaScript projects\",\"Commercial\",{\"href\":48,\"content\":49,\"subhead\":50,\"category\":46,\"nested\":51},\"/deploy/sandbox\",\"Deno Sandbox\",\"Run untrusted code in secure Linux VMs. Built for AI agents.\",true,{\"href\":53,\"content\":54,\"subhead\":55,\"category\":46,\"nested\":51},\"/subhosting\",\"Subhosting\",\"Extend your platform using Deno Deploy's secure infrastructure\",{\"href\":57,\"content\":58,\"subhead\":59,\"category\":46},\"/enterprise\",\"Deno for Enterprise\",\"Enterprise support for runtime projects\",\"/blog/02-03-2021-outage-post-mortem\",[\"Signal\",-2],{\"slots\":63,\"props\":64},[],{\"entry\":65,\"path\":60,\"activeNav\":61},{\"content\":66,\"children\":67},\"Modules\",[68,71,72],{\"href\":69,\"content\":70},\"https://jsr.io/@std\",\"Standard Library\",{\"href\":39,\"content\":40},{\"href\":73,\"content\":74},\"/npm/\",\"Node.js & npm\",{\"slots\":76,\"props\":77},[],{\"entry\":78,\"path\":60,\"activeNav\":61},{\"content\":79,\"children\":80},\"Community\",[81,84,87,91,94,97],{\"href\":82,\"content\":83,\"icon\":83},\"https://discord.gg/deno\",\"Discord\",{\"href\":85,\"content\":86,\"icon\":86},\"https://github.com/denoland\",\"GitHub\",{\"href\":88,\"content\":89,\"icon\":90},\"https://bsky.app/profile/deno.land\",\"Bluesky\",\"BlueSky\",{\"href\":92,\"content\":93,\"icon\":93},\"https://twitter.com/deno_land\",\"X\",{\"href\":95,\"content\":96,\"icon\":96},\"https://www.youtube.com/c/deno_land\",\"YouTube\",{\"href\":98,\"content\":99,\"icon\":99},\"https://fosstodon.org/@deno_land\",\"Mastodon\",{\"slots\":101,\"props\":102},[],{\"projectId\":14,\"apiKey\":15,\"dataSourceIDs\":103,\"class\":104},[17],\"hidden lg:block max-w-64\",{\"slots\":106,\"props\":107},[],{}]");</script></body></html> |