{"id":8000,"date":"2023-10-13T11:10:56","date_gmt":"2023-10-13T18:10:56","guid":{"rendered":"https:\/\/ahmadawais.com\/?p=8000"},"modified":"2023-10-13T11:11:36","modified_gmt":"2023-10-13T18:11:36","slug":"supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available","status":"publish","type":"post","link":"https:\/\/ahmadawais.com\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\/","title":{"rendered":"Supabase with Next.js App Router Fix for Invariant: cookies() expects to have requestAsyncStorage, none available"},"content":{"rendered":"<p>Next.js App router is pretty awesome. Sadly, it&#8217;s super new. The errors you face are sometimes hard to debug as you can&#8217;t see where it&#8217;s coming from and why. I hope they fix it soon.<\/p>\n<p>Supabase is pretty awesome, too. I&#8217;ve been using it as a backend, database, file storage, and, most importantly, as an authentication service for one of my production Next.js app router-based apps.<\/p>\n<h2 id=\"invariant-cookies-expects-to-have-requestasyncstorage-none-available\">Invariant: cookies() expects to have requestAsyncStorage, none available<a href=\"#invariant-cookies-expects-to-have-requestasyncstorage-none-available\" class=\"heading-link\">#<\/a><\/h2>\n<p>It&#8217;s all good and well on the localhost, but when you try to deploy it, most of us face the dreaded <code>Invariant: cookies() expects to have requestAsyncStorage, none available<\/code> error. There are a lot of ideas on this <a href=\"https:\/\/github.com\/vercel\/next.js\/issues\/45371\">GitHub issue<\/a>, but sadly none worked.<\/p>\n<h3 id=\"fix-the-async-function-cookies-expects-requestasyncstorage-none-available\">Fix: The async function: cookies() expects requestAsyncStorage, none available<a href=\"#fix-the-async-function-cookies-expects-requestasyncstorage-none-available\" class=\"heading-link\">#<\/a><\/h3>\n<p>And then I went down the rabbit hole with console logging everything to figure out that well cookies probably need to be awaited since the React Server Components are <code>async<\/code> functions.<\/p>\n<p>Lo and behold, that was it. Making it an async call fixed it for me.<\/p>\n<p>Now I have a file called <code>lib\/supabase.ts<\/code> which looks like this:<\/p>\n<pre class=\"lang:javascript\">import {\r\n\tcreateClientComponentClient,\r\n\tcreateRouteHandlerClient,\r\n\tcreateServerActionClient,\r\n\tcreateServerComponentClient,\r\n} from '@supabase\/auth-helpers-nextjs';\r\nimport { cookies } from 'next\/headers';\r\nimport { cache } from 'react';\r\nimport 'server-only';\r\n\r\nexport const dynamic = 'force-dynamic';\r\n\r\nexport const getDbOnSever = cache(async () =&gt; {\r\n\tconst cookieStore = cookies();\r\n\treturn createServerComponentClient&lt;Database&gt;({ cookies: () =&gt; cookieStore });\r\n});\r\n\r\nexport const getDbOnAction = cache(async () =&gt; {\r\n\tconst cookieStore = cookies();\r\n\treturn createServerActionClient&lt;Database&gt;({ cookies: () =&gt; cookieStore });\r\n});\r\n\r\nexport const getDbOnRoute = cache(async () =&gt; {\r\n\tconst cookieStore = cookies();\r\n\treturn createRouteHandlerClient&lt;Database&gt;({ cookies: () =&gt; cookieStore });\r\n});<\/pre>\n<p>Note the <code>async<\/code> nature of all the functions. I know nothing is awaited but the function now returns a promise and can be awaited in a server component, route, or an action. And that way, we get the cookies.<\/p>\n<h3 id=\"usage\">Usage<a href=\"#usage\" class=\"heading-link\">#<\/a><\/h3>\n<p>You can use these functions in your React server components, actions, and API routes. Like this:<\/p>\n<pre class=\"lang:javascript\">\/\/ React Server Component.\r\nimport { getDbOnSever } from '@\/lib\/db-server';\r\nimport { cache } from 'react';\r\n\r\nexport const dynamic = 'force-dynamic';\r\n\r\nexport default async function Page() {\r\n\tconst getApps = cache(async () =&gt; {\r\n\t\tconst supabase = await getDbOnSever();\r\n\t\tconst { data: apps, error } = await supabase.from('apps').select();\r\n\t\treturn apps;\r\n\t});\r\n\r\n\tconst apps = await getApps();\r\n\r\n\t&lt;pre&gt;{JSON.stringify(apps, null, 2)}&lt;\/pre&gt;;\r\n}<\/pre>\n<h3 id=\"conditions\">Conditions<a href=\"#conditions\" class=\"heading-link\">#<\/a><\/h3>\n<ol>\n<li><strong>Async\/Await<\/strong>: React Server Component, Server Action, or API Route should all be <code>async<\/code> functions where you <code>await<\/code> the db client as shown above.<\/li>\n<li><strong>Dynamic it is<\/strong>: Remember to use <code>export const dynamic = 'force-dynamic';<\/code> as recommended by Supabase. Read more about it on <a href=\"https:\/\/nextjs.org\/docs\/app\/api-reference\/file-conventions\/route-segment-config#options\">docs<\/a>.<\/li>\n<\/ol>\n<p>That&#8217;s it and that&#8217;s all. Use your code for good!<\/p>\n<p>Peace! \u270c\ufe0f<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Next.js App router is pretty awesome. Sadly, it&#8217;s super new. The errors you face are sometimes hard to debug as you can&#8217;t see where it&#8217;s coming from and why. I hope they fix it soon. Supabase is pretty awesome, too. I&#8217;ve been using it as a backend, database, file storage, and, most importantly, as an authentication service for one of my production Next.js app router-based apps. Invariant: cookies() expects to have requestAsyncStorage, none available# It&#8217;s all good and well on the localhost, but when you try to deploy it, most of us face the dreaded Invariant: cookies() expects to have [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"webmentions_disabled_pings":false,"webmentions_disabled":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[215],"tags":[270,294],"class_list":["post-8000","post","type-post","status-publish","format-standard","hentry","category-web","tag-next-js","tag-supabase"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Supabase with Next.js App Router Fix for Invariant: cookies() expects to have requestAsyncStorage, none available<\/title>\n<meta name=\"description\" content=\"Next.js App router is pretty awesome. Sadly, it&#039;s super new. The errors you face are sometimes hard to debug as you can&#039;t see where it&#039;s coming from and\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ahmadawais.com\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Supabase with Next.js App Router Fix for Invariant: cookies() expects to have requestAsyncStorage, none available\" \/>\n<meta property=\"og:description\" content=\"Next.js App router is pretty awesome. Sadly, it&#039;s super new. The errors you face are sometimes hard to debug as you can&#039;t see where it&#039;s coming from and\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ahmadawais.com\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\/\" \/>\n<meta property=\"og:site_name\" content=\"Ahmad Awais\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/facebook.com\/AhmadAwais\" \/>\n<meta property=\"article:author\" content=\"https:\/\/facebook.com\/AhmadAwais\" \/>\n<meta property=\"article:published_time\" content=\"2023-10-13T18:10:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-10-13T18:11:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ahmadawais.com\/wp-content\/uploads\/2024\/08\/ahmad-awais.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1440\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Ahmad Awais\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@MrAhmadAwais\" \/>\n<meta name=\"twitter:site\" content=\"@MrAhmadAwais\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ahmad Awais\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/ahmadawais.com\\\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ahmadawais.com\\\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\\\/\"},\"author\":{\"name\":\"Ahmad Awais\",\"@id\":\"https:\\\/\\\/ahmadawais.com\\\/#\\\/schema\\\/person\\\/1d1b9504182dca2315cf039fb4ebb85b\"},\"headline\":\"Supabase with Next.js App Router Fix for Invariant: cookies() expects to have requestAsyncStorage, none available\",\"datePublished\":\"2023-10-13T18:10:56+00:00\",\"dateModified\":\"2023-10-13T18:11:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/ahmadawais.com\\\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\\\/\"},\"wordCount\":304,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/ahmadawais.com\\\/#\\\/schema\\\/person\\\/1d1b9504182dca2315cf039fb4ebb85b\"},\"keywords\":[\"Next.js\",\"Supabase\"],\"articleSection\":[\"Web\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/ahmadawais.com\\\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ahmadawais.com\\\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\\\/\",\"url\":\"https:\\\/\\\/ahmadawais.com\\\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\\\/\",\"name\":\"Supabase with Next.js App Router Fix for Invariant: cookies() expects to have requestAsyncStorage, none available\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ahmadawais.com\\\/#website\"},\"datePublished\":\"2023-10-13T18:10:56+00:00\",\"dateModified\":\"2023-10-13T18:11:36+00:00\",\"description\":\"Next.js App router is pretty awesome. Sadly, it's super new. The errors you face are sometimes hard to debug as you can't see where it's coming from and\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ahmadawais.com\\\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ahmadawais.com\\\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ahmadawais.com\\\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/ahmadawais.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Supabase with Next.js App Router Fix for Invariant: cookies() expects to have requestAsyncStorage, none available\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ahmadawais.com\\\/#website\",\"url\":\"https:\\\/\\\/ahmadawais.com\\\/\",\"name\":\"Ahmad Awais\",\"description\":\"Founder &amp; CEO of CommandCode.ai f\\\/k\\\/a Langbase | Google Developers Advisory Board (gDAB) founding member\",\"publisher\":{\"@id\":\"https:\\\/\\\/ahmadawais.com\\\/#\\\/schema\\\/person\\\/1d1b9504182dca2315cf039fb4ebb85b\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/ahmadawais.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/ahmadawais.com\\\/#\\\/schema\\\/person\\\/1d1b9504182dca2315cf039fb4ebb85b\",\"name\":\"Ahmad Awais\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/ahmadawais.com\\\/wp-content\\\/uploads\\\/2020\\\/06\\\/Ahmad-Awais-face.jpg\",\"url\":\"https:\\\/\\\/ahmadawais.com\\\/wp-content\\\/uploads\\\/2020\\\/06\\\/Ahmad-Awais-face.jpg\",\"contentUrl\":\"https:\\\/\\\/ahmadawais.com\\\/wp-content\\\/uploads\\\/2020\\\/06\\\/Ahmad-Awais-face.jpg\",\"width\":2299,\"height\":1705,\"caption\":\"Ahmad Awais\"},\"logo\":{\"@id\":\"https:\\\/\\\/ahmadawais.com\\\/wp-content\\\/uploads\\\/2020\\\/06\\\/Ahmad-Awais-face.jpg\"},\"description\":\"Founder & CEO of \u2318 Command Code coding agent with taste. Founded Langbase.com, AI cloud to build, deploy, and scale AI agents with tools & memory \u00b7 Creator of Command.new. \\\"Awais is an awesome example for developers\\\" \u2014 Satya Nadella, CEO of Microsoft. NASA Mars Ingenuity Helicopter mission code contributor 8th GitHub Stars Award recipient with 5x GitHub Stars Award (Listed as GitHub's #1 JavaScript trending developer). Google Developers Expert Web DevRel. Ex VP Eng (DevTools & DevRel) Rapid \u00b7 Google Developers Advisory Board (gDAB) founding member \u00b7 AI\\\/ML\\\/DevTools Angel Investor (Replit, Resend, Daytona, Gumroad and you?) \u276f AI\\\/ML Advisory Board San Francisco, DevNetwork. Award-winning Open Source Engineering leader authored hundreds of open-source dev-tools and software libraries used by millions of developers, including Shades of Purple code theme and corona-cli. Linux Foundation (Node.js Committee Lead), OpenAPI Business Governing Board. Taught 108K+ developers via NodeCLI.com and VSCode.pro course. 274 million views, blogging for 24 yrs. \u276f Read more about Ahmad Awais or come say hi on \ud835\udd4f @MrAhmadAwais.\",\"sameAs\":[\"https:\\\/\\\/AhmadAwais.com\\\/\",\"https:\\\/\\\/facebook.com\\\/AhmadAwais\",\"https:\\\/\\\/instagram.com\\\/MrAhmadAwais\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/MrAhmadAwais\\\/\",\"https:\\\/\\\/x.com\\\/MrAhmadAwais\",\"https:\\\/\\\/youtube.com\\\/AhmadAwais\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Supabase with Next.js App Router Fix for Invariant: cookies() expects to have requestAsyncStorage, none available","description":"Next.js App router is pretty awesome. Sadly, it's super new. The errors you face are sometimes hard to debug as you can't see where it's coming from and","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ahmadawais.com\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\/","og_locale":"en_US","og_type":"article","og_title":"Supabase with Next.js App Router Fix for Invariant: cookies() expects to have requestAsyncStorage, none available","og_description":"Next.js App router is pretty awesome. Sadly, it's super new. The errors you face are sometimes hard to debug as you can't see where it's coming from and","og_url":"https:\/\/ahmadawais.com\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\/","og_site_name":"Ahmad Awais","article_publisher":"https:\/\/facebook.com\/AhmadAwais","article_author":"https:\/\/facebook.com\/AhmadAwais","article_published_time":"2023-10-13T18:10:56+00:00","article_modified_time":"2023-10-13T18:11:36+00:00","og_image":[{"width":2560,"height":1440,"url":"https:\/\/ahmadawais.com\/wp-content\/uploads\/2024\/08\/ahmad-awais.jpg","type":"image\/jpeg"}],"author":"Ahmad Awais","twitter_card":"summary_large_image","twitter_creator":"@MrAhmadAwais","twitter_site":"@MrAhmadAwais","twitter_misc":{"Written by":"Ahmad Awais","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ahmadawais.com\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\/#article","isPartOf":{"@id":"https:\/\/ahmadawais.com\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\/"},"author":{"name":"Ahmad Awais","@id":"https:\/\/ahmadawais.com\/#\/schema\/person\/1d1b9504182dca2315cf039fb4ebb85b"},"headline":"Supabase with Next.js App Router Fix for Invariant: cookies() expects to have requestAsyncStorage, none available","datePublished":"2023-10-13T18:10:56+00:00","dateModified":"2023-10-13T18:11:36+00:00","mainEntityOfPage":{"@id":"https:\/\/ahmadawais.com\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\/"},"wordCount":304,"commentCount":0,"publisher":{"@id":"https:\/\/ahmadawais.com\/#\/schema\/person\/1d1b9504182dca2315cf039fb4ebb85b"},"keywords":["Next.js","Supabase"],"articleSection":["Web"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/ahmadawais.com\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/ahmadawais.com\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\/","url":"https:\/\/ahmadawais.com\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\/","name":"Supabase with Next.js App Router Fix for Invariant: cookies() expects to have requestAsyncStorage, none available","isPartOf":{"@id":"https:\/\/ahmadawais.com\/#website"},"datePublished":"2023-10-13T18:10:56+00:00","dateModified":"2023-10-13T18:11:36+00:00","description":"Next.js App router is pretty awesome. Sadly, it's super new. The errors you face are sometimes hard to debug as you can't see where it's coming from and","breadcrumb":{"@id":"https:\/\/ahmadawais.com\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ahmadawais.com\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/ahmadawais.com\/supabase-with-next-js-app-router-fix-for-invariant-cookies-expects-to-have-requestasyncstorage-none-available\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ahmadawais.com\/"},{"@type":"ListItem","position":2,"name":"Supabase with Next.js App Router Fix for Invariant: cookies() expects to have requestAsyncStorage, none available"}]},{"@type":"WebSite","@id":"https:\/\/ahmadawais.com\/#website","url":"https:\/\/ahmadawais.com\/","name":"Ahmad Awais","description":"Founder &amp; CEO of CommandCode.ai f\/k\/a Langbase | Google Developers Advisory Board (gDAB) founding member","publisher":{"@id":"https:\/\/ahmadawais.com\/#\/schema\/person\/1d1b9504182dca2315cf039fb4ebb85b"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ahmadawais.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/ahmadawais.com\/#\/schema\/person\/1d1b9504182dca2315cf039fb4ebb85b","name":"Ahmad Awais","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ahmadawais.com\/wp-content\/uploads\/2020\/06\/Ahmad-Awais-face.jpg","url":"https:\/\/ahmadawais.com\/wp-content\/uploads\/2020\/06\/Ahmad-Awais-face.jpg","contentUrl":"https:\/\/ahmadawais.com\/wp-content\/uploads\/2020\/06\/Ahmad-Awais-face.jpg","width":2299,"height":1705,"caption":"Ahmad Awais"},"logo":{"@id":"https:\/\/ahmadawais.com\/wp-content\/uploads\/2020\/06\/Ahmad-Awais-face.jpg"},"description":"Founder & CEO of \u2318 Command Code coding agent with taste. Founded Langbase.com, AI cloud to build, deploy, and scale AI agents with tools & memory \u00b7 Creator of Command.new. \"Awais is an awesome example for developers\" \u2014 Satya Nadella, CEO of Microsoft. NASA Mars Ingenuity Helicopter mission code contributor 8th GitHub Stars Award recipient with 5x GitHub Stars Award (Listed as GitHub's #1 JavaScript trending developer). Google Developers Expert Web DevRel. Ex VP Eng (DevTools & DevRel) Rapid \u00b7 Google Developers Advisory Board (gDAB) founding member \u00b7 AI\/ML\/DevTools Angel Investor (Replit, Resend, Daytona, Gumroad and you?) \u276f AI\/ML Advisory Board San Francisco, DevNetwork. Award-winning Open Source Engineering leader authored hundreds of open-source dev-tools and software libraries used by millions of developers, including Shades of Purple code theme and corona-cli. Linux Foundation (Node.js Committee Lead), OpenAPI Business Governing Board. Taught 108K+ developers via NodeCLI.com and VSCode.pro course. 274 million views, blogging for 24 yrs. \u276f Read more about Ahmad Awais or come say hi on \ud835\udd4f @MrAhmadAwais.","sameAs":["https:\/\/AhmadAwais.com\/","https:\/\/facebook.com\/AhmadAwais","https:\/\/instagram.com\/MrAhmadAwais\/","https:\/\/www.linkedin.com\/in\/MrAhmadAwais\/","https:\/\/x.com\/MrAhmadAwais","https:\/\/youtube.com\/AhmadAwais"]}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ahmadawais.com\/api\/wp\/v2\/posts\/8000","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ahmadawais.com\/api\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ahmadawais.com\/api\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ahmadawais.com\/api\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/ahmadawais.com\/api\/wp\/v2\/comments?post=8000"}],"version-history":[{"count":1,"href":"https:\/\/ahmadawais.com\/api\/wp\/v2\/posts\/8000\/revisions"}],"predecessor-version":[{"id":8001,"href":"https:\/\/ahmadawais.com\/api\/wp\/v2\/posts\/8000\/revisions\/8001"}],"wp:attachment":[{"href":"https:\/\/ahmadawais.com\/api\/wp\/v2\/media?parent=8000"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ahmadawais.com\/api\/wp\/v2\/categories?post=8000"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ahmadawais.com\/api\/wp\/v2\/tags?post=8000"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}