{"action":"created","comment":{"url":"https://api.github.com/repos/gatsbyjs/gatsby/pulls/comments/167762915","pull_request_review_id":96027733,"id":167762915,"diff_hunk":"@@ -54,230 +64,238 @@ query IndexQuery {\n }\n ```\n \n-The query fetches the title and tags for every blog post.\n+The resulting data includes the `path` and `tags` frontmatter for each post, which is all the data we'll need to create pages for each tag which contain a list of posts under that tag. Let's make the tag page template now:\n \n-Using this query, we can create a component for a blog front page that lists all posts and their tags.\n+## Make a tags page template (for `/tags/{tag}`)\n \n-```jsx\n-const IndexPage = ({ data }) => (\n-  <div>\n-    <h1>My Travel Blog</h1>\n-    {data.allMarkdownRemark.edges.map(({ node }) => (\n-      <div key={node.id}>\n-        <h3>\n-          {node.frontmatter.title}\n-          <span>— {node.frontmatter.tags.join(`, `)}</span>\n-        </h3>\n-      </div>\n-    ))}\n-  </div>\n-);\n-\n-export const query = graphql`\n-  query IndexQuery {\n-    allMarkdownRemark {\n-      totalCount\n-      edges {\n-        node {\n-          id\n-          frontmatter {\n-            title\n-            tags\n-          }\n-        }\n-      }\n-    }\n-  }\n-`;\n-```\n+If you followed the tutorial for [Adding Markdown Pages](/docs/adding-tags-and-categories-to-blog-posts/), then this process should sound familiar: we'll make a tag page template, then use it in `createPages` in `gatsby-node.js` to generate individual pages for the tags in our posts.\n \n-## Create tag pages\n+First, we'll add a tags template at `src/templates/tags.js`:\n \n-Tag pages list all the tags or all items with a certain tag and are a great tool for organizing content and making your site easy to browse.\n+```jsx\n+import React from 'react';\n+import PropTypes from 'prop-types';\n \n-First you will need a tag page component. In this example, we add a tags component in `src/templates/tags.js` which we'll use to create an index tags page at `/tags` and individual tag pages.\n+// Components\n+import Link from 'gatsby-link';\n+\n+const Tags = ({ pathContext, data }) => {\n+  const { tag } = pathContext;\n+  const { edges, totalCount } = data.allMarkdownRemark;\n+  const tagHeader = `${totalCount} post${totalCount === 1 ? '' : 's'} tagged with \"${tag}\"`;\n \n-```jsx\n-import React from \"react\";\n-import GatsbyLink from \"gatsby-link\";\n-\n-export default function Tags({ pathContext }) {\n-  const { posts, post, tag } = pathContext;\n-  if (tag) {\n-    return (\n-      <div>\n-        <h1>\n-          {post.length} post{post.length === 1 ? \"\" : \"s\"} tagged with {tag}\n-        </h1>\n-        <ul>\n-          {post.map(({ id, frontmatter, excerpt, fields }) => {\n-            return (\n-              <li key={id}>\n-                <h1>\n-                  <GatsbyLink to={fields.slug}>{frontmatter.title}</GatsbyLink>\n-                </h1>\n-                <p>{excerpt}</p>\n-              </li>\n-            );\n-          })}\n-        </ul>\n-        <GatsbyLink to=\"/tags\">All tags</GatsbyLink>\n-      </div>\n-    );\n-  }\n   return (\n     <div>\n-      <h1>Tags</h1>\n-      <ul className=\"tags\">\n-        {Object.keys(posts).map(tagName => {\n-          const tags = posts[tagName];\n+      <h1>{tagHeader}</h1>\n+      <ul>\n+        {edges.map(({ node }) => {\n+          const { path, title } = node.frontmatter;\n           return (\n-            <li key={tagName}>\n-              <GatsbyLink to={`/tags/${tagName}`}>{tagName}</GatsbyLink>\n+            <li key={path}>\n+              <Link to={path}>{title}</Link>\n             </li>\n           );\n         })}\n       </ul>\n+      {/*\n+        This links to a page that does not yet exist.\n+        We'll come back to it!\n+      */}\n+      <Link to=\"/tags\">All tags</Link>\n     </div>\n   );\n-}\n-```\n-\n-Now we'll instruct Gatsby to create the tag pages. In the site's `gatsby-node.js` file we'll call the the [`createPages`](/docs/node-apis/#createPages) API to make a page for every tag.\n-\n-First create a function called `createTagPages`:\n-\n-```javascript\n-const path = require(\"path\");\n-\n-const createTagPages = (createPage, edges) => {\n-  // Tell it to use our tags template.\n-  const tagTemplate = path.resolve(`src/templates/tags.js`);\n-  // Create an empty object to store the posts.\n-  const posts = {};\n-  console.log(\"creating posts\");\n+};\n \n-  // Loop through all nodes (our markdown posts) and add the tags to our post object.\n+Tags.propTypes = {\n+  pathContext: PropTypes.shape({\n+    tag: PropTypes.string.isRequired,\n+  }),\n+  data: PropTypes.shape({\n+    allMarkdownRemark: PropTypes.shape({\n+      totalCount: PropTypes.number.isRequired,\n+      edges: PropTypes.arrayOf(\n+        PropTypes.shape({\n+          node: PropTypes.shape({\n+            frontmatter: PropTypes.shape({\n+              path: PropTypes.string.isRequired,\n+              title: PropTypes.string.isRequired,\n+            }),\n+          }),\n+        }).isRequired,\n+      ),\n+    }),\n+  }),\n+};\n \n-  edges.forEach(({ node }) => {\n-    if (node.frontmatter.tags) {\n-      node.frontmatter.tags.forEach(tag => {\n-        if (!posts[tag]) {\n-          posts[tag] = [];\n+export default Tags;\n+\n+export const pageQuery = graphql`\n+    query TagPage($tag: String) {\n+      allMarkdownRemark(\n+        limit: 2000\n+        sort: { fields: [frontmatter___date], order: DESC }\n+        filter: { frontmatter: { tags: { in: [$tag] } } }\n+      ) {\n+        totalCount\n+        edges {\n+          node {\n+            frontmatter {\n+              title\n+              path\n+            }\n+          }\n         }\n-        posts[tag].push(node);\n-      });\n+      }\n     }\n-  });\n+`;\n+```\n \n-  // Create the tags page with the list of tags from our posts object.\n-  createPage({\n-    path: \"/tags\",\n-    component: tagTemplate,\n-    context: {\n-      posts,\n-    },\n-  });\n+**Note**: `propTypes` are included in this example to help you ensure you're getting all the data you need in the component, and to help serve as a guide while destructuring / using those props.\n \n-  // For each of the tags in the post object, create a tag page.\n-\n-  Object.keys(posts).forEach(tagName => {\n-    const post = posts[tagName];\n-    createPage({\n-      path: `/tags/${tagName}`,\n-      component: tagTemplate,\n-      context: {\n-        posts,\n-        post,\n-        tag: tagName,\n-      },\n-    });\n-  });\n-};\n-```\n+## Modify `gatsby-node.js` to render pages using that template\n \n-Then in the `createPages` API function, query using `graphql` for your fields and use that to call the new `createTagPages` function.\n+Now we've got a template. Great! I'll assume you followed the tutorial for [Adding Markdown Pages](/docs/adding-tags-and-categories-to-blog-posts/) and provide a sample `createPages` that generates post pages as well as tag pages. In the site's `gatsby-node.js` file, include `lodash` (`const _ = require('lodash')`) and then make sure your [`createPages`](/docs/node-apis/#createPages) looks something like this:\n \n-```javascript\n-exports.createPages = ({ graphql, boundActionCreators }) => {\n+```js\n+exports.createPages = ({ boundActionCreators, graphql }) => {\n   const { createPage } = boundActionCreators;\n-  // add the tags to the query\n-  return new Promise((resolve, reject) => {\n-    graphql(`\n-      {\n-        allMarkdownRemark {\n-          edges {\n-            node {\n-              fields {\n-                slug\n-              }\n-              frontmatter {\n-                tags\n-                title\n-              }\n+\n+  const blogPostTemplate = path.resolve('src/templates/blog.js');\n+  const tagTemplate = path.resolve('src/templates/tags.js');\n+\n+  return graphql(`\n+    {\n+      allMarkdownRemark(\n+        sort: { order: DESC, fields: [frontmatter___date] }\n+        limit: 2000\n+      ) {\n+        edges {\n+          node {\n+            frontmatter {\n+              path\n+              tags\n             }\n           }\n         }\n       }\n-    `).then(result => {\n-      console.log(result);\n-      const posts = result.data.allMarkdownRemark.edges;\n-\n-      // call createTagPages with the result of posts\n-      createTagPages(createPage, posts);\n-\n-      // this is the original code used to create the pages from markdown posts\n-      result.data.allMarkdownRemark.edges.map(({ node }) => {\n-        createPage({\n-          path: node.fields.slug,\n-          component: path.resolve(`./src/templates/blog-post.js`),\n-          context: {\n-            slug: node.fields.slug,\n-          },\n-        });\n+    }\n+  `).then(result => {\n+    if (result.errors) {\n+      return Promise.reject(result.errors);\n+    }\n+\n+    const posts = result.data.allMarkdownRemark.edges;\n+\n+    // Create post detail pages\n+    posts.forEach(({ node }) => {\n+      createPage({\n+        path: node.frontmatter.path,\n+        component: blogPostTemplate,\n+      });\n+    });\n+\n+    // Tag pages:\n+    let tags = [];\n+    // Iterate through each post, putting all found tags into `tags`\n+    _.each(posts, edge => {\n+      if (_.get(edge, 'node.frontmatter.tags')) {\n+        tags = tags.concat(edge.node.frontmatter.tags);\n+      }\n+    });\n+    // Eliminate duplicate tags\n+    tags = _.uniq(tags);","path":"docs/docs/adding-tags-and-categories-to-blog-posts.md","position":360,"original_position":360,"commit_id":"fff5c490bc1ba1dff46c0e146d1e4a3429224bc0","original_commit_id":"fff5c490bc1ba1dff46c0e146d1e4a3429224bc0","user":{"login":"DSchau","id":3924690,"avatar_url":"https://avatars2.githubusercontent.com/u/3924690?v=4","gravatar_id":"","url":"https://api.github.com/users/DSchau","html_url":"https://github.com/DSchau","followers_url":"https://api.github.com/users/DSchau/followers","following_url":"https://api.github.com/users/DSchau/following{/other_user}","gists_url":"https://api.github.com/users/DSchau/gists{/gist_id}","starred_url":"https://api.github.com/users/DSchau/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DSchau/subscriptions","organizations_url":"https://api.github.com/users/DSchau/orgs","repos_url":"https://api.github.com/users/DSchau/repos","events_url":"https://api.github.com/users/DSchau/events{/privacy}","received_events_url":"https://api.github.com/users/DSchau/received_events","type":"User","site_admin":false},"body":"I've been using a set for this lately, works quite well!\r\n\r\n```js\r\nconst tags = posts.reduce((uniq, { node }) => {\r\n  (node.frontmatter.tags || [])\r\n    .forEach(uniq.add, uniq);\r\n   return uniq;\r\n}, new Set());\r\n\r\n// tags.forEach as previously\r\n```","created_at":"2018-02-13T05:18:11Z","updated_at":"2018-02-13T05:18:11Z","html_url":"https://github.com/gatsbyjs/gatsby/pull/3999#discussion_r167762915","pull_request_url":"https://api.github.com/repos/gatsbyjs/gatsby/pulls/3999","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/gatsbyjs/gatsby/pulls/comments/167762915"},"html":{"href":"https://github.com/gatsbyjs/gatsby/pull/3999#discussion_r167762915"},"pull_request":{"href":"https://api.github.com/repos/gatsbyjs/gatsby/pulls/3999"}}},"pull_request":{"url":"https://api.github.com/repos/gatsbyjs/gatsby/pulls/3999","id":168750339,"html_url":"https://github.com/gatsbyjs/gatsby/pull/3999","diff_url":"https://github.com/gatsbyjs/gatsby/pull/3999.diff","patch_url":"https://github.com/gatsbyjs/gatsby/pull/3999.patch","issue_url":"https://api.github.com/repos/gatsbyjs/gatsby/issues/3999","number":3999,"state":"open","locked":false,"title":"Update adding-tags-and-categories-to-blog-posts.md","user":{"login":"abrad45","id":129633,"avatar_url":"https://avatars0.githubusercontent.com/u/129633?v=4","gravatar_id":"","url":"https://api.github.com/users/abrad45","html_url":"https://github.com/abrad45","followers_url":"https://api.github.com/users/abrad45/followers","following_url":"https://api.github.com/users/abrad45/following{/other_user}","gists_url":"https://api.github.com/users/abrad45/gists{/gist_id}","starred_url":"https://api.github.com/users/abrad45/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abrad45/subscriptions","organizations_url":"https://api.github.com/users/abrad45/orgs","repos_url":"https://api.github.com/users/abrad45/repos","events_url":"https://api.github.com/users/abrad45/events{/privacy}","received_events_url":"https://api.github.com/users/abrad45/received_events","type":"User","site_admin":false},"body":"Changed per a conversation with Kyle about a better way to do this. Relates to #3976 \r\n\r\nI personally use 4-space tabs, but tried to follow project conventions as best as possible. Let me know if you have any suggested tweaks. Thanks!","created_at":"2018-02-13T04:16:43Z","updated_at":"2018-02-13T05:18:11Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c4b133c52578f7a5eaddb1341a8513790e13b086","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/gatsbyjs/gatsby/pulls/3999/commits","review_comments_url":"https://api.github.com/repos/gatsbyjs/gatsby/pulls/3999/comments","review_comment_url":"https://api.github.com/repos/gatsbyjs/gatsby/pulls/comments{/number}","comments_url":"https://api.github.com/repos/gatsbyjs/gatsby/issues/3999/comments","statuses_url":"https://api.github.com/repos/gatsbyjs/gatsby/statuses/fff5c490bc1ba1dff46c0e146d1e4a3429224bc0","head":{"label":"abrad45:patch-2","ref":"patch-2","sha":"fff5c490bc1ba1dff46c0e146d1e4a3429224bc0","user":{"login":"abrad45","id":129633,"avatar_url":"https://avatars0.githubusercontent.com/u/129633?v=4","gravatar_id":"","url":"https://api.github.com/users/abrad45","html_url":"https://github.com/abrad45","followers_url":"https://api.github.com/users/abrad45/followers","following_url":"https://api.github.com/users/abrad45/following{/other_user}","gists_url":"https://api.github.com/users/abrad45/gists{/gist_id}","starred_url":"https://api.github.com/users/abrad45/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abrad45/subscriptions","organizations_url":"https://api.github.com/users/abrad45/orgs","repos_url":"https://api.github.com/users/abrad45/repos","events_url":"https://api.github.com/users/abrad45/events{/privacy}","received_events_url":"https://api.github.com/users/abrad45/received_events","type":"User","site_admin":false},"repo":{"id":121159063,"name":"gatsby","full_name":"abrad45/gatsby","owner":{"login":"abrad45","id":129633,"avatar_url":"https://avatars0.githubusercontent.com/u/129633?v=4","gravatar_id":"","url":"https://api.github.com/users/abrad45","html_url":"https://github.com/abrad45","followers_url":"https://api.github.com/users/abrad45/followers","following_url":"https://api.github.com/users/abrad45/following{/other_user}","gists_url":"https://api.github.com/users/abrad45/gists{/gist_id}","starred_url":"https://api.github.com/users/abrad45/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abrad45/subscriptions","organizations_url":"https://api.github.com/users/abrad45/orgs","repos_url":"https://api.github.com/users/abrad45/repos","events_url":"https://api.github.com/users/abrad45/events{/privacy}","received_events_url":"https://api.github.com/users/abrad45/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/abrad45/gatsby","description":"⚛️📄🚀 Blazing fast static site generator for React","fork":true,"url":"https://api.github.com/repos/abrad45/gatsby","forks_url":"https://api.github.com/repos/abrad45/gatsby/forks","keys_url":"https://api.github.com/repos/abrad45/gatsby/keys{/key_id}","collaborators_url":"https://api.github.com/repos/abrad45/gatsby/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/abrad45/gatsby/teams","hooks_url":"https://api.github.com/repos/abrad45/gatsby/hooks","issue_events_url":"https://api.github.com/repos/abrad45/gatsby/issues/events{/number}","events_url":"https://api.github.com/repos/abrad45/gatsby/events","assignees_url":"https://api.github.com/repos/abrad45/gatsby/assignees{/user}","branches_url":"https://api.github.com/repos/abrad45/gatsby/branches{/branch}","tags_url":"https://api.github.com/repos/abrad45/gatsby/tags","blobs_url":"https://api.github.com/repos/abrad45/gatsby/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/abrad45/gatsby/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/abrad45/gatsby/git/refs{/sha}","trees_url":"https://api.github.com/repos/abrad45/gatsby/git/trees{/sha}","statuses_url":"https://api.github.com/repos/abrad45/gatsby/statuses/{sha}","languages_url":"https://api.github.com/repos/abrad45/gatsby/languages","stargazers_url":"https://api.github.com/repos/abrad45/gatsby/stargazers","contributors_url":"https://api.github.com/repos/abrad45/gatsby/contributors","subscribers_url":"https://api.github.com/repos/abrad45/gatsby/subscribers","subscription_url":"https://api.github.com/repos/abrad45/gatsby/subscription","commits_url":"https://api.github.com/repos/abrad45/gatsby/commits{/sha}","git_commits_url":"https://api.github.com/repos/abrad45/gatsby/git/commits{/sha}","comments_url":"https://api.github.com/repos/abrad45/gatsby/comments{/number}","issue_comment_url":"https://api.github.com/repos/abrad45/gatsby/issues/comments{/number}","contents_url":"https://api.github.com/repos/abrad45/gatsby/contents/{+path}","compare_url":"https://api.github.com/repos/abrad45/gatsby/compare/{base}...{head}","merges_url":"https://api.github.com/repos/abrad45/gatsby/merges","archive_url":"https://api.github.com/repos/abrad45/gatsby/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/abrad45/gatsby/downloads","issues_url":"https://api.github.com/repos/abrad45/gatsby/issues{/number}","pulls_url":"https://api.github.com/repos/abrad45/gatsby/pulls{/number}","milestones_url":"https://api.github.com/repos/abrad45/gatsby/milestones{/number}","notifications_url":"https://api.github.com/repos/abrad45/gatsby/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/abrad45/gatsby/labels{/name}","releases_url":"https://api.github.com/repos/abrad45/gatsby/releases{/id}","deployments_url":"https://api.github.com/repos/abrad45/gatsby/deployments","created_at":"2018-02-11T19:29:12Z","updated_at":"2018-02-11T19:29:19Z","pushed_at":"2018-02-13T04:15:31Z","git_url":"git://github.com/abrad45/gatsby.git","ssh_url":"git@github.com:abrad45/gatsby.git","clone_url":"https://github.com/abrad45/gatsby.git","svn_url":"https://github.com/abrad45/gatsby","homepage":"https://www.gatsbyjs.org","size":313992,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"gatsbyjs:master","ref":"master","sha":"00c4ca64a64233cb3e91dbf25e7f2c0dd928f82b","user":{"login":"gatsbyjs","id":12551863,"avatar_url":"https://avatars1.githubusercontent.com/u/12551863?v=4","gravatar_id":"","url":"https://api.github.com/users/gatsbyjs","html_url":"https://github.com/gatsbyjs","followers_url":"https://api.github.com/users/gatsbyjs/followers","following_url":"https://api.github.com/users/gatsbyjs/following{/other_user}","gists_url":"https://api.github.com/users/gatsbyjs/gists{/gist_id}","starred_url":"https://api.github.com/users/gatsbyjs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gatsbyjs/subscriptions","organizations_url":"https://api.github.com/users/gatsbyjs/orgs","repos_url":"https://api.github.com/users/gatsbyjs/repos","events_url":"https://api.github.com/users/gatsbyjs/events{/privacy}","received_events_url":"https://api.github.com/users/gatsbyjs/received_events","type":"Organization","site_admin":false},"repo":{"id":36040894,"name":"gatsby","full_name":"gatsbyjs/gatsby","owner":{"login":"gatsbyjs","id":12551863,"avatar_url":"https://avatars1.githubusercontent.com/u/12551863?v=4","gravatar_id":"","url":"https://api.github.com/users/gatsbyjs","html_url":"https://github.com/gatsbyjs","followers_url":"https://api.github.com/users/gatsbyjs/followers","following_url":"https://api.github.com/users/gatsbyjs/following{/other_user}","gists_url":"https://api.github.com/users/gatsbyjs/gists{/gist_id}","starred_url":"https://api.github.com/users/gatsbyjs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gatsbyjs/subscriptions","organizations_url":"https://api.github.com/users/gatsbyjs/orgs","repos_url":"https://api.github.com/users/gatsbyjs/repos","events_url":"https://api.github.com/users/gatsbyjs/events{/privacy}","received_events_url":"https://api.github.com/users/gatsbyjs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/gatsbyjs/gatsby","description":"⚛️📄🚀 Blazing fast static site generator for React","fork":false,"url":"https://api.github.com/repos/gatsbyjs/gatsby","forks_url":"https://api.github.com/repos/gatsbyjs/gatsby/forks","keys_url":"https://api.github.com/repos/gatsbyjs/gatsby/keys{/key_id}","collaborators_url":"https://api.github.com/repos/gatsbyjs/gatsby/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/gatsbyjs/gatsby/teams","hooks_url":"https://api.github.com/repos/gatsbyjs/gatsby/hooks","issue_events_url":"https://api.github.com/repos/gatsbyjs/gatsby/issues/events{/number}","events_url":"https://api.github.com/repos/gatsbyjs/gatsby/events","assignees_url":"https://api.github.com/repos/gatsbyjs/gatsby/assignees{/user}","branches_url":"https://api.github.com/repos/gatsbyjs/gatsby/branches{/branch}","tags_url":"https://api.github.com/repos/gatsbyjs/gatsby/tags","blobs_url":"https://api.github.com/repos/gatsbyjs/gatsby/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gatsbyjs/gatsby/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/gatsbyjs/gatsby/git/refs{/sha}","trees_url":"https://api.github.com/repos/gatsbyjs/gatsby/git/trees{/sha}","statuses_url":"https://api.github.com/repos/gatsbyjs/gatsby/statuses/{sha}","languages_url":"https://api.github.com/repos/gatsbyjs/gatsby/languages","stargazers_url":"https://api.github.com/repos/gatsbyjs/gatsby/stargazers","contributors_url":"https://api.github.com/repos/gatsbyjs/gatsby/contributors","subscribers_url":"https://api.github.com/repos/gatsbyjs/gatsby/subscribers","subscription_url":"https://api.github.com/repos/gatsbyjs/gatsby/subscription","commits_url":"https://api.github.com/repos/gatsbyjs/gatsby/commits{/sha}","git_commits_url":"https://api.github.com/repos/gatsbyjs/gatsby/git/commits{/sha}","comments_url":"https://api.github.com/repos/gatsbyjs/gatsby/comments{/number}","issue_comment_url":"https://api.github.com/repos/gatsbyjs/gatsby/issues/comments{/number}","contents_url":"https://api.github.com/repos/gatsbyjs/gatsby/contents/{+path}","compare_url":"https://api.github.com/repos/gatsbyjs/gatsby/compare/{base}...{head}","merges_url":"https://api.github.com/repos/gatsbyjs/gatsby/merges","archive_url":"https://api.github.com/repos/gatsbyjs/gatsby/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/gatsbyjs/gatsby/downloads","issues_url":"https://api.github.com/repos/gatsbyjs/gatsby/issues{/number}","pulls_url":"https://api.github.com/repos/gatsbyjs/gatsby/pulls{/number}","milestones_url":"https://api.github.com/repos/gatsbyjs/gatsby/milestones{/number}","notifications_url":"https://api.github.com/repos/gatsbyjs/gatsby/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/gatsbyjs/gatsby/labels{/name}","releases_url":"https://api.github.com/repos/gatsbyjs/gatsby/releases{/id}","deployments_url":"https://api.github.com/repos/gatsbyjs/gatsby/deployments","created_at":"2015-05-21T22:43:05Z","updated_at":"2018-02-13T05:07:28Z","pushed_at":"2018-02-13T04:58:45Z","git_url":"git://github.com/gatsbyjs/gatsby.git","ssh_url":"git@github.com:gatsbyjs/gatsby.git","clone_url":"https://github.com/gatsbyjs/gatsby.git","svn_url":"https://github.com/gatsbyjs/gatsby","homepage":"https://www.gatsbyjs.org","size":313991,"stargazers_count":18728,"watchers_count":18728,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1589,"mirror_url":null,"archived":false,"open_issues_count":467,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":1589,"open_issues":467,"watchers":18728,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/gatsbyjs/gatsby/pulls/3999"},"html":{"href":"https://github.com/gatsbyjs/gatsby/pull/3999"},"issue":{"href":"https://api.github.com/repos/gatsbyjs/gatsby/issues/3999"},"comments":{"href":"https://api.github.com/repos/gatsbyjs/gatsby/issues/3999/comments"},"review_comments":{"href":"https://api.github.com/repos/gatsbyjs/gatsby/pulls/3999/comments"},"review_comment":{"href":"https://api.github.com/repos/gatsbyjs/gatsby/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/gatsbyjs/gatsby/pulls/3999/commits"},"statuses":{"href":"https://api.github.com/repos/gatsbyjs/gatsby/statuses/fff5c490bc1ba1dff46c0e146d1e4a3429224bc0"}},"author_association":"NONE"}}
{"actor":{"display_login":"DSchau"}}