{"action":"created","comment":{"url":"https://api.github.com/repos/google/WebFundamentals/pulls/comments/197840699","pull_request_review_id":131652979,"id":197840699,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5Nzg0MDY5OQ==","diff_hunk":"@@ -0,0 +1,336 @@\n+project_path: /web/_project.yaml\n+book_path: /web/updates/_book.yaml\n+description: Feature Policy allows developers to selectively enable, disable, and modify the behavior of certain APIs and features in the browser. It's like CSP, but for features! Shipped in Chrome 60.\n+\n+{# wf_updated_on: 2018-06-22 #}\n+{# wf_published_on: 2018-06-22 #}\n+{# wf_tags: ux,feature,chrome60,feature-policy #}\n+{# wf_featured_image: /web/updates/images/generic/checklist.png #}\n+{# wf_featured_snippet: Feature Policy allows developers to selectively enable, disable, and modify the behavior of certain APIs and features in the browser. It's like CSP, but for features! Shipped in Chrome 60. #}\n+{# wf_blink_components: Blink>FeaturePolicy #}\n+\n+# Introduction to Feature Policy {: .page-title }\n+\n+{% include \"web/_shared/contributors/ericbidelman.html\" %}\n+\n+<style>\n+figure {\n+  text-align: center;\n+}\n+figcaption {\n+  font-style: italic;\n+}\n+</style>\n+\n+#### TL;DR {: #tldr .hide-from-toc}\n+\n+[Feature Policy][spec] allows web developers to selectively enable, disable, and\n+modify the behavior of certain APIs and web features in the browser. __It's like\n+[CSP](/web/fundamentals/security/csp/) but instead of controlling security, it's\n+controls features!__\n+\n+The feature policies themselves are little opt-in aggreements between developer\n+and browser that can help foster our goals of building (and maintaining) high\n+quality web apps.\n+\n+## Introduction {: #intro}\n+\n+Building for the web is a rocky adventure. It's hard enough to build a top-notch\n+web app that nails performance and uses all the latest best practices. It's even\n+harder to keep that experience great over time. As your project evolves,\n+developers come on board, new features land, and the codebase grows. That\n+Great Experience &trade; you once achieved may begin to deteriorate and UX\n+starts to suffer! Feature Policy is designed to keep us on track.\n+\n+With Feature Policy, you **opt-in to a set of \"policies\"** for the browser to\n+enforce on specific features used throughout your site. These policies can\n+restrict what APIs the site can access or modify the browser's default\n+behavior for certain features.\n+\n+Here are a few examples of the types of things you can do with Feature Policy:\n+\n+1. Change the default behavior of `autoplay` on mobile and 3rd party videos.\n+2. Ensure a site doesn't inadvertently use sensitive APIs like `camera` or\n+`microphone`.\n+3. Allow iframes to use the `fullscreen` API.\n+4. Block the use of outdated APIs like synchronous XHR and `document.write`.\n+5. Ensure images are sized properly (e.g. prevent layout thrashing) and are not\n+too big for the viewport (e.g. waste user's bandwidth).\n+\n+**Policies are a contract between developer and browser**. They inform the\n+browser about what the developer's intent is and thus, help keep us honest when\n+our app tries to go off the rails and do something bad. If the site or embedded third-party content attempts to violate any of the developer's preselected\n+rules, the browser overrides the behavior with better UX or blocks the API\n+altogether.\n+\n+## Using Feature Policy {: #using }\n+\n+Feature Policy provides two ways to control features:\n+\n+1. Through the `FeaturePolicy` HTTP header.\n+2. With the `allow` attribute on iframes.\n+\n+### The `FeaturePolicy` HTTP header {: #header }\n+\n+The easiest way to use Feature Policy is by sending the `FeaturePolicy` HTTP\n+header with the response of a page. It's value is the policy or set of\n+policies that you want the browser to respect for a given origin:\n+\n+```\n+FeaturePolicy: <feature> <allow list origin(s)>\n+```\n+\n+The allow list can take on several different values:\n+\n+- `*`: The feature is allowed in top-level browsing contexts and in nested\n+browsing contexts (iframes).\n+- `'self'`: The feature is allowed in top-level browsing contexts and\n+same-origin nested browsing contexts. It is disallowed in cross-origin\n+documents in nested browsing contexts.\n+- `'none'`: The feature is disallowed in top-level browsing contexts and\n+disallowed in nested browsing contexts.\n+- `<url>`: a specific origin to enable the policy for (e.g. `https://example.com`).\n+\n+**Example**\n+\n+Let's say you wanted to block all content from using\n+the Geolocation API across your site. You can do that by sending a strict\n+allowlist of `'none'` for the `geolocation` feature:\n+\n+```\n+FeaturePolicy: geolocation 'none'\n+```\n+\n+If a piece of code or iframe tries to use the Geolocation API, the browser\n+ blocks it. **This is true even if the user has previously given\n+permission to share their location**.\n+\n+<figure>\n+  <img src=\"/web/updates/images/2018/06/featurepolicy/violation.png\"\n+       class=\"screenshot\" alt=\"Violating the set geolocation policy.\"\n+       title=\"Violating the set geolocation policy.\">\n+  <figcaption>Violating the set geolocation policy.</figcaption>\n+</figure>\n+\n+In other cases, it might make since to relax this policy a bit. We can allow\n+our own origin to use the Geolocation API but prevent third-party content from\n+accessing it by setting `'self'` in the allow list:\n+\n+```\n+FeaturePolicy: geolocation 'self'\n+```\n+\n+\n+### The iframe `allow` attribute {: #iframe }\n+\n+The second way to use Feature Policy is for controlling content within\n+an `iframe`. USe the `allow` attribute to specify a policy list for\n+embedded content:\n+\n+```html\n+<!-- Allow all browsing contexts within this iframe to use full screen. -->\n+<iframe src=\"https://example.com...\" allow=\"fullscreen\"></iframe>\n+\n+<!-- Equivalent to: -->\n+<iframe src=\"https://example.com...\" allow=\"fullscreen *\"></iframe>\n+\n+<!-- Allow only iframe content on a particular origin to access the user's location. -->\n+<iframe src=\"https://google-developers.appspot.com/demos/...\"\n+        allow=\"geolocation https://google-developers.appspot.com\"></iframe>\n+```\n+\n+Note: Frames inherit the policy settings of their parent page. If the page\n+and iframe both specify a policy list, the more restrictive allow list will\n+be used. See [Inheritance rules](#inheritancerules).\n+\n+#### What about the existing iframe attributes? {: #legacy }\n+\n+Some of the [features controlled by Feature Policy](#list) have an existing\n+ attribute to control their behavior. For example, `<iframe allowfullscreen>`\n+is an attribute that allows the iframe's content to use the\n+`HTMLElement.requestFullscreen()` API. There's also the `allowpaymentrequest` and\n+`allowusermedia` attributes for allowing the\n+[Payment Request API](/web/fundamentals/payments/) and `getUserMedia()`,\n+respectively.\n+\n+Try to **use the `allow` attribute instead of these old\n+attributes** where possible. For cases where you need to support backwards\n+compatibility using the `allow` attribute with an equivalent legacy attribute\n+is perfectly fine (e.g. `<iframe allowfullscreen allow=\"fullscreen\">`).\n+Just note that the more restrictive policy wins. For example, the following\n+iframe would not be allowed to enter full screen because\n+`allow=\"fullscreen 'none'\"` is more restrictive than `allowfullscreen`:\n+\n+```html\n+<!-- Blocks full screen access if the browser supports feature policy. -->\n+<iframe allowfullscreen allow=\"fullscreen 'none'\" src=\"...\">\n+```\n+\n+## Controlling multiple policies at once {: .multiple }\n+\n+Several features can be controlled at the same time by sending the HTTP header\n+with a `;` separated list of policies:\n+\n+```\n+FeaturePolicy: unsized-media 'none'; geolocation 'self', https://example.com; camera *;\n+```\n+\n+or by sending a separate header for each policy:\n+\n+```\n+FeaturePolicy: unsized-media 'none'\n+FeaturePolicy: geolocation 'self', https://example.com\n+FeaturePolicy: camera *;\n+```\n+\n+This example would do the following:\n+\n+- Disallows the use of `unsized-media` for all browsing contexts.\n+- Disallows the use of `geolocation` for all browsing contexts except for the\n+page's own origin and `https://example.com`.\n+- Allows `camera` access for all browsing contexts.\n+\n+**Example** - setting multiple policies on an iframe\n+\n+```html\n+<!-- Blocks the iframe from using the camera and microphone\n+     (if the browser supports feature policy). -->\n+<iframe allow=\"camera 'none'; microphone 'none'\">\n+```\n+\n+\n+## JavaScript API {: #js }\n+\n+Heads up: While Chrome 60 added support for the `FeaturePolicy` HTTP header\n+and the `allow` attribute on iframes. The [JavaScript API][jsapi] is still\n+being fleshed out and is likely to change as it goes through the standardization\n+process. You can enable the API using the\n+`--enable-experimental-web-platform-features` flag in `chrome:flags`.\n+{: .dogfood }\n+\n+Feature Policy includes a small [JavaScript API][jsapi] to allow client-side\n+code to determine what features are allowed by a page or frame. You can access\n+its goodies under `document.policy` for the main document or `frame.policy` for\n+iframes.\n+\n+### Example {: #jsexample }\n+The example below illustrates the results of sending a policy of `FeaturePolicy: geolocation 'self'`\n+on the site `https://example.com`:\n+\n+```js\n+/* @return {Array<string>} List of feature policies allowed by the page. */\n+document.policy.allowedFeatures();\n+// → [\"geolocation\", \"midi\",  \"camera\", \"usb\", \"autoplay\",...]\n+\n+/* @return {boolean} True if the page allows the 'geolocation' feature. */\n+document.policy.allowsFeature('geolocation');\n+// → true\n+\n+/* @return {boolean} True if the provided origin allows the 'geolocation' feature. */\n+document.policy.allowsFeature('geolocation', 'https://google-developers.appspot.com/');\n+// → false\n+\n+/* @return {Array<string>} List of origins (used throughout the page) that are\n+   allowed to use the 'geolocation' feature. */\n+document.policy.getAllowlistForFeature('geolocation');\n+// → [\"https://example.com\"]\n+```\n+\n+## List of policies {: #list }\n+\n+So what features can be controlled through Feature Policy? Good question!\n+\n+Right now, there's a lack of documentation on what policies are implemented\n+and how to use them. The list will also grow over time as different browsers\n+adopt the spec and implement various policies. Feature policy will be a moving\n+target and good reference docs will definitely be needed.\n+\n+For now, there are a couple of ways to see what features are controllable.\n+\n+1. Check out our [Feature Policy Kitchen Sink][sink] of demos. It has examples\n+of each policy that's been implemented in Blink.\n+-  Check [Chrome's source](https://cs.chromium.org/chromium/src/third_party/blink/renderer/platform/feature_policy/feature_policy.cc?g=0&l=138) for the list of feature names.\n+-  If you have the `--enable-experimental-web-platform-features` flag on in `chrome:flags`, query `document.policy.allowedFeatures()` find the list:","path":"src/content/en/updates/2018/06/feature-policy.md","position":253,"original_position":253,"commit_id":"77b12c46540cbb62d0cef828ac5032e90127600f","original_commit_id":"77b12c46540cbb62d0cef828ac5032e90127600f","user":{"login":"jpmedley","id":8204171,"node_id":"MDQ6VXNlcjgyMDQxNzE=","avatar_url":"https://avatars1.githubusercontent.com/u/8204171?v=4","gravatar_id":"","url":"https://api.github.com/users/jpmedley","html_url":"https://github.com/jpmedley","followers_url":"https://api.github.com/users/jpmedley/followers","following_url":"https://api.github.com/users/jpmedley/following{/other_user}","gists_url":"https://api.github.com/users/jpmedley/gists{/gist_id}","starred_url":"https://api.github.com/users/jpmedley/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jpmedley/subscriptions","organizations_url":"https://api.github.com/users/jpmedley/orgs","repos_url":"https://api.github.com/users/jpmedley/repos","events_url":"https://api.github.com/users/jpmedley/events{/privacy}","received_events_url":"https://api.github.com/users/jpmedley/received_events","type":"User","site_admin":false},"body":"**to** find the list. (Word added).","created_at":"2018-06-25T15:31:42Z","updated_at":"2018-06-25T15:36:20Z","html_url":"https://github.com/google/WebFundamentals/pull/6292#discussion_r197840699","pull_request_url":"https://api.github.com/repos/google/WebFundamentals/pulls/6292","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/google/WebFundamentals/pulls/comments/197840699"},"html":{"href":"https://github.com/google/WebFundamentals/pull/6292#discussion_r197840699"},"pull_request":{"href":"https://api.github.com/repos/google/WebFundamentals/pulls/6292"}}},"pull_request":{"url":"https://api.github.com/repos/google/WebFundamentals/pulls/6292","id":196842092,"node_id":"MDExOlB1bGxSZXF1ZXN0MTk2ODQyMDky","html_url":"https://github.com/google/WebFundamentals/pull/6292","diff_url":"https://github.com/google/WebFundamentals/pull/6292.diff","patch_url":"https://github.com/google/WebFundamentals/pull/6292.patch","issue_url":"https://api.github.com/repos/google/WebFundamentals/issues/6292","number":6292,"state":"open","locked":false,"title":"Update: Intro to Feature Policy","user":{"login":"ebidel","id":238208,"node_id":"MDQ6VXNlcjIzODIwOA==","avatar_url":"https://avatars2.githubusercontent.com/u/238208?v=4","gravatar_id":"","url":"https://api.github.com/users/ebidel","html_url":"https://github.com/ebidel","followers_url":"https://api.github.com/users/ebidel/followers","following_url":"https://api.github.com/users/ebidel/following{/other_user}","gists_url":"https://api.github.com/users/ebidel/gists{/gist_id}","starred_url":"https://api.github.com/users/ebidel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ebidel/subscriptions","organizations_url":"https://api.github.com/users/ebidel/orgs","repos_url":"https://api.github.com/users/ebidel/repos","events_url":"https://api.github.com/users/ebidel/events{/privacy}","received_events_url":"https://api.github.com/users/ebidel/received_events","type":"User","site_admin":false},"body":"**Target Live Date:** TBD\r\n\r\n- [ ] This has been reviewed and approved by (NAME)\r\n- [ ] I have run `npm test` locally and all tests pass.\r\n- [x] I have added the appropriate `type-something` label.\r\n- [x] I've staged the site and manually verified that my content displays correctly.\r\n\r\n**CC:** @petele\r\n","created_at":"2018-06-22T20:49:16Z","updated_at":"2018-06-25T15:36:20Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c4e6b73d5415d38e25b76d697d7bb6813eb652ee","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":129674476,"node_id":"MDU6TGFiZWwxMjk2NzQ0NzY=","url":"https://api.github.com/repos/google/WebFundamentals/labels/cla:%20yes","name":"cla: yes","color":"188038","default":false},{"id":258447235,"node_id":"MDU6TGFiZWwyNTg0NDcyMzU=","url":"https://api.github.com/repos/google/WebFundamentals/labels/type-Content","name":"type-Content","color":"3f51b5","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/google/WebFundamentals/pulls/6292/commits","review_comments_url":"https://api.github.com/repos/google/WebFundamentals/pulls/6292/comments","review_comment_url":"https://api.github.com/repos/google/WebFundamentals/pulls/comments{/number}","comments_url":"https://api.github.com/repos/google/WebFundamentals/issues/6292/comments","statuses_url":"https://api.github.com/repos/google/WebFundamentals/statuses/77b12c46540cbb62d0cef828ac5032e90127600f","head":{"label":"ebidel:featurepolicy","ref":"featurepolicy","sha":"77b12c46540cbb62d0cef828ac5032e90127600f","user":{"login":"ebidel","id":238208,"node_id":"MDQ6VXNlcjIzODIwOA==","avatar_url":"https://avatars2.githubusercontent.com/u/238208?v=4","gravatar_id":"","url":"https://api.github.com/users/ebidel","html_url":"https://github.com/ebidel","followers_url":"https://api.github.com/users/ebidel/followers","following_url":"https://api.github.com/users/ebidel/following{/other_user}","gists_url":"https://api.github.com/users/ebidel/gists{/gist_id}","starred_url":"https://api.github.com/users/ebidel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ebidel/subscriptions","organizations_url":"https://api.github.com/users/ebidel/orgs","repos_url":"https://api.github.com/users/ebidel/repos","events_url":"https://api.github.com/users/ebidel/events{/privacy}","received_events_url":"https://api.github.com/users/ebidel/received_events","type":"User","site_admin":false},"repo":{"id":109759609,"node_id":"MDEwOlJlcG9zaXRvcnkxMDk3NTk2MDk=","name":"WebFundamentals","full_name":"ebidel/WebFundamentals","owner":{"login":"ebidel","id":238208,"node_id":"MDQ6VXNlcjIzODIwOA==","avatar_url":"https://avatars2.githubusercontent.com/u/238208?v=4","gravatar_id":"","url":"https://api.github.com/users/ebidel","html_url":"https://github.com/ebidel","followers_url":"https://api.github.com/users/ebidel/followers","following_url":"https://api.github.com/users/ebidel/following{/other_user}","gists_url":"https://api.github.com/users/ebidel/gists{/gist_id}","starred_url":"https://api.github.com/users/ebidel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ebidel/subscriptions","organizations_url":"https://api.github.com/users/ebidel/orgs","repos_url":"https://api.github.com/users/ebidel/repos","events_url":"https://api.github.com/users/ebidel/events{/privacy}","received_events_url":"https://api.github.com/users/ebidel/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ebidel/WebFundamentals","description":"Best practices for modern web development","fork":true,"url":"https://api.github.com/repos/ebidel/WebFundamentals","forks_url":"https://api.github.com/repos/ebidel/WebFundamentals/forks","keys_url":"https://api.github.com/repos/ebidel/WebFundamentals/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ebidel/WebFundamentals/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ebidel/WebFundamentals/teams","hooks_url":"https://api.github.com/repos/ebidel/WebFundamentals/hooks","issue_events_url":"https://api.github.com/repos/ebidel/WebFundamentals/issues/events{/number}","events_url":"https://api.github.com/repos/ebidel/WebFundamentals/events","assignees_url":"https://api.github.com/repos/ebidel/WebFundamentals/assignees{/user}","branches_url":"https://api.github.com/repos/ebidel/WebFundamentals/branches{/branch}","tags_url":"https://api.github.com/repos/ebidel/WebFundamentals/tags","blobs_url":"https://api.github.com/repos/ebidel/WebFundamentals/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ebidel/WebFundamentals/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ebidel/WebFundamentals/git/refs{/sha}","trees_url":"https://api.github.com/repos/ebidel/WebFundamentals/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ebidel/WebFundamentals/statuses/{sha}","languages_url":"https://api.github.com/repos/ebidel/WebFundamentals/languages","stargazers_url":"https://api.github.com/repos/ebidel/WebFundamentals/stargazers","contributors_url":"https://api.github.com/repos/ebidel/WebFundamentals/contributors","subscribers_url":"https://api.github.com/repos/ebidel/WebFundamentals/subscribers","subscription_url":"https://api.github.com/repos/ebidel/WebFundamentals/subscription","commits_url":"https://api.github.com/repos/ebidel/WebFundamentals/commits{/sha}","git_commits_url":"https://api.github.com/repos/ebidel/WebFundamentals/git/commits{/sha}","comments_url":"https://api.github.com/repos/ebidel/WebFundamentals/comments{/number}","issue_comment_url":"https://api.github.com/repos/ebidel/WebFundamentals/issues/comments{/number}","contents_url":"https://api.github.com/repos/ebidel/WebFundamentals/contents/{+path}","compare_url":"https://api.github.com/repos/ebidel/WebFundamentals/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ebidel/WebFundamentals/merges","archive_url":"https://api.github.com/repos/ebidel/WebFundamentals/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ebidel/WebFundamentals/downloads","issues_url":"https://api.github.com/repos/ebidel/WebFundamentals/issues{/number}","pulls_url":"https://api.github.com/repos/ebidel/WebFundamentals/pulls{/number}","milestones_url":"https://api.github.com/repos/ebidel/WebFundamentals/milestones{/number}","notifications_url":"https://api.github.com/repos/ebidel/WebFundamentals/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ebidel/WebFundamentals/labels{/name}","releases_url":"https://api.github.com/repos/ebidel/WebFundamentals/releases{/id}","deployments_url":"https://api.github.com/repos/ebidel/WebFundamentals/deployments","created_at":"2017-11-06T22:54:12Z","updated_at":"2018-06-07T09:10:59Z","pushed_at":"2018-06-22T20:48:34Z","git_url":"git://github.com/ebidel/WebFundamentals.git","ssh_url":"git@github.com:ebidel/WebFundamentals.git","clone_url":"https://github.com/ebidel/WebFundamentals.git","svn_url":"https://github.com/ebidel/WebFundamentals","homepage":"https://developers.google.com/web/fundamentals","size":1581391,"stargazers_count":3,"watchers_count":3,"language":"HTML","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":2,"open_issues":0,"watchers":3,"default_branch":"master"}},"base":{"label":"google:master","ref":"master","sha":"f5d0c6e43c72d2f28b39f88f549578015804d72f","user":{"login":"google","id":1342004,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzNDIwMDQ=","avatar_url":"https://avatars1.githubusercontent.com/u/1342004?v=4","gravatar_id":"","url":"https://api.github.com/users/google","html_url":"https://github.com/google","followers_url":"https://api.github.com/users/google/followers","following_url":"https://api.github.com/users/google/following{/other_user}","gists_url":"https://api.github.com/users/google/gists{/gist_id}","starred_url":"https://api.github.com/users/google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/google/subscriptions","organizations_url":"https://api.github.com/users/google/orgs","repos_url":"https://api.github.com/users/google/repos","events_url":"https://api.github.com/users/google/events{/privacy}","received_events_url":"https://api.github.com/users/google/received_events","type":"Organization","site_admin":false},"repo":{"id":19249835,"node_id":"MDEwOlJlcG9zaXRvcnkxOTI0OTgzNQ==","name":"WebFundamentals","full_name":"google/WebFundamentals","owner":{"login":"google","id":1342004,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzNDIwMDQ=","avatar_url":"https://avatars1.githubusercontent.com/u/1342004?v=4","gravatar_id":"","url":"https://api.github.com/users/google","html_url":"https://github.com/google","followers_url":"https://api.github.com/users/google/followers","following_url":"https://api.github.com/users/google/following{/other_user}","gists_url":"https://api.github.com/users/google/gists{/gist_id}","starred_url":"https://api.github.com/users/google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/google/subscriptions","organizations_url":"https://api.github.com/users/google/orgs","repos_url":"https://api.github.com/users/google/repos","events_url":"https://api.github.com/users/google/events{/privacy}","received_events_url":"https://api.github.com/users/google/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/google/WebFundamentals","description":"Best practices for modern web development","fork":false,"url":"https://api.github.com/repos/google/WebFundamentals","forks_url":"https://api.github.com/repos/google/WebFundamentals/forks","keys_url":"https://api.github.com/repos/google/WebFundamentals/keys{/key_id}","collaborators_url":"https://api.github.com/repos/google/WebFundamentals/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/google/WebFundamentals/teams","hooks_url":"https://api.github.com/repos/google/WebFundamentals/hooks","issue_events_url":"https://api.github.com/repos/google/WebFundamentals/issues/events{/number}","events_url":"https://api.github.com/repos/google/WebFundamentals/events","assignees_url":"https://api.github.com/repos/google/WebFundamentals/assignees{/user}","branches_url":"https://api.github.com/repos/google/WebFundamentals/branches{/branch}","tags_url":"https://api.github.com/repos/google/WebFundamentals/tags","blobs_url":"https://api.github.com/repos/google/WebFundamentals/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/google/WebFundamentals/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/google/WebFundamentals/git/refs{/sha}","trees_url":"https://api.github.com/repos/google/WebFundamentals/git/trees{/sha}","statuses_url":"https://api.github.com/repos/google/WebFundamentals/statuses/{sha}","languages_url":"https://api.github.com/repos/google/WebFundamentals/languages","stargazers_url":"https://api.github.com/repos/google/WebFundamentals/stargazers","contributors_url":"https://api.github.com/repos/google/WebFundamentals/contributors","subscribers_url":"https://api.github.com/repos/google/WebFundamentals/subscribers","subscription_url":"https://api.github.com/repos/google/WebFundamentals/subscription","commits_url":"https://api.github.com/repos/google/WebFundamentals/commits{/sha}","git_commits_url":"https://api.github.com/repos/google/WebFundamentals/git/commits{/sha}","comments_url":"https://api.github.com/repos/google/WebFundamentals/comments{/number}","issue_comment_url":"https://api.github.com/repos/google/WebFundamentals/issues/comments{/number}","contents_url":"https://api.github.com/repos/google/WebFundamentals/contents/{+path}","compare_url":"https://api.github.com/repos/google/WebFundamentals/compare/{base}...{head}","merges_url":"https://api.github.com/repos/google/WebFundamentals/merges","archive_url":"https://api.github.com/repos/google/WebFundamentals/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/google/WebFundamentals/downloads","issues_url":"https://api.github.com/repos/google/WebFundamentals/issues{/number}","pulls_url":"https://api.github.com/repos/google/WebFundamentals/pulls{/number}","milestones_url":"https://api.github.com/repos/google/WebFundamentals/milestones{/number}","notifications_url":"https://api.github.com/repos/google/WebFundamentals/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/google/WebFundamentals/labels{/name}","releases_url":"https://api.github.com/repos/google/WebFundamentals/releases{/id}","deployments_url":"https://api.github.com/repos/google/WebFundamentals/deployments","created_at":"2014-04-28T18:45:45Z","updated_at":"2018-06-25T09:24:23Z","pushed_at":"2018-06-25T08:15:19Z","git_url":"git://github.com/google/WebFundamentals.git","ssh_url":"git@github.com:google/WebFundamentals.git","clone_url":"https://github.com/google/WebFundamentals.git","svn_url":"https://github.com/google/WebFundamentals","homepage":"https://developers.google.com/web/fundamentals","size":1565534,"stargazers_count":9095,"watchers_count":9095,"language":"HTML","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1783,"mirror_url":null,"archived":false,"open_issues_count":293,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":1783,"open_issues":293,"watchers":9095,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/google/WebFundamentals/pulls/6292"},"html":{"href":"https://github.com/google/WebFundamentals/pull/6292"},"issue":{"href":"https://api.github.com/repos/google/WebFundamentals/issues/6292"},"comments":{"href":"https://api.github.com/repos/google/WebFundamentals/issues/6292/comments"},"review_comments":{"href":"https://api.github.com/repos/google/WebFundamentals/pulls/6292/comments"},"review_comment":{"href":"https://api.github.com/repos/google/WebFundamentals/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/google/WebFundamentals/pulls/6292/commits"},"statuses":{"href":"https://api.github.com/repos/google/WebFundamentals/statuses/77b12c46540cbb62d0cef828ac5032e90127600f"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"jpmedley"}}