<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Jamie Barton</title>
    <description>The latest articles on Forem by Jamie Barton (@notrab).</description>
    <link>https://forem.com/notrab</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3168%2F6603e950-d3bc-417c-84c2-1e1718961c6e.png</url>
      <title>Forem: Jamie Barton</title>
      <link>https://forem.com/notrab</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/notrab"/>
    <language>en</language>
    <item>
      <title>Top 5 tools every frontend developer should be using with GraphQL in 2023</title>
      <dc:creator>Jamie Barton</dc:creator>
      <pubDate>Wed, 31 May 2023 08:33:01 +0000</pubDate>
      <link>https://forem.com/grafbase/top-5-tools-every-frontend-developer-should-be-using-with-graphql-in-2023-5gj3</link>
      <guid>https://forem.com/grafbase/top-5-tools-every-frontend-developer-should-be-using-with-graphql-in-2023-5gj3</guid>
      <description>&lt;p&gt;Every week, a bunch of fresh tools, services, and libraries make their debut, claiming to take the GraphQL developer experience to the next level.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/AV4Amf3Mag0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Here are my top 5 tools every frontend developer should be using with GraphQL in 2023:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Grafbase OpenAPI Connector
&lt;/h2&gt;

&lt;p&gt;Maximize the power of web and mobile app development by effortlessly blending REST and GraphQL APIs with Grafbase. Say goodbye to complexity and hello to a unified GraphQL API that supercharges your app development process.&lt;/p&gt;

&lt;p&gt;Enter &lt;a href="https://en.wikipedia.org/wiki/OpenAPI_Specification" rel="noopener noreferrer"&gt;OpenAPI&lt;/a&gt;, formerly known as Swagger - the ultimate game-changer for API definition and documentation. It simplifies things by describing APIs in a format that machines understand, making it easier for developers to work with all kinds of APIs. And with &lt;a href="https://grafbase.com/edge-gateway" rel="noopener noreferrer"&gt;Grafbase Edge Gateway&lt;/a&gt;, you can seamlessly merge OpenAPI-driven REST APIs and transform them into GraphQL, taking your stack to a whole new level of awesomeness.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;extend&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;schema&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;openapi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="n"&gt;Stripe&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="n"&gt;githubusercontent&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="n"&gt;stripe&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="n"&gt;openapi&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="n"&gt;openapi&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spec3&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="n"&gt;Authorization&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="n"&gt;Bearer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="n"&gt;STRIPE_API_KEY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;}}"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's free to get started and you don't even need an account to build locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx grafbase init &lt;span class="nt"&gt;--template&lt;/span&gt; openapi-stripe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. GraphQL Code Generator — Client Preset
&lt;/h2&gt;

&lt;p&gt;The type system in GraphQL is a major game-changer. We can leverage the GraphQL Code Generator to use that same type system to generate TypeScript types so we can build better frontends without error.&lt;/p&gt;

&lt;p&gt;In the past, we relied on the GraphQL Code Generator to generate hooks for our existing GraphQL clients. But it was a pain when we wanted to switch to new clients.&lt;/p&gt;

&lt;p&gt;The GraphQL Code Generator recommends using the &lt;a href="https://the-guild.dev/graphql/codegen/plugins/presets/preset-client" rel="noopener noreferrer"&gt;&lt;code&gt;client-preset&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://the-guild.dev/graphql/codegen/plugins/typescript/typed-document-node" rel="noopener noreferrer"&gt;&lt;code&gt;TypedDocumentNode&lt;/code&gt;&lt;/a&gt; to level up our functions and make sure we're getting the correct operation and variable types.&lt;/p&gt;

&lt;p&gt;Plus, it's all about keeping operations and fragments in their own components. This approach reduces code complexity, keeps things tidy, and makes it a breeze to switch to any GraphQL client that supports &lt;code&gt;TypedDocumentNode&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;LessonFragment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;graphql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/* GraphQL */&lt;/span&gt; &lt;span class="s2"&gt;`
  fragment LessonItem on Lesson {
    title
  }
