<?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: Lucy</title>
    <description>The latest articles on Forem by Lucy (@lyrratic).</description>
    <link>https://forem.com/lyrratic</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%2F160713%2F255fa081-6798-4107-a6d1-ec01f204d460.png</url>
      <title>Forem: Lucy</title>
      <link>https://forem.com/lyrratic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lyrratic"/>
    <language>en</language>
    <item>
      <title>Getting Started with GraphQL</title>
      <dc:creator>Lucy</dc:creator>
      <pubDate>Wed, 31 Jul 2024 14:00:00 +0000</pubDate>
      <link>https://forem.com/intuitdev/getting-started-with-graphql-am7</link>
      <guid>https://forem.com/intuitdev/getting-started-with-graphql-am7</guid>
      <description>&lt;p&gt;Welcome to the world of GraphQL! At its core, GraphQL is both a query language for your API and a server-side runtime for executing those queries. It uses a type system you define for your data. GraphQL isn’t just another tool—it represents a new way of thinking about how data is loaded and managed in applications. If you’re coming from a background in RESTful APIs, you are in for a treat.&lt;/p&gt;

&lt;p&gt;Most of us are familiar with companies like Meta (Facebook), who &lt;a href="https://engineering.fb.com/2015/09/14/core-infra/graphql-a-data-query-language/" rel="noopener noreferrer"&gt;developed GraphQL&lt;/a&gt;, or others who have adopted GraphQL to streamline and power their data interactions. Those companies include &lt;a href="https://docs.github.com/en/graphql" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, &lt;a href="https://www.apollographql.com/blog/how-wayfair-achieved-graphql-success-with-federated-graphql" rel="noopener noreferrer"&gt;Wayfair&lt;/a&gt;, &lt;a href="https://developer.atlassian.com/platform/atlassian-graphql-api/graphql/#:~:text=The%20Atlassian%20platform%20GraphQL%20API%20allows%20you%20to%20access%20to,or%20cross%2Dproduct%20work%20activities." rel="noopener noreferrer"&gt;Atlassian&lt;/a&gt;, and &lt;a href="https://www.apollographql.com/blog/how-intuit-handled-their-busiest-time-of-year-with-apollo-router" rel="noopener noreferrer"&gt;Intuit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What makes GraphQL stand out? Ultimately, GraphQL gives you the ability to request exactly the data you need—nothing more and nothing less—and to retrieve that from a single endpoint.&lt;/p&gt;

&lt;p&gt;In this guide, we’ll cover the essentials: what GraphQL is, how it differs from REST, and how to start integrating it into your projects. We’ll walk you through this step by step. Let’s begin with the question most asked by API developers who are new to GraphQL.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Does GraphQL Differ from REST?
&lt;/h2&gt;

&lt;p&gt;When working with APIs, you're probably used to REST, where each resource, like users or products, has its own URL. This setup can lead to a lot of endpoints, and sometimes, fetching simple information requires multiple requests. For instance, imagine you need to generate a summary of an order for a customer. You might need the date the order was placed and the names of the products in that order. With REST, this would typically involve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sending a request to the /orders endpoint to get the order dates.&lt;/li&gt;
&lt;li&gt;Sending another request to the /products endpoint to fetch the product names.&lt;/li&gt;
&lt;li&gt;Possibly sending another request to the /user endpoint to confirm customer details.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In each of these calls, REST might send back much more data than you need—like product prices, descriptions, or user addresses—which you won’t use for your summary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Selective data retrieval&lt;/strong&gt;&lt;br&gt;
With GraphQL, you avoid this inefficiency by specifying exactly what you need: just the order date and product names, nothing more. This not only cuts down on the data transferred over the network but also significantly speeds up response times, making applications quicker and more responsive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single endpoint approach&lt;/strong&gt;&lt;br&gt;
Unlike REST, which uses multiple endpoints, GraphQL operates through a single endpoint. This simplifies the workflow because you don’t have to manage multiple URLs; everything happens in one place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Efficiency and performance&lt;/strong&gt;&lt;br&gt;
One of the biggest advantages of using GraphQL is its efficiency. Since you can fetch all the required data in a single request, it reduces the number of requests sent to the server. This is particularly beneficial in complex systems or mobile applications where network performance is crucial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strongly typed schema&lt;/strong&gt;&lt;br&gt;
GraphQL uses a strongly typed system where each operation is backed by a schema defined on the server. This schema acts as a contract between the client and the server, ensuring only valid queries are allowed. It helps catch errors early in the development process, improving the quality of your code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Understanding the Basics of GraphQL&lt;/strong&gt;&lt;br&gt;
As you start your journey with GraphQL, it’s important to grasp its fundamental concepts. These include the ways you can query data, modify it, and define the structure of data using GraphQL’s type system. Let’s break these down:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core operations&lt;/strong&gt;&lt;br&gt;
At its heart, GraphQL is built around three main operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Queries: These are used to read or fetch data. Unlike REST, where you might receive more information than you requested, GraphQL queries are designed to return exactly what you specify, no more and no less. This precision not only makes data retrieval more efficient but also easier to predict and handle in your applications.&lt;/li&gt;
&lt;li&gt;Mutations: While queries fetch data, mutations change data. Whether you’re adding new data, modifying existing data, or deleting it, mutations are your go-to operations. They are clearly defined in the schema, so you know exactly what kind of data modification is allowed and what isn’t.&lt;/li&gt;
&lt;li&gt;Subscriptions: Although we won't delve deeply into subscriptions here, it's useful to know they exist for real-time data updates. Like listening to live updates from a server, subscriptions allow your application to get immediate data as soon as it changes on the server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Type system&lt;/strong&gt;&lt;br&gt;
GraphQL’s type system is like a blueprint for your data. Here’s how it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.graphql-java.com/documentation/schema/" rel="noopener noreferrer"&gt;Schema&lt;/a&gt; definition&lt;/strong&gt;: This is where you define every type of data that can be queried or mutated through your GraphQL API. It outlines the structure of both input data (what you send) and output data (what you receive).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strong typing&lt;/strong&gt;: Every piece of data has a type, like String, Integer, or a custom type like User or Product. This strict typing helps catch errors during development, as GraphQL will only process queries and mutations that fit the schema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resolvers&lt;/strong&gt;: For every field in your schema, there's a function called a resolver that's responsible for fetching the data for that field. This means whenever a query or mutation requests a specific field, the resolver for that field runs to retrieve or update the data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding these basics sets the foundation for effectively using GraphQL in your projects. You’ll find that with a strong grasp of queries, mutations, and the type system, transitioning from traditional REST approaches becomes much smoother and more intuitive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setting Up a GraphQL Environment&lt;/strong&gt;&lt;br&gt;
In this section, we’ll set up a GraphQL server to handle a dataset involving users, orders, and products. This will give you a practical feel for how GraphQL manages relationships and queries. We'll use Node.js for our server setup, and we’ll take advantage of a package from Apollo Server.&lt;/p&gt;