`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Lesson&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;lesson&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FragmentType&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;LessonFragment&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lesson&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useFragment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;LessonFragment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lesson&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;// Fully typed!&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;lesson&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. GQty
&lt;/h2&gt;

&lt;p&gt;Are you tired of the hassle of writing GraphQL operations and configuring codegen for TypeScript? Say goodbye to all that and switch to &lt;a href="https://gqty.dev/" rel="noopener noreferrer"&gt;GQty&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;With GQty, you don't even need a separate GraphQL client. It's like magic! GQty takes care of transforming your code into a GraphQL operation behind the scenes. So sit back, relax, and let GQty handle all the heavy lifting for you.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;FunctionComponent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useQuery&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../gqty/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FunctionComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;me&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;friends&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useQuery&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      Hello &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;!
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ol&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;friends&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ol&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Query&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. GraphQL Network Inspector
&lt;/h2&gt;

&lt;p&gt;The days of struggling to identify &lt;code&gt;/graphql&lt;/code&gt; requests in the Network Inspector are over!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/warrenday/graphql-network-inspector" rel="noopener noreferrer"&gt;GraphQL Network Inspector&lt;/a&gt;, an awesome extension for developer tools that makes debugging a breeze. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4fkyrn7rqj9f5sji90j1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4fkyrn7rqj9f5sji90j1.png" alt="GraphQL Network Inspector" width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It categorizes requests into queries, mutations, and subscriptions and even uses the GraphQL operation name. Say goodbye to confusion and hello to simplified debugging.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. GraphMan
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Escape-Technologies/graphman" rel="noopener noreferrer"&gt;GraphMan&lt;/a&gt; takes away all the boring and time-consuming aspects of crafting queries and mutations for a GraphQL API. &lt;/p&gt;

&lt;p&gt;With GraphMan, you can effortlessly generate a comprehensive collection from a single GraphQL endpoint. Each collection includes requests for every query and mutation, all conveniently pre-filled variables.&lt;/p&gt;

&lt;p&gt;To create a collection, just pass your Grafbase API URL to the command below. It's that easy!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;deno run https://deno.land/x/graphman@v1.2.1/src/cli.ts GRAFBASE_API_URL_HERE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
   Join us at GraphQL Conf
&lt;/h2&gt;

&lt;p&gt;Do you want to learn more about GraphQL? Join us at GraphQL Conf this year. &lt;a href="https://graphql.org/conf/" rel="noopener noreferrer"&gt;Get your tickets now&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>graphql</category>
      <category>tooling</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Grafbase Public Beta</title>
      <dc:creator>Jamie Barton</dc:creator>
      <pubDate>Mon, 24 Apr 2023 08:44:38 +0000</pubDate>
      <link>https://forem.com/grafbase/grafbase-public-beta-2bi0</link>
      <guid>https://forem.com/grafbase/grafbase-public-beta-2bi0</guid>
      <description>&lt;p&gt;Grafbase is now in Public Beta!&lt;/p&gt;

&lt;p&gt;Since launching the &lt;a href="https://grafbase.com/blog/announcing-grafbase" rel="noopener noreferrer"&gt;Private Beta&lt;/a&gt; in July 2022, thousands of early adopters have joined our growing community to help shape and improve the Grafbase platform.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1650416869927534592-845" src="https://platform.twitter.com/embed/Tweet.html?id=1650416869927534592"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1650416869927534592-845');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1650416869927534592&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;The core feature of the Grafbase platform is the &lt;a href="https://grafbase.com/edge-gateway" rel="noopener noreferrer"&gt;Edge Gateway&lt;/a&gt;, a programmable realtime GraphQL API deployed to the edge.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>api</category>
      <category>graphql</category>
    </item>
    <item>
      <title>Grafbase January 2023 Update</title>
      <dc:creator>Jamie Barton</dc:creator>
      <pubDate>Thu, 02 Feb 2023 14:06:25 +0000</pubDate>
      <link>https://forem.com/grafbase/grafbase-january-2023-update-58g4</link>
      <guid>https://forem.com/grafbase/grafbase-january-2023-update-58g4</guid>
      <description>&lt;p&gt;Hey &lt;strong&gt;Dev.to&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;We are thrilled to share with you all of the latest product updates, resources, and a preview of what we’re working on next. &lt;/p&gt;

&lt;p&gt;Let’s get right to it…&lt;/p&gt;

&lt;h3&gt;
  
  
  Product Updates
&lt;/h3&gt;

&lt;p&gt;January has been an exciting month packed with lots of feature updates. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://grafbase.com/blog/simplify-building-realtime-applications-with-graphql-live-queries" rel="noopener noreferrer"&gt;Live Queries&lt;/a&gt;&lt;/strong&gt;
Grafbase becomes the first hosted GraphQL platform to provide Live Queries. GraphQL Live Queries enable developers to build and deploy realtime apps with ease.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://grafbase.com/roadmap" rel="noopener noreferrer"&gt;Product Roadmap&lt;/a&gt;&lt;/strong&gt;
Since launching the private beta last year, users have been asking about the future of Grafbase product roadmap. We’re super excited to share the public roadmap that you can follow, and even upvote features to be worked on first!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://grafbase.com/examples" rel="noopener noreferrer"&gt;Examples Directory&lt;/a&gt;&lt;/strong&gt;
With new examples being created every week we have made it even easier to find the example you’re looking for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://grafbase.com/guides" rel="noopener noreferrer"&gt;Guides Directory&lt;/a&gt;&lt;/strong&gt;
Learn how to build the next generation of web and mobile apps with new guides added every week!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can see what’s new even quicker by following us on &lt;a href="https://twitter.com/grafbase" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;, browsing the &lt;a href="https://grafbase.com/changelog" rel="noopener noreferrer"&gt;changelog&lt;/a&gt;, or joining our &lt;a href="https://discord.com/invite/grafbase" rel="noopener noreferrer"&gt;Discord server&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resource Updates
&lt;/h3&gt;

&lt;p&gt;Also in January, there were lots of new documentation, guides, videos, tutorials, and code examples. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.youtube.com/watch?v=YsFwI7H1iWM" rel="noopener noreferrer"&gt;[VIDEO]: Serverless GraphQL API with Grafbase by Simon Grimm&lt;/a&gt;&lt;/strong&gt;
Learn how to build a mobile application from scratch using Ionic with popular YouTuber Simon Grimm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/grafbase/playground/tree/main/packages/grafbase-urql-exchange" rel="noopener noreferrer"&gt;[PLUGIN]: URQL Exchange for Live Queries&lt;/a&gt;&lt;/strong&gt;
To celebrate the launch of Live Queries we made it even easier so developers don’t need to mess around configuring SSE. Install the custom URQL exchange and go!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/grafbase/playground/tree/main/packages/grafbase-apollo-link" rel="noopener noreferrer"&gt;[PLUGIN]: Apollo Link for Live Queries&lt;/a&gt;&lt;/strong&gt;
We also made it easier for developers using Apollo Client to get going with Live Queries. Add the custom Apollo Link by Grafbase and go!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/grafbase/grafbase/tree/main/examples/qwik" rel="noopener noreferrer"&gt;[EXAMPLE]: Qwik + Qwik City&lt;/a&gt;&lt;/strong&gt;
Everyone is talking about how “Qwik” this new framework is so Heather created an example to show how you can fetch data with GraphQL with Qwik City.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://grafbase.com/guides/build-your-own-low-code-graphql-admin-ui-with-retool" rel="noopener noreferrer"&gt;[GUIDE]: Build your own low-code GraphQL Admin UI with Retool&lt;/a&gt;&lt;/strong&gt;
In this guide, Jamie shows how you can build your own Admin UI to manage Grafbase content using Retool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://grafbase.com/guides/working-with-eleventy-and-graphql" rel="noopener noreferrer"&gt;[GUIDE]: Working with Eleventy and GraphQL&lt;/a&gt;&lt;/strong&gt;
In this guide, Jamie shows how you can use the popular Static Site Generator Eleventy with GraphQL to fetch data from Grafbase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://dropjs.com/Building-GraphQL-Backends-with-SDL?notify-me" rel="noopener noreferrer"&gt;[WORKSHOP]: Building GraphQL Backends with SDL&lt;/a&gt;&lt;/strong&gt;
In this weekly JS Drop by This Dot Labs, Jamie releases a video on you build a GraphQL backend with Grafbase using SDL.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What’s next?
&lt;/h3&gt;

&lt;p&gt;We’re working on lots of new features, including a new directive that lets you write your own resolvers, as well as CLI deploys, data explorer, and much more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That’s it for January!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PS. If you like what we’re building we’d love to hear more about what you think. Join us on &lt;a href="https://discord.gg/grafbase" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;, &lt;a href="https://twitter.com/grafbase" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;, &lt;a href="https://youtube.com/@grafbase" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;, and &lt;a href="https://github.com/grafbase" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>backend</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Build realtime GraphQL backends with Grafbase</title>
      <dc:creator>Jamie Barton</dc:creator>
      <pubDate>Mon, 16 Jan 2023 16:01:35 +0000</pubDate>
      <link>https://forem.com/grafbase/build-realtime-graphql-backends-with-grafbase-3bpl</link>
      <guid>https://forem.com/grafbase/build-realtime-graphql-backends-with-grafbase-3bpl</guid>
      <description>&lt;p&gt;There are developers who don't want the hassle of building a backend, managing deployments, configuring continuous integration, juggling connection pooling, and more. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://grafbase.com" rel="noopener noreferrer"&gt;Grafbase&lt;/a&gt; was built to manage all of the above. You get a distributed GraphQL API at the edge by creating a single &lt;code&gt;grafbase/schema.graphql&lt;/code&gt; file in your project.&lt;/p&gt;

&lt;p&gt;Your schema contains models with special directives to relate data, set default values, validation, and more.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="c"&gt;# grafbase/schema.graphql&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In 2021, &lt;a href="https://twitter.com/n1rual" rel="noopener noreferrer"&gt;Laurin Quast&lt;/a&gt; introduced a collection of packages to support the use of GraphQL Live Queries on the server and client.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Today, Grafbase is happy to announce it now supports GraphQL Live Queries!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This means that all you need to do to start using GraphQL Live Queries is add &lt;code&gt;@live&lt;/code&gt; to your query!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;@live&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;postCollection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;@live&lt;/code&gt; directive will observe any changes to the data and send a message using &lt;a href="https://grafbase.com/docs/realtime/live-queries#server-sent-events" rel="noopener noreferrer"&gt;Server-Sent Events&lt;/a&gt; with the patch to update the current query state.&lt;/p&gt;

&lt;p&gt;The event is in the format of &lt;a href="https://grafbase.com/docs/realtime/live-queries#json-patch" rel="noopener noreferrer"&gt;JSON Patch&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"patch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"op"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"add"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/postCollection/edges/3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"post_01GJMDWJ2M6WWTM26S7C1KKYBE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Instant serverless GraphQL backends"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"revision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Together with &lt;a href="https://the-guild.dev/" rel="noopener noreferrer"&gt;The Guild&lt;/a&gt;, Grafbase is also releasing 2 new packages (with more on the way) to further abstract the effort needed to implement Live Queries on the frontend.&lt;/p&gt;

&lt;p&gt;Starting with support for &lt;a href="https://www.apollographql.com/docs/react/" rel="noopener noreferrer"&gt;Apollo Client&lt;/a&gt; and &lt;a href="https://formidable.com/open-source/urql/" rel="noopener noreferrer"&gt;URQL&lt;/a&gt;, you can add Live Queries with the following packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/@grafbase/apollo-link" rel="noopener noreferrer"&gt;&lt;code&gt;@grafbase/apollo-link&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/@grafbase/urql-exchange" rel="noopener noreferrer"&gt;&lt;code&gt;@grafbase/urql-exchange&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/EaMt6ch80WI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/N2dCu02SJoE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Developers not using either of those libraries can still use Live Queries with the native &lt;a href="https://grafbase.com/docs/realtime/live-queries#eventsource" rel="noopener noreferrer"&gt;&lt;code&gt;EventSource&lt;/code&gt;&lt;/a&gt; API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Now!
&lt;/h2&gt;

&lt;p&gt;You can try Live Queries by building your own backend in one simple command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx grafbase init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you've modelled your data using the &lt;a href="https://grafbase.com/docs/schema/overview" rel="noopener noreferrer"&gt;schema&lt;/a&gt; you can run your backend locally to build:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx grafbase dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>graphql</category>
      <category>webdev</category>
      <category>realtime</category>
      <category>database</category>
    </item>
    <item>
      <title>This Week @ Grafbase - Dec 9</title>
      <dc:creator>Jamie Barton</dc:creator>
      <pubDate>Fri, 09 Dec 2022 13:18:26 +0000</pubDate>
      <link>https://forem.com/grafbase/this-week-grafbase-dec-9-54jc</link>
      <guid>https://forem.com/grafbase/this-week-grafbase-dec-9-54jc</guid>
      <description>&lt;p&gt;Happy Friday 🥳&lt;/p&gt;

&lt;p&gt;It’s been a few weeks since our last update about what’s going on at &lt;a href="https://grafbase.com" rel="noopener noreferrer"&gt;Grafbase&lt;/a&gt;, and for good reason...&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s new?
&lt;/h2&gt;

&lt;p&gt;🎮 &lt;strong&gt;Dashboard tweaks&lt;/strong&gt;&lt;br&gt;
We’ve made some significant changes to our Dashboard UI. You should start to see updates rolling out every few days.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Finbsoafrs23samluwu2h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Finbsoafrs23samluwu2h.png" alt="Grafbase Project Card" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;Bulk Environment Variables&lt;/strong&gt;&lt;br&gt;
We've made it even easier to add environment variables. Check it out! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyhunzrry29kxno1wb1b8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyhunzrry29kxno1wb1b8.png" alt="Environment variables UI" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🛰️ &lt;strong&gt;GraphQL Galaxy&lt;/strong&gt;&lt;br&gt;
Grafbase Founder &amp;amp; CEO Fredrik Björk spoke at GraphQL Galaxy with other industry experts on the future of server-side GraphQL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe00q64jri43lk50c3nam.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe00q64jri43lk50c3nam.jpeg" alt="GraphQL Galaxy Panel" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📢 &lt;strong&gt;Base64 cursors&lt;/strong&gt;&lt;br&gt;
Collection queries returning edges will now return a base64 encoded &lt;code&gt;cursor&lt;/code&gt; value you can use with the &lt;code&gt;before&lt;/code&gt;/&lt;code&gt;after&lt;/code&gt; pagination arguments. &lt;a href="https://grafbase.com/docs/reference/pagination" rel="noopener noreferrer"&gt;Learn more about pagination&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;🧰 &lt;strong&gt;New home for examples&lt;/strong&gt;&lt;br&gt;
There's a &lt;a href="https://github.com/grafbase/examples/" rel="noopener noreferrer"&gt;new GitHub repo&lt;/a&gt; for all examples! Go check it out.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s next?
&lt;/h2&gt;

&lt;p&gt;⚡️ &lt;strong&gt;Live Queries&lt;/strong&gt;&lt;br&gt;
We’re putting the final touches on our realtime GraphQL support. Next week we will introduce this officially. For those keen enough, you can try it out today if you dig around the documentation 😉.&lt;/p&gt;

&lt;p&gt;🔢 &lt;strong&gt;Improved numeric operations&lt;/strong&gt;&lt;br&gt;
We’ve made it easier to increment and decrement numeric fields. This change is live in production now but coming to CLI support next week with an official changelog.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GraphQL Galaxy Workshop&lt;/strong&gt;&lt;br&gt;
In this workshop, we'll cover the basics of GraphQL, and then use that knowledge to build a backend using SDL. Once we've created our schema, we'll run it locally, deploy to production, and create deployment branches for any changes to our schema. We'll finish the workshop by fetching data from our backend from the frontend, as well as adding authentication to lock down data access!&lt;br&gt;
&lt;a href="https://graphqlgalaxy.com/workshops-3h" rel="noopener noreferrer"&gt;https://graphqlgalaxy.com/workshops-3h&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next week we will introduce some significant changes, including Live Queries, Numeric operations, Improved Documentation, and lots more!&lt;/p&gt;




&lt;p&gt;We love to hear from our users what we can be doing better. No matter how small you might think it is, we want to hear from you!&lt;/p&gt;

&lt;p&gt;Make sure to click &lt;strong&gt;Feedback&lt;/strong&gt; once logged in and share your thoughts. &lt;strong&gt;We read them all!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy02jeblz7znfkvm3qx81.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy02jeblz7znfkvm3qx81.png" alt="Feedback form" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have a great weekend! 💚&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>api</category>
    </item>
    <item>
      <title>This Week @ Grafbase - Nov 25</title>
      <dc:creator>Jamie Barton</dc:creator>
      <pubDate>Fri, 25 Nov 2022 10:51:57 +0000</pubDate>
      <link>https://forem.com/grafbase/this-week-grafbase-nov-25-149i</link>
      <guid>https://forem.com/grafbase/this-week-grafbase-nov-25-149i</guid>
      <description>&lt;p&gt;Happy Friday 🥳&lt;/p&gt;

&lt;p&gt;These posts provide a summary of everything we've been working on this week at Grafbase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's new?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔑 &lt;strong&gt;JWT Provider&lt;/strong&gt;&lt;br&gt;
Today we announced the release of a new auth provider strategy that lets you set a &lt;code&gt;secret&lt;/code&gt; to verify JWTs as part of your authorisation strategy.&lt;br&gt;
&lt;a href="https://grafbase.com/changelog/jwt-authorization-provider-added" rel="noopener noreferrer"&gt;https://grafbase.com/changelog/jwt-authorization-provider-added&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfxky5va3lmdcs8s8s08.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfxky5va3lmdcs8s8s08.png" alt="JWT Provider" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚒️ &lt;strong&gt;New examples!&lt;/strong&gt;&lt;br&gt;
We've 3 new examples - &lt;a href="https://github.com/grafbase/grafbase/tree/main/examples/fresh" rel="noopener noreferrer"&gt;Fresh&lt;/a&gt;, &lt;a href="https://github.com/grafbase/grafbase/tree/main/examples/solid-start" rel="noopener noreferrer"&gt;SolidStart&lt;/a&gt;, and &lt;a href="https://github.com/grafbase/grafbase/tree/main/examples/nextauthjs-credentials" rel="noopener noreferrer"&gt;NextAuth.js Credentials&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;📚 &lt;strong&gt;New guides!&lt;/strong&gt;&lt;br&gt;
We have got some new guides! &lt;a href="https://grafbase.com/guides/working-with-typescript-and-apollo-client" rel="noopener noreferrer"&gt;Working with TypeScript, React, and Apollo Client&lt;/a&gt;, &lt;a href="https://grafbase.com/guides/username-and-password-authentication-with-next-auth" rel="noopener noreferrer"&gt;Username and Password authentication with NextAuth.js&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;💚 &lt;strong&gt;NuxtNation&lt;/strong&gt;&lt;br&gt;
The NuxtNation conference was last week and you can replay &lt;br&gt;
&lt;a href="https://vi.to/hubs/nuxtnation" rel="noopener noreferrer"&gt;https://vi.to/hubs/nuxtnation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We also have a small competition for those who joined NuxtNation. So make sure to checkout the swag link in the email if you attended.&lt;/p&gt;

&lt;p&gt;🔥 &lt;strong&gt;Cloudflare&lt;/strong&gt;&lt;br&gt;
We’re excited to continue building Grafbase for scale with Workers by joining the Cloudflare Workers Launchpad!&lt;br&gt;
&lt;a href="https://blog.cloudflare.com/launchpad-fall-22/" rel="noopener noreferrer"&gt;https://blog.cloudflare.com/launchpad-fall-22/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3hqzxwtburvk74wz9ui4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3hqzxwtburvk74wz9ui4.png" alt="Cloudflare Workers Launchpad cohort" width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's next?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;⚡️ &lt;strong&gt;Live Queries&lt;/strong&gt;&lt;br&gt;
General availability for Live Queries is coming very soon! If you'd like early access, please let us know.&lt;/p&gt;

&lt;p&gt;🏎️ &lt;strong&gt;Performance&lt;/strong&gt;&lt;br&gt;
We're working on improving the already fast deployment, and API response times.&lt;/p&gt;

&lt;p&gt;🎮 &lt;strong&gt;Dashboard Updates&lt;/strong&gt;&lt;br&gt;
You should start to see some improvements to the Dashboard soon.&lt;/p&gt;

&lt;p&gt;Stay tuned 👀&lt;/p&gt;

&lt;p&gt;Have a great weekend! 👋&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>api</category>
    </item>
    <item>
      <title>This Week @ Grafbase - Nov 11</title>
      <dc:creator>Jamie Barton</dc:creator>
      <pubDate>Fri, 11 Nov 2022 16:54:07 +0000</pubDate>
      <link>https://forem.com/grafbase/this-week-grafbase-nov-11-45h6</link>
      <guid>https://forem.com/grafbase/this-week-grafbase-nov-11-45h6</guid>
      <description>&lt;p&gt;Happy Friday 🥳&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This Week @ Grafbase&lt;/strong&gt; has been all about product, conferences, and realtime!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's new?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdhwd23qvuvq4d1q9tqvx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdhwd23qvuvq4d1q9tqvx.png" alt="Grafbase.com" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💅 &lt;strong&gt;New homepage!!&lt;/strong&gt;&lt;br&gt;
We wanted to share with everyone what we're building. The homepage shares more about we've created already as well as what's coming next. Check it out and let us know of any feedback.&lt;br&gt;
&lt;a href="https://grafbase.com" rel="noopener noreferrer"&gt;https://grafbase.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📆 &lt;strong&gt;Date scalar added&lt;/strong&gt;&lt;br&gt;
You can now use the &lt;code&gt;Date&lt;/code&gt; scalar for fields in your models.&lt;br&gt;
&lt;a href="https://grafbase.com/changelog/date-scalar-added" rel="noopener noreferrer"&gt;https://grafbase.com/changelog/date-scalar-added&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔢 &lt;strong&gt;&lt;code&gt;@length&lt;/code&gt; directive added&lt;/strong&gt;&lt;br&gt;
You can now set min and max values for the length of a field value or list.&lt;br&gt;
&lt;a href="https://grafbase.com/changelog/length-directive-added" rel="noopener noreferrer"&gt;https://grafbase.com/changelog/length-directive-added&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔐 &lt;strong&gt;Model-level authorization rules&lt;/strong&gt;&lt;br&gt;
You can now override the global &lt;code&gt;@auth&lt;/code&gt; rules for each &lt;code&gt;@model&lt;/code&gt; in your schema.&lt;br&gt;
&lt;a href="https://grafbase.com/docs/reference/directives#model-level-authorization-rules" rel="noopener noreferrer"&gt;https://grafbase.com/docs/reference/directives#model-level-authorization-rules&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🗝️ &lt;strong&gt;Auth groups claim configuration&lt;/strong&gt;&lt;br&gt;
You can now set the &lt;code&gt;groupsClaim&lt;/code&gt; for group-based auth to use a custom claim different from the default groups claim.&lt;br&gt;
&lt;a href="https://grafbase.com/docs/reference/directives#operations" rel="noopener noreferrer"&gt;https://grafbase.com/docs/reference/directives#operations&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌉 &lt;strong&gt;Jamstack Conf&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This week was all about Jamstack Conf! It was a blast to meet the community and see people IRL once again!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq0lzahet9qcpdhboyl3v.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq0lzahet9qcpdhboyl3v.jpeg" alt="Jamie and Colby" width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Be sure to check &lt;a href="https://jamstack.org/conf/" rel="noopener noreferrer"&gt;jamstack.org/conf&lt;/a&gt; to watch all of the the talks when they're published!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s next?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;💚 NuxtNation is happening!&lt;br&gt;
This event happens November 16 &amp;amp; 17, online!&lt;br&gt;
&lt;a href="https://nuxtnation.com/" rel="noopener noreferrer"&gt;https://nuxtnation.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💗 We’re close to releasing the initial version of &lt;code&gt;@live&lt;/code&gt; queries! We should have something to show you very, very soon!&lt;br&gt;
&lt;a href="https://grafbase.com/changelog" rel="noopener noreferrer"&gt;Subscribe to the changelog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More exciting updates coming next week!&lt;/p&gt;

&lt;p&gt;Have a great weekend 👋&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>webdev</category>
      <category>news</category>
      <category>javascript</category>
    </item>
    <item>
      <title>This Week @ Grafbase - Nov 4</title>
      <dc:creator>Jamie Barton</dc:creator>
      <pubDate>Fri, 04 Nov 2022 10:10:00 +0000</pubDate>
      <link>https://forem.com/grafbase/this-week-grafbase-1nkp</link>
      <guid>https://forem.com/grafbase/this-week-grafbase-1nkp</guid>
      <description>&lt;p&gt;Happy Friday 🥳&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This Week @ Grafbase&lt;/strong&gt; has been all about product and documentation!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's new?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;Docs Quickstart&lt;/strong&gt;&lt;br&gt;
There is now a Quickstart that you can follow to get up to speed with Grafbase in a few short steps.&lt;br&gt;
&lt;a href="https://grafbase.com/docs/quickstart/get-started"&gt;https://grafbase.com/docs/quickstart/get-started&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔍 &lt;strong&gt;Update and Delete by unique fields&lt;/strong&gt;&lt;br&gt;
You can now update and delete data by &lt;code&gt;id&lt;/code&gt; and any &lt;code&gt;@unique&lt;/code&gt; field.&lt;br&gt;
&lt;a href="https://grafbase.com/changelog/update-and-delete-by-unique"&gt;https://grafbase.com/changelog/update-and-delete-by-unique&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/laY8fQUTVi4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;▲ &lt;strong&gt;Next.js conf&lt;/strong&gt;&lt;br&gt;
We recently sponsored Next.js conf and have a free workshop you can join happening later this month — &lt;a href="https://docs.google.com/forms/d/e/1FAIpQLScv01U8yk8H_xYfc12IF8fiOt9hFcaQmI2kaqIAa_eSEowzHw/viewform"&gt;more info&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📈 &lt;strong&gt;Funding announcement&lt;/strong&gt;&lt;br&gt;
You may have already seen but we announced a $7.3m raise to build the data platform of the future.&lt;br&gt;
&lt;a href="https://grafbase.com/blog/announcing-7-3m-funding"&gt;https://grafbase.com/blog/announcing-7-3m-funding&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's next?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🫐 We're attending and sponsoring &lt;a href="https://jamstack.org/conf/"&gt;Jamstack Conf&lt;/a&gt;. There's still tickets available for any last minute attendees. Get 40% off your ticket with code: &lt;code&gt;GRAFBASE40&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://jamstack.org/conf"&gt;https://jamstack.org/conf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💚 We're also sponsoring Nuxt Nation! This event happens November 16 &amp;amp; 17, online!&lt;br&gt;
&lt;a href="https://nuxtnation.com/"&gt;https://nuxtnation.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔓 We're working on more Data Validation topics and investigating how to properly implement migrations, resolvers, and more. &lt;a href="https://discord.gg/grafbase"&gt;Join the community on Discord&lt;/a&gt; to have your say on how we should build the data platform for the future!&lt;/p&gt;

&lt;p&gt;More exciting updates coming next week!&lt;/p&gt;

&lt;p&gt;Have a great weekend 👋&lt;/p&gt;

</description>
      <category>grafbase</category>
      <category>graphql</category>
      <category>news</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Working with HTTPie and GraphQL</title>
      <dc:creator>Jamie Barton</dc:creator>
      <pubDate>Tue, 30 Aug 2022 16:27:05 +0000</pubDate>
      <link>https://forem.com/notrab/working-with-httpie-and-graphql-b25</link>
      <guid>https://forem.com/notrab/working-with-httpie-and-graphql-b25</guid>
      <description>&lt;p&gt;HTTPie just announced &lt;a href="https://httpie.io/blog/changelog-0018" rel="noopener noreferrer"&gt;support for GraphQL&lt;/a&gt;! This is huge.&lt;/p&gt;

&lt;p&gt;I've been using HTTPie via the Terminal for years, but the latest support for GraphQL inside their &lt;a href="https://httpie.io/app" rel="noopener noreferrer"&gt;Web &amp;amp; Desktop client&lt;/a&gt; is a great addition.&lt;/p&gt;

&lt;p&gt;You'll want to first enter the URL for your GraphQL API (in this case I'm using &lt;code&gt;https://api.cartql.com&lt;/code&gt;, and then select from the list &lt;code&gt;GraphQL&lt;/code&gt; in the bottom left:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhv33t5oclklq9323tf2o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhv33t5oclklq9323tf2o.png" alt="HTTPie GraphQ" width="800" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Right now there's no support for fetching the schema. This means when you're writing queries, or mutations you'll not get too much help on the available fields (or variables):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj8peg4hcv89ca5pt94dy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj8peg4hcv89ca5pt94dy.png" alt="GraphQL query" width="800" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you're ready to go you can click &lt;strong&gt;Send&lt;/strong&gt;! The response, as well as the response headers, status code, and timings will be shown:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq2tmqw87s98q3kc99vto.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq2tmqw87s98q3kc99vto.png" alt="GraphQL response" width="800" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HTTPie also makes it really easy to add your GraphQL requests to collections, and save for later!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshda3syim9bi3uq3dhc7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshda3syim9bi3uq3dhc7.png" alt=" " width="800" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the schema support lands this could be my new favourite for working with GraphQL.&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>httpie</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Instant serverless GraphQL backends with Grafbase</title>
      <dc:creator>Jamie Barton</dc:creator>
      <pubDate>Fri, 26 Aug 2022 14:19:12 +0000</pubDate>
      <link>https://forem.com/notrab/instant-serverless-graphql-backends-with-grafbase-5g4o</link>
      <guid>https://forem.com/notrab/instant-serverless-graphql-backends-with-grafbase-5g4o</guid>
      <description>&lt;p&gt;Building GraphQL backends has always involved a considerable amount of wiring together a bunch of dependencies. It doesn’t matter if you’re solving the &lt;code&gt;n+1&lt;/code&gt; problem with DataLoader, or subscribing to data changes with GraphQL Subscriptions, it’s been a challenge for many years to get it right.&lt;/p&gt;

&lt;p&gt;Libraries and frameworks like Yoga, Strawberry, Apollo, and many more have given us some great foundations.&lt;/p&gt;

&lt;p&gt;As a developer I’ve loved learning from the open source community by exploring how others do it on GitHub, and then applying that knowledge to my own projects. Most importantly, I’ve always learned from my mistakes which have gone on to help me build better servers.&lt;/p&gt;

&lt;p&gt;But, there comes a time where building your own backend gets increasingly difficult. I often find myself at some point asking;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How do I manage CI/CD?&lt;/li&gt;
&lt;li&gt;How do I handle caching?&lt;/li&gt;
&lt;li&gt;How do I see what schema changes are breaking?&lt;/li&gt;
&lt;li&gt;How do I check this works in production, without pushing to production?&lt;/li&gt;
&lt;li&gt;Where do I host this?&lt;/li&gt;
&lt;li&gt;Is my database in the same location as my API?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For many years I’ve used Heroku Pipelines, and where possible used AWS to host my serverless GraphQL. But all of that required setup, configuration, and things I had to invest time to manage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Today I’d like to walkthrough creating a serverless GraphQL backend with &lt;a href="https://grafbase.com/" rel="noopener noreferrer"&gt;Grafbase&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx3nftwwy2gow29bwzel0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx3nftwwy2gow29bwzel0.jpg" alt="Grafbase" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://grafbase.com/" rel="noopener noreferrer"&gt;Grafbase&lt;/a&gt; provides a seamless developer experience for building backends. Your backend is deployed to the edge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;Inside a new or existing project directory, run &lt;code&gt;npx grafbase init&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then add to &lt;code&gt;grafbase/schema.graphql&lt;/code&gt; a schema for a new &lt;code&gt;Todo&lt;/code&gt; model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Todo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Now you’re done!&lt;/strong&gt; That’s all you need to build instant GraphQL backends.&lt;/p&gt;

&lt;p&gt;To run the backend locally, run &lt;code&gt;npx grafbase dev&lt;/code&gt;. Now head to &lt;code&gt;[http://localhost:4000](http://localhost:4000)&lt;/code&gt; to try it out.&lt;/p&gt;

&lt;p&gt;From there you can use GraphQL in the way you’re used to!&lt;/p&gt;

&lt;p&gt;Let’s create a new &lt;code&gt;Todo&lt;/code&gt; using the &lt;code&gt;todoCreate&lt;/code&gt; mutation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;mutation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;todoCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hello Dev.to!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;todo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;complete&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it!&lt;/p&gt;

&lt;p&gt;I’ve gone ahead and made a simple cheatsheet to share with your friends and colleagues:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuo67qrvf8b163kmxyvb1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuo67qrvf8b163kmxyvb1.png" alt="Grafbase CLI Cheatsheet" width="800" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy to production with GitHub
&lt;/h2&gt;

&lt;p&gt;Running Grafbase locally is great, but what about when you want to deploy to production?&lt;/p&gt;

&lt;p&gt;You’ll want to make sure you have an account with &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, and &lt;a href="https://grafbase.com/join-the-waitlist" rel="noopener noreferrer"&gt;Grafbase&lt;/a&gt;. Grafbase is currently in private beta, but you can request access to join from the homepage.&lt;/p&gt;

&lt;p&gt;You’ll next want to commit your code to a new GitHub repository. You can &lt;a href="https://docs.github.com/en/get-started/quickstart/create-a-repo" rel="noopener noreferrer"&gt;read the docs&lt;/a&gt; if you’ve not done this before. Committing your code will look a little something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="err"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;remote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;origin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;https://github.com/notrab/dev-to-grafbase.git&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;branch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-M&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;push&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-u&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;origin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ℹ️ &lt;code&gt;https://github.com/notrab/dev-to-grafbase&lt;/code&gt; is the URL of my repo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Import your repository
&lt;/h3&gt;

&lt;p&gt;Once you’ve logged into Grafbase, it’ll look a little something like the image below. Here we’ll click &lt;strong&gt;Import your repository&lt;/strong&gt; to get started.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flqcabtevqjzv21310o7h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flqcabtevqjzv21310o7h.png" alt="Import your repository to Grafbase" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next you’ll want to find the repository from your personal, or organization account. Here I’m searching for the repository &lt;code&gt;dev-to-grafbase&lt;/code&gt; I created previously.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Import&lt;/strong&gt; to continue.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fspyatk344r9p9qzdy9af.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fspyatk344r9p9qzdy9af.png" alt="Import selected repository to GitHub" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you’ve imported the repository, Grafbase will automatically detect &lt;code&gt;grafbase/schema.graphql&lt;/code&gt; and import your schema.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Deploy&lt;/strong&gt; to continue.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7shyqdxegkh8lppmbzvb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7shyqdxegkh8lppmbzvb.png" alt="Deploy to Grafbase" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That’s it!&lt;/strong&gt; You now have a GraphQL backend deployed to the edge with Grafbase. 🎉&lt;/p&gt;

&lt;p&gt;From the Grafbase Dashboard you can discover your API endpoint, API Keys, Branches, and the hosted Playground to execute GraphQL operations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fviublq5zghlzphz3z8pc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fviublq5zghlzphz3z8pc.png" alt="Grafbase Dashboard" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Propose changes to the schema with Pull Requests
&lt;/h2&gt;

&lt;p&gt;Just like you would use GitHub to propose changes to code with Pull Requests, you can use GitHub to suggest changes to &lt;code&gt;grafbase/schema.graphql&lt;/code&gt; and Grafbase will automatically deploy a new serverless GraphQL backend at the edge!&lt;/p&gt;

&lt;p&gt;To get started, create a new branch. If you’re using the command line, it’ll look a little something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git switch &lt;span class="nt"&gt;-c&lt;/span&gt; my-first-schema-change
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now inside of &lt;code&gt;grafbase/schema.graphql&lt;/code&gt; add &lt;code&gt;description&lt;/code&gt; to your &lt;code&gt;Todo&lt;/code&gt; model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Todo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the file, commit, and push to GitHub. If you’re using the command line, it’ll look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="err"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;commit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-am&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'feat:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;description&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;field'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;push&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next you’ll want to create a new Pull Request. You can do this via the command line, or &lt;a href="http://GitHub.com" rel="noopener noreferrer"&gt;GitHub.com&lt;/a&gt; — &lt;a href="https://github.com/notrab/dev-to-grafbase/pull/1" rel="noopener noreferrer"&gt;here’s mine&lt;/a&gt; from earlier.&lt;/p&gt;

&lt;p&gt;Grafbase will then comment on the Pull Request with the deployment status: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fguls6o92etd6f7c4w9us.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fguls6o92etd6f7c4w9us.png" alt="Deployment success message from Grafbase GitHub Bot" width="800" height="148"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicking on the link provided by Grafbase will take you to that branch inside of your projects dashboard.&lt;/p&gt;

&lt;p&gt;From there you can see an overview of the changes (new field added), and the endpoint for that specific change:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fikf5jbgwrynksp6lf4jk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fikf5jbgwrynksp6lf4jk.png" alt="Grafbase schema changes overview" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s it! How cool. A fully isolated deployment preview for your schema change. You can then use this endpoint to test against your frontend to make sure everything works before merging with production.&lt;/p&gt;

&lt;p&gt;Once you’re happy that the changes can be added, merge the Pull Request in GitHub, and Grafbase will automatically merge the changes to your production backend API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxy79blcy9dsev7xjenb1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxy79blcy9dsev7xjenb1.png" alt="Grafbase production deployment overview" width="800" height="108"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Going further
&lt;/h2&gt;

&lt;p&gt;If you’re keen to learn more about Grafbase, I’d recommend reading the &lt;a href="https://grafbase.com/docs" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;. There’s support for OpenID Connect, and more.&lt;/p&gt;

&lt;p&gt;Make sure to join the &lt;a href="https://grafbase.com/community" rel="noopener noreferrer"&gt;community&lt;/a&gt; on Discord to share feedback, ideas, and what you’ve been building.&lt;/p&gt;

&lt;p&gt;See you on Discord! ❤️&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>serverless</category>
      <category>api</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Build your next commerce store with SvelteKit</title>
      <dc:creator>Jamie Barton</dc:creator>
      <pubDate>Tue, 13 Jul 2021 08:56:15 +0000</pubDate>
      <link>https://forem.com/commercejs/build-your-next-commerce-store-with-sveltekit-1m9f</link>
      <guid>https://forem.com/commercejs/build-your-next-commerce-store-with-sveltekit-1m9f</guid>
      <description>&lt;p&gt;In this short article we'll explore building a storefront with &lt;a href="https://kit.svelte.dev/" rel="noopener noreferrer"&gt;SvelteKit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're new to Svelte, or SvelteKit, you should take a look at &lt;a href="https://svelte.dev/blog/whats-the-deal-with-sveltekit" rel="noopener noreferrer"&gt;this article&lt;/a&gt; by Rich Harris explaining what the deal with SvelteKit is.&lt;/p&gt;

&lt;p&gt;SvelteKit boasts a simple setup, run the following to initialize a new project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init svelte@next my-commercejs-storefront
&lt;span class="nb"&gt;cd &lt;/span&gt;my-commercejs-storefront
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--open&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once your project is up and running, you'll want to install the &lt;code&gt;@chec/commerce.js&lt;/code&gt; dependency.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @chec/commerce.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then inside of the directory &lt;code&gt;src/lib&lt;/code&gt; (you'll need to create it) add the file &lt;code&gt;commerce.js&lt;/code&gt;. Here you'll want to instantiate &lt;code&gt;@chec/commerce.js&lt;/code&gt; and add your PUBLIC API KEY.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;CommerceSDK&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@chec/commerce.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CommerceSDK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pk_184625ed86f36703d7d233bcf6d519a4f9398f20048ec&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Storefront Index Page
&lt;/h2&gt;

&lt;p&gt;Then all that's left to do inside of your &lt;code&gt;.svelte&lt;/code&gt; files (such as &lt;code&gt;index.svelte&lt;/code&gt;) is import the &lt;code&gt;client&lt;/code&gt; and call the usual Commerce.js methods to get your products, categories, etc.&lt;/p&gt;

&lt;p&gt;If we wanted to get all of our categories and products, it would look something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;module&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$lib/commerce.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;categories&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;products&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;products&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you've used Sapper with Svelte before the above will look somewhat familiar, and if you've used other frontend frameworks like Next.js then returning your &lt;code&gt;props&lt;/code&gt; will look even more so.&lt;/p&gt;

&lt;p&gt;Then using the variables &lt;code&gt;categories&lt;/code&gt; and &lt;code&gt;products&lt;/code&gt; we'll output the values to a list.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;each&lt;/span&gt; &lt;span class="nx"&gt;categories&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prefetch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/categories/{category.slug}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/a&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sr"&gt;/each&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;each&lt;/span&gt; &lt;span class="nx"&gt;products&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prefetch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/product/{product.permalink}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/a&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sr"&gt;/each&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Category Pages
&lt;/h2&gt;

&lt;p&gt;Now we'll create the page for each of our categories.&lt;/p&gt;

&lt;p&gt;Inside of a new file &lt;code&gt;src/routes/categories/[slug].svelte&lt;/code&gt; we'll add the following script module:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;module&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$lib/commerce.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;slug&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;category&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;slug&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;products&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;category_slug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;products&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll notice above we're fetching the &lt;code&gt;slug&lt;/code&gt; from the page &lt;code&gt;params&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We then use this &lt;code&gt;slug&lt;/code&gt; to retrieve the category from Commerce.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;category&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;slug&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same slug is used when fetching products from Commerce.js, but it is used as a filter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;products&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;category_slug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then all that's left to do on this page is return our &lt;code&gt;category.name&lt;/code&gt; and list out the products belonging to that category:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;each&lt;/span&gt; &lt;span class="nx"&gt;products&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prefetch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/products/{product.permalink}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/a&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sr"&gt;/each&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! You'll notice here we're returning a list of links to our products, so we'll create those pages next!&lt;/p&gt;

&lt;h2&gt;
  
  
  Product Pages
&lt;/h2&gt;

&lt;p&gt;Similar to how we created the individual category pages, we'll do the same for products. But this time we'll call the file &lt;code&gt;[permalink].svelte&lt;/code&gt; since we're linking to the product permalink from the index and category pages.&lt;/p&gt;

&lt;p&gt;Add the following code to &lt;code&gt;src/routes/products/[permalink].svelte&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;module&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$lib/commerce.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;permalink&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;permalink&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;permalink&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;product&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;formatted_with_symbol&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That it for our product! You now can link users to your individual product pages 😅 &lt;/p&gt;

</description>
      <category>svelte</category>
      <category>javascript</category>
      <category>commerce</category>
      <category>sveltekit</category>
    </item>
    <item>
      <title>7. Create individual product pages - Create a Commerce.js store with Svelte</title>
      <dc:creator>Jamie Barton</dc:creator>
      <pubDate>Sat, 17 Oct 2020 14:27:52 +0000</pubDate>
      <link>https://forem.com/commercejs/7-create-individual-product-pages-create-a-commerce-js-store-with-svelte-4j6n</link>
      <guid>https://forem.com/commercejs/7-create-individual-product-pages-create-a-commerce-js-store-with-svelte-4j6n</guid>
      <description>&lt;p&gt;Now we've individual pages for categories, it's now time to create the important pages for products.&lt;/p&gt;




&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/n9AWs0rnnl8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;p&gt;We can do this by creating a new file with the name &lt;code&gt;[permalink].svelte&lt;/code&gt; inside the &lt;code&gt;src/routes/products&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;The file is called &lt;code&gt;[permalink]&lt;/code&gt; because we'll be fetching Commerce.js products by their &lt;code&gt;permalink&lt;/code&gt;. You could alternatively use the product &lt;code&gt;id&lt;/code&gt;, but the permalink when customized is a bit more friendly.&lt;/p&gt;

&lt;p&gt;Inside this file we'll make a call to &lt;code&gt;commerce.products.retrieve()&lt;/code&gt; and pass into the first argument the &lt;code&gt;permalink&lt;/code&gt; (from &lt;code&gt;params&lt;/code&gt;), and then in the 2nd argument, we'll tell it the &lt;code&gt;type&lt;/code&gt; is &lt;code&gt;permalink&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Once we've retrieved the product by permalink, we'll export the necessary variables, and return the product name, and formatted price to the page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;module&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;commerce&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../lib/commerce.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;preload&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;permalink&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;commerce&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;permalink&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;permalink&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;formatted_with_symbol&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎉 Great! &lt;/p&gt;

&lt;p&gt;You should see after running &lt;code&gt;npm run dev&lt;/code&gt; all of what we've built so far at &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;We'll next explore using Commerce.js to add products to cart, and checkout.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>svelete</category>
      <category>sapper</category>
      <category>commerce</category>
    </item>
  </channel>
</rss>