&lt;p&gt;Apollo GraphQL is widely recognized as a leading provider of open-source tools for GraphQL. It offers a range of user-friendly solutions, such as Apollo Server and Apollo Studio, that help developers create and manage their GraphQL applications more efficiently. It has strong community support and straightforward documentation, making it easy for anyone to start working with GraphQL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation and initial configuration&lt;/strong&gt;&lt;br&gt;
Whether you’re working in an IDE or directly from the command line, getting started with GraphQL simply requires that you have Node.js and npm installed on your machine. The easiest way to do this is through nvm (Node Version Manager), which you can use to install the latest version of Node.js and npm. You can follow these &lt;a href="https://nodejs.org/en/download/package-manager" rel="noopener noreferrer"&gt;installation instructions&lt;/a&gt; for the simple steps to do this.&lt;/p&gt;

&lt;p&gt;With Node.js and npm installed, you’re ready to begin working with GraphQL.&lt;/p&gt;

&lt;p&gt;Step 1: Project initialization&lt;br&gt;
First, we’ll start by creating our project directory and initializing it:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~$ mkdir project &amp;amp;&amp;amp; cd project
~/project$ npm init -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Step 2: Install dependencies&lt;br&gt;
Next, install &lt;a href="https://www.apollographql.com/docs/apollo-server/" rel="noopener noreferrer"&gt;Apollo Server&lt;/a&gt; and GraphQL:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/project$ npm install apollo-server graphql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Step 3: Data preparation&lt;br&gt;
Prepare the data model with some dummy data by creating a file called &lt;code&gt;data.json&lt;/code&gt;.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/project$ touch data.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This file will contain a mock initial data set, which makes it easier to get up and running with GraphQL, as opposed to needing to set up an entire database backend. The &lt;code&gt;data.json&lt;/code&gt; file should have the following contents:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "users": [
    { "id": "1", "name": "Alice" },
    { "id": "2", "name": "Bob" }
  ],
  "orders": [
    { "id": "1", "userId": "1", "products": [{"productId": "1", "quantity": 1}, {"productId": "2", "quantity": 2}] },
    { "id": "2", "userId": "2", "products": [{"productId": "3", "quantity": 1}, {"productId": "4", "quantity": 1}] }
  ],
  "products": [
    { "id": "1", "name": "Laptop", "description": "High performance laptop", "price": 1249.99 },
    { "id": "2", "name": "Smartphone", "description": "Latest model smartphone", "price": 575.00 },
    { "id": "3", "name": "Tablet", "description": "Portable and powerful tablet", "price": 410.99 },
    { "id": "4", "name": "Headphones", "description": "Noise cancelling headphones", "price": 199.00 }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Server setup&lt;/p&gt;

&lt;p&gt;Step 4: Define GraphQL schema and resolvers&lt;br&gt;
In a &lt;code&gt;server.js&lt;/code&gt; file, define our GraphQL schema (with Apollo Server, the convention is to define this in &lt;code&gt;typeDefs&lt;/code&gt;), which includes types for &lt;code&gt;User&lt;/code&gt;, &lt;code&gt;Order&lt;/code&gt;, &lt;code&gt;Product&lt;/code&gt;, and their relationships. Also, define the &lt;code&gt;resolvers&lt;/code&gt; to specify how the data for each field in your schema is fetched from the data source.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/project$ touch server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The server.js file should look like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// server.js
const { ApolloServer, gql } = require('apollo-server');
const data = require('./data.json');

// Type definitions define the "shape" of your data and specify which ways the data can be fetched from the GraphQL server.
const typeDefs = gql`
  type User {
    id: ID
    name: String
    orders: [Order]
  }
  type Order {
    id: ID
    userId: ID
    products: [OrderProduct]
  }
  type OrderProduct {
    productId: ID
    quantity: Int
    product: Product
  }
  type Product {
    id: ID
    name: String
    description: String
    price: Float
  }
`;

// Resolvers define the technique for fetching the types defined in the schema.
const resolvers = {
  User: {
    orders: (user) =&amp;gt; data.orders.filter(
        order =&amp;gt; order.userId === user.id
    ),
  },
  OrderProduct: {
    product: (orderProduct) =&amp;gt; data.products.find(
        product =&amp;gt; product.id === orderProduct.productId
    ),
  }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;We’ve defined two &lt;code&gt;resolvers&lt;/code&gt; above. Notice how in our &lt;code&gt;typeDefs&lt;/code&gt; that a &lt;code&gt;User&lt;/code&gt; has an array of &lt;code&gt;Orders&lt;/code&gt;, and an &lt;code&gt;Order&lt;/code&gt; has an array of &lt;code&gt;OrderProducts&lt;/code&gt;. In our &lt;code&gt;resolvers&lt;/code&gt;, we make it clear that a user’s &lt;code&gt;orders&lt;/code&gt; are, naturally, those where the &lt;code&gt;userId&lt;/code&gt; matches the user’s &lt;code&gt;id&lt;/code&gt;. A similar approach applies to an &lt;code&gt;Order&lt;/code&gt; and its &lt;code&gt;OrderProducts&lt;/code&gt;. We use &lt;code&gt;resolvers&lt;/code&gt; to help define the relationship between data models.&lt;/p&gt;

&lt;p&gt;Step 5: Initialize and launch Apollo Server&lt;br&gt;
Next, we initialize Apollo Server with the schema and resolvers, and then we start it up to listen for requests. Add the following to the bottom of &lt;code&gt;server.js&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) =&amp;gt; {
  console.log(`🚀 Server ready at ${url}`);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This setup gives us a fully functional GraphQL server using Apollo. Next, we’ll dive into how to construct and execute queries to interact with this server setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Working with Queries&lt;/strong&gt;&lt;br&gt;
With our Apollo Server up and running, we can build out the &lt;code&gt;typeDefs&lt;/code&gt; and &lt;code&gt;resolvers&lt;/code&gt; to handle basic queries.&lt;/p&gt;

&lt;p&gt;Define &lt;code&gt;Query&lt;/code&gt; in &lt;code&gt;typeDefs&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Let’s add a &lt;code&gt;Query&lt;/code&gt; type to our &lt;code&gt;typeDefs&lt;/code&gt;.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const typeDefs = gql`
  type Query {
    users: [User]
    user(id: ID!): User
    orders: [Order]
    order(id: ID!): Order
    products: [Product]
    product(id: ID!): Product
  }
  type User {...}
  type Order {...}
  …
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;These definitions establish the type of data that will be returned for each given query. For example, the &lt;code&gt;users&lt;/code&gt; query will return an array of &lt;code&gt;Users&lt;/code&gt;, while the &lt;code&gt;user&lt;/code&gt; query—which will take a single &lt;code&gt;id&lt;/code&gt;—will return a single &lt;code&gt;User&lt;/code&gt;. Of course, it would make sense that the single &lt;code&gt;User&lt;/code&gt; returned is the one with the matching &lt;code&gt;id&lt;/code&gt;. However, we use &lt;code&gt;resolvers&lt;/code&gt; to make that explicit.&lt;/p&gt;

&lt;p&gt;Add &lt;code&gt;Query&lt;/code&gt; to &lt;code&gt;resolvers&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Let’s update our &lt;code&gt;resolvers&lt;/code&gt; object to look like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const resolvers = {
  Query: {
    users: () =&amp;gt; data.users,
    user: (_, { id }) =&amp;gt; data.users.find(user =&amp;gt; user.id === id),
    orders: () =&amp;gt; data.orders,
    order: (_, { id }) =&amp;gt; data.orders.find(order =&amp;gt; order.id === id),
    products: () =&amp;gt; data.products,
    product: (_, { id }) =&amp;gt; data.products.find(product =&amp;gt; product.id === id),
  },
  User: { … },
  OrderProduct: { … }
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;We see from how we define each &lt;code&gt;Query&lt;/code&gt; in our &lt;code&gt;resolvers&lt;/code&gt; that the &lt;code&gt;users&lt;/code&gt; query will map to our &lt;code&gt;data.users&lt;/code&gt; array. Meanwhile, a specific &lt;code&gt;product&lt;/code&gt; query will search the &lt;code&gt;data.products&lt;/code&gt; array for the &lt;code&gt;product&lt;/code&gt; with the matching &lt;code&gt;id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Start server&lt;br&gt;
Now, we’re ready to start our server. In the terminal, we execute the following command:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/project$ node server.js
🚀 Server ready at http://localhost:4000/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Test basic queries&lt;/p&gt;

&lt;p&gt;To interact with our GraphQL API from the command line, we can use curl to send HTTP requests to the /graphql endpoint. If you were to visit &lt;a href="http://localhost:4000" rel="noopener noreferrer"&gt;http://localhost:4000&lt;/a&gt; directly in your browser, you would see the Apollo Studio web interface (more on that &lt;a href="https://docs.google.com/document/d/1FFywd4LNIsJko3YoVr4nOk7MIZZnYDdak9JMa0FkAYY/edit#heading=h.s0mu8yrwycy" rel="noopener noreferrer"&gt;below&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Let's say we want to fetch the name and orders for the user with id 1. The GraphQL query in JSON format would look like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~$ curl \
   -X POST \
   -H "Content-Type: application/json" \
   -d '{"query": "{ users { id name } }"}' \
   http://localhost:4000/graphql

{"data":{"users":[{"id":"1","name":"Alice"},{"id":"2","name":"Bob"}]}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;In the above request, we are sending a &lt;code&gt;users&lt;/code&gt; query, which we defined in our &lt;code&gt;resolvers&lt;/code&gt; to be “all the users in the &lt;code&gt;data.users&lt;/code&gt; array.” Based on the &lt;code&gt;User&lt;/code&gt; schema defined in &lt;code&gt;typeDefs&lt;/code&gt;, we can ask for an &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, and &lt;code&gt;orders&lt;/code&gt; for each &lt;code&gt;User&lt;/code&gt;. However, in GraphQL, we get to decide how much information we want to receive. In the case of this request, we only want the &lt;code&gt;id&lt;/code&gt; and &lt;code&gt;name&lt;/code&gt; for each &lt;code&gt;User&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let’s send another request. This time, we will retrieve all the &lt;code&gt;orders&lt;/code&gt; for a specific &lt;code&gt;User&lt;/code&gt;, and for each &lt;code&gt;Order&lt;/code&gt;, we also want to fetch certain information about the associated &lt;code&gt;OrderProducts&lt;/code&gt;.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~$ curl \
   -X POST \
   -H "Content-Type: application/json" \
   -d '{"query": "{ user(id:1) { orders { id products { quantity product { name price } } } } }"}' \
   http://localhost:4000/graphql | json_pp

{
   "data" : {
      "user" : {
         "orders" : [
            {
               "id" : "1",
               "products" : [
                  {
                     "product" : {
                        "name" : "Laptop",
                        "price" : 1249.99
                     },
                     "quantity" : 1
                  },
                  {
                     "product" : {
                        "name" : "Smartphone",
                        "price" : 575
                     },
                     "quantity" : 2
                  }
               ]
            }
         ]
      }
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Notice that both of our requests were &lt;code&gt;POST&lt;/code&gt; requests to the same /graphql endpoint. All our requests will be &lt;code&gt;POST&lt;/code&gt; requests, and they’ll all go to this endpoint. Our data payload notes that we are sending a &lt;code&gt;query&lt;/code&gt;, and then we specify our query parameters as a JSON string.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mutations and Updating Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://graphql.org/learn/queries/#mutations" rel="noopener noreferrer"&gt;Mutations&lt;/a&gt; are essential for performing write operations in GraphQL. Unlike queries, which are used to fetch data, mutations change data—anything from creating and updating to deleting records. Let’s define some common mutations for your GraphQL API and show how to implement them.&lt;/p&gt;

&lt;p&gt;Define &lt;code&gt;Mutation&lt;/code&gt; in &lt;code&gt;TypeDefs&lt;/code&gt;&lt;br&gt;
First, we’ll extend our GraphQL schema to include mutation type definitions:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const typeDefs = gql`
  type Query { … }
  type Mutation {
    addUser(name: String!): User
    updateUser(id: ID!, name: String!): User
    addProduct(name: String!, description: String, price: Float!): Product
    addOrder(userId: ID!, products: [ProductInput!]!): Order
  }
  input ProductInput {
    productId: ID!
    quantity: Int!
  }
  type User { … }
  type Order { … }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;We’re adding four mutations here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;addUser&lt;/code&gt; will add a new user with the given string &lt;code&gt;name&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;updateUser&lt;/code&gt; will update the &lt;code&gt;name&lt;/code&gt; of the user with a given &lt;code&gt;id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;addProduct&lt;/code&gt; will add a new product with the given &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, and &lt;code&gt;price&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;addOrder&lt;/code&gt; will add a new order for a user with the given id, but it will also need to take an array of &lt;code&gt;ProductInput&lt;/code&gt; objects, which we also define as a combination of a &lt;code&gt;productId&lt;/code&gt; and &lt;code&gt;quantity&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add &lt;code&gt;Mutation&lt;/code&gt; to &lt;code&gt;resolvers&lt;/code&gt;&lt;br&gt;
Next, we define &lt;code&gt;resolvers&lt;/code&gt; for our mutations.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const resolvers = {
  Query: { ... },
  Mutation: {
    addUser: (_, { name }) =&amp;gt; {
      const newUser = { id: String(data.users.length + 1), name };
      data.users.push(newUser);
      return newUser;
    },
    updateUser: (_, { id, name }) =&amp;gt; {
      const user = data.users.find(user =&amp;gt; user.id === id);
      if (!user) return null;
      user.name = name;
      return user;
    },
    addOrder: (_, { userId, products }) =&amp;gt; {
      const newOrder = {
        id: String(data.orders.length + 1),
        userId,
        products
      };
      data.orders.push(newOrder);
      return newOrder;
    },
    addProduct: (_, { name, description, price }) =&amp;gt; {
      const newProduct = { id: String(data.products.length + 1), name, description, price };
      data.products.push(newProduct);
      return newProduct;
    }
  },
  User: { ... },
  OrderProduct: { ... }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;In our &lt;code&gt;resolvers&lt;/code&gt;, we specify how the Apollo Server should handle each of our mutation operations. This typically means creating a new object (or finding the object to be updated, in case of &lt;code&gt;updateUser&lt;/code&gt;) and then updating &lt;code&gt;data&lt;/code&gt; with that object.&lt;/p&gt;

&lt;p&gt;Restart server&lt;br&gt;
With our mutations defined, let’s restart our server with &lt;code&gt;node server.js&lt;/code&gt; again.&lt;/p&gt;

&lt;p&gt;Test mutation operations in Apollo Studio&lt;br&gt;
Apollo has a convenient and feature-rich web interface called Apollo Explorer that can connect to our development environment server to make querying and testing easier. With our server started, we can visit the server URL (if you are running locally, then it will be &lt;code&gt;http://localhost:4000&lt;/code&gt;) in our browser, and this will redirect us to Apollo Explorer. Alternatively, visit &lt;a href="https://studio.apollographql.com/sandbox/explorer" rel="noopener noreferrer"&gt;https://studio.apollographql.com/sandbox/explorer&lt;/a&gt; directly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fu8wqcn6kn4y0jxzihq8l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fu8wqcn6kn4y0jxzihq8l.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s test out a few mutation operations in Apollo Explorer. For example, the following operation calls the addUser mutation to add a new user with the name Charlie, and then it returns the resulting id and name of the newly added user.&lt;/p&gt;

&lt;p&gt;In Apollo Explorer, the operation looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fxe77pf3nxj7x7tyl00ss.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fxe77pf3nxj7x7tyl00ss.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What if we wanted to add a new order for Charlie? It would look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fnzvuanxdeqdq2ebjz94v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fnzvuanxdeqdq2ebjz94v.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, here’s how we might perform an updateUser mutation:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Ff545v92zwn09m9p12qk9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ff545v92zwn09m9p12qk9.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice that mutation operations can be followed up with querying for more efficient operations.&lt;/p&gt;

&lt;p&gt;A note on handling data&lt;br&gt;
So far, our examples have used an in-memory object called data which started as data read in from a JSON file. This approach is great for learning and quick prototyping, but it isn’t suitable for production environments where data persistence is crucial.&lt;/p&gt;

&lt;p&gt;In a production setting, you would typically connect your GraphQL server to a &lt;a href="https://graphql.guide/background/databases/" rel="noopener noreferrer"&gt;persistent database&lt;/a&gt;. The resolvers we've written, which currently manipulate the in-memory &lt;code&gt;data&lt;/code&gt; object, would be adjusted to execute queries against this database instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error Handling and Debugging&lt;/strong&gt;&lt;br&gt;
Handling errors and debugging in GraphQL may differ slightly from how you would do it with traditional REST APIs. Here are some tips for approaching error handling and debugging efficiently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check for &lt;code&gt;errors&lt;/code&gt;&lt;/strong&gt;: GraphQL operations typically return a list of errors in the response body. These might not be HTTP status errors but are instead part of the GraphQL response under the errors field. Therefore, you should always check for errors in the response alongside the data to ensure comprehensive error handling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logging&lt;/strong&gt;: Implement logging on the server side to capture requests and errors. This can help you trace issues back to specific queries or mutations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate queries&lt;/strong&gt;: Use tools like Apollo Explorer during development to validate queries and mutations for syntax and structure before deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use clear error messages&lt;/strong&gt;: &lt;a href="https://www.apollographql.com/docs/apollo-server/data/errors#custom-errors" rel="noopener noreferrer"&gt;Design your &lt;code&gt;resolvers&lt;/code&gt; to throw errors&lt;/a&gt; which include clear and descriptive error messages. This helps clients understand what went wrong without the need to dig into server-side logs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tools and Ecosystem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When working with GraphQL—especially as you’re just starting out—you don’t need to build everything from scratch. Take advantage of the rich ecosystem of tools designed to enhance your development experience. Apollo Studio featuring Explorer is a prime example, allowing you to build and test your queries interactively within a web interface. This makes it easier to visualize and manipulate your GraphQL operations.&lt;/p&gt;

&lt;p&gt;For an alternative in-browser GraphQL IDEs, there is also &lt;a href="https://github.com/graphql/graphiql/tree/main/packages/graphiql" rel="noopener noreferrer"&gt;GraphiQL&lt;/a&gt;. For API testing and query building, &lt;a href="https://www.postman.com/" rel="noopener noreferrer"&gt;Postman&lt;/a&gt;—traditionally known for handling REST APIs—also supports GraphQL. Additionally, &lt;a href="https://github.com/graphql-kit/graphql-voyager" rel="noopener noreferrer"&gt;GraphQL&lt;/a&gt; &lt;a href="https://github.com/graphql-kit/graphql-voyager" rel="noopener noreferrer"&gt;Voyager&lt;/a&gt; is a tool for visually exploring your GraphQL API as an interactive graph. This can be particularly useful for understanding and documenting the relationships between entities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Congratulations on navigating through the fundamentals of GraphQL! By now, you should have a solid understanding of how GraphQL differs from traditional REST APIs, its efficiency in fetching and manipulating data, and the flexibility it offers through queries and mutations.&lt;/p&gt;

&lt;p&gt;Throughout this guide, we've explored:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting up a GraphQL environment using Apollo Server.&lt;/li&gt;
&lt;li&gt;Constructing and executing queries to retrieve data, demonstrating the efficiency of GraphQL in fetching exactly only the data that you need.&lt;/li&gt;
&lt;li&gt;Implementing mutations to modify data.&lt;/li&gt;
&lt;li&gt;Tips for error handling and debugging.&lt;/li&gt;
&lt;li&gt;Additional tools that can help you in your GraphQL learning journey.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Continue exploring GraphQL, and spend time looking into advanced features like subscriptions. As you design APIs for projects in the future, consider whether the efficiency and power of GraphQL may be a better fit for your needs than a traditional REST API. Keep learning, keep building, and make the most of what GraphQL has to offer!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fxvrzw1tzhygbfe6u1wdc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fxvrzw1tzhygbfe6u1wdc.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>opensource</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Open Source for Beginners: FAQ Guide</title>
      <dc:creator>Lucy</dc:creator>
      <pubDate>Fri, 15 Mar 2024 21:18:09 +0000</pubDate>
      <link>https://forem.com/intuitdev/open-source-for-beginners-quick-faq-guide-47a6</link>
      <guid>https://forem.com/intuitdev/open-source-for-beginners-quick-faq-guide-47a6</guid>
      <description>&lt;p&gt;Interested in contributing to open source, but not sure where to start? As a developer advocate working on &lt;a href="https://github.com/intuit"&gt;Intuit Open Source&lt;/a&gt;, I hear this quite a lot from our community. To help you get over that cold start problem, we've compiled a beginner-friendly FAQ to jumpstart your first open source contribution.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you prefer video, consider checking out our &lt;a href="https://youtu.be/XE22V0TU0cM?si=G8rW_FJsQW1Xyrg4"&gt;OSS beginners video guide&lt;/a&gt; as well!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where can I find good active projects to contribute to?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://firsttimersonly.com"&gt;firsttimersonly.com&lt;/a&gt; has a listing of various first-timer resources&lt;/li&gt;
&lt;li&gt;GitHub issues search: &lt;a href="https://github.com/issues?q=is%3Aopen+label%3A%22good+first+issue%22"&gt;#good-first-issue&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/MunGell/awesome-for-beginners"&gt;awesome-for-beginners&lt;/a&gt; (categorized by language)&lt;/li&gt;
&lt;li&gt;Nontechnical contribution resources: &lt;a href="https://github.com/szabgab/awesome-for-non-programmers"&gt;awesome-for-non-programmers&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our #1 tip: just do it! Don't get too stuck looking for the ideal first project, just choose something you &lt;em&gt;can&lt;/em&gt; do and start getting your feet wet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I feature OSS work on my resume or portfolio?&lt;/strong&gt;&lt;br&gt;
You can list open source contributions under the "Projects" or "Volunteering" headers on your resume. Rather than listing every contribution you've ever made, focus on the projects you're most associated with, and highlight the number of contributions you made to each of those projects.&lt;/p&gt;

&lt;p&gt;Even if it's just one pull request, it's worth showing off your work to potential employers. An open source PR demonstrates that you're able to get up to speed with an unknown codebase quickly, a valuable skill for any technical role in the industry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What technologies do I need to know to contribute to open source?&lt;/strong&gt;&lt;br&gt;
A working understanding of Git and GitHub is essential, but beyond that, the specific technology stack and tools you'll need will depend on the project you want to contribute to. If you're looking to deepen your expertise in a particular skill set, take a closer look at the open source libraries out there leveraging the tools or languages you’re hoping to learn, and find one that fits your learning goals.&lt;/p&gt;

&lt;p&gt;E.g. As a frontend developer looking to improve my TypeScript fluency, I could search GitHub for good first issues tagged on projects that use TypeScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens when multiple people want to work on the same issue?&lt;/strong&gt;&lt;br&gt;
Most maintainers will typically have a "first come, first serve" policy when it comes to assigning issues to contributors. If you see an issue you'd like to tackle, make sure it's up for grabs before starting work by commenting on the issue and getting a confirmation from a maintainer on the project. It’s also common that someone may claim an issue and then not make progress on it for a while, at which point you’re welcome to step in and take over (with the maintainers’ blessing, of course).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When should I stop taking good first issues?&lt;/strong&gt;&lt;br&gt;
The beauty of open source is that there's always something new to learn and contribute to. Take good first issues as long as you feel like you need to, but don't be afraid to move on when you outgrow them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How can I generate interest in a new open source project?&lt;/strong&gt;&lt;br&gt;
Building a strong community around your project is key to its success. Offer good first issues, participate in events and open source conferences, create clean documentation and video guides, and don't hesitate to ask for feedback from others in the field. Remember that it takes time and consistency to build community momentum, and there are entire teams and OSPOs dedicated to this specific problem, so don’t be too hard on yourself if things don’t take off immediately or if you can’t achieve the perfectly consistent cadence. Little by little, you’ll get there!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What other resources can you recommend for beginners?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Here's a good &lt;a href="https://github.com/asmeurer/git-workflow"&gt;Git workflow walkthrough&lt;/a&gt;, or you can step through the &lt;a href="https://github.com/firstcontributions/first-contributions#first-contributions"&gt;first-contributions&lt;/a&gt; guide&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.conventionalcommits.org/en/v1.0.0/"&gt;Conventional commits&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let us know in the comments if you have any other questions, and we’ll answer as much as we can. If you’re still looking around for a project, our Intuit Open Source projects can also be a great place to start.&lt;/p&gt;

&lt;p&gt;Happy coding, open-sourcerors!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Hacktoberfest 2023 @ Intuit: Maintainer Spotlight</title>
      <dc:creator>Lucy</dc:creator>
      <pubDate>Wed, 25 Oct 2023 17:15:30 +0000</pubDate>
      <link>https://forem.com/intuitdev/hacktoberfest-2023-intuit-maintainer-spotlight-4jad</link>
      <guid>https://forem.com/intuitdev/hacktoberfest-2023-intuit-maintainer-spotlight-4jad</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AHw6lMz1UQcBLcjroCR-24g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AHw6lMz1UQcBLcjroCR-24g.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As &lt;a href="https://hacktoberfest.com/" rel="noopener noreferrer"&gt;Hacktoberfest 2023&lt;/a&gt; comes to an end, we at Intuit are excited to send rewards to our internal and external contributors for their amazing contributions. But before we do, we want to take a moment to recognize our maintainers!&lt;/p&gt;

&lt;p&gt;Intuit has been participating in Hacktoberfest &lt;a href="https://medium.com/intuit-engineering/the-moonshot-hacktoberfest-launches-at-intuit-d9805f342d6" rel="noopener noreferrer"&gt;since 2019&lt;/a&gt; by offering special incentives to employees for contributing to open source projects, and this year we took it to the next level by sending rewards (cool t-shirts!) to outside contributors to Intuit libraries as well. It’s important to remember that these contributions are only possible thanks to the hard work of our maintainer teams reviewing pull requests and keeping issues up to date.&lt;/p&gt;

&lt;p&gt;We wish we could highlight every single one of our 130+ open source projects here, but here’s a short list of featured maintainer teams and their projects:&lt;/p&gt;

&lt;h3&gt;
  
  
  Graph Quilt
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2ATj0Mt2pX_qe3uYmy" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2ATj0Mt2pX_qe3uYmy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/graph-quilt" rel="noopener noreferrer"&gt;graph-quilt&lt;/a&gt; is an open source Java library that provides recursive schema stitching and Apollo Federation style schema composition for GraphQL APIs. The project includes a modular set of libraries with features including a Representational State Transfer (REST) adapter, GraphQL authorization, and a reference implementation of a graph-quilt gateway. There are even more features coming soon, so keep an eye out for updates!&lt;/p&gt;

&lt;p&gt;Maintainers Ashpak Shaikh, Carlo Aureus, and Kyle Moore released a video demo and walkthrough on the Intuit Developers YouTube channel. Check it out here:&lt;/p&gt;

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

&lt;p&gt;Ashpak also recently spoke in-depth about graph-quilt at GraphQLConf 2023. &lt;a href="https://graphql.org/conf/sessions/17f150667d13a57f28bae524443f4c60/" rel="noopener noreferrer"&gt;See the recording of his talk here!&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Numaproj
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F961%2F0%2ATY2y3ymVZyVbX-_0" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F961%2F0%2ATY2y3ymVZyVbX-_0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/numaproj" rel="noopener noreferrer"&gt;numaproj&lt;/a&gt; is a collection of Kubernetes-native tools for doing real-time operation data analytics. Currently it includes &lt;a href="https://github.com/numaproj/numaflow" rel="noopener noreferrer"&gt;numaflow&lt;/a&gt;, a massively parallel, real-time data and stream processing engine, and &lt;a href="http://numalogic" rel="noopener noreferrer"&gt;numalogic&lt;/a&gt;, ML models and tools for real-time operational data analytics.&lt;/p&gt;

&lt;p&gt;Maintainers Derek Wang and Vigith Maurice recently gave a talk at &lt;a href="https://2023.allthingsopen.org/sessions/streaming-aiops-on-kubernetes-at-scale/" rel="noopener noreferrer"&gt;All Things Open&lt;/a&gt; walking through how to build a large scale AIOps platform with open source technologies, including numaproj tools. The recording of their talk will be live soon on the All Things Open &lt;a href="https://www.youtube.com/c/allthingsopen" rel="noopener noreferrer"&gt;YouTube channel&lt;/a&gt;, so stay tuned! Maintainer Sri Harsha Yayi also joined Derek for a presentation at the &lt;a href="https://www.linkedin.com/events/intuithacktoberfestmeetup-sandi7112546014225432576/comments/" rel="noopener noreferrer"&gt;Hacktoberfest Happy Hour&lt;/a&gt; we hosted at Intuit’s Mountain View and San Diego campuses.&lt;/p&gt;

&lt;p&gt;numaproj is still a young and growing project, and if you’d like to follow along on the journey, consider joining the team &lt;a href="https://join.slack.com/t/numaproj/shared_invite/zt-19svuv47m-YKHhsQ~~KK9mBv1E7pNzfg" rel="noopener noreferrer"&gt;on Slack&lt;/a&gt;, or follow the &lt;a href="https://blog.numaproj.io/" rel="noopener noreferrer"&gt;numaproj blog&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Player
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F497%2F0%2ALSsB5kq8cjSc6EvM" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F497%2F0%2ALSsB5kq8cjSc6EvM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/player-ui/player" rel="noopener noreferrer"&gt;Player&lt;/a&gt; is a framework for building cross-platform dynamic experiences. The core engine is authored in TypeScript with specific adaptors to natively render on iOS, Android, and React. Start by supplying some semantic JSON content, where you can describe views, your data, validation rules, and much more. Add your own asset library to handle the rendering, and voilà, you have a full dynamic user experience.&lt;/p&gt;

&lt;p&gt;Player’s &lt;a href="https://github.com/player-ui/player#contributing" rel="noopener noreferrer"&gt;maintainer team&lt;/a&gt; is one of our most active here at Intuit, and they’ve been an incredible source of open source energy, year-round. To see the library in action, check out our YouTube video featuring maintainer Adam Dierkens here:&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Cello
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AddB6YmdsX4Fc1ev5" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AddB6YmdsX4Fc1ev5"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cello-proj/cello" rel="noopener noreferrer"&gt;Cello&lt;/a&gt; is an engine for Cloud deployments: infrastructure as code (IaC) with GitOps, with isolation from your Cloud provider, all Cloud-agnostic. It fits into any CI/CD system — Jenkins, GitHub actions, you name it. We developed Cello to help us manage our complex set of various IaCs.&lt;/p&gt;

&lt;p&gt;Maintainer Jerome Kuptz recently gave a lightning talk demonstrating Cello’s features for a round of Hacktoberfest lightning talks we did internally at Intuit. We’ll work on getting that talk shared soon on the Intuit Developers YouTube channel, but please check out Cello’s &lt;a href="https://cello-proj.github.io/cello/quickstart/" rel="noopener noreferrer"&gt;Quick Start guide&lt;/a&gt; in the meantime!&lt;/p&gt;

&lt;h3&gt;
  
  
  Trapheus (and TrapheusAI)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2Aoa_VcFYzm6sPqFxp" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2Aoa_VcFYzm6sPqFxp"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/intuit/Trapheus" rel="noopener noreferrer"&gt;Trapheus&lt;/a&gt; is a tool for restoring relational database service (RDS) instances in AWS without worrying about client downtime or configuration retention. It supports individual RDS snapshot as well as cluster snapshot restore operations. Modeled as a state machine, with the help of AWS step functions, Trapheus restores the RDS instance in a much faster way than the usual SQL dump preserving the same instance endpoint and configurations as before.&lt;/p&gt;

&lt;p&gt;Maintainer Rohit Kumar recently published a &lt;a href="https://medium.com/@rite2rohit88/celebrating-three-years-of-trapheus-with-hacktoberfest-43a4043dc60f" rel="noopener noreferrer"&gt;blog post&lt;/a&gt; on Intuit’s Engineering Blog celebrating 3 years since Trapheus’ first release during Hacktoberfest 2020, and announcing the launch of &lt;a href="https://github.com/intuit/Trapheus/tree/master/labs/TrapheusAI#-demo" rel="noopener noreferrer"&gt;TrapheusAI&lt;/a&gt;, a next-generation data search and analysis assistant that can overcome the challenges of traditional keyword search with powerful data analyses using natural language. See the demo here:&lt;/p&gt;

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

&lt;h3&gt;
  
  
  argoproj
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2A9ltrYELq_E7N53-0" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2A9ltrYELq_E7N53-0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How could we do an Intuit open source software maintainer feature without Argo? &lt;a href="https://github.com/argoproj" rel="noopener noreferrer"&gt;Argo Project&lt;/a&gt; is one of our largest open source projects, with a vibrant contributor, maintainer, and user community. Argo is a collection of open source tools for Kubernetes to run workflows, manage clusters, and do GitOps right. The project includes &lt;a href="https://github.com/argoproj/argo-workflows" rel="noopener noreferrer"&gt;argo-workflows&lt;/a&gt;, &lt;a href="https://github.com/argoproj/argo-rollouts" rel="noopener noreferrer"&gt;argo-rollouts&lt;/a&gt;, &lt;a href="https://github.com/argoproj/argo-cd" rel="noopener noreferrer"&gt;argo-cd&lt;/a&gt;, and more.&lt;/p&gt;

&lt;p&gt;Maintainer Michael Crenshaw gave a talk on Argo CD for the Hacktoberfest lightning talks mentioned earlier, which we’ll work on publishing soon. The Argo community is also hosting an &lt;a href="https://www.meetup.com/out-of-the-box-ospo-developers/events/296853074/" rel="noopener noreferrer"&gt;in-person Kubernetes meetup&lt;/a&gt; at the Intuit Mountain View campus.&lt;/p&gt;

&lt;p&gt;—&lt;/p&gt;

&lt;p&gt;This was only a tiny fraction of all the open source projects we’re proud to work on here at Intuit. Hacktoberfest may be drawing to a close, but the open source work continues through the rest of the year. Whether you managed to get a contribution done this October or not, we hope to see you out there in the open source community.&lt;/p&gt;

&lt;p&gt;A huge, endless thank you to all of our maintainers and contributors for your hard work and dedication to the open source community. There are still a few days left in October, so keep those contributions coming (&lt;a href="https://github.com/intuit/" rel="noopener noreferrer"&gt;see Intuit’s Hacktoberfest incentives here&lt;/a&gt;), and Happy Hacktoberfest!&lt;/p&gt;




</description>
      <category>opensource</category>
      <category>argo</category>
      <category>graphql</category>
      <category>hacktoberfest</category>
    </item>
  </channel>
</rss>
